forked from akai/readest
Compare commits
73 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fd41bcf420 | |||
| e3b4a00ed1 | |||
| 4af203755d | |||
| 883dae36aa | |||
| 0c24aad606 | |||
| a8d3411203 | |||
| f8ad47a418 | |||
| 17de9357dd | |||
| ab628fe258 | |||
| 3ce5a5c8e3 | |||
| 56abcb4a6c | |||
| 600d69fa50 | |||
| ccb937015d | |||
| bcd27b7047 | |||
| 3503b0234f | |||
| db1d63cdcc | |||
| 57868a138e | |||
| e08622b416 | |||
| f805477091 | |||
| a72f535346 | |||
| 942c062d35 | |||
| a02b236e97 | |||
| 2a837cb50d | |||
| f7f85330ae | |||
| 4527aa277a | |||
| 6f3b401c24 | |||
| da00a94f66 | |||
| 52be6fa066 | |||
| 75f1fafe9f | |||
| 9321c2cd39 | |||
| e7f0b53bdf | |||
| 3f4d4b8643 | |||
| 9202864846 | |||
| 2963e75bdd | |||
| ec45a080fc | |||
| 0b180da6a6 | |||
| 843ab3448b | |||
| 42f9b8fe3c | |||
| 727f6150a6 | |||
| 4dbe9cc9f1 | |||
| 5301020a02 | |||
| 6013341cb8 | |||
| 6b403d019e | |||
| 395a1e67a1 | |||
| c86decc2c1 | |||
| 1d3dfd395f | |||
| 967a7833ca | |||
| 6391bfe788 | |||
| 745f28f346 | |||
| 2b524439bf | |||
| 8c91ad411c | |||
| c8e2c95335 | |||
| 2680614c15 | |||
| 71cb3ace91 | |||
| 4b2c5f93ab | |||
| 84c5a9dae6 | |||
| c5304cd46c | |||
| fd8fbb178c | |||
| 77ea87c344 | |||
| bd415a8501 | |||
| 849f151166 | |||
| 9f65e3d415 | |||
| 4d645befde | |||
| df34de1c38 | |||
| 81802a7c72 | |||
| a3609731c3 | |||
| 7a8354d63b | |||
| 5bc8eda50b | |||
| 8cd3cacbec | |||
| 49391124c5 | |||
| 17e60f1e49 | |||
| 4d0be496b2 | |||
| 3ac1a1a45b |
@@ -46,7 +46,7 @@ jobs:
|
||||
cache: pnpm
|
||||
|
||||
- name: setup Java
|
||||
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5
|
||||
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
@@ -97,7 +97,7 @@ jobs:
|
||||
test -n "$APK"
|
||||
|
||||
- name: cache AVD snapshot
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
id: avd-cache
|
||||
with:
|
||||
path: |
|
||||
|
||||
@@ -61,7 +61,7 @@ jobs:
|
||||
|
||||
- name: Build and push by digest
|
||||
id: build
|
||||
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
|
||||
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
|
||||
@@ -78,7 +78,9 @@ jobs:
|
||||
args: '--target aarch64-pc-windows-msvc --bundles nsis'
|
||||
|
||||
runs-on: ${{ matrix.config.os }}
|
||||
timeout-minutes: 60
|
||||
# Backstop only — must stay ABOVE setup time + the per-step timeouts below,
|
||||
# because a job-level timeout reports `cancelled` and skips assemble-manifest.
|
||||
timeout-minutes: 75
|
||||
steps:
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
@@ -99,7 +101,7 @@ jobs:
|
||||
|
||||
- name: setup Java (for Android build only)
|
||||
if: matrix.config.release == 'android'
|
||||
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5
|
||||
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
@@ -140,6 +142,7 @@ jobs:
|
||||
echo "NEXT_PUBLIC_SUPABASE_URL=${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}" >> .env.local
|
||||
echo "NEXT_PUBLIC_SUPABASE_ANON_KEY=${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}" >> .env.local
|
||||
echo "NEXT_PUBLIC_APP_PLATFORM=tauri" >> .env.local
|
||||
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env.local
|
||||
cp .env.local apps/readest-app/.env.local
|
||||
|
||||
- name: install rclone
|
||||
@@ -173,6 +176,7 @@ jobs:
|
||||
- name: build and sign Android apks
|
||||
if: matrix.config.release == 'android'
|
||||
shell: bash
|
||||
timeout-minutes: 55
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/28.2.13676358
|
||||
@@ -213,9 +217,30 @@ jobs:
|
||||
if: matrix.config.release == 'linux'
|
||||
run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri --branch feat/truly-portable-appimage --force
|
||||
|
||||
# The truly-portable AppImage bundler downloads quick-sharun.sh from
|
||||
# Anylinux-AppImages@main ONLY when it is not already in the tauri tools
|
||||
# cache. An upstream strace-mode change (2026-06-29) made bundling launch
|
||||
# the app under Xvfb and hang forever, timing out the Linux legs (#4906).
|
||||
# Seed the cache with the last known-good revision so the bundler never
|
||||
# fetches the moving main-branch script.
|
||||
- name: pin quick-sharun.sh for AppImage bundling (Linux)
|
||||
if: matrix.config.release == 'linux'
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/tauri"
|
||||
mkdir -p "$cache_dir"
|
||||
curl -fsSL --retry 3 -o "$cache_dir/quick-sharun.sh" \
|
||||
"https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/b3a9e985cdedf7efa81d172f182cd13983743147/useful-tools/quick-sharun.sh"
|
||||
chmod +x "$cache_dir/quick-sharun.sh"
|
||||
|
||||
- name: build desktop bundles
|
||||
if: matrix.config.release != 'android'
|
||||
shell: bash
|
||||
# A hung build must fail the STEP (step timeout -> job failure), not hit
|
||||
# the job-level timeout: job timeouts report `cancelled`, which the
|
||||
# assemble-manifest guard treats as run cancellation and skips promoting
|
||||
# latest.json for ALL platforms (#4906).
|
||||
timeout-minutes: 45
|
||||
env:
|
||||
TAURI_BUNDLER_NEW_APPIMAGE_FORMAT: 'true'
|
||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
@@ -244,6 +269,7 @@ jobs:
|
||||
- name: build and sign portable binaries (Windows only)
|
||||
if: matrix.config.os == 'windows-latest'
|
||||
shell: bash
|
||||
timeout-minutes: 30
|
||||
env:
|
||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
TAURI_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||
|
||||
@@ -20,13 +20,13 @@ jobs:
|
||||
- name: setup sccache
|
||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
||||
- name: Install minimal stable with clippy and rustfmt
|
||||
uses: actions-rust-lang/setup-rust-toolchain@46268bd060767258de96ed93c1251119784f2ab6 # v1
|
||||
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1
|
||||
with:
|
||||
toolchain: stable
|
||||
override: true
|
||||
components: rustfmt, clippy
|
||||
- name: Cache apt packages
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: /var/cache/apt/archives
|
||||
key: apt-rust-lint-${{ runner.os }}
|
||||
@@ -84,7 +84,7 @@ jobs:
|
||||
|
||||
- name: cache playwright browsers
|
||||
id: playwright-cache
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
@@ -144,7 +144,7 @@ jobs:
|
||||
- name: cache playwright browsers
|
||||
if: matrix.shard == 1
|
||||
id: playwright-cache
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
@@ -215,7 +215,7 @@ jobs:
|
||||
|
||||
- name: cache apt packages
|
||||
if: steps.changes.outputs.koplugin == 'true'
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: /var/cache/apt/archives
|
||||
key: apt-test-koplugin-${{ runner.os }}
|
||||
@@ -266,7 +266,7 @@ jobs:
|
||||
# The tauri tests run `next dev`, whose Turbopack cache lives in
|
||||
# `.next/dev/cache` (a different path from the `next build` cache).
|
||||
- name: cache Turbopack dev cache
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: apps/readest-app/.next/dev/cache
|
||||
key: turbo-dev-tauri-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
|
||||
@@ -282,7 +282,7 @@ jobs:
|
||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
||||
|
||||
- name: install Rust toolchain
|
||||
uses: actions-rust-lang/setup-rust-toolchain@46268bd060767258de96ed93c1251119784f2ab6 # v1
|
||||
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1
|
||||
with:
|
||||
toolchain: stable
|
||||
# Disable this action's built-in rust-cache so the explicit
|
||||
@@ -307,7 +307,7 @@ jobs:
|
||||
cache-workspace-crates: 'true'
|
||||
|
||||
- name: Cache apt packages
|
||||
uses: actions/cache@2c8a9bd7457de244a408f35966fab2fb45fda9c8 # v6.0.0
|
||||
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: /var/cache/apt/archives
|
||||
key: apt-tauri-${{ runner.os }}
|
||||
|
||||
@@ -118,6 +118,33 @@ jobs:
|
||||
echo "Uploading ${plugin_zip} to GitHub release"
|
||||
gh release upload ${{ needs.get-release.outputs.release_tag }} ${plugin_zip} --clobber
|
||||
|
||||
build-calibre-plugin:
|
||||
needs: get-release
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
|
||||
- name: create calibre plugin zip
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
version=${{ needs.get-release.outputs.release_version }}
|
||||
|
||||
# Stamp PLUGIN_VERSION in __init__.py with the release version
|
||||
# (from apps/readest-app/package.json, mirroring the koplugin's
|
||||
# _meta.lua stamp above); the committed value is a dev placeholder.
|
||||
version_tuple=$(echo "${version}" | awk -F. '{printf "(%d, %d, %d)", $1, $2, $3}')
|
||||
perl -i -pe "s/^PLUGIN_VERSION = \(\d+, \d+, \d+\)/PLUGIN_VERSION = ${version_tuple}/" \
|
||||
apps/readest-calibre-plugin/__init__.py
|
||||
|
||||
make -C apps/readest-calibre-plugin zip
|
||||
plugin_zip="apps/readest-calibre-plugin/dist/Readest-${version}.calibre-plugin.zip"
|
||||
|
||||
echo "Uploading ${plugin_zip} to GitHub release"
|
||||
gh release upload ${{ needs.get-release.outputs.release_tag }} ${plugin_zip} --clobber
|
||||
|
||||
build-tauri:
|
||||
needs: get-release
|
||||
permissions:
|
||||
@@ -176,7 +203,7 @@ jobs:
|
||||
|
||||
- name: setup Java (for Android build only)
|
||||
if: matrix.config.release == 'android'
|
||||
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5
|
||||
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: '17'
|
||||
@@ -229,6 +256,7 @@ jobs:
|
||||
echo "NEXT_PUBLIC_SUPABASE_URL=${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}" >> .env.local
|
||||
echo "NEXT_PUBLIC_SUPABASE_ANON_KEY=${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}" >> .env.local
|
||||
echo "NEXT_PUBLIC_APP_PLATFORM=tauri" >> .env.local
|
||||
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env.local
|
||||
cp .env.local apps/readest-app/.env.local
|
||||
|
||||
- name: build and upload Android apks
|
||||
@@ -320,7 +348,23 @@ jobs:
|
||||
if: matrix.config.release == 'linux'
|
||||
run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri --branch feat/truly-portable-appimage --force
|
||||
|
||||
- uses: tauri-apps/tauri-action@84b9d35b5fc46c1e45415bdb6144030364f7ebc5 # v0
|
||||
# The truly-portable AppImage bundler downloads quick-sharun.sh from
|
||||
# Anylinux-AppImages@main ONLY when it is not already in the tauri tools
|
||||
# cache. An upstream strace-mode change (2026-06-29) made bundling launch
|
||||
# the app under Xvfb and hang forever (#4906). Seed the cache with the
|
||||
# last known-good revision so the bundler never fetches the moving
|
||||
# main-branch script. Keep in sync with nightly.yml.
|
||||
- name: pin quick-sharun.sh for AppImage bundling (Linux)
|
||||
if: matrix.config.release == 'linux'
|
||||
run: |
|
||||
set -euo pipefail
|
||||
cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/tauri"
|
||||
mkdir -p "$cache_dir"
|
||||
curl -fsSL --retry 3 -o "$cache_dir/quick-sharun.sh" \
|
||||
"https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/b3a9e985cdedf7efa81d172f182cd13983743147/useful-tools/quick-sharun.sh"
|
||||
chmod +x "$cache_dir/quick-sharun.sh"
|
||||
|
||||
- uses: tauri-apps/tauri-action@1deb371b0cd8bd54025b384f1cd735e725c4060f # v1.0.0
|
||||
id: tauri
|
||||
if: matrix.config.release != 'android'
|
||||
env:
|
||||
|
||||
@@ -26,6 +26,7 @@ docker/.env
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
readest-dev.log
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
+2
-2
@@ -20,8 +20,8 @@ Basically you need to install or update the following development tools:
|
||||
- **Rust** and **Cargo** for Tauri development
|
||||
|
||||
```bash
|
||||
nvm install v22
|
||||
nvm use v22
|
||||
nvm install v24
|
||||
nvm use v24
|
||||
npm install -g pnpm
|
||||
rustup update
|
||||
```
|
||||
|
||||
Generated
+452
-7
@@ -36,6 +36,7 @@ dependencies = [
|
||||
"read-progress-stream",
|
||||
"reqwest 0.12.28",
|
||||
"semver",
|
||||
"sentry",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tauri",
|
||||
@@ -57,6 +58,7 @@ dependencies = [
|
||||
"tauri-plugin-os",
|
||||
"tauri-plugin-persisted-scope",
|
||||
"tauri-plugin-process",
|
||||
"tauri-plugin-sentry",
|
||||
"tauri-plugin-sharekit",
|
||||
"tauri-plugin-shell",
|
||||
"tauri-plugin-sign-in-with-apple",
|
||||
@@ -75,6 +77,15 @@ dependencies = [
|
||||
"zip 2.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "addr2line"
|
||||
version = "0.25.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b"
|
||||
dependencies = [
|
||||
"gimli",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "adler2"
|
||||
version = "2.0.1"
|
||||
@@ -545,6 +556,21 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "backtrace"
|
||||
version = "0.3.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6"
|
||||
dependencies = [
|
||||
"addr2line",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"miniz_oxide",
|
||||
"object",
|
||||
"rustc-demangle",
|
||||
"windows-link 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.21.7"
|
||||
@@ -749,7 +775,7 @@ checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a"
|
||||
dependencies = [
|
||||
"borsh-derive",
|
||||
"bytes",
|
||||
"cfg_aliases",
|
||||
"cfg_aliases 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1031,6 +1057,12 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.2.1"
|
||||
@@ -1341,6 +1373,30 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crash-context"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "031ed29858d90cfdf27fe49fae28028a1f20466db97962fa2f4ea34809aeebf3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"mach2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crash-handler"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2066907075af649bcb8bcb1b9b986329b243677e6918b2d920aa64b0aac5ace3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crash-context",
|
||||
"libc",
|
||||
"mach2",
|
||||
"parking_lot",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc32c"
|
||||
version = "0.6.8"
|
||||
@@ -1622,6 +1678,16 @@ dependencies = [
|
||||
"keyring-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "debugid"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"uuid 1.23.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "default-net"
|
||||
version = "0.22.0"
|
||||
@@ -2731,6 +2797,12 @@ dependencies = [
|
||||
"weezl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.32.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
|
||||
|
||||
[[package]]
|
||||
name = "gio"
|
||||
version = "0.18.4"
|
||||
@@ -2895,6 +2967,17 @@ dependencies = [
|
||||
"system-deps 7.0.8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "goblin"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47"
|
||||
dependencies = [
|
||||
"log",
|
||||
"plain",
|
||||
"scroll",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gtk"
|
||||
version = "0.18.2"
|
||||
@@ -3069,6 +3152,17 @@ dependencies = [
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hostname"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"windows-link 0.2.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "html5ever"
|
||||
version = "0.29.1"
|
||||
@@ -3984,6 +4078,15 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mach2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "malloc_buf"
|
||||
version = "0.0.6"
|
||||
@@ -4127,6 +4230,75 @@ version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||
|
||||
[[package]]
|
||||
name = "minidump-common"
|
||||
version = "0.21.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c4d14bcca0fd3ed165a03000480aaa364c6860c34e900cb2dafdf3b95340e77"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"debugid",
|
||||
"num-derive",
|
||||
"num-traits",
|
||||
"range-map",
|
||||
"scroll",
|
||||
"smart-default",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minidump-writer"
|
||||
version = "0.8.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abcd9c8a1e6e1e9d56ce3627851f39a17ea83e17c96bc510f29d7e43d78a7d"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"byteorder",
|
||||
"cfg-if",
|
||||
"crash-context",
|
||||
"goblin",
|
||||
"libc",
|
||||
"log",
|
||||
"mach2",
|
||||
"memmap2",
|
||||
"memoffset",
|
||||
"minidump-common",
|
||||
"nix 0.28.0",
|
||||
"procfs-core",
|
||||
"scroll",
|
||||
"tempfile",
|
||||
"thiserror 1.0.69",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minidumper"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b4ebc9d1f8847ec1d078f78b35ed598e0ebefa1f242d5f83cd8d7f03960a7d1"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crash-context",
|
||||
"libc",
|
||||
"log",
|
||||
"minidump-writer",
|
||||
"parking_lot",
|
||||
"polling",
|
||||
"scroll",
|
||||
"thiserror 1.0.69",
|
||||
"uds",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minidumper-child"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7c4f23f835dbe67e44ddf884d3802ff549ca5948bf60e9fd70e9a13c96324d1"
|
||||
dependencies = [
|
||||
"crash-handler",
|
||||
"minidumper",
|
||||
"thiserror 1.0.69",
|
||||
"uuid 1.23.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
@@ -4352,6 +4524,18 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.28.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"cfg-if",
|
||||
"cfg_aliases 0.1.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nix"
|
||||
version = "0.31.3"
|
||||
@@ -4360,7 +4544,7 @@ checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"cfg-if",
|
||||
"cfg_aliases",
|
||||
"cfg_aliases 0.2.1",
|
||||
"libc",
|
||||
]
|
||||
|
||||
@@ -4487,6 +4671,17 @@ version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
|
||||
|
||||
[[package]]
|
||||
name = "num-derive"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
version = "0.1.46"
|
||||
@@ -4857,6 +5052,15 @@ dependencies = [
|
||||
"objc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.37.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.21.4"
|
||||
@@ -5387,6 +5591,12 @@ version = "0.3.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
|
||||
|
||||
[[package]]
|
||||
name = "plain"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
|
||||
|
||||
[[package]]
|
||||
name = "plist"
|
||||
version = "1.9.0"
|
||||
@@ -5582,6 +5792,16 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "procfs-core"
|
||||
version = "0.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2d3554923a69f4ce04c4a754260c338f505ce22642d3830e049a399fc2059a29"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"hex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proptest"
|
||||
version = "1.11.0"
|
||||
@@ -5725,7 +5945,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"cfg_aliases",
|
||||
"cfg_aliases 0.2.1",
|
||||
"pin-project-lite",
|
||||
"quinn-proto",
|
||||
"quinn-udp",
|
||||
@@ -5765,7 +5985,7 @@ version = "0.5.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"
|
||||
dependencies = [
|
||||
"cfg_aliases",
|
||||
"cfg_aliases 0.2.1",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"socket2",
|
||||
@@ -5944,6 +6164,15 @@ dependencies = [
|
||||
"rand_core 0.9.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "range-map"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12a5a2d6c7039059af621472a4389be1215a816df61aa4d531cfe85264aee95f"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rapidhash"
|
||||
version = "4.4.1"
|
||||
@@ -6079,6 +6308,7 @@ dependencies = [
|
||||
"cookie",
|
||||
"cookie_store",
|
||||
"encoding_rs",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
@@ -6270,6 +6500,12 @@ dependencies = [
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "1.1.0"
|
||||
@@ -6333,6 +6569,7 @@ version = "0.23.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b"
|
||||
dependencies = [
|
||||
"log",
|
||||
"once_cell",
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
@@ -6515,6 +6752,26 @@ version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "scroll"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6"
|
||||
dependencies = [
|
||||
"scroll_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scroll_derive"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sdd"
|
||||
version = "3.0.10"
|
||||
@@ -6597,6 +6854,113 @@ dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "989425268ab5c011e06400187eed6c298272f8ef913e49fcadc3fda788b45030"
|
||||
dependencies = [
|
||||
"httpdate",
|
||||
"reqwest 0.12.28",
|
||||
"rustls",
|
||||
"sentry-backtrace",
|
||||
"sentry-contexts",
|
||||
"sentry-core",
|
||||
"sentry-panic",
|
||||
"sentry-tracing",
|
||||
"tokio",
|
||||
"ureq",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-backtrace"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68e299dd3f7bcf676875eee852c9941e1d08278a743c32ca528e2debf846a653"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"regex",
|
||||
"sentry-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-contexts"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fac0c5d6892cd4c414492fc957477b620026fb3411fca9fa12774831da561c88"
|
||||
dependencies = [
|
||||
"hostname",
|
||||
"libc",
|
||||
"os_info",
|
||||
"rustc_version",
|
||||
"sentry-core",
|
||||
"uname",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-core"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "deaa38b94e70820ff3f1f9db3c8b0aef053b667be130f618e615e0ff2492cbcc"
|
||||
dependencies = [
|
||||
"rand 0.9.4",
|
||||
"sentry-types",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-panic"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b7a23b13c004873de3ce7db86eb0f59fe4adfc655a31f7bbc17fd10bacc9bfe"
|
||||
dependencies = [
|
||||
"sentry-backtrace",
|
||||
"sentry-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-rust-minidump"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63964525bf74b16233dbcfb307e11485ebd8ff8f87f6ae212b07ca7937cd2db1"
|
||||
dependencies = [
|
||||
"minidumper-child",
|
||||
"sentry",
|
||||
"thiserror 2.0.18",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-tracing"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fac841c7050aa73fc2bec8f7d8e9cb1159af0b3095757b99820823f3e54e5080"
|
||||
dependencies = [
|
||||
"bitflags 2.11.1",
|
||||
"sentry-backtrace",
|
||||
"sentry-core",
|
||||
"tracing-core",
|
||||
"tracing-subscriber",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sentry-types"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e477f4d4db08ddb4ab553717a8d3a511bc9e81dde0c808c680feacbb8105c412"
|
||||
dependencies = [
|
||||
"debugid",
|
||||
"hex",
|
||||
"rand 0.9.4",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"thiserror 2.0.18",
|
||||
"time",
|
||||
"url",
|
||||
"uuid 1.23.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.228"
|
||||
@@ -6989,6 +7353,17 @@ version = "1.15.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
|
||||
[[package]]
|
||||
name = "smart-default"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0eb01866308440fc64d6c44d9e86c5cc17adfe33c4d6eed55da9145044d0ffc1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.6.4"
|
||||
@@ -7168,8 +7543,6 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||
[[package]]
|
||||
name = "swift-rs"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"serde",
|
||||
@@ -7890,9 +8263,13 @@ name = "tauri-plugin-native-bridge"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"apple-native-keyring-store",
|
||||
"base64 0.22.1",
|
||||
"block",
|
||||
"cocoa",
|
||||
"dbus-secret-service-keyring-store",
|
||||
"font-enumeration",
|
||||
"keyring-core",
|
||||
"objc",
|
||||
"schemars 0.8.22",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -7994,6 +8371,22 @@ dependencies = [
|
||||
"tauri-plugin",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-sentry"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7432b519b6d2d027082a940783c61ba9b684b38d8df7558cd5f924d87009b295"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"schemars 0.8.22",
|
||||
"sentry",
|
||||
"sentry-rust-minidump",
|
||||
"serde",
|
||||
"tauri",
|
||||
"tauri-plugin",
|
||||
"thiserror 2.0.18",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-sharekit"
|
||||
version = "0.3.1"
|
||||
@@ -8896,7 +9289,7 @@ dependencies = [
|
||||
"branches",
|
||||
"bumpalo",
|
||||
"bytemuck",
|
||||
"cfg_aliases",
|
||||
"cfg_aliases 0.2.1",
|
||||
"cfg_block",
|
||||
"chrono",
|
||||
"crc32c",
|
||||
@@ -9102,6 +9495,15 @@ version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
|
||||
|
||||
[[package]]
|
||||
name = "uds"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "885c31f06fce836457fe3ef09a59f83fe8db95d270b11cd78f40a4666c4d1661"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "uds_windows"
|
||||
version = "1.2.1"
|
||||
@@ -9113,6 +9515,15 @@ dependencies = [
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "uname"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unarray"
|
||||
version = "0.1.4"
|
||||
@@ -9219,6 +9630,34 @@ dependencies = [
|
||||
"typenum",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ureq"
|
||||
version = "3.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"log",
|
||||
"percent-encoding",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"ureq-proto",
|
||||
"utf8-zero",
|
||||
"webpki-roots 1.0.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ureq-proto"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"http",
|
||||
"httparse",
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.8"
|
||||
@@ -9262,6 +9701,12 @@ version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091"
|
||||
|
||||
[[package]]
|
||||
name = "utf8-zero"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e"
|
||||
|
||||
[[package]]
|
||||
name = "utf8_iter"
|
||||
version = "1.0.4"
|
||||
|
||||
@@ -40,3 +40,7 @@ rust-version = "1.77.2"
|
||||
[patch.crates-io]
|
||||
tauri = { path = "packages/tauri/crates/tauri" }
|
||||
tauri-plugin-fs = { path = "packages/tauri-plugins/plugins/fs" }
|
||||
# Xcode 26.2 (Swift 6.2) broke upstream swift-rs 1.0.7's per-swiftc target
|
||||
# override; the vendored copy cross-compiles via `--triple`/`--sdk` instead.
|
||||
# Upstream is unmaintained (last release 2024). See packages/swift-rs.
|
||||
swift-rs = { path = "packages/swift-rs" }
|
||||
|
||||
@@ -1,148 +1,139 @@
|
||||
# Readest Project Memory
|
||||
|
||||
## Key Reference Documents (aggregators)
|
||||
- [Bug Patterns](bug-patterns.md) · [CSS & Style](css-style-fixes.md) — EPUB CSS + style.ts · [TTS](tts-fixes.md)
|
||||
- [Layout & UI](layout-ui-fixes.md) — insets/z-index · [Platform Compat](platform-compat-fixes.md) — Android/iOS/Linux/macOS · [Annotator & Reader](annotator-reader-fixes.md)
|
||||
- [Bug Patterns](bug-patterns.md) · [CSS & Style](css-style-fixes.md) EPUB CSS + style.ts · [TTS](tts-fixes.md)
|
||||
- [Layout & UI](layout-ui-fixes.md) insets/z-index · [Platform Compat](platform-compat-fixes.md) · [Annotator & Reader](annotator-reader-fixes.md)
|
||||
## Safety & Security
|
||||
- [In-place delete wiped originals](in-place-delete-wiped-originals.md) — never `fs.removeFile` `external` source;
|
||||
- [Backup zip Windows paths (#4703)](backup-windows-zip-paths-4703.md) — `\` entry names broke restore; normalize
|
||||
- [download_file scope Android (#4639)](download-file-scope-android-regression.md) — strict `is_allowed` broke
|
||||
- [Security advisories 2026-06](security-advisories-web-2026-06.md) — 4 GHSA #4638 (OPDS SSRF, storage key, Stripe
|
||||
- [In-place delete wiped originals](in-place-delete-wiped-originals.md) never `fs.removeFile` `external` · [Backup zip Windows paths #4703](backup-windows-zip-paths-4703.md) normalize `\` · [download_file scope Android #4639](download-file-scope-android-regression.md)
|
||||
- [Security advisories 2026-06](security-advisories-web-2026-06.md) 4 GHSA #4638; SSRF guard broke dev-LAN OPDS, dev-only exemption 2026-07 PR#5002
|
||||
## Paginator & Scroll
|
||||
- [Reading ruler line-aware](reading-ruler-line-aware.md) — snaps to real lines; iframe frame-offset map
|
||||
- [TOC expand + auto-scroll](toc-expand-and-autoscroll.md) — #4059 collapse-default breaks scroll-to-current
|
||||
- [BooknoteView auto-scroll (#4352)](booknote-view-autoscroll-4352.md) — reload via `initialized` ref;
|
||||
- [TOC current-position row](toc-current-position-row.md) — synthetic row; insert AFTER to keep flatItems index
|
||||
- [Swipe page-turn bg flash](paginator-swipe-bg-flash.md) — static `#background`; `computeBackgroundSegments` per-rAF
|
||||
- [Paginated texture occlusion (#4399)](paginated-texture-occlusion-4399.md) — opaque bg occludes texture; `hasTexture
|
||||
- [Background overflows column (#4394)](paginator-gutter-bleed-asymmetry-4394.md) — bg bled into gutter; clamp to
|
||||
- [Inline-block column overflow](inline-block-column-overflow.md) — body can't fragment; `#demoteUnfragmentableBoxes`
|
||||
- [FXL fit-width scroll reset (#4683)](fixed-layout-paginated-scroll-reset-4683.md) — scrollTop not reset;
|
||||
- [PDF spread 1px seam (#4587)](pdf-spread-canvas-seam-4587.md) — fractional dpr truncates; pin `canvas.style=viewport`
|
||||
- [PDF scrolled wheel double (#4727)](pdf-scroll-mode-wheel-double-4727.md) — drop manual `scrollBy` over native
|
||||
- [Scrolled header title center (#4436)](scrolled-header-title-center-4436.md) — view covering `renderedStart + size/2`
|
||||
- [Duokan fullscreen cover scroll](duokan-fullscreen-cover-scroll.md) — #4379 cover collapses; gate on `this.#column`
|
||||
- [TOC table heading clip (#4439)](toc-table-heading-clip-4439.md) — #4400 scroll-wrapper `overflow:auto` clips
|
||||
- [Page-turn bg-replace reflow (#4785)](pageturn-bg-replace-reflow-4785.md) — `#replaceBackground` rebuilt context per
|
||||
- Reading ruler: [line-aware](reading-ruler-line-aware.md) frame-offset map; [vertical-rl backwards #4865](reading-ruler-vertical-rtl-4865.md)
|
||||
- [Vertical-rl horizontal pagination (#624)](vertical-rl-horizontal-pagination-624.md) — horizontal inputs + two-phase slide; rtl gated `!vertical`
|
||||
- [Slide/curl turn styles via VT (#555)](page-turn-styles-viewtransitions-555.md) — VT turns gated on nested-VT-groups support (iOS 18 WebKit crashes despite having the API); Tauri fallback = `CapturedPageTurn` capture pipeline (WebGL mesh curl + flat canvas slide, full-gridcell capture, instant nav = drop `animated`); MERGED #4940 (2026-07-05), verified live mac/iOS/Android (mobile = JPEG capped 2x, PNG was 1.5s/turn); Win/Linux capture still open
|
||||
- [Captured turn ignored instant-highlight hold](captured-turn-instant-highlight-scrolllock.md) — captured slide/curl swipe path (app interceptor, `no-swipe` set) didn't honor `renderer.scrollLocked`; fix = foliate `get scrollLocked()` + gate `useCapturedTurn` move on it (push/VT-slide already gated); PR#5000 + foliate#51
|
||||
- TOC: [expand + auto-scroll](toc-expand-and-autoscroll.md); [current-position row](toc-current-position-row.md); [table heading clip #4439](toc-table-heading-clip-4439.md); [BooknoteView auto-scroll #4352](booknote-view-autoscroll-4352.md)
|
||||
- Paginated bg: [swipe flash](paginator-swipe-bg-flash.md); [texture occlusion #4399](paginated-texture-occlusion-4399.md); [gutter bleed #4394](paginator-gutter-bleed-asymmetry-4394.md); [bg-replace reflow #4785](pageturn-bg-replace-reflow-4785.md)
|
||||
- [Inline-block column overflow](inline-block-column-overflow.md) `#demoteUnfragmentableBoxes`
|
||||
- FXL/PDF: [fit-width scroll reset #4683](fixed-layout-paginated-scroll-reset-4683.md); [PDF spread seam #4587](pdf-spread-canvas-seam-4587.md); [spine seam #4857](fxl-spread-spine-seam-4857.md); [portrait auto-spread off-center #4984](fxl-portrait-autospread-offcenter-4984.md) MERGED PR#4992+foliate#50 lone page kept one-sided auto margin -> stranded + taps turned page; `computeSpreadInlineMargins`
|
||||
- Scrolled: [PDF wheel double #4727](pdf-scroll-mode-wheel-double-4727.md); [header title center #4436](scrolled-header-title-center-4436.md); [Duokan fullscreen cover](duokan-fullscreen-cover-scroll.md)
|
||||
## Critical Files (Most Bug-Prone)
|
||||
- `src/utils/style.ts` EPUB CSS hub · `packages/foliate-js/paginator.js` layout/image/bg · `src/services/tts/TTSController.ts` TTS state machine
|
||||
- `src/hooks/useSafeAreaInsets.ts` insets · `src/app/reader/components/FoliateViewer.tsx` view orchestration · `.../annotator/Annotator.tsx` annotation lifecycle
|
||||
- `src/utils/style.ts` EPUB CSS hub · `packages/foliate-js/paginator.js` · `src/services/tts/TTSController.ts`
|
||||
- `src/hooks/useSafeAreaInsets.ts` · `src/app/reader/components/FoliateViewer.tsx` · `.../annotator/Annotator.tsx`
|
||||
## Sync Notes
|
||||
- [Grimmory native sync](grimmory-native-sync.md) — Booklore-fork REVERTED; id by ISBN/ASIN + koreader-hash
|
||||
- KOSync: [CFI spine resolution](kosync-cfi-spine-resolution.md) convert via CFI's own spine; [connect() false-positive #4692](kosync-connect-false-positive-4692.md)
|
||||
- [Empty-start CFI sync](empty-start-cfi-sync.md) — `isMalformedLocationCfi` → discard synced value
|
||||
- [Custom fonts vanish on sync (#4410)](custom-fonts-reincarnation-4410.md) — CRDT remove-wins; re-import
|
||||
- koplugin: [note deletion](koplugin-note-deletion-sync.md) `recordDeletion` tombstone; [stats #4666](koplugin-stats-sync.md) statistics.sqlite3 delta LuaSettings; [bulk download #4751](koplugin-bulk-download-4751.md)
|
||||
- [Statusless books re-pin top (#4677)](sync-statusless-book-rebump-4677.md) — `(a??null)!==(b??null)`
|
||||
- [Pull cursor via synced_at (#4678)](sync-synced-at-cursor-4678.md) — books `synced_at` + BEFORE trigger
|
||||
- [WebDAV metadata sync (#4756)](webdav-metadata-sync-4756.md) — PR #4776; LWW on `book.updatedAt` +
|
||||
- [File-sync refactor (#4784)](webdav-filesync-refactor-plan.md) — `FileSyncEngine`/`FileSyncProvider`/`merge.ts`;
|
||||
- [Third-party library auto-sync (#4835)](third-party-library-autosync-4835.md) — `useLibraryFileSync` parity w/
|
||||
- [WebDAV connect nullified (#4780)](webdav-connect-nullified-4780.md) — catch+finally saved STALE closure;
|
||||
- [WebDAV credential sync (#4810)](webdav-credential-sync-4810.md) — `webdav.*` missing from
|
||||
- [Multi-window settings clobber (#4580)](multiwindow-settings-clobber-4580.md) — stale window overwrites shared
|
||||
- Google Drive: [research](gdrive-sync-provider-research.md) Drive as `FileSyncProvider` token-persist+resumable; [multi-PR status](gdrive-provider-multipr-status.md)
|
||||
- [Hardcover progress edition_id (#4792)](hardcover-progress-edition-id-4792.md) — `edition_id` fell back to
|
||||
- [Cloud Sync provider selection #4959/#4380](cloud-sync-provider-selection-plan.md) MERGED #4971+#4973+#4975+#4976: derived provider, exclusive routing, syncBooks auto-enable, fleet probe, chooser; i18n pass + live verify pending
|
||||
- [Grimmory native sync](grimmory-native-sync.md) Booklore-fork REVERTED
|
||||
- KOSync: [CFI spine resolution](kosync-cfi-spine-resolution.md); [connect() false-positive #4692](kosync-connect-false-positive-4692.md)
|
||||
- [Empty-start CFI sync](empty-start-cfi-sync.md) · [Custom fonts vanish #4410](custom-fonts-reincarnation-4410.md) CRDT remove-wins
|
||||
- koplugin: [note deletion](koplugin-note-deletion-sync.md) tombstone; [stats #4666](koplugin-stats-sync.md); [bulk download #4751](koplugin-bulk-download-4751.md); [dup book rows #4861](koplugin-stats-duplicate-book-rows-4861.md)
|
||||
- [Statusless re-pin #4677](sync-statusless-book-rebump-4677.md) · [pull cursor synced_at #4678](sync-synced-at-cursor-4678.md)
|
||||
- [koplugin library stale #4934](koplugin-library-stale-synced-cursor-4934.md) pull cursor updated_at→synced_at + split push watermark + v2→v3 heal migration
|
||||
- WebDAV: [metadata #4756](webdav-metadata-sync-4756.md) LWW; [group membership #4942](webdav-group-membership-sync-4942.md) mergeBookMetadata dropped groupId/groupName; [credentials #4810](webdav-credential-sync-4810.md); [connect nullified #4780](webdav-connect-nullified-4780.md) stale closure
|
||||
- [WebDAV deletion + upload-after-enable (#4860/#4856)](webdav-deletion-and-upload-after-enable-4860-4856.md) edit-wins LWW + tombstone union
|
||||
- File sync: [refactor #4784](webdav-filesync-refactor-plan.md) `FileSyncEngine`; [third-party auto-sync #4835](third-party-library-autosync-4835.md)
|
||||
- [Transfer Queue clear not persisted](transfer-queue-clear-persistence.md) hook mutated store directly, skipped `persistQueue()`; route clears through `transferManager`
|
||||
- [Multi-window settings clobber (#4580)](multiwindow-settings-clobber-4580.md)
|
||||
- Google Drive: [research](gdrive-sync-provider-research.md); [multi-PR status](gdrive-provider-multipr-status.md); [full walk every sync](gdrive-fullwalk-every-sync-no-source-cursor.md) no-source books never recorded in uploadedHashes + focus refires pullLibrary
|
||||
- [S3/R2 provider](s3-r2-sync-provider.md) third backend, aws4fetch SigV4 path-style, full slice on dev uncommitted; live R2 verify pending
|
||||
- [Hardcover edition_id (#4792)](hardcover-progress-edition-id-4792.md)
|
||||
## Build, Testing & CI
|
||||
- [format:check separate gate](verify-format-check-gate.md) — `pnpm format:check` own gate before push
|
||||
- [Worktree rebase submodule drift](worktree-rebase-submodule-drift.md) — rebase leaves foliate-js submodule old; `git
|
||||
- [Android CDP e2e lane](android-cdp-e2e-lane.md) — `pnpm test:android` adb+CDP; CI KVM emulator
|
||||
- [CDP Android WebView profiling](cdp-android-webview-profiling.md) — adb+CDP JS probes; locked-device freezes fetch
|
||||
- [Tauri Rust↔JS parser parity](tauri-parser-parity-tests.md) — #4369 cross-check; `dcterms:modified`→`published`
|
||||
- [TTS browser e2e harness](tts-browser-e2e-harness.md) — seed `settings.globalViewSettings` or getMergedRules crashes
|
||||
- [TTS paragraph+RSVP sync (#3235)](tts-sync-paragraph-rsvp-3235.md) — TTS-is-clock; overlay CLONE via CSS Custom
|
||||
- [fastlane App Store](fastlane-apple-appstore-submission.md) — keep `APPLE_API_KEY_PATH` out of macOS build env
|
||||
- [Turbopack cache OOM (#4619)](turbopack-build-cache-oom-docker-standalone.md) — partial cache freeze; gate on
|
||||
- [Deps override workflow](deps-security-overrides-workflow.md) — overrides in `pnpm-workspace.yaml`; tauri-plugins
|
||||
- [pdfjs vendor wasm](pdfjs-vendor-wasm-decoders.md) — pdfjs 5.7 moved JBIG2 to `jbig2.wasm`; copy `wasm/*`
|
||||
- [CI/PR delivery + push keepalive](ci-pr-delivery-and-push.md) — temp-index plumbing; SSH `ServerAliveInterval`
|
||||
- [Nightly quick-sharun hang #4906](nightly-quick-sharun-hang-4906.md) pin via cache pre-seed + step timeouts
|
||||
- [format:check separate gate](verify-format-check-gate.md) · [Worktree rebase submodule drift](worktree-rebase-submodule-drift.md)
|
||||
- Android CDP: [e2e lane](android-cdp-e2e-lane.md) `pnpm test:android`; [WebView profiling](cdp-android-webview-profiling.md); [double-tap gesture](android-e2e-doubletap-cdp-gesture.md)
|
||||
- [Tauri Rust↔JS parser parity](tauri-parser-parity-tests.md)
|
||||
- TTS tests: [browser e2e harness](tts-browser-e2e-harness.md); [paragraph+RSVP sync #3235](tts-sync-paragraph-rsvp-3235.md) TTS-is-clock
|
||||
- [fastlane App Store](fastlane-apple-appstore-submission.md) `APPLE_API_KEY_PATH` out of build env
|
||||
- [Turbopack cache OOM (#4619)](turbopack-build-cache-oom-docker-standalone.md)
|
||||
- [Deps override workflow](deps-security-overrides-workflow.md) `pnpm-workspace.yaml`
|
||||
- [Xcode 26.2 broke iOS builds (swift-rs)](xcode26-swiftrs-ios-build-broken.md) — phantom `Bundle.main`/`privacy:` errors; vendored `packages/swift-rs` `--triple`/`--sdk`; Package.swift platforms floor now enforced
|
||||
- [pdfjs vendor wasm](pdfjs-vendor-wasm-decoders.md) copy `wasm/*`
|
||||
- [CI/PR delivery + push keepalive](ci-pr-delivery-and-push.md)
|
||||
## Platform Compat
|
||||
- [Android hyphen selection (#1553)](android-hyphen-selection-bounds-1553.md) — Blink start handle on last hyphen;
|
||||
- [NativeFile vs RemoteFile I/O](android-nativefile-remotefile-io.md) — NativeFile slow; asset Range broken;
|
||||
- [Window-state sanitizer (#4398)](window-state-sanitize-4398.md) — invalid json crashes WebView2; sanitize before
|
||||
- [Android Open-with intent (#4521)](android-open-with-intent-flow.md) — VIEW gated by `autoImportBooksOnOpen`
|
||||
- [Dict lookup browser hijack (#4559)](dict-lookup-browser-hijack-4559.md) — missing `<queries>` sdk36; filter in
|
||||
- [Large-PDF OOM range flood (#3470)](pdf-oom-range-flood-3470.md) — un-awaited ranges OOM; MAX_CONCURRENT_RANGES=6
|
||||
- [Android themed icon (#4733)](android-themed-icon-4733.md) — no monochrome → force-commit; tint=SRC_IN
|
||||
- Android: [hyphen selection #1553](android-hyphen-selection-bounds-1553.md); [NativeFile vs RemoteFile I/O](android-nativefile-remotefile-io.md)
|
||||
- [Window-state sanitizer #4398](window-state-sanitize-4398.md) · [Android themed icon #4733](android-themed-icon-4733.md)
|
||||
- [Open-with intent #4521](android-open-with-intent-flow.md) · [dict lookup hijack #4559](dict-lookup-browser-hijack-4559.md)
|
||||
- [Large-PDF OOM range flood (#3470)](pdf-oom-range-flood-3470.md) MAX_CONCURRENT_RANGES=6
|
||||
- [Black screen external cache (#4853)](android-black-screen-external-cache-4853.md) FIXED PR#4889; drop `$CACHE` grants
|
||||
- [macOS 26 Tahoe close→black window (#4875)](macos26-tahoe-close-black-screen-4875.md) `minimize()` not `hide()`
|
||||
- [Linux app invisible after backup (#3682)](linux-transparent-window-invisible-3682.md) FIXED PR#4904 opaque window
|
||||
- [Apple OAuth expired + deeplink swallowed (#4881)](oauth-deeplink-error-swallowed-4881.md)
|
||||
- [Annotation link ignored when reader open #4887](deeplink-drop-running-macos-4887.md) `open-book-in-reader` event
|
||||
- [iOS auto-brightness locks (#4885)](ios-brightness-lock-background-4885.md) brightness GLOBAL; release on bg
|
||||
- [iOS share .txt stuck #4917](ios-share-txt-stuck-supportstext.md) drop SupportsText in `project.yml` (xcodegen src)
|
||||
- [Updater disable non-AppImage (#4874)](updater-disable-nonappimage-linux-4874.md)
|
||||
- [Fullscreen no-op Phosh (#4034)](fullscreen-maximized-phosh-4034.md) drop `isMaximized` branch
|
||||
## Reader Features & UI
|
||||
- [Mobile reading widgets (#1602/PR#4842)](mobile-reading-widgets.md) — home-screen widget iOS+Android; gotchas: iOS
|
||||
- [PDF scrolled-mode lag (#4795/#4031)](pdf-scroll-lag-preload-4795.md) — 415ms/page render vs 50% margin; widen to
|
||||
- [Scrolled-PDF pinch-zoom (#4817)](scrolled-pdf-pinch-zoom-4817.md) — live pinch + no-shift (gap×`--scroll-zoom` +
|
||||
- [Search modes #4560 + spoiler-bound bug](search-modes-4560-and-spoiler-bound-bug.md) — regex + nearby-words;
|
||||
- [OPDS groups carousel (#4750)](opds-groups-carousel-4750.md) — >=2 groups → virtuoso carousel; `scrollToIndex`
|
||||
- [WebDAV browser sort + search (#4724)](webdav-browse-sort-search-4724.md) — PR #4786;
|
||||
- [Image zoom trackpad flicker (#4742)](image-zoom-trackpad-flicker-4742.md) — macOS pinch=`ctrl+wheel`;
|
||||
- [Instant Highlight ate tap/swipe](instant-highlight-tap-paginate.md) — preventDefault killed tap-paginate;
|
||||
- [Keyboard selection adjust (#4728)](keyboard-selection-adjust-4728.md) — Shift+←/→ char, Ctrl/Alt+Shift word;
|
||||
- [Double-click word select](iframe-double-click-word-select.md) — orphaned `iframe-double-click` →
|
||||
- [Cross-page selection auto-turn (#4741)](cross-page-selection-autoturn-4741.md) — `useAutoPageTurn` dwell;
|
||||
- [Annotator onLoad listener leak (#4735)](annotator-onload-listener-leak-paragraph-mode.md) — `useRendererInputListener
|
||||
- [Paragraph mode toggle/resume (#4717)](paragraph-mode-toggle-resume-4717.md) — snapshot live Set; resume from fresh
|
||||
- [Paragraph-mode accidental exit (#4474)](paragraph-mode-accidental-exit-4474.md) — `paragraph-show-controls`; bar
|
||||
- [#4584 tap-death](issue-4584-tap-death-investigation.md) — UNFIXED; `isPopuped` RED HERRING; likely WebView-148
|
||||
- [Dblclick-drag turns page (#4524)](dblclick-drag-pageturn-4524.md) — `isMouseDown` gates `postSingleClick`
|
||||
- [Tap to open image/table (#4600)](tap-to-open-image-table-4600.md) — `iframe-open-media` + `detectMediaTarget`
|
||||
- [PDF/CBZ Contrast view-menu](pdf-cbz-contrast-view-menu.md) — per-book `contrast`; ONE `filter:` (invert+contrast);
|
||||
- [iOS instant-dict double popup](ios-instant-dict-double-popup.md) — once-per-gesture latch; `isLongPressHold` 300ms
|
||||
- Dict: [popup font size #4443](dict-popup-font-size-4443.md) `--dict-font-scale` MDict `::part(dict-content)`; [lemmatization #4574](dict-lemmatization-4574.md)
|
||||
- Word Lens: [inline gloss](wordlens-feature.md) CFI-safe `<ruby cfi-skip>…<rt cfi-inert>` TTS/search isolation; [en-en](wordlens-en-en.md)
|
||||
- [Stripe highest-active plan (#4694)](stripe-plan-highest-active-4694.md) — `plans.plan` = MAX over active subs
|
||||
- [Save image to gallery (#4680)](save-image-to-gallery-android.md) — MediaStore; sharekit 0-byte self-copy
|
||||
- [Webtoon Mode (#3647)](webtoon-mode-3647.md) — no-gap scrolled images; FXL fit-width; `--scroll-page-gap`
|
||||
- [Biometric app-lock (#4645)](biometric-app-lock-4645.md) — flag from `appLockStore`; plugin `cfg(mobile)`
|
||||
- [Reference Pages (#4542)](reference-pages-672-4542.md) — 'reference' progressStyle; `referencePageCount`
|
||||
- [E-ink screen refresh page-turner (#4687)](eink-screen-refresh-pageturner-4687.md) — bindable 'refresh' action;
|
||||
- [Share intent + toolbar (#4014)](annotation-share-toolbar-4014.md) — Share gated mobile+macOS;
|
||||
- [Instant highlight delete orphan (#4773)](instant-highlight-delete-orphan-4773.md) — stale memoized index + in-place
|
||||
- [Empty highlight leak on annotate cancel (#4791)](empty-highlight-leak-on-annotate-cancel-4791.md) — Annotate
|
||||
- [Customize Toolbar global (#4760)](customize-toolbar-global-serializeconfig.md) — `serializeConfig` ref-compare →
|
||||
- [Customize Toolbar e-ink black bar (#4839)](customize-toolbar-eink-black-bar-4839.md) — preview Zone copied
|
||||
- Native TTS: [iOS #4676](native-ios-tts-4676.md) AVSpeechSynthesizer pause==stop rate `pow^(1/2.5)`; [offline halt #4613](native-tts-offline-autoadvance-4613.md)
|
||||
- Edge TTS: [word highlight #4017](edge-tts-word-highlighting-4017.md) `audio.metadata` WordBoundary by rAF gate on UA; [drift](tts-word-highlight-singletextnode-drift.md)
|
||||
- [TTS highlight granularity setting](tts-highlight-granularity-setting.md) — Word/Sentence; gate `prepareSpeakWords`
|
||||
- [TTS start-from-selection](tts-start-from-selection.md) — use last mark at/before sel; cloneRange+deselect
|
||||
- [Reuse TTS session on mode entry](tts-reuse-session-mode-entry.md) — `redispatchPosition()` + `tts-sync-request`
|
||||
- RSVP: [control-bar overlap REVERT](rsvp-control-bar-overlap-revert.md) #4585 fixed/#4589 stale-reverted; [font face/family #4519](rsvp-font-settings-4519.md) `getBaseFontFamily` overlay top doc; [RTL word #4630](rsvp-rtl-word-display-4630.md)
|
||||
- [Overlay z-index scale](zindex-overlay-scale.md) — RSVP 100 / Settings 110 / ModalPortal 120 / toast 130 / app-lock
|
||||
- [Global annotation page-turn lag (#4575)](global-annotation-pageturn-perf-4575.md) — `global` re-fanned every turn;
|
||||
- [Overlayer splitRange text nodes](overlayer-splitrange-textnodes.md) — `'p,h1-h4'` dropped `li`; walk text nodes +
|
||||
- [Android image callout freeze](android-image-callout-freeze.md) — `.no-context-menu` on ANCESTOR
|
||||
- [Table dark-mode tint (#4419)](table-dark-mode-tint-4419.md) — `blockquote, table *` tint gated on `overrideColor`
|
||||
- [Footnote aside border line (#4438)](footnote-aside-namespace-order-4438.md) — @font-face before @namespace; hoist
|
||||
- Proofread: [enhancements #4700](proofread-enhancements-4700.md) regex UI/Ctrl+P reuse/`wholeWord` no-op; [per-book CRDT #4781](proofread-per-book-crdt-sync.md)
|
||||
- [Russian hanging-preposition NBSP (#4769)](russian-hanging-prepositions-nbsp-4769.md) — generic `nbsp` +
|
||||
- OPDS: [Firefox strict-XML #4479](opds-firefox-strict-xml-4479.md) junk after `</feed>` slice to last close; [JSON search #4502](opds2-json-search-4502.md) expand `{?query}` BEFORE resolveURL; [HTML desc #4503](opds-html-description-4503.md) decode-once+sanitize; [self-link meta #4749](opds-self-link-metadata-4749.md) `rel:self` deref; [popular dedup #4782](opds-popular-catalog-dedup-4782.md)
|
||||
- [D-pad Navigation](dpad-navigation.md) — Android TV remote / arrow-key nav
|
||||
- [koplugin cover upload (#4374)](koplugin-cover-upload.md) — `extractLocalCover` via `getCoverImage`
|
||||
- [Android Auto TTS #3919/PR#4907](android-auto-tts-3919.md) MERGED; CarPlay blocked on entitlement
|
||||
- Widgets: [mobile reading #1602/PR#4842](mobile-reading-widgets.md); [iOS App Group stripped PR#4891](ios-widget-appgroup-stripped-appstore.md); [cover bright right-edge line](ios-widget-cover-bright-edge-line.md) fractional resize → round target to whole px
|
||||
- PDF: [scrolled lag #4795](pdf-scroll-lag-preload-4795.md); [scrolled pinch-zoom #4817](scrolled-pdf-pinch-zoom-4817.md); [pinch vs two-finger scroll #4858](pinch-vs-twofinger-scroll-4858.md); [text selection misplaced w/ OS font scale #4480](pdf-text-selection-fontscale-4480.md) OS font-scale inflates text-layer glyph size not positions; divide `--text-scale-factor` (font-size lever) by detected scale, NOT `--total-scale-factor`
|
||||
- [Search modes #4560](search-modes-4560-and-spoiler-bound-bug.md)
|
||||
- [OPDS groups carousel #4750](opds-groups-carousel-4750.md) · [WebDAV browser sort+search #4724](webdav-browse-sort-search-4724.md)
|
||||
- [Image zoom trackpad flicker (#4742)](image-zoom-trackpad-flicker-4742.md) macOS pinch=`ctrl+wheel`
|
||||
- Instant highlight: [ate tap/swipe](instant-highlight-tap-paginate.md); [delete orphan #4773](instant-highlight-delete-orphan-4773.md); [empty leak #4791](empty-highlight-leak-on-annotate-cancel-4791.md)
|
||||
- Selection: [keyboard adjust #4728](keyboard-selection-adjust-4728.md); [cross-page auto-turn #4741](cross-page-selection-autoturn-4741.md)
|
||||
- Click/tap: [double-click word select](iframe-double-click-word-select.md); [dblclick-drag #4524](dblclick-drag-pageturn-4524.md); [tap open image/table #4600](tap-to-open-image-table-4600.md)
|
||||
- [Annotator onLoad listener leak (#4735)](annotator-onload-listener-leak-paragraph-mode.md)
|
||||
- Paragraph mode: [toggle/resume #4717](paragraph-mode-toggle-resume-4717.md); [accidental exit #4474](paragraph-mode-accidental-exit-4474.md)
|
||||
- [#4584 tap-death](issue-4584-tap-death-investigation.md) UNFIXED; likely WebView-148
|
||||
- [PDF/CBZ Contrast view-menu](pdf-cbz-contrast-view-menu.md) ONE `filter:`
|
||||
- [Header/footer over light PDF in dark (#4901)](pdf-header-footer-contrast-blend-4901.md) `mix-blend-difference`, FIXED light anchor
|
||||
- [iOS instant-dict double popup](ios-instant-dict-double-popup.md) once-per-gesture latch
|
||||
- Dict: [popup font size #4443](dict-popup-font-size-4443.md); [lemmatization #4574](dict-lemmatization-4574.md); [popup speak button #4876](dict-popup-tts-speak-4876.md) standalone wordPronouncer, Edge-direct + dedicated WebAudio ctx
|
||||
- Word Lens: [inline gloss](wordlens-feature.md) CFI-safe ruby; [en-en](wordlens-en-en.md)
|
||||
- [Stripe highest-active plan (#4694)](stripe-plan-highest-active-4694.md)
|
||||
- [Save image to gallery (#4680)](save-image-to-gallery-android.md) MediaStore
|
||||
- [Webtoon Mode (#3647)](webtoon-mode-3647.md)
|
||||
- [Middle-click autoscroll #4951](middle-click-autoscroll-4951.md) Autoscroller RAF core; `containerPosition +=`; armed-books preventDefault
|
||||
- [Auto Scroll teleprompter #4998](auto-scroll-teleprompter-4998.md) MERGED PR#4999 PacedScroller + useAutoScroll + gridcell-centered pill; scrolled-only; tap=pause via iframe-single-click consume
|
||||
- [Biometric app-lock #4645](biometric-app-lock-4645.md) · [Reference Pages #4542](reference-pages-672-4542.md) · [e-ink refresh page-turner #4687](eink-screen-refresh-pageturner-4687.md)
|
||||
- [Share intent + toolbar (#4014)](annotation-share-toolbar-4014.md)
|
||||
- Customize Toolbar: [global serializeConfig #4760](customize-toolbar-global-serializeconfig.md); [e-ink black bar #4839](customize-toolbar-eink-black-bar-4839.md)
|
||||
- [Edge TTS Web Audio engine (#3851)](edge-tts-webaudio-engine.md) gapless WebAudioPlayer + WSOLA
|
||||
- [Background TTS sessions PR#4941](tts-background-session-decoupling.md) — hash-keyed session manager, detach/attach, NowPlayingBar; header X routes `onCloseBook` NOT `onGoToLibrary`
|
||||
- [TTS player redesign](tts-player-redesign.md) mini-player + Dialog sheet replaces icon/popup/TTSBar; MERGED #4996; open: isPlaying glyph desync at section transitions
|
||||
- [Android bg TTS media session fix](android-bg-tts-media-session-fix.md) — #4941/#4931 regression: `startService()` dies backgrounded → in-process instance calls; always request POST_NOTIFICATIONS; + lock-screen duration scrubber + `onSeekTo` (Edge-only)
|
||||
- Native TTS: [iOS #4676](native-ios-tts-4676.md) pause==stop; [offline halt #4613](native-tts-offline-autoadvance-4613.md)
|
||||
- Edge TTS: [word highlight #4017](edge-tts-word-highlighting-4017.md); [drift](tts-word-highlight-singletextnode-drift.md)
|
||||
- TTS UX: [highlight granularity](tts-highlight-granularity-setting.md); [start-from-selection](tts-start-from-selection.md); [reuse session](tts-reuse-session-mode-entry.md)
|
||||
- RSVP: [control-bar REVERT](rsvp-control-bar-overlap-revert.md); [font #4519](rsvp-font-settings-4519.md); [RTL word #4630](rsvp-rtl-word-display-4630.md)
|
||||
- [Overlay z-index scale](zindex-overlay-scale.md) RSVP 100 → app-lock
|
||||
- [Global annotation page-turn lag (#4575)](global-annotation-pageturn-perf-4575.md)
|
||||
- [Overlayer splitRange text nodes](overlayer-splitrange-textnodes.md)
|
||||
- [Android image callout freeze](android-image-callout-freeze.md) `.no-context-menu` ANCESTOR
|
||||
- [Inline-img vertical-align (#4866)](inline-img-vertical-align-4866.md) gated on computed valign
|
||||
- [Table dark-mode tint #4419](table-dark-mode-tint-4419.md) · [footnote aside border #4438](footnote-aside-namespace-order-4438.md)
|
||||
- Proofread: [enhancements #4700](proofread-enhancements-4700.md); [per-book CRDT #4781](proofread-per-book-crdt-sync.md); [edit Find + toggle #4859](proofread-edit-toggle-4859.md)
|
||||
- [Russian NBSP (#4769)](russian-hanging-prepositions-nbsp-4769.md)
|
||||
- OPDS: [Firefox strict-XML #4479](opds-firefox-strict-xml-4479.md); [JSON search #4502](opds2-json-search-4502.md); [HTML desc #4503](opds-html-description-4503.md); [self-link #4749](opds-self-link-metadata-4749.md); [popular dedup #4782](opds-popular-catalog-dedup-4782.md); [auto-download subdir crawl #4272](opds-autodownload-subdir-crawl-4272.md) bounded BFS, never crawl newest-feed catalogs; [preemptive Basic 400s digest Calibre](opds-preemptive-basic-digest-400.md) bare-retry on 400 PR#5002; [auto-download TLS #4988](opds-autodownload-tls-skipssl-4988.md) skipSslVerification parity PR#5002
|
||||
- [D-pad Navigation](dpad-navigation.md)
|
||||
- [koplugin cover upload (#4374)](koplugin-cover-upload.md)
|
||||
- [koplugin Library slow open #4954](koplugin-library-open-mosaic-cache-4954.md) group mosaics recomposed every paint; PR#4974 availability-keyed cache + async compose + cache nil result
|
||||
- [Calibre plugin push #4863](calibre-plugin-push-4863.md) OAuth localhost relay
|
||||
- [Calibre custom columns #4811](calibre-custom-columns-4811.md) `metadata.calibreColumns`
|
||||
## Library Fixes
|
||||
- [Book action platform surfaces](book-actions-platform-surfaces.md) — context menu Tauri-desktop-only; cross-platform
|
||||
- [Tauri menu append race (#4389)](tauri-menu-append-race-4389.md) — single `await Menu.new({ items })`
|
||||
- TXT: [author recognition #4390](txt-author-recognition-4390.md) `parseLabeledAuthor`+`isPlausibleAuthorName`; [chapter measure-word FP #4658](txt-chapter-measure-word-4658.md)
|
||||
- [Cover stale (in-place mutation)](cover-stale-inplace-mutation-memo.md) — pure `getBookWithUpdatedMetadata`
|
||||
- [Series/author back no-op (#4437)](series-folder-back-noop-4437.md) — Next 16.2 empty-search no-op; `handleBack`
|
||||
- [Library/reader separate texture (#4743)](library-reader-separate-texture-4743.md) — `libraryBackground*`
|
||||
- [List view series overflow (#4796)](list-view-series-overflow-4796.md) — fixed `h-28` clipped series+description
|
||||
- [Recently-read shelf (#3797)](recent-read-shelf-3797.md) — PR #4829; reuse `BookItem` + shared `useOpenBook`; flex
|
||||
- [Book action platform surfaces](book-actions-platform-surfaces.md) · [menu append race #4389](tauri-menu-append-race-4389.md)
|
||||
- TXT: [author recognition #4390](txt-author-recognition-4390.md); [chapter measure-word FP #4658](txt-chapter-measure-word-4658.md)
|
||||
- [Cover stale (in-place mutation)](cover-stale-inplace-mutation-memo.md)
|
||||
- [Series/author back no-op (#4437)](series-folder-back-noop-4437.md)
|
||||
- [Library/reader separate texture #4743](library-reader-separate-texture-4743.md) · [list view series overflow #4796](list-view-series-overflow-4796.md)
|
||||
- [Recently-read shelf (#3797)](recent-read-shelf-3797.md)
|
||||
- [Auto-import watched folders (#3889)](auto-import-watched-folders-3889.md) per-folder opt-in
|
||||
## Architecture & Patterns
|
||||
- foliate-js submodule at `packages/foliate-js/`; multiview paginator preloads adjacent sections
|
||||
- [Markdown .md support (#774)](markdown-md-support-774.md) — in-memory foliate book (no EPUB) in `src/utils/md.ts`;
|
||||
- Style: `getLayoutStyles()` always, `getColorStyles()` when overriding color; `transformStylesheet()` rewrites EPUB CSS at load
|
||||
- TTS independent section tracking (`#ttsSectionIndex`); safe insets: native plugin → useSafeAreaInsets → styles; Dropdowns `DropdownContext`
|
||||
- Stale settings closure: store-hook `settings` stale across `await`; persist `useSettingsStore.getState().settings` ([#4780](webdav-connect-nullified-4780.md)
|
||||
- [Foliate touch-listener capture phase](foliate-touch-listener-capture-phase.md) — suppress gestures via
|
||||
- [iframe cross-realm instanceof](iframe-cross-realm-instanceof.md) — `instanceof Element` false; duck-type `'closest'
|
||||
- [Virtuoso + OverlayScrollbars](virtuoso_overlayscrollbars.md) — useOverlayScrollbars for mobile webviews
|
||||
- [Design system → DESIGN.md](feedback_design_system_doc.md) — never `pl/pr/ml/mr/text-left/right` (RTL)
|
||||
- [Turso "concurrent use forbidden"](turso-concurrent-use-forbidden.md) `op_lock` async mutex
|
||||
- Markdown: [.md support #774](markdown-md-support-774.md); [resume position #4862](markdown-resume-position-4862.md)
|
||||
- Style: `getLayoutStyles()` always, `getColorStyles()` when overriding; `transformStylesheet()` rewrites EPUB CSS
|
||||
- TTS `#ttsSectionIndex`; insets: native plugin → useSafeAreaInsets → styles; Dropdowns `DropdownContext`
|
||||
- Stale settings closure: persist `useSettingsStore.getState().settings` ([#4780](webdav-connect-nullified-4780.md))
|
||||
- [Page margins not live #4898](page-margin-live-update-4898.md) in-place mutation froze memo
|
||||
- [Foliate touch-listener capture phase](foliate-touch-listener-capture-phase.md)
|
||||
- [iframe cross-realm instanceof](iframe-cross-realm-instanceof.md) duck-type `'closest'`
|
||||
- [Virtuoso + OverlayScrollbars](virtuoso_overlayscrollbars.md)
|
||||
- [Design system → DESIGN.md](feedback_design_system_doc.md) never `pl/pr/ml/mr` (RTL)
|
||||
## Workflow & Feedback
|
||||
- [Commit messages English-only](feedback-commit-message-english-only.md) — English only (no CJK, no em/en dashes)
|
||||
- [Test file filter](feedback_test_file_filter.md) — `pnpm test <path>` without `--` runs one file
|
||||
- [Rebase before PR](feedback_pr_rebase.md) — rebase onto origin/main before PRs
|
||||
- [New branch per PR](feedback_pr_new_branch.md) — fresh branch from main per PR/issue
|
||||
- [Use worktree](feedback_use_worktree.md) — never `git worktree add`; always `pnpm worktree:new`
|
||||
- [Never push every change](feedback_dont_push_every_change.md) — commit locally until user confirms
|
||||
- [No test seams in prod](feedback_no_test_seams_in_prod.md) — prod never imports `__reset*ForTests`
|
||||
- [No lookbehind regex](feedback_no_lookbehind_regex.md) — never `(?<=)`/`(?<!)`; build check rejects
|
||||
- [en plurals manual](feedback_en_plurals_manual.md) — only plural variants + proper nouns; `_one`/`_other`
|
||||
- [i18n:extract prunes keys](i18n-extract-prunes-keys.md) — `removeUnusedKeys` deletes valid keys; revert churn, add
|
||||
- [Dependabot transitive fixes](dependabot-pnpm-overrides.md) — pin in `pnpm-workspace.yaml` `overrides:`; alert#≠issue#
|
||||
- [Upgrade gstack locally](feedback_gstack_upgrade.md) — upgrade from project `.claude/skills/gstack`
|
||||
- [Commit messages English-only](feedback-commit-message-english-only.md) no CJK, no em/en dashes
|
||||
- PR flow: [rebase onto origin/main](feedback_pr_rebase.md); [fresh branch per PR](feedback_pr_new_branch.md); [always `pnpm worktree:new`](feedback_use_worktree.md); [commit locally, don't push until confirmed](feedback_dont_push_every_change.md)
|
||||
- [Test file filter](feedback_test_file_filter.md) `pnpm test <path>` no `--`
|
||||
- [No test seams in prod](feedback_no_test_seams_in_prod.md) · [no lookbehind regex](feedback_no_lookbehind_regex.md)
|
||||
- i18n: [en plurals manual](feedback_en_plurals_manual.md); [i18n:extract prunes keys](i18n-extract-prunes-keys.md)
|
||||
- [Dependabot transitive fixes](dependabot-pnpm-overrides.md) `pnpm-workspace.yaml` `overrides:`
|
||||
- [Upgrade gstack locally](feedback_gstack_upgrade.md)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
name: android-bg-tts-media-session-fix
|
||||
description: Android background TTS regression - startService() dies backgrounded; use in-process service calls; + lock-screen scrubber/seek
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 052bb3f3-27fe-4eb0-95c3-699a3122083a
|
||||
---
|
||||
|
||||
Branch `fix/android-bg-tts-media-session` (worktree `/Users/chrox/dev/readest-fix-android-bg-tts-media-session`), 2026-07-07. **PR readest/readest#4994 MERGED** (2026-07-07; worktree + local branch cleaned up. rebased onto origin/main; foliate-js submodule re-synced to f6dced2 after rebase per [[worktree-rebase-submodule-drift]]). 5 commits: 15817fc4b in-process IPC, 04e4b4fe6 duration scrubber+seek, 67c22b72b FGS hardening+diagnostic logs, 27e224bcc keepAppInForeground removal (the real fix), a8643ec12 Edge edge-fade click fix. Verified on-device (Xiaomi/MIUI/Android 15). Diagnostic Log.d traces left in 67c22b72b (offered to strip).
|
||||
|
||||
**Regression (commit 1, `fix(android): keep background TTS media controls alive when backgrounded`):** after #4941 (session decoupling) + #4931 (Edge WebAudio engine), Android background TTS lost the lock-screen control and audio died when backgrounded. Logs: `Not allowed to start service Intent { act=UPDATE_PLAYBACK_STATE ... MediaPlaybackService }: app is in background`.
|
||||
|
||||
Root cause: `NativeTTSPlugin.update_media_session_state`/`update_media_session_metadata` pushed updates to the already-running foreground service via `activity.startService(intent)`. Android 8+ (BSSR) rejects `Context.startService()` from the background unless an active foreground service exempts the app; each per-sentence update threw, so the FGS notification stopped refreshing (lock-screen control went stale) and the audio route was lost. **Fix pattern: never `startService()` to talk to a running service - call the live instance in-process.** `MediaPlaybackService` already had the pattern: static `@Volatile instance` + `requestDeactivation()` posting to it on the main thread. Added companion `pushMetadata`/`pushPlaybackState` (update statics, post to `instance` via `Handler(Looper.getMainLooper())`) + private instance `applyMetadata`/`applyPlaybackState`; removed the dead `UPDATE_METADATA`/`UPDATE_PLAYBACK_STATE` intent branches + the now-unused `serviceScope`/`kotlinx.coroutines.*`. `startForeground()` to *update* an already-foregrounded service is allowed from background (unlike `Context.startForegroundService()` to *start* one).
|
||||
|
||||
Secondary: #4941 dropped the `keepAppInForeground`/notification titles from `TTSMediaBridge.bind()`'s `setActive({active:true})`. `keepAppInForeground` gated `requestPostNotificationPermission()` in `mediaSession.ts`, and it defaults false (`alwaysInForeground` in constants.ts), so POST_NOTIFICATIONS was never requested. Fix: `setActive` requests it on EVERY activation (no-op once decided), not gated on the setting - else the FGS media notification (= the lock-screen control) is silently suppressed on Android 13+.
|
||||
|
||||
**Feature (commit 2, `feat(android): show section duration and enable seek on the TTS media session`):** user asked to show estimated section duration + seek from the media session. JS half was already there - `ttsMediaBridge.#updatePositionState` already sends `{playing, position, duration}` (ms) every mark, and `mediaSession.ts` already listens for a `media-session-seek` event -> `handlers['seekto']` -> `controller.seekToTime(pos/1000)`. Native side never used them. Added: `METADATA_KEY_DURATION` in the session metadata (Android reads scrubber length from METADATA, thumb from PlaybackState), `ACTION_SEEK_TO` in `setActions`, and `SessionCallback.onSeekTo(pos)` -> `pluginEventTrigger("media-session-seek", {position})` + optimistic thumb move. Bare play/pause updates omit position/duration, so `pushPlaybackState(playing, position: Long?, duration: Long?)` preserves last-known statics (else scrubber snaps to 0 on pause). **Section timeline is Edge/WebAudio ONLY** (`TTSController` comment "position/duration/seek (Edge client only)"; `getPlaybackInfo()` returns null for native TextToSpeech) - native TTS leaves duration 0 so no scrubber appears, which is correct.
|
||||
|
||||
**On-device (Xiaomi/MIUI, targetSdk 36) round 1 FAILED - two findings:** (1) tested APK was STALE - logcat still showed `startService(act=UPDATE_METADATA/UPDATE_PLAYBACK_STATE)` which the fix removes, so the fix wasn't built in (likely built from main tree, not the worktree). (2) Deeper root cause the IPC fix does NOT touch: `W/ActivityManager: Stopping service due to app idle: ...MediaPlaybackService` = the service was NEVER promoted to a foreground service (FGS services aren't idle-stopped; readest uid never appears in FGS-type logs). Also MIUI hostile: uid 10186 (SecurityCenter) repeatedly sets readest `post_notification` appop to `ignore`; `Force stopping service`. Audio plays via WebView (`org.chromium.content.browser.AudioFocusDelegate` holds focus), and the service ExoPlayer also requests AUDIOFOCUS_GAIN - possible focus-steal conflict (unconfirmed).
|
||||
|
||||
**Commit 3 (`fix(android): harden TTS foreground-service promotion + add diagnostics`):** `showNotification` now uses `ServiceCompat.startForeground(this, id, notif, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK)` (explicit type, targetSdk 34+) wrapped in try/catch+Log. `setActive` (mediaSession.ts) decoupled: POST_NOTIFICATIONS request in its own try/catch so a throw/hang can't abort `set_media_session_active` (the FGS start). Trace logs added: `set_media_session_active: startForegroundService` (plugin), `activateSession (wasActive=)`, `startForeground ok`/`failed`. Next device run: build FROM the worktree + `adb uninstall com.bilingify.readest` first; set MIUI Autostart ON + battery No-restrictions + lock in recents; grep logcat for those tags to see where the FGS path breaks. If `startForeground ok` but audio still dies backgrounded -> WebAudio AudioContext suspension (test native voice: survives = confirms WebView issue).
|
||||
|
||||
**ACTUAL ROOT CAUSE found round 3 (WebView console `[INFO:CONSOLE]` via `adb logcat` chromium tag):** `Failed to set media session active state: invalid args payload for command set_media_session_active: missing field keepAppInForeground`. The Rust `SetMediaSessionActiveRequest` (models.rs) had `keep_app_in_foreground: bool` as a REQUIRED serde field (all other fields `Option`); #4941's `ttsMediaBridge.bind()` sends `setActive({active:true})` without it, so **Tauri rejected the invoke at the serde layer before the command ran** -> `set_media_session_active` never executed -> FGS never started -> no notification + Android 15 `AS.AudioService: AudioHardening background playback would be muted` killed background audio. Every earlier fix (in-process IPC, FGS hardening, POST_NOTIFICATIONS decouple) was downstream of this and couldn't help because the command never ran. Diagnostic trap: native tags (MediaPlaybackService/NativeTTSPlugin) were absent from logcat because the service was never touched; the answer was only in the WebView JS console (grep logcat for `CONSOLE`). Commit 4 (`fix(android): drop required keepAppInForeground so the TTS service starts`, 27e224bcc): removed `keepAppInForeground` ENTIRELY (dead everywhere - no platform read it; FGS always starts, POST_NOTIFICATIONS now unconditional) from Rust/Kotlin/iOS/TS payloads per user request ("default true"). Follow-up commit 0b8843012 also removed the now-dead `alwaysInForeground` setting + its Android "Background Read Aloud" library-menu toggle (settings.ts/constants.ts/SettingsMenu.tsx + tests) and pruned the i18n key across 33 locales via `pnpm i18n:extract`. **Lesson: on a failed Tauri mobile command, capture the WebView console (logcat `CONSOLE` tag) FIRST - serde arg-rejection surfaces only there, not in native logs.**
|
||||
|
||||
Verified: `pnpm test` (7022 pass), `pnpm lint` clean, `cargo check/fmt/clippy -p tauri-plugin-native-tts` clean. **Kotlin NOT compiled/device-verified** - worktree `src-tauri/gen/android` lacks `tauri.settings.gradle` so the plugin's `app.tauri.plugin.*` deps don't resolve standalone; needs `pnpm tauri android` on a real Android 13+/14 device (logcat: foreground -> background -> lock screen). Related: [[tts-background-session-decoupling]], [[edge-tts-webaudio-engine]], [[native-ios-tts-4676]].
|
||||
@@ -0,0 +1,56 @@
|
||||
---
|
||||
name: android-e2e-doubletap-cdp-gesture
|
||||
description: Nightly Android E2E double-tap test failed since
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: eafe11ed-faac-4406-957d-1674353f081c
|
||||
---
|
||||
|
||||
Nightly `Android E2E (CDP)` failed every night from 2026-06-28 (first night after
|
||||
PR #4846 merged) with `timed out waiting for selection of "..." (last: null)` in
|
||||
`double-click.android.test.ts`. The test never passed on CI. Fixed 2026-07-04 —
|
||||
harness-only, no app code changed.
|
||||
|
||||
**Two stacked root causes:**
|
||||
|
||||
1. **PRIMARY — feature is opt-in on mobile.** `DEFAULT_MOBILE_VIEW_SETTINGS`
|
||||
ships `disableDoubleClick: true` (double-click detection delays single-tap
|
||||
page turns by the 250ms disambiguation window, so mobile opts out).
|
||||
`handleClick` (iframeEventHandlers.ts) then posts `iframe-single-click`
|
||||
IMMEDIATELY and never arms the double-click window — the #4846 double-tap
|
||||
word selection is deliberately "gated by the user's double-click setting"
|
||||
(Annotator comment). The e2e assumed default config → could never pass on a
|
||||
fresh device. Diagnostic signature: `iframe-single-click` ~20ms after click
|
||||
(window disabled) vs ~250ms after (window armed, no second click).
|
||||
2. **SECONDARY — adb double-tap can't hit the window.** The old helper ran
|
||||
`input tap x y && input tap x y`; each `input` invocation spawns a fresh
|
||||
app_process JVM (measured 0.9–1.05s each, 28s cold). Warm fast host ≈130ms
|
||||
click gap (passes), loaded CI emulator >250ms (always fails).
|
||||
|
||||
**Fix (all in `src/__tests__/android/`):**
|
||||
- `reader.ts patchGlobalViewSettings(patch)` — force-stop app, read/patch
|
||||
`settings.json` `globalViewSettings` via `adb shell run-as` (debug builds
|
||||
only; file lives at the app data dir ROOT, not files/), write back via
|
||||
base64 pipe, return previous values for restore in afterAll. Missing
|
||||
settings.json is fine: `loadSettings` deep-merges partial file over defaults.
|
||||
- `cdp.ts CdpPage.doubleTap(cssX, cssY)` — ONE
|
||||
`Input.synthesizeTapGesture {tapCount: 2, duration: 20, gestureSourceType: 'touch'}`;
|
||||
renderer-internal timing gives ~200ms click gap on a busy emulator. TWO
|
||||
sequential synthesizeTapGesture commands are too slow (~535ms gap — each
|
||||
resolves long after its gesture). Raw `Input.dispatchTouchEvent` delivers
|
||||
touch events but does NOT reliably synthesize clicks on Android WebView.
|
||||
- Word finder requires `range.getClientRects().length === 1`: a
|
||||
hyphenated/wrapped word's bounding rect spans two lines, so its center taps
|
||||
between lines and selects the neighboring word (saw `'party' !== 'sensation'`).
|
||||
- `dismissSelection` picks a mid-column tap spot (0.78H or 0.25H) that the
|
||||
`.selection-popup` doesn't cover — a blind 0.78H tap can press a toolbar
|
||||
button when the selection sits low.
|
||||
|
||||
**Other gotchas:** headless emulator display sleeps → adb `input` no-ops while
|
||||
CDP input still works (`input keyevent KEYCODE_WAKEUP`); a leaked single-click
|
||||
(broken double-tap) toggles header or opens the media viewer, contaminating the
|
||||
session; local repro = `pnpm tauri android build --debug --target aarch64` +
|
||||
`adb install -r` + `pnpm test:android`.
|
||||
|
||||
Related: [[android-cdp-e2e-lane]], [[iframe-double-click-word-select]]
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
name: auto-scroll-teleprompter-4998
|
||||
description: "Auto Scroll teleprompter mode (#4998, PR#4999): PacedScroller core, useAutoScroll hook, control pill centered on gridcell, scrolled-mode-only View menu toggle"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 129a72a3-6d52-4f4c-a499-972c0055b4e3
|
||||
---
|
||||
|
||||
Auto Scroll reading mode (#4998), PR #4999 MERGED 2026-07-08 (merge
|
||||
f8ad47a41); worktree and local branch cleaned up.
|
||||
Teleprompter scrolling for scrolled mode only, toggled from the View menu
|
||||
(Shift+A, `onToggleAutoScroll`), dispatches `autoscroll-toggle` events.
|
||||
|
||||
Key structure:
|
||||
- `PacedScroller` added to `src/app/reader/utils/autoscroller.ts` alongside the
|
||||
middle-click `Autoscroller` ([[middle-click-autoscroll-4951]]): constant
|
||||
velocity, whole-pixel emission + fractional carry, injected raf/now for
|
||||
tests, `PACED_SCROLL_MAX_FRAME_MS` dt clamp (background tab resume). A
|
||||
scrollBy callback may stop() the scroller mid-tick; #tick re-checks active
|
||||
before re-arming (test covers it).
|
||||
- `useAutoScroll(bookKey, viewRef)` in reader/hooks, mounted in FoliateViewer:
|
||||
scrolls `renderer.containerPosition += sign * delta`; sign = -1 when
|
||||
`renderer.scrollProp === 'scrollLeft'` (scrolled+vertical), matching foliate
|
||||
paginator.js `offset = -offset` for scrolled vertical (vertical-lr is a known
|
||||
upstream FIXME). Manual wheel/drag composes with the paced steps by design
|
||||
(no pause-on-wheel). Tap pause/resume consumes `iframe-single-click` via
|
||||
eventDispatcher.onSync (same swallow mechanism as middle-click). Stall
|
||||
detection: containerPosition unchanged ≥800ms → `view.next()` (hops sections
|
||||
under noContinuousScroll) or stop + 'End of book' toast when
|
||||
`renderer.atEnd`. Session state mirrored to readerStore
|
||||
`viewState.autoScrollEnabled` (new setter) for the ViewMenu checkmark;
|
||||
session never persisted, speed IS: `autoScrollSpeed` percent in BookLayout
|
||||
(default 100 = 20 px/s base, 25-500 step 25, constants in
|
||||
services/constants.ts).
|
||||
- `AutoScrollControl` pill reuses the ParagraphBar chassis but positioned
|
||||
`absolute` (NOT `fixed`): maintainer explicitly wants it centered on the
|
||||
book's gridcell, not the viewport — pinned sidebar pushes the reading column
|
||||
off window center. (ParagraphBar's #4474 comment argues the opposite for
|
||||
paragraph mode; the two are intentionally different.) Fades after 2.5s while
|
||||
scrolling, wakes on mousemove/pause, hidden while hoveredBookKey shows bars.
|
||||
- Adding a field to readerStore ViewState breaks two test fixtures that build
|
||||
ViewState literals (reader-store.test.ts, tts-auto-advance.browser.test.tsx).
|
||||
- i18n: 6 new keys (Auto Scroll, Toggle Auto Scroll, Slower, Faster, Exit Auto
|
||||
Scroll, End of book) hand-translated across all 33 locales following each
|
||||
locale's existing Scrolled Mode / RSVP Slower-Faster terminology; scanner
|
||||
extraction only touched trailing commas (no pruning this time).
|
||||
|
||||
Verified live in dev-web with claude-in-chrome (localhost:3001): 20 px/s at
|
||||
100%, menu gating, pill geometry (pillCenterX == gridcell center != viewport
|
||||
center).
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
name: calibre-custom-columns-4811
|
||||
description: "Surface Calibre custom columns from OPF user metadata (#4811) - parse formats, calibreColumns field, details UI, library search"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 7f74fc26-9614-4fe3-987b-66c8ce412523
|
||||
---
|
||||
|
||||
Feature #4811 SHIPPED (app PR #4939 merged 2026-07-05 as `ec45a08`; foliate-js#47 merged as `8485e93`): surface Calibre custom columns embedded in EPUB OPFs. Worktree and branches cleaned up.
|
||||
|
||||
**Calibre OPF encodings (verified against calibre source opf2.py/opf3.py):**
|
||||
- OPF2: one `<meta name="calibre:user_metadata:#label" content="{json}"/>` per column; label must start with `#`
|
||||
- OPF3: a single `<meta property="calibre:user_metadata">{"#label": {...}}</meta>` (raw property attr always literally `calibre:user_metadata`; the `calibre:` prefix maps to `https://calibre-ebook.com` but foliate's URL-resolution concatenates without `:` so match the RAW attr, not the resolved one). Calibre prefers OPF3 over OPF2 when both present (`read_user_metadata3 || read_user_metadata2`).
|
||||
- Value in `#value#` (array for multi-value), series index in `#extra#`; datetimes wrapped `{"__class__": "datetime.datetime", "__value__": "<ISO>"}`, unset date = `0101-01-01`; embedded files carry EVERY library column so empty values (null/''/[]/rating 0/undefined-date) must be dropped at parse time.
|
||||
|
||||
**Where things live:**
|
||||
- Parser: `getCalibreUserMetadata` in foliate-js `epub.js`, attached AFTER `tidy()` (tidy would collapse single-element value arrays) as `metadata.calibreColumns` `[{label, name, datatype, value, extra?}]`
|
||||
- Type: `CalibreCustomColumn` in `src/libs/document.ts`; `BookMetadata.calibreColumns`
|
||||
- Formatter: `formatCalibreColumnValue` in `src/utils/book.ts` (rating → ★ half-stars /2, series → `Name [idx]`, bool → ✓/✗, comments → strip tags, datetime → formatDate)
|
||||
- UI: extra grid cells in `BookDetailView.tsx` Metadata section after Identifier (column names are user content, NOT i18n keys)
|
||||
- Search: `getCalibreColumnsText` in `src/app/library/utils/libraryUtils.ts` `createBookFilter` (both regex and substring branches)
|
||||
|
||||
**Why safe:** metaHash dedupe uses only title/authors/identifiers; metadata editor spreads `{...metadata}` so the field survives edits; import assigns `loadedBook.metadata` as-is. Calibre plugin pushes already embed user metadata via calibre `set_metadata`, so plugin-pushed books get columns through the same OPF parse (the plugin's flat `customColumns` wire field is a DIFFERENT shape and stays unused). E2E-verified on the real sample (Elena Sabe, OPF3, 11 columns → 7 shown, search "CT1" filters). Related: [[calibre-plugin-push-4863]].
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: calibre-plugin-push-4863
|
||||
description: "readest-calibre-plugin (#4863) pushes calibre books+metadata to Readest cloud; key protocol facts (OAuth localhost relay, /sync explicit-null carry-over)"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 5d4d83a0-0aee-4200-852f-555df5243bed
|
||||
---
|
||||
|
||||
`apps/readest-calibre-plugin/` implements #4863: calibre GUI plugin pushing selected books + metadata into the Readest cloud, modeled on BookFusion's plugin. MERGED to main via PR #4918 (2026-07-04, merge 6b403d019); packaged in releases as `Readest-<version>.calibre-plugin.zip` by release.yml's `build-calibre-plugin` job.
|
||||
|
||||
Design decisions and hard-won protocol facts:
|
||||
- **Identity**: `Book.hash` = partial MD5 (KOReader algorithm; JS `1024 << -2` wraps to 0, so offsets are 0, 1024, 4096, ... 1024<<20). metaHash = `md5(NFC("title|authors,|ids,"))`, preferred id scheme uuid > calibre > isbn; Python impl verified byte-identical to `js-md5` output.
|
||||
- **OPF embedding + uuid dedup** (v2, per maintainer request): metadata IS embedded into a temp copy at upload (`calibre.ebooks.metadata.meta.set_metadata` — deterministic for EPUB, writes custom columns as `calibre:user_metadata`). Dedup keys: calibre uuid in row `metadata.identifier` (survives byte changes) + `metadata.calibreSourceHash` = raw library-file partialMD5 (change detection, no local state; v1 rows fall back to `book_hash` which equals the raw hash). File changed → replace flow: upload new blob, push new row (carry-over) + tombstone old in one /sync POST, best-effort delete old cloud files. Metadata-only edit → row update, no re-upload (embedded OPF goes stale until next file upload).
|
||||
- **POST /sync explicit-nulls absent fields** (transformBookToDB) — updates must carry over `uploadedAt`, `groupId/Name`, `progress`, `readingStatus*`, `coverHash` from the pulled server row (`wire.py::merge_for_push`); same lesson as koplugin syncbooks.lua.
|
||||
- **Upload key** `Readest/Books/{hash}/{hash}.{ext}`; app's `{title}.{ext}` downloads resolve via download.ts hash+extension fallback. cover.png stores *original* bytes (app never converts formats, bookService.ts:568), so calibre's cover.jpg bytes upload as-is; coverHash = partialMD5 of those bytes.
|
||||
- **OAuth from a non-app client works**: `{supabase}/auth/v1/authorize?provider=X&redirect_to=http://localhost:PORT` is whitelisted (readest-app's Flatpak/custom-OAuth production path uses it). Tokens arrive in the URL *fragment*; serve a page whose JS relays `location.hash` to `/callback?...` (tauri-plugin-oauth trick). Implemented in `oauth.py`.
|
||||
- Pure modules (`api.py`, `wire.py`, `oauth.py`) are calibre-free; `make test` runs 56 unittests; `make zip` builds; smoke-test inside calibre with `calibre-debug -c` after `from calibre.customize.ui import find_plugin` (initializes the `calibre_plugins` namespace).
|
||||
|
||||
- **Release packaging** (PR #4918): `build-calibre-plugin` job in release.yml mirrors the koplugin job; perl-stamps `PLUGIN_VERSION` from readest-app package.json, `make zip` → `Readest-<version>.calibre-plugin.zip` release asset. Committed version stays the (0, 1, 0) dev placeholder.
|
||||
- **Pushing workflow files**: gh's OAuth token lacks `workflow` scope (HTTPS push of .github/workflows/* rejected); SSH push works (transient hangs — retry with ConnectTimeout/ServerAliveInterval).
|
||||
|
||||
Related: [[koplugin-cover-upload]], [[grimmory-native-sync]], [[ci-pr-delivery-and-push]]
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: captured-turn-instant-highlight-scrolllock
|
||||
description: Captured slide/curl page turns ignored the instant-highlight still-hold gate; fixed by honoring renderer.scrollLocked like the push paginator
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 871c7b42-61c0-44e7-a1d6-8edb35d80300
|
||||
---
|
||||
|
||||
Instant Highlight's 300ms still-hold gate ([[instant-highlight-tap-paginate]])
|
||||
worked in **push** mode but NOT in **slide/curl** — a swipe after the hold turned
|
||||
the page (with the slide/curl effect) instead of extending the highlight.
|
||||
|
||||
**Root cause: two independent swipe paths.** foliate's native `#onTouchMove`
|
||||
(paginator.js) bows out at `if (this.hasAttribute('no-swipe')) return` (~2149),
|
||||
THEN checks `if (this.#scrollLocked) return` (~2162), THEN the `#layeredTurn` VT
|
||||
drag (~2179). So:
|
||||
- **push** (no turn-style, no no-swipe) → native swipe, honors `#scrollLocked`. ✅
|
||||
- **VT-layered slide** (`turn-style='slide'`, no no-swipe; engines with nested VT
|
||||
groups) → native swipe → layered turn, still AFTER the scrollLocked check. ✅
|
||||
- **captured curl (always) / captured slide (Tauri w/o full VT support)** →
|
||||
`applyPageTurnAttributes` sets `no-swipe`, so native swipe returns early and the
|
||||
APP-side captured-turn touch interceptor in `useCapturedTurn.ts` (priority 5,
|
||||
driven by `iframe-touchmove` → `dispatchTouchInterceptors`) is the swipe handler.
|
||||
It began a drag on any >15px horizontal move WITHOUT checking scrollLocked. ❌
|
||||
|
||||
`useTextSelector.startInstantAnnotating` sets `view.renderer.scrollLocked = true`
|
||||
when the hold engages. The captured interceptor is a parallel reimplementation of
|
||||
swipe-to-turn and must honor the same lock independently.
|
||||
|
||||
**Fix (app PR readest#5000 + foliate readest/foliate-js#51, tests:
|
||||
`useCapturedTurn-scrollLock.test.ts`):**
|
||||
1. foliate `paginator.js`: add `get scrollLocked()` — it was setter-only, so JS
|
||||
couldn't read it back (app `src/types/view.ts` already declared it a readable
|
||||
boolean). foliate PR #51 MERGED (squash → `ba57ec8` on foliate main); app
|
||||
#5000 bumps the submodule pointer to `ba57ec8` (mergeable, awaiting merge).
|
||||
2. `useCapturedTurn.ts` touch interceptor, `move` phase, before starting a drag
|
||||
(`!state` branch): `if (currentView.renderer.scrollLocked) return false;`.
|
||||
|
||||
**Why the `!state` branch is sufficient:** a captured drag needs >15px horizontal
|
||||
travel, but `maybeCancelInstantHoldOnMove` cancels the hold at >10px — so a drag
|
||||
can never already be in progress when instant annotation engages; no need to gate
|
||||
an in-flight drag. See [[page-turn-styles-viewtransitions-555]].
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
name: cloud-sync-provider-selection-plan
|
||||
description: "APPROVED /autoplan-reviewed plan making third-party sync (WebDAV/Drive) a first-class selectable provider; quota scoped to Readest Cloud (#4959/#4380)"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: c0549d91-7f40-46a8-b110-628964be195b
|
||||
---
|
||||
|
||||
Plan APPROVED 2026-07-06 after full /autoplan review (CEO+Design+Eng dual voices, 43 logged decisions). Plan file: `~/.claude/plans/research-on-https-github-com-readest-rea-velvet-meteor.md` (contains registries, UI state matrix, eng hardening, coverage diagram, 26 tasks). CEO doc: `~/.gstack/projects/unknown/ceo-plans/2026-07-06-cloud-sync-provider-selection.md`.
|
||||
|
||||
**Architecture:** policy layer over TWO engines (native DB-sync + FileSyncEngine) — Readest Cloud is NOT wrapped in FileSyncProvider (would regress server merges #4634/#4544/#4678). New `src/services/sync/cloudSyncProvider.ts`: pure `getCloudSyncProvider(settings)` derived from `webdav/googleDrive.enabled` (device-local) + separate `resolveCloudSyncGate(settings, plan)` w/ cached plan accessor (isCloudSyncAllowed needs async JWT — can't be settings-pure). Guard trips → PAUSED state + prompt, never silent readest fallback. Native gating = one branch in `syncCategories.isSyncCategoryEnabled` (book/progress/note); binary gating = `transferManager.queueUpload` returns null. Account channels (settings/stats/replicas/translations/Send) always native.
|
||||
|
||||
**Sequence (user-ruled at gate):** PR1 quota decouple (#4959 hotfix: gate + quota-403 no-retry + BATCH toast dedupe — spam is N-books×1-toast after retries, verified transferManager.ts:376/395) → PR1.5 file-engine parity (tags+readingStatus in mergeBookConfig/mergeBookMetadata+wire, BEFORE gating) → PR2 exclusive gating + mixed-fleet detection → PR3 chooser UI.
|
||||
|
||||
**Gate rulings:** UC3 = `syncBooks` AUTO-ENABLES on third-party selection (closes books-backed-up-nowhere hole; opt-out shows warning). UC1 = derived/device-local kept + read-only `/api/sync?since=providerSelectedAt&limit=1` probe → one-time "another device still syncs" banner + Sentry provider tag. UC2 = parity before gating. Switch-back = new-imports-only auto-upload (NO 675-book burst); metadata rows DO re-push (intended).
|
||||
|
||||
**PR1 IMPLEMENTED (2026-07-06):** commit `f6e5d7740` on branch `fix/cloud-sync-quota-decouple` (worktree `/Users/chrox/dev/readest-fix-cloud-sync-quota-decouple`), 22 files, LOCAL ONLY (not pushed, per confirm-before-push). Full suite 6900 pass + lint clean; new suites: `cloudSyncProvider.test.ts` (18), `transfer-manager-gating.test.ts` (19). i18n extraction deliberately SKIPPED in this PR (scanner pruned ~1350 live translations, e.g. "Read Aloud" — run the dedicated /i18n pass later; new strings fall back to English keys). Deviations from plan, all sound: paused toast centralized in `handleBookUpload` (both manual surfaces route through it); useTransferQueue default-param hazard fixed by the manager-level settings barrier instead of signature churn; migration passes the settings snapshot into `runMigrations(lastVersion, settings)` and mutates in place because `Settings.loadSettings` re-reads disk (subclass post-save would clobber an independent save). **SERIES FULLY MERGED (2026-07-07): #4971 (PR1 quota) + #4973 (PR1.5 parity) + #4975 (PR2 exclusive routing, closes #4380) + #4976 (PR3 chooser UI).** Worktrees removed, local branches deleted. **LIVE-VERIFY BUG FOUND+FIXED = #4981 OPEN** (`3a0af54dd`, fix/file-sync-auth-abort): expired Drive web token → engine swallowed AUTH_FAILED on index pull → remoteIndex=null read as FIRST SYNC → attempted 682-book re-upload march; latent hazard: null index skips the peers-tombstone union in the final re-push (#4860 class — transient pull failure could resurrect deletions). Fix: unreadable index (throw) aborts (404→null stays first-sync); terminal AUTH_FAILED latch stops runPool + skips index push + rethrows; web auto-sync preflights hasValidWebDriveToken. KEY ENGINE INVARIANT going forward: FileSyncError AUTH_FAILED is terminal — rethrow, never aggregate.
|
||||
|
||||
**i18n PASS = #4980 OPEN** (`237953cc2`, fix/cloud-sync-i18n, worktree `readest-fix-cloud-sync-i18n`): 22 strings x 33 locales + CLDR plural forms + en `_one`/`_other`, appended WITHOUT the scanner (removeUnusedKeys would prune live keys), additions-only diff. REMAINING: live verification checklist (real WebDAV 192.168.2.3:6065: exclusive e2e, syncBooks auto-enable on connect, fleet banner, switch-back no-burst, two-window switch), TODOS.md follow-ups (Sentry Rust tag, server quota error code, download-all-before-switch, library sync indicator, account chip, stats/viewSettings parity, Manage-Sync binary-gating mismatch). Note: GitHub reports 5 dependabot vulns on default branch (1 high) — pre-existing.
|
||||
|
||||
**PR3 contents:** activation moved to `src/services/sync/cloudSyncActivation.ts` (accepts 'readest'; component cloudSync.ts is a re-export shim); pure status matrix `cloudSyncStatus.ts` (getReadestCloudRowStatus/getThirdPartyRowStatus, fully tested — paused renders on the THIRD-PARTY row, not Readest row as plan sketch had it); Cloud Sync section (Readest-first radio rows, scope subtitle, role=radiogroup); Readest Cloud inline sub-page (Quota + NavigationRow to Account, never navigateToProfile from the row); premium branch keeps Readest row; capability Tips both directions in webdav/gdrive sub-pages; FileSyncForm Upload Book Files relabel; SyncCategoriesSection 'Managed by {{provider}}' description swap (toggles stay live).
|
||||
|
||||
**REMAINING (user/ops):** push 2 branch stacks + open PRs (PR1.5 independent; PR2/3 stacked on PR1); dedicated /i18n pass for ~20 new strings (extraction pruning hazard — run /i18n which handles it); live verification per plan (real WebDAV 192.168.2.3:6065: exclusive mode e2e, syncBooks auto-enable, fleet banner, switch-back no-burst); TODOS.md follow-ups (Sentry Rust tag, quota error code, etc.). Discard uncommitted TODOS.md duplicate in main checkout.
|
||||
|
||||
**PR2 IMPLEMENTED (2026-07-06):** commit `95fd33f0a` on `feat/cloud-sync-exclusive-gating`, STACKED on PR1 in the same worktree (`/Users/chrox/dev/readest-fix-cloud-sync-quota-decouple`), 27 files +869/-99, LOCAL ONLY. Full suite 6923 pass + lint clean. Contents: syncCategories provider gate (book/progress/note, runtime override, user toggles persist); `persistActiveCloudProvider` single write path (chooser + both connect/disconnect flows + gdrive OAuth callback which had bypassed broadcast); minimal switch-only broadcast (`{enabled, providerSelectedAt}` — never credentials/cursors); **found+fixed PR1 integration bug: buildWebDAVConnectSettings pre-set `enabled:true` so fresh-connect never triggered the syncBooks auto-flip — builder is now activation-agnostic**; fileSyncStore `lastError` + `fleetNoticeShown`; `runActiveFileLibrarySync()` shared runner (menu tap + pull-to-refresh + BackupWindow all route via pullLibrary's provider branch — fixes "undefined book(s) synced"); SettingsMenu "Synced via {{provider}}" + quota caption + Auto-Upload hidden (also command palette `action.autoUpload` filtered, BookItem badge, TransferQueuePanel Upload All); mixed-fleet read-only probe (`pullChanges(providerSelectedAt,'books',...,1)` in useBooksSync's throttled interval, once-per-session toast); `providerSelectedAt` in both provider types + backup blacklist. Sentry cloudSyncProvider tag DEFERRED to TODOS (tagging is Rust-mediated via set_webview_info pattern — needs src-tauri command).
|
||||
|
||||
**PR1.5 IMPLEMENTED (2026-07-06):** commit `f19fc6fa1` on `feat/file-sync-metadata-parity` (worktree `/Users/chrox/dev/readest-feat-file-sync-metadata-parity`, branched off origin/main independent of PR1), 4 files +253/-26, LOCAL ONLY. Full suite 6869 pass + lint clean. KEY FINDING: library.json already serializes FULL Book objects — tags/readingStatus were on the wire all along; the drop was `mergeBookMetadata`'s overlay (same gap as #4942 groups) + the reconcile predicate not firing on status-only changes. Fix: tags join the metadata LWW subset (raw assignment, removals propagate); readingStatus merges on its own `readingStatusUpdatedAt` clock (client mirror of #4634); new `shouldApplyRemoteBookMetadata` predicate (either clock) replaces `isRemoteBookMetadataNewer` in the engine reconcile filter (the old predicate stays exported). NO wire changes needed. PR2 stacks on PR1 (needs cloudSyncProvider.ts) — merge PR1 first or stack branches.
|
||||
|
||||
**Key traps found in review:** `BACKUP_SETTINGS_BLACKLIST` does NOT exclude enabled flags/webdav.deviceId (plan text was wrong; PR1 adds deviceId/lastSyncedAt to blacklist); settings broadcast must carry ONLY `{enabled}` (password would leak; routine lastSyncedAt writes could revert a switch via slice LWW); Drive OAuth callback writes via appService.saveSettings bypassing broadcast → centralize `activateCloudProvider()`; `useTransferQueue()` DEFAULT params (`libraryLoaded=true`) in SettingsMenu/TransferQueuePanel are the real unguarded init path (barrier = `settings.version`); cancelled needs structured `cancelReason` + queue schemaVersion (`retryAllFailed` resurrects cancelled rows today; failed-includes-cancelled copy-pasted in 5 places); fileSyncStore is process-local — durable lastSyncedAt lives in provider settings.
|
||||
|
||||
See [[webdav-filesync-refactor-plan]] · [[gdrive-provider-multipr-status]].
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: dict-popup-tts-speak-4876
|
||||
description: "Dictionary popup speaker button pronounces the headword via Edge TTS (#4876), with a standalone pronouncer that bypasses TTSController"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 98d0ef1c-84c2-4a16-85a0-0abad0010923
|
||||
---
|
||||
|
||||
Issue #4876: add a "speak" button to the dictionary popup so a looked-up word
|
||||
can be pronounced. Implemented on branch `feat/dict-popup-tts` (commit
|
||||
f2acafb4b, 2026-07-06). Button-only (no auto-speak); speaker icon sits inline
|
||||
left of the headword in the shared `DictionaryResultsHeader`, so it covers both
|
||||
the desktop `DictionaryPopup` and mobile `DictionarySheet`.
|
||||
|
||||
Key file: `src/services/tts/wordPronouncer.ts` — a standalone single-word
|
||||
pronouncer, deliberately independent of the reader's `TTSController`:
|
||||
- **Speak ASAP**: never calls `EdgeTTSClient.init()` (which wastes a round trip
|
||||
synthesizing "test"). Calls `EdgeSpeechTTS.createAudioData()` directly; its
|
||||
static LRU MP3 cache makes repeat words instant.
|
||||
- **Dedicated Web Audio context** (`new WebAudioPlayer(() => new AudioContext())`,
|
||||
NOT the module-shared context the reader uses) so pronouncing a word can never
|
||||
resume/suspend or overlap an active read-aloud session. One extra AudioContext,
|
||||
fine under WebKit's ~4 cap.
|
||||
- **Gesture warmup**: `warmWordAudio()` must be called synchronously in the click
|
||||
handler (the hook's `speakWord` does this) because `pronounceWord` resumes the
|
||||
context only after a network await, outside WebKit's autoplay gesture window.
|
||||
- **Engine order**: Edge wss -> Edge https proxy (`fetchWithAuth`, throws "Not
|
||||
authenticated" when logged out) -> platform fallback. Fallback reuses the
|
||||
existing `WebSpeechClient` (desktop/web) / `NativeTTSClient` (mobile app)
|
||||
standalone via `genSSMLRaw(word)` + `setPrimaryLang(lang)`; the SSML default
|
||||
`xml:lang="en"` is overridden by `parseSSMLMarks(ssml, primaryLang)`.
|
||||
- `requestToken` guards staleness so a superseded in-flight synth bails.
|
||||
|
||||
Hook: `useDictionaryResults` gained `isSpeaking` + `speakWord`; cancels on word
|
||||
change / unmount. Voice pick = `TTSUtils.getPreferredVoice('edge-tts', lang)`
|
||||
then first `isSameLang` match then `en-US-AriaNeural`.
|
||||
|
||||
Tests: `src/__tests__/services/tts/wordPronouncer.test.ts` (Edge-first / fallback
|
||||
contract; jsdom has no AudioContext so `getPlayer()` returns null unless
|
||||
`globalThis.AudioContext` is stubbed + `WebAudioPlayer` mocked). Speak-button
|
||||
wiring test added to `DictionarySheet.test.tsx` (mocks the pronouncer module).
|
||||
|
||||
NOT verified live: real audio playback + iOS gesture warmup (not unit-testable).
|
||||
Related: [[edge-tts-webaudio-engine]] (the WebAudio refactor that replaced the old
|
||||
blob-URL `createAudio` with `createAudioData`), [[ios-instant-dict-double-popup]].
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
name: edge-tts-webaudio-engine
|
||||
description: "Edge TTS Web Audio refactor (#3851/#2033) — gapless engine, WSOLA rate, section timeline + scrubber; branch feat/edge-tts-webaudio; release gates and design invariants"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 97e57af9-5961-4c92-a63e-4582178bf798
|
||||
---
|
||||
|
||||
Branch `feat/edge-tts-webaudio` (worktree `/Users/chrox/dev/readest-feat-edge-tts-webaudio`, built 2026-07-04, NOT pushed) replaces Edge TTS per-sentence `<audio>` playback with a Web Audio pipeline: fetch MP3 at rate 1.0 (unchanged LRU + new in-flight dedup in `edgeTTS.ts`) → decode → `pcm.ts` silence trim → `timeStretch.ts` in-house WSOLA (pitch-preserved client rate, cache never refetches on rate change) → `WebAudioPlayer.ts` gapless scheduling. `SectionTimeline.ts` (measured > per-voice cps EMA in localStorage `readest-tts-voice-cps` > script defaults) powers a TTSPanel scrubber + media-session position/seekto. foliate-js fork branch `feat/tts-get-sentences` adds `getSentences` — fork PR must merge BEFORE the readest PR (submodule pin).
|
||||
|
||||
**Why:** #3851 first-word clipping cause is a HYPOTHESIS (Android reporter reproduced with BT off); treat as falsifiable experiment. #2033 gaps = element restarts + ~300ms Edge trailing silence.
|
||||
|
||||
**Load-bearing invariants (don't regress):**
|
||||
- AudioContext is a module-level singleton, never closed — a fresh TTSController per tts-speak calls `stop()` not `shutdown()`, and WebKit caps ~4 live contexts (leak = permanent silence).
|
||||
- Marks dispatch at AUDIBLE time (player chunk-start via onended, background-safe), never at fetch — else foliate's `#lastMark` runs ahead and prev/next/resume break.
|
||||
- `endSession` fires session-end synchronously when nothing is unfinished — zero-chunk sessions (Edge outage) must not wedge controls in "playing".
|
||||
- `ensureSharedAudioContext()` is called in the tts-speak gesture path BEFORE any await (WebKit autoplay window); `unblockAudio` silent element runs on ALL platforms (desktop Chromium media keys need a playing HTMLMediaElement).
|
||||
- `abortSession` never suspends the context (warm output stream IS the #3851 fix); only user pause suspends.
|
||||
- Word boundaries stay in original untrimmed media time; `getChunkPosition()` returns trim-relative clamped seconds; timeline sums TRIMMED durations.
|
||||
- Inter-sentence CLICKS/POPS = the silence trim (`findSpeechBounds`) cuts at an amplitude threshold (0.005), NOT a zero crossing, so each buffer edge is a non-zero sample; the source steps to/from silence → click. NOT WSOLA (no-op at rate 1.0, cross-fades internal splices). Fix (commit a8643ec12, branch fix/android-bg-tts-media-session): `applyEdgeFade` in `pcm.ts` ramps ~3ms at both ends of the buffer's OWN copy (`buffer.getChannelData(0)` after `createMonoBuffer`) — never the `trimmed` subarray view (rate 1.0 aliases the decoded buffer). Trim + gap kept. Removing the trim instead would work (WSOLA DOES scale silence, so gaps stay rate-scaled) but doubles each gap to Edge's tail+lead silence.
|
||||
- `POPUP_HEIGHT` in TTSControl.tsx is fixed and non-scrolling — grows to 200 only when a timeline-capable client is active.
|
||||
|
||||
**Follow-up decided (2026-07-04, not yet planned): background TTS decoupling.** App-level TTSSessionManager owns the controller; reader hook becomes attach/detach. Matrix chrox chose: close book = keep playing (headless via `section.createDocument()`); reopen SAME book = seamless reattach (adopt session + `redispatchPosition()` + CFI re-anchoring — the highlighter already re-anchors ranges through CFIs, so cross-doc ranges are safe; swap text supply to rendered doc lazily at next section boundary); open a DIFFERENT book = TTS STOPS (not "keeps playing while browsing"); explicit stop / sleep timer = stops. Fiddly bit: `getCFI` without a rendered view. Recorded in branch TODOS.md.
|
||||
|
||||
**How to apply:** Release gates before closing the issues (in plan Verification): WSOLA A/B listening test 0.2x-3x EN+CJK, Linux WebKitGTK decode (GStreamer), reporter-hardware beta (Soundcore Q20i iOS / Galaxy S22U screen-off), iOS lock-screen + interruption QA, e-ink `[data-eink] .range` fill check (NO eink range rule exists in globals.css), RTL slider direction. Plan + 35-decision audit trail: worktree `.agents/plans/2026-07-03-edge-tts-webaudio.md` (gitignored, local). i18n keys added ('This chapter', 'Chapter progress', 'Failed to seek', '{{elapsed}} of {{total}}') need the /i18n pass. Deferred follow-ups in TODOS.md incl. provider-agnostic local-TTS hedge ([[grimmory-native-sync]] unrelated).
|
||||
@@ -0,0 +1,30 @@
|
||||
# EPUB review editor migration
|
||||
|
||||
Date: 2026-07-08
|
||||
|
||||
This fork includes a desktop migration of the Chinese/Japanese EPUB review editor into Readest.
|
||||
|
||||
Current shape:
|
||||
- Bundled sidecar lives at `apps/readest-app/tools/epub-review-editor`.
|
||||
- Readest route is `/review-editor`.
|
||||
- Library menu entry is `Settings Menu -> Advanced Settings -> EPUB 审校器`.
|
||||
- Dev launcher API is `POST /api/review-editor/launch`.
|
||||
- Desktop launcher command is `launch_epub_review_editor`.
|
||||
- Dev script is `pnpm epub-reviewer:dev`.
|
||||
- Default runtime data is `apps/readest-app/epub_review_sessions/`; it is ignored by git. Override with `READEST_REVIEW_ROOT`.
|
||||
- The automatic launcher now works in Tauri desktop through the Rust command and keeps local `dev-web` as a fallback.
|
||||
- `/review-editor` is the desktop feature-block page for both 校对 and 翻译. It now uses native React blocks as the main work surface and calls the local sidecar APIs directly.
|
||||
- Readest EPUB bookshelf context menus can open the reviewer in 校对 or 翻译 mode. The native file path is handed to the Tauri command, which creates/reuses a sidecar session and returns `sessionId`; the Readest page should use `session_id`, not keep `epub_path` in the URL.
|
||||
- The old `static/index.html` UI remains bundled only as standalone/debug fallback. Do not treat an iframe of the old UI as the desktop migration acceptance path.
|
||||
|
||||
Important boundary:
|
||||
- This is not a full native rewrite yet. The migrated tool still uses the proven Flask backend from the previous long-term translation project.
|
||||
- The production desktop path still depends on local Python/venv/pip as a temporary sidecar runtime. Next step should package a controlled runtime or convert the hot APIs to native Rust/Tauri commands.
|
||||
- Do not remove existing review-editor behavior while migrating: bookshelf, upload, bilingual review, glossary editing, GPT retranslate, full-book AI translation, soft delete, duplicate translation layer prevention, ruby preservation.
|
||||
- If `/review-editor` shows `ERR_BLOCKED_BY_RESPONSE`, check both sides of cross-origin isolation: the Readest route keeps COEP `require-corp`, and the sidecar response should include local `frame-ancestors`, `Cross-Origin-Embedder-Policy: require-corp`, and `Cross-Origin-Resource-Policy: cross-origin`.
|
||||
- If React blocks cannot fetch the sidecar, check restricted CORS in `server.py`; allowed origins are local Readest dev and Tauri origins only.
|
||||
|
||||
Next recommended steps:
|
||||
1. Package the Python sidecar/runtime or replace it with native Tauri commands so desktop users do not need a system Python installation.
|
||||
2. Add a launch token / origin guard for the loopback sidecar API before wider distribution.
|
||||
3. Gradually port long-tail review-editor surfaces into React: glossary editing, full bookshelf classification UI, richer chapter navigation, and reading-position restore.
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: fxl-portrait-autospread-offcenter-4984
|
||||
description: PDF/FXL auto-spread in portrait rendered the lone page off-center and made taps turn pages
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: f24a5890-de13-4767-bb33-97621f332e44
|
||||
---
|
||||
|
||||
Issue #4984: in fixed-layout (PDF) `spread='auto'` + portrait viewport, the page
|
||||
was shoved into one half of the screen ("weirdly separate") and almost every tap
|
||||
turned the page instead of opening the menu.
|
||||
|
||||
Root cause (verified in Chrome): `FixedLayout.#render` in
|
||||
`packages/foliate-js/fixed-layout.js` already hides the non-target page in
|
||||
portrait (`if (portrait && frame !== target) display:none`) and scales the shown
|
||||
page as a single page, BUT it kept the spread-centering one-sided inline margin —
|
||||
left page `marginInlineStart:auto`, right page `marginInlineEnd:auto`. With no
|
||||
partner page to meet at the spine, that auto margin stranded the lone page in one
|
||||
half of the viewport whenever it was narrower than the viewport (any zoom < 100%,
|
||||
e.g. the issue's 50% zoom; or a page whose fit-scaled width < viewport width).
|
||||
The off-center page then sat over a page-turn tap zone (tap zones are
|
||||
view-relative: center 0.375-0.625 = menu, else turn — see `usePagination.ts`), so
|
||||
taps turned the page. Symptom 2 was a consequence of symptom 1.
|
||||
|
||||
Fix MERGED (readest PR#4992 + foliate-js PR#50 squash -> foliate main f6dced2, readest submodule bumped to it): added pure `computeSpreadInlineMargins(portrait)`; in portrait
|
||||
both inline margins are `auto` (centered), in landscape one-sided (pages meet at
|
||||
spine). It sets BOTH margins explicitly (opposite side cleared to '') because
|
||||
frames are re-styled in place on rotation (ResizeObserver -> `#render`, no
|
||||
`#respread`), so a stale `auto` would otherwise linger. NOT fixed by forcing
|
||||
`spread='none'` in portrait — that duplicates the existing portrait-single-page
|
||||
path, needs app-layer orientation swapping + `#respread` (cache clear + re-nav),
|
||||
and overrides the user's chosen setting.
|
||||
|
||||
Test: `src/__tests__/document/fixed-layout-portrait-single-page.test.ts`. Related:
|
||||
[[fxl-spread-spine-seam-4857]] shares this render branch;
|
||||
[[pdf-text-selection-fontscale-4480]].
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
name: gdrive-fullwalk-every-sync-no-source-cursor
|
||||
description: Google Drive file sync re-probes all 646 books every run (focus/Sync Now) because uploadedHashes never records no-source books; plus supabase focus events re-fire pullLibrary
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 894e0d6d-ce01-402b-8f2d-0f0670986a88
|
||||
---
|
||||
|
||||
Diagnosed 2026-07-07 (web dev, valid Drive session). "Uploading N / 646" on every tab refocus and every Sync Now = full per-book Drive probe sweep (`files?q=name='<title>.epub' and '<hashdir>' in parents`, ~1 req/book), no actual byte re-upload.
|
||||
|
||||
Two compounding causes:
|
||||
|
||||
1. **File cursor never records books absent from this device.** #4856's `uploadedHashes` in library.json is only added on `uploaded` or `remote-matches` (needs local bytes for size compare) in `FileSyncEngine.syncLibrary` push loop (engine.ts ~line 806-815). On web, non-downloaded books → `loadBookFile` null → `no-source` → NOT recorded even though the HEAD probe already proved the remote file exists. So `needsFilePush` stays true for all 646 forever → O(library) every run. Toggle test: Upload Book Files off → 15 reqs (config cursor `isLocalNewer` works); on → 646.
|
||||
Fix v1 (record remote-present no-source books, commit 900af1df1 on dev) proved INSUFFICIENT: Drive API inspection showed 654/690 hash dirs hold only cover.png+config.json, NO book file (only 36 files ever uploaded) — so there was nothing to record and the probe storm persisted.
|
||||
Fix v2 (the real fix, on dev 2026-07-07, initially uncommitted): reorder `pushBookFile` to resolve the LOCAL source before any remote probe (`probeRemoteHead` closure, lazy); `no-source` now costs zero requests and the `remoteExists` plumbing from v1 was removed again. Test: 'spends no remote request on a no-source book' in engine-sync-paths.test.ts. The 654 books stay in booksToPush (progress counter still shows them) but the sweep is network-free. Their files land on Drive only when a device that HAS the bytes (desktop) syncs with Upload Book Files on; that device records the hashes and everyone skips thereafter.
|
||||
Worktree was discarded per user; work continues directly on the bare repo dev branch (dev server localhost:3000 runs from there).
|
||||
|
||||
Round 5 (dev, uncommitted): Tauri plugin:fs|exists storm (5726 IPC/sync) killed by making the LIBRARY ROW the ground truth for local file presence in `needsFilePush`: gate `hasLocalFile(b) = !!(b.downloadedAt || b.filePath)` (import/download/delete all stamp downloadedAt; mergeBookMetadata keeps it device-local, verified) + session-scoped `noSourceVerdicts` WeakMap (provider-keyed, updatedAt-keyed) that suppresses re-probes of DRIFTED rows (row claims file, fs disagrees). Per user decision: NO automatic row-correction — Full Sync is the single split-brain healer (bypasses gate + memo + uploadedHashes and audits the real fs). Incremental sync with clean state = zero local and zero remote per-book probes. Harness in engine-sync-paths.test.ts: row-gate test, drifted-row memo tests, fullSync bypass; #4856 fixtures stamped downloadedAt.
|
||||
|
||||
Round 4 (dev, uncommitted): per-book cloud buttons (Book Details + bookshelf + open-non-local-book) route to the selected provider instead of the gated Readest Cloud queue ("Uploads to Readest Cloud are paused..." toast). `FileSyncEngine.downloadBookFile` (hash-dir listing resolves filename; stream on Tauri, buffered on web; cover+config best-effort) + `runActiveFileBookUpload/Download` in runLibrarySync.ts (stamps downloadedAt; caller persists via updateBook + toasts, existing transferMessages i18n keys). Reader hint parity same day: `remoteProgressApplied` in useFileSync dispatches 'Reading Progress Synced' hint on applied remote position. NOT done: provider path has no transfer-queue/progress UI; uploadedAt not stamped (means Readest-Cloud backup; provider uploaded-state could later key off index uploadedHashes).
|
||||
|
||||
Round 2 optimizations (dev, uncommitted as of 2026-07-07 03:10): provider memoized per connection key in `createFileSyncProvider` (warm Drive idCache across reader hook / library auto-sync / Sync Now; `resetFileSyncProviderCache()` called on Drive connect/disconnect); `writeBinary` PATCHes cached id without files.list lookup (404 evict+fallback); dev-only request diagnostics `[gdrive] op ...` / `[gdrive] #n ...` in GoogleDriveProvider.
|
||||
Remaining per-run budget after round 2 (no-change run ~11 req, ~550 kB): index GET 269 kB + index PATCH 269 kB every run; books/ listing 40 kB; ~8 file-less orphan hash dirs (in neither index nor library) re-listed by discovery every run.
|
||||
Round 3 (dev, uncommitted, all TDD in engine-sync-paths.test.ts): (1) etag short-circuit — `remoteIndexCache` WeakMap keyed on the memoized provider in engine.ts; head(library.json) etag (Drive md5/WebDAV ETag) vs cached → reuse structuredClone'd index, skip GET + ENTIRE discovery scan (peer changes always rewrite library.json; legacy no-index uploads still found on session-first run + fullSync); cache dropped after own push. (2) no-op push skip — `indexDirty` check (syncedHashes/failures/uploadedHashes-set/emptyDirs-set/any local row absent-or-newer-or-tombstone-mismatched vs remote index); skipping also keeps peers' etags stable (a restamped copy would defeat fleet-wide change detection). (3) `emptyDirs` optional index field (wire.ts) — file-less candidate dirs recorded once, skipped by discovery unless uploadedHashes says the file arrived or fullSync; pruned only against a listing that ran. Idle run = 1 stat request; local-change run = stat + config pull/push + index PATCH (no GET, no discovery). engine-deletion-sync 'preserves remote tombstone' test updated to force a dirty run.
|
||||
|
||||
2. **Every tab focus re-runs the library file sync.** supabase-js emits SIGNED_IN/TOKEN_REFRESHED on visibilitychange; `AuthContext.syncSession` does `setUser(newObject)` each time → `pullLibrary` (deps include `user`) recreated → `useBooksSync` effect `[user, useSyncInited, libraryLoaded, pullLibrary]` refires → `runActiveFileLibrarySync` (third-party provider path). Fix would be: key on `user?.id` / latch the initial pull. User decided 2026-07-07 to LEAVE THIS AS IS ("sync on focus is fine now that runs are O(changed)") — only cause 1 was fixed.
|
||||
|
||||
Related: #4981 fixed the adjacent expired-token variant (aborting instead of marching with remoteIndex=null). Web Drive token is sessionStorage-scoped (tab-local, no refresh). See [[cloud-sync-provider-selection-plan]], [[webdav-filesync-refactor-plan]].
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: ios-share-txt-stuck-supportstext
|
||||
description: iOS sharing a .txt to Readest hung the share sheet; Share Extension NSExtensionActivationSupportsText captured plain-text files
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 445ce295-90f6-4ed2-8227-e25b1e0a876d
|
||||
---
|
||||
|
||||
Sharing a `.txt` file to Readest via the iOS share sheet got **stuck**, while EPUB/PDF worked. Root cause: the **Share Extension** (article-URL clipper, added #4256/#4267) wrongly activated for `.txt`. FIXED, **PR #4917 merged** (`fix/ios-share-txt-stuck`).
|
||||
|
||||
- `ShareViewController.swift` only ever extracts an `http(s)` URL. Its activation rule (`project.yml`) had `NSExtensionActivationSupportsWebURLWithMaxCount: 1` **and `NSExtensionActivationSupportsText: true`**.
|
||||
- A `.txt` is UTI `public.plain-text`, which **conforms to `public.text`** → satisfies `SupportsText` → the URL-only clipper activates for a file it can't handle → sheet hangs (for a file-backed provider `loadItem(public.plain-text)` returns a file `URL`, so `loadText`'s `as? String`/`as? Data` both fail → no URL → neither completes nor cleanly cancels).
|
||||
- EPUB (`org.idpf.epub-container`) / PDF (`com.adobe.pdf`) conform to neither text nor web-URL, so they never match the extension and take the **main app** `CFBundleDocumentTypes` "Copy to Readest" open-in-place path (`Readest_iOS/Info.plist`), which imports via `useOpenWithBooks.ts` → `importBook` (format-agnostic; txt→epub via `TxtToEpubConverter`). `.txt` is ALSO declared there, so it imports fine once the extension stops stealing it.
|
||||
|
||||
**Fix (option A):** remove `NSExtensionActivationSupportsText: true`; keep web-URL only. Safari/Chrome "share page" still sends `public.url`, so article clipping is preserved. Only regression: sharing a raw text *selection* containing a link no longer triggers the extension (minor).
|
||||
|
||||
**Source-of-truth gotcha:** `src-tauri/gen/apple/project.yml` is the **xcodegen** source; Tauri's iOS CLI runs `xcodegen` at build time (`tauri-cli/src/mobile/ios/project.rs`) and REGENERATES each target's `Info.plist` from it. The committed `ShareExtension/Info.plist` is a generated artifact marked **`skip-worktree`** (`git ls-files -v` → `S`) — local edits to it are invisible to git and it stays stale at HEAD. So: fix `project.yml` ONLY; a test asserting on the committed plist would pass locally but FAIL on a fresh CI checkout. Regression test lives at `src/__tests__/ios/share-extension-activation-rule.test.ts` (asserts on `project.yml`, strips `#` comments first since the warning comment names the key). Test precedent: `src/__tests__/android/*declarations*.test.ts` read native config via `resolve(process.cwd(), 'src-tauri/...')`.
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: ios-widget-cover-bright-edge-line
|
||||
description: iOS reading widget cover sometimes had a bright hairline at the right edge from fractional resize; round target to whole pixels
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: fc6acdd3-a3d1-4823-a5c4-7fe75686fc93
|
||||
---
|
||||
|
||||
iOS reading-widget book covers sometimes showed a **bright hairline along the right edge** (Android widget never did). Fixed in PR #4950, `src-tauri/plugins/tauri-plugin-native-bridge/ios/Sources/ReadingWidgetWriter.swift` `writeThumbnail`.
|
||||
|
||||
**Root cause:** the downsample target was fractional:
|
||||
`CGSize(width: image.size.width * scale, height: image.size.height * scale)` with `scale = 240 / longEdge`. For portrait covers the height (longEdge) lands on a whole pixel but the width is fractional. `UIGraphicsImageRenderer` allocates a **whole-pixel** buffer (rounds the size up), while `image.draw(in:)` fills only the exact fractional rect — so when the fractional width rounds *up*, the rightmost pixel column is only partially covered → **semi-transparent** (e.g. alpha 225 instead of 255). `jpegData` has no alpha, so that column flattens to a visible bright line. Intermittent ("sometimes") because it only bites when the fractional part rounds up; portrait-specific because width is the fractional edge.
|
||||
|
||||
**Fix:** round both dimensions to whole pixels so draw-rect == pixel-buffer and every edge pixel is fully covered:
|
||||
`CGSize(width: (image.size.width * scale).rounded(), height: (image.size.height * scale).rounded())`.
|
||||
|
||||
Verified with a faithful CoreGraphics repro (same rasterization as UIKit): `453x680` cover gave edge alpha `225` before, `255` after; all sizes `255` after. Android ([[mobile-reading-widgets]] `ReadingWidgetStore.kt`) is immune because it scales to a fixed integer 240x360 and center-crops.
|
||||
|
||||
No checked-in Swift test: the plugin `Package.swift` has no wired test target and the code is UIKit-only.
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
name: koplugin-library-open-mosaic-cache-4954
|
||||
description: koplugin Library slow open on large libraries — group-cover mosaics recomposed every paint; fixed by availability-keyed cache + async compose
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 7e7dbb83-cffb-495d-9778-bf94ccb45d8b
|
||||
---
|
||||
|
||||
Issue #4954 (PR #4974, MERGED 2026-07-07): opening the KOReader plugin Library
|
||||
was slow on large libraries (~1000 books) while navigation stayed fast.
|
||||
|
||||
**Root cause (measured, not guessed).** Added open-path timing instrumentation
|
||||
(`ui/time` + `elapsed_ms` helper) to `library/librarywidget.lua` (initial
|
||||
`build_item_table`, `lightScan`, post-scan refresh, total synchronous open,
|
||||
cloud-sync elapsed) and a step breakdown in `library/localscanner.lua`. On a
|
||||
685-book library the synchronous open was ~300ms, dominated by a **254ms
|
||||
post-scan refresh** = `library/group_covers.lua` recomposing each folder's 2x2
|
||||
cover **mosaic from scratch on every paint** (up to 4 MuPDF decodes+scales per
|
||||
cell), with no cache, and again on the post-sync refresh. `build_item_table`
|
||||
(7ms) and `lightScan` (28ms, only 16 sidecar reads) were NOT the bottleneck —
|
||||
my initial hypotheses (defer lightScan / incremental history) were refuted by
|
||||
the log. Why "slow to load, fast to navigate": the root Groups view is mosaics;
|
||||
drilling into a group shows single covers (cheap, BIM-cached). Soft-scales with
|
||||
size (fuller groups → 4 covers/mosaic vs 1). Data-side pagination is NOT
|
||||
possible (KOReader `Menu` derives page count from `#item_table`).
|
||||
|
||||
**Fix (mirror `cloud_covers` async pattern in `group_covers`).**
|
||||
- Cache composed master bb per group, keyed by `mosaic_cache_key` = ordered
|
||||
child hashes + a per-child **cover-availability bit** (`child_cover_available`
|
||||
→ `cloud_covers.cover_exists(hash)` or local file stat). Serve `copy_bb` on
|
||||
hit. The availability bit fixes the historical "partial composite served
|
||||
forever" bug that killed the prior on-disk cache: a late cover flips the key
|
||||
and recomposes once.
|
||||
- **Cache the `nil` result too** (critical): a coverless group whose children
|
||||
aren't downloaded makes `compose` return nil; if not cached it re-enqueues +
|
||||
`schedule_refresh` on every refresh → infinite recompose/refresh loop (eink
|
||||
flashing). Caught this in the second emulator log (`group_nameLanguagegrid`
|
||||
missing every refresh). Cache nil under the availability key → placeholder
|
||||
served, no re-enqueue.
|
||||
- Compose off first-paint: miss enqueues a single-slot background job (one
|
||||
mosaic per UI `nextTick`, `_pump_scheduled` coalesces), returns nil so the
|
||||
cell paints its FakeCover placeholder; completions coalesce into one refresh.
|
||||
- `clear_cache()` on Library close (via `libraryitem.set_visible_hashes(nil)`)
|
||||
frees masters (~0.7MB each).
|
||||
|
||||
Result: synchronous open 300ms→151ms, post-scan refresh 254ms→89ms (now just the
|
||||
4 visible single cloud-book cover decodes + placeholders, mosaics deferred).
|
||||
|
||||
**Left out (follow-ups noted in PR):** single cloud-book covers
|
||||
(`cloud_covers.load_cover_bb`) still re-decode from disk each refresh (~89ms/4)
|
||||
— same copy-on-serve cache could apply; deferred cloud sync uses synchronous
|
||||
HTTP that briefly freezes UI after the menu appears (elapsed 1.6-6.8s, network
|
||||
variance). Instrumentation kept intentionally (Library open is infrequent).
|
||||
See [[koplugin-stats-duplicate-book-rows-4861]], [[koplugin-library-stale-synced-cursor-4934]].
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: koplugin-library-stale-synced-cursor-4934
|
||||
description: "#4934 koplugin Library goes stale forever: pull cursor keyed on client updated_at not server synced_at; split pull/push cursors + v2->v3 heal migration"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
---
|
||||
|
||||
**Issue #4934, PR #4944 MERGED** (merge commit `0b180da6a`, koplugin Lua only, base `readest/readest:main`). Reporter: iOS + KOReader; the koplugin "Readest library" stopped receiving iOS updates and never recovered. Workaround was delete `koreader/settings/readest_library.sqlite3` + "Pull books now" (works for a while, re-breaks). **iOS/web library unaffected** — the smoking gun.
|
||||
|
||||
**Root cause (the direct follow-up [[sync-synced-at-cursor-4678]] predicted).** Since #4678 the server keys the books GET on the server-stamped `synced_at` (`src/pages/api/sync.ts` `cursorColumn = table==='books' ? 'synced_at' : 'updated_at'`, `.gt('synced_at', since)`). Web/iOS advance their cursor from `synced_at` (`useSync.ts computeMaxTimestamp`, prefers synced_at) → always ≤ server-now → never stale. The **koplugin was left on `updated_at`**: `syncbooks.lua pullBooks` set `last_books_pulled_at = max(updated_at, deleted_at)` of returned rows; `parseSyncRow` never read `synced_at`. `updated_at` is CLIENT event time, and the koplugin stamps it from the **device clock** (`librarystore.lua touchBook` = `os.time()*1000`). An e-reader clock ahead of the server (common; dead RTC / wrong date) — or ANY single row account-wide carrying a future `updated_at` — drove the koplugin's global cursor past server-now, so `synced_at > since` returned nothing **forever**. Delete-sqlite reset the cursor to 0 (workaround); it re-broke once a book-open re-bumped it into the future.
|
||||
|
||||
**Extra hazard #4678 flagged:** `last_books_pulled_at` was SHARED between the pull cursor (vs server synced_at) and push-delta detection (`getChangedBooks` vs LOCAL updated_at) — can't just retarget it to synced_at. So the fix requires a cursor SPLIT.
|
||||
|
||||
**Fix (all in `apps/readest.koplugin/library/`):**
|
||||
1. `librarystore.lua parseSyncRow`: add transient `synced_at = iso_to_ms(dbRow.synced_at)` (NOT a books column; server sends it via `select('*')`). New `getLastPushedAt`/`setLastPushedAt` on key `last_books_pushed_at`.
|
||||
2. `syncbooks.lua`: new pure `row_pull_cursor(parsed)` = `parsed.synced_at` if present else `max(updated_at, deleted_at)` (mirrors computeMaxTimestamp; exported `M._row_pull_cursor` for tests). `pullBooks` seeds `pull_ts`/`push_ts` from their stored values (no regression on empty pages), advances `last_books_pulled_at` from `row_pull_cursor` (synced_at) and `last_books_pushed_at` from `max(updated_at, deleted_at)` of pulled rows. `pushChangedBooks` reads/writes `getLastPushedAt`/`setLastPushedAt` instead of the pull cursor.
|
||||
3. **Cursor split:** pull cursor = server `synced_at` (pull only); push watermark = local `updated_at`, advanced on BOTH pull and push (preserves the old dedup so pulled books aren't re-pushed — the old shared cursor did exactly this).
|
||||
4. **Heal migration `SCHEMA_VERSION 2->3`** (`M.new`, guard `prev>=1 and prev<3`): `INSERT last_books_pushed_at SELECT value FROM ... WHERE key='last_books_pulled_at'` then `UPDATE ... SET value='0' WHERE key='last_books_pulled_at'`. Seeds push watermark from the old shared value (no re-push storm) and zeroes the pull cursor → next sync does ONE full re-pull that re-establishes it on synced_at. **Auto-heals already-stale installs; user need not delete the sqlite.**
|
||||
|
||||
**Scope note (intentional):** the push watermark, seeded from a poisoned future value, still suppresses the koplugin's OWN local pushes until wall-clock passes it — but that's UNCHANGED from before (old shared cursor did the same) and #4934 is a pull/viewing bug ("iOS unaffected"). Not fixing device-clock `updated_at` here. Only functional cursor callers are in syncbooks; `librarywidget.lua:557` only logs it.
|
||||
|
||||
**Tests (TDD, gates `pnpm test:lua` 224✓ / `pnpm lint:lua` exit 0):** `librarystore_spec.lua` — parseSyncRow synced_at, getLast/setLastPushedAt independent round-trip, `v2->v3 migration` (reset pull=0 + seed push, per-user), bumped user_version 2→3 (and the v1->v2 test now lands at 3, migrations cumulative). `syncbooks_spec.lua` — `_row_pull_cursor` (synced_at wins over a future updated_at; fallback; 0), and `pullBooks` integration via injected fake `sync_auth`/client + real in-memory store asserting pull cursor=synced_at (not future updated_at) and push watermark=updated_at distinctly.
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
name: middle-click-autoscroll-4951
|
||||
description: "Middle-click autoscroll in scrolled mode (#4951): Autoscroller RAF core + armed-books registry in iframeEventHandlers; scrolls via renderer.containerPosition"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: d8d21fc2-b63b-4f65-8ca8-f65d9e6b17b2
|
||||
---
|
||||
|
||||
Middle mouse button autoscroll for desktop Tauri apps in scrolled mode
|
||||
(readest#4951), PR #4955 MERGED 2026-07-06 (merge 6f3b401c2). No settings
|
||||
toggle: always on for desktop in scrolled mode (maintainer removed the toggle
|
||||
as unnecessary; middle click has no other use in the reader). The same PR also
|
||||
shipped a locale sync: 69 keys untranslated on main filled across 33 locales
|
||||
(agents per language family; scanner-prunable keys preserved).
|
||||
|
||||
Key structure:
|
||||
- `src/app/reader/utils/autoscroller.ts` — pure `Autoscroller` class (RAF loop,
|
||||
12px dead zone, 10 px/s per px linear velocity capped 4000, whole-pixel
|
||||
emission with fractional carry, held→sticky/drag state machine). Tested in
|
||||
`src/__tests__/reader/utils/autoscroller.test.ts` with injected raf/now.
|
||||
- `useMiddleClickAutoscroll(bookKey, viewRef, containerRef)` hook consumes
|
||||
`iframe-mousedown/mouseup/mousemove/wheel/keydown` messages + window-level
|
||||
capture listeners; returns anchor (container-relative) for
|
||||
`AutoscrollIndicator`. Scrolls with `renderer.containerPosition += delta`
|
||||
(public setter; native scroll path, so section preloading works). Axis from
|
||||
`renderer.scrollProp` ('scrollLeft' = vertical writing → x axis; increasing
|
||||
scrollLeft always moves viewport right even in RTL, no special-casing).
|
||||
- iframeEventHandlers runs in the parent realm: `setAutoscrollArmed(bookKey)`
|
||||
registry lets `handleMousedown` preventDefault middle button (suppresses
|
||||
WebView2's native autoscroll on Windows, avoids double-drive) and
|
||||
`handleAuxclick` swallow link opens; `setAutoscrollTracking(bool)` gates an
|
||||
`iframe-mousemove` postMessage forwarder so it costs nothing when idle.
|
||||
- Pointer deltas use screenX/Y (same trick as useTouchEvent pinch) so iframe
|
||||
coordinate spaces/transforms don't matter. Anchor window position computed in
|
||||
the iframe handler via `event.view.frameElement.getBoundingClientRect()` +
|
||||
client-size scale, posted as windowX/windowY on button-1 mousedown only.
|
||||
- A left click that ends a sticky session must not also turn the page: the
|
||||
hook consumes the later `iframe-single-click` via
|
||||
`eventDispatcher.onSync` within a 500ms window (usePagination checks
|
||||
dispatchSync consumption before paginating).
|
||||
- Setting `middleClickAutoscroll` in `BookLayout` (default TRUE, user chose
|
||||
default-on), toggle in ControlPanel Scroll BoxedList, desktop only
|
||||
(`appService?.isDesktopApp`), disabled unless scrolled mode. Web excluded on
|
||||
purpose (browsers own middle click).
|
||||
|
||||
Related: [[i18n-extract-prunes-keys]] (followed its manual single-key insertion
|
||||
recipe for the 'Middle-Click Autoscroll' label across 33 locales).
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: opds-autodownload-subdir-crawl-4272
|
||||
description: OPDS auto-download
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 92b00cca-93fe-4255-bb5f-1db8d3421a35
|
||||
---
|
||||
|
||||
Issue #4272: OPDS auto-download on copyparty missed books in subdirectories (and skipped folders containing only subfolders). Copyparty (`?opds` on any directory) emits subfolders as `rel="subsection"` nav entries (`type="application/atom+xml;profile=opds-catalog"`), files as acquisition entries with `?dl` hrefs, no pagination, no "by newest" feed (template: `copyparty/web/opds.xml`).
|
||||
|
||||
**Fix (PR #4948, MERGED 2026-07-06):** in `src/services/opds/feedChecker.ts`, `checkFeedForNewItems` now branches: catalogs WITH a "by newest" feed keep the old behavior (newest feed + rel=next only, never crawl — whole-library subscription hazard); catalogs WITHOUT one are directory-style and get a breadth-first `crawlFeeds` over `getSubsectionURLs` (skips facet/self/up/start/top/search rels and non-catalog types), bounded by `MAX_CRAWL_DEPTH=5`, `MAX_FEEDS_PER_CRAWL=50` (incl. root fetch), and the `visited` set. rel=next pagination still capped at `MAX_PAGES_PER_FEED` per chain. Collected entryIds are added to the local knownIds copy so a book listed by two crawled feeds is collected once (NOT persisted — failed downloads must stay retryable). Tests: `src/__tests__/services/opds-feed-crawl.test.ts` (mocked `fetchWithAuth` serving URL→XML fixtures).
|
||||
|
||||
**Unresolved iOS half of #4272:** reporter saw "33 downloads failed" on iPhone while macOS downloaded all base-dir books fine. Same TS/Rust download path both platforms (`download_file` in `src-tauri/src/transfer_file.rs`); most plausible cause is iOS suspending the app mid-sync and killing in-flight reqwest connections (35 epubs at DOWNLOAD_CONCURRENCY=3 takes minutes). Retry/backoff (MAX_RETRY_ATTEMPTS=3) picks them up on later launches, but after 3 failures entries are moved to knownEntryIds and permanently skipped with no recovery UI — a repeatedly-interrupted catalog silently loses books. Possible future work: iOS beginBackgroundTask around the sync, or don't hard-cap retries for network-type errors.
|
||||
|
||||
See [[opds-groups-carousel-4750]] · [[download-file-scope-android-regression]].
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: opds-autodownload-tls-skipssl-4988
|
||||
description: "#4988 OPDS auto-download failed on self-signed/private-CA servers — native download_file (rustls) needs skipSslVerification like the manual path (#2900)"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 9066b80b-3cb5-44df-9c4b-7f609cf285a5
|
||||
---
|
||||
|
||||
Issue #4988: OPDS auto-download failed while manual browse/download of the same catalog worked (reporter: iPad + Calibre-Web NextGen behind nginx https). Reporter blamed the credential-less HEAD probes — red herring: those are `probeAuth` challenge probes, their 401 is by design and the Basic header still reaches the GET.
|
||||
|
||||
**Real signature:** feed GETs and HEAD probes appear in the server log, download GETs never do → the native `download_file` dies client-side in the TLS handshake. The Tauri http-plugin path (`opdsReq.ts`) always passes `danger: {acceptInvalidCerts: true}`, but `transfer_file.rs` builds its reqwest client with **rustls**, which ignores the OS trust store — self-signed, private-CA, or incomplete-chain certs all fail unless `skip_ssl_verification` is set. Manual download (`page.tsx handleDownload`) got `skipSslVerification: true` in #2900 (for #2871); `autoDownload.ts downloadAndImport` never did.
|
||||
|
||||
**Fix (2026-07-08, PR #5002):** pass `skipSslVerification: true` in autoDownload's `downloadFile` call. Test in `opds-auto-download.test.ts`.
|
||||
|
||||
**How to apply:** any new code path that downloads via native `download_file`/`tauriDownload` from a user-configured server must mirror the manual path's `skipSslVerification` — TLS behavior differs between the http plugin (danger flags on) and transfer_file (strict rustls by default), so "browse works but download fails, nothing in server logs" = check this first. "curl works without -k" on another machine proves nothing about rustls trust.
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: opds-preemptive-basic-digest-400
|
||||
description: "Calibre digest/'auto' servers 400 the preemptive Basic header from PR #4206; fetchWithAuth must bare-retry on 400 to surface the Digest challenge"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 9066b80b-3cb5-44df-9c4b-7f609cf285a5
|
||||
---
|
||||
|
||||
Calibre's content server in `digest` (or `auto` over http) auth mode responds to a `Basic` Authorization header with **400 "Unsupported authentication method"** — not a 401 challenge. PR #4206 (commit 83607d14e) made `fetchWithAuth` (`src/app/opds/utils/opdsReq.ts`) send Basic preemptively (for Calibre-Web-style servers that return anonymous 200 without a challenge), which dead-ended all digest-mode Calibre servers: the retry logic only fired on 401/403, so users saw "Failed to load OPDS feed: 400 Bad Request" (reported on Android, but platform-independent — web proxy relays the 400 too).
|
||||
|
||||
**Fix (2026-07-08, PR #5002):** in `fetchWithAuth`, when the first response is 400 AND preemptive Basic was sent, re-issue the request once *without* credentials to surface `WWW-Authenticate`, then let the existing 401/403 negotiation pick Digest. Direct path strips the Authorization header; proxy path strips the `auth=` query param. Tests in `src/__tests__/utils/opds-req.test.ts`.
|
||||
|
||||
**Why:** the two auth-server archetypes conflict — anonymous-200 servers need preemptive creds (#4206), strict digest servers reject them with 400. Only runtime negotiation satisfies both; don't "fix" one archetype by regressing the other.
|
||||
|
||||
**How to apply:** any preemptive-auth optimization needs a recovery path for servers that reject the scheme outright (400/4xx without challenge), not just for 401/403 challenges. The app's Digest implementation itself is correct (Calibre's strict parser answers 401, not 400, to its headers). Verify against a real Calibre: dummy creds distinguish malformed (400) from wrong-password (401). Beware: Calibre throttles repeated failed logins with transient 503s. Related: [[security-advisories-web-2026-06]] (the *other* OPDS 400 — dev-LAN SSRF block in the proxy).
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: page-turn-styles-viewtransitions-555
|
||||
description: "#555 slide/curl page-turn styles via View Transitions — snapshot layering, shadow-DOM name scoping, margin clip, scrubbed drag tracking"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 91cbce94-0703-478d-9671-b12629fd8d9f
|
||||
---
|
||||
|
||||
Issue #555 (Apple Books/Kindle turn animations): implemented `pageTurnStyle` view setting (Push/Slide/Curl). **MERGED 2026-07-05**: app PR readest#4940 → main `75f1fafe9` (11 commits, includes the Xcode-26.2 swift-rs build fix) + foliate fork readest/foliate-js#48. Mesh curl verified live on macOS/iOS/Android; Windows/Linux capture backends still open (CSS-curl fallback). Worktree removed post-merge (`pnpm worktree:rm feat/page-turn-styles-555` — takes BRANCH name not path; plain `git worktree remove` refuses trees with submodules); phase-2 plan preserved at main checkout `apps/readest-app/.claude/plans/page-curl-mesh-tauri-555.md`.
|
||||
|
||||
**Phase 2 (true mesh curl on Tauri, 2026-07-04):** plan at worktree `apps/readest-app/.claude/plans/page-curl-mesh-tauri-555.md` (plans dir is gitignored). Done + committed: WebGL curl renderer `src/utils/pageCurl.ts` (000814a51) and native-bridge `capture_webview_region` for macOS/iOS (85e592fd1). Renderer gotchas: WebGL canvas needs `preserveDrawingBuffer:true` or readPixels silently returns zeros after any await (browser composited); the clip-space Y flip mirrors triangle winding so `frontFace(CW)` or gl_FrontFacing (front vs whitened back) inverts; corner-grab fold tilt must decay `(1-p)`; travel = `w + PI*r_end`; **WebKit ignores `UNPACK_FLIP_Y_WEBGL` for ImageBitmap uploads** — curl was upside down on iOS (back read as 180°-rotated instead of Apple-Books horizontal mirror); fix = upload unflipped + `vUv = aPos` (f9a49fd4c); test textures MUST be vertically asymmetric to catch flips, and running the vitest browser suite on Playwright WebKit (`instances: [{ browser: 'webkit' }]` temporarily in vitest.browser.config.mts) reproduces iOS WebGL behavior. Capture: binary `ipc::Response` PNG; macOS legacy objc msg_send WKWebView takeSnapshot in plugin `src/platform/macos.rs`, iOS Swift + base64 across JSON plugin boundary. Orchestration committed: `CapturedPageTurn` (`src/app/reader/utils/capturedTurn.ts`, renamed from MeshCurlTurn/meshCurl.ts in 5ba62ef07, host-callback DI, browser-tested) runs capture→overlay→instant-nav→animate with a per-turn style ('curl' WebGL mesh | 'slide' flat canvas); turns the FULL gridcell (header/footer/margins ride the sheet, per Apple Books video + user request 7e300a7bd) — NOTE this diverges from the VT slide/curl which clips furniture static; instant nav = drop `animated` attr (ALL paginator animated paths incl. VT gate on it); backward = mirrored old-page-recedes (rendererRtl = forward?rtl:!rtl); `useCapturedTurn` (renamed from useMeshPageCurl) wraps view.prev/next + touch interceptor (priority 5, ruler=10 swipe-flip=0), drag progress from deltaX/gridWidth, cancel un-curls then navs BACK under the flat overlay; `applyPageTurnAttributes` = single source for turn-style/no-swipe (FoliateViewer open + ControlPanel pageTurnStyle/animated/disableSwipe effects); session `captureBroken` flag → paginator turn-style where VT is fully supported, push elsewhere. Android capture done (PixelCopy in NativeBridgePlugin.kt: CSS px × density + getLocationInWindow; kotlin compile check = `gen/android ./gradlew :tauri-plugin-native-bridge:compileFossDebugKotlin`). **Android perf gotcha (user-verified fixed)**: full-density PNG encode = ~1.5s/turn on Xiaomi 13 (3x, 1080×2400) → curl read as broken; fix = JPEG q85 + dest bitmap capped at 2× CSS px (PixelCopy scales into smaller dest for free) → invoke 1550ms→34ms, overlay mounts 132ms after tap; JS must NOT hardcode blob type 'image/png' (decoder sniffs). iOS same optimization (3e7f58135): `jpegData(0.85)` off-main + `WKSnapshotConfiguration.snapshotWidth = width*2/scale` when scale>2 (snapshotWidth is in POINTS; image px = points×scale); macOS stays PNG. CDP verify lane: `pnpm dev-android` + helpers in `src/__tests__/android/helpers/` (forwardWebViewDevtools + CdpPage.evaluate; `window.__TAURI_INTERNALS__.invoke('plugin:native-bridge|capture_webview_region',{payload})` times raw capture; `document.querySelector('foliate-view').next()` triggers the wrapped turn; `Page.captureScreenshot` for mid-turn frames). Remaining: Windows/Linux capture; LIVE curl visuals still unverified (macOS smoke test reached reader, push path fine; interrupted — user was at the machine). Live-run gotchas: dev binary exits instantly if production Readest runs (single-instance, same bundle id — quit prod first); computer-use MCP can't see/screenshot the bare target/debug binary — drive with bash `screencapture` + JXA CGEvent clicks (AppleScript AX `click at` fires the Book-Details action, not reader open). Shared `target/` symlink gotcha: deleted worktrees leave stale plugin build-script caches ("failed to read plugin permissions" from dead paths) — `cargo clean -p <plugin>...`.
|
||||
|
||||
**Curl final (curved corner fold):** radial-gradient mask on the OLD pseudo — transparent disc grows from the outer-bottom corner (forward) / spine-side corner (backward), fold edge = curved arc like a lifted page corner. The fold animates a GRADIENT STOP via registered `@property --foliate-fold` (re-rasterizes mask per frame). **VT pseudo paint quirks (computed style LIES — always verify with screenshots via vitest browser `page.screenshot`):** width animations compute but don't repaint; `mask-position`/`mask-size` animations paint at wrong scale/not at all; masks apply ONLY to the static old snapshot, NOT the live new layer (backward turns must choreograph old receding, not new unfolding); UA sets `mix-blend-mode: plus-lighter` on old/new (force `normal`); back both layers with `--foliate-vt-bg` (from doc `--theme-bg-color`, textured themes have transparent page bg per #4399); paint uses LINEAR progress ignoring easing (cosmetic). `filter`/`clip-path` order: filter runs BEFORE clip/mask → drop-shadows get cut with the page. **VT skips (`ready` rejects InvalidStateError) when `document.hidden`** — Chrome-MCP automation tab is usually hidden; verify in vitest browser (visible) with frozen animations + screenshots. **Header/footer in both layers:** app marks the boundary with `data-view-transition-root` on the gridcell; paginator prefers `closest('[data-view-transition-root]')` from the outermost shadow host. **True mesh bend on web: impossible** (no DOM pixel access); plan = WebGL curl shader + Tauri native webview capture (WKWebView takeSnapshot / PixelCopy / CapturePreview) as a follow-up; web keeps the arc fold.
|
||||
|
||||
**iOS 18 VT crash + gating (2026-07-06, 5ba62ef07):** iOS 18.7 WKWebView HAS `document.startViewTransition` but the VT slide CRASHES the WebContent process (Sandbox `process-info-codesignature` deny then WebContent gone; Android WebView 147 fine) — API presence is NOT a safe gate. App-side gate `supportsViewTransitionTurns()` (in `useCapturedTurn.ts`) = startViewTransition + `CSS.supports('view-transition-group', 'nearest')` (nested VT groups: Chrome/Edge/WebView 140+ ONLY; Safari ≤27 and Firefox lack it per caniuse — so ALL WebKit and Gecko engines get no VT turns). `applyPageTurnAttributes` only sets `turn-style` when the gate passes, so synced slide/curl settings degrade safely. Fallback on Tauri: `getCapturedTurnStyle()` routes slide → the capture pipeline with `PageSlideRenderer` (`src/utils/pageSlide.ts`, 2D canvas, translateX toward spine = `(rtl?1:-1)*progress*width` with the shared rendererRtl mirror; overlay gets `overflow:hidden` clip + box-shadow edge like the VT slide; backward = old-slides-out-mirrored since only the OUTGOING page can be captured — the overlay div sits above the live iframe so a second capture would include it). Web without full VT: push only; ControlPanel hides Slide/Page Curl (`turnStyleOptions` = push + layered when `supportsViewTransitionTurns() || isTauriAppPlatform()`) and coerces an unsupported synced value to display as Push. Tests: `useCapturedTurn.test.ts` (jsdom, stub CSS.supports + startViewTransition; `vi.stubEnv('NEXT_PUBLIC_APP_PLATFORM','tauri')` toggles isTauriAppPlatform) + slide cases in `captured-turn.browser.test.ts` (read canvas transform via `new DOMMatrixReadOnly(getComputedStyle(c).transform).e`).
|
||||
|
||||
**Mechanism:** slide/curl need old+new page as separate layers — impossible in the rigid multicol strip (see [[vertical-rl-horizontal-pagination-624]]). The View Transitions API rasterizes the outgoing page (annotations included) and animates the snapshot over the live, stationary incoming page. Axis-agnostic: works for vertical-rl too. `turn-style` attribute on the renderer; falls back to push/two-phase when `document.startViewTransition` is missing (old WebKitGTK/iOS<18).
|
||||
|
||||
**Hard-won gotchas:**
|
||||
- **Shadow-DOM tree scoping:** `view-transition-name` on elements inside shadow roots creates NO capture group (Chrome 149) — the name must go on the outermost shadow host in the DOCUMENT tree (walk `getRootNode() instanceof ShadowRoot → .host`). In Readest that's the `foliate-view` element.
|
||||
- **Header/footer stay static** (user requirement): app header/footer (SectionInfo/ProgressBar) are siblings positioned over the margins; the host snapshot covers margins too and slides over them. Fix: clip `::view-transition-group(foliate-turn)` with `--foliate-vt-clip: inset(margins)` (margins read from `--_margin-*` on #top) so margins stay owned by the static root snapshot.
|
||||
- **Landing race:** a neighbor view load mid-transition re-anchors to the stale pre-turn anchor; re-assert `containerPosition = offset` after `transition.finished` (push's cssAnimateScroll does the same at its end).
|
||||
- **Finger tracking = scrubbed VT:** start the transition at drag threshold (direction from net dx), `await ready`, `updateTiming({easing:'linear'})` + `pause()` all `(foliate-turn)` pseudo animations, drive `currentTime = progress × duration` from the finger. Release: `play()` to commit; cancel = `reverse()`, restore `containerPosition` in the anims-finished microtask (before next paint — avoids flashing the target page), then `skipTransition()`.
|
||||
- **getComputedStyle on VT pseudos lies:** it reports rule-matched styles even with no active transition — test with `document.getAnimations()` filtered by `effect.pseudoElement` instead; a layer styled `animation: none` has no entry (proves it's stationary).
|
||||
- Choreography via classes on documentElement (`foliate-vt-{slide,curl} -{forward,backward} -{left,right}`) + one injected document-head stylesheet (pseudo tree lives on :root, not the shadow root). Old-on-top needs `z-index: 1` (new is on top by default). Curl = perspective rotateY fold (flat snapshot can't mesh-bend); side class = spine side = rtl?right:left.
|
||||
|
||||
Tests: `paginator-turn-styles.browser.test.ts` (slide layering old-moves/new-still, curl, vertical-rl, drag tracking commit + revert, push fallback via deleting startViewTransition).
|
||||
@@ -21,6 +21,8 @@ The iframe is interactive (`pointer-events:auto`) only during a 150ms idle windo
|
||||
|
||||
**Reproduction / test technique (jsdom can't — needs real layout + real wheel):**
|
||||
- Standalone Playwright proof: scroll container + `scrolling="no"` srcdoc iframe + the buggy handler, `page.mouse.wheel(0,120)` over the iframe → scrollTop 240 vs 120 over margin; remove `scrollBy` → 120 == 120. (real `mouse.wheel` triggers native chaining; synthetic dispatch does NOT.)
|
||||
- Committed regression test `src/__tests__/document/fixed-layout-scroll-wheel.browser.test.ts` (browser lane, `pnpm test:browser`): mounts the REAL `<foliate-fxl>` in scrolled mode (minimal fake book: `rendition.viewport`, sections whose `load()` returns `{ src:'srcdoc', data: tallHtml }` — `src` must be truthy or `#createScrollFrame` returns blank; `data` → srcdoc keeps iframe same-origin so contentDocument is reachable), dispatches a **synthetic** `WheelEvent` on the page iframe doc, asserts `renderer.scrollTop` stays 0 (synthetic wheel doesn't chain natively, so any movement is the JS handler = must be 0). Fails `120` against the bug, passes `0` fixed.
|
||||
- Committed regression test `src/__tests__/document/fixed-layout-scroll-wheel.browser.test.ts` (browser lane, `pnpm test:browser`): mounts the REAL `<foliate-fxl>` in scrolled mode (minimal fake book: `rendition.viewport`, sections whose `load()` returns `{ src:'srcdoc', data: tallHtml }` — `src` must be truthy or `#createScrollFrame` returns blank; `data` → srcdoc keeps iframe same-origin so contentDocument is reachable), dispatches a **synthetic** `WheelEvent` on the page iframe doc (synthetic wheel doesn't chain natively, so any movement is the JS handler = must be 0). Fails `120` against the bug, passes fixed.
|
||||
|
||||
**CI flake + hardening (2026-07-07):** original assertion set `scrollTop=0`, dispatched, `await setTimeout(60)`, then `expect(scrollTop).toBe(0)` — flaked on slow CI runners with **`expected 4 to be +0`**. Root cause: as sibling scroll pages finish loading, `#loadScrollPage` runs `#restoreScrollModeAnchor` **asynchronously**, which at scrollTop=0/index-0 (fraction 0) snaps `scrollTop` to page 0's `offsetTop` = the **4px `--scroll-page-gap`** margin. The 60ms post-dispatch delay raced that re-anchoring → observed 4. NOT the bug (bug = 120px). **Fix:** the buggy `scrollBy({behavior:'instant'})` is *synchronous* (lands before `dispatchEvent()` returns), so measure `before=scrollTop` / dispatch / `after=scrollTop` with **NO await between** and assert `after===before`. Synchronous read isolates the handler's own effect; immune to the async anchor-restore. Verified: reintroducing the buggy scrollBy → `before=4, after=124` (delta 120, still caught); reverted → stable across repeated runs.
|
||||
|
||||
Fix lives in the `packages/foliate-js` submodule (separate repo/commit). Relates to [[fixed-layout-paginated-scroll-reset-4683]], [[webtoon-mode-3647]].
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: pdf-text-selection-fontscale-4480
|
||||
description: PDF text selection/highlight misplaced (into margins, offset down) when OS font-size accessibility scaling is on
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
|
||||
**Issue #4480**: on some Android devices PDF text selection/highlight is misplaced — the blue selection rectangles bleed into the blank page margins and sit ~1/3 line too low. Reported on a Galaxy Tab A8; NOT reproducible on a Galaxy S21.
|
||||
|
||||
**Root cause (NOT what it looked like):** it is the **OS accessibility "font size" setting** (Android Settings > Display > Font size, `settings put system font_scale 1.3`), not the WebView version or devicePixelRatio. The OS font scale multiplies every piece of WebView-rendered *text* — including the transparent pdf.js text layer used for selection/highlight — but leaves the *canvas* page bitmap untouched. So the text-layer spans end up `fontScale`x larger than the glyphs baked into the canvas, and the native `::selection` boxes (which follow the span boxes) overshoot the text horizontally and vertically. The Tab A8 (a tablet) had enlarged system fonts; the S21 did not.
|
||||
|
||||
**Ruled out during investigation:** WebView version (Tab A8 was on WebView **148**, newer than the working S21's 147 and a WebView-124 emulator — all fine at default font scale); devicePixelRatio (the paginator's fit-width `zoom` keeps `--total-scale-factor` DPR-invariant); interactive-vs-programmatic selection (both fine). Font-metric/realm mismatch was a red herring: main-app-doc and iframe-doc `measureText` are identical on working devices.
|
||||
|
||||
**Fix** (`packages/foliate-js/pdf.js`, `render()`): detect the OS font scale with a probe (`offsetHeight` of a `100px`/`line-height:1` box = `100 * fontScale`, unaffected by DPR or the `<html>` `scale(1/dpr)` transform). The OS scales only the glyph **size** (a `font-size`); text-layer **positions** are percentages of the `--total-scale-factor`-sized container and are NOT scaled. So divide the scale out of the glyph-size lever ONLY: after `textLayer.render()`, set the container's `--text-scale-factor = calc(var(--total-scale-factor) * var(--min-font-size) / fontScale)` (that var feeds `font-size` and nothing else — grep the vendored `text_layer_builder.css` to confirm). At font_scale 1.0 the probe returns 1.0 → override skipped, no regression. PDF-only; EPUB is unaffected because its text and overlay scale together.
|
||||
|
||||
**Do NOT divide `--total-scale-factor`** (the obvious-but-wrong first fix, PR #49 rev 1): it scales positions AND size, so `scale/F` shrinks the whole text layer toward the top-left origin — glyphs correct-ish size but positions compressed, offset accumulating downward. Verified by measurement: changing `--total-scale-factor` ×1.5 moves a span's top/left AND w/h all ×1.5. This looks "fixed" for the selection highlight (no more margin bleed) but the text layer no longer overlays the canvas; diagnose by coloring `.textLayer span { color: red }` and screenshotting the red-over-canvas overlay.
|
||||
|
||||
**Repro/verify harness (reusable):** the release APK's WebView is CDP-debuggable. `adb forward tcp:PORT localabstract:webview_devtools_remote_$(pidof com.bilingify.readest)`, then drive `Runtime.evaluate` over the page WebSocket. The PDF renders in an iframe nested inside foliate-view's shadow DOM — deep-traverse `shadowRoot` + `iframe.contentDocument` to reach `.textLayer`. Create a multi-line selection with `doc.getSelection().addRange()` + `adb exec-out screencap` to see the native highlight. Set `settings put system font_scale 1.3` to reproduce. See [[android-cdp-e2e-lane]].
|
||||
|
||||
Related PDF text-layer notes: [[pdf-spread-canvas-seam-4587]] (the `--total-scale-factor` / canvas-size line this fix touches), [[overlayer-splitrange-textnodes]].
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: pinch-vs-twofinger-scroll-4858
|
||||
description: "Fixed-layout pinch-zoom too sensitive on touchscreen laptops (#4858); distinguish two-finger scroll (same direction) from pinch (opposite) via pending state + deadzone in useIframeEvents.useTouchEvent"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: ca71550d-0c81-44d1-b990-3892dc514d77
|
||||
---
|
||||
|
||||
Issue #4858: on 2-in-1 touchscreen laptops (Surface) reading PDFs webtoon-style, a two-finger **scroll** accidentally triggered zoom. User wanted NO zoom-lock option — just make pinch less sensitive and distinguish same-direction (scroll) from opposite-direction (pinch).
|
||||
|
||||
**Where:** `src/app/reader/hooks/useIframeEvents.ts` `useTouchEvent`. Pinch only engages for `getBookData(bookKey)?.isFixedLayout` (PDF / fixed-layout EPUB). Touch events are forwarded from the foliate iframe as `iframe-touch{start,move,end}` postMessages (passive listeners, no preventDefault, so native two-finger scroll happens regardless — the old bug was that we ALSO zoomed).
|
||||
|
||||
**Old bug:** `onTouchStart` set `isPinchingRef=true` immediately on any two-finger touch and `onTouchMove` applied `ratio=currentDist/initialDist` from the very first move. Real human scroll isn't perfectly parallel, so finger separation drifts → ratio ≠ 1 → accidental zoom; `onTouchEnd` committed `round(initialZoom*lastRatio)`.
|
||||
|
||||
**Fix — pending state + magnitude discriminator + deadzone:**
|
||||
- `onTouchStart` (two fingers, fixed layout): enter `pinchPendingRef=true` (NOT `isPinchingRef`), stash both initial touches (`initialTouch0/1Ref`), `initialPinchDist`, `initialZoom`.
|
||||
- `onTouchMove` while pending: compute `separationDelta=|currentDist-initialDist|` and `panDist` = magnitude of the **midpoint travel** `((Δt0+Δt1)/2)`. Pinch keeps midpoint still while separation changes; scroll moves midpoint while separation barely shifts. Decide: pinch if `separationDelta >= PINCH_ACTIVATION_THRESHOLD(24) && separationDelta > panDist`; scroll (bail, native scroll takes over) if `panDist >= TWO_FINGER_PAN_THRESHOLD(12) && panDist >= separationDelta`; else keep waiting. This magnitude compare IS the "opposite vs same direction" test (more robust than a raw dot-product sign).
|
||||
- On pinch confirm: re-baseline `initialPinchDist = currentDist` so zoom starts at 1x from the activation point — the deadzone travel is absorbed, no snap/jump.
|
||||
- `onTouchEnd`: guard is now `isPinchingRef || pinchPendingRef`; only commit the `pinch-zoom` dispatch when `wasPinching` (a pending-only or scroll-resolved gesture leaves zoom untouched).
|
||||
|
||||
Thresholds bias toward scroll (pan needs only 12px, pinch needs 24px separation) = "less sensitive". Uses `screenX/screenY` (not client) because `pinchZoom` CSS-transforms the iframe parent and oscillates client coords. Tests: `src/__tests__/hooks/useTouchEvent.test.tsx` (same-direction scroll → no zoom; opposite → zoom; jitter < deadzone → no zoom). Related: [[scrolled-pdf-pinch-zoom-4817]] (foliate `pinchZoom`/`pinchEnd` live scale + commit), [[image-zoom-trackpad-flicker-4742]] (macOS trackpad pinch = ctrl+wheel, different path via `useMouseEvent`).
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: s3-r2-sync-provider
|
||||
description: "S3/R2 file-sync provider (third backend after WebDAV/GDrive) — full vertical slice on dev, uncommitted; aws4fetch SigV4, path-style, generic S3-compatible"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 894e0d6d-ce01-402b-8f2d-0f0670986a88
|
||||
---
|
||||
|
||||
Built 2026-07-07 (approved design in `.agents/plans/2026-07-07-s3-provider-design.md`), full vertical slice on the bare-repo dev branch, UNCOMMITTED alongside the day's gdrive optimization work.
|
||||
|
||||
- **Transport** `src/services/sync/providers/s3/S3Provider.ts`: SigV4 via `aws4fetch` (was already a dep, server-side `utils/r2.ts` uses it; zero new deps). Path-style `<endpoint>/<bucket>/<key>`; keys map 1:1 from logical paths. GET/HEAD/PUT; ListObjectsV2 XML via DOMParser with delimiter + continuation-token draining; ensureDir no-op; deleteDir = list prefix + per-key DELETE (DeleteObjects needs Content-MD5, WebCrypto has none). head etag = md5 → engine's index change-detection works. Tauri streaming via presigned `signQuery` URLs → tauriUpload/Download. Injected fetch (web fetch / tauri plugin-http) + injected sleep; Drive-style error map + backoff. Passes `runSemanticContract` + 10 transport tests (stageAbsent dispatches by request shape: 404 for objects, empty-200 for listings).
|
||||
- **Settings** `S3Settings` (endpoint/region='auto'/bucket/accessKeyId/secretAccessKey + shared sub-toggles) in types/settings.ts + DEFAULT_S3_SETTINGS in constants.ts; slice `settings.s3`.
|
||||
- **Derivation/activation**: FileSyncBackendKind gains 's3'; getCloudSyncProvider order webdav > gdrive > s3; withActiveCloudProvider keeps 3 slices exclusive (+syncBooks/providerSelectedAt stamp); CloudSyncProviderFlags in settingsSync.ts gained optional s3 slice (multi-window switch protection, #4580 class).
|
||||
- **Shared helpers** added to cloudSyncProvider.ts and swept everywhere: `settingsKeyForBackend(kind)` (5 sites) and `cloudProviderDisplayName(kind)` (4 sites) replaced scattered gdrive ternaries.
|
||||
- **UI**: `S3Form.tsx` (WebDAVForm pattern; Connect probes `list('/Readest')` — 403=auth, 404=bucket, empty-200=ok); IntegrationsPanel: 's3' SubPage + chooser CloudProviderRow (RiDatabase2Line, "S3-Compatible Storage") + deep-link `requestedSubPage === 's3'`; Tips include R2 endpoint format + web CORS requirement.
|
||||
- **i18n**: 14 new keys translated into all 33 locales (462 entries).
|
||||
- Everything else (engine, FileSyncForm, fileSyncStore, fleet probe, per-book upload/download routing, reader hint) was already backend-generic and needed zero changes.
|
||||
|
||||
NOT done: R2 account-ID preset, multipart upload, virtual-host addressing, remote-browser pane for S3. Live verification against a real R2 bucket pending (user tests on localhost:3000).
|
||||
@@ -21,6 +21,8 @@ After both merge: comment on each GHSA noting the fixing PR (pending merge). Not
|
||||
|
||||
**C — Tauri native (PR #4639)** GHSA-55vr-pvq5-6fmg: unscoped `download_file`/`upload_file` in `src-tauri/src/transfer_file.rs` → arbitrary local read/write. FIXED: added `app: AppHandle` param + `ensure_path_allowed` (rejects relative + `..` via `has_disallowed_components`, then `fs_scope().is_allowed()`). Chose STRICT `is_allowed` (NOT read_dir's `|| contains("Readest")` substring hatch) because all legit callers (cloud sync, WebDAV, self-updater APK→`'Cache'`, OPDS→`'Cache'`) resolve under static scope ($APPDATA/Readest, $APPCACHE, $TEMP) OR persisted dialog grants (custom root via `setCustomRootDir`→picker→`allow_paths_in_scopes`; external folders re-granted at startup; `tauri_plugin_persisted_scope` makes sticky). Clippy needed `#[allow(clippy::too_many_arguments)]` on download_file (8 args). AppHandle auto-injected → JS invoke unchanged. NOTE: shared `target/` (worktree) was polluted with a deleted sibling worktree's abs plugin-permission paths → build failed `failed to read .../readest-feat-nightly-update-channel/.../fs/permissions/app.toml`; fix = `rm -rf` the `target/debug/build/<pkg>-<hash>` dirs grepping for the stale path, then rebuild. skip_ssl_verification left as-is (OPDS needs it). read_dir's own `contains("Readest")` hatch left untouched (out of scope).
|
||||
|
||||
**Regression found 2026-07-08:** the "blocking private hosts removes no functionality" assumption below missed `pnpm dev-web` — in `next dev` the server runs on the developer's own machine and LAN catalogs (e.g. Calibre at 192.168.x.x) are the normal dev workflow; the unconditional `isBlockedHost` made the proxy 400 them ("This URL is not allowed"). CatalogManager already gates its "no LAN URLs" error on `NODE_ENV === 'production'`, so the proxy now mirrors that (PR #5002): `isPrivateHostAllowed() = NODE_ENV === 'development'` skips the blocklist (both preflight and per-redirect-hop). Vitest runs under `NODE_ENV=test` so the SSRF tests still exercise blocking; the dev-exemption test uses `vi.stubEnv('NODE_ENV', 'development')`. Self-hosted production deployments remain blocked (unresolved if anyone complains — would need an env-var opt-in). Also: Calibre's server throttles after repeated failed auth with transient 503s — don't mistake those for a proxy bug.
|
||||
|
||||
**Non-obvious decision:** OPDS proxy can't require Readest auth — it's consumed from the browser via `<img src={getProxiedURL(...)}>` (covers) and `window.fetch` WITHOUT a Readest token; the `auth` query param is the *upstream* OPDS server cred, not the user token. So auth would break OPDS browsing/images. SSRF host-filter is the non-breaking high-value fix; residual relay/CORS-bypass on hosted CF (Medium) left for maintainer. On web the proxy is a CF Worker that can't reach a user LAN anyway (desktop bypasses via `needsProxy`), so blocking private hosts removes no functionality.
|
||||
|
||||
Test invocation gotcha: `npx vitest run <file>` skips dotenv → `src/utils/supabase.ts:8 atob(...)` throws at import for tests that load the REAL `@/utils/access` (e.g. `send-fetch-url-guard.test.ts`). Use `pnpm test` (wraps `dotenv -e .env -e .env.test.local`) or `npx dotenv -e .env -e .env.test.local -- vitest run`. Tests that mock supabase/access are unaffected.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
name: sentry-crash-reporting-4914
|
||||
description: Sentry crash reporting across JS/Rust/Android/iOS (PR
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: e1238bc7-0b80-4036-b949-f9a2cf0045bc
|
||||
---
|
||||
|
||||
Sentry crash/error reporting added in PR #4914 (`feat(sentry): add crash reporting for Android, iOS, desktop, and web`). Four layers, one build-time `SENTRY_DSN` (empty => every layer no-ops):
|
||||
|
||||
- **JS + Rust panics**: `tauri-plugin-sentry` 0.5 + `sentry` 0.42 registered in `lib.rs::run()` (guard held to end of `run()`); rustls transport (NOT native-tls, so it cross-compiles for mobile); browser SDK auto-injected. Minidump handler is desktop-only: `#[cfg(not(any(target_os = "ios", target_os = "android")))]`.
|
||||
- **Android native**: `io.sentry:sentry-android:8.47.0` in `gen/android/app/build.gradle.kts` + manifest auto-init `<meta-data>` (`io.sentry.dsn` from `${sentryDsn}` placeholder, `io.sentry.environment`). Crashes+errors only (traces=0, no PII, no replay).
|
||||
- **iOS native**: `sentry-cocoa` via SPM in `project.yml`.
|
||||
|
||||
Config: `sentry_config.rs` holds pure helpers (`sentry_dsn`, `environment_for_version`, `app_version`, `release_name`/`sentry_release`, `corrected_os_name`, `android_version_from_uname`, `is_ignored_browser_error`, `parse_webview_info`/`set_webview_info`/`webview_info`). Scope = crashes+errors only. Symbolication (source-map/ProGuard/dSYM upload) is STILL deferred — several 2026-07 crashes (READEST-2 render loop, READEST-9) could only be triaged to a function name, not a source line, for lack of source maps; upload them.
|
||||
|
||||
**The Rust-client `before_send` (in `lib.rs`) now does three things**, in order, for every event (Rust panics + browser events forwarded by tauri-plugin-sentry): (1) drop known-benign browser noise via `is_ignored_browser_error` (case-insensitive match on the benign View-Transition rejections: "transition was skipped" (hidden tab READEST-7 + superseded-nav READEST-F) and "aborted because of invalid state" (READEST-G); a transition *timeout* is deliberately KEPT — real perf signal); (2) rewrite the Android OS name/version (see below); (3) tag `webview.engine`/`webview.version`. The webview tags come from a `set_webview_info` Tauri command the app calls once in `NativeAppService.init()` with `navigator.userAgent`; `parse_webview_info` extracts engine+major-version (Chromium `Chrome/140` checked before WebKit `Version/17`, because Android WebViews also carry a legacy `Version/4.0`) into a global `OnceLock` read in before_send. Added because forwarded browser events carry os/rust/device context but NO browser context, so crashes couldn't be correlated with WebView version. (feat(sentry): tag events with the WebView engine and version, merged 2026-07.)
|
||||
|
||||
**2026-07 production crash-fix batch (all merged).** The recurring root cause was best-effort background work throwing UNHANDLED promise rejections (callers fire-and-forget, so a throw hits the global handler): READEST-1 concurrent-use (turso, see [[turso-concurrent-use-forbidden]]); READEST-5 cloud `deleteFile` threw (log+swallow); READEST-6 statistics DB writes on teardown (`runBestEffort` wrapper in `ReadingStatsTracker`; also covers READEST-4/8 network fails); READEST-A library save to a custom shared-storage folder failed `EACCES` because the save path never called the existing `requestStoragePermission()` (`AppService.saveLibraryBooks` now requests-once-per-session + retries). READEST-2 = zustand `updateTransferProgress` allocating new state on unchanged values → React update loop (equality guard). READEST-9 = `useAppRouter` wraps EVERY nav in a View Transition; opening a book is a heavy render that overruns the ~4s DOM-update budget → `TimeoutError` (fix: book-open navs use the plain `useRouter`, matching 8/10 into-reader paths; version-gating does NOT help — the 4s budget is version-independent).
|
||||
|
||||
**Batch 2 (PR #4962, merged).** READEST-F/G = more benign View-Transition rejections → broadened the `before_send` filter (above). READEST-H = book-import `createDir` was non-recursive check-then-create; two concurrent imports of the same book race → Windows "Cannot create a file when that file already exists". Fix: `fs.createDir(getDir(book), 'Books', true)` (recursive = `create_dir_all`, idempotent). READEST-N = `StatisticsDb.applyRemoteEvents` runs a manual `BEGIN`/`COMMIT`; **the Rust per-op `op_lock` serializes single statements but does NOT make a multi-statement JS transaction atomic** — two concurrent pulls (split-view trackers share the `sharedDb` singleton connection) nest `BEGIN` in `BEGIN` → "cannot start a transaction within a transaction". Fix: a promise-chain mutex on `applyRemoteEvents` (works because JS is single-threaded — the synchronous grab-prev/install-new-promise is atomic; concurrency here is async *interleaving at `await`s*, not threads). General rule: any shared-connection multi-statement transaction needs JS-level serialization on top of the native op_lock. (Cleaner alternative not taken: dedupe the pull so only one tracker pulls the shared DB.) Deferred, need source maps: READEST-J (OPDS page-stream fetch, uncaught native reqwest error), READEST-K (`Failed to fetch`), READEST-M (`null appendChild`).
|
||||
|
||||
**Release + environment key off `package.json`, NOT the crate version.** Originally `release: sentry::release_name!()` = `CARGO_PKG_NAME@CARGO_PKG_VERSION` = `Readest@0.2.2` (stale crate version, never bumped) and `environment` read `CARGO_PKG_VERSION` (so it was ALWAYS "production" — nightly detection was dead). Fix: `build.rs::propagate_app_version()` reads the top-level `"version"` from `../package.json` (line-based parse via `read_json_string_field`, no serde) and bakes `cargo:rustc-env=READEST_APP_VERSION`; `app_version()` reads it via `option_env!` (falls back to `CARGO_PKG_VERSION`), same bake mechanism as `SENTRY_DSN`. `sentry_release()` -> `Readest@<pkg-version>` (e.g. `Readest@0.11.17`), `sentry_environment()` now derives from `app_version()` so nightly (`-YYYYMMDDHH`) correctly reports `environment=nightly`. Android/iOS **native** SDK releases already came from `versionName`/bundle version (tauri derives those from package.json), so only the Rust client (which also handles JS/browser events via tauri-plugin-sentry) needed fixing.
|
||||
|
||||
**OS name "Linux" -> "Android".** On Android, `sentry-contexts::os_context()` builds the OS context from `uname()` (not-macos/not-windows branch): `name = info.sysname` = "Linux", `version = info.release` = kernel string like `6.1.162-android14-11-...`. Fixed with a Rust-client `before_send` in `lib.rs` that, keyed on `std::env::consts::OS == "android"`, rewrites `Context::Os.name` -> "Android" and pulls the Android version ("14") out of the `androidNN` token in `os.version` via `android_version_from_uname`. `before_send` runs AFTER `ContextIntegration::process_event` (which inserts the os context only if `Entry::Vacant`), so the "Linux" context is present to rewrite; applies to browser events too since tauri-plugin-sentry forwards them through the same Rust client. iOS-via-Rust would show "Darwin" but that path is minor (native sentry-cocoa reports iOS correctly) — not remapped.
|
||||
|
||||
**Gotcha 1 — iOS generated files are gitignored + never tracked.** `gen/apple/Sources/Readest/main.mm` and `gen/apple/Readest_iOS/Info.plist` are gitignored (`.gitignore` `src-tauri/gen`) and regenerated by `tauri ios init` — editing them does NOT persist. Only `project.yml` and force-added custom files (like `ShareExtension/*`, `ReadestWidget/*`) survive. So native iOS init lives in a **force-tracked `gen/apple/SentrySupport/SentryBootstrap.m`** (`+[ReadestSentryBootstrap load]`, runs before `main`) wired via `project.yml` (SPM package + `- path: SentrySupport` source), reading the DSN from an iOS-gated Rust C-ABI `readest_sentry_dsn()` FFI (in `sentry_config.rs`) — no generated-file edits. See [[ios-widget-appgroup-stripped-appstore]].
|
||||
|
||||
**Gotcha 2 — sentry-android needs a lifecycle exclude.** `sentry-android-core` (7.x AND 8.x) depends on `androidx.lifecycle:lifecycle-common-java8`, discontinued at 2.9.0+. The app's `lifecycle-process:2.10.0` pin version-aligns it to a nonexistent `2.10.0` -> Gradle `Could not resolve` at `:app:mergeUniversalReleaseNativeLibs`. Fix = `exclude(group="androidx.lifecycle", module="lifecycle-common-java8")` (its Java8 APIs now live in `lifecycle-common`). Same class as [[dependabot-pnpm-overrides]].
|
||||
|
||||
**Gotcha 3 — no dotenv in the tauri build; wire `SENTRY_DSN` yourself.** `tauri-cli` (2.10.1) has NO dotenv dependency, so `.env.local` / `.env.*` are NOT auto-loaded into the cargo/gradle build (Next.js `.env.local` only reaches Next.js). `build.rs` resolves `SENTRY_DSN` with precedence **env -> `.env.local` -> `.env`** and bakes it via `cargo:rustc-env` (covers Rust + iOS FFI; `rerun-if-changed` avoids stale bake); `build.gradle.kts` does the same for the Android manifest placeholder. CI: `release.yml`/`nightly.yml` append `SENTRY_DSN=${{ secrets.SENTRY_DSN }}` to the `.env.local` they already build next to the PostHog/Supabase secrets (`cp .env.local apps/readest-app/.env.local`). iOS App Store release is a local script -> uses the maintainer's local `.env.local`.
|
||||
|
||||
Env tag: `sentry_environment()` now reads `app_version()` (baked from `package.json`), so nightly stamps (`-YYYYMMDDHH`) resolve to `environment=nightly`; store-distributed mobile stays `production`. (Previously it read `CARGO_PKG_VERSION` — crate `0.2.2`, never nightly-stamped — so it was always `production`.)
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: transfer-queue-clear-persistence
|
||||
description: "Transfer Queue \"Clear Completed/Failed/All\" reappeared on reload because the hook mutated the store directly and skipped persistQueue"
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: daef2308-58b2-425d-924d-8a405b0e096a
|
||||
---
|
||||
|
||||
Transfer Queue "Clear Completed" (also Clear Failed / Clear All) removed items from the panel but they reappeared next time the queue loaded from `localStorage` (`readest_transfer_queue`).
|
||||
|
||||
**Root cause:** `src/hooks/useTransferQueue.ts` called `useTransferStore.getState().clearCompleted()` / `clearFailed()` / `clearAll()` directly — those Zustand actions only mutate in-memory `transfers`, never touching `localStorage`. Only `clearPending` routed through `transferManager.clearPending()`, which calls `this.persistQueue()`. So the persisted copy still held the completed rows and `loadPersistedQueue()` restored them on next init.
|
||||
|
||||
**Fix (PR):** added `clearCompleted()`/`clearFailed()`/`clearAll()` to `src/services/transferManager.ts` (each = store action + `this.persistQueue()`, mirroring `clearPending`), and pointed the hook at the manager methods. Tests in `src/__tests__/services/transfer-manager.test.ts` assert both the store and `localStorage` no longer contain the cleared rows.
|
||||
|
||||
**Why:** the store is in-memory; `transferManager` is the only layer that persists. Any mutation exposed to the UI must go through the manager (which calls `persistQueue()`), not the store directly, or it won't survive reload.
|
||||
|
||||
**How to apply:** when adding a transfer-queue mutation, add a `transferManager` method that pairs the store action with `persistQueue()` and call that from the hook — never call the store's mutating action straight from `useTransferQueue`.
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: tts-background-session-decoupling
|
||||
description: Background TTS across book close (PR
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 97e57af9-5961-4c92-a63e-4582178bf798
|
||||
---
|
||||
|
||||
Background TTS decoupling shipped as PR readest/readest#4941, MERGED 2026-07-06 (follow-up to merged #4931 Web Audio engine). Full e2e verified post-merge in Chrome dev-web including sleep timer firing headless (bar countdown chip → stop at 0:00), split view (parallel pane mount does not stop the playing session; pane close with keepTTSAlive keeps it), and bar-tap same-window reopen with live reattach.
|
||||
|
||||
Architecture: `TTSSessionManager` (per-webview singleton, keyed by book HASH — bookKey `${hash}-${uniqueId()}` regenerates per open) owns media bridge, keep-alive, sleep timer, headless persistence (via `setConfig`+throttled `saveConfig`; store setters no-op for closed books), and a deduplicated `tts-playback-state` relay (transit `'stopped'` swallowed; terminal stop only via `tts-session-ended` + `terminated` flag). `TTSController.detachView()/attachView()` re-seeds from `getLastRange()` via CFI anchor. `TTSMediaBridge` replaces `useTTSMediaSession`. Library `NowPlayingBar` reserves shelf clearance via `--now-playing-inset` body var.
|
||||
|
||||
**Close-path gotcha found live (not by tests):** the reader header X routes through `onCloseBook` → `handleCloseBook`, NOT `onGoToLibrary` → `handleCloseBooksToLibrary`. Any close-behavior change must cover BOTH. Eligibility is an explicit `keepTTSAlive` param on `saveConfigAndCloseBook`/`handleCloseBooks` (not a sticky ref): beforeunload/quit-app/window-close pass an event object which coerces to `false` → hard `tts-stop`; SPA closes pass literal `true` → `tts-close-book` (detach).
|
||||
|
||||
Verified in Chrome dev-web: WebAudio generation numbering continues across close→reopen (adoption, no new controller); different-book mount stops the session; pause/stop from the bar; headless position persisted. Related: [[page-turn-styles-viewtransitions-555]], [[edge-tts-word-highlighting-4017]].
|
||||
|
||||
Debug tip: `releaseUnblockAudio()` ("Unblock audio released" log) is called only from `handleStop`/`stopActive` — its appearance in the close flow pinpoints a hard-stop path.
|
||||
@@ -0,0 +1,26 @@
|
||||
---
|
||||
name: tts-player-redesign
|
||||
description: TTS control redesigned to mini-player + Dialog player sheet (Apple Books/ElevenLabs style); replaces floating icon/popup/TTSBar; showTTSBar retired; PR #4996
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: d8af2d26-c714-44f4-b2f2-dfe08676fe87
|
||||
---
|
||||
|
||||
TTS player redesign built 2026-07-07, **PR readest/readest#4996 MERGED same day** (squash 17de9357d; worktree + local branch cleaned). Spec + plan in `.claude/plans/2026-07-07-tts-player-redesign{,-plan}.md`. Late tweaks: main-view sheet header label dropped; progress line moved to card BOTTOM edge; eink = 1px hairline track + solid base-content fill + buffer hidden (mini), 1px border on `.tts-scrubber` (sheet); chrox added `audio-track`/`audio-played-part` class hooks + `not-eink:` prefixes on the mini progress divs before merge.
|
||||
|
||||
Architecture: `usePlaybackInfo` hook (poll/monotonic-hold/2% total quantization/optimistic seek+rollback, extracted from old TTSProgressRow) feeds `TTSMiniPlayer` (persistent bottom card: 3px progress line w/ buffer-ahead fill from `measuredFraction`, sentence transport, stop, tap-to-expand, exports `TTS_MINI_PLAYER_CLEARANCE=64` consumed by FoliateViewer whenever `ttsEnabled`) and `TTSScrubber` (gradient track: currentColor/40%/15% color-mix; `.tts-scrubber` CSS in globals.css). `TTSPlayerSheet` = Dialog bottom sheet (snapHeight 0.65, desktop `sm:!w-[420px]`) with cover, scrubber, 5-button transport, `SpeedChips` presets (off-preset rate like default 1.3 merges as extra chip), Voice/Sleep-Timer NavigationRow sub-views. Deleted: reader TTSPanel/TTSBar/TTSIcon; `showTTSBar` removed from ViewSettings/constants.
|
||||
|
||||
**Why:** chrox asked to "redesign the TTS control like modern TTS apps (ElevenLabs/Kindle/Apple Books)"; chose mini-player+sheet structure, sentence/paragraph transport (works on ALL engines; time seek Edge-only via scrubber), preset speed chips. Absorbed TODOS items: sticky-bar scrubber + buffer-ahead indicator.
|
||||
|
||||
**How to apply:**
|
||||
- Sheet mounts only while open (`showPlayerSheet &&` gate in TTSControl) so hidden hooks don't poll; DictionarySheet is the mounting precedent.
|
||||
- Transport clusters and scrubbers are `dir='ltr'` (audio-timeline convention) — the final review caught the mini player missing this under RTL; wrap the button cluster, keep timer chip outside.
|
||||
- Rate persistence reads `useSettingsStore.getState()` at call time (stale-closure class #4780); persists BOTH viewSettings.ttsRate and globalViewSettings.ttsRate.
|
||||
- Native voices (no timeline): scrubber hidden, show `{{time}} left in chapter` from chapterRemainingSec estimates.
|
||||
- Live-feedback wave (same day, chrox watching dev-web): sheet controls collapsed to ONE row of speed/voice/timer buttons (speed chips now a 'speed' sub-view; SpeedChips exports formatRate); ttsDuration EMA (alpha 0.2) replaced with CUMULATIVE chars/secs ratio per voice (cap 3600s rescale, legacy {cps,n} migrates as 30s prior) to stop elapsed-time jumping; mini player unmounts while sheet open; TTSController #clearAllHighlights on every section entry (stale last-word leak in preloaded neighbor views) + reapplyCurrentHighlight skips the sentence fallback while playing in word mode (page-turn sentence flash).
|
||||
- **OPEN BUG seen live:** isPlaying glyph desyncs at section transitions (CTA shows play while audio runs; tapping it calls start() which re-speaks from stored ttsLocation = position jump). Repro: watch CTA across chapter auto-advance. Likely a transit state-change ('paused'-flavored or missed 'playing') in useTTSControl handleStateChange.
|
||||
- Deferred follow-ups from final review: e-ink visual pass (stale+disabled opacity compounds ~30%), two usePlaybackInfo edge tests, dead `!groups` branch in sheet, two usePlaybackInfo instances don't share seek suppression.
|
||||
- Verified live in dev-web Chrome: mini player + buffer-ahead fill, sheet + sub-views, drag seek + optimistic hold, back-to-TTS pill, section auto-advance label/timeline reset, stop button, zh-CN i18n. NOT yet: timer countdown chip, native-voice degradation, background NowPlayingBar reattach, e-ink, RTL, mobile gestures. Dev-env traps: stale serwist SW on localhost served year-old locale JSON (unregister + caches.delete); dev-web on port 3001 when 3000 busy.
|
||||
|
||||
Related: [[edge-tts-webaudio-engine]], [[tts-background-session-decoupling]], [[feedback_use_worktree]].
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: ""
|
||||
metadata:
|
||||
node_type: memory
|
||||
originSessionId: e1238bc7-0b80-4036-b949-f9a2cf0045bc
|
||||
---
|
||||
|
||||
Sentry READEST-1 (Android, `tauri.localhost/reader`): unhandled promise rejection `Non-Error promise rejection captured with value: concurrent use forbidden`.
|
||||
|
||||
**Root cause.** `TursoError::Misuse("concurrent use forbidden")` comes from `turso_sdk_kit-0.6.x`'s per-**connection** `ConcurrentGuard` (an `AtomicU32` `compare_exchange(0,1)` in `try_use`, acquired inside every synchronous `step()`/`execute()` poll). turso forbids concurrent use of a single `Connection`. The local plugin `src-tauri/plugins/tauri-plugin-turso` (`wrapper.rs::DbConnection`) holds ONE `turso::Connection` per DB path in `DbInstances` (`Arc<Mutex<HashMap<path, Arc<DbConnection>>>>`). Each `#[command] async fn` (`execute`/`select`/`batch` in `commands.rs`) locks the HashMap only to clone the `Arc<DbConnection>` out, RELEASES it, then `await`s `conn.execute/query` with NO serialization. Tauri dispatches commands on its multi-threaded async runtime, so two overlapping IPC calls for the same path (from `Promise.all`, or independent reader flows — progress save + stats write + annotation query) drive the same connection; whichever hits `step()` on the 2nd thread while the 1st holds the guard gets rejected. The guard is per-*synchronous-step* (released between async IO polls), so the collision is timing-dependent (needs true parallelism), which is why it was rare (2 events/1 user).
|
||||
|
||||
**Fix (PR-pending).** Serialize per-connection ops at the layer that owns the connection: added `op_lock: futures::lock::Mutex<()>` to `DbConnection`; `execute`/`select`/`batch` each `let _op = self.op_lock.lock().await;` first. This is the single choke point for ALL same-path callers (nativeDatabaseService, drizzle proxy, migrate.ts, statisticsDb/ReedyDb) regardless of JS entry point — a JS-only queue in `NativeDatabaseService` wouldn't cover the others or multiple service instances sharing one Rust connection. Bonus: holding the lock across the whole `batch` keeps BEGIN/COMMIT atomic vs interleaved writes, and pins `last_insert_rowid()` to the `execute` that produced it. `batch` calls `self.conn.execute` (not `self.execute`) so no re-entrant deadlock.
|
||||
|
||||
**Test.** `wrapper.rs` `#[cfg(test)] mod tests::concurrent_ops_on_one_connection_do_not_collide` — `#[tokio::test(flavor="multi_thread", worker_threads=8)]`, opens `:memory:`, fans out 64 concurrent INSERTs + 64 SELECTs on one `Arc<DbConnection>`. Deterministically fails pre-fix with `Turso(Misuse("concurrent use forbidden"))` (~0.02s), passes post-fix (5/5 stable). Needed `[dev-dependencies] tokio = { features = ["macros","rt-multi-thread"] }` (runtime tokio features lacked `macros`).
|
||||
|
||||
**Gotchas.**
|
||||
- `DbConnection` is module-private (`mod wrapper` not `pub`), so the test must live INSIDE `wrapper.rs`, not `tests/`.
|
||||
- Plugin tests are NOT in the repo gate: `pnpm test:rust`/`fmt:check`/`clippy:check` are all `-p Readest` only. Run plugin checks explicitly: `cargo test/clippy --manifest-path src-tauri/plugins/tauri-plugin-turso/Cargo.toml` (clippy needs `--no-deps` — the vendored `tauri-runtime-wry` fork emits warnings that `-D warnings` would otherwise promote to errors). Shared cargo target is `/Users/chrox/dev/readest/target`, not `src-tauri/target`.
|
||||
- Pre-existing fmt debt in the plugin: `cargo fmt --check` flags `decode.rs` import ordering (unrelated; left untouched).
|
||||
|
||||
See [[sentry-crash-reporting-4914.md]] (this is the first real issue it caught) and [[bug-patterns]].
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
name: webdav-group-membership-sync-4942
|
||||
description: File-sync mergeBookMetadata dropped groupId/groupName so group changes on already-synced books never propagated
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: b97634b0-ccf4-4663-b8c3-895f8e8aed4a
|
||||
---
|
||||
|
||||
MERGED as PR #4946 into `origin/main` (issue #4942, from discussion #4922). WebDAV/file sync only propagated group membership for NEWLY imported books, not for books already present on both devices.
|
||||
|
||||
**Root cause**: `src/services/sync/file/merge.ts` `mergeBookMetadata` overlaid a fixed field subset (title/author/metadata/primaryLanguage/updatedAt) and DROPPED `groupId`/`groupName`. Adding a book to a group bumps `book.updatedAt` (`GroupingModal.tsx handleConfirmGrouping`) and pushes the full book (with group fields) into `library.json`. On a peer, an already-present book is reconciled via `mergeBookMetadata` (the `isRemoteBookMetadataNewer` LWW pass in `engine.ts` ~line 445), which won the `updatedAt` race but discarded the group change. New books instead arrive via `addBookToLibrary` with the full remote object, so their group travels on first import — that asymmetry is exactly what the reporter saw.
|
||||
|
||||
**Fix**: carry `groupId`/`groupName` in `mergeBookMetadata`, assigned RAW (not `?? local`) so a group removal (undefined on the newer side) also propagates. Matches native cloud sync, which already maps `group_id`/`group_name` in `src/utils/transform.ts`. Deprecated `group` field intentionally left out (native sync doesn't carry it either).
|
||||
|
||||
Tests: `merge.test.ts` (add + removal cases), `engine-metadata-sync.test.ts` (full reconcile delivers group into `updateBookMetadata` + re-pushed index). Extends the field subset first documented in [[webdav-metadata-sync-4756]].
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: xcode26-swiftrs-ios-build-broken
|
||||
description: Xcode 26.2/Swift 6.2 broke all tauri iOS builds via swift-rs 1.0.7; fixed by vendored packages/swift-rs using --triple/--sdk
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
originSessionId: 603140d5-b247-4f0f-9cdf-0c3479cbcb1e
|
||||
---
|
||||
|
||||
Xcode 26.2 (Swift 6.2.4, 2026-07) broke EVERY `tauri ios build` repo-wide: the Swift plugin packages (native-bridge etc.) fail with phantom errors — `type 'Bundle' has no member 'main'`, `extra argument 'privacy' in call`, `cannot infer contextual base in reference to member 'public'`. Root cause: swift-rs 1.0.7 (unmaintained since 2024, latest release) invokes `swift build --arch <host> -Xswiftc -target <ios-triple>` while inheriting Xcode's `SDKROOT`; Swift 6.2's driver no longer honors that mix, so sources compile against the wrong platform's Swift overlays — overlay-provided APIs (`Bundle.main` sugar, os.Logger privacy interpolation) vanish. Related upstream: tauri-apps/tauri#10717, #11103 ("using sysroot for 'iPhoneOS' but targeting 'MacOSX'").
|
||||
|
||||
**Fix (branch feat/page-turn-styles-555):** vendored `packages/swift-rs` + `[patch.crates-io] swift-rs = { path = "packages/swift-rs" }` in root Cargo.toml. Patch in `src-rs/build.rs link()`: use SPM first-class cross-compile flags `--triple <versioned-triple> --sdk <sdk-path>` (drop `--arch` and all `-Xswiftc/-Xcc/-Xcxx` target overrides), `env_remove("SDKROOT")` (leaks from Xcode script phase and breaks SPM's host-targeted MANIFEST compile), and artifact search path becomes `<unversioned-triple>[-simulator]/<config>` (e.g. `arm64-apple-ios/release`) instead of the old hardcoded `<arch>-apple-macosx/<config>`.
|
||||
|
||||
**Gotcha exposed by the fix:** with `--triple`, SPM enforces the deployment floor from the package manifest `platforms:` stanza (the old bypass fed the version straight to swiftc). native-bridge's `ios/Package.swift` declared `.iOS(.v14)` while using unguarded iOS-15 API (StoreKit `Storefront`) → bumped to `.iOS("15.0")` (string form — `.v15` needs swift-tools 5.5, manifest is 5.3), matching the app's `IPHONEOS_DEPLOYMENT_TARGET: 15.0` (gen/apple/project.yml).
|
||||
|
||||
Fast repro/verify loop (~2 min, no xcodebuild): `SDKROOT=$(xcrun --sdk iphoneos --show-sdk-path) IPHONEOS_DEPLOYMENT_TARGET=15.0 cargo build -p tauri-plugin-native-bridge --target aarch64-apple-ios --release` in src-tauri.
|
||||
|
||||
Related: [[page-turn-styles-viewtransitions-555]] (branch where this landed), [[deps-security-overrides-workflow]] (vendoring pattern).
|
||||
@@ -72,6 +72,9 @@ docs/superpowers
|
||||
/public/swe-worker-*.js
|
||||
|
||||
/dist/
|
||||
/epub_review_sessions/
|
||||
/tools/epub-review-editor/.venv/
|
||||
/tools/epub-review-editor/__pycache__/
|
||||
|
||||
.context/
|
||||
.claude/settings.local.json
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# TODOS
|
||||
|
||||
## Cloud Sync provider selection follow-ups (deferred by /autoplan, 2026-07-06)
|
||||
|
||||
Deferred from the Cloud Sync provider-selection plan (#4959/#4380). See the
|
||||
Decision Audit Trail in the plan for reasoning.
|
||||
|
||||
- [ ] Pre-switch "download all Readest Cloud books" affordance so a fresh device
|
||||
gets full library completeness when a third-party provider is selected. (S)
|
||||
- [ ] Library-page sync-status indicator for the active third-party provider
|
||||
(fileSyncStore already exposes aggregate progress). (S)
|
||||
- [ ] Account page active-provider chip. (XS)
|
||||
- [ ] File-engine parity: reading stats + per-book viewSettings sync via the
|
||||
file layout (readingStatus/tags parity shipped as its own PR). (M)
|
||||
- [ ] Server-side quota error code (`code: 'quota_exceeded'`, mirroring the share
|
||||
import route) so the client stops string-matching 'Insufficient storage
|
||||
quota'; message drift silently restores retry behavior. (S)
|
||||
- [ ] Pre-existing: Manage Sync "Books" category gates metadata rows but NOT
|
||||
binary uploads to Readest Cloud (`queueUpload` never consults
|
||||
`isSyncCategoryEnabled('book')` despite the category docs claiming it) —
|
||||
align behavior or docs. (S)
|
||||
- [ ] Sentry `cloudSyncProvider` tag: Sentry tagging is Rust-mediated
|
||||
(`set_webview_info` pattern in `sentry_config.rs`); add a
|
||||
`set_cloud_sync_provider` command + before_send tag so sync-related
|
||||
reports carry the active provider. Console log lines ship in the
|
||||
meantime. (S, needs src-tauri)
|
||||
|
||||
Deferred items from the Edge TTS Web Audio plan review (/autoplan, 2026-07-04).
|
||||
Each was explicitly deferred, not forgotten — see the Decision Audit Trail in
|
||||
`.agents/plans/2026-07-03-edge-tts-webaudio.md`.
|
||||
|
||||
## TTS listening engine follow-ups
|
||||
|
||||
- [ ] Cross-section gapless playback: preload and schedule the next section's first
|
||||
sentence so chapter boundaries are as seamless as sentence boundaries. (M)
|
||||
- [ ] Lock-screen ±10s seek offsets in addition to prev/next sentence. (S)
|
||||
- [ ] Persist measured sentence durations per book so a reopened chapter starts
|
||||
with an exact timeline instead of estimates. (S)
|
||||
- [ ] Worker offload for decode + WSOLA if device profiling shows main-thread jank
|
||||
on low-end Android. (S)
|
||||
- [ ] Provider-agnostic voice source hedge: local neural TTS (e.g. Piper/Kokoro
|
||||
WASM) plugging into WebAudioPlayer/SectionTimeline — the engine is designed
|
||||
for this; see "Strategic framing" in the plan. (L)
|
||||
- [ ] Background chapter prefetch (convert timeline estimates to exact durations
|
||||
ahead of playback). (M)
|
||||
@@ -49,7 +49,7 @@ const nextConfig = {
|
||||
assetPrefix: '',
|
||||
reactStrictMode: true,
|
||||
serverExternalPackages: ['isows'],
|
||||
allowedDevOrigins: ['192.168.2.120'],
|
||||
allowedDevOrigins: ['192.168.2.120', '127.0.0.1', 'localhost'],
|
||||
webpack: (config) => {
|
||||
config.resolve.alias = {
|
||||
...config.resolve.alias,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@readest/readest-app",
|
||||
"version": "0.11.17",
|
||||
"version": "0.11.18",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
@@ -8,6 +8,7 @@
|
||||
"build": "dotenv -e .env.tauri -- next build",
|
||||
"start": "dotenv -e .env.tauri -- next start",
|
||||
"dev-web": "dotenv -e .env.web -- next dev",
|
||||
"epub-reviewer:dev": "node scripts/epub-reviewer-dev.mjs",
|
||||
"build-web": "dotenv -e .env.web -- next build",
|
||||
"start-web": "dotenv -e .env.web -- next start",
|
||||
"dev-web:vinext": "dotenv -e .env.web -- vinext dev",
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "تحرير",
|
||||
"Excerpts": "مقتطفات",
|
||||
"Failed to import book(s): {{filenames}}": "فشل استيراد الكتاب/الكتب: {{filenames}}",
|
||||
"Fast": "سريع",
|
||||
"Font": "الخط",
|
||||
"Font & Layout": "الخط والتخطيط",
|
||||
"Font Face": "نوع الخط",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "تم تسجيل الدخول باسم {{userDisplayName}}",
|
||||
"Match Case": "مطابقة حالة الأحرف",
|
||||
"Match Diacritics": "مطابقة التشكيل",
|
||||
"Match Whole Words": "مطابقة الكلمات الكاملة",
|
||||
"Maximum Number of Columns": "العدد الأقصى للأعمدة",
|
||||
"Minimum Font Size": "الحد الأدنى لحجم الخط",
|
||||
"Monospace Font": "خط أحادي المسافة (Monospace)",
|
||||
@@ -89,7 +87,6 @@
|
||||
"Sign In": "تسجيل الدخول",
|
||||
"Sign Out": "تسجيل الخروج",
|
||||
"Sky": "سماوي",
|
||||
"Slow": "بطيء",
|
||||
"Solarized": "سولاريزد",
|
||||
"Speak": "تحدث",
|
||||
"Subjects": "المواضيع",
|
||||
@@ -598,9 +595,6 @@
|
||||
"Start Migration": "بدء الترحيل",
|
||||
"Advanced Settings": "إعدادات متقدمة",
|
||||
"File count: {{size}}": "عدد الملفات: {{size}}",
|
||||
"Background Read Aloud": "قراءة بصوت عالٍ في الخلفية",
|
||||
"Ready to read aloud": "جاهز للقراءة بصوت عالٍ",
|
||||
"Read Aloud": "القراءة بصوت عالٍ",
|
||||
"Screen Brightness": "سطوع الشاشة",
|
||||
"Background Image": "صورة الخلفية",
|
||||
"Import Image": "استيراد صورة",
|
||||
@@ -924,7 +918,6 @@
|
||||
"Export": "تصدير",
|
||||
"Set Timeout": "تعيين المهلة",
|
||||
"Select Voice": "اختر الصوت",
|
||||
"Toggle Sticky Bottom TTS Bar": "تبديل شريط TTS الثابت",
|
||||
"Display what I'm reading on Discord": "عرض ما أقرأه على Discord",
|
||||
"Show on Discord": "عرض على Discord",
|
||||
"Instant {{action}}": "{{action}} فوري",
|
||||
@@ -1647,14 +1640,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "فشل مصادقة WebDAV. أعد الاتصال من الإعدادات.",
|
||||
"Downloading": "تنزيل",
|
||||
"Uploading": "تحميل",
|
||||
"downloaded {{n}} book(s)": "تنزيل {{n}} كتاب",
|
||||
"pushed {{n}} config(s)": "دفع {{n}} إعداد",
|
||||
"uploaded {{n}} new file(s)": "تحميل {{n}} ملف جديد",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "انتهت المزامنة بـ {{failed}} خطأ. {{ok}} ناجح.",
|
||||
"Sync complete": "اكتملت المزامنة",
|
||||
"Everything is already up to date.": "كل شيء محدث بالفعل.",
|
||||
"Browsing {{path}} on {{server}}": "تصفح {{path}} على {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "اتصل بخادم WebDAV لتصفح ملفاتك البعيدة.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "تحميل ملفات الكتب",
|
||||
"Sync now": "مزامنة الآن",
|
||||
@@ -1662,33 +1648,8 @@
|
||||
"Show password": "إظهار كلمة المرور",
|
||||
"Root Directory": "الدليل الجذر",
|
||||
"Syncing…": "جاري المزامنة…",
|
||||
"pulled progress for {{n}} book(s)": "سحب التقدم لـ {{n}} كتاب",
|
||||
"Sync History": "سجل المزامنة",
|
||||
"Clear Sync History": "مسح سجل المزامنة",
|
||||
"No manual syncs yet": "لا توجد مزامنات يدوية بعد",
|
||||
"Partial": "جزئي",
|
||||
"Cleanup": "تنظيف",
|
||||
"Cleanup failed": "فشل التنظيف",
|
||||
"Sync failed": "فشلت المزامنة",
|
||||
"{{n}} deleted": "{{n}} محذوف",
|
||||
"{{n}} failed": "{{n}} فاشل",
|
||||
"Nothing deleted": "لم يتم حذف شيء",
|
||||
"{{n}} downloaded": "{{n}} منزل",
|
||||
"{{n}} uploaded": "{{n}} محمل",
|
||||
"{{n}} progress": "{{n}} تقدم",
|
||||
"Up to date": "محدث",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "الكتب المنزلة",
|
||||
"Files uploaded": "الملفات المحملة",
|
||||
"Configs uploaded": "الإعدادات المحملة",
|
||||
"Configs downloaded": "الإعدادات المنزلة",
|
||||
"Covers uploaded": "الأغلفة المحملة",
|
||||
"Books deleted": "الكتب المحذوفة",
|
||||
"Files in sync": "الملفات المتزامنة",
|
||||
"Failures": "الأخطاء",
|
||||
"Total books": "إجمالي الكتب",
|
||||
"Error:": "خطأ:",
|
||||
"Failed books": "الكتب الفاشلة",
|
||||
"Deleted {{n}} book(s) from server.": "تم حذف {{n}} كتاب/كتب من الخادم.",
|
||||
"Failed to load directory": "فشل تحميل المجلد",
|
||||
"File download is only supported on the desktop and mobile apps.": "تنزيل الملفات مدعوم فقط في تطبيقات سطح المكتب والموبايل.",
|
||||
@@ -1720,10 +1681,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ثبّت إضافة متصفح Readest لإرسال المقالة التي تقرأها إلى مكتبتك. تقتطع الصفحة من متصفحك حتى تعمل المواقع المدفوعة والتي تتطلب تسجيل الدخول.",
|
||||
"Added to your library. It will sync to your other devices.": "تمت الإضافة إلى مكتبتك. ستتم المزامنة مع أجهزتك الأخرى.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "تم نسيان عبارة المرور للمزامنة. تم مسح جميع الحقول المشفرة.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "المزامنات اليدوية والتنظيف فقط. لا تُسجل المزامنات التلقائية أثناء القراءة هنا.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "هل تريد حذف {{n}} كتاب/كتب من خادم WebDAV؟\n\nهذا يحذف الملفات البعيدة فقط؛ مكتبتك المحلية لن تتأثر. لا يمكن التراجع عن الحذف. البيانات على الخادم ستزول للأبد.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "يرفع ملفات الكتب إلى أجهزتك الأخرى.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "عبارة مرور المزامنة غير صحيحة. تعذر فك تشفير بيانات الاعتماد المتزامنة.",
|
||||
"Email books straight to your library": "أرسل الكتب مباشرة إلى مكتبتك عبر البريد الإلكتروني",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "أعد توجيه المرفقات والمقالات إلى عنوان Readest الخاص بك. متوفر في خطط Plus وPro وLifetime.",
|
||||
@@ -1924,9 +1883,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "يمسح أيضًا تقدم القراءة والملاحظات والإشارات المرجعية.",
|
||||
"Background Image (Library)": "صورة الخلفية (المكتبة)",
|
||||
"Background Image (Reader)": "صورة الخلفية (واجهة القراءة)",
|
||||
"updated metadata for {{n}} book(s)": "تم تحديث البيانات الوصفية لـ {{n}} كتاب",
|
||||
"{{n}} metadata": "{{n}} بيانات وصفية",
|
||||
"Metadata updated": "تم تحديث البيانات الوصفية",
|
||||
"Filter": "تصفية",
|
||||
"Sort by": "ترتيب حسب",
|
||||
"Date modified": "تاريخ التعديل",
|
||||
@@ -1941,5 +1897,123 @@
|
||||
"Granularity": "الدقة",
|
||||
"Refresh Page": "تحديث الصفحة",
|
||||
"Recently read": "المقروءة مؤخرًا",
|
||||
"Show recently read": "إظهار المقروءة مؤخرًا"
|
||||
"Show recently read": "إظهار المقروءة مؤخرًا",
|
||||
"Find:": "بحث:",
|
||||
"Enable rule": "تفعيل القاعدة",
|
||||
"Disable rule": "تعطيل القاعدة",
|
||||
"Progress Read": "تقدم القراءة",
|
||||
"Auto-import new books from this folder": "استيراد الكتب الجديدة تلقائيًا من هذا المجلد",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "عند إضافة كتب جديدة إلى هذا المجلد، يتم استيرادها تلقائيًا في المرة التالية التي يُفتح فيها Readest أو يعود إلى المقدمة.",
|
||||
"Reading aloud": "جارٍ القراءة بصوت عالٍ",
|
||||
"Open Book": "فتح الكتاب",
|
||||
"Stop reading aloud": "إيقاف القراءة بصوت عالٍ",
|
||||
"Enter at least two words": "أدخل كلمتين على الأقل",
|
||||
"Search failed": "فشل البحث",
|
||||
"Search with regex": "البحث بالتعابير النمطية",
|
||||
"Words to find near each other": "كلمات يُبحث عنها بالقرب من بعضها",
|
||||
"Contains": "يحتوي على",
|
||||
"Whole Words": "كلمات كاملة",
|
||||
"Regular Expression": "تعبير نمطي",
|
||||
"Nearby Words": "كلمات متقاربة",
|
||||
"Within N words": "ضمن N كلمات",
|
||||
"Not for regex": "غير متاح للتعابير النمطية",
|
||||
"No results found": "لم يتم العثور على نتائج",
|
||||
"{{count}} results_zero": "لا توجد نتائج",
|
||||
"{{count}} results_one": "نتيجة واحدة",
|
||||
"{{count}} results_two": "نتيجتان",
|
||||
"{{count}} results_few": "{{count}} نتائج",
|
||||
"{{count}} results_many": "{{count}} نتيجةً",
|
||||
"{{count}} results_other": "{{count}} نتيجة",
|
||||
"Failed to seek": "فشل الانتقال",
|
||||
"Chapter progress": "تقدم الفصل",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} من {{total}}",
|
||||
"Decrease Contrast": "تقليل التباين",
|
||||
"Reset Contrast": "إعادة تعيين التباين",
|
||||
"Increase Contrast": "زيادة التباين",
|
||||
"Push": "دفع",
|
||||
"Slide": "انزلاق",
|
||||
"Page Curl": "طي الصفحة",
|
||||
"Animation Style": "نمط الرسوم المتحركة",
|
||||
"Appearance": "المظهر",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "يحدد حجم نص نتائج القاموس بشكل مستقل عن عرض القراءة.",
|
||||
"Authentication failed. Reconnect in Settings.": "فشلت المصادقة. أعد الاتصال من الإعدادات.",
|
||||
"Full Sync": "مزامنة كاملة",
|
||||
"Waiting for sign-in…": "في انتظار تسجيل الدخول…",
|
||||
"Reconnect": "إعادة الاتصال",
|
||||
"Connected as {{account}}": "متصل باسم {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". اجعل Google Drive مزود السحابة النشط.",
|
||||
"Use Google Drive": "استخدام Google Drive",
|
||||
"Sign-in opens in your browser.": "يتم فتح تسجيل الدخول في متصفحك.",
|
||||
"Readest only accesses the files it creates in your Drive.": "لا يصل Readest إلا إلى الملفات التي ينشئها في Drive الخاص بك.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "زامن مكتبتك وتقدم القراءة والتمييزات مع خادم WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "زامن مكتبتك وتقدم القراءة والتمييزات مع Google Drive الخاص بك.",
|
||||
"Configured": "تم الإعداد",
|
||||
"Use WebDAV": "استخدام WebDAV",
|
||||
"Cloud Sync": "المزامنة السحابية",
|
||||
"Extra Large": "كبير جدًا",
|
||||
"Hint size": "حجم التلميح",
|
||||
"Gloss text size above the word": "حجم نص التلميح الظاهر فوق الكلمة",
|
||||
"Hint color": "لون التلميح",
|
||||
"Adjust Text Selection": "ضبط تحديد النص",
|
||||
"Your books will appear here": "ستظهر كتبك هنا",
|
||||
"Reading aloud continues in the background": "تستمر القراءة بصوت عالٍ في الخلفية",
|
||||
"Stopped reading aloud": "تم إيقاف القراءة بصوت عالٍ",
|
||||
"Read aloud stopped": "توقفت القراءة بصوت عالٍ",
|
||||
"Cloud provider switched": "تم تغيير مزوّد السحابة",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "رفع الملفات إلى Readest Cloud متوقف مؤقتًا ما دامت مزامنة {{provider}} محددة",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "يديره {{provider}} ما دام مزوّد المزامنة السحابية لديك",
|
||||
"Not signed in": "لم يتم تسجيل الدخول",
|
||||
"Paused — plan required": "متوقف مؤقتًا — يلزم اشتراك",
|
||||
"Active · Book file uploads off": "نشط · رفع ملفات الكتب متوقف",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "تستمر مزامنة إعدادات التطبيق وإحصاءات القراءة والقواميس عبر حساب Readest الخاص بك ما دمت مسجلاً الدخول.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "زامن مكتبتك وتقدم القراءة والتمييزات مع Readest Cloud.",
|
||||
"Account and Storage": "الحساب والتخزين",
|
||||
"Manage your plan and stored files": "إدارة اشتراكك وملفاتك المخزنة",
|
||||
"Cloud sync provider": "مزوّد المزامنة السحابية",
|
||||
"Use Readest Cloud": "استخدام Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "لا يزال جهاز آخر يزامن هذه المكتبة عبر Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_zero": "لم يفشل أي رفع: حصة التخزين غير كافية",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "فشل رفع واحد: حصة التخزين غير كافية",
|
||||
"{{count}} uploads failed: insufficient storage quota_two": "فشل رفعان: حصة التخزين غير كافية",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "فشلت {{count}} عمليات رفع: حصة التخزين غير كافية",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "فشلت {{count}} عملية رفع: حصة التخزين غير كافية",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "فشلت {{count}} عملية رفع: حصة التخزين غير كافية",
|
||||
"Library sync via {{provider}}": "مزامنة المكتبة عبر {{provider}}",
|
||||
"Google Drive session expired": "انتهت صلاحية جلسة Google Drive",
|
||||
"Cloud sync session expired": "انتهت صلاحية جلسة المزامنة السحابية",
|
||||
"Uploads book files to your other devices": "يرفع ملفات الكتب إلى أجهزتك الأخرى",
|
||||
"Re-check every book instead of only changed ones": "إعادة فحص كل كتاب بدلاً من الكتب المتغيرة فقط",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "لم يتم العثور على الحاوية",
|
||||
"Endpoint": "نقطة النهاية",
|
||||
"Bucket": "الحاوية",
|
||||
"Region": "المنطقة",
|
||||
"Access Key ID": "معرّف مفتاح الوصول",
|
||||
"Your Access Key ID": "معرّف مفتاح الوصول الخاص بك",
|
||||
"Secret Access Key": "مفتاح الوصول السري",
|
||||
"Your Secret Access Key": "مفتاح الوصول السري الخاص بك",
|
||||
"S3-Compatible Storage": "تخزين متوافق مع S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "زامن مكتبتك وتقدم القراءة والتظليلات مع حاوية متوافقة مع S3 مثل Cloudflare R2 أو AWS S3 أو MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "في المتصفح، يجب أن تسمح سياسة CORS للحاوية بأصل هذا الموقع.",
|
||||
"Use S3": "استخدام S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "تأكد من وجود الحاوية ومن أن بيانات الاعتماد لديها صلاحية القراءة والكتابة قبل الاتصال.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "عند اختيار {{provider}}، تتم مزامنة الكتب والتقدم والتعليقات التوضيحية إلى خادمك فقط.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "عند اختيار {{provider}}، تتم مزامنة الكتب والتقدم والتعليقات التوضيحية إلى Drive الخاص بك فقط.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "عند اختيار {{provider}}، تتم مزامنة الكتب والتقدم والتعليقات التوضيحية إلى حاويتك فقط.",
|
||||
"Premium": "بريميوم",
|
||||
"S3 Storage": "تخزين S3",
|
||||
"Speed": "السرعة",
|
||||
"{{time}} left in chapter": "متبقي {{time}} في الفصل",
|
||||
"Open Read Aloud player": "فتح مشغل القراءة بصوت عالٍ",
|
||||
"Read Aloud": "القراءة بصوت عالٍ",
|
||||
"Voice": "الصوت",
|
||||
"Sleep Timer": "مؤقت النوم",
|
||||
"Slower": "أبطأ",
|
||||
"Faster": "أسرع",
|
||||
"Exit Auto Scroll": "الخروج من التمرير التلقائي",
|
||||
"Auto Scroll": "التمرير التلقائي",
|
||||
"End of book": "نهاية الكتاب",
|
||||
"Toggle Auto Scroll": "تبديل التمرير التلقائي"
|
||||
}
|
||||
|
||||
@@ -308,7 +308,6 @@
|
||||
"Book": "বই",
|
||||
"Chapter": "অধ্যায়",
|
||||
"Match Case": "কেস মিলান",
|
||||
"Match Whole Words": "পূর্ণ শব্দ মিলান",
|
||||
"Match Diacritics": "ডায়াক্রিটিক্স মিলান",
|
||||
"TOC": "সূচিপত্র",
|
||||
"Table of Contents": "সূচিপত্র",
|
||||
@@ -321,8 +320,6 @@
|
||||
"{{value}} hour": "{{value}} ঘন্টা",
|
||||
"{{value}} hours": "{{value}} ঘন্টা",
|
||||
"Voices for {{lang}}": "{{lang}} এর জন্য কণ্ঠস্বর",
|
||||
"Slow": "ধীর",
|
||||
"Fast": "দ্রুত",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: ১টি কণ্ঠস্বর",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}}টি কণ্ঠস্বর",
|
||||
"Sign in to Sync": "সিঙ্কের জন্য সাইন ইন",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "মাইগ্রেশন শুরু করুন",
|
||||
"Advanced Settings": "উন্নত সেটিংস",
|
||||
"File count: {{size}}": "ফাইলের সংখ্যা: {{size}}",
|
||||
"Background Read Aloud": "পটভূমিতে উচ্চস্বরে পড়ুন",
|
||||
"Ready to read aloud": "উচ্চস্বরে পড়ার জন্য প্রস্তুত",
|
||||
"Read Aloud": "উচ্চস্বরে পড়ুন",
|
||||
"Screen Brightness": "স্ক্রিন উজ্জ্বলতা",
|
||||
"Background Image": "ব্যাকগ্রাউন্ড ছবি",
|
||||
"Import Image": "ছবি আমদানি করুন",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "রপ্তানি",
|
||||
"Set Timeout": "টাইমআউট সেট করুন",
|
||||
"Select Voice": "ভয়েস নির্বাচন করুন",
|
||||
"Toggle Sticky Bottom TTS Bar": "স্থির TTS বার টগল করুন",
|
||||
"Display what I'm reading on Discord": "Discord-এ পড়ছি যা দেখান",
|
||||
"Show on Discord": "Discord-এ দেখান",
|
||||
"Instant {{action}}": "তাৎক্ষণিক {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV প্রমাণীকরণ ব্যর্থ। সেটিংসে আবার সংযোগ করুন।",
|
||||
"Downloading": "ডাউনলোড হচ্ছে",
|
||||
"Uploading": "আপলোড হচ্ছে",
|
||||
"downloaded {{n}} book(s)": "{{n}}টি বই ডাউনলোড করা হয়েছে",
|
||||
"pushed {{n}} config(s)": "{{n}}টি কনফিগ পাঠানো হয়েছে",
|
||||
"uploaded {{n}} new file(s)": "{{n}}টি নতুন ফাইল আপলোড করা হয়েছে",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "সিঙ্ক {{failed}}টি ব্যর্থতা সহ সম্পন্ন হয়েছে। {{ok}}টি সফল।",
|
||||
"Sync complete": "সিঙ্ক সম্পূর্ণ",
|
||||
"Everything is already up to date.": "সবকিছু ইতিমধ্যে আপ টু ডেট রয়েছে।",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} এ {{path}} ব্রাউজ করা হচ্ছে",
|
||||
"Connect to a WebDAV server to browse your remote files.": "আপনার রিমোট ফাইলগুলি ব্রাউজ করতে WebDAV সার্ভারে সংযোগ করুন।",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "বইয়ের ফাইল আপলোড করুন",
|
||||
"Sync now": "এখনই সিঙ্ক করুন",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "পাসওয়ার্ড দেখান",
|
||||
"Root Directory": "রুট ডিরেক্টরি",
|
||||
"Syncing…": "সিঙ্ক হচ্ছে…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}}টি বইয়ের অগ্রগতি টানা হয়েছে",
|
||||
"Sync History": "সিঙ্ক ইতিহাস",
|
||||
"Clear Sync History": "সিঙ্ক ইতিহাস মুছুন",
|
||||
"No manual syncs yet": "এখনো কোনো ম্যানুয়াল সিঙ্ক নেই",
|
||||
"Partial": "আংশিক",
|
||||
"Cleanup": "পরিচ্ছন্নতা",
|
||||
"Cleanup failed": "পরিচ্ছন্নতা ব্যর্থ",
|
||||
"Sync failed": "সিঙ্ক ব্যর্থ",
|
||||
"{{n}} deleted": "{{n}}টি মুছে ফেলা",
|
||||
"{{n}} failed": "{{n}}টি ব্যর্থ",
|
||||
"Nothing deleted": "কিছুই মুছে ফেলা হয়নি",
|
||||
"{{n}} downloaded": "{{n}}টি ডাউনলোড",
|
||||
"{{n}} uploaded": "{{n}}টি আপলোড",
|
||||
"{{n}} progress": "{{n}}টি অগ্রগতি",
|
||||
"Up to date": "আপ টু ডেট",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "ডাউনলোড করা বই",
|
||||
"Files uploaded": "আপলোড করা ফাইল",
|
||||
"Configs uploaded": "আপলোড করা কনফিগ",
|
||||
"Configs downloaded": "ডাউনলোড করা কনফিগ",
|
||||
"Covers uploaded": "আপলোড করা কভার",
|
||||
"Books deleted": "মুছে ফেলা বই",
|
||||
"Files in sync": "সিঙ্কে থাকা ফাইল",
|
||||
"Failures": "ব্যর্থতা",
|
||||
"Total books": "মোট বই",
|
||||
"Error:": "ত্রুটি:",
|
||||
"Failed books": "ব্যর্থ বই",
|
||||
"Deleted {{n}} book(s) from server.": "সার্ভার থেকে {{n}}টি বই মুছে ফেলা হয়েছে।",
|
||||
"Failed to load directory": "ডিরেক্টরি লোড করতে ব্যর্থ",
|
||||
"File download is only supported on the desktop and mobile apps.": "ফাইল ডাউনলোড শুধুমাত্র ডেস্কটপ এবং মোবাইল অ্যাপে সমর্থিত।",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "আপনি যে নিবন্ধটি পড়ছেন তা আপনার লাইব্রেরিতে পাঠাতে Readest ব্রাউজার এক্সটেনশন ইনস্টল করুন। এটি আপনার ব্রাউজার থেকে পৃষ্ঠাটি ক্লিপ করে যাতে পেওয়াল এবং লগইন-অনলি সাইটগুলিও কাজ করে।",
|
||||
"Added to your library. It will sync to your other devices.": "আপনার লাইব্রেরিতে যোগ করা হয়েছে। এটি আপনার অন্যান্য ডিভাইসে সিঙ্ক হবে।",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "সিঙ্ক পাসফ্রেজ ভুলে যাওয়া হয়েছে। সমস্ত এনক্রিপ্ট করা ফিল্ড পরিষ্কার করা হয়েছে।",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "শুধুমাত্র ম্যানুয়াল সিঙ্ক এবং পরিচ্ছন্নতা। পড়ার সময় স্বয়ংক্রিয় সিঙ্ক এখানে লগ হয় না।",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV সার্ভার থেকে {{n}}টি বই মুছে ফেলবেন?\n\nএটি শুধু রিমোট ফাইল মুছে; আপনার স্থানীয় লাইব্রেরি অপরিবর্তিত থাকে। মুছে ফেলা পূর্বাবস্থায় ফেরানো যাবে না। সার্ভারের ডেটা স্থায়ীভাবে চলে যাবে।",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "আপনার অন্যান্য ডিভাইসে বইয়ের ফাইল আপলোড করে।",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "ভুল সিঙ্ক পাসফ্রেজ। সিঙ্ক করা ক্রেডেনশিয়াল ডিক্রিপ্ট করা যায়নি।",
|
||||
"Email books straight to your library": "ইমেইলের মাধ্যমে সরাসরি বই আপনার লাইব্রেরিতে পাঠান",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "অ্যাটাচমেন্ট এবং নিবন্ধগুলি আপনার ব্যক্তিগত Readest ঠিকানায় ফরওয়ার্ড করুন। Plus, Pro এবং Lifetime প্ল্যানে উপলব্ধ।",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "পড়ার অগ্রগতি, নোট এবং বুকমার্কও মুছে ফেলে।",
|
||||
"Background Image (Library)": "ব্যাকগ্রাউন্ড ছবি (লাইব্রেরি)",
|
||||
"Background Image (Reader)": "ব্যাকগ্রাউন্ড ছবি (রিডার)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}}টি বইয়ের মেটাডেটা আপডেট হয়েছে",
|
||||
"{{n}} metadata": "{{n}} মেটাডেটা",
|
||||
"Metadata updated": "মেটাডেটা আপডেট হয়েছে",
|
||||
"Filter": "ফিল্টার",
|
||||
"Sort by": "অনুসারে সাজান",
|
||||
"Date modified": "পরিবর্তনের তারিখ",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "সূক্ষ্মতা",
|
||||
"Refresh Page": "পৃষ্ঠা রিফ্রেশ করুন",
|
||||
"Recently read": "সম্প্রতি পড়া",
|
||||
"Show recently read": "সম্প্রতি পড়া দেখান"
|
||||
"Show recently read": "সম্প্রতি পড়া দেখান",
|
||||
"Find:": "খুঁজুন:",
|
||||
"Enable rule": "নিয়ম সক্রিয় করুন",
|
||||
"Disable rule": "নিয়ম নিষ্ক্রিয় করুন",
|
||||
"Progress Read": "পড়ার অগ্রগতি",
|
||||
"Auto-import new books from this folder": "এই ফোল্ডার থেকে নতুন বই স্বয়ংক্রিয়ভাবে আমদানি করুন",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "এই ফোল্ডারে নতুন বই যোগ করা হলে, পরের বার Readest খুললে বা সামনে ফিরে এলে সেগুলি স্বয়ংক্রিয়ভাবে আমদানি করা হবে।",
|
||||
"Reading aloud": "উচ্চস্বরে পড়া হচ্ছে",
|
||||
"Open Book": "বই খুলুন",
|
||||
"Stop reading aloud": "উচ্চস্বরে পড়া বন্ধ করুন",
|
||||
"Enter at least two words": "কমপক্ষে দুটি শব্দ লিখুন",
|
||||
"Search failed": "অনুসন্ধান ব্যর্থ হয়েছে",
|
||||
"Search with regex": "রেগুলার এক্সপ্রেশন দিয়ে খুঁজুন",
|
||||
"Words to find near each other": "একে অপরের কাছাকাছি খোঁজার শব্দ",
|
||||
"Contains": "অন্তর্ভুক্ত",
|
||||
"Whole Words": "পূর্ণ শব্দ",
|
||||
"Regular Expression": "রেগুলার এক্সপ্রেশন",
|
||||
"Nearby Words": "কাছাকাছি শব্দ",
|
||||
"Within N words": "N শব্দের মধ্যে",
|
||||
"Not for regex": "রেগুলার এক্সপ্রেশনের জন্য নয়",
|
||||
"No results found": "কোনো ফলাফল পাওয়া যায়নি",
|
||||
"{{count}} results_one": "{{count}}টি ফলাফল",
|
||||
"{{count}} results_other": "{{count}}টি ফলাফল",
|
||||
"Failed to seek": "নির্দিষ্ট অবস্থানে যাওয়া যায়নি",
|
||||
"Chapter progress": "অধ্যায়ের অগ্রগতি",
|
||||
"{{elapsed}} of {{total}}": "{{total}} এর মধ্যে {{elapsed}}",
|
||||
"Decrease Contrast": "কন্ট্রাস্ট কমান",
|
||||
"Reset Contrast": "কন্ট্রাস্ট রিসেট করুন",
|
||||
"Increase Contrast": "কন্ট্রাস্ট বাড়ান",
|
||||
"Push": "পুশ",
|
||||
"Slide": "স্লাইড",
|
||||
"Page Curl": "পেজ কার্ল",
|
||||
"Animation Style": "অ্যানিমেশন শৈলী",
|
||||
"Appearance": "চেহারা",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "পড়ার ভিউ থেকে স্বাধীনভাবে অভিধানের ফলাফলের টেক্সটের আকার নির্ধারণ করে।",
|
||||
"Authentication failed. Reconnect in Settings.": "প্রমাণীকরণ ব্যর্থ হয়েছে। সেটিংসে পুনরায় সংযোগ করুন।",
|
||||
"Full Sync": "সম্পূর্ণ সিঙ্ক",
|
||||
"Waiting for sign-in…": "সাইন ইনের জন্য অপেক্ষা করা হচ্ছে…",
|
||||
"Reconnect": "পুনরায় সংযোগ করুন",
|
||||
"Connected as {{account}}": "{{account}} হিসেবে সংযুক্ত",
|
||||
". Make Google Drive the active cloud provider.": "। Google Drive-কে সক্রিয় ক্লাউড প্রদানকারী করুন।",
|
||||
"Use Google Drive": "Google Drive ব্যবহার করুন",
|
||||
"Sign-in opens in your browser.": "সাইন ইন আপনার ব্রাউজারে খুলবে।",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest শুধুমাত্র আপনার Drive-এ নিজে তৈরি করা ফাইলগুলিতেই প্রবেশ করে।",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি একটি WebDAV সার্ভারের সাথে সিঙ্ক করুন।",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি আপনার Google Drive-এর সাথে সিঙ্ক করুন।",
|
||||
"Configured": "কনফিগার করা হয়েছে",
|
||||
"Use WebDAV": "WebDAV ব্যবহার করুন",
|
||||
"Cloud Sync": "ক্লাউড সিঙ্ক",
|
||||
"Extra Large": "অতিরিক্ত বড়",
|
||||
"Hint size": "ইঙ্গিতের আকার",
|
||||
"Gloss text size above the word": "শব্দের উপরে ইঙ্গিত টেক্সটের আকার",
|
||||
"Hint color": "ইঙ্গিতের রং",
|
||||
"Adjust Text Selection": "টেক্সট নির্বাচন সামঞ্জস্য করুন",
|
||||
"Your books will appear here": "আপনার বইগুলি এখানে দেখা যাবে",
|
||||
"Reading aloud continues in the background": "উচ্চস্বরে পড়া ব্যাকগ্রাউন্ডে চলতে থাকবে",
|
||||
"Stopped reading aloud": "উচ্চস্বরে পড়া বন্ধ করা হয়েছে",
|
||||
"Read aloud stopped": "উচ্চস্বরে পড়া বন্ধ হয়েছে",
|
||||
"Cloud provider switched": "ক্লাউড প্রদানকারী পরিবর্তিত হয়েছে",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} সিঙ্ক নির্বাচিত থাকাকালীন Readest Cloud-এ আপলোড স্থগিত থাকে",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} আপনার ক্লাউড সিঙ্ক প্রদানকারী থাকাকালীন এটি {{provider}} দ্বারা পরিচালিত হয়",
|
||||
"Not signed in": "সাইন ইন করা হয়নি",
|
||||
"Paused — plan required": "স্থগিত — প্ল্যান প্রয়োজন",
|
||||
"Active · Book file uploads off": "সক্রিয় · বইয়ের ফাইল আপলোড বন্ধ",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "অ্যাপ সেটিংস, পড়ার পরিসংখ্যান এবং অভিধান সাইন ইন থাকাকালীন আপনার Readest অ্যাকাউন্টের মাধ্যমে সিঙ্ক হতে থাকে।",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি Readest Cloud-এর সাথে সিঙ্ক করুন।",
|
||||
"Account and Storage": "অ্যাকাউন্ট এবং স্টোরেজ",
|
||||
"Manage your plan and stored files": "আপনার প্ল্যান এবং সংরক্ষিত ফাইল পরিচালনা করুন",
|
||||
"Cloud sync provider": "ক্লাউড সিঙ্ক প্রদানকারী",
|
||||
"Use Readest Cloud": "Readest Cloud ব্যবহার করুন",
|
||||
"Another device is still syncing this library via Readest Cloud": "অন্য একটি ডিভাইস এখনও Readest Cloud-এর মাধ্যমে এই লাইব্রেরি সিঙ্ক করছে",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}}টি আপলোড ব্যর্থ: অপর্যাপ্ত স্টোরেজ কোটা",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}টি আপলোড ব্যর্থ: অপর্যাপ্ত স্টোরেজ কোটা",
|
||||
"Library sync via {{provider}}": "{{provider}} এর মাধ্যমে লাইব্রেরি সিঙ্ক",
|
||||
"Google Drive session expired": "Google Drive সেশনের মেয়াদ শেষ হয়েছে",
|
||||
"Cloud sync session expired": "ক্লাউড সিঙ্ক সেশনের মেয়াদ শেষ হয়েছে",
|
||||
"Uploads book files to your other devices": "আপনার অন্যান্য ডিভাইসে বইয়ের ফাইল আপলোড করে",
|
||||
"Re-check every book instead of only changed ones": "শুধু পরিবর্তিত নয়, প্রতিটি বই আবার যাচাই করুন",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "বাকেট পাওয়া যায়নি",
|
||||
"Endpoint": "এন্ডপয়েন্ট",
|
||||
"Bucket": "বাকেট",
|
||||
"Region": "রিজিয়ন",
|
||||
"Access Key ID": "অ্যাক্সেস কী ID",
|
||||
"Your Access Key ID": "আপনার অ্যাক্সেস কী ID",
|
||||
"Secret Access Key": "সিক্রেট অ্যাক্সেস কী",
|
||||
"Your Secret Access Key": "আপনার সিক্রেট অ্যাক্সেস কী",
|
||||
"S3-Compatible Storage": "S3-সামঞ্জস্যপূর্ণ স্টোরেজ",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2, AWS S3 বা MinIO-এর মতো S3-সামঞ্জস্যপূর্ণ বাকেটের সাথে আপনার লাইব্রেরি, পড়ার অগ্রগতি ও হাইলাইট সিঙ্ক করুন।",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "ব্রাউজারে ব্যবহারের জন্য বাকেটের CORS নীতিতে এই সাইটের অরিজিন অনুমোদিত হতে হবে।",
|
||||
"Use S3": "S3 ব্যবহার করুন",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "সংযোগের আগে নিশ্চিত করুন যে বাকেটটি বিদ্যমান এবং শংসাপত্রগুলির পড়া/লেখার অনুমতি আছে।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} নির্বাচিত থাকাকালীন বই, অগ্রগতি ও টীকা শুধুমাত্র আপনার সার্ভারে সিঙ্ক হয়।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} নির্বাচিত থাকাকালীন বই, অগ্রগতি ও টীকা শুধুমাত্র আপনার Drive-এ সিঙ্ক হয়।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} নির্বাচিত থাকাকালীন বই, অগ্রগতি ও টীকা শুধুমাত্র আপনার বাকেটে সিঙ্ক হয়।",
|
||||
"Premium": "প্রিমিয়াম",
|
||||
"S3 Storage": "S3 স্টোরেজ",
|
||||
"Speed": "গতি",
|
||||
"{{time}} left in chapter": "অধ্যায়ে {{time}} বাকি",
|
||||
"Open Read Aloud player": "জোরে পড়ার প্লেয়ার খুলুন",
|
||||
"Read Aloud": "জোরে পড়ুন",
|
||||
"Voice": "কণ্ঠস্বর",
|
||||
"Sleep Timer": "স্লিপ টাইমার",
|
||||
"Slower": "ধীর",
|
||||
"Faster": "দ্রুত",
|
||||
"Exit Auto Scroll": "স্বয়ংক্রিয় স্ক্রল থেকে প্রস্থান",
|
||||
"Auto Scroll": "স্বয়ংক্রিয় স্ক্রল",
|
||||
"End of book": "বইয়ের শেষ",
|
||||
"Toggle Auto Scroll": "স্বয়ংক্রিয় স্ক্রল টগল করুন"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "རྩོམ་སྒྲིག",
|
||||
"Excerpts": "དྲངས་བཏུས།",
|
||||
"Failed to import book(s): {{filenames}}": "དཔེ་དེབ་ནང་འདྲེན་བྱས་མ་ཐུབ། {{filenames}}",
|
||||
"Fast": "མགྱོགས་པོ།",
|
||||
"Font": "ཡིག་གཟུགས།",
|
||||
"Font & Layout": "ཡིག་གཟུགས་དང་བཀོད་སྒྲིག",
|
||||
"Font Face": "ཡིག་གཟུགས་ཀྱི་རྣམ་པ།",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}} ནང་བསྐྱོད་བྱས་ཟིན།",
|
||||
"Match Case": "ཡི་གེ་ཆེ་ཆུང་གི་དོ་མཚུངས།",
|
||||
"Match Diacritics": "སྒྲ་གདངས་ཀྱི་དོ་མཚུངས།",
|
||||
"Match Whole Words": "ཚིག་བྱང་ཆ་ཚང་གི་དོ་མཚུངས།",
|
||||
"Maximum Number of Columns": "གྲལ་ཐིག་གི་གྲངས་ཀ།",
|
||||
"Minimum Font Size": "ཡིག་ཆུང་ཤོས།",
|
||||
"Monospace Font": "རྒྱ་ཁྱོན་འདྲ་བའི་ཡིག་གཟུགས།",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "ནང་བསྐྱོད།",
|
||||
"Sign Out": "ཕྱིར་བུད།",
|
||||
"Sky": "མཁའ་དཀར།",
|
||||
"Slow": "དལ་བ།",
|
||||
"Solarized": "ཉི་འོད།",
|
||||
"Speak": "སྒྲ་ཀློག",
|
||||
"Subjects": "བརྗོད་བྱ།",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "མཉམ་དུ་ཀློག་འཛུལ་བྱས་མ་ཐུབ།",
|
||||
"Advanced Settings": "དབང་བསྐྱོད་སྒྲིག་སྟངས།",
|
||||
"File count: {{size}}": "དེབ་གནས་བཅས་པའི་ཨང་། {{size}}",
|
||||
"Background Read Aloud": "གནས་སྟངས་ཀྱིས་ཀློག་བྱེད།",
|
||||
"Ready to read aloud": "དེབ་ཀྱི་སྤྱོད་བྱས་མ་ཐུབ།",
|
||||
"Read Aloud": "ཀློག་བྱེད།",
|
||||
"Screen Brightness": "རྒྱབ་སྐོར་གྱི་འོད་ཟེར།",
|
||||
"Background Image": "གནས་སྟངས་ཀྱི་རི་མོ།",
|
||||
"Import Image": "དེབ་གནས་བཅས་པའི་སྤྱོད་བྱས་མ་ཐུབ།",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "ཕྱིར་འདོན།",
|
||||
"Set Timeout": "དུས་ཚོད་སྒྲིག་པ།",
|
||||
"Select Voice": "སྐད་གདངས་འདེམས།",
|
||||
"Toggle Sticky Bottom TTS Bar": "TTS སྡོམ་ཐིག་བརྗེ་བ།",
|
||||
"Display what I'm reading on Discord": "Discord ཐོག་ཀློག་བཞིན་པའི་དཔེ་ཆ་སྟོན།",
|
||||
"Show on Discord": "Discord ཐོག་སྟོན།",
|
||||
"Instant {{action}}": "འཕྲལ་མར་{{action}}",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV ངོ་སྤྲོད་མ་ཐུབ། སྒྲིག་སྡོད་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
|
||||
"Downloading": "ཕབ་ལེན།",
|
||||
"Uploading": "ཡར་འགོད།",
|
||||
"downloaded {{n}} book(s)": "དཔེ་ཆ་{{n}}་ཕབ་ལེན་བྱས།",
|
||||
"pushed {{n}} config(s)": "སྒྲིག་གཞི་{{n}}་སྐུར་སོང་།",
|
||||
"uploaded {{n}} new file(s)": "ཡིག་ཆ་གསར་པ་{{n}}་ཡར་འགོད་བྱས།",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "མཉམ་སྦྲེལ་མ་ཐུབ་པ་{{failed}}་དང་བཅས་ཚར་སོང་། ཐུབ་པ་{{ok}}།",
|
||||
"Sync complete": "མཉམ་སྦྲེལ་ཚར་སོང་།",
|
||||
"Everything is already up to date.": "ཆ་ཚང་ཧ་ཅང་གསར་བ་ཡིན།",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} གི་ {{path}} ལ་བལྟ་བཞིན།",
|
||||
"Connect to a WebDAV server to browse your remote files.": "རྒྱང་རིང་གི་ཡིག་ཆ་བལྟ་བར WebDAV རིམ་པ་ཟུང་འབྲེལ་ལ་འབྲེལ་མཐུད་གནང་།",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "དཔེ་ཆའི་ཡིག་ཆ་ཡར་འགོད།",
|
||||
"Sync now": "ད་ལྟ་མཉམ་སྦྲེལ།",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "གསང་ཨང་མངོན་པ།",
|
||||
"Root Directory": "རྩ་བའི་སྡེ་ཚན།",
|
||||
"Syncing…": "མཉམ་སྦྲེལ་བྱེད་བཞིན…",
|
||||
"pulled progress for {{n}} book(s)": "དཔེ་ཆ་{{n}}་གི་འཐུས་གཤམ་འཐེན།",
|
||||
"Sync History": "མཉམ་སྦྲེལ་ལོ་རྒྱུས།",
|
||||
"Clear Sync History": "མཉམ་སྦྲེལ་ལོ་རྒྱུས་གཙང་འཕྱག",
|
||||
"No manual syncs yet": "ལག་འཁྱེར་མཉམ་སྦྲེལ་མེད།",
|
||||
"Partial": "ཕྱོགས་ཙམ།",
|
||||
"Cleanup": "གཙང་སྦྲ།",
|
||||
"Cleanup failed": "གཙང་སྦྲ་མ་ཐུབ།",
|
||||
"Sync failed": "མཉམ་སྦྲེལ་མ་ཐུབ།",
|
||||
"{{n}} deleted": "{{n}} བསུབ་སོང་།",
|
||||
"{{n}} failed": "{{n}} མ་ཐུབ།",
|
||||
"Nothing deleted": "གང་ཡང་མ་སུབ།",
|
||||
"{{n}} downloaded": "{{n}} ཕབ་ལེན།",
|
||||
"{{n}} uploaded": "{{n}} ཡར་འགོད།",
|
||||
"{{n}} progress": "{{n}} མཐུན་འགྲོ།",
|
||||
"Up to date": "གསར་བ་ཡིན།",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "ཕབ་ལེན་བྱས་པའི་དཔེ་ཆ།",
|
||||
"Files uploaded": "ཡར་འགོད་བྱས་པའི་ཡིག་ཆ།",
|
||||
"Configs uploaded": "ཡར་འགོད་བྱས་པའི་སྒྲིག་གཞི།",
|
||||
"Configs downloaded": "ཕབ་ལེན་བྱས་པའི་སྒྲིག་གཞི།",
|
||||
"Covers uploaded": "ཡར་འགོད་བྱས་པའི་ཕྱི་ཤོག",
|
||||
"Books deleted": "བསུབ་པའི་དཔེ་ཆ།",
|
||||
"Files in sync": "མཉམ་སྦྲེལ་ལ་ཡོད་པའི་ཡིག་ཆ།",
|
||||
"Failures": "མ་ཐུབ་པ།",
|
||||
"Total books": "དཔེ་ཆའི་སྡོམ།",
|
||||
"Error:": "ནོར་འཁྲུལ:",
|
||||
"Failed books": "མ་ཐུབ་པའི་དཔེ་ཆ།",
|
||||
"Deleted {{n}} book(s) from server.": "རིམ་པ་ཟུང་འབྲེལ་ནས་དཔེ་ཆ་{{n}}་སུབ་པ།",
|
||||
"Failed to load directory": "སྡེ་ཚན་འདྲེན་མ་ཐུབ།",
|
||||
"File download is only supported on the desktop and mobile apps.": "ཡིག་ཆ་ཕབ་ལེན་ནི་ཀམ་པུ་ཊར་དང་ཁ་པར་གྱི་ཉེར་སྤྱོད་ཁོ་ནར་རྒྱབ་སྐྱོར་ཡོད།",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ཁྱེད་ཀློག་བཞིན་པའི་ཡིག་རྩོམ་དེ་དཔེ་མཛོད་དུ་སྐུར་བར་ Readest བརྡ་འགྲེམ་སྣོན་ལྡེ་སྒྲིག་འཛུགས་གནང་། འདིས་གསལ་ཤོག་ཁྱེད་ཀྱི་བརྡ་འགྲེམ་ནས་འདྲ་ཟློས་བྱས་ནས་སྦུག་ཁ་དང་ཐོ་འགོད་དགོས་པའི་གནས་ཚུལ་ཡང་ལས་ཀ་བྱེད་ཐུབ།",
|
||||
"Added to your library. It will sync to your other devices.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དུ་བསྣན། འདི་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་དག་ལ་མཉམ་སྦྲེལ་འགྱུར།",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "མཉམ་སྦྲེལ་གསང་ཨང་བརྗེད་སོང་། གསང་སྦས་བྱས་པའི་ཁོངས་གཙང་འཕྱག་བྱས་ཟིན།",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "ལག་འཁྱེར་མཉམ་སྦྲེལ་དང་གཙང་སྦྲ་ཁོ་ན། ཀློག་སྐབས་ཀྱི་རང་འགུལ་མཉམ་སྦྲེལ་འདིར་ཐོ་འགོད་མི་བྱེད།",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV རིམ་པ་ཟུང་འབྲེལ་ནས་དཔེ་ཆ་{{n}}་སུབ་དགོས་སམ?\n\nའདིས་རྒྱང་རིང་གི་ཡིག་ཆ་ཁོ་ན་སུབ་པ་ཡིན། ཁྱེད་ཀྱི་ས་གནས་དཔེ་མཛོད་ལ་གནོད་མི་འགྱུར། སུབ་པ་འདི་ཕྱིར་ལོག་མི་ཐུབ། རིམ་པ་ཟུང་འབྲེལ་གྱི་ཟིན་བྲིས་གཏན་ནས་མེད་པར་འགྱུར།",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "དཔེ་ཆའི་ཡིག་ཆ་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་པར་ཡར་འགོད་བྱེད།",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "མཉམ་སྦྲེལ་གསང་ཨང་ནོར་འདུག། མཉམ་སྦྲེལ་བྱས་པའི་ངོ་སྤྲོད་ཀྱི་གསང་སྒྲིག་འགྲོལ་མ་ཐུབ།",
|
||||
"Email books straight to your library": "གློག་འཕྲིན་གྱིས་དཔེ་ཆ་ཁྱེད་ཀྱི་དཔེ་མཛོད་དུ་ཐད་ཀར་སྐུར།",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "མཉམ་སྦྱར་དང་ཡིག་རྩོམ་ཁྱེད་ཀྱི་སྒེར་གྱི་ Readest ས་གནས་སུ་གཏོང་། Plus, Pro, Lifetime འཆར་གཞི་ལ་ཐོབ་པ།",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "ཀློག་པའི་ཡར་འཕེལ་དང་། ཟིན་བྲིས། དཔེ་རྟགས་བཅས་ཀྱང་སུབ་པ།",
|
||||
"Background Image (Library)": "གནས་སྟངས་ཀྱི་རི་མོ། (དེབ་མཛོད།)",
|
||||
"Background Image (Reader)": "གནས་སྟངས་ཀྱི་རི་མོ། (ཀློག་ངོས།)",
|
||||
"updated metadata for {{n}} book(s)": "དཔེ་ཆ་{{n}}་ཡི་གནད་སྨིན་གོ་དོན་གསར་བསྒྱུར་བྱས།",
|
||||
"{{n}} metadata": "{{n}} གནད་སྨིན་གོ་དོན།",
|
||||
"Metadata updated": "གནད་སྨིན་གོ་དོན་གསར་བསྒྱུར་བྱས།",
|
||||
"Filter Annotations": "མཆན་འདེམས་སྒྲིག",
|
||||
"Colors": "ཁ་དོག",
|
||||
"Styles": "རྣམ་པ",
|
||||
@@ -1770,5 +1726,119 @@
|
||||
"Granularity": "ཞིབ་ཕྲའི་ཚད",
|
||||
"Refresh Page": "ཤོག་ལྷེ་བསྐྱར་གསོ།",
|
||||
"Recently read": "ཉེ་ཆར་བཀླགས་པ།",
|
||||
"Show recently read": "ཉེ་ཆར་བཀླགས་པ་སྟོན་པ།"
|
||||
"Show recently read": "ཉེ་ཆར་བཀླགས་པ་སྟོན་པ།",
|
||||
"Find:": "འཚོལ་བཤེར།:",
|
||||
"Enable rule": "སྲིད་སྒྲིག་སྤྱོད་པ།",
|
||||
"Disable rule": "སྲིད་སྒྲིག་སྒོ་བརྒྱབ།",
|
||||
"Progress Read": "ཀློག་པའི་ཡར་འཕེལ།",
|
||||
"Auto-import new books from this folder": "ཡིག་སྣོད་འདིའི་ནང་གི་དཔེ་དེབ་གསར་པ་རང་འགུལ་ནང་འདྲེན་བྱེད།",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "ཡིག་སྣོད་འདིའི་ནང་དཔེ་དེབ་གསར་པ་ཁ་སྣོན་བྱས་ཚེ། ཐེངས་རྗེས་མར་ Readest ཁ་ཕྱེ་བའམ་མདུན་ངོས་སུ་ཕྱིར་ལོག་སྐབས་རང་འགུལ་གྱིས་ནང་འདྲེན་བྱེད།",
|
||||
"Reading aloud": "སྒྲ་ཀློག་བྱེད་བཞིན་པ།",
|
||||
"Open Book": "དཔེ་དེབ་ཁ་ཕྱེ་བ།",
|
||||
"Stop reading aloud": "སྒྲ་ཀློག་མཚམས་འཇོག",
|
||||
"Enter at least two words": "ཉུང་མཐར་ཚིག་གཉིས་ནང་འཇུག་བྱེད་རོགས།",
|
||||
"Search failed": "འཚོལ་བཤེར་མ་ཐུབ།",
|
||||
"Search with regex": "Regex བེད་སྤྱད་ནས་འཚོལ་བཤེར་བྱེད།",
|
||||
"Words to find near each other": "ཕན་ཚུན་ཉེ་སར་འཚོལ་བྱའི་ཚིག་རྣམས།",
|
||||
"Contains": "འདུས་པ།",
|
||||
"Whole Words": "ཚིག་བྱང་ཆ་ཚང་།",
|
||||
"Regular Expression": "Regex",
|
||||
"Nearby Words": "ཉེ་འཁོར་གྱི་ཚིག",
|
||||
"Within N words": "ཚིག N ནང་ཚུན།",
|
||||
"Not for regex": "Regex ལ་མི་སྤྱོད།",
|
||||
"No results found": "འབྲས་བུ་མ་རྙེད།",
|
||||
"{{count}} results_other": "འབྲས་བུ་ {{count}}།",
|
||||
"Failed to seek": "མཆོང་སྐྱོད་བྱེད་མ་ཐུབ།",
|
||||
"Chapter progress": "ལེའུའི་འཕེལ་རིམ།",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "བསྡུར་ཚད་ཆུང་དུ་གཏོང་།",
|
||||
"Reset Contrast": "བསྡུར་ཚད་བསྐྱར་སྒྲིག",
|
||||
"Increase Contrast": "བསྡུར་ཚད་ཆེ་རུ་གཏོང་།",
|
||||
"Push": "འདེད་པ།",
|
||||
"Slide": "བཤུད་པ།",
|
||||
"Page Curl": "ཤོག་ལྷེ་སྒྲིལ་བ།",
|
||||
"Animation Style": "འགུལ་རིས་ཀྱི་རྣམ་པ།",
|
||||
"Appearance": "ཕྱི་རྣམ།",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "ཚིག་མཛོད་ཀྱི་འབྲས་བུའི་ཡི་གེའི་ཆེ་ཆུང་སྒྲིག་པ་དང་། ཀློག་པའི་ངོས་དང་འབྲེལ་བ་མེད།",
|
||||
"Authentication failed. Reconnect in Settings.": "ངོ་སྤྲོད་མ་ཐུབ། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།",
|
||||
"Full Sync": "ཡོངས་རྫོགས་མཉམ་སྒྲིག",
|
||||
"Waiting for sign-in…": "ནང་བསྐྱོད་ལ་སྒུག་བཞིན་པ།…",
|
||||
"Reconnect": "ཡང་བསྐྱར་འབྲེལ་མཐུད།",
|
||||
"Connected as {{account}}": "{{account}} ཐོག་ནས་འབྲེལ་མཐུད་ཟིན།",
|
||||
". Make Google Drive the active cloud provider.": "། Google Drive དེ་སྤྱོད་བཞིན་པའི་སྤྲིན་ཞབས་ཞུ་མཁོ་སྤྲོད་པར་སྒྲིག་པ།",
|
||||
"Use Google Drive": "Google Drive བེད་སྤྱོད།",
|
||||
"Sign-in opens in your browser.": "ནང་བསྐྱོད་ཁྱེད་ཀྱི་བརྡར་ཞིབ་ཆས་ནང་ཁ་ཕྱེ་ངེས།",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest ཀྱིས་ཁྱེད་ཀྱི་ Drive ནང་རང་ཉིད་ཀྱིས་བཟོས་པའི་ཡིག་ཆ་ཁོ་ནར་ལྟ་སྤྱོད་བྱེད།",
|
||||
"Filter": "འཚག་འདེམས།",
|
||||
"Sort by": "རིམ་སྒྲིག་བྱེད་སྟངས།",
|
||||
"Date modified": "བཟོ་བཅོས་ཚེས་གྲངས།",
|
||||
"Date created": "གསར་བཟོའི་ཚེས་གྲངས།",
|
||||
"Sort ascending": "འཕར་རིམ་གྱིས་རིམ་སྒྲིག",
|
||||
"Sort descending": "འཕྲི་རིམ་གྱིས་རིམ་སྒྲིག",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ WebDAV ཞབས་ཞུ་འཕྲུལ་ཆས་དང་མཉམ་སྒྲིག་བྱེད།",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ཁྱེད་ཀྱི་ Google Drive དང་མཉམ་སྒྲིག་བྱེད།",
|
||||
"Configured": "བཀོད་སྒྲིག་ཟིན།",
|
||||
"Use WebDAV": "WebDAV བེད་སྤྱོད།",
|
||||
"Cloud Sync": "སྤྲིན་མཉམ་སྒྲིག",
|
||||
"Extra Large": "ཧ་ཅང་ཆེ་བ།",
|
||||
"Hint size": "བརྡ་སྟོན་གྱི་ཆེ་ཆུང་།",
|
||||
"Gloss text size above the word": "ཚིག་གི་སྟེང་གི་བརྡ་སྟོན་ཡི་གེའི་ཆེ་ཆུང་།",
|
||||
"Hint color": "བརྡ་སྟོན་གྱི་ཚོན་མདོག",
|
||||
"Adjust Text Selection": "ཡི་གེ་འདེམས་པ་སྙོམ་སྒྲིག",
|
||||
"Your books will appear here": "ཁྱེད་ཀྱི་དཔེ་དེབ་འདིར་མངོན་ངེས།",
|
||||
"Reading aloud continues in the background": "སྒྲ་ཀློག་རྒྱབ་ལྗོངས་སུ་མུ་མཐུད་འགྲོ་བཞིན་ཡོད།",
|
||||
"Stopped reading aloud": "སྒྲ་ཀློག་མཚམས་བཞག་ཟིན།",
|
||||
"Read aloud stopped": "སྒྲ་ཀློག་མཚམས་ཆད་ཟིན།",
|
||||
"Cloud provider switched": "སྤྲིན་གྱི་ཞབས་ཞུ་བ་བརྗེས་ཟིན།",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} མཉམ་སྒྲིག་འདེམས་ཡོད་རིང་ Readest Cloud ལ་ཡར་འགོད་མཚམས་འཇོག་ཡིན།",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} ཁྱེད་ཀྱི་སྤྲིན་མཉམ་སྒྲིག་ཞབས་ཞུ་བ་ཡིན་རིང་དེས་དོ་དམ་བྱེད།",
|
||||
"Not signed in": "ནང་འཛུལ་བྱས་མེད།",
|
||||
"Paused — plan required": "མཚམས་བཞག་པ་ — འཆར་གཞི་དགོས།",
|
||||
"Active · Book file uploads off": "བྱེད་བཞིན་པ་ · དཔེ་ཆའི་ཡིག་ཆ་ཡར་འགོད་སྒོ་བརྒྱབ།",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "ནང་འཛུལ་བྱས་ཡོད་རིང་ མཉེན་ཆས་སྒྲིག་འགོད་དང་ཀློག་པའི་སྡོམ་རྩིས། ཚིག་མཛོད་བཅས་ད་དུང་ Readest རྩིས་ཐོ་བརྒྱུད་ནས་མཉམ་སྒྲིག་བྱེད།",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ Readest Cloud དང་མཉམ་སྒྲིག་བྱེད།",
|
||||
"Account and Storage": "རྩིས་ཐོ་དང་ཉར་ཚགས།",
|
||||
"Manage your plan and stored files": "ཁྱེད་ཀྱི་འཆར་གཞི་དང་ཉར་བའི་ཡིག་ཆ་དོ་དམ་བྱེད།",
|
||||
"Cloud sync provider": "སྤྲིན་མཉམ་སྒྲིག་ཞབས་ཞུ་བ།",
|
||||
"Use Readest Cloud": "Readest Cloud བེད་སྤྱོད་བྱེད།",
|
||||
"Another device is still syncing this library via Readest Cloud": "སྒྲིག་ཆས་གཞན་ཞིག་གིས་ད་དུང་ Readest Cloud བརྒྱུད་ནས་དཔེ་མཛོད་འདི་མཉམ་སྒྲིག་བྱེད་བཞིན་འདུག",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "ཡར་འགོད་ {{count}} མ་ཐུབ། སྤྲི་དོན་གྱི་ཉར་ཚགས་ས་ཁོངས་མི་འདང་།",
|
||||
"Library sync via {{provider}}": "{{provider}} བརྒྱུད་ནས་དཔེ་མཛོད་མཉམ་སྒྲིག",
|
||||
"Google Drive session expired": "Google Drive ཡི་ཐེངས་གྲངས་ཀྱི་དུས་ཡོལ་སོང་",
|
||||
"Cloud sync session expired": "སྤྲིན་གྱི་མཉམ་སྒྲིག་ཐེངས་གྲངས་ཀྱི་དུས་ཡོལ་སོང་",
|
||||
"Uploads book files to your other devices": "དཔེ་ཆའི་ཡིག་ཆ་ཁྱེད་ཀྱི་སྒྲིག་ཆས་གཞན་ལ་ཡར་འཇུག་བྱེད",
|
||||
"Re-check every book instead of only changed ones": "བསྒྱུར་བཅོས་བྱས་པ་ཁོ་ན་མིན་པར་དཔེ་ཆ་རེ་རེ་ཡང་བསྐྱར་ཞིབ་བཤེར",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket རྙེད་མ་སོང་།",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "ས་ཁུལ།",
|
||||
"Access Key ID": "Access Key ID",
|
||||
"Your Access Key ID": "ཁྱེད་ཀྱི་ Access Key ID",
|
||||
"Secret Access Key": "Secret Access Key",
|
||||
"Your Secret Access Key": "ཁྱེད་ཀྱི་ Secret Access Key",
|
||||
"S3-Compatible Storage": "S3 དང་མཐུན་པའི་གསོག་མཛོད།",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2 དང་ AWS S3, MinIO ལྟ་བུའི་ S3 དང་མཐུན་པའི་ bucket དང་མཉམ་དུ་ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་ཀློག་པའི་བགྲོད་རིམ། གསལ་མཚམས་བཅས་མཉམ་བསྒྲིག་བྱེད།",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "བཤར་ཆས་ནང་དུ། bucket གི་ CORS སྲིད་ཇུས་ཀྱིས་དྲ་ཚིགས་འདིའི་ origin ལ་ཆོག་མཆན་སྤྲོད་དགོས།",
|
||||
"Use S3": "S3 བེད་སྤྱོད།",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "སྦྲེལ་མཐུད་མ་བྱས་གོང་ bucket ཡོད་པ་དང་ credentials ལ་ཀློག་འབྲི་དབང་ཚད་ཡོད་པ་གཏན་འཁེལ་བྱེད།",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} བདམས་ཡོད་སྐབས། དཔེ་ཆ་དང་བགྲོད་རིམ། མཆན་འགྲེལ་བཅས་ཁྱེད་ཀྱི་ server ནང་ཁོ་ནར་མཉམ་བསྒྲིག་བྱེད།",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} བདམས་ཡོད་སྐབས། དཔེ་ཆ་དང་བགྲོད་རིམ། མཆན་འགྲེལ་བཅས་ཁྱེད་ཀྱི་ Drive ནང་ཁོ་ནར་མཉམ་བསྒྲིག་བྱེད།",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} བདམས་ཡོད་སྐབས། དཔེ་ཆ་དང་བགྲོད་རིམ། མཆན་འགྲེལ་བཅས་ཁྱེད་ཀྱི་ bucket ནང་ཁོ་ནར་མཉམ་བསྒྲིག་བྱེད།",
|
||||
"Premium": "སྤུས་ལྡན།",
|
||||
"S3 Storage": "S3 གསོག་མཛོད།",
|
||||
"Speed": "མྱུར་ཚད།",
|
||||
"{{time}} left in chapter": "ལེའུ་འདིར་ {{time}} ལྷག་ཡོད།",
|
||||
"Open Read Aloud player": "སྐད་སྒྲས་ཀློག་པའི་གཏོང་ཆས་ཁ་ཕྱེ།",
|
||||
"Read Aloud": "སྐད་སྒྲས་ཀློག་པ།",
|
||||
"Voice": "སྐད་སྒྲ།",
|
||||
"Sleep Timer": "གཉིད་ཀྱི་དུས་ཚོད།",
|
||||
"Slower": "འགོར་བ།",
|
||||
"Faster": "མྱུར་བ།",
|
||||
"Exit Auto Scroll": "རང་འགུལ་འཁོར་རྒྱུག་མཚམས་འཇོག",
|
||||
"Auto Scroll": "རང་འགུལ་འཁོར་རྒྱུག",
|
||||
"End of book": "དཔེ་དེབ་ཀྱི་མཇུག་མཐའ།",
|
||||
"Toggle Auto Scroll": "རང་འགུལ་འཁོར་རྒྱུག་བརྗེ་བ།"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Bearbeiten",
|
||||
"Excerpts": "Auszüge",
|
||||
"Failed to import book(s): {{filenames}}": "Fehler beim Importieren von Buch/Büchern: {{filenames}}",
|
||||
"Fast": "Schnell",
|
||||
"Font": "Schriftart",
|
||||
"Font & Layout": "Schrift & Layout",
|
||||
"Font Face": "Schriftschnitt",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Angemeldet als {{userDisplayName}}",
|
||||
"Match Case": "Groß-/Kleinschreibung beachten",
|
||||
"Match Diacritics": "Akzente beachten",
|
||||
"Match Whole Words": "Ganze Wörter",
|
||||
"Maximum Number of Columns": "Maximale Spaltenanzahl",
|
||||
"Minimum Font Size": "Minimale Schriftgröße",
|
||||
"Monospace Font": "Monospace-Schriftart",
|
||||
@@ -89,7 +87,6 @@
|
||||
"Sign In": "Anmelden",
|
||||
"Sign Out": "Abmelden",
|
||||
"Sky": "Himmelblau",
|
||||
"Slow": "Langsam",
|
||||
"Solarized": "Solarisiert",
|
||||
"Speak": "Sprechen",
|
||||
"Subjects": "Themen",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "Migration starten",
|
||||
"Advanced Settings": "Erweiterte Einstellungen",
|
||||
"File count: {{size}}": "Dateianzahl: {{size}}",
|
||||
"Background Read Aloud": "Hintergrund-Vorlesen",
|
||||
"Ready to read aloud": "Bereit zum Vorlesen",
|
||||
"Read Aloud": "Vorlesen",
|
||||
"Screen Brightness": "Bildschirmhelligkeit",
|
||||
"Background Image": "Hintergrundbild",
|
||||
"Import Image": "Bild importieren",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "Exportieren",
|
||||
"Set Timeout": "Zeitlimit festlegen",
|
||||
"Select Voice": "Stimme auswählen",
|
||||
"Toggle Sticky Bottom TTS Bar": "Fixierte TTS-Leiste umschalten",
|
||||
"Display what I'm reading on Discord": "Zeige was ich auf Discord lese",
|
||||
"Show on Discord": "Auf Discord zeigen",
|
||||
"Instant {{action}}": "Sofort {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-Authentifizierung fehlgeschlagen. In den Einstellungen neu verbinden.",
|
||||
"Downloading": "Herunterladen",
|
||||
"Uploading": "Hochladen",
|
||||
"downloaded {{n}} book(s)": "{{n}} Buch/Bücher heruntergeladen",
|
||||
"pushed {{n}} config(s)": "{{n}} Konfiguration(en) hochgeladen",
|
||||
"uploaded {{n}} new file(s)": "{{n}} neue Datei(en) hochgeladen",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisierung mit {{failed}} Fehler(n) beendet. {{ok}} erfolgreich.",
|
||||
"Sync complete": "Synchronisierung abgeschlossen",
|
||||
"Everything is already up to date.": "Alles ist bereits aktuell.",
|
||||
"Browsing {{path}} on {{server}}": "{{path}} auf {{server}} durchsuchen",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Verbinden Sie sich mit einem WebDAV-Server, um Ihre Remote-Dateien zu durchsuchen.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Buchdateien hochladen",
|
||||
"Sync now": "Jetzt synchronisieren",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Passwort anzeigen",
|
||||
"Root Directory": "Stammverzeichnis",
|
||||
"Syncing…": "Synchronisierung…",
|
||||
"pulled progress for {{n}} book(s)": "Fortschritt für {{n}} Buch/Bücher abgerufen",
|
||||
"Sync History": "Synchronisationsverlauf",
|
||||
"Clear Sync History": "Synchronisationsverlauf löschen",
|
||||
"No manual syncs yet": "Noch keine manuellen Synchronisationen",
|
||||
"Partial": "Teilweise",
|
||||
"Cleanup": "Aufräumen",
|
||||
"Cleanup failed": "Aufräumen fehlgeschlagen",
|
||||
"Sync failed": "Synchronisierung fehlgeschlagen",
|
||||
"{{n}} deleted": "{{n}} gelöscht",
|
||||
"{{n}} failed": "{{n}} fehlgeschlagen",
|
||||
"Nothing deleted": "Nichts gelöscht",
|
||||
"{{n}} downloaded": "{{n}} heruntergeladen",
|
||||
"{{n}} uploaded": "{{n}} hochgeladen",
|
||||
"{{n}} progress": "{{n}} Fortschritt",
|
||||
"Up to date": "Aktuell",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Heruntergeladene Bücher",
|
||||
"Files uploaded": "Hochgeladene Dateien",
|
||||
"Configs uploaded": "Hochgeladene Konfigurationen",
|
||||
"Configs downloaded": "Heruntergeladene Konfigurationen",
|
||||
"Covers uploaded": "Hochgeladene Cover",
|
||||
"Books deleted": "Gelöschte Bücher",
|
||||
"Files in sync": "Synchronisierte Dateien",
|
||||
"Failures": "Fehler",
|
||||
"Total books": "Bücher gesamt",
|
||||
"Error:": "Fehler:",
|
||||
"Failed books": "Fehlgeschlagene Bücher",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} Buch/Bücher vom Server gelöscht.",
|
||||
"Failed to load directory": "Verzeichnis konnte nicht geladen werden",
|
||||
"File download is only supported on the desktop and mobile apps.": "Datei-Downloads werden nur in den Desktop- und Mobil-Apps unterstützt.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installieren Sie die Readest-Browsererweiterung, um den gerade gelesenen Artikel an Ihre Bibliothek zu senden. Sie schneidet die Seite aus Ihrem Browser aus, sodass auch kostenpflichtige und Login-pflichtige Sites funktionieren.",
|
||||
"Added to your library. It will sync to your other devices.": "Zur Bibliothek hinzugefügt. Wird mit Ihren anderen Geräten synchronisiert.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Sync-Passphrase vergessen. Alle verschlüsselten Felder gelöscht.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Nur manuelle Synchronisationen und Aufräumvorgänge. Automatische Synchronisationen beim Lesen werden hier nicht protokolliert.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} Buch/Bücher vom WebDAV-Server löschen?\n\nDamit werden nur die Remote-Dateien entfernt; Ihre lokale Bibliothek bleibt unverändert. Das Löschen kann nicht rückgängig gemacht werden. Die Bytes auf dem Server sind dauerhaft verloren.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Lädt Buchdateien auf Ihre anderen Geräte hoch.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Falsche Sync-Passphrase. Synchronisierte Anmeldedaten konnten nicht entschlüsselt werden.",
|
||||
"Email books straight to your library": "Bücher direkt per E-Mail in Ihre Bibliothek senden",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Leiten Sie Anhänge und Artikel an Ihre private Readest-Adresse weiter. Verfügbar in den Plus-, Pro- und Lifetime-Tarifen.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Löscht auch Lesefortschritt, Notizen und Lesezeichen.",
|
||||
"Background Image (Library)": "Hintergrundbild (Bibliothek)",
|
||||
"Background Image (Reader)": "Hintergrundbild (Leseansicht)",
|
||||
"updated metadata for {{n}} book(s)": "Metadaten für {{n}} Buch/Bücher aktualisiert",
|
||||
"{{n}} metadata": "{{n}} Metadaten",
|
||||
"Metadata updated": "Metadaten aktualisiert",
|
||||
"Filter": "Filtern",
|
||||
"Sort by": "Sortieren nach",
|
||||
"Date modified": "Änderungsdatum",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Granularität",
|
||||
"Refresh Page": "Seite aktualisieren",
|
||||
"Recently read": "Zuletzt gelesen",
|
||||
"Show recently read": "Zuletzt gelesen anzeigen"
|
||||
"Show recently read": "Zuletzt gelesen anzeigen",
|
||||
"Find:": "Suchen:",
|
||||
"Enable rule": "Regel aktivieren",
|
||||
"Disable rule": "Regel deaktivieren",
|
||||
"Progress Read": "Lesefortschritt",
|
||||
"Auto-import new books from this folder": "Neue Bücher aus diesem Ordner automatisch importieren",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Wenn neue Bücher zu diesem Ordner hinzugefügt werden, werden sie automatisch importiert, sobald Readest das nächste Mal geöffnet oder in den Vordergrund geholt wird.",
|
||||
"Reading aloud": "Vorlesen läuft",
|
||||
"Open Book": "Buch öffnen",
|
||||
"Stop reading aloud": "Vorlesen stoppen",
|
||||
"Enter at least two words": "Mindestens zwei Wörter eingeben",
|
||||
"Search failed": "Suche fehlgeschlagen",
|
||||
"Search with regex": "Mit Regex suchen",
|
||||
"Words to find near each other": "Wörter, die nahe beieinander stehen sollen",
|
||||
"Contains": "Enthält",
|
||||
"Whole Words": "Ganze Wörter",
|
||||
"Regular Expression": "Regulärer Ausdruck",
|
||||
"Nearby Words": "Benachbarte Wörter",
|
||||
"Within N words": "Innerhalb von N Wörtern",
|
||||
"Not for regex": "Nicht für Regex",
|
||||
"No results found": "Keine Ergebnisse gefunden",
|
||||
"{{count}} results_one": "{{count}} Ergebnis",
|
||||
"{{count}} results_other": "{{count}} Ergebnisse",
|
||||
"Failed to seek": "Spulen fehlgeschlagen",
|
||||
"Chapter progress": "Kapitelfortschritt",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} von {{total}}",
|
||||
"Decrease Contrast": "Kontrast verringern",
|
||||
"Reset Contrast": "Kontrast zurücksetzen",
|
||||
"Increase Contrast": "Kontrast erhöhen",
|
||||
"Push": "Schieben",
|
||||
"Slide": "Gleiten",
|
||||
"Page Curl": "Umblättern",
|
||||
"Animation Style": "Animationsstil",
|
||||
"Appearance": "Erscheinungsbild",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Legt die Textgröße der Wörterbuchergebnisse fest, unabhängig von der Leseansicht.",
|
||||
"Authentication failed. Reconnect in Settings.": "Authentifizierung fehlgeschlagen. In den Einstellungen erneut verbinden.",
|
||||
"Full Sync": "Vollständige Synchronisierung",
|
||||
"Waiting for sign-in…": "Warten auf Anmeldung…",
|
||||
"Reconnect": "Erneut verbinden",
|
||||
"Connected as {{account}}": "Verbunden als {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive als aktiven Cloud-Anbieter festlegen.",
|
||||
"Use Google Drive": "Google Drive verwenden",
|
||||
"Sign-in opens in your browser.": "Die Anmeldung wird in Ihrem Browser geöffnet.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest greift nur auf die Dateien zu, die es in Ihrem Drive erstellt.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit einem WebDAV-Server.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit Ihrem Google Drive.",
|
||||
"Configured": "Konfiguriert",
|
||||
"Use WebDAV": "WebDAV verwenden",
|
||||
"Cloud Sync": "Cloud-Synchronisierung",
|
||||
"Extra Large": "Extra groß",
|
||||
"Hint size": "Hinweisgröße",
|
||||
"Gloss text size above the word": "Textgröße des Hinweises über dem Wort",
|
||||
"Hint color": "Hinweisfarbe",
|
||||
"Adjust Text Selection": "Textauswahl anpassen",
|
||||
"Your books will appear here": "Ihre Bücher erscheinen hier",
|
||||
"Reading aloud continues in the background": "Das Vorlesen wird im Hintergrund fortgesetzt",
|
||||
"Stopped reading aloud": "Vorlesen gestoppt",
|
||||
"Read aloud stopped": "Vorlesen wurde gestoppt",
|
||||
"Cloud provider switched": "Cloud-Anbieter gewechselt",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uploads zu Readest Cloud sind pausiert, solange die {{provider}}-Synchronisierung ausgewählt ist",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Wird von {{provider}} verwaltet, solange es Ihr Cloud-Sync-Anbieter ist",
|
||||
"Not signed in": "Nicht angemeldet",
|
||||
"Paused — plan required": "Pausiert — Tarif erforderlich",
|
||||
"Active · Book file uploads off": "Aktiv · Hochladen von Buchdateien aus",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "App-Einstellungen, Lesestatistiken und Wörterbücher werden weiterhin über Ihr Readest-Konto synchronisiert, solange Sie angemeldet sind.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit Readest Cloud.",
|
||||
"Account and Storage": "Konto und Speicher",
|
||||
"Manage your plan and stored files": "Tarif und gespeicherte Dateien verwalten",
|
||||
"Cloud sync provider": "Cloud-Sync-Anbieter",
|
||||
"Use Readest Cloud": "Readest Cloud verwenden",
|
||||
"Another device is still syncing this library via Readest Cloud": "Ein anderes Gerät synchronisiert diese Bibliothek weiterhin über Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} Upload fehlgeschlagen: unzureichendes Speicherkontingent",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} Uploads fehlgeschlagen: unzureichendes Speicherkontingent",
|
||||
"Library sync via {{provider}}": "Bibliothekssynchronisierung über {{provider}}",
|
||||
"Google Drive session expired": "Google Drive-Sitzung abgelaufen",
|
||||
"Cloud sync session expired": "Cloud-Synchronisierungssitzung abgelaufen",
|
||||
"Uploads book files to your other devices": "Lädt Buchdateien auf deine anderen Geräte hoch",
|
||||
"Re-check every book instead of only changed ones": "Jedes Buch erneut prüfen statt nur geänderte",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket nicht gefunden",
|
||||
"Endpoint": "Endpunkt",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Region",
|
||||
"Access Key ID": "Zugriffsschlüssel-ID",
|
||||
"Your Access Key ID": "Ihre Zugriffsschlüssel-ID",
|
||||
"Secret Access Key": "Geheimer Zugriffsschlüssel",
|
||||
"Your Secret Access Key": "Ihr geheimer Zugriffsschlüssel",
|
||||
"S3-Compatible Storage": "S3-kompatibler Speicher",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit einem S3-kompatiblen Bucket wie Cloudflare R2, AWS S3 oder MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Im Browser muss die CORS-Richtlinie des Buckets den Ursprung dieser Website zulassen.",
|
||||
"Use S3": "S3 verwenden",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Stellen Sie vor dem Verbinden sicher, dass der Bucket existiert und die Zugangsdaten Lese-/Schreibzugriff haben.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Solange {{provider}} ausgewählt ist, werden Bücher, Fortschritt und Anmerkungen nur mit Ihrem Server synchronisiert.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Solange {{provider}} ausgewählt ist, werden Bücher, Fortschritt und Anmerkungen nur mit Ihrem Drive synchronisiert.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Solange {{provider}} ausgewählt ist, werden Bücher, Fortschritt und Anmerkungen nur mit Ihrem Bucket synchronisiert.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "S3-Speicher",
|
||||
"Speed": "Geschwindigkeit",
|
||||
"{{time}} left in chapter": "{{time}} verbleibend im Kapitel",
|
||||
"Open Read Aloud player": "Vorlese-Player öffnen",
|
||||
"Read Aloud": "Vorlesen",
|
||||
"Voice": "Stimme",
|
||||
"Sleep Timer": "Einschlaftimer",
|
||||
"Slower": "Langsamer",
|
||||
"Faster": "Schneller",
|
||||
"Exit Auto Scroll": "Automatisches Scrollen beenden",
|
||||
"Auto Scroll": "Automatisches Scrollen",
|
||||
"End of book": "Ende des Buches",
|
||||
"Toggle Auto Scroll": "Automatisches Scrollen umschalten"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Επεξεργασία",
|
||||
"Excerpts": "Αποσπάσματα",
|
||||
"Failed to import book(s): {{filenames}}": "Αποτυχία εισαγωγής βιβλίου(ων): {{filenames}}",
|
||||
"Fast": "Γρήγορα",
|
||||
"Font": "Γραμματοσειρά",
|
||||
"Font & Layout": "Γραμματοσειρά & Διάταξη",
|
||||
"Font Face": "Τύπος γραμματοσειράς",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Συνδεδεμένος ως {{userDisplayName}}",
|
||||
"Match Case": "Ταίριασμα πεζών-κεφαλαίων",
|
||||
"Match Diacritics": "Ταίριασμα διακριτικών σημείων",
|
||||
"Match Whole Words": "Ταίριασμα ολόκληρων λέξεων",
|
||||
"Maximum Number of Columns": "Μέγιστος αριθμός στηλών",
|
||||
"Minimum Font Size": "Ελάχιστο μέγεθος γραμματοσειράς",
|
||||
"Monospace Font": "Γραμματοσειρά σταθερού πλάτους",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Σύνδεση",
|
||||
"Sign Out": "Αποσύνδεση",
|
||||
"Sky": "Ουρανός",
|
||||
"Slow": "Αργά",
|
||||
"Solarized": "Solarized",
|
||||
"Speak": "Ομιλία",
|
||||
"Subjects": "Θέματα",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "Έναρξη μετανάστευσης",
|
||||
"Advanced Settings": "Προηγμένες ρυθμίσεις",
|
||||
"File count: {{size}}": "Αριθμός αρχείων: {{size}}",
|
||||
"Background Read Aloud": "Ανάγνωση στο παρασκήνιο",
|
||||
"Ready to read aloud": "Έτοιμο για ανάγνωση",
|
||||
"Read Aloud": "Ανάγνωση",
|
||||
"Screen Brightness": "Φωτεινότητα οθόνης",
|
||||
"Background Image": "Εικόνα φόντου",
|
||||
"Import Image": "Εισαγωγή εικόνας",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "Εξαγωγή",
|
||||
"Set Timeout": "Ορισμός χρονικού ορίου",
|
||||
"Select Voice": "Επιλογή φωνής",
|
||||
"Toggle Sticky Bottom TTS Bar": "Εναλλαγή καρφιτσωμένης μπάρας TTS",
|
||||
"Display what I'm reading on Discord": "Εμφάνιση του βιβλίου που διαβάζω στο Discord",
|
||||
"Show on Discord": "Εμφάνιση στο Discord",
|
||||
"Instant {{action}}": "Άμεση {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Η αυθεντικοποίηση WebDAV απέτυχε. Επανασυνδεθείτε στις Ρυθμίσεις.",
|
||||
"Downloading": "Λήψη",
|
||||
"Uploading": "Μεταφόρτωση",
|
||||
"downloaded {{n}} book(s)": "λήφθηκαν {{n}} βιβλία",
|
||||
"pushed {{n}} config(s)": "στάλθηκαν {{n}} διαμορφώσεις",
|
||||
"uploaded {{n}} new file(s)": "μεταφορτώθηκαν {{n}} νέα αρχεία",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Ο συγχρονισμός ολοκληρώθηκε με {{failed}} αποτυχίες. {{ok}} επιτυχείς.",
|
||||
"Sync complete": "Ο συγχρονισμός ολοκληρώθηκε",
|
||||
"Everything is already up to date.": "Όλα είναι ήδη ενημερωμένα.",
|
||||
"Browsing {{path}} on {{server}}": "Περιήγηση στο {{path}} στο {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Συνδεθείτε σε έναν διακομιστή WebDAV για να περιηγηθείτε στα απομακρυσμένα αρχεία σας.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Μεταφόρτωση αρχείων βιβλίων",
|
||||
"Sync now": "Συγχρονισμός τώρα",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Εμφάνιση κωδικού",
|
||||
"Root Directory": "Ριζικός φάκελος",
|
||||
"Syncing…": "Συγχρονισμός…",
|
||||
"pulled progress for {{n}} book(s)": "λήψη προόδου για {{n}} βιβλία",
|
||||
"Sync History": "Ιστορικό συγχρονισμού",
|
||||
"Clear Sync History": "Εκκαθάριση ιστορικού συγχρονισμού",
|
||||
"No manual syncs yet": "Δεν υπάρχουν χειροκίνητοι συγχρονισμοί ακόμη",
|
||||
"Partial": "Μερικό",
|
||||
"Cleanup": "Εκκαθάριση",
|
||||
"Cleanup failed": "Η εκκαθάριση απέτυχε",
|
||||
"Sync failed": "Ο συγχρονισμός απέτυχε",
|
||||
"{{n}} deleted": "{{n}} διαγράφηκαν",
|
||||
"{{n}} failed": "{{n}} απέτυχαν",
|
||||
"Nothing deleted": "Δεν διαγράφηκε τίποτα",
|
||||
"{{n}} downloaded": "{{n}} έγιναν λήψη",
|
||||
"{{n}} uploaded": "{{n}} μεταφορτώθηκαν",
|
||||
"{{n}} progress": "{{n}} πρόοδος",
|
||||
"Up to date": "Ενημερωμένο",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Βιβλία που λήφθηκαν",
|
||||
"Files uploaded": "Αρχεία που μεταφορτώθηκαν",
|
||||
"Configs uploaded": "Διαμορφώσεις που μεταφορτώθηκαν",
|
||||
"Configs downloaded": "Διαμορφώσεις που λήφθηκαν",
|
||||
"Covers uploaded": "Εξώφυλλα που μεταφορτώθηκαν",
|
||||
"Books deleted": "Διαγραμμένα βιβλία",
|
||||
"Files in sync": "Συγχρονισμένα αρχεία",
|
||||
"Failures": "Αποτυχίες",
|
||||
"Total books": "Σύνολο βιβλίων",
|
||||
"Error:": "Σφάλμα:",
|
||||
"Failed books": "Βιβλία με αποτυχία",
|
||||
"Deleted {{n}} book(s) from server.": "Διαγράφηκαν {{n}} βιβλία από τον διακομιστή.",
|
||||
"Failed to load directory": "Αποτυχία φόρτωσης φακέλου",
|
||||
"File download is only supported on the desktop and mobile apps.": "Η λήψη αρχείων υποστηρίζεται μόνο στις εφαρμογές υπολογιστή και κινητού.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Εγκαταστήστε την επέκταση προγράμματος περιήγησης Readest για να στείλετε το άρθρο που διαβάζετε στη βιβλιοθήκη σας. Αποκόπτει τη σελίδα από το πρόγραμμα περιήγησης ώστε να λειτουργούν ακόμη και ιστότοποι επί πληρωμή ή με υποχρεωτική σύνδεση.",
|
||||
"Added to your library. It will sync to your other devices.": "Προστέθηκε στη βιβλιοθήκη σας. Θα συγχρονιστεί με τις άλλες σας συσκευές.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Η συνθηματική φράση συγχρονισμού λησμονήθηκε. Όλα τα κρυπτογραφημένα πεδία διαγράφηκαν.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Μόνο χειροκίνητοι συγχρονισμοί και εκκαθαρίσεις. Οι αυτόματοι συγχρονισμοί κατά την ανάγνωση δεν καταγράφονται εδώ.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Διαγραφή {{n}} βιβλίων από τον διακομιστή WebDAV;\n\nΑυτό αφαιρεί μόνο τα απομακρυσμένα αρχεία· η τοπική σας βιβλιοθήκη παραμένει ανέπαφη. Η διαγραφή είναι μη αναστρέψιμη. Τα δεδομένα στον διακομιστή θα χαθούν οριστικά.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Μεταφορτώνει αρχεία βιβλίων στις άλλες συσκευές σας.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Λανθασμένη συνθηματική φράση συγχρονισμού. Δεν ήταν δυνατή η αποκρυπτογράφηση των συγχρονισμένων διαπιστευτηρίων.",
|
||||
"Email books straight to your library": "Στείλτε βιβλία απευθείας στη βιβλιοθήκη σας μέσω email",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Προωθήστε συνημμένα και άρθρα στην ιδιωτική σας διεύθυνση Readest. Διαθέσιμο στα πλάνα Plus, Pro και Lifetime.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Διαγράφει επίσης την πρόοδο ανάγνωσης, τις σημειώσεις και τους σελιδοδείκτες.",
|
||||
"Background Image (Library)": "Εικόνα φόντου (Βιβλιοθήκη)",
|
||||
"Background Image (Reader)": "Εικόνα φόντου (Προβολή ανάγνωσης)",
|
||||
"updated metadata for {{n}} book(s)": "ενημερώθηκαν τα μεταδεδομένα για {{n}} βιβλίο/α",
|
||||
"{{n}} metadata": "{{n}} μεταδεδομένα",
|
||||
"Metadata updated": "Ενημερωμένα μεταδεδομένα",
|
||||
"Filter": "Φιλτράρισμα",
|
||||
"Sort by": "Ταξινόμηση κατά",
|
||||
"Date modified": "Ημερομηνία τροποποίησης",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Διαβάθμιση",
|
||||
"Refresh Page": "Ανανέωση σελίδας",
|
||||
"Recently read": "Πρόσφατα αναγνωσμένα",
|
||||
"Show recently read": "Εμφάνιση πρόσφατα αναγνωσμένων"
|
||||
"Show recently read": "Εμφάνιση πρόσφατα αναγνωσμένων",
|
||||
"Find:": "Εύρεση:",
|
||||
"Enable rule": "Ενεργοποίηση κανόνα",
|
||||
"Disable rule": "Απενεργοποίηση κανόνα",
|
||||
"Progress Read": "Πρόοδος ανάγνωσης",
|
||||
"Auto-import new books from this folder": "Αυτόματη εισαγωγή νέων βιβλίων από αυτόν τον φάκελο",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Όταν προστίθενται νέα βιβλία σε αυτόν τον φάκελο, θα εισάγονται αυτόματα την επόμενη φορά που το Readest θα ανοίξει ή θα επανέλθει στο προσκήνιο.",
|
||||
"Reading aloud": "Ανάγνωση σε εξέλιξη",
|
||||
"Open Book": "Άνοιγμα βιβλίου",
|
||||
"Stop reading aloud": "Διακοπή ανάγνωσης",
|
||||
"Enter at least two words": "Εισαγάγετε τουλάχιστον δύο λέξεις",
|
||||
"Search failed": "Η αναζήτηση απέτυχε",
|
||||
"Search with regex": "Αναζήτηση με regex",
|
||||
"Words to find near each other": "Λέξεις που πρέπει να βρίσκονται κοντά η μία στην άλλη",
|
||||
"Contains": "Περιέχει",
|
||||
"Whole Words": "Ολόκληρες λέξεις",
|
||||
"Regular Expression": "Κανονική έκφραση",
|
||||
"Nearby Words": "Κοντινές λέξεις",
|
||||
"Within N words": "Εντός N λέξεων",
|
||||
"Not for regex": "Όχι για regex",
|
||||
"No results found": "Δεν βρέθηκαν αποτελέσματα",
|
||||
"{{count}} results_one": "{{count}} αποτέλεσμα",
|
||||
"{{count}} results_other": "{{count}} αποτελέσματα",
|
||||
"Failed to seek": "Αποτυχία μετάβασης",
|
||||
"Chapter progress": "Πρόοδος κεφαλαίου",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} από {{total}}",
|
||||
"Decrease Contrast": "Μείωση αντίθεσης",
|
||||
"Reset Contrast": "Επαναφορά αντίθεσης",
|
||||
"Increase Contrast": "Αύξηση αντίθεσης",
|
||||
"Push": "Ώθηση",
|
||||
"Slide": "Ολίσθηση",
|
||||
"Page Curl": "Γύρισμα σελίδας",
|
||||
"Animation Style": "Στυλ κίνησης",
|
||||
"Appearance": "Εμφάνιση",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Ορίζει το μέγεθος κειμένου των αποτελεσμάτων λεξικού, ανεξάρτητα από την προβολή ανάγνωσης.",
|
||||
"Authentication failed. Reconnect in Settings.": "Ο έλεγχος ταυτότητας απέτυχε. Επανασυνδεθείτε στις Ρυθμίσεις.",
|
||||
"Full Sync": "Πλήρης συγχρονισμός",
|
||||
"Waiting for sign-in…": "Αναμονή για σύνδεση…",
|
||||
"Reconnect": "Επανασύνδεση",
|
||||
"Connected as {{account}}": "Έχετε συνδεθεί ως {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Ορίστε το Google Drive ως ενεργό πάροχο cloud.",
|
||||
"Use Google Drive": "Χρήση Google Drive",
|
||||
"Sign-in opens in your browser.": "Η σύνδεση ανοίγει στο πρόγραμμα περιήγησής σας.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Το Readest έχει πρόσβαση μόνο στα αρχεία που δημιουργεί στο Drive σας.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με έναν διακομιστή WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με το Google Drive σας.",
|
||||
"Configured": "Ρυθμισμένο",
|
||||
"Use WebDAV": "Χρήση WebDAV",
|
||||
"Cloud Sync": "Συγχρονισμός cloud",
|
||||
"Extra Large": "Πολύ μεγάλο",
|
||||
"Hint size": "Μέγεθος υπόδειξης",
|
||||
"Gloss text size above the word": "Μέγεθος κειμένου της υπόδειξης πάνω από τη λέξη",
|
||||
"Hint color": "Χρώμα υπόδειξης",
|
||||
"Adjust Text Selection": "Προσαρμογή επιλογής κειμένου",
|
||||
"Your books will appear here": "Τα βιβλία σας θα εμφανιστούν εδώ",
|
||||
"Reading aloud continues in the background": "Η ανάγνωση συνεχίζεται στο παρασκήνιο",
|
||||
"Stopped reading aloud": "Η ανάγνωση σταμάτησε",
|
||||
"Read aloud stopped": "Η ανάγνωση διακόπηκε",
|
||||
"Cloud provider switched": "Ο πάροχος cloud άλλαξε",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Οι μεταφορτώσεις στο Readest Cloud είναι σε παύση όσο είναι επιλεγμένος ο συγχρονισμός {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Διαχειρίζεται από το {{provider}} όσο είναι ο πάροχος συγχρονισμού cloud σας",
|
||||
"Not signed in": "Δεν έχετε συνδεθεί",
|
||||
"Paused — plan required": "Σε παύση — απαιτείται πρόγραμμα",
|
||||
"Active · Book file uploads off": "Ενεργό · Η μεταφόρτωση αρχείων βιβλίων είναι ανενεργή",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Οι ρυθμίσεις της εφαρμογής, τα στατιστικά ανάγνωσης και τα λεξικά εξακολουθούν να συγχρονίζονται μέσω του λογαριασμού Readest όσο είστε συνδεδεμένοι.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με το Readest Cloud.",
|
||||
"Account and Storage": "Λογαριασμός και αποθήκευση",
|
||||
"Manage your plan and stored files": "Διαχειριστείτε το πρόγραμμα και τα αποθηκευμένα αρχεία σας",
|
||||
"Cloud sync provider": "Πάροχος συγχρονισμού cloud",
|
||||
"Use Readest Cloud": "Χρήση του Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Μια άλλη συσκευή εξακολουθεί να συγχρονίζει αυτήν τη βιβλιοθήκη μέσω Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} μεταφόρτωση απέτυχε: ανεπαρκές όριο αποθήκευσης",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} μεταφορτώσεις απέτυχαν: ανεπαρκές όριο αποθήκευσης",
|
||||
"Library sync via {{provider}}": "Συγχρονισμός βιβλιοθήκης μέσω {{provider}}",
|
||||
"Google Drive session expired": "Η συνεδρία του Google Drive έληξε",
|
||||
"Cloud sync session expired": "Η συνεδρία συγχρονισμού cloud έληξε",
|
||||
"Uploads book files to your other devices": "Μεταφορτώνει αρχεία βιβλίων στις άλλες συσκευές σας",
|
||||
"Re-check every book instead of only changed ones": "Επανέλεγχος κάθε βιβλίου αντί μόνο των αλλαγμένων",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Ο κάδος δεν βρέθηκε",
|
||||
"Endpoint": "Τελικό σημείο",
|
||||
"Bucket": "Κάδος",
|
||||
"Region": "Περιοχή",
|
||||
"Access Key ID": "Access Key ID",
|
||||
"Your Access Key ID": "Το Access Key ID σας",
|
||||
"Secret Access Key": "Secret Access Key",
|
||||
"Your Secret Access Key": "Το Secret Access Key σας",
|
||||
"S3-Compatible Storage": "Αποθήκευση συμβατή με S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με έναν κάδο συμβατό με S3, όπως Cloudflare R2, AWS S3 ή MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Στο πρόγραμμα περιήγησης, η πολιτική CORS του κάδου πρέπει να επιτρέπει την προέλευση αυτού του ιστότοπου.",
|
||||
"Use S3": "Χρήση S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Πριν από τη σύνδεση, βεβαιωθείτε ότι ο κάδος υπάρχει και ότι τα διαπιστευτήρια έχουν πρόσβαση ανάγνωσης/εγγραφής.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Όσο είναι επιλεγμένο το {{provider}}, τα βιβλία, η πρόοδος και οι σημειώσεις συγχρονίζονται μόνο με τον διακομιστή σας.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Όσο είναι επιλεγμένο το {{provider}}, τα βιβλία, η πρόοδος και οι σημειώσεις συγχρονίζονται μόνο με το Drive σας.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Όσο είναι επιλεγμένο το {{provider}}, τα βιβλία, η πρόοδος και οι σημειώσεις συγχρονίζονται μόνο με τον κάδο σας.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Αποθήκευση S3",
|
||||
"Speed": "Ταχύτητα",
|
||||
"{{time}} left in chapter": "{{time}} απομένει στο κεφάλαιο",
|
||||
"Open Read Aloud player": "Άνοιγμα προγράμματος αναπαραγωγής εκφώνησης",
|
||||
"Read Aloud": "Εκφώνηση",
|
||||
"Voice": "Φωνή",
|
||||
"Sleep Timer": "Χρονοδιακόπτης ύπνου",
|
||||
"Slower": "Πιο αργά",
|
||||
"Faster": "Πιο γρήγορα",
|
||||
"Exit Auto Scroll": "Έξοδος από την αυτόματη κύλιση",
|
||||
"Auto Scroll": "Αυτόματη κύλιση",
|
||||
"End of book": "Τέλος του βιβλίου",
|
||||
"Toggle Auto Scroll": "Εναλλαγή αυτόματης κύλισης"
|
||||
}
|
||||
|
||||
@@ -70,5 +70,9 @@
|
||||
"Imported {{count}} annotations_other": "Imported {{count}} annotations",
|
||||
"Recently read": "Recently read",
|
||||
"Show recently read": "Show recently read",
|
||||
"Your books will appear here": "Your books will appear here"
|
||||
"Your books will appear here": "Your books will appear here",
|
||||
"{{count}} results_one": "{{count}} result",
|
||||
"{{count}} results_other": "{{count}} results",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} upload failed: insufficient storage quota",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uploads failed: insufficient storage quota"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Editar",
|
||||
"Excerpts": "Extractos",
|
||||
"Failed to import book(s): {{filenames}}": "Error al importar libro(s): {{filenames}}",
|
||||
"Fast": "Rápido",
|
||||
"Font": "Fuente",
|
||||
"Font & Layout": "Fuente y diseño",
|
||||
"Font Face": "Tipo de fuente",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Sesión iniciada como {{userDisplayName}}",
|
||||
"Match Case": "Coincidir mayúsculas y minúsculas",
|
||||
"Match Diacritics": "Coincidir diacríticos",
|
||||
"Match Whole Words": "Coincidir palabras completas",
|
||||
"Maximum Number of Columns": "Número máximo de columnas",
|
||||
"Minimum Font Size": "Tamaño de fuente mínimo",
|
||||
"Monospace Font": "Fuente monoespaciada",
|
||||
@@ -113,7 +111,6 @@
|
||||
"Sign In": "Iniciar sesión",
|
||||
"Sign Out": "Cerrar sesión",
|
||||
"Sky": "Cielo",
|
||||
"Slow": "Lento",
|
||||
"Solarized": "Solarizado",
|
||||
"Speak": "Leer",
|
||||
"Subjects": "Temas",
|
||||
@@ -586,9 +583,6 @@
|
||||
"Start Migration": "Iniciar Migración",
|
||||
"Advanced Settings": "Configuraciones Avanzadas",
|
||||
"File count: {{size}}": "Número de archivos: {{size}}",
|
||||
"Background Read Aloud": "Lectura en segundo plano",
|
||||
"Ready to read aloud": "Listo para leer en voz alta",
|
||||
"Read Aloud": "Leer en voz alta",
|
||||
"Screen Brightness": "Brillo de pantalla",
|
||||
"Background Image": "Imagen de fondo",
|
||||
"Import Image": "Importar imagen",
|
||||
@@ -891,7 +885,6 @@
|
||||
"Export": "Exportar",
|
||||
"Set Timeout": "Establecer tiempo límite",
|
||||
"Select Voice": "Seleccionar voz",
|
||||
"Toggle Sticky Bottom TTS Bar": "Alternar barra TTS fija",
|
||||
"Display what I'm reading on Discord": "Mostrar lo que estoy leyendo en Discord",
|
||||
"Show on Discord": "Mostrar en Discord",
|
||||
"Instant {{action}}": "{{action}} instantáneo",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autenticación WebDAV fallida. Vuelve a conectar en Ajustes.",
|
||||
"Downloading": "Descargando",
|
||||
"Uploading": "Subiendo",
|
||||
"downloaded {{n}} book(s)": "{{n}} libro(s) descargado(s)",
|
||||
"pushed {{n}} config(s)": "{{n}} configuración(es) enviada(s)",
|
||||
"uploaded {{n}} new file(s)": "{{n}} archivo(s) nuevo(s) subido(s)",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronización finalizada con {{failed}} error(es). {{ok}} correctos.",
|
||||
"Sync complete": "Sincronización completa",
|
||||
"Everything is already up to date.": "Todo está actualizado.",
|
||||
"Browsing {{path}} on {{server}}": "Explorando {{path}} en {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Conéctate a un servidor WebDAV para explorar tus archivos remotos.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Subir archivos de libros",
|
||||
"Sync now": "Sincronizar ahora",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Mostrar contraseña",
|
||||
"Root Directory": "Directorio raíz",
|
||||
"Syncing…": "Sincronizando…",
|
||||
"pulled progress for {{n}} book(s)": "progreso de {{n}} libro(s) recuperado",
|
||||
"Sync History": "Historial de sincronización",
|
||||
"Clear Sync History": "Borrar historial de sincronización",
|
||||
"No manual syncs yet": "Aún no hay sincronizaciones manuales",
|
||||
"Partial": "Parcial",
|
||||
"Cleanup": "Limpieza",
|
||||
"Cleanup failed": "Limpieza fallida",
|
||||
"Sync failed": "Sincronización fallida",
|
||||
"{{n}} deleted": "{{n}} eliminados",
|
||||
"{{n}} failed": "{{n}} con error",
|
||||
"Nothing deleted": "No se eliminó nada",
|
||||
"{{n}} downloaded": "{{n}} descargados",
|
||||
"{{n}} uploaded": "{{n}} subidos",
|
||||
"{{n}} progress": "{{n}} de progreso",
|
||||
"Up to date": "Al día",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Libros descargados",
|
||||
"Files uploaded": "Archivos subidos",
|
||||
"Configs uploaded": "Configuraciones subidas",
|
||||
"Configs downloaded": "Configuraciones descargadas",
|
||||
"Covers uploaded": "Portadas subidas",
|
||||
"Books deleted": "Libros eliminados",
|
||||
"Files in sync": "Archivos sincronizados",
|
||||
"Failures": "Errores",
|
||||
"Total books": "Libros totales",
|
||||
"Error:": "Error:",
|
||||
"Failed books": "Libros con error",
|
||||
"Deleted {{n}} book(s) from server.": "Se eliminaron {{n}} libro(s) del servidor.",
|
||||
"Failed to load directory": "No se pudo cargar el directorio",
|
||||
"File download is only supported on the desktop and mobile apps.": "La descarga de archivos solo es compatible con las aplicaciones de escritorio y móvil.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instala la extensión del navegador de Readest para enviar el artículo que estás leyendo a tu biblioteca. Recorta la página desde tu navegador para que los sitios con muro de pago o que requieren inicio de sesión funcionen.",
|
||||
"Added to your library. It will sync to your other devices.": "Añadido a tu biblioteca. Se sincronizará con tus otros dispositivos.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase de paso de sincronización olvidada. Se borraron todos los campos cifrados.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Solo sincronizaciones manuales y limpiezas. Las sincronizaciones automáticas durante la lectura no se registran aquí.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "¿Eliminar {{n}} libro(s) del servidor WebDAV?\n\nEsto solo elimina los archivos remotos; tu biblioteca local no se verá afectada. La eliminación no se puede deshacer. Los bytes en el servidor desaparecerán permanentemente.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Sube los archivos de libros a tus otros dispositivos.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase de paso de sincronización incorrecta. No se pudieron descifrar las credenciales sincronizadas.",
|
||||
"Email books straight to your library": "Envía libros por correo directamente a tu biblioteca",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Reenvía archivos adjuntos y artículos a tu dirección privada de Readest. Disponible en los planes Plus, Pro y Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "También borra el progreso de lectura, las notas y los marcadores.",
|
||||
"Background Image (Library)": "Imagen de fondo (Biblioteca)",
|
||||
"Background Image (Reader)": "Imagen de fondo (Lector)",
|
||||
"updated metadata for {{n}} book(s)": "metadatos actualizados de {{n}} libro(s)",
|
||||
"{{n}} metadata": "{{n}} metadatos",
|
||||
"Metadata updated": "Metadatos actualizados",
|
||||
"Filter": "Filtrar",
|
||||
"Sort by": "Ordenar por",
|
||||
"Date modified": "Fecha de modificación",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularidad",
|
||||
"Refresh Page": "Actualizar página",
|
||||
"Recently read": "Leídos recientemente",
|
||||
"Show recently read": "Mostrar leídos recientemente"
|
||||
"Show recently read": "Mostrar leídos recientemente",
|
||||
"Find:": "Buscar:",
|
||||
"Enable rule": "Activar regla",
|
||||
"Disable rule": "Desactivar regla",
|
||||
"Progress Read": "Progreso de Lectura",
|
||||
"Auto-import new books from this folder": "Importar automáticamente los libros nuevos de esta carpeta",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Cuando se añadan libros nuevos a esta carpeta, se importarán automáticamente la próxima vez que Readest se abra o vuelva a primer plano.",
|
||||
"Reading aloud": "Leyendo en voz alta",
|
||||
"Open Book": "Abrir libro",
|
||||
"Stop reading aloud": "Detener la lectura en voz alta",
|
||||
"Enter at least two words": "Introduce al menos dos palabras",
|
||||
"Search failed": "Búsqueda fallida",
|
||||
"Search with regex": "Buscar con regex",
|
||||
"Words to find near each other": "Palabras que deben aparecer cerca unas de otras",
|
||||
"Contains": "Contiene",
|
||||
"Whole Words": "Palabras completas",
|
||||
"Regular Expression": "Expresión regular",
|
||||
"Nearby Words": "Palabras cercanas",
|
||||
"Within N words": "A menos de N palabras",
|
||||
"Not for regex": "No disponible con regex",
|
||||
"No results found": "No se encontraron resultados",
|
||||
"{{count}} results_one": "{{count}} resultado",
|
||||
"{{count}} results_many": "{{count}} de resultados",
|
||||
"{{count}} results_other": "{{count}} resultados",
|
||||
"Failed to seek": "No se pudo cambiar la posición",
|
||||
"Chapter progress": "Progreso del capítulo",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}",
|
||||
"Decrease Contrast": "Disminuir contraste",
|
||||
"Reset Contrast": "Restablecer contraste",
|
||||
"Increase Contrast": "Aumentar contraste",
|
||||
"Push": "Empuje",
|
||||
"Slide": "Deslizamiento",
|
||||
"Page Curl": "Curvatura de página",
|
||||
"Animation Style": "Estilo de animación",
|
||||
"Appearance": "Apariencia",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Establece el tamaño del texto de los resultados del diccionario, independiente de la vista de lectura.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autenticación fallida. Vuelve a conectar en Ajustes.",
|
||||
"Full Sync": "Sincronización total",
|
||||
"Waiting for sign-in…": "Esperando el inicio de sesión…",
|
||||
"Reconnect": "Volver a conectar",
|
||||
"Connected as {{account}}": "Conectado como {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Haz que Google Drive sea el proveedor de nube activo.",
|
||||
"Use Google Drive": "Usar Google Drive",
|
||||
"Sign-in opens in your browser.": "El inicio de sesión se abre en tu navegador.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest solo accede a los archivos que crea en tu Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con un servidor WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con tu Google Drive.",
|
||||
"Configured": "Configurado",
|
||||
"Use WebDAV": "Usar WebDAV",
|
||||
"Cloud Sync": "Sincronización en la nube",
|
||||
"Extra Large": "Extra grande",
|
||||
"Hint size": "Tamaño de la pista",
|
||||
"Gloss text size above the word": "Tamaño del texto de la pista sobre la palabra",
|
||||
"Hint color": "Color de la pista",
|
||||
"Adjust Text Selection": "Ajustar selección de texto",
|
||||
"Your books will appear here": "Tus libros aparecerán aquí",
|
||||
"Reading aloud continues in the background": "La lectura en voz alta continúa en segundo plano",
|
||||
"Stopped reading aloud": "Lectura en voz alta detenida",
|
||||
"Read aloud stopped": "Lectura en voz alta detenida",
|
||||
"Cloud provider switched": "Proveedor de nube cambiado",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Las subidas a Readest Cloud están en pausa mientras la sincronización con {{provider}} esté seleccionada",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Gestionado por {{provider}} mientras sea tu proveedor de sincronización en la nube",
|
||||
"Not signed in": "Sesión no iniciada",
|
||||
"Paused — plan required": "En pausa — se requiere un plan",
|
||||
"Active · Book file uploads off": "Activo · Subida de archivos de libros desactivada",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Los ajustes de la aplicación, las estadísticas de lectura y los diccionarios se siguen sincronizando a través de tu cuenta de Readest mientras tengas la sesión iniciada.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con Readest Cloud.",
|
||||
"Account and Storage": "Cuenta y almacenamiento",
|
||||
"Manage your plan and stored files": "Gestiona tu plan y tus archivos almacenados",
|
||||
"Cloud sync provider": "Proveedor de sincronización en la nube",
|
||||
"Use Readest Cloud": "Usar Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Otro dispositivo sigue sincronizando esta biblioteca vía Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} subida fallida: cuota de almacenamiento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} subidas fallidas: cuota de almacenamiento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} subidas fallidas: cuota de almacenamiento insuficiente",
|
||||
"Library sync via {{provider}}": "Sincronización de la biblioteca mediante {{provider}}",
|
||||
"Google Drive session expired": "La sesión de Google Drive ha caducado",
|
||||
"Cloud sync session expired": "La sesión de sincronización en la nube ha caducado",
|
||||
"Uploads book files to your other devices": "Sube los archivos de libros a tus otros dispositivos",
|
||||
"Re-check every book instead of only changed ones": "Volver a comprobar cada libro en lugar de solo los modificados",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket no encontrado",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Región",
|
||||
"Access Key ID": "ID de clave de acceso",
|
||||
"Your Access Key ID": "Tu ID de clave de acceso",
|
||||
"Secret Access Key": "Clave de acceso secreta",
|
||||
"Your Secret Access Key": "Tu clave de acceso secreta",
|
||||
"S3-Compatible Storage": "Almacenamiento compatible con S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sincroniza tu biblioteca, progreso de lectura y subrayados con un bucket compatible con S3 como Cloudflare R2, AWS S3 o MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "En el navegador, la política CORS del bucket debe permitir el origen de este sitio.",
|
||||
"Use S3": "Usar S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Antes de conectar, asegúrate de que el bucket exista y de que las credenciales tengan acceso de lectura y escritura.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Mientras {{provider}} esté seleccionado, los libros, el progreso y las anotaciones se sincronizan solo con tu servidor.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Mientras {{provider}} esté seleccionado, los libros, el progreso y las anotaciones se sincronizan solo con tu Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Mientras {{provider}} esté seleccionado, los libros, el progreso y las anotaciones se sincronizan solo con tu bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Almacenamiento S3",
|
||||
"Speed": "Velocidad",
|
||||
"{{time}} left in chapter": "{{time}} restante en el capítulo",
|
||||
"Open Read Aloud player": "Abrir el reproductor de lectura en voz alta",
|
||||
"Read Aloud": "Lectura en voz alta",
|
||||
"Voice": "Voz",
|
||||
"Sleep Timer": "Temporizador de apagado",
|
||||
"Slower": "Más lento",
|
||||
"Faster": "Más rápido",
|
||||
"Exit Auto Scroll": "Salir del desplazamiento automático",
|
||||
"Auto Scroll": "Desplazamiento automático",
|
||||
"End of book": "Fin del libro",
|
||||
"Toggle Auto Scroll": "Alternar desplazamiento automático"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "ویرایش",
|
||||
"Excerpts": "گزیدهها",
|
||||
"Failed to import book(s): {{filenames}}": "وارد کردن کتاب(ها) «{{filenames}}» ناموفق بود.",
|
||||
"Fast": "سریع",
|
||||
"Font": "فونت",
|
||||
"Font & Layout": "فونت و چیدمان",
|
||||
"Font Face": "نمای فونت",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "شما با نام «{{userDisplayName}}» وارد شدهاید",
|
||||
"Match Case": "تطابق حروف بزرگ/کوچک",
|
||||
"Match Diacritics": "تطابق اعراب",
|
||||
"Match Whole Words": "تطابق کل کلمات",
|
||||
"Maximum Number of Columns": "حداکثر تعداد ستونها",
|
||||
"Minimum Font Size": "حداقل اندازه فونت",
|
||||
"Monospace Font": "فونت تکفاصله (Monospace)",
|
||||
@@ -89,7 +87,6 @@
|
||||
"Sign In": "ورود",
|
||||
"Sign Out": "خروج",
|
||||
"Sky": "آسمانی",
|
||||
"Slow": "آهسته",
|
||||
"Solarized": "آفتابی",
|
||||
"Speak": "خواندن",
|
||||
"Subjects": "موضوعات",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "شروع انتقال",
|
||||
"Advanced Settings": "تنظیمات پیشرفته",
|
||||
"File count: {{size}}": "تعداد فایلها: {{size}}",
|
||||
"Background Read Aloud": "خواندن با صدای بلند در پسزمینه",
|
||||
"Ready to read aloud": "آماده برای خواندن با صدای بلند",
|
||||
"Read Aloud": "خواندن با صدای بلند",
|
||||
"Screen Brightness": "روشنایی صفحه",
|
||||
"Background Image": "تصویر پسزمینه",
|
||||
"Import Image": "وارد کردن تصویر",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "خروجی",
|
||||
"Set Timeout": "تنظیم مهلت زمانی",
|
||||
"Select Voice": "انتخاب صدا",
|
||||
"Toggle Sticky Bottom TTS Bar": "تغییر نوار TTS ثابت",
|
||||
"Display what I'm reading on Discord": "نمایش کتاب در حال خواندن در Discord",
|
||||
"Show on Discord": "نمایش در Discord",
|
||||
"Instant {{action}}": "{{action}} فوری",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "احراز هویت WebDAV ناموفق بود. در تنظیمات دوباره متصل شوید.",
|
||||
"Downloading": "دانلود",
|
||||
"Uploading": "بارگذاری",
|
||||
"downloaded {{n}} book(s)": "{{n}} کتاب دانلود شد",
|
||||
"pushed {{n}} config(s)": "{{n}} پیکربندی ارسال شد",
|
||||
"uploaded {{n}} new file(s)": "{{n}} فایل جدید بارگذاری شد",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "همگامسازی با {{failed}} خطا پایان یافت. {{ok}} موفق.",
|
||||
"Sync complete": "همگامسازی کامل شد",
|
||||
"Everything is already up to date.": "همه چیز از قبل بهروز است.",
|
||||
"Browsing {{path}} on {{server}}": "مرور {{path}} در {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "برای مرور فایلهای راهدور خود به یک سرور WebDAV متصل شوید.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "بارگذاری فایلهای کتاب",
|
||||
"Sync now": "همگامسازی اکنون",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "نمایش رمز عبور",
|
||||
"Root Directory": "دایرکتوری اصلی",
|
||||
"Syncing…": "در حال همگامسازی…",
|
||||
"pulled progress for {{n}} book(s)": "پیشرفت {{n}} کتاب دریافت شد",
|
||||
"Sync History": "تاریخچه همگامسازی",
|
||||
"Clear Sync History": "پاک کردن تاریخچه همگامسازی",
|
||||
"No manual syncs yet": "هنوز همگامسازی دستی انجام نشده",
|
||||
"Partial": "جزئی",
|
||||
"Cleanup": "پاکسازی",
|
||||
"Cleanup failed": "پاکسازی ناموفق",
|
||||
"Sync failed": "همگامسازی ناموفق بود",
|
||||
"{{n}} deleted": "{{n}} حذفشده",
|
||||
"{{n}} failed": "{{n}} ناموفق",
|
||||
"Nothing deleted": "چیزی حذف نشد",
|
||||
"{{n}} downloaded": "{{n}} دانلودشده",
|
||||
"{{n}} uploaded": "{{n}} بارگذاریشده",
|
||||
"{{n}} progress": "{{n}} پیشرفت",
|
||||
"Up to date": "بهروز",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "کتابهای دانلودشده",
|
||||
"Files uploaded": "فایلهای بارگذاریشده",
|
||||
"Configs uploaded": "پیکربندیهای بارگذاریشده",
|
||||
"Configs downloaded": "پیکربندیهای دانلودشده",
|
||||
"Covers uploaded": "جلدهای بارگذاریشده",
|
||||
"Books deleted": "کتابهای حذفشده",
|
||||
"Files in sync": "فایلهای همگامشده",
|
||||
"Failures": "خطاها",
|
||||
"Total books": "مجموع کتابها",
|
||||
"Error:": "خطا:",
|
||||
"Failed books": "کتابهای ناموفق",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} کتاب از سرور حذف شد.",
|
||||
"Failed to load directory": "بارگذاری پوشه ناموفق بود",
|
||||
"File download is only supported on the desktop and mobile apps.": "دانلود فایل تنها در برنامههای دسکتاپ و موبایل پشتیبانی میشود.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "افزونه مرورگر Readest را نصب کنید تا مقالهای را که میخوانید به کتابخانهتان بفرستید. صفحه را از مرورگر شما برش میدهد تا سایتهای پولی و نیازمند ورود نیز کار کنند.",
|
||||
"Added to your library. It will sync to your other devices.": "به کتابخانه شما اضافه شد. با سایر دستگاههای شما همگام میشود.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "عبارت عبور همگامسازی فراموش شد. تمام فیلدهای رمزگذاریشده پاک شدند.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "فقط همگامسازیهای دستی و پاکسازیها. همگامسازیهای خودکار هنگام مطالعه اینجا ثبت نمیشوند.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} کتاب از سرور WebDAV حذف شود؟\n\nاین فقط فایلهای راهدور را حذف میکند؛ کتابخانه محلی شما دستنخورده میماند. حذف غیرقابل بازگشت است. دادههای روی سرور برای همیشه از بین میرود.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "فایلهای کتاب را به دستگاههای دیگر شما بارگذاری میکند.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "عبارت عبور همگامسازی نادرست است. اعتبارنامههای همگامشده قابل رمزگشایی نبودند.",
|
||||
"Email books straight to your library": "کتابها را مستقیماً به کتابخانهتان ایمیل کنید",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "پیوستها و مقالات را به آدرس خصوصی Readest خود ارسال کنید. در پلنهای Plus، Pro و Lifetime در دسترس است.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "همچنین وضعیت مطالعه، یادداشتها و نشانکها را پاک میکند.",
|
||||
"Background Image (Library)": "تصویر پسزمینه (کتابخانه)",
|
||||
"Background Image (Reader)": "تصویر پسزمینه (صفحه مطالعه)",
|
||||
"updated metadata for {{n}} book(s)": "متادیتای {{n}} کتاب بهروزرسانی شد",
|
||||
"{{n}} metadata": "{{n}} متادیتا",
|
||||
"Metadata updated": "متادیتا بهروزرسانی شد",
|
||||
"Filter": "فیلتر",
|
||||
"Sort by": "مرتبسازی بر اساس",
|
||||
"Date modified": "تاریخ تغییر",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "دانهبندی",
|
||||
"Refresh Page": "تازهسازی صفحه",
|
||||
"Recently read": "اخیراً خواندهشده",
|
||||
"Show recently read": "نمایش موارد اخیراً خواندهشده"
|
||||
"Show recently read": "نمایش موارد اخیراً خواندهشده",
|
||||
"Find:": "جستجو:",
|
||||
"Enable rule": "فعال کردن قانون",
|
||||
"Disable rule": "غیرفعال کردن قانون",
|
||||
"Progress Read": "وضعیت مطالعه",
|
||||
"Auto-import new books from this folder": "وارد کردن خودکار کتابهای جدید از این پوشه",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "وقتی کتابهای جدیدی به این پوشه اضافه شوند، دفعه بعدی که Readest باز شود یا به پیشزمینه بازگردد، بهطور خودکار وارد میشوند.",
|
||||
"Reading aloud": "در حال خواندن با صدای بلند",
|
||||
"Open Book": "باز کردن کتاب",
|
||||
"Stop reading aloud": "توقف خواندن با صدای بلند",
|
||||
"Enter at least two words": "حداقل دو کلمه وارد کنید",
|
||||
"Search failed": "جستجو ناموفق بود",
|
||||
"Search with regex": "جستجو با عبارت باقاعده",
|
||||
"Words to find near each other": "کلماتی که باید نزدیک هم پیدا شوند",
|
||||
"Contains": "شامل",
|
||||
"Whole Words": "کل کلمات",
|
||||
"Regular Expression": "عبارت باقاعده",
|
||||
"Nearby Words": "کلمات نزدیک",
|
||||
"Within N words": "در محدوده N کلمه",
|
||||
"Not for regex": "برای عبارت باقاعده در دسترس نیست",
|
||||
"No results found": "نتیجهای یافت نشد",
|
||||
"{{count}} results_one": "{{count}} نتیجه",
|
||||
"{{count}} results_other": "{{count}} نتیجه",
|
||||
"Failed to seek": "جابهجایی ناموفق بود",
|
||||
"Chapter progress": "پیشرفت فصل",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} از {{total}}",
|
||||
"Decrease Contrast": "کاهش کنتراست",
|
||||
"Reset Contrast": "بازنشانی کنتراست",
|
||||
"Increase Contrast": "افزایش کنتراست",
|
||||
"Push": "هل دادن",
|
||||
"Slide": "لغزش",
|
||||
"Page Curl": "پیچش صفحه",
|
||||
"Animation Style": "سبک انیمیشن",
|
||||
"Appearance": "ظاهر",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "اندازه متن نتایج فرهنگ لغت را مستقل از نمای مطالعه تنظیم میکند.",
|
||||
"Authentication failed. Reconnect in Settings.": "احراز هویت ناموفق بود. در تنظیمات دوباره متصل شوید.",
|
||||
"Full Sync": "همگامسازی کامل",
|
||||
"Waiting for sign-in…": "در انتظار ورود…",
|
||||
"Reconnect": "اتصال دوباره",
|
||||
"Connected as {{account}}": "متصل بهعنوان {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive را ارائهدهنده فعال ابری قرار دهید.",
|
||||
"Use Google Drive": "استفاده از Google Drive",
|
||||
"Sign-in opens in your browser.": "ورود در مرورگر شما باز میشود.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest فقط به فایلهایی دسترسی دارد که خودش در Drive شما ایجاد میکند.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "کتابخانه، وضعیت مطالعه و هایلایتهای خود را با یک سرور WebDAV همگامسازی کنید.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "کتابخانه، وضعیت مطالعه و هایلایتهای خود را با Google Drive خود همگامسازی کنید.",
|
||||
"Configured": "پیکربندی شده",
|
||||
"Use WebDAV": "استفاده از WebDAV",
|
||||
"Cloud Sync": "همگامسازی ابری",
|
||||
"Extra Large": "خیلی بزرگ",
|
||||
"Hint size": "اندازه توضیح",
|
||||
"Gloss text size above the word": "اندازه متن توضیح بالای کلمه",
|
||||
"Hint color": "رنگ توضیح",
|
||||
"Adjust Text Selection": "تنظیم انتخاب متن",
|
||||
"Your books will appear here": "کتابهای شما اینجا نمایش داده میشوند",
|
||||
"Reading aloud continues in the background": "خواندن با صدای بلند در پسزمینه ادامه مییابد",
|
||||
"Stopped reading aloud": "خواندن با صدای بلند متوقف شد",
|
||||
"Read aloud stopped": "خواندن با صدای بلند متوقف شده است",
|
||||
"Cloud provider switched": "ارائهدهنده ابری تغییر کرد",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "تا زمانی که همگامسازی {{provider}} انتخاب شده باشد، بارگذاری در Readest Cloud متوقف است",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "تا زمانی که {{provider}} ارائهدهنده همگامسازی ابری شماست، توسط آن مدیریت میشود",
|
||||
"Not signed in": "وارد نشدهاید",
|
||||
"Paused — plan required": "متوقف شده — به طرح اشتراک نیاز است",
|
||||
"Active · Book file uploads off": "فعال · بارگذاری فایلهای کتاب خاموش است",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "تنظیمات برنامه، آمار مطالعه و واژهنامهها تا زمانی که وارد شده باشید همچنان از طریق حساب Readest شما همگامسازی میشوند.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "کتابخانه، وضعیت مطالعه و هایلایتهای خود را با Readest Cloud همگامسازی کنید.",
|
||||
"Account and Storage": "حساب و فضای ذخیرهسازی",
|
||||
"Manage your plan and stored files": "مدیریت طرح اشتراک و فایلهای ذخیرهشده",
|
||||
"Cloud sync provider": "ارائهدهنده همگامسازی ابری",
|
||||
"Use Readest Cloud": "استفاده از Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "دستگاه دیگری هنوز این کتابخانه را از طریق Readest Cloud همگامسازی میکند",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} بارگذاری ناموفق بود: سهمیهی ذخیرهسازی کافی نیست",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} بارگذاری ناموفق بود: سهمیهی ذخیرهسازی کافی نیست",
|
||||
"Library sync via {{provider}}": "همگامسازی کتابخانه از طریق {{provider}}",
|
||||
"Google Drive session expired": "نشست Google Drive منقضی شده است",
|
||||
"Cloud sync session expired": "نشست همگامسازی ابری منقضی شده است",
|
||||
"Uploads book files to your other devices": "فایلهای کتاب را روی دستگاههای دیگر شما بارگذاری میکند",
|
||||
"Re-check every book instead of only changed ones": "بررسی مجدد هر کتاب بهجای فقط کتابهای تغییریافته",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "باکت پیدا نشد",
|
||||
"Endpoint": "نقطه پایانی",
|
||||
"Bucket": "باکت",
|
||||
"Region": "ناحیه",
|
||||
"Access Key ID": "شناسه کلید دسترسی",
|
||||
"Your Access Key ID": "شناسه کلید دسترسی شما",
|
||||
"Secret Access Key": "کلید دسترسی محرمانه",
|
||||
"Your Secret Access Key": "کلید دسترسی محرمانه شما",
|
||||
"S3-Compatible Storage": "فضای ذخیرهسازی سازگار با S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "کتابخانه، پیشرفت مطالعه و هایلایتهای خود را با یک باکت سازگار با S3 مانند Cloudflare R2، AWS S3 یا MinIO همگامسازی کنید.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "در مرورگر، سیاست CORS باکت باید مبدأ این سایت را مجاز کند.",
|
||||
"Use S3": "استفاده از S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "پیش از اتصال مطمئن شوید باکت وجود دارد و اعتبارنامهها دسترسی خواندن/نوشتن دارند.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "تا زمانی که {{provider}} انتخاب شده باشد، کتابها، پیشرفت و یادداشتها فقط با سرور شما همگامسازی میشوند.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "تا زمانی که {{provider}} انتخاب شده باشد، کتابها، پیشرفت و یادداشتها فقط با Drive شما همگامسازی میشوند.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "تا زمانی که {{provider}} انتخاب شده باشد، کتابها، پیشرفت و یادداشتها فقط با باکت شما همگامسازی میشوند.",
|
||||
"Premium": "پریمیوم",
|
||||
"S3 Storage": "فضای ذخیرهسازی S3",
|
||||
"Speed": "سرعت",
|
||||
"{{time}} left in chapter": "{{time}} از فصل باقی مانده",
|
||||
"Open Read Aloud player": "باز کردن پخشکننده خواندن با صدای بلند",
|
||||
"Read Aloud": "خواندن با صدای بلند",
|
||||
"Voice": "صدا",
|
||||
"Sleep Timer": "تایمر خواب",
|
||||
"Slower": "کندتر",
|
||||
"Faster": "سریعتر",
|
||||
"Exit Auto Scroll": "خروج از پیمایش خودکار",
|
||||
"Auto Scroll": "پیمایش خودکار",
|
||||
"End of book": "پایان کتاب",
|
||||
"Toggle Auto Scroll": "تغییر پیمایش خودکار"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Modifier",
|
||||
"Excerpts": "Extraits",
|
||||
"Failed to import book(s): {{filenames}}": "Échec de l'importation du/des livre(s) : {{filenames}}",
|
||||
"Fast": "Rapide",
|
||||
"Font": "Police",
|
||||
"Font & Layout": "Police et mise en page",
|
||||
"Font Face": "Style de police",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Connecté en tant que {{userDisplayName}}",
|
||||
"Match Case": "Respecter la casse",
|
||||
"Match Diacritics": "Respecter les accents",
|
||||
"Match Whole Words": "Mots entiers",
|
||||
"Maximum Number of Columns": "Nombre maximal de colonnes",
|
||||
"Minimum Font Size": "Taille minimale de police",
|
||||
"Monospace Font": "Police monospace",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Se connecter",
|
||||
"Sign Out": "Se déconnecter",
|
||||
"Sky": "Ciel",
|
||||
"Slow": "Lent",
|
||||
"Solarized": "Solarisé",
|
||||
"Speak": "Lire",
|
||||
"Subjects": "Sujets",
|
||||
@@ -586,9 +583,6 @@
|
||||
"Start Migration": "Démarrer la Migration",
|
||||
"Advanced Settings": "Paramètres Avancés",
|
||||
"File count: {{size}}": "Nombre de fichiers : {{size}}",
|
||||
"Background Read Aloud": "Lecture Vocale en Arrière-Plan",
|
||||
"Ready to read aloud": "Prêt à lire à haute voix",
|
||||
"Read Aloud": "Lire à haute voix",
|
||||
"Screen Brightness": "Luminosité de l'Écran",
|
||||
"Background Image": "Image de Fond",
|
||||
"Import Image": "Importer une Image",
|
||||
@@ -891,7 +885,6 @@
|
||||
"Export": "Exporter",
|
||||
"Set Timeout": "Définir le délai",
|
||||
"Select Voice": "Sélectionner la voix",
|
||||
"Toggle Sticky Bottom TTS Bar": "Basculer la barre TTS fixée",
|
||||
"Display what I'm reading on Discord": "Afficher ce que je lis sur Discord",
|
||||
"Show on Discord": "Afficher sur Discord",
|
||||
"Instant {{action}}": "{{action}} instantané",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Échec de l'authentification WebDAV. Reconnectez-vous dans les Réglages.",
|
||||
"Downloading": "Téléchargement",
|
||||
"Uploading": "Téléversement",
|
||||
"downloaded {{n}} book(s)": "{{n}} livre(s) téléchargé(s)",
|
||||
"pushed {{n}} config(s)": "{{n}} configuration(s) envoyée(s)",
|
||||
"uploaded {{n}} new file(s)": "{{n}} nouveau(x) fichier(s) téléversé(s)",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisation terminée avec {{failed}} échec(s). {{ok}} ok.",
|
||||
"Sync complete": "Synchronisation terminée",
|
||||
"Everything is already up to date.": "Tout est déjà à jour.",
|
||||
"Browsing {{path}} on {{server}}": "Navigation dans {{path}} sur {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Connectez-vous à un serveur WebDAV pour parcourir vos fichiers distants.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Téléverser les fichiers de livres",
|
||||
"Sync now": "Synchroniser maintenant",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Afficher le mot de passe",
|
||||
"Root Directory": "Répertoire racine",
|
||||
"Syncing…": "Synchronisation…",
|
||||
"pulled progress for {{n}} book(s)": "progression récupérée pour {{n}} livre(s)",
|
||||
"Sync History": "Historique de synchronisation",
|
||||
"Clear Sync History": "Effacer l'historique de synchronisation",
|
||||
"No manual syncs yet": "Aucune synchronisation manuelle pour le moment",
|
||||
"Partial": "Partiel",
|
||||
"Cleanup": "Nettoyage",
|
||||
"Cleanup failed": "Échec du nettoyage",
|
||||
"Sync failed": "Échec de la synchronisation",
|
||||
"{{n}} deleted": "{{n}} supprimés",
|
||||
"{{n}} failed": "{{n}} en échec",
|
||||
"Nothing deleted": "Rien de supprimé",
|
||||
"{{n}} downloaded": "{{n}} téléchargés",
|
||||
"{{n}} uploaded": "{{n}} téléversés",
|
||||
"{{n}} progress": "{{n}} de progression",
|
||||
"Up to date": "À jour",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Livres téléchargés",
|
||||
"Files uploaded": "Fichiers téléversés",
|
||||
"Configs uploaded": "Configurations téléversées",
|
||||
"Configs downloaded": "Configurations téléchargées",
|
||||
"Covers uploaded": "Couvertures téléversées",
|
||||
"Books deleted": "Livres supprimés",
|
||||
"Files in sync": "Fichiers synchronisés",
|
||||
"Failures": "Échecs",
|
||||
"Total books": "Total des livres",
|
||||
"Error:": "Erreur :",
|
||||
"Failed books": "Livres en échec",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} livre(s) supprimé(s) du serveur.",
|
||||
"Failed to load directory": "Échec du chargement du dossier",
|
||||
"File download is only supported on the desktop and mobile apps.": "Le téléchargement de fichiers n'est pris en charge que dans les applications de bureau et mobiles.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installez l'extension de navigateur Readest pour envoyer l'article que vous lisez à votre bibliothèque. Elle capture la page depuis votre navigateur, de sorte que les sites payants ou nécessitant une connexion fonctionnent toujours.",
|
||||
"Added to your library. It will sync to your other devices.": "Ajouté à votre bibliothèque. Il sera synchronisé avec vos autres appareils.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Phrase secrète de synchronisation oubliée. Tous les champs chiffrés ont été effacés.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Synchronisations manuelles et nettoyages uniquement. Les synchronisations automatiques pendant la lecture ne sont pas enregistrées ici.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Supprimer {{n}} livre(s) du serveur WebDAV ?\n\nCela ne supprime que les fichiers distants ; votre bibliothèque locale n'est pas affectée. La suppression est irréversible. Les octets sur le serveur seront définitivement perdus.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Téléverse les fichiers de livres vers vos autres appareils.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Phrase secrète de synchronisation incorrecte. Les identifiants synchronisés n'ont pas pu être déchiffrés.",
|
||||
"Email books straight to your library": "Envoyez des livres par e-mail directement dans votre bibliothèque",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Transférez les pièces jointes et les articles vers votre adresse Readest privée. Disponible avec les forfaits Plus, Pro et Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Efface aussi la progression de lecture, les notes et les signets.",
|
||||
"Background Image (Library)": "Image de Fond (Bibliothèque)",
|
||||
"Background Image (Reader)": "Image de Fond (Vue de lecture)",
|
||||
"updated metadata for {{n}} book(s)": "métadonnées mises à jour pour {{n}} livre(s)",
|
||||
"{{n}} metadata": "{{n}} métadonnées",
|
||||
"Metadata updated": "Métadonnées mises à jour",
|
||||
"Filter": "Filtrer",
|
||||
"Sort by": "Trier par",
|
||||
"Date modified": "Date de modification",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularité",
|
||||
"Refresh Page": "Actualiser la page",
|
||||
"Recently read": "Lectures récentes",
|
||||
"Show recently read": "Afficher les lectures récentes"
|
||||
"Show recently read": "Afficher les lectures récentes",
|
||||
"Find:": "Rechercher :",
|
||||
"Enable rule": "Activer la règle",
|
||||
"Disable rule": "Désactiver la règle",
|
||||
"Progress Read": "Progression de lecture",
|
||||
"Auto-import new books from this folder": "Importer automatiquement les nouveaux livres de ce dossier",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Lorsque de nouveaux livres sont ajoutés à ce dossier, ils sont importés automatiquement à la prochaine ouverture de Readest ou à son retour au premier plan.",
|
||||
"Reading aloud": "Lecture à haute voix",
|
||||
"Open Book": "Ouvrir le livre",
|
||||
"Stop reading aloud": "Arrêter la lecture à haute voix",
|
||||
"Enter at least two words": "Saisissez au moins deux mots",
|
||||
"Search failed": "Échec de la recherche",
|
||||
"Search with regex": "Rechercher avec une regex",
|
||||
"Words to find near each other": "Mots à trouver à proximité les uns des autres",
|
||||
"Contains": "Contient",
|
||||
"Whole Words": "Mots entiers",
|
||||
"Regular Expression": "Expression régulière",
|
||||
"Nearby Words": "Mots proches",
|
||||
"Within N words": "À moins de N mots",
|
||||
"Not for regex": "Indisponible avec les regex",
|
||||
"No results found": "Aucun résultat trouvé",
|
||||
"{{count}} results_one": "{{count}} résultat",
|
||||
"{{count}} results_many": "{{count}} de résultats",
|
||||
"{{count}} results_other": "{{count}} résultats",
|
||||
"Failed to seek": "Échec du positionnement",
|
||||
"Chapter progress": "Progression du chapitre",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} sur {{total}}",
|
||||
"Decrease Contrast": "Diminuer le contraste",
|
||||
"Reset Contrast": "Réinitialiser le contraste",
|
||||
"Increase Contrast": "Augmenter le contraste",
|
||||
"Push": "Poussée",
|
||||
"Slide": "Glissement",
|
||||
"Page Curl": "Courbure de page",
|
||||
"Animation Style": "Style d'animation",
|
||||
"Appearance": "Apparence",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Définit la taille du texte des résultats du dictionnaire, indépendamment de la vue de lecture.",
|
||||
"Authentication failed. Reconnect in Settings.": "Échec de l'authentification. Reconnectez-vous dans les Réglages.",
|
||||
"Full Sync": "Synchronisation complète",
|
||||
"Waiting for sign-in…": "En attente de connexion…",
|
||||
"Reconnect": "Se reconnecter",
|
||||
"Connected as {{account}}": "Connecté en tant que {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Faites de Google Drive le fournisseur cloud actif.",
|
||||
"Use Google Drive": "Utiliser Google Drive",
|
||||
"Sign-in opens in your browser.": "La connexion s'ouvre dans votre navigateur.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest accède uniquement aux fichiers qu'il crée dans votre Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec un serveur WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec votre Google Drive.",
|
||||
"Configured": "Configuré",
|
||||
"Use WebDAV": "Utiliser WebDAV",
|
||||
"Cloud Sync": "Synchronisation cloud",
|
||||
"Extra Large": "Très grand",
|
||||
"Hint size": "Taille de l'indice",
|
||||
"Gloss text size above the word": "Taille du texte de l'indice au-dessus du mot",
|
||||
"Hint color": "Couleur de l'indice",
|
||||
"Adjust Text Selection": "Ajuster la sélection de texte",
|
||||
"Your books will appear here": "Vos livres apparaîtront ici",
|
||||
"Reading aloud continues in the background": "La lecture à haute voix continue en arrière-plan",
|
||||
"Stopped reading aloud": "Lecture à haute voix arrêtée",
|
||||
"Read aloud stopped": "Lecture à haute voix arrêtée",
|
||||
"Cloud provider switched": "Fournisseur cloud changé",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Les téléversements vers Readest Cloud sont en pause tant que la synchronisation {{provider}} est sélectionnée",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Géré par {{provider}} tant qu'il est votre fournisseur de synchronisation cloud",
|
||||
"Not signed in": "Non connecté",
|
||||
"Paused — plan required": "En pause — abonnement requis",
|
||||
"Active · Book file uploads off": "Actif · Téléversement des fichiers de livres désactivé",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Les paramètres de l'application, les statistiques de lecture et les dictionnaires continuent de se synchroniser via votre compte Readest tant que vous êtes connecté.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec Readest Cloud.",
|
||||
"Account and Storage": "Compte et stockage",
|
||||
"Manage your plan and stored files": "Gérer votre abonnement et vos fichiers stockés",
|
||||
"Cloud sync provider": "Fournisseur de synchronisation cloud",
|
||||
"Use Readest Cloud": "Utiliser Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Un autre appareil synchronise encore cette bibliothèque via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} téléversement échoué : quota de stockage insuffisant",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} téléversements échoués : quota de stockage insuffisant",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} téléversements échoués : quota de stockage insuffisant",
|
||||
"Library sync via {{provider}}": "Synchronisation de la bibliothèque via {{provider}}",
|
||||
"Google Drive session expired": "Session Google Drive expirée",
|
||||
"Cloud sync session expired": "Session de synchronisation cloud expirée",
|
||||
"Uploads book files to your other devices": "Téléverse les fichiers de livres vers vos autres appareils",
|
||||
"Re-check every book instead of only changed ones": "Revérifier chaque livre au lieu des seuls livres modifiés",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket introuvable",
|
||||
"Endpoint": "Point de terminaison",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Région",
|
||||
"Access Key ID": "ID de clé d'accès",
|
||||
"Your Access Key ID": "Votre ID de clé d'accès",
|
||||
"Secret Access Key": "Clé d'accès secrète",
|
||||
"Your Secret Access Key": "Votre clé d'accès secrète",
|
||||
"S3-Compatible Storage": "Stockage compatible S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec un bucket compatible S3 tel que Cloudflare R2, AWS S3 ou MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Dans le navigateur, la politique CORS du bucket doit autoriser l'origine de ce site.",
|
||||
"Use S3": "Utiliser S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Avant de vous connecter, assurez-vous que le bucket existe et que les identifiants disposent d'un accès en lecture/écriture.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Tant que {{provider}} est sélectionné, les livres, la progression et les annotations ne se synchronisent qu'avec votre serveur.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Tant que {{provider}} est sélectionné, les livres, la progression et les annotations ne se synchronisent qu'avec votre Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Tant que {{provider}} est sélectionné, les livres, la progression et les annotations ne se synchronisent qu'avec votre bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Stockage S3",
|
||||
"Speed": "Vitesse",
|
||||
"{{time}} left in chapter": "{{time}} restant dans le chapitre",
|
||||
"Open Read Aloud player": "Ouvrir le lecteur de lecture à voix haute",
|
||||
"Read Aloud": "Lecture à voix haute",
|
||||
"Voice": "Voix",
|
||||
"Sleep Timer": "Minuteur de veille",
|
||||
"Slower": "Plus lent",
|
||||
"Faster": "Plus rapide",
|
||||
"Exit Auto Scroll": "Quitter le défilement automatique",
|
||||
"Auto Scroll": "Défilement automatique",
|
||||
"End of book": "Fin du livre",
|
||||
"Toggle Auto Scroll": "Basculer le défilement automatique"
|
||||
}
|
||||
|
||||
@@ -144,7 +144,6 @@
|
||||
"Always on Top": "תמיד למעלה",
|
||||
"Always Show Status Bar": "תמיד הצג שורת סטטוס",
|
||||
"Keep Screen Awake": "השאר מסך פעיל",
|
||||
"Background Read Aloud": "הקראה ברקע",
|
||||
"Reload Page": "טען דף מחדש",
|
||||
"Settings": "הגדרות",
|
||||
"Advanced Settings": "הגדרות מתקדמות",
|
||||
@@ -542,7 +541,6 @@
|
||||
"Clear search history": "נקה היסטוריית חיפוש",
|
||||
"Chapter": "פרק",
|
||||
"Match Case": "התאמת רישיות (Match Case)",
|
||||
"Match Whole Words": "התאמת מילים שלמות",
|
||||
"Match Diacritics": "התאמת סימני דיאקריטיקה",
|
||||
"Search results for '{{term}}'": "תוצאות חיפוש עבור '{{term}}'",
|
||||
"Previous Result": "תוצאה קודמת",
|
||||
@@ -561,8 +559,6 @@
|
||||
"Translation Disabled": "התרגום מושבת",
|
||||
"Previous Sentence": "משפט קודם",
|
||||
"Next Sentence": "משפט הבא",
|
||||
"Read Aloud": "הקרא בקול",
|
||||
"Ready to read aloud": "מוכן להקראה בקול",
|
||||
"Please log in to use advanced TTS features": "אנא התחבר כדי להשתמש בתכונות TTS מתקדמות",
|
||||
"TTS not supported for this document": "TTS אינו נתמך עבור מסמך זה",
|
||||
"Back to TTS Location": "חזור למיקום ה-TTS",
|
||||
@@ -572,14 +568,11 @@
|
||||
"{{value}} hour": "שעה {{value}}",
|
||||
"{{value}} hours": "{{value}} שעות",
|
||||
"Voices for {{lang}}": "קולות עבור {{lang}}",
|
||||
"Slow": "איטי",
|
||||
"Fast": "מהיר",
|
||||
"Set Timeout": "הגדר הגבלת זמן",
|
||||
"Select Voice": "בחר קול",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: קול אחד",
|
||||
"{{engine}}: {{count}} voices_two": "{{engine}}: {{count}} קולות",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} קולות",
|
||||
"Toggle Sticky Bottom TTS Bar": "הצג/הסתר שורת TTS תחתונה קבועה",
|
||||
"Zoom Level": "רמת זום",
|
||||
"Zoom Out": "הקטן",
|
||||
"Reset Zoom": "אפס זום",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "אימות WebDAV נכשל. התחבר מחדש בהגדרות.",
|
||||
"Downloading": "מוריד",
|
||||
"Uploading": "מעלה",
|
||||
"downloaded {{n}} book(s)": "הורדו {{n}} ספרים",
|
||||
"pushed {{n}} config(s)": "נשלחו {{n}} הגדרות",
|
||||
"uploaded {{n}} new file(s)": "הועלו {{n}} קבצים חדשים",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "הסנכרון הסתיים עם {{failed}} כשלים. {{ok}} הצליחו.",
|
||||
"Sync complete": "הסנכרון הושלם",
|
||||
"Everything is already up to date.": "הכל כבר מעודכן.",
|
||||
"Browsing {{path}} on {{server}}": "דפדוף ב-{{path}} בשרת {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "התחבר לשרת WebDAV כדי לעיין בקבצים המרוחקים שלך.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "העלאת קובצי ספרים",
|
||||
"Sync now": "סנכרן עכשיו",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "הצג סיסמה",
|
||||
"Root Directory": "תיקיית שורש",
|
||||
"Syncing…": "מסנכרן…",
|
||||
"pulled progress for {{n}} book(s)": "הובאה התקדמות עבור {{n}} ספרים",
|
||||
"Sync History": "היסטוריית סנכרון",
|
||||
"Clear Sync History": "מחק היסטוריית סנכרון",
|
||||
"No manual syncs yet": "אין סנכרונים ידניים עדיין",
|
||||
"Partial": "חלקי",
|
||||
"Cleanup": "ניקוי",
|
||||
"Cleanup failed": "הניקוי נכשל",
|
||||
"Sync failed": "הסנכרון נכשל",
|
||||
"{{n}} deleted": "{{n}} נמחקו",
|
||||
"{{n}} failed": "{{n}} נכשלו",
|
||||
"Nothing deleted": "לא נמחק דבר",
|
||||
"{{n}} downloaded": "{{n}} הורדו",
|
||||
"{{n}} uploaded": "{{n}} הועלו",
|
||||
"{{n}} progress": "{{n}} התקדמות",
|
||||
"Up to date": "מעודכן",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "ספרים שהורדו",
|
||||
"Files uploaded": "קבצים שהועלו",
|
||||
"Configs uploaded": "הגדרות שהועלו",
|
||||
"Configs downloaded": "הגדרות שהורדו",
|
||||
"Covers uploaded": "כריכות שהועלו",
|
||||
"Books deleted": "ספרים שנמחקו",
|
||||
"Files in sync": "קבצים מסונכרנים",
|
||||
"Failures": "כשלים",
|
||||
"Total books": "סך הספרים",
|
||||
"Error:": "שגיאה:",
|
||||
"Failed books": "ספרים שנכשלו",
|
||||
"Deleted {{n}} book(s) from server.": "נמחקו {{n}} ספרים מהשרת.",
|
||||
"Failed to load directory": "טעינת התיקייה נכשלה",
|
||||
"File download is only supported on the desktop and mobile apps.": "הורדת קבצים נתמכת רק באפליקציות שולחן העבודה והנייד.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "התקן את הרחבת הדפדפן של Readest כדי לשלוח את המאמר שאתה קורא לספרייה שלך. היא חותכת את הדף מהדפדפן שלך כך שאתרים בתשלום ואתרים הדורשים התחברות עדיין יעבדו.",
|
||||
"Added to your library. It will sync to your other devices.": "נוסף לספרייה שלך. הוא יסונכרן עם המכשירים האחרים שלך.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "משפט הסיסמה לסנכרון נשכח. כל השדות המוצפנים נמחקו.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "רק סנכרונים ידניים וניקויים. סנכרונים אוטומטיים בזמן קריאה אינם נרשמים כאן.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "למחוק {{n}} ספרים משרת ה-WebDAV?\n\nפעולה זו מסירה רק את הקבצים המרוחקים; הספרייה המקומית שלך אינה מושפעת. לא ניתן לבטל את המחיקה. הבייטים בשרת ייעלמו לתמיד.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "מעלה את קובצי הספרים למכשירים האחרים שלך.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "משפט סיסמה לסנכרון שגוי. לא ניתן היה לפענח את פרטי הכניסה המסונכרנים.",
|
||||
"Email books straight to your library": "שלח ספרים ישירות לספרייה שלך באמצעות אימייל",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "העבר קבצים מצורפים ומאמרים לכתובת Readest הפרטית שלך. זמין בתוכניות Plus, Pro ו-Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "מוחק גם את התקדמות הקריאה, ההערות והסימניות.",
|
||||
"Background Image (Library)": "תמונת רקע (ספרייה)",
|
||||
"Background Image (Reader)": "תמונת רקע (מצב קריאה)",
|
||||
"updated metadata for {{n}} book(s)": "המטא-נתונים עודכנו עבור {{n}} ספרים",
|
||||
"{{n}} metadata": "{{n}} מטא-נתונים",
|
||||
"Metadata updated": "המטא-נתונים עודכנו",
|
||||
"Filter": "סינון",
|
||||
"Sort by": "מיין לפי",
|
||||
"Date modified": "תאריך שינוי",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "רמת פירוט",
|
||||
"Refresh Page": "רענן דף",
|
||||
"Recently read": "נקראו לאחרונה",
|
||||
"Show recently read": "הצגת ספרים שנקראו לאחרונה"
|
||||
"Show recently read": "הצגת ספרים שנקראו לאחרונה",
|
||||
"Find:": "חיפוש:",
|
||||
"Enable rule": "הפעל כלל",
|
||||
"Disable rule": "השבת כלל",
|
||||
"Progress Read": "התקדמות קריאה",
|
||||
"Auto-import new books from this folder": "ייבוא אוטומטי של ספרים חדשים מתיקייה זו",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "כאשר ספרים חדשים מתווספים לתיקייה זו, הם ייובאו אוטומטית בפעם הבאה ש-Readest ייפתח או יחזור לחזית.",
|
||||
"Reading aloud": "מקריא בקול",
|
||||
"Open Book": "פתח ספר",
|
||||
"Stop reading aloud": "הפסק הקראה בקול",
|
||||
"Enter at least two words": "הזן לפחות שתי מילים",
|
||||
"Search failed": "החיפוש נכשל",
|
||||
"Search with regex": "חיפוש עם ביטוי רגולרי",
|
||||
"Words to find near each other": "מילים לחיפוש בסמיכות זו לזו",
|
||||
"Contains": "מכיל",
|
||||
"Whole Words": "מילים שלמות",
|
||||
"Regular Expression": "ביטוי רגולרי",
|
||||
"Nearby Words": "מילים סמוכות",
|
||||
"Within N words": "בטווח של N מילים",
|
||||
"Not for regex": "לא זמין לביטוי רגולרי",
|
||||
"No results found": "לא נמצאו תוצאות",
|
||||
"{{count}} results_one": "תוצאה אחת",
|
||||
"{{count}} results_two": "{{count}} תוצאות",
|
||||
"{{count}} results_other": "{{count}} תוצאות",
|
||||
"Failed to seek": "הדילוג נכשל",
|
||||
"Chapter progress": "התקדמות הפרק",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} מתוך {{total}}",
|
||||
"Decrease Contrast": "הפחת ניגודיות",
|
||||
"Reset Contrast": "אפס ניגודיות",
|
||||
"Increase Contrast": "הגבר ניגודיות",
|
||||
"Push": "דחיפה",
|
||||
"Slide": "החלקה",
|
||||
"Page Curl": "קיפול דף",
|
||||
"Animation Style": "סגנון אנימציה",
|
||||
"Appearance": "מראה",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "קובע את גודל הטקסט של תוצאות המילון, ללא תלות בתצוגת הקריאה.",
|
||||
"Authentication failed. Reconnect in Settings.": "האימות נכשל. התחבר מחדש בהגדרות.",
|
||||
"Full Sync": "סנכרון מלא",
|
||||
"Waiting for sign-in…": "ממתין להתחברות…",
|
||||
"Reconnect": "התחבר מחדש",
|
||||
"Connected as {{account}}": "מחובר כ-{{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". הפוך את Google Drive לספק הענן הפעיל.",
|
||||
"Use Google Drive": "השתמש ב-Google Drive",
|
||||
"Sign-in opens in your browser.": "ההתחברות נפתחת בדפדפן שלך.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest ניגש רק לקבצים שהוא יוצר ב-Drive שלך.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם שרת WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם Google Drive שלך.",
|
||||
"Configured": "מוגדר",
|
||||
"Use WebDAV": "השתמש ב-WebDAV",
|
||||
"Cloud Sync": "סנכרון ענן",
|
||||
"Extra Large": "גדול במיוחד",
|
||||
"Hint size": "גודל הרמז",
|
||||
"Gloss text size above the word": "גודל טקסט הרמז שמעל המילה",
|
||||
"Hint color": "צבע הרמז",
|
||||
"Adjust Text Selection": "התאמת בחירת טקסט",
|
||||
"Your books will appear here": "הספרים שלך יופיעו כאן",
|
||||
"Reading aloud continues in the background": "ההקראה בקול ממשיכה ברקע",
|
||||
"Stopped reading aloud": "ההקראה בקול הופסקה",
|
||||
"Read aloud stopped": "ההקראה הופסקה",
|
||||
"Cloud provider switched": "ספק הענן הוחלף",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "העלאות ל-Readest Cloud מושהות כל עוד סנכרון {{provider}} נבחר",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "מנוהל על ידי {{provider}} כל עוד הוא ספק סנכרון הענן שלך",
|
||||
"Not signed in": "לא מחובר",
|
||||
"Paused — plan required": "מושהה — נדרש מינוי",
|
||||
"Active · Book file uploads off": "פעיל · העלאת קובצי ספרים כבויה",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "הגדרות האפליקציה, סטטיסטיקות קריאה ומילונים ממשיכים להסתנכרן דרך חשבון Readest שלך כל עוד אתה מחובר.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם Readest Cloud.",
|
||||
"Account and Storage": "חשבון ואחסון",
|
||||
"Manage your plan and stored files": "נהל את המינוי והקבצים המאוחסנים שלך",
|
||||
"Cloud sync provider": "ספק סנכרון ענן",
|
||||
"Use Readest Cloud": "השתמש ב-Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "מכשיר אחר עדיין מסנכרן את הספרייה הזו דרך Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "העלאה {{count}} נכשלה: מכסת אחסון לא מספקת",
|
||||
"{{count}} uploads failed: insufficient storage quota_two": "{{count}} העלאות נכשלו: מכסת אחסון לא מספקת",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} העלאות נכשלו: מכסת אחסון לא מספקת",
|
||||
"Library sync via {{provider}}": "סנכרון הספרייה באמצעות {{provider}}",
|
||||
"Google Drive session expired": "פג תוקף ההפעלה של Google Drive",
|
||||
"Cloud sync session expired": "פג תוקף ההפעלה של סנכרון הענן",
|
||||
"Uploads book files to your other devices": "מעלה קובצי ספרים למכשירים האחרים שלך",
|
||||
"Re-check every book instead of only changed ones": "בדיקה מחדש של כל ספר במקום רק אלה שהשתנו",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "הדלי לא נמצא",
|
||||
"Endpoint": "נקודת קצה",
|
||||
"Bucket": "דלי",
|
||||
"Region": "אזור",
|
||||
"Access Key ID": "מזהה מפתח גישה",
|
||||
"Your Access Key ID": "מזהה מפתח הגישה שלך",
|
||||
"Secret Access Key": "מפתח גישה סודי",
|
||||
"Your Secret Access Key": "מפתח הגישה הסודי שלך",
|
||||
"S3-Compatible Storage": "אחסון תואם S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם דלי תואם S3 כגון Cloudflare R2, AWS S3 או MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "בדפדפן, מדיניות ה-CORS של הדלי חייבת לאפשר את המקור של אתר זה.",
|
||||
"Use S3": "שימוש ב-S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "לפני ההתחברות ודא שהדלי קיים ושלאישורי הגישה יש הרשאות קריאה/כתיבה.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "כאשר {{provider}} נבחר, ספרים, התקדמות והערות מסתנכרנים רק עם השרת שלך.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "כאשר {{provider}} נבחר, ספרים, התקדמות והערות מסתנכרנים רק עם ה-Drive שלך.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "כאשר {{provider}} נבחר, ספרים, התקדמות והערות מסתנכרנים רק עם הדלי שלך.",
|
||||
"Premium": "פרימיום",
|
||||
"S3 Storage": "אחסון S3",
|
||||
"Speed": "מהירות",
|
||||
"{{time}} left in chapter": "נותרו {{time}} בפרק",
|
||||
"Open Read Aloud player": "פתיחת נגן ההקראה",
|
||||
"Read Aloud": "הקראה",
|
||||
"Voice": "קול",
|
||||
"Sleep Timer": "טיימר שינה",
|
||||
"Slower": "איטי יותר",
|
||||
"Faster": "מהיר יותר",
|
||||
"Exit Auto Scroll": "צא מגלילה אוטומטית",
|
||||
"Auto Scroll": "גלילה אוטומטית",
|
||||
"End of book": "סוף הספר",
|
||||
"Toggle Auto Scroll": "החלף גלילה אוטומטית"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "संपादित करें",
|
||||
"Excerpts": "अंश",
|
||||
"Failed to import book(s): {{filenames}}": "पुस्तक(ें) आयात करने में विफल: {{filenames}}",
|
||||
"Fast": "तेज़",
|
||||
"Font": "फ़ॉन्ट",
|
||||
"Font & Layout": "फ़ॉन्ट और लेआउट",
|
||||
"Font Face": "फ़ॉन्ट फेस",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}} के रूप में लॉग इन किया",
|
||||
"Match Case": "केस मैच करें",
|
||||
"Match Diacritics": "डायाक्रिटिक्स मैच करें",
|
||||
"Match Whole Words": "पूरे शब्द मैच करें",
|
||||
"Maximum Number of Columns": "कॉलम की अधिकतम संख्या",
|
||||
"Minimum Font Size": "न्यूनतम फ़ॉन्ट साइज़",
|
||||
"Monospace Font": "मोनोस्पेस फ़ॉन्ट",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "साइन इन करें",
|
||||
"Sign Out": "साइन आउट करें",
|
||||
"Sky": "आकाश",
|
||||
"Slow": "धीमा",
|
||||
"Solarized": "सोलराइज्ड",
|
||||
"Speak": "बोलें",
|
||||
"Subjects": "विषय",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "माइग्रेशन प्रारंभ करें",
|
||||
"Advanced Settings": "उन्नत सेटिंग्स",
|
||||
"File count: {{size}}": "फ़ाइलों की संख्या: {{size}}",
|
||||
"Background Read Aloud": "पृष्ठभूमि में वाचन",
|
||||
"Ready to read aloud": "उच्च स्वर में पढ़ने के लिए तैयार",
|
||||
"Read Aloud": "उच्च स्वर में पढ़ें",
|
||||
"Screen Brightness": "स्क्रीन ब्राइटनेस",
|
||||
"Background Image": "पृष्ठभूमि छवि",
|
||||
"Import Image": "छवि आयात करें",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "निर्यात करें",
|
||||
"Set Timeout": "टाइमआउट सेट करें",
|
||||
"Select Voice": "आवाज़ चुनें",
|
||||
"Toggle Sticky Bottom TTS Bar": "स्थिर TTS बार टॉगल करें",
|
||||
"Display what I'm reading on Discord": "Discord पर पढ़ रही किताब दिखाएं",
|
||||
"Show on Discord": "Discord पर दिखाएं",
|
||||
"Instant {{action}}": "तत्काल {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV प्रमाणीकरण विफल। सेटिंग्स में पुनः कनेक्ट करें।",
|
||||
"Downloading": "डाउनलोड हो रहा है",
|
||||
"Uploading": "अपलोड हो रहा है",
|
||||
"downloaded {{n}} book(s)": "{{n}} किताब(ें) डाउनलोड",
|
||||
"pushed {{n}} config(s)": "{{n}} कॉन्फ़िग भेजे गए",
|
||||
"uploaded {{n}} new file(s)": "{{n}} नई फ़ाइलें अपलोड",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "सिंक {{failed}} विफलताओं के साथ समाप्त। {{ok}} सफल।",
|
||||
"Sync complete": "सिंक पूरा हुआ",
|
||||
"Everything is already up to date.": "सब कुछ पहले से अद्यतन है।",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} पर {{path}} ब्राउज़ कर रहे हैं",
|
||||
"Connect to a WebDAV server to browse your remote files.": "अपनी रिमोट फ़ाइलें ब्राउज़ करने के लिए WebDAV सर्वर से कनेक्ट करें।",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "पुस्तक फ़ाइलें अपलोड करें",
|
||||
"Sync now": "अभी सिंक करें",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "पासवर्ड दिखाएँ",
|
||||
"Root Directory": "रूट निर्देशिका",
|
||||
"Syncing…": "सिंक हो रहा है…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} किताब(ों) की प्रगति प्राप्त की",
|
||||
"Sync History": "सिंक इतिहास",
|
||||
"Clear Sync History": "सिंक इतिहास साफ़ करें",
|
||||
"No manual syncs yet": "अभी तक कोई मैन्युअल सिंक नहीं",
|
||||
"Partial": "आंशिक",
|
||||
"Cleanup": "सफाई",
|
||||
"Cleanup failed": "सफाई विफल",
|
||||
"Sync failed": "सिंक विफल",
|
||||
"{{n}} deleted": "{{n}} हटाई गईं",
|
||||
"{{n}} failed": "{{n}} विफल",
|
||||
"Nothing deleted": "कुछ नहीं हटाया गया",
|
||||
"{{n}} downloaded": "{{n}} डाउनलोड",
|
||||
"{{n}} uploaded": "{{n}} अपलोड",
|
||||
"{{n}} progress": "{{n}} प्रगति",
|
||||
"Up to date": "अद्यतन",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "डाउनलोड की गई किताबें",
|
||||
"Files uploaded": "अपलोड की गई फ़ाइलें",
|
||||
"Configs uploaded": "अपलोड किए गए कॉन्फ़िग",
|
||||
"Configs downloaded": "डाउनलोड किए गए कॉन्फ़िग",
|
||||
"Covers uploaded": "अपलोड किए गए कवर",
|
||||
"Books deleted": "हटाई गई किताबें",
|
||||
"Files in sync": "सिंक में फ़ाइलें",
|
||||
"Failures": "विफलताएँ",
|
||||
"Total books": "कुल किताबें",
|
||||
"Error:": "त्रुटि:",
|
||||
"Failed books": "विफल किताबें",
|
||||
"Deleted {{n}} book(s) from server.": "सर्वर से {{n}} किताब(ें) हटाई गईं।",
|
||||
"Failed to load directory": "निर्देशिका लोड करने में विफल",
|
||||
"File download is only supported on the desktop and mobile apps.": "फ़ाइल डाउनलोड केवल डेस्कटॉप और मोबाइल ऐप्स में समर्थित है।",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "जो लेख आप पढ़ रहे हैं उसे अपनी लाइब्रेरी में भेजने के लिए Readest ब्राउज़र एक्सटेंशन इंस्टॉल करें। यह आपके ब्राउज़र से पृष्ठ को क्लिप करता है ताकि पेवॉल और लॉगिन-केवल साइटें भी काम करें।",
|
||||
"Added to your library. It will sync to your other devices.": "आपकी लाइब्रेरी में जोड़ा गया। यह आपके अन्य उपकरणों के साथ सिंक होगा।",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "सिंक पासफ़्रेज़ भुलाया गया। सभी एन्क्रिप्ट किए गए फ़ील्ड साफ़ कर दिए गए।",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "केवल मैन्युअल सिंक और सफाई। पढ़ते समय स्वचालित सिंक यहाँ लॉग नहीं किए जाते।",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV सर्वर से {{n}} किताब(ें) हटाएं?\n\nयह केवल रिमोट फ़ाइलें हटाता है; आपकी स्थानीय लाइब्रेरी अप्रभावित रहती है। हटाना पूर्ववत नहीं किया जा सकता। सर्वर पर डेटा हमेशा के लिए चला जाएगा।",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "पुस्तक फ़ाइलें आपके अन्य उपकरणों पर अपलोड करता है।",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "गलत सिंक पासफ़्रेज़। सिंक की गई क्रेडेंशियल्स को डिक्रिप्ट नहीं किया जा सका।",
|
||||
"Email books straight to your library": "अपनी लाइब्रेरी में सीधे ईमेल से किताबें भेजें",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "अनुलग्नक और लेख अपने निजी Readest पते पर अग्रेषित करें। Plus, Pro और Lifetime प्लान में उपलब्ध।",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "पढ़ने की प्रगति, नोट्स और बुकमार्क भी मिटा देता है।",
|
||||
"Background Image (Library)": "पृष्ठभूमि छवि (लाइब्रेरी)",
|
||||
"Background Image (Reader)": "पृष्ठभूमि छवि (रीडर)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} पुस्तक(ों) के मेटाडेटा अपडेट किए गए",
|
||||
"{{n}} metadata": "{{n}} मेटाडेटा",
|
||||
"Metadata updated": "मेटाडेटा अपडेट किया गया",
|
||||
"Filter": "फ़िल्टर",
|
||||
"Sort by": "इसके अनुसार क्रमित करें",
|
||||
"Date modified": "संशोधन तिथि",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "सूक्ष्मता",
|
||||
"Refresh Page": "पृष्ठ ताज़ा करें",
|
||||
"Recently read": "हाल ही में पढ़े गए",
|
||||
"Show recently read": "हाल ही में पढ़े गए दिखाएँ"
|
||||
"Show recently read": "हाल ही में पढ़े गए दिखाएँ",
|
||||
"Find:": "खोजें:",
|
||||
"Enable rule": "नियम सक्षम करें",
|
||||
"Disable rule": "नियम अक्षम करें",
|
||||
"Progress Read": "पढ़ने की प्रगति",
|
||||
"Auto-import new books from this folder": "इस फ़ोल्डर से नई पुस्तकें स्वतः आयात करें",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "जब इस फ़ोल्डर में नई पुस्तकें जोड़ी जाती हैं, तो अगली बार Readest खुलने या अग्रभूमि में लौटने पर वे स्वचालित रूप से आयात हो जाएँगी।",
|
||||
"Reading aloud": "उच्च स्वर में पढ़ा जा रहा है",
|
||||
"Open Book": "पुस्तक खोलें",
|
||||
"Stop reading aloud": "उच्च स्वर में पढ़ना रोकें",
|
||||
"Enter at least two words": "कम से कम दो शब्द दर्ज करें",
|
||||
"Search failed": "खोज विफल रही",
|
||||
"Search with regex": "रेगुलर एक्सप्रेशन से खोजें",
|
||||
"Words to find near each other": "एक-दूसरे के पास खोजे जाने वाले शब्द",
|
||||
"Contains": "शामिल है",
|
||||
"Whole Words": "पूरे शब्द",
|
||||
"Regular Expression": "रेगुलर एक्सप्रेशन",
|
||||
"Nearby Words": "आस-पास के शब्द",
|
||||
"Within N words": "N शब्दों के भीतर",
|
||||
"Not for regex": "रेगुलर एक्सप्रेशन के लिए नहीं",
|
||||
"No results found": "कोई परिणाम नहीं मिला",
|
||||
"{{count}} results_one": "{{count}} परिणाम",
|
||||
"{{count}} results_other": "{{count}} परिणाम",
|
||||
"Failed to seek": "सीक करने में विफल",
|
||||
"Chapter progress": "अध्याय की प्रगति",
|
||||
"{{elapsed}} of {{total}}": "{{total}} में से {{elapsed}}",
|
||||
"Decrease Contrast": "विरोधाभास कम करें",
|
||||
"Reset Contrast": "विरोधाभास रीसेट करें",
|
||||
"Increase Contrast": "विरोधाभास बढ़ाएं",
|
||||
"Push": "पुश",
|
||||
"Slide": "स्लाइड",
|
||||
"Page Curl": "पेज कर्ल",
|
||||
"Animation Style": "एनीमेशन शैली",
|
||||
"Appearance": "दिखावट",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "पठन दृश्य से स्वतंत्र रूप से शब्दकोश परिणामों के टेक्स्ट का आकार सेट करता है।",
|
||||
"Authentication failed. Reconnect in Settings.": "प्रमाणीकरण विफल रहा। सेटिंग्स में फिर से कनेक्ट करें।",
|
||||
"Full Sync": "पूर्ण सिंक",
|
||||
"Waiting for sign-in…": "साइन-इन की प्रतीक्षा में…",
|
||||
"Reconnect": "फिर से कनेक्ट करें",
|
||||
"Connected as {{account}}": "{{account}} के रूप में कनेक्टेड",
|
||||
". Make Google Drive the active cloud provider.": "। Google Drive को सक्रिय क्लाउड प्रदाता बनाएं।",
|
||||
"Use Google Drive": "Google Drive का उपयोग करें",
|
||||
"Sign-in opens in your browser.": "साइन-इन आपके ब्राउज़र में खुलता है।",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest केवल उन्हीं फ़ाइलों तक पहुँचता है जिन्हें वह आपकी Drive में बनाता है।",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को WebDAV सर्वर से सिंक करें।",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को अपनी Google Drive से सिंक करें।",
|
||||
"Configured": "कॉन्फ़िगर किया गया",
|
||||
"Use WebDAV": "WebDAV का उपयोग करें",
|
||||
"Cloud Sync": "क्लाउड सिंक",
|
||||
"Extra Large": "बहुत बड़ा",
|
||||
"Hint size": "संकेत का आकार",
|
||||
"Gloss text size above the word": "शब्द के ऊपर दिखने वाले संकेत टेक्स्ट का आकार",
|
||||
"Hint color": "संकेत का रंग",
|
||||
"Adjust Text Selection": "टेक्स्ट चयन समायोजित करें",
|
||||
"Your books will appear here": "आपकी पुस्तकें यहाँ दिखाई देंगी",
|
||||
"Reading aloud continues in the background": "उच्च स्वर में पढ़ना पृष्ठभूमि में जारी रहता है",
|
||||
"Stopped reading aloud": "उच्च स्वर में पढ़ना रोक दिया गया",
|
||||
"Read aloud stopped": "उच्च स्वर में पढ़ना रुक गया",
|
||||
"Cloud provider switched": "क्लाउड प्रदाता बदला गया",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "जब तक {{provider}} सिंक चयनित है, Readest Cloud पर अपलोड रुके रहेंगे",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "जब तक {{provider}} आपका क्लाउड सिंक प्रदाता है, इसे {{provider}} प्रबंधित करता है",
|
||||
"Not signed in": "साइन इन नहीं किया गया",
|
||||
"Paused — plan required": "रुका हुआ — प्लान आवश्यक",
|
||||
"Active · Book file uploads off": "सक्रिय · पुस्तक फ़ाइल अपलोड बंद",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "ऐप सेटिंग्स, पढ़ने के आँकड़े और शब्दकोश साइन इन रहने तक आपके Readest खाते के माध्यम से सिंक होते रहते हैं।",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को Readest Cloud से सिंक करें।",
|
||||
"Account and Storage": "खाता और स्टोरेज",
|
||||
"Manage your plan and stored files": "अपने प्लान और संग्रहीत फ़ाइलों का प्रबंधन करें",
|
||||
"Cloud sync provider": "क्लाउड सिंक प्रदाता",
|
||||
"Use Readest Cloud": "Readest Cloud का उपयोग करें",
|
||||
"Another device is still syncing this library via Readest Cloud": "कोई अन्य डिवाइस अभी भी Readest Cloud के माध्यम से इस लाइब्रेरी को सिंक कर रहा है",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} अपलोड विफल: अपर्याप्त स्टोरेज कोटा",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} अपलोड विफल: अपर्याप्त स्टोरेज कोटा",
|
||||
"Library sync via {{provider}}": "{{provider}} के माध्यम से लाइब्रेरी सिंक",
|
||||
"Google Drive session expired": "Google Drive सत्र समाप्त हो गया",
|
||||
"Cloud sync session expired": "क्लाउड सिंक सत्र समाप्त हो गया",
|
||||
"Uploads book files to your other devices": "आपके अन्य उपकरणों पर पुस्तक फ़ाइलें अपलोड करता है",
|
||||
"Re-check every book instead of only changed ones": "केवल बदली गई पुस्तकों के बजाय हर पुस्तक की फिर से जाँच करें",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "बकेट नहीं मिला",
|
||||
"Endpoint": "एंडपॉइंट",
|
||||
"Bucket": "बकेट",
|
||||
"Region": "क्षेत्र",
|
||||
"Access Key ID": "एक्सेस की ID",
|
||||
"Your Access Key ID": "आपकी एक्सेस की ID",
|
||||
"Secret Access Key": "सीक्रेट एक्सेस की",
|
||||
"Your Secret Access Key": "आपकी सीक्रेट एक्सेस की",
|
||||
"S3-Compatible Storage": "S3-संगत स्टोरेज",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2, AWS S3 या MinIO जैसे S3-संगत बकेट के साथ अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स सिंक करें।",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "ब्राउज़र में, बकेट की CORS नीति को इस साइट के ऑरिजिन की अनुमति देनी होगी।",
|
||||
"Use S3": "S3 उपयोग करें",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "कनेक्ट करने से पहले सुनिश्चित करें कि बकेट मौजूद है और क्रेडेंशियल्स के पास पढ़ने/लिखने की अनुमति है।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "जब {{provider}} चुना गया हो, तो किताबें, प्रगति और एनोटेशन केवल आपके सर्वर से सिंक होते हैं।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "जब {{provider}} चुना गया हो, तो किताबें, प्रगति और एनोटेशन केवल आपके Drive से सिंक होते हैं।",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "जब {{provider}} चुना गया हो, तो किताबें, प्रगति और एनोटेशन केवल आपके बकेट से सिंक होते हैं।",
|
||||
"Premium": "प्रीमियम",
|
||||
"S3 Storage": "S3 स्टोरेज",
|
||||
"Speed": "गति",
|
||||
"{{time}} left in chapter": "अध्याय में {{time}} शेष",
|
||||
"Open Read Aloud player": "ज़ोर से पढ़ें प्लेयर खोलें",
|
||||
"Read Aloud": "ज़ोर से पढ़ें",
|
||||
"Voice": "आवाज़",
|
||||
"Sleep Timer": "स्लीप टाइमर",
|
||||
"Slower": "धीमा",
|
||||
"Faster": "तेज़",
|
||||
"Exit Auto Scroll": "स्वचालित स्क्रॉल से बाहर निकलें",
|
||||
"Auto Scroll": "स्वचालित स्क्रॉल",
|
||||
"End of book": "पुस्तक का अंत",
|
||||
"Toggle Auto Scroll": "स्वचालित स्क्रॉल टॉगल करें"
|
||||
}
|
||||
|
||||
@@ -158,7 +158,6 @@
|
||||
"Always on Top": "Mindig felül",
|
||||
"Always Show Status Bar": "Állapotsor mindig látható",
|
||||
"Keep Screen Awake": "Képernyő ébren tartása",
|
||||
"Background Read Aloud": "Felolvasás a háttérben",
|
||||
"Reload Page": "Oldal újratöltése",
|
||||
"Settings": "Beállítások",
|
||||
"Advanced Settings": "Speciális beállítások",
|
||||
@@ -605,7 +604,6 @@
|
||||
"Clear search history": "Keresési előzmények törlése",
|
||||
"Chapter": "Fejezet",
|
||||
"Match Case": "Kis- és nagybetűk megkülönböztetése",
|
||||
"Match Whole Words": "Teljes szavak egyezése",
|
||||
"Match Diacritics": "Ékezetek egyezése",
|
||||
"Search results for '{{term}}'": "Keresési eredmények: '{{term}}'",
|
||||
"Previous Result": "Előző találat",
|
||||
@@ -632,13 +630,10 @@
|
||||
"{{value}} hour": "{{value}} óra",
|
||||
"{{value}} hours": "{{value}} óra",
|
||||
"Voices for {{lang}}": "Hangok ehhez: {{lang}}",
|
||||
"Slow": "Lassú",
|
||||
"Fast": "Gyors",
|
||||
"Set Timeout": "Időkorlát beállítása",
|
||||
"Select Voice": "Hang kiválasztása",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} hang",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} hang",
|
||||
"Toggle Sticky Bottom TTS Bar": "Rögzített alsó TTS-sáv be/ki",
|
||||
"Zoom Level": "Nagyítási szint",
|
||||
"Zoom Out": "Kicsinyítés",
|
||||
"Reset Zoom": "Nagyítás visszaállítása",
|
||||
@@ -673,8 +668,6 @@
|
||||
"Translating...": "Fordítás...",
|
||||
"Please log in to use advanced TTS features": "Kérjük, jelentkezzen be a haladó TTS-funkciók használatához",
|
||||
"TTS not supported for this document": "A TTS nem támogatott ehhez a dokumentumhoz",
|
||||
"Read Aloud": "Felolvasás",
|
||||
"Ready to read aloud": "Felolvasásra kész",
|
||||
"Delete Your Account?": "Törli a fiókját?",
|
||||
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Ez a művelet nem vonható vissza. Minden felhőbeli adata véglegesen törlődik.",
|
||||
"Delete Permanently": "Végleges törlés",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV hitelesítés sikertelen. Csatlakozzon újra a Beállításokban.",
|
||||
"Downloading": "Letöltés",
|
||||
"Uploading": "Feltöltés",
|
||||
"downloaded {{n}} book(s)": "{{n}} könyv letöltve",
|
||||
"pushed {{n}} config(s)": "{{n}} konfiguráció feltöltve",
|
||||
"uploaded {{n}} new file(s)": "{{n}} új fájl feltöltve",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Szinkronizálás befejeződött {{failed}} hibával. {{ok}} sikeres.",
|
||||
"Sync complete": "Szinkronizálás kész",
|
||||
"Everything is already up to date.": "Minden naprakész.",
|
||||
"Browsing {{path}} on {{server}}": "{{path}} böngészése a következőn: {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Csatlakozzon WebDAV-kiszolgálóhoz a távoli fájlok böngészéséhez.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Könyvfájlok feltöltése",
|
||||
"Sync now": "Szinkronizálás most",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Jelszó megjelenítése",
|
||||
"Root Directory": "Gyökérkönyvtár",
|
||||
"Syncing…": "Szinkronizálás…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} könyv folyamata letöltve",
|
||||
"Sync History": "Szinkronizálási előzmények",
|
||||
"Clear Sync History": "Szinkronizálási előzmények törlése",
|
||||
"No manual syncs yet": "Még nincs kézi szinkronizálás",
|
||||
"Partial": "Részleges",
|
||||
"Cleanup": "Takarítás",
|
||||
"Cleanup failed": "A takarítás sikertelen",
|
||||
"Sync failed": "A szinkronizálás sikertelen",
|
||||
"{{n}} deleted": "{{n}} törölve",
|
||||
"{{n}} failed": "{{n}} sikertelen",
|
||||
"Nothing deleted": "Semmi sem lett törölve",
|
||||
"{{n}} downloaded": "{{n}} letöltve",
|
||||
"{{n}} uploaded": "{{n}} feltöltve",
|
||||
"{{n}} progress": "{{n}} folyamat",
|
||||
"Up to date": "Naprakész",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Letöltött könyvek",
|
||||
"Files uploaded": "Feltöltött fájlok",
|
||||
"Configs uploaded": "Feltöltött konfigurációk",
|
||||
"Configs downloaded": "Letöltött konfigurációk",
|
||||
"Covers uploaded": "Feltöltött borítók",
|
||||
"Books deleted": "Törölt könyvek",
|
||||
"Files in sync": "Szinkronban lévő fájlok",
|
||||
"Failures": "Hibák",
|
||||
"Total books": "Összes könyv",
|
||||
"Error:": "Hiba:",
|
||||
"Failed books": "Sikertelen könyvek",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} könyv törölve a kiszolgálóról.",
|
||||
"Failed to load directory": "Nem sikerült betölteni a mappát",
|
||||
"File download is only supported on the desktop and mobile apps.": "A fájlletöltés csak az asztali és mobilalkalmazásokban támogatott.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Telepítse a Readest böngészőkiegészítőt, hogy az éppen olvasott cikket a könyvtárába küldje. A bővítmény a böngészőből vágja ki az oldalt, így a fizetős és bejelentkezést igénylő oldalak is működnek.",
|
||||
"Added to your library. It will sync to your other devices.": "Hozzáadva a könyvtárhoz. Szinkronizálódik a többi eszközével.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "A szinkronizálási jelmondat törölve. Minden titkosított mező törölve.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Csak kézi szinkronizálások és takarítások. Az olvasás közbeni automatikus szinkronizálások itt nem szerepelnek.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Törli a(z) {{n}} könyvet a WebDAV kiszolgálóról?\n\nEz csak a távoli fájlokat törli; a helyi könyvtárát nem érinti. A törlés nem vonható vissza. A kiszolgálón lévő adatok véglegesen eltűnnek.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Feltölti a könyvfájlokat a többi eszközére.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Hibás szinkronizálási jelmondat. A szinkronizált hitelesítő adatokat nem sikerült visszafejteni.",
|
||||
"Email books straight to your library": "Küldjön könyveket közvetlenül e-mailben a könyvtárába",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Továbbítsa a mellékleteket és cikkeket a privát Readest-címére. Elérhető a Plus, Pro és Lifetime csomagokban.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Az olvasási haladást, jegyzeteket és könyvjelzőket is törli.",
|
||||
"Background Image (Library)": "Háttérkép (Könyvtár)",
|
||||
"Background Image (Reader)": "Háttérkép (Olvasónézet)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} könyv metaadatai frissítve",
|
||||
"{{n}} metadata": "{{n}} metaadat",
|
||||
"Metadata updated": "Metaadatok frissítve",
|
||||
"Filter": "Szűrés",
|
||||
"Sort by": "Rendezés alapja",
|
||||
"Date modified": "Módosítás dátuma",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Részletesség",
|
||||
"Refresh Page": "Oldal frissítése",
|
||||
"Recently read": "Nemrég olvasott",
|
||||
"Show recently read": "Nemrég olvasottak megjelenítése"
|
||||
"Show recently read": "Nemrég olvasottak megjelenítése",
|
||||
"Find:": "Keresés:",
|
||||
"Enable rule": "Szabály engedélyezése",
|
||||
"Disable rule": "Szabály letiltása",
|
||||
"Progress Read": "Olvasási haladás",
|
||||
"Auto-import new books from this folder": "Új könyvek automatikus importálása ebből a mappából",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Amikor új könyvek kerülnek ebbe a mappába, a Readest automatikusan importálja őket a következő megnyitáskor vagy előtérbe kerüléskor.",
|
||||
"Reading aloud": "Felolvasás folyamatban",
|
||||
"Open Book": "Könyv megnyitása",
|
||||
"Stop reading aloud": "Felolvasás leállítása",
|
||||
"Enter at least two words": "Adjon meg legalább két szót",
|
||||
"Search failed": "A keresés sikertelen",
|
||||
"Search with regex": "Keresés regexszel",
|
||||
"Words to find near each other": "Egymáshoz közel keresendő szavak",
|
||||
"Contains": "Tartalmazza",
|
||||
"Whole Words": "Teljes szavak",
|
||||
"Regular Expression": "Reguláris kifejezés",
|
||||
"Nearby Words": "Közeli szavak",
|
||||
"Within N words": "N szón belül",
|
||||
"Not for regex": "Regexnél nem használható",
|
||||
"No results found": "Nincs találat",
|
||||
"{{count}} results_one": "{{count}} találat",
|
||||
"{{count}} results_other": "{{count}} találat",
|
||||
"Failed to seek": "Az ugrás sikertelen",
|
||||
"Chapter progress": "Fejezet haladás",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "Kontraszt csökkentése",
|
||||
"Reset Contrast": "Kontraszt visszaállítása",
|
||||
"Increase Contrast": "Kontraszt növelése",
|
||||
"Push": "Tolás",
|
||||
"Slide": "Csúsztatás",
|
||||
"Page Curl": "Lapozás",
|
||||
"Animation Style": "Animáció stílusa",
|
||||
"Appearance": "Megjelenés",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "A szótári találatok szövegméretét állítja be, az olvasási nézettől függetlenül.",
|
||||
"Authentication failed. Reconnect in Settings.": "A hitelesítés sikertelen. Csatlakozzon újra a Beállításokban.",
|
||||
"Full Sync": "Teljes szinkronizálás",
|
||||
"Waiting for sign-in…": "Várakozás a bejelentkezésre…",
|
||||
"Reconnect": "Újracsatlakozás",
|
||||
"Connected as {{account}}": "Csatlakozva mint {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Tegye a Google Drive-ot az aktív felhőszolgáltatóvá.",
|
||||
"Use Google Drive": "Google Drive használata",
|
||||
"Sign-in opens in your browser.": "A bejelentkezés a böngészőben nyílik meg.",
|
||||
"Readest only accesses the files it creates in your Drive.": "A Readest csak azokhoz a fájlokhoz fér hozzá, amelyeket ő hozott létre a Drive-jában.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit egy WebDAV-szerverrel.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit a Google Drive-jával.",
|
||||
"Configured": "Beállítva",
|
||||
"Use WebDAV": "WebDAV használata",
|
||||
"Cloud Sync": "Felhőszinkronizálás",
|
||||
"Extra Large": "Extra nagy",
|
||||
"Hint size": "Felirat mérete",
|
||||
"Gloss text size above the word": "A szó feletti felirat szövegmérete",
|
||||
"Hint color": "Felirat színe",
|
||||
"Adjust Text Selection": "Szövegkijelölés módosítása",
|
||||
"Your books will appear here": "Itt jelennek meg a könyvei",
|
||||
"Reading aloud continues in the background": "A felolvasás a háttérben folytatódik",
|
||||
"Stopped reading aloud": "A felolvasás leállt",
|
||||
"Read aloud stopped": "Felolvasás leállítva",
|
||||
"Cloud provider switched": "Felhőszolgáltató váltva",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "A Readest Cloudba történő feltöltések szünetelnek, amíg a {{provider}} szinkronizálás van kiválasztva",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "A {{provider}} kezeli, amíg az a felhőszinkronizálási szolgáltatója",
|
||||
"Not signed in": "Nincs bejelentkezve",
|
||||
"Paused — plan required": "Szüneteltetve — előfizetés szükséges",
|
||||
"Active · Book file uploads off": "Aktív · Könyvfájlok feltöltése kikapcsolva",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Az alkalmazásbeállítások, az olvasási statisztikák és a szótárak bejelentkezve továbbra is a Readest-fiókján keresztül szinkronizálódnak.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit a Readest Clouddal.",
|
||||
"Account and Storage": "Fiók és tárhely",
|
||||
"Manage your plan and stored files": "Előfizetés és tárolt fájlok kezelése",
|
||||
"Cloud sync provider": "Felhőszinkronizálási szolgáltató",
|
||||
"Use Readest Cloud": "Readest Cloud használata",
|
||||
"Another device is still syncing this library via Readest Cloud": "Egy másik eszköz még mindig a Readest Cloudon keresztül szinkronizálja ezt a könyvtárat",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} feltöltés sikertelen: nincs elegendő tárhelykvóta",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} feltöltés sikertelen: nincs elegendő tárhelykvóta",
|
||||
"Library sync via {{provider}}": "Könyvtár szinkronizálása a következőn keresztül: {{provider}}",
|
||||
"Google Drive session expired": "A Google Drive-munkamenet lejárt",
|
||||
"Cloud sync session expired": "A felhőszinkronizálási munkamenet lejárt",
|
||||
"Uploads book files to your other devices": "Feltölti a könyvfájlokat a többi eszközére",
|
||||
"Re-check every book instead of only changed ones": "Minden könyv újraellenőrzése a módosítottak helyett",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "A bucket nem található",
|
||||
"Endpoint": "Végpont",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Régió",
|
||||
"Access Key ID": "Hozzáférési kulcs azonosító",
|
||||
"Your Access Key ID": "Add meg a hozzáférési kulcs azonosítót",
|
||||
"Secret Access Key": "Titkos hozzáférési kulcs",
|
||||
"Your Secret Access Key": "Add meg a titkos hozzáférési kulcsot",
|
||||
"S3-Compatible Storage": "S3-kompatibilis tárhely",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Szinkronizáld a könyvtáradat, olvasási előrehaladásodat és kiemeléseidet egy S3-kompatibilis buckettel, például Cloudflare R2, AWS S3 vagy MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Böngészőben a bucket CORS-szabályzatának engedélyeznie kell ennek az oldalnak az originjét.",
|
||||
"Use S3": "S3 használata",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Csatlakozás előtt győződj meg róla, hogy a bucket létezik, és a hitelesítő adatok olvasási/írási hozzáféréssel rendelkeznek.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Amíg a(z) {{provider}} van kiválasztva, a könyvek, az előrehaladás és a jegyzetek csak a szerveredre szinkronizálódnak.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Amíg a(z) {{provider}} van kiválasztva, a könyvek, az előrehaladás és a jegyzetek csak a Drive-odba szinkronizálódnak.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Amíg a(z) {{provider}} van kiválasztva, a könyvek, az előrehaladás és a jegyzetek csak a bucketedbe szinkronizálódnak.",
|
||||
"Premium": "Prémium",
|
||||
"S3 Storage": "S3-tárhely",
|
||||
"Speed": "Sebesség",
|
||||
"{{time}} left in chapter": "{{time}} van hátra a fejezetből",
|
||||
"Open Read Aloud player": "Felolvasó lejátszó megnyitása",
|
||||
"Read Aloud": "Felolvasás",
|
||||
"Voice": "Hang",
|
||||
"Sleep Timer": "Elalvási időzítő",
|
||||
"Slower": "Lassabb",
|
||||
"Faster": "Gyorsabb",
|
||||
"Exit Auto Scroll": "Kilépés az automatikus görgetésből",
|
||||
"Auto Scroll": "Automatikus görgetés",
|
||||
"End of book": "A könyv vége",
|
||||
"Toggle Auto Scroll": "Automatikus görgetés be/ki"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Edit",
|
||||
"Excerpts": "Kutipan",
|
||||
"Failed to import book(s): {{filenames}}": "Gagal mengimpor buku: {{filenames}}",
|
||||
"Fast": "Cepat",
|
||||
"Font": "Font",
|
||||
"Font & Layout": "Font & Tata Letak",
|
||||
"Font Face": "Jenis Font",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Masuk sebagai {{userDisplayName}}",
|
||||
"Match Case": "Cocokkan Huruf Besar/Kecil",
|
||||
"Match Diacritics": "Cocokkan Diakritik",
|
||||
"Match Whole Words": "Cocokkan Kata Utuh",
|
||||
"Maximum Number of Columns": "Jumlah Kolom Maksimum",
|
||||
"Minimum Font Size": "Ukuran Font Minimum",
|
||||
"Monospace Font": "Font Monospace",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Masuk",
|
||||
"Sign Out": "Keluar",
|
||||
"Sky": "Langit",
|
||||
"Slow": "Lambat",
|
||||
"Solarized": "Solarized",
|
||||
"Speak": "Bicara",
|
||||
"Subjects": "Subjek",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "Mulai Migrasi",
|
||||
"Advanced Settings": "Pengaturan Lanjutan",
|
||||
"File count: {{size}}": "Jumlah file: {{size}}",
|
||||
"Background Read Aloud": "Bacakan Latar Belakang",
|
||||
"Ready to read aloud": "Siap untuk dibacakan",
|
||||
"Read Aloud": "Bacakan",
|
||||
"Screen Brightness": "Kecerahan Layar",
|
||||
"Background Image": "Gambar Latar Belakang",
|
||||
"Import Image": "Impor Gambar",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "Ekspor",
|
||||
"Set Timeout": "Atur batas waktu",
|
||||
"Select Voice": "Pilih suara",
|
||||
"Toggle Sticky Bottom TTS Bar": "Alihkan bilah TTS tetap",
|
||||
"Display what I'm reading on Discord": "Tampilkan buku yang sedang dibaca di Discord",
|
||||
"Show on Discord": "Tampilkan di Discord",
|
||||
"Instant {{action}}": "{{action}} Instan",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autentikasi WebDAV gagal. Hubungkan ulang di Pengaturan.",
|
||||
"Downloading": "Mengunduh",
|
||||
"Uploading": "Mengunggah",
|
||||
"downloaded {{n}} book(s)": "mengunduh {{n}} buku",
|
||||
"pushed {{n}} config(s)": "mengirim {{n}} konfigurasi",
|
||||
"uploaded {{n}} new file(s)": "mengunggah {{n}} file baru",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinkronisasi selesai dengan {{failed}} kegagalan. {{ok}} berhasil.",
|
||||
"Sync complete": "Sinkronisasi selesai",
|
||||
"Everything is already up to date.": "Semua sudah terbaru.",
|
||||
"Browsing {{path}} on {{server}}": "Menjelajahi {{path}} di {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Hubungkan ke server WebDAV untuk menjelajahi file jarak jauh Anda.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Unggah file buku",
|
||||
"Sync now": "Sinkronkan sekarang",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "Tampilkan kata sandi",
|
||||
"Root Directory": "Direktori root",
|
||||
"Syncing…": "Menyinkronkan…",
|
||||
"pulled progress for {{n}} book(s)": "menarik progres {{n}} buku",
|
||||
"Sync History": "Riwayat sinkronisasi",
|
||||
"Clear Sync History": "Hapus riwayat sinkronisasi",
|
||||
"No manual syncs yet": "Belum ada sinkronisasi manual",
|
||||
"Partial": "Sebagian",
|
||||
"Cleanup": "Bersihkan",
|
||||
"Cleanup failed": "Pembersihan gagal",
|
||||
"Sync failed": "Sinkronisasi gagal",
|
||||
"{{n}} deleted": "{{n}} dihapus",
|
||||
"{{n}} failed": "{{n}} gagal",
|
||||
"Nothing deleted": "Tidak ada yang dihapus",
|
||||
"{{n}} downloaded": "{{n}} diunduh",
|
||||
"{{n}} uploaded": "{{n}} diunggah",
|
||||
"{{n}} progress": "{{n}} progres",
|
||||
"Up to date": "Terbaru",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Buku diunduh",
|
||||
"Files uploaded": "File diunggah",
|
||||
"Configs uploaded": "Konfigurasi diunggah",
|
||||
"Configs downloaded": "Konfigurasi diunduh",
|
||||
"Covers uploaded": "Sampul diunggah",
|
||||
"Books deleted": "Buku dihapus",
|
||||
"Files in sync": "File sinkron",
|
||||
"Failures": "Kegagalan",
|
||||
"Total books": "Total buku",
|
||||
"Error:": "Galat:",
|
||||
"Failed books": "Buku gagal",
|
||||
"Deleted {{n}} book(s) from server.": "Menghapus {{n}} buku dari server.",
|
||||
"Failed to load directory": "Gagal memuat direktori",
|
||||
"File download is only supported on the desktop and mobile apps.": "Unduhan file hanya didukung di aplikasi desktop dan ponsel.",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Pasang ekstensi browser Readest untuk mengirim artikel yang Anda baca ke perpustakaan. Ekstensi memotong halaman dari browser sehingga situs berbayar dan situs khusus login tetap dapat dibaca.",
|
||||
"Added to your library. It will sync to your other devices.": "Ditambahkan ke perpustakaan Anda. Akan disinkronkan ke perangkat Anda yang lain.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Frasa sandi sinkronisasi dilupakan. Semua bidang terenkripsi dihapus.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Hanya sinkronisasi manual dan pembersihan. Sinkronisasi otomatis saat membaca tidak dicatat di sini.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Hapus {{n}} buku dari server WebDAV?\n\nIni hanya menghapus file jarak jauh; perpustakaan lokal Anda tidak terpengaruh. Penghapusan tidak dapat dibatalkan. Data di server akan hilang permanen.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Mengunggah file buku ke perangkat Anda yang lain.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frasa sandi sinkronisasi salah. Kredensial yang disinkronkan tidak dapat didekripsi.",
|
||||
"Email books straight to your library": "Kirim buku langsung ke perpustakaan Anda melalui email",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Teruskan lampiran dan artikel ke alamat Readest pribadi Anda. Tersedia di paket Plus, Pro, dan Lifetime.",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Juga menghapus progres membaca, catatan, dan penanda.",
|
||||
"Background Image (Library)": "Gambar Latar Belakang (Perpustakaan)",
|
||||
"Background Image (Reader)": "Gambar Latar Belakang (Tampilan Baca)",
|
||||
"updated metadata for {{n}} book(s)": "metadata diperbarui untuk {{n}} buku",
|
||||
"{{n}} metadata": "{{n}} metadata",
|
||||
"Metadata updated": "Metadata diperbarui",
|
||||
"Filter": "Filter",
|
||||
"Sort by": "Urutkan menurut",
|
||||
"Date modified": "Tanggal diubah",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "Granularitas",
|
||||
"Refresh Page": "Segarkan Halaman",
|
||||
"Recently read": "Baru dibaca",
|
||||
"Show recently read": "Tampilkan baru dibaca"
|
||||
"Show recently read": "Tampilkan baru dibaca",
|
||||
"Find:": "Cari:",
|
||||
"Enable rule": "Aktifkan aturan",
|
||||
"Disable rule": "Nonaktifkan aturan",
|
||||
"Progress Read": "Progres Membaca",
|
||||
"Auto-import new books from this folder": "Impor otomatis buku baru dari folder ini",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Saat buku baru ditambahkan ke folder ini, buku akan diimpor secara otomatis saat berikutnya Readest dibuka atau kembali ke latar depan.",
|
||||
"Reading aloud": "Sedang membacakan",
|
||||
"Open Book": "Buka Buku",
|
||||
"Stop reading aloud": "Hentikan pembacaan",
|
||||
"Enter at least two words": "Masukkan setidaknya dua kata",
|
||||
"Search failed": "Pencarian gagal",
|
||||
"Search with regex": "Cari dengan ekspresi reguler",
|
||||
"Words to find near each other": "Kata-kata yang akan dicari berdekatan",
|
||||
"Contains": "Mengandung",
|
||||
"Whole Words": "Kata Utuh",
|
||||
"Regular Expression": "Ekspresi Reguler",
|
||||
"Nearby Words": "Kata Berdekatan",
|
||||
"Within N words": "Dalam jarak N kata",
|
||||
"Not for regex": "Tidak berlaku untuk ekspresi reguler",
|
||||
"No results found": "Tidak ada hasil ditemukan",
|
||||
"{{count}} results_other": "{{count}} hasil",
|
||||
"Failed to seek": "Gagal menggeser posisi",
|
||||
"Chapter progress": "Kemajuan bab",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} dari {{total}}",
|
||||
"Decrease Contrast": "Kurangi Kontras",
|
||||
"Reset Contrast": "Atur Ulang Kontras",
|
||||
"Increase Contrast": "Tingkatkan Kontras",
|
||||
"Push": "Dorong",
|
||||
"Slide": "Geser",
|
||||
"Page Curl": "Lengkung Halaman",
|
||||
"Animation Style": "Gaya Animasi",
|
||||
"Appearance": "Tampilan",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Mengatur ukuran teks hasil kamus, tidak bergantung pada tampilan baca.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autentikasi gagal. Hubungkan ulang di Pengaturan.",
|
||||
"Full Sync": "Sinkronisasi Penuh",
|
||||
"Waiting for sign-in…": "Menunggu proses masuk…",
|
||||
"Reconnect": "Hubungkan Ulang",
|
||||
"Connected as {{account}}": "Terhubung sebagai {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Jadikan Google Drive penyedia cloud yang aktif.",
|
||||
"Use Google Drive": "Gunakan Google Drive",
|
||||
"Sign-in opens in your browser.": "Proses masuk akan terbuka di browser Anda.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest hanya mengakses file yang dibuatnya di Drive Anda.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan server WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan Google Drive Anda.",
|
||||
"Configured": "Terkonfigurasi",
|
||||
"Use WebDAV": "Gunakan WebDAV",
|
||||
"Cloud Sync": "Sinkronisasi Cloud",
|
||||
"Extra Large": "Sangat Besar",
|
||||
"Hint size": "Ukuran petunjuk",
|
||||
"Gloss text size above the word": "Ukuran teks keterangan di atas kata",
|
||||
"Hint color": "Warna petunjuk",
|
||||
"Adjust Text Selection": "Sesuaikan Pilihan Teks",
|
||||
"Your books will appear here": "Buku Anda akan muncul di sini",
|
||||
"Reading aloud continues in the background": "Pembacaan berlanjut di latar belakang",
|
||||
"Stopped reading aloud": "Pembacaan dihentikan",
|
||||
"Read aloud stopped": "Pembacaan telah berhenti",
|
||||
"Cloud provider switched": "Penyedia cloud diganti",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Unggahan ke Readest Cloud dijeda selama sinkronisasi {{provider}} dipilih",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Dikelola oleh {{provider}} selama menjadi penyedia sinkronisasi cloud Anda",
|
||||
"Not signed in": "Belum masuk",
|
||||
"Paused — plan required": "Dijeda — memerlukan paket",
|
||||
"Active · Book file uploads off": "Aktif · Unggah file buku nonaktif",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Pengaturan aplikasi, statistik membaca, dan kamus tetap disinkronkan melalui akun Readest Anda selama Anda masuk.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan Readest Cloud.",
|
||||
"Account and Storage": "Akun dan penyimpanan",
|
||||
"Manage your plan and stored files": "Kelola paket dan file tersimpan Anda",
|
||||
"Cloud sync provider": "Penyedia sinkronisasi cloud",
|
||||
"Use Readest Cloud": "Gunakan Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Perangkat lain masih menyinkronkan perpustakaan ini via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} unggahan gagal: kuota penyimpanan tidak mencukupi",
|
||||
"Library sync via {{provider}}": "Sinkronisasi pustaka melalui {{provider}}",
|
||||
"Google Drive session expired": "Sesi Google Drive telah kedaluwarsa",
|
||||
"Cloud sync session expired": "Sesi sinkronisasi cloud telah kedaluwarsa",
|
||||
"Uploads book files to your other devices": "Mengunggah berkas buku ke perangkat Anda yang lain",
|
||||
"Re-check every book instead of only changed ones": "Periksa ulang setiap buku alih-alih hanya yang berubah",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket tidak ditemukan",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Region",
|
||||
"Access Key ID": "ID Kunci Akses",
|
||||
"Your Access Key ID": "ID Kunci Akses Anda",
|
||||
"Secret Access Key": "Kunci Akses Rahasia",
|
||||
"Your Secret Access Key": "Kunci Akses Rahasia Anda",
|
||||
"S3-Compatible Storage": "Penyimpanan yang kompatibel dengan S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan bucket yang kompatibel dengan S3 seperti Cloudflare R2, AWS S3, atau MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Di browser, kebijakan CORS bucket harus mengizinkan origin situs ini.",
|
||||
"Use S3": "Gunakan S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Sebelum terhubung, pastikan bucket sudah ada dan kredensial memiliki akses baca/tulis.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Saat {{provider}} dipilih, buku, progres, dan anotasi hanya disinkronkan ke server Anda.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Saat {{provider}} dipilih, buku, progres, dan anotasi hanya disinkronkan ke Drive Anda.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Saat {{provider}} dipilih, buku, progres, dan anotasi hanya disinkronkan ke bucket Anda.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Penyimpanan S3",
|
||||
"Speed": "Kecepatan",
|
||||
"{{time}} left in chapter": "{{time}} tersisa di bab ini",
|
||||
"Open Read Aloud player": "Buka pemutar baca nyaring",
|
||||
"Read Aloud": "Baca Nyaring",
|
||||
"Voice": "Suara",
|
||||
"Sleep Timer": "Timer Tidur",
|
||||
"Slower": "Lebih lambat",
|
||||
"Faster": "Lebih cepat",
|
||||
"Exit Auto Scroll": "Keluar dari gulir otomatis",
|
||||
"Auto Scroll": "Gulir Otomatis",
|
||||
"End of book": "Akhir buku",
|
||||
"Toggle Auto Scroll": "Alihkan gulir otomatis"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Modifica",
|
||||
"Excerpts": "Estratti",
|
||||
"Failed to import book(s): {{filenames}}": "Impossibile importare il/i libro/i: {{filenames}}",
|
||||
"Fast": "Veloce",
|
||||
"Font": "Font",
|
||||
"Font & Layout": "Font e Layout",
|
||||
"Font Face": "Tipo di carattere",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Accesso effettuato come {{userDisplayName}}",
|
||||
"Match Case": "Maiuscole/minuscole",
|
||||
"Match Diacritics": "Corrispondenza diacritici",
|
||||
"Match Whole Words": "Parole intere",
|
||||
"Maximum Number of Columns": "Numero massimo di colonne",
|
||||
"Minimum Font Size": "Dimensione minima font",
|
||||
"Monospace Font": "Font monospazio",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Accedi",
|
||||
"Sign Out": "Esci",
|
||||
"Sky": "Cielo",
|
||||
"Slow": "Lento",
|
||||
"Solarized": "Solarizzato",
|
||||
"Speak": "Leggi",
|
||||
"Subjects": "Argomenti",
|
||||
@@ -586,9 +583,6 @@
|
||||
"Start Migration": "Inizia Migrazione",
|
||||
"Advanced Settings": "Impostazioni Avanzate",
|
||||
"File count: {{size}}": "Conteggio file: {{size}}",
|
||||
"Background Read Aloud": "Riproduzione in background",
|
||||
"Ready to read aloud": "Pronto per la lettura ad alta voce",
|
||||
"Read Aloud": "Leggi ad alta voce",
|
||||
"Screen Brightness": "Luminosità dello schermo",
|
||||
"Background Image": "Immagine di sfondo",
|
||||
"Import Image": "Importa immagine",
|
||||
@@ -891,7 +885,6 @@
|
||||
"Export": "Esporta",
|
||||
"Set Timeout": "Imposta timeout",
|
||||
"Select Voice": "Seleziona voce",
|
||||
"Toggle Sticky Bottom TTS Bar": "Attiva/disattiva barra TTS fissa",
|
||||
"Display what I'm reading on Discord": "Mostra cosa sto leggendo su Discord",
|
||||
"Show on Discord": "Mostra su Discord",
|
||||
"Instant {{action}}": "{{action}} istantaneo",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autenticazione WebDAV non riuscita. Riconnetti dalle Impostazioni.",
|
||||
"Downloading": "Download",
|
||||
"Uploading": "Caricamento",
|
||||
"downloaded {{n}} book(s)": "scaricati {{n}} libri",
|
||||
"pushed {{n}} config(s)": "inviate {{n}} configurazioni",
|
||||
"uploaded {{n}} new file(s)": "caricati {{n}} nuovi file",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronizzazione completata con {{failed}} errori. {{ok}} riusciti.",
|
||||
"Sync complete": "Sincronizzazione completata",
|
||||
"Everything is already up to date.": "È tutto già aggiornato.",
|
||||
"Browsing {{path}} on {{server}}": "Esplorazione di {{path}} su {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Collegati a un server WebDAV per sfogliare i tuoi file remoti.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Carica file dei libri",
|
||||
"Sync now": "Sincronizza ora",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Mostra password",
|
||||
"Root Directory": "Cartella root",
|
||||
"Syncing…": "Sincronizzazione…",
|
||||
"pulled progress for {{n}} book(s)": "avanzamento recuperato per {{n}} libro/i",
|
||||
"Sync History": "Cronologia sincronizzazione",
|
||||
"Clear Sync History": "Cancella cronologia sincronizzazione",
|
||||
"No manual syncs yet": "Ancora nessuna sincronizzazione manuale",
|
||||
"Partial": "Parziale",
|
||||
"Cleanup": "Pulizia",
|
||||
"Cleanup failed": "Pulizia non riuscita",
|
||||
"Sync failed": "Sincronizzazione non riuscita",
|
||||
"{{n}} deleted": "{{n}} eliminati",
|
||||
"{{n}} failed": "{{n}} non riusciti",
|
||||
"Nothing deleted": "Nessuna eliminazione",
|
||||
"{{n}} downloaded": "{{n}} scaricati",
|
||||
"{{n}} uploaded": "{{n}} caricati",
|
||||
"{{n}} progress": "{{n}} progresso",
|
||||
"Up to date": "Aggiornato",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Libri scaricati",
|
||||
"Files uploaded": "File caricati",
|
||||
"Configs uploaded": "Configurazioni caricate",
|
||||
"Configs downloaded": "Configurazioni scaricate",
|
||||
"Covers uploaded": "Copertine caricate",
|
||||
"Books deleted": "Libri eliminati",
|
||||
"Files in sync": "File sincronizzati",
|
||||
"Failures": "Errori",
|
||||
"Total books": "Libri totali",
|
||||
"Error:": "Errore:",
|
||||
"Failed books": "Libri non riusciti",
|
||||
"Deleted {{n}} book(s) from server.": "Eliminati {{n}} libro/i dal server.",
|
||||
"Failed to load directory": "Caricamento cartella non riuscito",
|
||||
"File download is only supported on the desktop and mobile apps.": "Il download dei file è supportato solo nelle app desktop e mobile.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installa l'estensione browser di Readest per inviare l'articolo che stai leggendo alla tua libreria. Ritaglia la pagina dal tuo browser così anche i siti a pagamento e con login funzionano.",
|
||||
"Added to your library. It will sync to your other devices.": "Aggiunto alla tua libreria. Verrà sincronizzato con gli altri tuoi dispositivi.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Passphrase di sincronizzazione dimenticata. Tutti i campi cifrati sono stati cancellati.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Solo sincronizzazioni manuali e pulizie. Le sincronizzazioni automatiche durante la lettura non vengono registrate qui.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Eliminare {{n}} libro/i dal server WebDAV?\n\nQuesto rimuove solo i file remoti; la tua libreria locale non è interessata. L'eliminazione non può essere annullata. I byte sul server saranno persi per sempre.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Carica i file dei libri sugli altri tuoi dispositivi.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Passphrase di sincronizzazione errata. Impossibile decifrare le credenziali sincronizzate.",
|
||||
"Email books straight to your library": "Invia i libri direttamente alla tua libreria via email",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Inoltra allegati e articoli al tuo indirizzo Readest privato. Disponibile nei piani Plus, Pro e Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Cancella anche il progresso di lettura, le note e i segnalibri.",
|
||||
"Background Image (Library)": "Immagine di sfondo (Libreria)",
|
||||
"Background Image (Reader)": "Immagine di sfondo (Vista di lettura)",
|
||||
"updated metadata for {{n}} book(s)": "metadati aggiornati per {{n}} libro/i",
|
||||
"{{n}} metadata": "{{n}} metadati",
|
||||
"Metadata updated": "Metadati aggiornati",
|
||||
"Filter": "Filtra",
|
||||
"Sort by": "Ordina per",
|
||||
"Date modified": "Data di modifica",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularità",
|
||||
"Refresh Page": "Aggiorna pagina",
|
||||
"Recently read": "Letti di recente",
|
||||
"Show recently read": "Mostra letti di recente"
|
||||
"Show recently read": "Mostra letti di recente",
|
||||
"Find:": "Trova:",
|
||||
"Enable rule": "Attiva regola",
|
||||
"Disable rule": "Disattiva regola",
|
||||
"Progress Read": "Progresso di lettura",
|
||||
"Auto-import new books from this folder": "Importa automaticamente i nuovi libri da questa cartella",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando vengono aggiunti nuovi libri a questa cartella, verranno importati automaticamente alla prossima apertura di Readest o al suo ritorno in primo piano.",
|
||||
"Reading aloud": "Lettura ad alta voce",
|
||||
"Open Book": "Apri libro",
|
||||
"Stop reading aloud": "Interrompi la lettura ad alta voce",
|
||||
"Enter at least two words": "Inserisci almeno due parole",
|
||||
"Search failed": "Ricerca non riuscita",
|
||||
"Search with regex": "Cerca con regex",
|
||||
"Words to find near each other": "Parole da trovare vicine tra loro",
|
||||
"Contains": "Contiene",
|
||||
"Whole Words": "Parole intere",
|
||||
"Regular Expression": "Espressione regolare",
|
||||
"Nearby Words": "Parole vicine",
|
||||
"Within N words": "Entro N parole",
|
||||
"Not for regex": "Non disponibile con regex",
|
||||
"No results found": "Nessun risultato trovato",
|
||||
"{{count}} results_one": "{{count}} risultato",
|
||||
"{{count}} results_many": "{{count}} di risultati",
|
||||
"{{count}} results_other": "{{count}} risultati",
|
||||
"Failed to seek": "Impossibile cambiare posizione",
|
||||
"Chapter progress": "Progresso capitolo",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} di {{total}}",
|
||||
"Decrease Contrast": "Diminuisci contrasto",
|
||||
"Reset Contrast": "Reimposta contrasto",
|
||||
"Increase Contrast": "Aumenta contrasto",
|
||||
"Push": "Spinta",
|
||||
"Slide": "Scivolamento",
|
||||
"Page Curl": "Curvatura pagina",
|
||||
"Animation Style": "Stile animazione",
|
||||
"Appearance": "Aspetto",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Imposta la dimensione del testo dei risultati del dizionario, indipendente dalla vista di lettura.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autenticazione non riuscita. Riconnetti dalle Impostazioni.",
|
||||
"Full Sync": "Sincronizzazione completa",
|
||||
"Waiting for sign-in…": "In attesa dell'accesso…",
|
||||
"Reconnect": "Riconnetti",
|
||||
"Connected as {{account}}": "Collegato come {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Imposta Google Drive come provider cloud attivo.",
|
||||
"Use Google Drive": "Usa Google Drive",
|
||||
"Sign-in opens in your browser.": "L'accesso si apre nel browser.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest accede solo ai file che crea nel tuo Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con un server WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con il tuo Google Drive.",
|
||||
"Configured": "Configurato",
|
||||
"Use WebDAV": "Usa WebDAV",
|
||||
"Cloud Sync": "Sincronizzazione cloud",
|
||||
"Extra Large": "Molto grande",
|
||||
"Hint size": "Dimensione del suggerimento",
|
||||
"Gloss text size above the word": "Dimensione del testo del suggerimento sopra la parola",
|
||||
"Hint color": "Colore del suggerimento",
|
||||
"Adjust Text Selection": "Regola la selezione del testo",
|
||||
"Your books will appear here": "I tuoi libri appariranno qui",
|
||||
"Reading aloud continues in the background": "La lettura ad alta voce continua in background",
|
||||
"Stopped reading aloud": "Lettura ad alta voce interrotta",
|
||||
"Read aloud stopped": "Lettura ad alta voce interrotta",
|
||||
"Cloud provider switched": "Provider cloud cambiato",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "I caricamenti su Readest Cloud sono in pausa finché è selezionata la sincronizzazione {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Gestito da {{provider}} finché è il tuo provider di sincronizzazione cloud",
|
||||
"Not signed in": "Accesso non effettuato",
|
||||
"Paused — plan required": "In pausa — è richiesto un piano",
|
||||
"Active · Book file uploads off": "Attivo · Caricamento dei file dei libri disattivato",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Le impostazioni dell'app, le statistiche di lettura e i dizionari continuano a sincronizzarsi tramite il tuo account Readest finché hai effettuato l'accesso.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con Readest Cloud.",
|
||||
"Account and Storage": "Account e archiviazione",
|
||||
"Manage your plan and stored files": "Gestisci il tuo piano e i file archiviati",
|
||||
"Cloud sync provider": "Provider di sincronizzazione cloud",
|
||||
"Use Readest Cloud": "Usa Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Un altro dispositivo sta ancora sincronizzando questa biblioteca via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} caricamento non riuscito: quota di archiviazione insufficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} caricamenti non riusciti: quota di archiviazione insufficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} caricamenti non riusciti: quota di archiviazione insufficiente",
|
||||
"Library sync via {{provider}}": "Sincronizzazione della libreria tramite {{provider}}",
|
||||
"Google Drive session expired": "Sessione di Google Drive scaduta",
|
||||
"Cloud sync session expired": "Sessione di sincronizzazione cloud scaduta",
|
||||
"Uploads book files to your other devices": "Carica i file dei libri sui tuoi altri dispositivi",
|
||||
"Re-check every book instead of only changed ones": "Ricontrolla ogni libro invece dei soli modificati",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket non trovato",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Regione",
|
||||
"Access Key ID": "ID chiave di accesso",
|
||||
"Your Access Key ID": "Il tuo ID chiave di accesso",
|
||||
"Secret Access Key": "Chiave di accesso segreta",
|
||||
"Your Secret Access Key": "La tua chiave di accesso segreta",
|
||||
"S3-Compatible Storage": "Archiviazione compatibile con S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sincronizza la tua libreria, i progressi di lettura e le evidenziazioni con un bucket compatibile con S3 come Cloudflare R2, AWS S3 o MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Nel browser, la policy CORS del bucket deve consentire l'origine di questo sito.",
|
||||
"Use S3": "Usa S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Prima di connetterti, assicurati che il bucket esista e che le credenziali abbiano accesso in lettura/scrittura.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Finché {{provider}} è selezionato, libri, progressi e annotazioni si sincronizzano solo con il tuo server.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Finché {{provider}} è selezionato, libri, progressi e annotazioni si sincronizzano solo con il tuo Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Finché {{provider}} è selezionato, libri, progressi e annotazioni si sincronizzano solo con il tuo bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Archiviazione S3",
|
||||
"Speed": "Velocità",
|
||||
"{{time}} left in chapter": "{{time}} rimanente nel capitolo",
|
||||
"Open Read Aloud player": "Apri il lettore di lettura ad alta voce",
|
||||
"Read Aloud": "Lettura ad alta voce",
|
||||
"Voice": "Voce",
|
||||
"Sleep Timer": "Timer di spegnimento",
|
||||
"Slower": "Più lento",
|
||||
"Faster": "Più veloce",
|
||||
"Exit Auto Scroll": "Esci dallo scorrimento automatico",
|
||||
"Auto Scroll": "Scorrimento automatico",
|
||||
"End of book": "Fine del libro",
|
||||
"Toggle Auto Scroll": "Attiva/disattiva scorrimento automatico"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "編集",
|
||||
"Excerpts": "抜粋",
|
||||
"Failed to import book(s): {{filenames}}": "書籍のインポートに失敗しました:{{filenames}}",
|
||||
"Fast": "高速",
|
||||
"Font": "フォント",
|
||||
"Font & Layout": "フォントとレイアウト",
|
||||
"Font Face": "書体",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}}としてログイン中",
|
||||
"Match Case": "大文字・小文字を区別",
|
||||
"Match Diacritics": "アクセント記号を区別",
|
||||
"Match Whole Words": "単語全体を一致",
|
||||
"Maximum Number of Columns": "最大列数",
|
||||
"Minimum Font Size": "最小フォントサイズ",
|
||||
"Monospace Font": "等幅フォント",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "サインイン",
|
||||
"Sign Out": "サインアウト",
|
||||
"Sky": "スカイ",
|
||||
"Slow": "低速",
|
||||
"Solarized": "ソーラライズド",
|
||||
"Speak": "読み上げ",
|
||||
"Subjects": "主題",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "移行を開始",
|
||||
"Advanced Settings": "詳細設定",
|
||||
"File count: {{size}}": "ファイル数: {{size}}",
|
||||
"Background Read Aloud": "バックグラウンド読み上げ",
|
||||
"Ready to read aloud": "読み上げの準備ができました",
|
||||
"Read Aloud": "読み上げ",
|
||||
"Screen Brightness": "画面の明るさ",
|
||||
"Background Image": "背景画像",
|
||||
"Import Image": "画像をインポート",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "エクスポート",
|
||||
"Set Timeout": "タイムアウト設定",
|
||||
"Select Voice": "音声選択",
|
||||
"Toggle Sticky Bottom TTS Bar": "TTSバー固定切替",
|
||||
"Display what I'm reading on Discord": "読書中の本をDiscordに表示",
|
||||
"Show on Discord": "Discordに表示",
|
||||
"Instant {{action}}": "インスタント{{action}}",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 認証に失敗しました。設定で再接続してください。",
|
||||
"Downloading": "ダウンロード中",
|
||||
"Uploading": "アップロード中",
|
||||
"downloaded {{n}} book(s)": "{{n}} 冊ダウンロード",
|
||||
"pushed {{n}} config(s)": "{{n}} 件の設定をアップロード",
|
||||
"uploaded {{n}} new file(s)": "{{n}} 件の新規ファイルをアップロード",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同期は {{failed}} 件失敗で完了しました。成功 {{ok}} 件。",
|
||||
"Sync complete": "同期完了",
|
||||
"Everything is already up to date.": "すべて最新の状態です。",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} の {{path}} を閲覧中",
|
||||
"Connect to a WebDAV server to browse your remote files.": "リモートファイルを閲覧するには WebDAV サーバーに接続してください。",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "書籍ファイルをアップロード",
|
||||
"Sync now": "今すぐ同期",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "パスワードを表示",
|
||||
"Root Directory": "ルートディレクトリ",
|
||||
"Syncing…": "同期中…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} 冊分の進捗を取得",
|
||||
"Sync History": "同期履歴",
|
||||
"Clear Sync History": "同期履歴をクリア",
|
||||
"No manual syncs yet": "手動同期はまだありません",
|
||||
"Partial": "一部",
|
||||
"Cleanup": "クリーンアップ",
|
||||
"Cleanup failed": "クリーンアップ失敗",
|
||||
"Sync failed": "同期失敗",
|
||||
"{{n}} deleted": "{{n}} 件削除",
|
||||
"{{n}} failed": "{{n}} 件失敗",
|
||||
"Nothing deleted": "削除なし",
|
||||
"{{n}} downloaded": "{{n}} 件ダウンロード",
|
||||
"{{n}} uploaded": "{{n}} 件アップロード",
|
||||
"{{n}} progress": "{{n}} 件進捗",
|
||||
"Up to date": "最新の状態",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "ダウンロードした書籍",
|
||||
"Files uploaded": "アップロードしたファイル",
|
||||
"Configs uploaded": "アップロードした設定",
|
||||
"Configs downloaded": "ダウンロードした設定",
|
||||
"Covers uploaded": "アップロードしたカバー",
|
||||
"Books deleted": "削除した書籍",
|
||||
"Files in sync": "同期済みファイル",
|
||||
"Failures": "失敗",
|
||||
"Total books": "書籍合計",
|
||||
"Error:": "エラー:",
|
||||
"Failed books": "失敗した書籍",
|
||||
"Deleted {{n}} book(s) from server.": "サーバーから {{n}} 冊削除しました。",
|
||||
"Failed to load directory": "ディレクトリの読み込みに失敗しました",
|
||||
"File download is only supported on the desktop and mobile apps.": "ファイルのダウンロードはデスクトップアプリとモバイルアプリでのみサポートされています。",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "読んでいる記事をライブラリに送信するには、Readest ブラウザ拡張機能をインストールしてください。ページをブラウザから切り出すため、有料記事やログイン必須のサイトでも利用できます。",
|
||||
"Added to your library. It will sync to your other devices.": "ライブラリに追加しました。他のデバイスと同期されます。",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "同期パスフレーズを忘却しました。すべての暗号化フィールドがクリアされました。",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "手動同期とクリーンアップのみ。読書中の自動同期はここには記録されません。",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV サーバーから {{n}} 冊を削除しますか?\n\nこの操作はリモートファイルのみを削除します。ローカルライブラリには影響しません。削除は元に戻せません。サーバー上のデータは完全に失われます。",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "書籍ファイルを他のデバイスにアップロードします。",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同期パスフレーズが正しくありません。同期された認証情報を復号できませんでした。",
|
||||
"Email books straight to your library": "本をメールで直接ライブラリに送信",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "添付ファイルや記事をあなた専用の Readest アドレスに転送できます。Plus、Pro、Lifetime プランで利用可能。",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "読書進捗、メモ、ブックマークも消去します。",
|
||||
"Background Image (Library)": "背景画像(ライブラリ)",
|
||||
"Background Image (Reader)": "背景画像(リーダー)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} 冊分のメタデータを更新",
|
||||
"{{n}} metadata": "{{n}} 件メタデータ",
|
||||
"Metadata updated": "更新したメタデータ",
|
||||
"Filter": "フィルター",
|
||||
"Sort by": "並べ替え",
|
||||
"Date modified": "更新日",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "粒度",
|
||||
"Refresh Page": "ページを更新",
|
||||
"Recently read": "最近読んだ本",
|
||||
"Show recently read": "最近読んだ本を表示"
|
||||
"Show recently read": "最近読んだ本を表示",
|
||||
"Find:": "検索:",
|
||||
"Enable rule": "ルールを有効化",
|
||||
"Disable rule": "ルールを無効化",
|
||||
"Progress Read": "読書進捗",
|
||||
"Auto-import new books from this folder": "このフォルダから新しい本を自動インポート",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "このフォルダに新しい本が追加されると、次回 Readest を開いたときやフォアグラウンドに戻ったときに自動的にインポートします。",
|
||||
"Reading aloud": "読み上げ中",
|
||||
"Open Book": "本を開く",
|
||||
"Stop reading aloud": "読み上げを停止",
|
||||
"Enter at least two words": "単語を 2 つ以上入力してください",
|
||||
"Search failed": "検索に失敗しました",
|
||||
"Search with regex": "正規表現で検索",
|
||||
"Words to find near each other": "互いに近くにある単語",
|
||||
"Contains": "含む",
|
||||
"Whole Words": "単語全体",
|
||||
"Regular Expression": "正規表現",
|
||||
"Nearby Words": "近接単語",
|
||||
"Within N words": "N 語以内",
|
||||
"Not for regex": "正規表現では無効",
|
||||
"No results found": "結果が見つかりませんでした",
|
||||
"{{count}} results_other": "{{count}} 件の結果",
|
||||
"Failed to seek": "シークに失敗しました",
|
||||
"Chapter progress": "章の進捗",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "コントラストを下げる",
|
||||
"Reset Contrast": "コントラストをリセット",
|
||||
"Increase Contrast": "コントラストを上げる",
|
||||
"Push": "プッシュ",
|
||||
"Slide": "スライド",
|
||||
"Page Curl": "ページカール",
|
||||
"Animation Style": "アニメーションスタイル",
|
||||
"Appearance": "外観",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "辞書の検索結果の文字サイズを、読書画面とは独立して設定します。",
|
||||
"Authentication failed. Reconnect in Settings.": "認証に失敗しました。設定で再接続してください。",
|
||||
"Full Sync": "完全同期",
|
||||
"Waiting for sign-in…": "サインインを待っています…",
|
||||
"Reconnect": "再接続",
|
||||
"Connected as {{account}}": "{{account}} として接続済み",
|
||||
". Make Google Drive the active cloud provider.": "。Google Drive を使用するクラウドプロバイダーに設定します。",
|
||||
"Use Google Drive": "Google Drive を使用",
|
||||
"Sign-in opens in your browser.": "サインインはブラウザで開きます。",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest がアクセスするのは、Drive 内に自身が作成したファイルのみです。",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "ライブラリ、読書進捗、ハイライトを WebDAV サーバーと同期します。",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "ライブラリ、読書進捗、ハイライトを Google Drive と同期します。",
|
||||
"Configured": "設定済み",
|
||||
"Use WebDAV": "WebDAV を使用",
|
||||
"Cloud Sync": "クラウド同期",
|
||||
"Extra Large": "特大",
|
||||
"Hint size": "ヒントのサイズ",
|
||||
"Gloss text size above the word": "単語の上に表示される注釈の文字サイズ",
|
||||
"Hint color": "ヒントの色",
|
||||
"Adjust Text Selection": "テキスト選択を調整",
|
||||
"Your books will appear here": "ここに本が表示されます",
|
||||
"Reading aloud continues in the background": "読み上げはバックグラウンドで継続します",
|
||||
"Stopped reading aloud": "読み上げを停止しました",
|
||||
"Read aloud stopped": "読み上げが停止しました",
|
||||
"Cloud provider switched": "クラウドプロバイダーが切り替わりました",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} 同期が選択されている間、Readest Cloud へのアップロードは一時停止されます",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} がクラウド同期プロバイダーである間は {{provider}} が管理します",
|
||||
"Not signed in": "未ログイン",
|
||||
"Paused — plan required": "一時停止中 — プランが必要です",
|
||||
"Active · Book file uploads off": "有効 · 書籍ファイルのアップロードはオフ",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "アプリ設定、読書統計、辞書は、ログイン中は引き続き Readest アカウント経由で同期されます。",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "ライブラリ、読書進捗、ハイライトを Readest Cloud と同期します。",
|
||||
"Account and Storage": "アカウントとストレージ",
|
||||
"Manage your plan and stored files": "プランと保存済みファイルを管理",
|
||||
"Cloud sync provider": "クラウド同期プロバイダー",
|
||||
"Use Readest Cloud": "Readest Cloud を使用",
|
||||
"Another device is still syncing this library via Readest Cloud": "別のデバイスがまだ Readest Cloud 経由でこのライブラリを同期しています",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 件のアップロードが失敗しました: ストレージクォータが不足しています",
|
||||
"Library sync via {{provider}}": "{{provider}} 経由でライブラリを同期",
|
||||
"Google Drive session expired": "Google Drive のセッションが期限切れです",
|
||||
"Cloud sync session expired": "クラウド同期のセッションが期限切れです",
|
||||
"Uploads book files to your other devices": "書籍ファイルを他のデバイスにアップロードします",
|
||||
"Re-check every book instead of only changed ones": "変更されたものだけでなく、すべての書籍を再確認",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "バケットが見つかりません",
|
||||
"Endpoint": "エンドポイント",
|
||||
"Bucket": "バケット",
|
||||
"Region": "リージョン",
|
||||
"Access Key ID": "アクセスキー ID",
|
||||
"Your Access Key ID": "あなたのアクセスキー ID",
|
||||
"Secret Access Key": "シークレットアクセスキー",
|
||||
"Your Secret Access Key": "あなたのシークレットアクセスキー",
|
||||
"S3-Compatible Storage": "S3 互換ストレージ",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2、AWS S3、MinIO などの S3 互換バケットとライブラリ、読書進捗、ハイライトを同期します。",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "ブラウザで使用する場合、バケットの CORS ポリシーでこのサイトのオリジンを許可する必要があります。",
|
||||
"Use S3": "S3 を使用",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "接続する前に、バケットが存在し、認証情報に読み取り/書き込み権限があることを確認してください。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} を選択している間、書籍・進捗・注釈はサーバーにのみ同期されます。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} を選択している間、書籍・進捗・注釈は Drive にのみ同期されます。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} を選択している間、書籍・進捗・注釈はバケットにのみ同期されます。",
|
||||
"Premium": "プレミアム",
|
||||
"S3 Storage": "S3 ストレージ",
|
||||
"Speed": "速度",
|
||||
"{{time}} left in chapter": "この章の残り {{time}}",
|
||||
"Open Read Aloud player": "読み上げプレーヤーを開く",
|
||||
"Read Aloud": "読み上げ",
|
||||
"Voice": "音声",
|
||||
"Sleep Timer": "スリープタイマー",
|
||||
"Slower": "遅く",
|
||||
"Faster": "速く",
|
||||
"Exit Auto Scroll": "自動スクロールを終了",
|
||||
"Auto Scroll": "自動スクロール",
|
||||
"End of book": "本の終わり",
|
||||
"Toggle Auto Scroll": "自動スクロールの切り替え"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "편집",
|
||||
"Excerpts": "발췌",
|
||||
"Failed to import book(s): {{filenames}}": "책 가져오기 실패: {{filenames}}",
|
||||
"Fast": "빠름",
|
||||
"Font": "글꼴",
|
||||
"Font & Layout": "글꼴 및 레이아웃",
|
||||
"Font Face": "글꼴 스타일",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}}(으)로 로그인됨",
|
||||
"Match Case": "대소문자 구분",
|
||||
"Match Diacritics": "발음 구별 부호 구분",
|
||||
"Match Whole Words": "전체 단어 일치",
|
||||
"Maximum Number of Columns": "최대 열 수",
|
||||
"Minimum Font Size": "최소 글꼴 크기",
|
||||
"Monospace Font": "고정폭 글꼴",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "로그인",
|
||||
"Sign Out": "로그아웃",
|
||||
"Sky": "하늘색",
|
||||
"Slow": "느림",
|
||||
"Solarized": "솔라라이즈드",
|
||||
"Speak": "말하기",
|
||||
"Subjects": "주제",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "마이그레이션 시작",
|
||||
"Advanced Settings": "고급 설정",
|
||||
"File count: {{size}}": "파일 수: {{size}}",
|
||||
"Background Read Aloud": "백그라운드 음성 읽기",
|
||||
"Ready to read aloud": "읽기 준비 완료",
|
||||
"Read Aloud": "음성 읽기",
|
||||
"Screen Brightness": "화면 밝기",
|
||||
"Background Image": "배경 이미지",
|
||||
"Import Image": "이미지 가져오기",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "내보내기",
|
||||
"Set Timeout": "시간 제한 설정",
|
||||
"Select Voice": "음성 선택",
|
||||
"Toggle Sticky Bottom TTS Bar": "고정 TTS 바 전환",
|
||||
"Display what I'm reading on Discord": "Discord에 읽는 책 표시",
|
||||
"Show on Discord": "Discord에 표시",
|
||||
"Instant {{action}}": "즉시 {{action}}",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 인증에 실패했습니다. 설정에서 다시 연결하세요.",
|
||||
"Downloading": "다운로드 중",
|
||||
"Uploading": "업로드 중",
|
||||
"downloaded {{n}} book(s)": "{{n}}권 다운로드",
|
||||
"pushed {{n}} config(s)": "{{n}}개 설정 업로드",
|
||||
"uploaded {{n}} new file(s)": "{{n}}개 새 파일 업로드",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "동기화가 {{failed}}건의 실패로 완료되었습니다. {{ok}}건 성공.",
|
||||
"Sync complete": "동기화 완료",
|
||||
"Everything is already up to date.": "모든 것이 이미 최신 상태입니다.",
|
||||
"Browsing {{path}} on {{server}}": "{{server}}의 {{path}} 탐색 중",
|
||||
"Connect to a WebDAV server to browse your remote files.": "원격 파일을 탐색하려면 WebDAV 서버에 연결하세요.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "책 파일 업로드",
|
||||
"Sync now": "지금 동기화",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "비밀번호 표시",
|
||||
"Root Directory": "루트 디렉터리",
|
||||
"Syncing…": "동기화 중…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}}권의 진행도를 가져옴",
|
||||
"Sync History": "동기화 기록",
|
||||
"Clear Sync History": "동기화 기록 지우기",
|
||||
"No manual syncs yet": "아직 수동 동기화 없음",
|
||||
"Partial": "부분",
|
||||
"Cleanup": "정리",
|
||||
"Cleanup failed": "정리 실패",
|
||||
"Sync failed": "동기화 실패",
|
||||
"{{n}} deleted": "{{n}}개 삭제",
|
||||
"{{n}} failed": "{{n}}개 실패",
|
||||
"Nothing deleted": "삭제된 항목 없음",
|
||||
"{{n}} downloaded": "{{n}}개 다운로드",
|
||||
"{{n}} uploaded": "{{n}}개 업로드",
|
||||
"{{n}} progress": "{{n}}개 진행도",
|
||||
"Up to date": "최신 상태",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "다운로드한 책",
|
||||
"Files uploaded": "업로드한 파일",
|
||||
"Configs uploaded": "업로드한 설정",
|
||||
"Configs downloaded": "다운로드한 설정",
|
||||
"Covers uploaded": "업로드한 표지",
|
||||
"Books deleted": "삭제한 책",
|
||||
"Files in sync": "동기화된 파일",
|
||||
"Failures": "실패",
|
||||
"Total books": "전체 책",
|
||||
"Error:": "오류:",
|
||||
"Failed books": "실패한 책",
|
||||
"Deleted {{n}} book(s) from server.": "서버에서 {{n}}권 삭제했습니다.",
|
||||
"Failed to load directory": "디렉터리를 불러오지 못했습니다",
|
||||
"File download is only supported on the desktop and mobile apps.": "파일 다운로드는 데스크톱 및 모바일 앱에서만 지원됩니다.",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "읽고 있는 기사를 라이브러리로 보내려면 Readest 브라우저 확장 프로그램을 설치하세요. 브라우저에서 페이지를 잘라내기 때문에 유료 및 로그인 전용 사이트에서도 작동합니다.",
|
||||
"Added to your library. It will sync to your other devices.": "라이브러리에 추가되었습니다. 다른 기기에도 동기화됩니다.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "동기화 암호구를 잊었습니다. 모든 암호화된 필드가 지워졌습니다.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "수동 동기화 및 정리만 표시됩니다. 읽는 중에 자동으로 수행된 동기화는 여기에 기록되지 않습니다.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV 서버에서 {{n}}권을 삭제하시겠습니까?\n\n이 작업은 원격 파일만 제거합니다; 로컬 라이브러리에는 영향을 주지 않습니다. 삭제는 취소할 수 없습니다. 서버의 데이터는 영구히 사라집니다.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "책 파일을 다른 기기로 업로드합니다.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "동기화 암호구가 잘못되었습니다. 동기화된 자격 증명을 복호화할 수 없습니다.",
|
||||
"Email books straight to your library": "이메일로 책을 라이브러리에 바로 전송",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "첨부 파일과 기사를 개인 Readest 주소로 전달하세요. Plus, Pro, Lifetime 요금제에서 사용할 수 있습니다.",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "읽기 진행 상황, 메모, 북마크도 함께 지웁니다.",
|
||||
"Background Image (Library)": "배경 이미지 (라이브러리)",
|
||||
"Background Image (Reader)": "배경 이미지 (리더)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}}권의 메타데이터 업데이트됨",
|
||||
"{{n}} metadata": "{{n}} 메타데이터",
|
||||
"Metadata updated": "메타데이터 업데이트됨",
|
||||
"Filter": "필터",
|
||||
"Sort by": "정렬 기준",
|
||||
"Date modified": "수정한 날짜",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "단위",
|
||||
"Refresh Page": "페이지 새로고침",
|
||||
"Recently read": "최근 읽은 책",
|
||||
"Show recently read": "최근 읽은 책 표시"
|
||||
"Show recently read": "최근 읽은 책 표시",
|
||||
"Find:": "찾기:",
|
||||
"Enable rule": "규칙 활성화",
|
||||
"Disable rule": "규칙 비활성화",
|
||||
"Progress Read": "읽기 진행 상황",
|
||||
"Auto-import new books from this folder": "이 폴더에서 새 책 자동 가져오기",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "이 폴더에 새 책이 추가되면 다음에 Readest를 열거나 포그라운드로 돌아올 때 자동으로 가져옵니다.",
|
||||
"Reading aloud": "음성 읽기 중",
|
||||
"Open Book": "책 열기",
|
||||
"Stop reading aloud": "음성 읽기 중지",
|
||||
"Enter at least two words": "단어를 두 개 이상 입력하세요",
|
||||
"Search failed": "검색에 실패했습니다",
|
||||
"Search with regex": "정규식으로 검색",
|
||||
"Words to find near each other": "서로 가까이에서 찾을 단어",
|
||||
"Contains": "포함",
|
||||
"Whole Words": "전체 단어",
|
||||
"Regular Expression": "정규 표현식",
|
||||
"Nearby Words": "인접 단어",
|
||||
"Within N words": "N 단어 이내",
|
||||
"Not for regex": "정규식에는 적용되지 않음",
|
||||
"No results found": "결과를 찾을 수 없습니다",
|
||||
"{{count}} results_other": "{{count}}개의 결과",
|
||||
"Failed to seek": "탐색에 실패했습니다",
|
||||
"Chapter progress": "챕터 진행률",
|
||||
"{{elapsed}} of {{total}}": "{{total}} 중 {{elapsed}}",
|
||||
"Decrease Contrast": "대비 낮추기",
|
||||
"Reset Contrast": "대비 재설정",
|
||||
"Increase Contrast": "대비 높이기",
|
||||
"Push": "밀기",
|
||||
"Slide": "슬라이드",
|
||||
"Page Curl": "책장 넘김",
|
||||
"Animation Style": "애니메이션 스타일",
|
||||
"Appearance": "모양",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "읽기 화면과 별개로 사전 결과의 텍스트 크기를 설정합니다.",
|
||||
"Authentication failed. Reconnect in Settings.": "인증에 실패했습니다. 설정에서 다시 연결하세요.",
|
||||
"Full Sync": "전체 동기화",
|
||||
"Waiting for sign-in…": "로그인을 기다리는 중…",
|
||||
"Reconnect": "다시 연결",
|
||||
"Connected as {{account}}": "{{account}}(으)로 연결됨",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive를 사용할 클라우드 제공업체로 설정합니다.",
|
||||
"Use Google Drive": "Google Drive 사용",
|
||||
"Sign-in opens in your browser.": "로그인은 브라우저에서 열립니다.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest는 Drive에서 직접 만든 파일에만 접근합니다.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "라이브러리, 읽기 진행 상황, 하이라이트를 WebDAV 서버와 동기화합니다.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "라이브러리, 읽기 진행 상황, 하이라이트를 Google Drive와 동기화합니다.",
|
||||
"Configured": "설정됨",
|
||||
"Use WebDAV": "WebDAV 사용",
|
||||
"Cloud Sync": "클라우드 동기화",
|
||||
"Extra Large": "매우 큼",
|
||||
"Hint size": "힌트 크기",
|
||||
"Gloss text size above the word": "단어 위에 표시되는 주석 텍스트 크기",
|
||||
"Hint color": "힌트 색상",
|
||||
"Adjust Text Selection": "텍스트 선택 조정",
|
||||
"Your books will appear here": "책이 여기에 표시됩니다",
|
||||
"Reading aloud continues in the background": "백그라운드에서 음성 읽기가 계속됩니다",
|
||||
"Stopped reading aloud": "음성 읽기를 중지했습니다",
|
||||
"Read aloud stopped": "음성 읽기가 중지되었습니다",
|
||||
"Cloud provider switched": "클라우드 제공자가 전환되었습니다",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} 동기화가 선택되어 있는 동안 Readest Cloud 업로드가 일시 중지됩니다",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}}이(가) 클라우드 동기화 제공자인 동안 {{provider}}이(가) 관리합니다",
|
||||
"Not signed in": "로그인하지 않음",
|
||||
"Paused — plan required": "일시 중지됨 — 요금제 필요",
|
||||
"Active · Book file uploads off": "활성 · 책 파일 업로드 꺼짐",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "앱 설정, 독서 통계, 사전은 로그인되어 있는 동안 Readest 계정을 통해 계속 동기화됩니다.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "라이브러리, 읽기 진행 상황, 하이라이트를 Readest Cloud와 동기화합니다.",
|
||||
"Account and Storage": "계정 및 저장소",
|
||||
"Manage your plan and stored files": "요금제와 저장된 파일 관리",
|
||||
"Cloud sync provider": "클라우드 동기화 제공자",
|
||||
"Use Readest Cloud": "Readest Cloud 사용",
|
||||
"Another device is still syncing this library via Readest Cloud": "다른 기기가 아직 Readest Cloud를 통해 이 라이브러리를 동기화하고 있습니다",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}}개의 업로드 실패: 저장소 할당량 부족",
|
||||
"Library sync via {{provider}}": "{{provider}}을(를) 통한 서재 동기화",
|
||||
"Google Drive session expired": "Google Drive 세션이 만료되었습니다",
|
||||
"Cloud sync session expired": "클라우드 동기화 세션이 만료되었습니다",
|
||||
"Uploads book files to your other devices": "책 파일을 다른 기기에 업로드합니다",
|
||||
"Re-check every book instead of only changed ones": "변경된 책뿐 아니라 모든 책을 다시 확인",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "버킷을 찾을 수 없습니다",
|
||||
"Endpoint": "엔드포인트",
|
||||
"Bucket": "버킷",
|
||||
"Region": "리전",
|
||||
"Access Key ID": "액세스 키 ID",
|
||||
"Your Access Key ID": "내 액세스 키 ID",
|
||||
"Secret Access Key": "시크릿 액세스 키",
|
||||
"Your Secret Access Key": "내 시크릿 액세스 키",
|
||||
"S3-Compatible Storage": "S3 호환 스토리지",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2, AWS S3, MinIO 등 S3 호환 버킷과 라이브러리, 읽기 진행률, 하이라이트를 동기화합니다.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "브라우저에서는 버킷의 CORS 정책이 이 사이트의 오리진을 허용해야 합니다.",
|
||||
"Use S3": "S3 사용",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "연결하기 전에 버킷이 존재하고 자격 증명에 읽기/쓰기 권한이 있는지 확인하세요.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}}를 선택하면 책, 진행률, 주석이 서버에만 동기화됩니다.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}}를 선택하면 책, 진행률, 주석이 Drive에만 동기화됩니다.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}}를 선택하면 책, 진행률, 주석이 버킷에만 동기화됩니다.",
|
||||
"Premium": "프리미엄",
|
||||
"S3 Storage": "S3 스토리지",
|
||||
"Speed": "속도",
|
||||
"{{time}} left in chapter": "이 장의 남은 시간 {{time}}",
|
||||
"Open Read Aloud player": "소리 내어 읽기 플레이어 열기",
|
||||
"Read Aloud": "소리 내어 읽기",
|
||||
"Voice": "음성",
|
||||
"Sleep Timer": "수면 타이머",
|
||||
"Slower": "느리게",
|
||||
"Faster": "빠르게",
|
||||
"Exit Auto Scroll": "자동 스크롤 종료",
|
||||
"Auto Scroll": "자동 스크롤",
|
||||
"End of book": "책의 끝",
|
||||
"Toggle Auto Scroll": "자동 스크롤 전환"
|
||||
}
|
||||
|
||||
@@ -118,7 +118,6 @@
|
||||
"Always on Top": "Sentiasa di Atas",
|
||||
"Always Show Status Bar": "Sentiasa Tunjuk Bar Status",
|
||||
"Keep Screen Awake": "Kekalkan Skrin Berjaga",
|
||||
"Background Read Aloud": "Baca Dengan Kuat di Latar Belakang",
|
||||
"Reload Page": "Muat Semula Halaman",
|
||||
"Settings": "Tetapan",
|
||||
"Advanced Settings": "Tetapan Lanjutan",
|
||||
@@ -274,7 +273,6 @@
|
||||
"Book": "Buku",
|
||||
"Chapter": "Bab",
|
||||
"Match Case": "Padankan Kes",
|
||||
"Match Whole Words": "Padankan Seluruh Perkataan",
|
||||
"Match Diacritics": "Padankan Diakritik",
|
||||
"Sidebar": "Bar Sisi",
|
||||
"Resize Sidebar": "Ubah Saiz Bar Sisi",
|
||||
@@ -291,8 +289,6 @@
|
||||
"Play": "Main",
|
||||
"Next Sentence": "Ayat Seterusnya",
|
||||
"Next Paragraph": "Perenggan Seterusnya",
|
||||
"Read Aloud": "Baca Dengan Kuat",
|
||||
"Ready to read aloud": "Bersedia untuk baca dengan kuat",
|
||||
"TTS not supported for this document": "TTS tidak disokong untuk dokumen ini",
|
||||
"No Timeout": "Tiada Had Masa",
|
||||
"{{value}} minute": "{{value}} minit",
|
||||
@@ -300,8 +296,6 @@
|
||||
"{{value}} hour": "{{value}} jam",
|
||||
"{{value}} hours": "{{value}} jam",
|
||||
"Voices for {{lang}}": "Suara untuk {{lang}}",
|
||||
"Slow": "Perlahan",
|
||||
"Fast": "Pantas",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} suara",
|
||||
"Zoom Level": "Tahap Zum",
|
||||
"Zoom Out": "Zum Keluar",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "Eksport",
|
||||
"Set Timeout": "Tetapkan masa tamat",
|
||||
"Select Voice": "Pilih suara",
|
||||
"Toggle Sticky Bottom TTS Bar": "Togol bar TTS melekit",
|
||||
"Display what I'm reading on Discord": "Papar buku yang sedang dibaca di Discord",
|
||||
"Show on Discord": "Papar di Discord",
|
||||
"Instant {{action}}": "{{action}} Segera",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Pengesahan WebDAV gagal. Sambung semula di Tetapan.",
|
||||
"Downloading": "Memuat turun",
|
||||
"Uploading": "Memuat naik",
|
||||
"downloaded {{n}} book(s)": "memuat turun {{n}} buah buku",
|
||||
"pushed {{n}} config(s)": "menghantar {{n}} konfigurasi",
|
||||
"uploaded {{n}} new file(s)": "memuat naik {{n}} fail baharu",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Penyegerakan selesai dengan {{failed}} kegagalan. {{ok}} berjaya.",
|
||||
"Sync complete": "Penyegerakan selesai",
|
||||
"Everything is already up to date.": "Semuanya sudah terkini.",
|
||||
"Browsing {{path}} on {{server}}": "Melayari {{path}} di {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Sambung ke pelayan WebDAV untuk melayari fail jauh anda.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Muat naik fail buku",
|
||||
"Sync now": "Segerakkan sekarang",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "Tunjukkan kata laluan",
|
||||
"Root Directory": "Direktori akar",
|
||||
"Syncing…": "Menyegerakkan…",
|
||||
"pulled progress for {{n}} book(s)": "mengambil kemajuan untuk {{n}} buah buku",
|
||||
"Sync History": "Sejarah Penyegerakan",
|
||||
"Clear Sync History": "Kosongkan Sejarah Penyegerakan",
|
||||
"No manual syncs yet": "Belum ada penyegerakan manual",
|
||||
"Partial": "Sebahagian",
|
||||
"Cleanup": "Pembersihan",
|
||||
"Cleanup failed": "Pembersihan gagal",
|
||||
"Sync failed": "Penyegerakan gagal",
|
||||
"{{n}} deleted": "{{n}} dipadam",
|
||||
"{{n}} failed": "{{n}} gagal",
|
||||
"Nothing deleted": "Tiada yang dipadam",
|
||||
"{{n}} downloaded": "{{n}} dimuat turun",
|
||||
"{{n}} uploaded": "{{n}} dimuat naik",
|
||||
"{{n}} progress": "{{n}} kemajuan",
|
||||
"Up to date": "Terkini",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Buku dimuat turun",
|
||||
"Files uploaded": "Fail dimuat naik",
|
||||
"Configs uploaded": "Konfigurasi dimuat naik",
|
||||
"Configs downloaded": "Konfigurasi dimuat turun",
|
||||
"Covers uploaded": "Kulit dimuat naik",
|
||||
"Books deleted": "Buku dipadam",
|
||||
"Files in sync": "Fail tersegerak",
|
||||
"Failures": "Kegagalan",
|
||||
"Total books": "Jumlah buku",
|
||||
"Error:": "Ralat:",
|
||||
"Failed books": "Buku gagal",
|
||||
"Deleted {{n}} book(s) from server.": "Memadam {{n}} buah buku dari pelayan.",
|
||||
"Failed to load directory": "Gagal memuatkan direktori",
|
||||
"File download is only supported on the desktop and mobile apps.": "Muat turun fail hanya disokong pada aplikasi desktop dan mudah alih.",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Pasang sambungan pelayar Readest untuk menghantar artikel yang sedang anda baca ke perpustakaan. Sambungan ini memotong halaman dari pelayar anda supaya laman berbayar dan laman log masuk sahaja masih berfungsi.",
|
||||
"Added to your library. It will sync to your other devices.": "Ditambah ke perpustakaan anda. Akan disegerakkan ke peranti anda yang lain.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Frasa kata laluan penyegerakan dilupakan. Semua medan yang disulitkan dibersihkan.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Hanya penyegerakan manual dan pembersihan. Penyegerakan automatik semasa membaca tidak dilog di sini.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Padam {{n}} buah buku dari pelayan WebDAV?\n\nIni hanya membuang fail jauh; perpustakaan tempatan anda tidak terjejas. Pemadaman tidak boleh dibatalkan. Bait di pelayan akan hilang selamanya.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Memuat naik fail buku ke peranti anda yang lain.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frasa kata laluan penyegerakan salah. Bukti kelayakan yang disegerakkan tidak dapat dinyahsulit.",
|
||||
"Email books straight to your library": "E-mel buku terus ke perpustakaan anda",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Majukan lampiran dan artikel ke alamat Readest peribadi anda. Tersedia pada pelan Plus, Pro dan Lifetime.",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Turut memadam kemajuan membaca, nota dan penanda buku.",
|
||||
"Background Image (Library)": "Imej Latar Belakang (Perpustakaan)",
|
||||
"Background Image (Reader)": "Imej Latar Belakang (Paparan Bacaan)",
|
||||
"updated metadata for {{n}} book(s)": "metadata dikemas kini untuk {{n}} buku",
|
||||
"{{n}} metadata": "{{n}} metadata",
|
||||
"Metadata updated": "Metadata dikemas kini",
|
||||
"Filter": "Tapis",
|
||||
"Sort by": "Isih mengikut",
|
||||
"Date modified": "Tarikh diubah suai",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "Granulariti",
|
||||
"Refresh Page": "Segarkan Halaman",
|
||||
"Recently read": "Baru dibaca",
|
||||
"Show recently read": "Tunjukkan baru dibaca"
|
||||
"Show recently read": "Tunjukkan baru dibaca",
|
||||
"Find:": "Cari:",
|
||||
"Enable rule": "Dayakan peraturan",
|
||||
"Disable rule": "Nyahdayakan peraturan",
|
||||
"Progress Read": "Kemajuan Membaca",
|
||||
"Auto-import new books from this folder": "Auto-import buku baharu dari folder ini",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Apabila buku baharu ditambahkan ke folder ini, buku tersebut akan diimport secara automatik pada kali berikutnya Readest dibuka atau kembali ke latar depan.",
|
||||
"Reading aloud": "Sedang membaca dengan kuat",
|
||||
"Open Book": "Buka Buku",
|
||||
"Stop reading aloud": "Hentikan bacaan kuat",
|
||||
"Enter at least two words": "Masukkan sekurang-kurangnya dua perkataan",
|
||||
"Search failed": "Carian gagal",
|
||||
"Search with regex": "Cari dengan regex",
|
||||
"Words to find near each other": "Perkataan yang dicari berdekatan antara satu sama lain",
|
||||
"Contains": "Mengandungi",
|
||||
"Whole Words": "Seluruh Perkataan",
|
||||
"Regular Expression": "Ungkapan Biasa",
|
||||
"Nearby Words": "Perkataan Berdekatan",
|
||||
"Within N words": "Dalam lingkungan N perkataan",
|
||||
"Not for regex": "Tidak untuk regex",
|
||||
"No results found": "Tiada hasil dijumpai",
|
||||
"{{count}} results_other": "{{count}} hasil",
|
||||
"Failed to seek": "Gagal mengubah kedudukan main",
|
||||
"Chapter progress": "Kemajuan bab",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} daripada {{total}}",
|
||||
"Decrease Contrast": "Kurangkan Kontras",
|
||||
"Reset Contrast": "Tetapkan Semula Kontras",
|
||||
"Increase Contrast": "Tingkatkan Kontras",
|
||||
"Push": "Tolak",
|
||||
"Slide": "Luncur",
|
||||
"Page Curl": "Lengkung Halaman",
|
||||
"Animation Style": "Gaya Animasi",
|
||||
"Appearance": "Penampilan",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Menetapkan saiz teks hasil kamus, tidak bergantung pada paparan bacaan.",
|
||||
"Authentication failed. Reconnect in Settings.": "Pengesahan gagal. Sambung semula di Tetapan.",
|
||||
"Full Sync": "Segerak Penuh",
|
||||
"Waiting for sign-in…": "Menunggu log masuk…",
|
||||
"Reconnect": "Sambung Semula",
|
||||
"Connected as {{account}}": "Disambungkan sebagai {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Jadikan Google Drive sebagai penyedia awan yang aktif.",
|
||||
"Use Google Drive": "Guna Google Drive",
|
||||
"Sign-in opens in your browser.": "Log masuk akan dibuka dalam pelayar anda.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest hanya mengakses fail yang diciptanya dalam Drive anda.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan pelayan WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan Google Drive anda.",
|
||||
"Configured": "Telah dikonfigurasi",
|
||||
"Use WebDAV": "Guna WebDAV",
|
||||
"Cloud Sync": "Segerak Awan",
|
||||
"Extra Large": "Sangat Besar",
|
||||
"Hint size": "Saiz petunjuk",
|
||||
"Gloss text size above the word": "Saiz teks keterangan di atas perkataan",
|
||||
"Hint color": "Warna petunjuk",
|
||||
"Adjust Text Selection": "Laraskan Pilihan Teks",
|
||||
"Your books will appear here": "Buku anda akan dipaparkan di sini",
|
||||
"Reading aloud continues in the background": "Bacaan kuat diteruskan di latar belakang",
|
||||
"Stopped reading aloud": "Berhenti membaca dengan kuat",
|
||||
"Read aloud stopped": "Bacaan kuat dihentikan",
|
||||
"Cloud provider switched": "Penyedia awan ditukar",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Muat naik ke Readest Cloud dijeda selagi penyegerakan {{provider}} dipilih",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Diuruskan oleh {{provider}} selagi ia penyedia penyegerakan awan anda",
|
||||
"Not signed in": "Belum log masuk",
|
||||
"Paused — plan required": "Dijeda — pelan diperlukan",
|
||||
"Active · Book file uploads off": "Aktif · Muat naik fail buku dimatikan",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Tetapan aplikasi, statistik bacaan dan kamus terus disegerakkan melalui akaun Readest anda selagi anda log masuk.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan Readest Cloud.",
|
||||
"Account and Storage": "Akaun dan storan",
|
||||
"Manage your plan and stored files": "Urus pelan dan fail tersimpan anda",
|
||||
"Cloud sync provider": "Penyedia penyegerakan awan",
|
||||
"Use Readest Cloud": "Guna Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Peranti lain masih menyegerakkan perpustakaan ini melalui Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} muat naik gagal: kuota storan tidak mencukupi",
|
||||
"Library sync via {{provider}}": "Penyegerakan pustaka melalui {{provider}}",
|
||||
"Google Drive session expired": "Sesi Google Drive telah tamat tempoh",
|
||||
"Cloud sync session expired": "Sesi penyegerakan awan telah tamat tempoh",
|
||||
"Uploads book files to your other devices": "Memuat naik fail buku ke peranti anda yang lain",
|
||||
"Re-check every book instead of only changed ones": "Semak semula setiap buku dan bukan hanya yang berubah",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket tidak ditemui",
|
||||
"Endpoint": "Titik akhir",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Wilayah",
|
||||
"Access Key ID": "ID Kunci Akses",
|
||||
"Your Access Key ID": "ID Kunci Akses anda",
|
||||
"Secret Access Key": "Kunci Akses Rahsia",
|
||||
"Your Secret Access Key": "Kunci Akses Rahsia anda",
|
||||
"S3-Compatible Storage": "Storan serasi S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Segerakkan perpustakaan, kemajuan bacaan dan sorotan anda dengan bucket serasi S3 seperti Cloudflare R2, AWS S3 atau MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Dalam pelayar, dasar CORS bucket mesti membenarkan origin laman ini.",
|
||||
"Use S3": "Guna S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Sebelum menyambung, pastikan bucket wujud dan kelayakan mempunyai akses baca/tulis.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Semasa {{provider}} dipilih, buku, kemajuan dan anotasi hanya disegerakkan ke pelayan anda.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Semasa {{provider}} dipilih, buku, kemajuan dan anotasi hanya disegerakkan ke Drive anda.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Semasa {{provider}} dipilih, buku, kemajuan dan anotasi hanya disegerakkan ke bucket anda.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Storan S3",
|
||||
"Speed": "Kelajuan",
|
||||
"{{time}} left in chapter": "{{time}} berbaki dalam bab",
|
||||
"Open Read Aloud player": "Buka pemain baca lantang",
|
||||
"Read Aloud": "Baca Lantang",
|
||||
"Voice": "Suara",
|
||||
"Sleep Timer": "Pemasa Tidur",
|
||||
"Slower": "Lebih perlahan",
|
||||
"Faster": "Lebih cepat",
|
||||
"Exit Auto Scroll": "Keluar daripada tatal automatik",
|
||||
"Auto Scroll": "Tatal Automatik",
|
||||
"End of book": "Penghujung buku",
|
||||
"Toggle Auto Scroll": "Togol tatal automatik"
|
||||
}
|
||||
|
||||
@@ -199,7 +199,6 @@
|
||||
"Book": "Boek",
|
||||
"Chapter": "Hoofdstuk",
|
||||
"Match Case": "Hoofdlettergevoelig",
|
||||
"Match Whole Words": "Hele woorden",
|
||||
"Match Diacritics": "Diakritische tekens",
|
||||
"TOC": "Inhoudsopgave",
|
||||
"Table of Contents": "Inhoudsopgave",
|
||||
@@ -209,8 +208,6 @@
|
||||
"{{value}} minutes": "{{value}} minuten",
|
||||
"{{value}} hour": "{{value}} uur",
|
||||
"{{value}} hours": "{{value}} uren",
|
||||
"Slow": "Langzaam",
|
||||
"Fast": "Snel",
|
||||
"Reading Progress Synced": "Leesvoortgang gesynchroniseerd",
|
||||
"Failed to delete user. Please try again later.": "Gebruiker verwijderen mislukt. Probeer het later opnieuw.",
|
||||
"Community Support": "Community-ondersteuning",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "Start Migratie",
|
||||
"Advanced Settings": "Geavanceerde Instellingen",
|
||||
"File count: {{size}}": "Bestandsaantal: {{size}}",
|
||||
"Background Read Aloud": "Achtergrond Voorlezen",
|
||||
"Ready to read aloud": "Klaar om voor te lezen",
|
||||
"Read Aloud": "Voorlezen",
|
||||
"Screen Brightness": "Schermhelderheid",
|
||||
"Background Image": "Achtergrondafbeelding",
|
||||
"Import Image": "Afbeelding importeren",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "Exporteren",
|
||||
"Set Timeout": "Time-out instellen",
|
||||
"Select Voice": "Stem selecteren",
|
||||
"Toggle Sticky Bottom TTS Bar": "Vaste TTS-balk schakelen",
|
||||
"Display what I'm reading on Discord": "Toon wat ik lees op Discord",
|
||||
"Show on Discord": "Toon op Discord",
|
||||
"Instant {{action}}": "Directe {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-authenticatie mislukt. Verbind opnieuw in Instellingen.",
|
||||
"Downloading": "Downloaden",
|
||||
"Uploading": "Uploaden",
|
||||
"downloaded {{n}} book(s)": "{{n}} boek(en) gedownload",
|
||||
"pushed {{n}} config(s)": "{{n}} configuratie(s) verzonden",
|
||||
"uploaded {{n}} new file(s)": "{{n}} nieuw(e) bestand(en) geüpload",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronisatie voltooid met {{failed}} fout(en). {{ok}} ok.",
|
||||
"Sync complete": "Synchronisatie voltooid",
|
||||
"Everything is already up to date.": "Alles is al up-to-date.",
|
||||
"Browsing {{path}} on {{server}}": "{{path}} bekijken op {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Maak verbinding met een WebDAV-server om je externe bestanden te bekijken.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Boekbestanden uploaden",
|
||||
"Sync now": "Nu synchroniseren",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Wachtwoord tonen",
|
||||
"Root Directory": "Hoofdmap",
|
||||
"Syncing…": "Synchroniseren…",
|
||||
"pulled progress for {{n}} book(s)": "voortgang opgehaald voor {{n}} boek(en)",
|
||||
"Sync History": "Synchronisatiegeschiedenis",
|
||||
"Clear Sync History": "Synchronisatiegeschiedenis wissen",
|
||||
"No manual syncs yet": "Nog geen handmatige synchronisaties",
|
||||
"Partial": "Gedeeltelijk",
|
||||
"Cleanup": "Opschonen",
|
||||
"Cleanup failed": "Opschonen mislukt",
|
||||
"Sync failed": "Synchronisatie mislukt",
|
||||
"{{n}} deleted": "{{n}} verwijderd",
|
||||
"{{n}} failed": "{{n}} mislukt",
|
||||
"Nothing deleted": "Niets verwijderd",
|
||||
"{{n}} downloaded": "{{n}} gedownload",
|
||||
"{{n}} uploaded": "{{n}} geüpload",
|
||||
"{{n}} progress": "{{n}} voortgang",
|
||||
"Up to date": "Up-to-date",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Boeken gedownload",
|
||||
"Files uploaded": "Bestanden geüpload",
|
||||
"Configs uploaded": "Configuraties geüpload",
|
||||
"Configs downloaded": "Configuraties gedownload",
|
||||
"Covers uploaded": "Omslagen geüpload",
|
||||
"Books deleted": "Verwijderde boeken",
|
||||
"Files in sync": "Gesynchroniseerde bestanden",
|
||||
"Failures": "Fouten",
|
||||
"Total books": "Totaal aantal boeken",
|
||||
"Error:": "Fout:",
|
||||
"Failed books": "Mislukte boeken",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} boek(en) van server verwijderd.",
|
||||
"Failed to load directory": "Map kon niet worden geladen",
|
||||
"File download is only supported on the desktop and mobile apps.": "Bestanden downloaden wordt alleen ondersteund in de desktop- en mobiele apps.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installeer de Readest-browserextensie om het artikel dat je leest naar je bibliotheek te sturen. De extensie knipt de pagina vanuit je browser, zodat ook betaalsites en login-only sites werken.",
|
||||
"Added to your library. It will sync to your other devices.": "Toegevoegd aan je bibliotheek. Het wordt gesynchroniseerd met je andere apparaten.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Sync-wachtwoordzin vergeten. Alle versleutelde velden gewist.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Alleen handmatige synchronisaties en opschoonacties. Automatische synchronisaties tijdens het lezen worden hier niet vastgelegd.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "{{n}} boek(en) van WebDAV-server verwijderen?\n\nDit verwijdert alleen de externe bestanden; je lokale bibliotheek wordt niet beïnvloed. Verwijderen kan niet ongedaan worden gemaakt. De bytes op de server zijn permanent verloren.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Uploadt boekbestanden naar uw andere apparaten.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Verkeerde sync-wachtwoordzin. Gesynchroniseerde inloggegevens konden niet worden ontsleuteld.",
|
||||
"Email books straight to your library": "Mail boeken rechtstreeks naar je bibliotheek",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Stuur bijlagen en artikelen door naar je privé Readest-adres. Beschikbaar in de Plus-, Pro- en Lifetime-abonnementen.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Wist ook leesvoortgang, notities en bladwijzers.",
|
||||
"Background Image (Library)": "Achtergrondafbeelding (Bibliotheek)",
|
||||
"Background Image (Reader)": "Achtergrondafbeelding (Leesweergave)",
|
||||
"updated metadata for {{n}} book(s)": "metadata bijgewerkt voor {{n}} boek(en)",
|
||||
"{{n}} metadata": "{{n}} metadata",
|
||||
"Metadata updated": "Metadata bijgewerkt",
|
||||
"Filter": "Filteren",
|
||||
"Sort by": "Sorteren op",
|
||||
"Date modified": "Wijzigingsdatum",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Granulariteit",
|
||||
"Refresh Page": "Pagina vernieuwen",
|
||||
"Recently read": "Onlangs gelezen",
|
||||
"Show recently read": "Onlangs gelezen tonen"
|
||||
"Show recently read": "Onlangs gelezen tonen",
|
||||
"Find:": "Zoeken:",
|
||||
"Enable rule": "Regel inschakelen",
|
||||
"Disable rule": "Regel uitschakelen",
|
||||
"Progress Read": "Leesvoortgang",
|
||||
"Auto-import new books from this folder": "Nieuwe boeken uit deze map automatisch importeren",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Wanneer nieuwe boeken aan deze map worden toegevoegd, worden ze automatisch geïmporteerd zodra Readest de volgende keer wordt geopend of weer op de voorgrond komt.",
|
||||
"Reading aloud": "Bezig met voorlezen",
|
||||
"Open Book": "Boek openen",
|
||||
"Stop reading aloud": "Voorlezen stoppen",
|
||||
"Enter at least two words": "Voer minstens twee woorden in",
|
||||
"Search failed": "Zoeken mislukt",
|
||||
"Search with regex": "Zoeken met regex",
|
||||
"Words to find near each other": "Woorden die dicht bij elkaar moeten staan",
|
||||
"Contains": "Bevat",
|
||||
"Whole Words": "Hele woorden",
|
||||
"Regular Expression": "Reguliere expressie",
|
||||
"Nearby Words": "Nabije woorden",
|
||||
"Within N words": "Binnen N woorden",
|
||||
"Not for regex": "Niet voor regex",
|
||||
"No results found": "Geen resultaten gevonden",
|
||||
"{{count}} results_one": "{{count}} resultaat",
|
||||
"{{count}} results_other": "{{count}} resultaten",
|
||||
"Failed to seek": "Doorspoelen mislukt",
|
||||
"Chapter progress": "Hoofdstukvoortgang",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} van {{total}}",
|
||||
"Decrease Contrast": "Contrast verlagen",
|
||||
"Reset Contrast": "Contrast resetten",
|
||||
"Increase Contrast": "Contrast verhogen",
|
||||
"Push": "Duwen",
|
||||
"Slide": "Schuiven",
|
||||
"Page Curl": "Omslaan",
|
||||
"Animation Style": "Animatiestijl",
|
||||
"Appearance": "Uiterlijk",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Stelt de tekstgrootte van woordenboekresultaten in, onafhankelijk van de leesweergave.",
|
||||
"Authentication failed. Reconnect in Settings.": "Verificatie mislukt. Verbind opnieuw via Instellingen.",
|
||||
"Full Sync": "Volledige synchronisatie",
|
||||
"Waiting for sign-in…": "Wachten op inloggen…",
|
||||
"Reconnect": "Opnieuw verbinden",
|
||||
"Connected as {{account}}": "Verbonden als {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Maak Google Drive de actieve cloudprovider.",
|
||||
"Use Google Drive": "Google Drive gebruiken",
|
||||
"Sign-in opens in your browser.": "Inloggen opent in je browser.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest heeft alleen toegang tot de bestanden die het zelf in je Drive aanmaakt.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met een WebDAV-server.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met je Google Drive.",
|
||||
"Configured": "Geconfigureerd",
|
||||
"Use WebDAV": "WebDAV gebruiken",
|
||||
"Cloud Sync": "Cloudsynchronisatie",
|
||||
"Extra Large": "Extra groot",
|
||||
"Hint size": "Hintgrootte",
|
||||
"Gloss text size above the word": "Tekstgrootte van de hint boven het woord",
|
||||
"Hint color": "Hintkleur",
|
||||
"Adjust Text Selection": "Tekstselectie aanpassen",
|
||||
"Your books will appear here": "Je boeken verschijnen hier",
|
||||
"Reading aloud continues in the background": "Voorlezen gaat door op de achtergrond",
|
||||
"Stopped reading aloud": "Voorlezen gestopt",
|
||||
"Read aloud stopped": "Voorlezen is gestopt",
|
||||
"Cloud provider switched": "Cloudprovider gewisseld",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uploads naar Readest Cloud zijn gepauzeerd zolang {{provider}}-synchronisatie is geselecteerd",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Beheerd door {{provider}} zolang het je cloudsynchronisatieprovider is",
|
||||
"Not signed in": "Niet ingelogd",
|
||||
"Paused — plan required": "Gepauzeerd — abonnement vereist",
|
||||
"Active · Book file uploads off": "Actief · Uploaden van boekbestanden uit",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "App-instellingen, leesstatistieken en woordenboeken blijven via je Readest-account synchroniseren zolang je bent ingelogd.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met Readest Cloud.",
|
||||
"Account and Storage": "Account en opslag",
|
||||
"Manage your plan and stored files": "Beheer je abonnement en opgeslagen bestanden",
|
||||
"Cloud sync provider": "Cloudsynchronisatieprovider",
|
||||
"Use Readest Cloud": "Readest Cloud gebruiken",
|
||||
"Another device is still syncing this library via Readest Cloud": "Een ander apparaat synchroniseert deze bibliotheek nog via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} upload mislukt: onvoldoende opslagruimte",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uploads mislukt: onvoldoende opslagruimte",
|
||||
"Library sync via {{provider}}": "Bibliotheeksynchronisatie via {{provider}}",
|
||||
"Google Drive session expired": "Google Drive-sessie verlopen",
|
||||
"Cloud sync session expired": "Cloudsynchronisatiesessie verlopen",
|
||||
"Uploads book files to your other devices": "Uploadt boekbestanden naar je andere apparaten",
|
||||
"Re-check every book instead of only changed ones": "Controleer elk boek opnieuw in plaats van alleen gewijzigde",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket niet gevonden",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Regio",
|
||||
"Access Key ID": "Toegangssleutel-ID",
|
||||
"Your Access Key ID": "Uw toegangssleutel-ID",
|
||||
"Secret Access Key": "Geheime toegangssleutel",
|
||||
"Your Secret Access Key": "Uw geheime toegangssleutel",
|
||||
"S3-Compatible Storage": "S3-compatibele opslag",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Synchroniseer uw bibliotheek, leesvoortgang en markeringen met een S3-compatibele bucket zoals Cloudflare R2, AWS S3 of MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "In de browser moet het CORS-beleid van de bucket de origin van deze site toestaan.",
|
||||
"Use S3": "S3 gebruiken",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Zorg er vóór het verbinden voor dat de bucket bestaat en dat de inloggegevens lees-/schrijftoegang hebben.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Zolang {{provider}} is geselecteerd, worden boeken, voortgang en annotaties alleen met uw server gesynchroniseerd.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Zolang {{provider}} is geselecteerd, worden boeken, voortgang en annotaties alleen met uw Drive gesynchroniseerd.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Zolang {{provider}} is geselecteerd, worden boeken, voortgang en annotaties alleen met uw bucket gesynchroniseerd.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "S3-opslag",
|
||||
"Speed": "Snelheid",
|
||||
"{{time}} left in chapter": "{{time}} resterend in hoofdstuk",
|
||||
"Open Read Aloud player": "Voorleesspeler openen",
|
||||
"Read Aloud": "Voorlezen",
|
||||
"Voice": "Stem",
|
||||
"Sleep Timer": "Slaaptimer",
|
||||
"Slower": "Langzamer",
|
||||
"Faster": "Sneller",
|
||||
"Exit Auto Scroll": "Automatisch scrollen afsluiten",
|
||||
"Auto Scroll": "Automatisch scrollen",
|
||||
"End of book": "Einde van het boek",
|
||||
"Toggle Auto Scroll": "Automatisch scrollen wisselen"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Edytuj",
|
||||
"Excerpts": "Fragmenty",
|
||||
"Failed to import book(s): {{filenames}}": "Nie udało się zaimportować książek: {{filenames}}",
|
||||
"Fast": "Szybko",
|
||||
"Font": "Czcionka",
|
||||
"Font & Layout": "Czcionka i układ",
|
||||
"Font Face": "Krój czcionki",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Zalogowano jako {{userDisplayName}}",
|
||||
"Match Case": "Uwzględnij wielkość liter",
|
||||
"Match Diacritics": "Uwzględnij znaki diakrytyczne",
|
||||
"Match Whole Words": "Uwzględnij całe słowa",
|
||||
"Maximum Number of Columns": "Maksymalna liczba kolumn",
|
||||
"Minimum Font Size": "Minimalny rozmiar czcionki",
|
||||
"Monospace Font": "Czcionka o stałej szerokości",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Zaloguj się",
|
||||
"Sign Out": "Wyloguj się",
|
||||
"Sky": "Niebieski",
|
||||
"Slow": "Wolno",
|
||||
"Solarized": "Słoneczny",
|
||||
"Speak": "Czytaj",
|
||||
"Subjects": "Tematy",
|
||||
@@ -590,9 +587,6 @@
|
||||
"Start Migration": "Rozpocznij migrację",
|
||||
"Advanced Settings": "Ustawienia zaawansowane",
|
||||
"File count: {{size}}": "Liczba plików: {{size}}",
|
||||
"Background Read Aloud": "Czytanie na głos w tle",
|
||||
"Ready to read aloud": "Gotowy do przeczytania na głos",
|
||||
"Read Aloud": "Czytaj na głos",
|
||||
"Screen Brightness": "Jasność ekranu",
|
||||
"Background Image": "Obraz tła",
|
||||
"Import Image": "Importuj obraz",
|
||||
@@ -902,7 +896,6 @@
|
||||
"Export": "Eksportuj",
|
||||
"Set Timeout": "Ustaw limit czasu",
|
||||
"Select Voice": "Wybierz głos",
|
||||
"Toggle Sticky Bottom TTS Bar": "Przełącz przypiętą dolną belkę TTS",
|
||||
"Display what I'm reading on Discord": "Wyświetl to, co czytam na Discord",
|
||||
"Show on Discord": "Pokaż na Discord",
|
||||
"Instant {{action}}": "Natychmiastowe {{action}}",
|
||||
@@ -1589,14 +1582,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Uwierzytelnienie WebDAV nie powiodło się. Połącz ponownie w Ustawieniach.",
|
||||
"Downloading": "Pobieranie",
|
||||
"Uploading": "Wysyłanie",
|
||||
"downloaded {{n}} book(s)": "pobrano {{n}} książkę/książek",
|
||||
"pushed {{n}} config(s)": "wysłano {{n}} konfigurację/konfiguracji",
|
||||
"uploaded {{n}} new file(s)": "wysłano {{n}} nowy plik/plików",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synchronizacja zakończona z {{failed}} niepowodzeniami. {{ok}} ok.",
|
||||
"Sync complete": "Synchronizacja zakończona",
|
||||
"Everything is already up to date.": "Wszystko jest aktualne.",
|
||||
"Browsing {{path}} on {{server}}": "Przeglądanie {{path}} na {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Połącz się z serwerem WebDAV, aby przeglądać zdalne pliki.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Wyślij pliki książek",
|
||||
"Sync now": "Synchronizuj teraz",
|
||||
@@ -1604,33 +1590,8 @@
|
||||
"Show password": "Pokaż hasło",
|
||||
"Root Directory": "Katalog główny",
|
||||
"Syncing…": "Synchronizacja…",
|
||||
"pulled progress for {{n}} book(s)": "pobrano postępy {{n}} książek",
|
||||
"Sync History": "Historia synchronizacji",
|
||||
"Clear Sync History": "Wyczyść historię synchronizacji",
|
||||
"No manual syncs yet": "Brak ręcznych synchronizacji",
|
||||
"Partial": "Częściowo",
|
||||
"Cleanup": "Porządkowanie",
|
||||
"Cleanup failed": "Porządkowanie nieudane",
|
||||
"Sync failed": "Synchronizacja nieudana",
|
||||
"{{n}} deleted": "{{n}} usunięto",
|
||||
"{{n}} failed": "{{n}} nie powiodło się",
|
||||
"Nothing deleted": "Nic nie usunięto",
|
||||
"{{n}} downloaded": "{{n}} pobrano",
|
||||
"{{n}} uploaded": "{{n}} wysłano",
|
||||
"{{n}} progress": "{{n}} postępów",
|
||||
"Up to date": "Aktualne",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Pobrane książki",
|
||||
"Files uploaded": "Wysłane pliki",
|
||||
"Configs uploaded": "Wysłane konfiguracje",
|
||||
"Configs downloaded": "Pobrane konfiguracje",
|
||||
"Covers uploaded": "Wysłane okładki",
|
||||
"Books deleted": "Usunięte książki",
|
||||
"Files in sync": "Pliki w synchronizacji",
|
||||
"Failures": "Niepowodzenia",
|
||||
"Total books": "Łącznie książek",
|
||||
"Error:": "Błąd:",
|
||||
"Failed books": "Książki z błędem",
|
||||
"Deleted {{n}} book(s) from server.": "Usunięto {{n}} książkę/książek z serwera.",
|
||||
"Failed to load directory": "Nie udało się załadować katalogu",
|
||||
"File download is only supported on the desktop and mobile apps.": "Pobieranie plików jest obsługiwane tylko w aplikacjach na komputer i urządzenia mobilne.",
|
||||
@@ -1660,10 +1621,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Zainstaluj rozszerzenie przeglądarki Readest, aby wysłać czytany artykuł do biblioteki. Wycina stronę z przeglądarki, dzięki czemu działają również strony płatne i wymagające logowania.",
|
||||
"Added to your library. It will sync to your other devices.": "Dodano do biblioteki. Zostanie zsynchronizowane z innymi urządzeniami.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Zapomniano hasło synchronizacji. Wszystkie zaszyfrowane pola wyczyszczone.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Tylko ręczne synchronizacje i porządkowanie. Automatyczne synchronizacje podczas czytania nie są tu rejestrowane.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Usunąć {{n}} książek z serwera WebDAV?\n\nUsuwa to tylko zdalne pliki; lokalna biblioteka pozostaje nienaruszona. Usunięcia nie można cofnąć. Bajty na serwerze zostaną trwale utracone.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Przesyła pliki książek na Twoje inne urządzenia.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Nieprawidłowe hasło synchronizacji. Nie udało się odszyfrować zsynchronizowanych poświadczeń.",
|
||||
"Email books straight to your library": "Wysyłaj książki e-mailem prosto do biblioteki",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Przekazuj załączniki i artykuły na swój prywatny adres Readest. Dostępne w planach Plus, Pro i Lifetime.",
|
||||
@@ -1858,9 +1817,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Usuwa również postęp czytania, notatki i zakładki.",
|
||||
"Background Image (Library)": "Obraz tła (Biblioteka)",
|
||||
"Background Image (Reader)": "Obraz tła (Widok czytania)",
|
||||
"updated metadata for {{n}} book(s)": "zaktualizowano metadane dla {{n}} książek",
|
||||
"{{n}} metadata": "{{n}} metadane",
|
||||
"Metadata updated": "Zaktualizowane metadane",
|
||||
"Filter": "Filtruj",
|
||||
"Sort by": "Sortuj według",
|
||||
"Date modified": "Data modyfikacji",
|
||||
@@ -1875,5 +1831,119 @@
|
||||
"Granularity": "Ziarnistość",
|
||||
"Refresh Page": "Odśwież stronę",
|
||||
"Recently read": "Ostatnio czytane",
|
||||
"Show recently read": "Pokaż ostatnio czytane"
|
||||
"Show recently read": "Pokaż ostatnio czytane",
|
||||
"Find:": "Znajdź:",
|
||||
"Enable rule": "Włącz regułę",
|
||||
"Disable rule": "Wyłącz regułę",
|
||||
"Progress Read": "Postęp czytania",
|
||||
"Auto-import new books from this folder": "Automatycznie importuj nowe książki z tego folderu",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Gdy do tego folderu zostaną dodane nowe książki, zostaną one automatycznie zaimportowane przy następnym uruchomieniu Readest lub powrocie aplikacji na pierwszy plan.",
|
||||
"Reading aloud": "Czytanie na głos",
|
||||
"Open Book": "Otwórz książkę",
|
||||
"Stop reading aloud": "Zatrzymaj czytanie na głos",
|
||||
"Enter at least two words": "Wpisz co najmniej dwa słowa",
|
||||
"Search failed": "Wyszukiwanie nie powiodło się",
|
||||
"Search with regex": "Szukaj z użyciem wyrażenia regularnego",
|
||||
"Words to find near each other": "Słowa do znalezienia blisko siebie",
|
||||
"Contains": "Zawiera",
|
||||
"Whole Words": "Całe słowa",
|
||||
"Regular Expression": "Wyrażenie regularne",
|
||||
"Nearby Words": "Słowa w pobliżu",
|
||||
"Within N words": "W obrębie N słów",
|
||||
"Not for regex": "Nie dotyczy wyrażeń regularnych",
|
||||
"No results found": "Nie znaleziono wyników",
|
||||
"{{count}} results_one": "{{count}} wynik",
|
||||
"{{count}} results_few": "{{count}} wyniki",
|
||||
"{{count}} results_many": "{{count}} wyników",
|
||||
"{{count}} results_other": "{{count}} wyniku",
|
||||
"Failed to seek": "Nie udało się przewinąć",
|
||||
"Chapter progress": "Postęp rozdziału",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} z {{total}}",
|
||||
"Decrease Contrast": "Zmniejsz kontrast",
|
||||
"Reset Contrast": "Zresetuj kontrast",
|
||||
"Increase Contrast": "Zwiększ kontrast",
|
||||
"Push": "Przesunięcie",
|
||||
"Slide": "Nasunięcie",
|
||||
"Page Curl": "Zawijanie strony",
|
||||
"Animation Style": "Styl animacji",
|
||||
"Appearance": "Wygląd",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Ustawia rozmiar tekstu wyników słownika, niezależnie od widoku czytania.",
|
||||
"Authentication failed. Reconnect in Settings.": "Uwierzytelnianie nie powiodło się. Połącz ponownie w Ustawieniach.",
|
||||
"Full Sync": "Pełna synchronizacja",
|
||||
"Waiting for sign-in…": "Oczekiwanie na zalogowanie…",
|
||||
"Reconnect": "Połącz ponownie",
|
||||
"Connected as {{account}}": "Połączono jako {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Ustaw Google Drive jako aktywnego dostawcę chmury.",
|
||||
"Use Google Drive": "Użyj Google Drive",
|
||||
"Sign-in opens in your browser.": "Logowanie otworzy się w przeglądarce.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest ma dostęp tylko do plików, które sam tworzy na Twoim Dysku Google.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia z serwerem WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia ze swoim Google Drive.",
|
||||
"Configured": "Skonfigurowano",
|
||||
"Use WebDAV": "Użyj WebDAV",
|
||||
"Cloud Sync": "Synchronizacja w chmurze",
|
||||
"Extra Large": "Bardzo duży",
|
||||
"Hint size": "Rozmiar podpowiedzi",
|
||||
"Gloss text size above the word": "Rozmiar tekstu podpowiedzi nad słowem",
|
||||
"Hint color": "Kolor podpowiedzi",
|
||||
"Adjust Text Selection": "Dostosuj zaznaczenie tekstu",
|
||||
"Your books will appear here": "Tutaj pojawią się Twoje książki",
|
||||
"Reading aloud continues in the background": "Czytanie na głos jest kontynuowane w tle",
|
||||
"Stopped reading aloud": "Zatrzymano czytanie na głos",
|
||||
"Read aloud stopped": "Czytanie na głos zatrzymane",
|
||||
"Cloud provider switched": "Zmieniono dostawcę chmury",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Przesyłanie do Readest Cloud jest wstrzymane, dopóki wybrana jest synchronizacja {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Zarządzane przez {{provider}}, dopóki jest Twoim dostawcą synchronizacji w chmurze",
|
||||
"Not signed in": "Nie zalogowano",
|
||||
"Paused — plan required": "Wstrzymano — wymagany plan",
|
||||
"Active · Book file uploads off": "Aktywne · Przesyłanie plików książek wyłączone",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Ustawienia aplikacji, statystyki czytania i słowniki nadal synchronizują się przez Twoje konto Readest, dopóki jesteś zalogowany.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia z Readest Cloud.",
|
||||
"Account and Storage": "Konto i przechowywanie",
|
||||
"Manage your plan and stored files": "Zarządzaj swoim planem i przechowywanymi plikami",
|
||||
"Cloud sync provider": "Dostawca synchronizacji w chmurze",
|
||||
"Use Readest Cloud": "Użyj Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Inne urządzenie nadal synchronizuje tę bibliotekę przez Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} przesyłanie nieudane: niewystarczająca kwota przechowywania",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} przesyłania nieudane: niewystarczająca kwota przechowywania",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} przesyłań nieudanych: niewystarczająca kwota przechowywania",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} przesyłania nieudane: niewystarczająca kwota przechowywania",
|
||||
"Library sync via {{provider}}": "Synchronizacja biblioteki przez {{provider}}",
|
||||
"Google Drive session expired": "Sesja Google Drive wygasła",
|
||||
"Cloud sync session expired": "Sesja synchronizacji w chmurze wygasła",
|
||||
"Uploads book files to your other devices": "Przesyła pliki książek na Twoje inne urządzenia",
|
||||
"Re-check every book instead of only changed ones": "Ponownie sprawdź każdą książkę zamiast tylko zmienionych",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Nie znaleziono bucketa",
|
||||
"Endpoint": "Punkt końcowy",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Region",
|
||||
"Access Key ID": "ID klucza dostępu",
|
||||
"Your Access Key ID": "Twoje ID klucza dostępu",
|
||||
"Secret Access Key": "Tajny klucz dostępu",
|
||||
"Your Secret Access Key": "Twój tajny klucz dostępu",
|
||||
"S3-Compatible Storage": "Magazyn zgodny z S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia z bucketem zgodnym z S3, takim jak Cloudflare R2, AWS S3 lub MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "W przeglądarce polityka CORS bucketa musi zezwalać na origin tej witryny.",
|
||||
"Use S3": "Użyj S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Przed połączeniem upewnij się, że bucket istnieje, a dane uwierzytelniające mają dostęp do odczytu i zapisu.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Gdy wybrany jest {{provider}}, książki, postęp i adnotacje synchronizują się tylko z Twoim serwerem.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Gdy wybrany jest {{provider}}, książki, postęp i adnotacje synchronizują się tylko z Twoim Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Gdy wybrany jest {{provider}}, książki, postęp i adnotacje synchronizują się tylko z Twoim bucketem.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Magazyn S3",
|
||||
"Speed": "Prędkość",
|
||||
"{{time}} left in chapter": "Pozostało {{time}} w rozdziale",
|
||||
"Open Read Aloud player": "Otwórz odtwarzacz czytania na głos",
|
||||
"Read Aloud": "Czytanie na głos",
|
||||
"Voice": "Głos",
|
||||
"Sleep Timer": "Minutnik snu",
|
||||
"Slower": "Wolniej",
|
||||
"Faster": "Szybciej",
|
||||
"Exit Auto Scroll": "Zakończ automatyczne przewijanie",
|
||||
"Auto Scroll": "Automatyczne przewijanie",
|
||||
"End of book": "Koniec książki",
|
||||
"Toggle Auto Scroll": "Przełącz automatyczne przewijanie"
|
||||
}
|
||||
|
||||
@@ -164,7 +164,6 @@
|
||||
"Fullscreen": "Tela cheia",
|
||||
"Always on Top": "Sempre no topo",
|
||||
"Always Show Status Bar": "Sempre exibir a barra de status",
|
||||
"Background Read Aloud": "Leitura em segundo plano",
|
||||
"Settings": "Configurações",
|
||||
"Advanced Settings": "Configurações avançadas",
|
||||
"Refresh Metadata": "Atualizar metadados",
|
||||
@@ -671,7 +670,6 @@
|
||||
"Clear search history": "Limpar histórico de pesquisa",
|
||||
"Chapter": "Capítulo",
|
||||
"Match Case": "Diferenciar maiúsculas e minúsculas",
|
||||
"Match Whole Words": "Corresponder palavras inteiras",
|
||||
"Match Diacritics": "Corresponder acentos",
|
||||
"Search results for '{{term}}'": "Resultados para '{{term}}'",
|
||||
"Previous Result": "Resultado anterior",
|
||||
@@ -703,14 +701,11 @@
|
||||
"{{value}} hour": "{{value}} hora",
|
||||
"{{value}} hours": "{{value}} horas",
|
||||
"Voices for {{lang}}": "Vozes para {{lang}}",
|
||||
"Slow": "Lento",
|
||||
"Fast": "Rápido",
|
||||
"Set Timeout": "Definir tempo limite",
|
||||
"Select Voice": "Selecionar voz",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} voz",
|
||||
"{{engine}}: {{count}} voices_many": "{{engine}}: {{count}} vozes",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} vozes",
|
||||
"Toggle Sticky Bottom TTS Bar": "Alternar barra TTS fixada",
|
||||
"Zoom Level": "Nível de zoom",
|
||||
"Zoom Out": "Reduzir zoom",
|
||||
"Reset Zoom": "Redefinir zoom",
|
||||
@@ -746,8 +741,6 @@
|
||||
"Translating...": "Traduzindo...",
|
||||
"Please log in to use advanced TTS features": "Faça login para usar recursos avançados de TTS",
|
||||
"TTS not supported for this document": "TTS não suportado para este documento",
|
||||
"Read Aloud": "Ler em voz alta",
|
||||
"Ready to read aloud": "Pronto para leitura em voz alta",
|
||||
"Expires in {{count}} days_one": "Expira em 1 dia",
|
||||
"Expires in {{count}} days_many": "Expira em {{count}} dias",
|
||||
"Expires in {{count}} days_other": "Expira em {{count}} dias",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autenticação WebDAV falhou. Reconecte em Configurações.",
|
||||
"Downloading": "Baixando",
|
||||
"Uploading": "Enviando",
|
||||
"downloaded {{n}} book(s)": "{{n}} livro(s) baixado(s)",
|
||||
"pushed {{n}} config(s)": "{{n}} configuração(ões) enviada(s)",
|
||||
"uploaded {{n}} new file(s)": "{{n}} novo(s) arquivo(s) enviado(s)",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronização concluída com {{failed}} falha(s). {{ok}} ok.",
|
||||
"Sync complete": "Sincronização concluída",
|
||||
"Everything is already up to date.": "Tudo já está atualizado.",
|
||||
"Browsing {{path}} on {{server}}": "Navegando em {{path}} no {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Conecte-se a um servidor WebDAV para navegar nos seus arquivos remotos.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Enviar arquivos de livros",
|
||||
"Sync now": "Sincronizar agora",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Mostrar senha",
|
||||
"Root Directory": "Diretório raiz",
|
||||
"Syncing…": "Sincronizando…",
|
||||
"pulled progress for {{n}} book(s)": "progresso de {{n}} livro(s) obtido",
|
||||
"Sync History": "Histórico de sincronização",
|
||||
"Clear Sync History": "Limpar histórico de sincronização",
|
||||
"No manual syncs yet": "Sem sincronizações manuais ainda",
|
||||
"Partial": "Parcial",
|
||||
"Cleanup": "Limpeza",
|
||||
"Cleanup failed": "Limpeza falhou",
|
||||
"Sync failed": "Sincronização falhou",
|
||||
"{{n}} deleted": "{{n}} excluídos",
|
||||
"{{n}} failed": "{{n}} com falha",
|
||||
"Nothing deleted": "Nada excluído",
|
||||
"{{n}} downloaded": "{{n}} baixados",
|
||||
"{{n}} uploaded": "{{n}} enviados",
|
||||
"{{n}} progress": "{{n}} progressos",
|
||||
"Up to date": "Atualizado",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Livros baixados",
|
||||
"Files uploaded": "Arquivos enviados",
|
||||
"Configs uploaded": "Configurações enviadas",
|
||||
"Configs downloaded": "Configurações baixadas",
|
||||
"Covers uploaded": "Capas enviadas",
|
||||
"Books deleted": "Livros excluídos",
|
||||
"Files in sync": "Arquivos em sincronia",
|
||||
"Failures": "Falhas",
|
||||
"Total books": "Total de livros",
|
||||
"Error:": "Erro:",
|
||||
"Failed books": "Livros com falha",
|
||||
"Deleted {{n}} book(s) from server.": "{{n}} livro(s) excluído(s) do servidor.",
|
||||
"Failed to load directory": "Falha ao carregar diretório",
|
||||
"File download is only supported on the desktop and mobile apps.": "O download de arquivos só é suportado nos aplicativos para desktop e celular.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instale a extensão de navegador Readest para enviar o artigo que você está lendo para sua biblioteca. Ela recorta a página do seu navegador, então sites pagos e somente com login continuam funcionando.",
|
||||
"Added to your library. It will sync to your other devices.": "Adicionado à sua biblioteca. Será sincronizado com seus outros dispositivos.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase-senha de sincronização esquecida. Todos os campos criptografados foram limpos.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Apenas sincronizações manuais e limpezas. As sincronizações automáticas durante a leitura não são registradas aqui.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Excluir {{n}} livro(s) do servidor WebDAV?\n\nIsso apenas remove os arquivos remotos; sua biblioteca local não é afetada. A exclusão não pode ser desfeita. Os bytes no servidor desaparecerão permanentemente.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Envia os arquivos de livros para os seus outros dispositivos.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase-senha de sincronização incorreta. Não foi possível descriptografar as credenciais sincronizadas.",
|
||||
"Email books straight to your library": "Envie livros por e-mail direto para sua biblioteca",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Encaminhe anexos e artigos para seu endereço Readest privado. Disponível nos planos Plus, Pro e Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Também apaga o progresso de leitura, as notas e os marcadores.",
|
||||
"Background Image (Library)": "Imagem de fundo (Biblioteca)",
|
||||
"Background Image (Reader)": "Imagem de fundo (Vista de leitura)",
|
||||
"updated metadata for {{n}} book(s)": "metadados atualizados de {{n}} livro(s)",
|
||||
"{{n}} metadata": "{{n}} metadados",
|
||||
"Metadata updated": "Metadados atualizados",
|
||||
"Filter": "Filtrar",
|
||||
"Sort by": "Ordenar por",
|
||||
"Date modified": "Data de modificação",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularidade",
|
||||
"Refresh Page": "Atualizar página",
|
||||
"Recently read": "Lidos recentemente",
|
||||
"Show recently read": "Mostrar lidos recentemente"
|
||||
"Show recently read": "Mostrar lidos recentemente",
|
||||
"Find:": "Localizar:",
|
||||
"Enable rule": "Ativar regra",
|
||||
"Disable rule": "Desativar regra",
|
||||
"Progress Read": "Progresso de leitura",
|
||||
"Auto-import new books from this folder": "Importar automaticamente os livros novos desta pasta",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando novos livros forem adicionados a esta pasta, eles serão importados automaticamente na próxima vez que o Readest abrir ou voltar ao primeiro plano.",
|
||||
"Reading aloud": "Lendo em voz alta",
|
||||
"Open Book": "Abrir livro",
|
||||
"Stop reading aloud": "Parar a leitura em voz alta",
|
||||
"Enter at least two words": "Digite pelo menos duas palavras",
|
||||
"Search failed": "A pesquisa falhou",
|
||||
"Search with regex": "Pesquisar com regex",
|
||||
"Words to find near each other": "Palavras a serem encontradas próximas umas das outras",
|
||||
"Contains": "Contém",
|
||||
"Whole Words": "Palavras inteiras",
|
||||
"Regular Expression": "Expressão regular",
|
||||
"Nearby Words": "Palavras próximas",
|
||||
"Within N words": "A menos de N palavras",
|
||||
"Not for regex": "Não disponível com regex",
|
||||
"No results found": "Nenhum resultado encontrado",
|
||||
"{{count}} results_one": "{{count}} resultado",
|
||||
"{{count}} results_many": "{{count}} de resultados",
|
||||
"{{count}} results_other": "{{count}} resultados",
|
||||
"Failed to seek": "Falha ao mudar de posição",
|
||||
"Chapter progress": "Progresso do capítulo",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}",
|
||||
"Decrease Contrast": "Diminuir contraste",
|
||||
"Reset Contrast": "Redefinir contraste",
|
||||
"Increase Contrast": "Aumentar contraste",
|
||||
"Push": "Empurrar",
|
||||
"Slide": "Deslizar",
|
||||
"Page Curl": "Curvatura de página",
|
||||
"Animation Style": "Estilo de animação",
|
||||
"Appearance": "Aparência",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da visualização de leitura.",
|
||||
"Authentication failed. Reconnect in Settings.": "A autenticação falhou. Reconecte em Configurações.",
|
||||
"Full Sync": "Sincronização completa",
|
||||
"Waiting for sign-in…": "Aguardando login…",
|
||||
"Reconnect": "Reconectar",
|
||||
"Connected as {{account}}": "Conectado como {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Torne o Google Drive o provedor de nuvem ativo.",
|
||||
"Use Google Drive": "Usar o Google Drive",
|
||||
"Sign-in opens in your browser.": "O login abre no seu navegador.",
|
||||
"Readest only accesses the files it creates in your Drive.": "O Readest só acessa os arquivos que cria no seu Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronize sua biblioteca, progresso de leitura e destaques com um servidor WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sincronize sua biblioteca, progresso de leitura e destaques com o seu Google Drive.",
|
||||
"Configured": "Configurado",
|
||||
"Use WebDAV": "Usar WebDAV",
|
||||
"Cloud Sync": "Sincronização na nuvem",
|
||||
"Extra Large": "Extra grande",
|
||||
"Hint size": "Tamanho da dica",
|
||||
"Gloss text size above the word": "Tamanho do texto da dica sobre a palavra",
|
||||
"Hint color": "Cor da dica",
|
||||
"Adjust Text Selection": "Ajustar seleção de texto",
|
||||
"Your books will appear here": "Seus livros aparecerão aqui",
|
||||
"Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano",
|
||||
"Stopped reading aloud": "Leitura em voz alta interrompida",
|
||||
"Read aloud stopped": "Leitura em voz alta interrompida",
|
||||
"Cloud provider switched": "Provedor de nuvem alterado",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Os envios para o Readest Cloud estão pausados enquanto a sincronização {{provider}} estiver selecionada",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Gerenciado por {{provider}} enquanto for o seu provedor de sincronização na nuvem",
|
||||
"Not signed in": "Não conectado",
|
||||
"Paused — plan required": "Pausado — é necessário um plano",
|
||||
"Active · Book file uploads off": "Ativo · Envio de arquivos de livros desligado",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "As configurações do aplicativo, as estatísticas de leitura e os dicionários continuam sincronizando pela sua conta Readest enquanto você estiver conectado.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronize sua biblioteca, progresso de leitura e destaques com o Readest Cloud.",
|
||||
"Account and Storage": "Conta e armazenamento",
|
||||
"Manage your plan and stored files": "Gerencie seu plano e arquivos armazenados",
|
||||
"Cloud sync provider": "Provedor de sincronização na nuvem",
|
||||
"Use Readest Cloud": "Usar o Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Outro dispositivo ainda está sincronizando esta biblioteca via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} envio falhou: cota de armazenamento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} envios falharam: cota de armazenamento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente",
|
||||
"Library sync via {{provider}}": "Sincronização da biblioteca via {{provider}}",
|
||||
"Google Drive session expired": "A sessão do Google Drive expirou",
|
||||
"Cloud sync session expired": "A sessão de sincronização na nuvem expirou",
|
||||
"Uploads book files to your other devices": "Envia arquivos de livros para seus outros dispositivos",
|
||||
"Re-check every book instead of only changed ones": "Verificar novamente todos os livros em vez de apenas os alterados",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket não encontrado",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Região",
|
||||
"Access Key ID": "ID da chave de acesso",
|
||||
"Your Access Key ID": "Seu ID da chave de acesso",
|
||||
"Secret Access Key": "Chave de acesso secreta",
|
||||
"Your Secret Access Key": "Sua chave de acesso secreta",
|
||||
"S3-Compatible Storage": "Armazenamento compatível com S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sincronize sua biblioteca, progresso de leitura e destaques com um bucket compatível com S3, como Cloudflare R2, AWS S3 ou MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "No navegador, a política de CORS do bucket deve permitir a origem deste site.",
|
||||
"Use S3": "Usar S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Antes de conectar, verifique se o bucket existe e se as credenciais têm acesso de leitura/gravação.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Enquanto o {{provider}} estiver selecionado, livros, progresso e anotações são sincronizados apenas com seu servidor.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Enquanto o {{provider}} estiver selecionado, livros, progresso e anotações são sincronizados apenas com seu Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Enquanto o {{provider}} estiver selecionado, livros, progresso e anotações são sincronizados apenas com seu bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Armazenamento S3",
|
||||
"Speed": "Velocidade",
|
||||
"{{time}} left in chapter": "{{time}} restante no capítulo",
|
||||
"Open Read Aloud player": "Abrir o player de leitura em voz alta",
|
||||
"Read Aloud": "Leitura em voz alta",
|
||||
"Voice": "Voz",
|
||||
"Sleep Timer": "Timer de sono",
|
||||
"Slower": "Mais lento",
|
||||
"Faster": "Mais rápido",
|
||||
"Exit Auto Scroll": "Sair da rolagem automática",
|
||||
"Auto Scroll": "Rolagem automática",
|
||||
"End of book": "Fim do livro",
|
||||
"Toggle Auto Scroll": "Alternar rolagem automática"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Editar",
|
||||
"Excerpts": "Trechos",
|
||||
"Failed to import book(s): {{filenames}}": "Falha ao importar livro(s): {{filenames}}",
|
||||
"Fast": "Rápido",
|
||||
"Font": "Fonte",
|
||||
"Font & Layout": "Fonte e Layout",
|
||||
"Font Face": "Estilo da Fonte",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Conectado como {{userDisplayName}}",
|
||||
"Match Case": "Diferenciar Maiúsculas e Minúsculas",
|
||||
"Match Diacritics": "Corresponder Acentos",
|
||||
"Match Whole Words": "Corresponder Palavras Inteiras",
|
||||
"Maximum Number of Columns": "Número Máximo de Colunas",
|
||||
"Minimum Font Size": "Tamanho Mínimo da Fonte",
|
||||
"Monospace Font": "Fonte Monoespaçada",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Entrar",
|
||||
"Sign Out": "Sair",
|
||||
"Sky": "Céu",
|
||||
"Slow": "Lento",
|
||||
"Solarized": "Solarizado",
|
||||
"Speak": "Falar",
|
||||
"Subjects": "Assuntos",
|
||||
@@ -586,9 +583,6 @@
|
||||
"Start Migration": "Iniciar Migração",
|
||||
"Advanced Settings": "Configurações Avançadas",
|
||||
"File count: {{size}}": "Contagem de arquivos: {{size}}",
|
||||
"Background Read Aloud": "Leitura em Segundo Plano",
|
||||
"Ready to read aloud": "Pronto para leitura em voz alta",
|
||||
"Read Aloud": "Ler em Voz Alta",
|
||||
"Screen Brightness": "Brilho da Tela",
|
||||
"Background Image": "Imagem de Fundo",
|
||||
"Import Image": "Importar Imagem",
|
||||
@@ -891,7 +885,6 @@
|
||||
"Export": "Exportar",
|
||||
"Set Timeout": "Definir tempo limite",
|
||||
"Select Voice": "Selecionar voz",
|
||||
"Toggle Sticky Bottom TTS Bar": "Alternar barra TTS fixada",
|
||||
"Display what I'm reading on Discord": "Mostrar o que estou lendo no Discord",
|
||||
"Show on Discord": "Mostrar no Discord",
|
||||
"Instant {{action}}": "{{action}} instantâneo",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autenticação WebDAV falhou. Ligue novamente em Definições.",
|
||||
"Downloading": "A descarregar",
|
||||
"Uploading": "A enviar",
|
||||
"downloaded {{n}} book(s)": "{{n}} livro(s) descarregado(s)",
|
||||
"pushed {{n}} config(s)": "{{n}} configuração(ões) enviada(s)",
|
||||
"uploaded {{n}} new file(s)": "{{n}} novo(s) ficheiro(s) enviado(s)",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronização concluída com {{failed}} falha(s). {{ok}} ok.",
|
||||
"Sync complete": "Sincronização concluída",
|
||||
"Everything is already up to date.": "Está tudo atualizado.",
|
||||
"Browsing {{path}} on {{server}}": "A navegar em {{path}} em {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Ligue-se a um servidor WebDAV para navegar nos seus ficheiros remotos.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Enviar ficheiros de livros",
|
||||
"Sync now": "Sincronizar agora",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Mostrar palavra-passe",
|
||||
"Root Directory": "Diretório raiz",
|
||||
"Syncing…": "A sincronizar…",
|
||||
"pulled progress for {{n}} book(s)": "progresso de {{n}} livro(s) obtido",
|
||||
"Sync History": "Histórico de sincronização",
|
||||
"Clear Sync History": "Limpar histórico de sincronização",
|
||||
"No manual syncs yet": "Sem sincronizações manuais",
|
||||
"Partial": "Parcial",
|
||||
"Cleanup": "Limpeza",
|
||||
"Cleanup failed": "Limpeza falhou",
|
||||
"Sync failed": "Sincronização falhou",
|
||||
"{{n}} deleted": "{{n}} eliminados",
|
||||
"{{n}} failed": "{{n}} com falha",
|
||||
"Nothing deleted": "Nada eliminado",
|
||||
"{{n}} downloaded": "{{n}} descarregados",
|
||||
"{{n}} uploaded": "{{n}} enviados",
|
||||
"{{n}} progress": "{{n}} progressos",
|
||||
"Up to date": "Atualizado",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Livros descarregados",
|
||||
"Files uploaded": "Ficheiros enviados",
|
||||
"Configs uploaded": "Configurações enviadas",
|
||||
"Configs downloaded": "Configurações descarregadas",
|
||||
"Covers uploaded": "Capas enviadas",
|
||||
"Books deleted": "Livros eliminados",
|
||||
"Files in sync": "Ficheiros sincronizados",
|
||||
"Failures": "Falhas",
|
||||
"Total books": "Total de livros",
|
||||
"Error:": "Erro:",
|
||||
"Failed books": "Livros com falha",
|
||||
"Deleted {{n}} book(s) from server.": "Eliminado(s) {{n}} livro(s) do servidor.",
|
||||
"Failed to load directory": "Falha ao carregar diretório",
|
||||
"File download is only supported on the desktop and mobile apps.": "O download de ficheiros só é suportado nas aplicações de desktop e móvel.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instale a extensão de navegador Readest para enviar o artigo que está a ler para a sua biblioteca. Recorta a página a partir do seu navegador, para que sites pagos e que exigem início de sessão continuem a funcionar.",
|
||||
"Added to your library. It will sync to your other devices.": "Adicionado à sua biblioteca. Será sincronizado com os seus outros dispositivos.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Frase-passe de sincronização esquecida. Todos os campos encriptados foram limpos.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Apenas sincronizações manuais e limpezas. As sincronizações automáticas durante a leitura não são registadas aqui.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Eliminar {{n}} livro(s) do servidor WebDAV?\n\nIsto apenas remove os ficheiros remotos; a sua biblioteca local não é afetada. A eliminação não pode ser anulada. Os bytes no servidor desaparecerão permanentemente.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Envia os ficheiros de livros para os seus outros dispositivos.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Frase-passe de sincronização incorreta. Não foi possível desencriptar as credenciais sincronizadas.",
|
||||
"Email books straight to your library": "Envie livros por e-mail diretamente para a sua biblioteca",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Encaminhe anexos e artigos para o seu endereço Readest privado. Disponível nos planos Plus, Pro e Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Também apaga o progresso de leitura, notas e marcadores.",
|
||||
"Background Image (Library)": "Imagem de Fundo (Biblioteca)",
|
||||
"Background Image (Reader)": "Imagem de Fundo (Vista de leitura)",
|
||||
"updated metadata for {{n}} book(s)": "metadados atualizados de {{n}} livro(s)",
|
||||
"{{n}} metadata": "{{n}} metadados",
|
||||
"Metadata updated": "Metadados atualizados",
|
||||
"Filter": "Filtrar",
|
||||
"Sort by": "Ordenar por",
|
||||
"Date modified": "Data de modificação",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularidade",
|
||||
"Refresh Page": "Atualizar Página",
|
||||
"Recently read": "Lidos recentemente",
|
||||
"Show recently read": "Mostrar lidos recentemente"
|
||||
"Show recently read": "Mostrar lidos recentemente",
|
||||
"Find:": "Localizar:",
|
||||
"Enable rule": "Ativar regra",
|
||||
"Disable rule": "Desativar regra",
|
||||
"Progress Read": "Progresso de Leitura",
|
||||
"Auto-import new books from this folder": "Importar automaticamente os livros novos desta pasta",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando forem adicionados livros novos a esta pasta, serão importados automaticamente na próxima vez que o Readest abrir ou voltar ao primeiro plano.",
|
||||
"Reading aloud": "A ler em voz alta",
|
||||
"Open Book": "Abrir Livro",
|
||||
"Stop reading aloud": "Parar a leitura em voz alta",
|
||||
"Enter at least two words": "Introduza pelo menos duas palavras",
|
||||
"Search failed": "A pesquisa falhou",
|
||||
"Search with regex": "Pesquisar com regex",
|
||||
"Words to find near each other": "Palavras a encontrar próximas umas das outras",
|
||||
"Contains": "Contém",
|
||||
"Whole Words": "Palavras Inteiras",
|
||||
"Regular Expression": "Expressão Regular",
|
||||
"Nearby Words": "Palavras Próximas",
|
||||
"Within N words": "A menos de N palavras",
|
||||
"Not for regex": "Não disponível com regex",
|
||||
"No results found": "Nenhum resultado encontrado",
|
||||
"{{count}} results_one": "{{count}} resultado",
|
||||
"{{count}} results_many": "{{count}} de resultados",
|
||||
"{{count}} results_other": "{{count}} resultados",
|
||||
"Failed to seek": "Falha ao mudar de posição",
|
||||
"Chapter progress": "Progresso do capítulo",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}",
|
||||
"Decrease Contrast": "Diminuir Contraste",
|
||||
"Reset Contrast": "Redefinir Contraste",
|
||||
"Increase Contrast": "Aumentar Contraste",
|
||||
"Push": "Empurrar",
|
||||
"Slide": "Deslizar",
|
||||
"Page Curl": "Curvatura da Página",
|
||||
"Animation Style": "Estilo de Animação",
|
||||
"Appearance": "Aparência",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da vista de leitura.",
|
||||
"Authentication failed. Reconnect in Settings.": "A autenticação falhou. Ligue novamente em Definições.",
|
||||
"Full Sync": "Sincronização Completa",
|
||||
"Waiting for sign-in…": "A aguardar o início de sessão…",
|
||||
"Reconnect": "Ligar novamente",
|
||||
"Connected as {{account}}": "Ligado como {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Torne o Google Drive o fornecedor de nuvem ativo.",
|
||||
"Use Google Drive": "Usar o Google Drive",
|
||||
"Sign-in opens in your browser.": "O início de sessão abre no seu navegador.",
|
||||
"Readest only accesses the files it creates in your Drive.": "O Readest só acede aos ficheiros que cria no seu Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com um servidor WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com o seu Google Drive.",
|
||||
"Configured": "Configurado",
|
||||
"Use WebDAV": "Usar WebDAV",
|
||||
"Cloud Sync": "Sincronização na Nuvem",
|
||||
"Extra Large": "Extra Grande",
|
||||
"Hint size": "Tamanho da dica",
|
||||
"Gloss text size above the word": "Tamanho do texto da dica sobre a palavra",
|
||||
"Hint color": "Cor da dica",
|
||||
"Adjust Text Selection": "Ajustar Seleção de Texto",
|
||||
"Your books will appear here": "Os seus livros aparecerão aqui",
|
||||
"Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano",
|
||||
"Stopped reading aloud": "Leitura em voz alta interrompida",
|
||||
"Read aloud stopped": "Leitura em voz alta interrompida",
|
||||
"Cloud provider switched": "Fornecedor de nuvem alterado",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Os envios para o Readest Cloud estão em pausa enquanto a sincronização {{provider}} estiver selecionada",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Gerido por {{provider}} enquanto for o seu fornecedor de sincronização na nuvem",
|
||||
"Not signed in": "Sessão não iniciada",
|
||||
"Paused — plan required": "Em pausa — é necessário um plano",
|
||||
"Active · Book file uploads off": "Ativo · Envio de ficheiros de livros desligado",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "As definições da aplicação, as estatísticas de leitura e os dicionários continuam a sincronizar através da sua conta Readest enquanto tiver sessão iniciada.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com o Readest Cloud.",
|
||||
"Account and Storage": "Conta e armazenamento",
|
||||
"Manage your plan and stored files": "Faça a gestão do seu plano e dos ficheiros armazenados",
|
||||
"Cloud sync provider": "Fornecedor de sincronização na nuvem",
|
||||
"Use Readest Cloud": "Usar o Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Outro dispositivo ainda está a sincronizar esta biblioteca via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} envio falhou: cota de armazenamento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} envios falharam: cota de armazenamento insuficiente",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} envios falharam: cota de armazenamento insuficiente",
|
||||
"Library sync via {{provider}}": "Sincronização da biblioteca via {{provider}}",
|
||||
"Google Drive session expired": "A sessão do Google Drive expirou",
|
||||
"Cloud sync session expired": "A sessão de sincronização na nuvem expirou",
|
||||
"Uploads book files to your other devices": "Carrega ficheiros de livros para os seus outros dispositivos",
|
||||
"Re-check every book instead of only changed ones": "Verificar novamente todos os livros em vez de apenas os alterados",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket não encontrado",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Região",
|
||||
"Access Key ID": "ID da chave de acesso",
|
||||
"Your Access Key ID": "O seu ID da chave de acesso",
|
||||
"Secret Access Key": "Chave de acesso secreta",
|
||||
"Your Secret Access Key": "A sua chave de acesso secreta",
|
||||
"S3-Compatible Storage": "Armazenamento compatível com S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com um bucket compatível com S3, como Cloudflare R2, AWS S3 ou MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "No navegador, a política de CORS do bucket tem de permitir a origem deste site.",
|
||||
"Use S3": "Usar S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Antes de ligar, certifique-se de que o bucket existe e de que as credenciais têm acesso de leitura/escrita.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Enquanto o {{provider}} estiver selecionado, os livros, o progresso e as anotações são sincronizados apenas com o seu servidor.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Enquanto o {{provider}} estiver selecionado, os livros, o progresso e as anotações são sincronizados apenas com o seu Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Enquanto o {{provider}} estiver selecionado, os livros, o progresso e as anotações são sincronizados apenas com o seu bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Armazenamento S3",
|
||||
"Speed": "Velocidade",
|
||||
"{{time}} left in chapter": "{{time}} restante no capítulo",
|
||||
"Open Read Aloud player": "Abrir o leitor de leitura em voz alta",
|
||||
"Read Aloud": "Leitura em voz alta",
|
||||
"Voice": "Voz",
|
||||
"Sleep Timer": "Temporizador de sono",
|
||||
"Slower": "Mais lento",
|
||||
"Faster": "Mais rápido",
|
||||
"Exit Auto Scroll": "Sair da rolagem automática",
|
||||
"Auto Scroll": "Rolagem automática",
|
||||
"End of book": "Fim do livro",
|
||||
"Toggle Auto Scroll": "Alternar rolagem automática"
|
||||
}
|
||||
|
||||
@@ -162,7 +162,6 @@
|
||||
"Always on Top": "Întotdeauna deasupra",
|
||||
"Always Show Status Bar": "Afișați întotdeauna bara de stare",
|
||||
"Keep Screen Awake": "Păstrați ecranul activ",
|
||||
"Background Read Aloud": "Citire cu voce tare în fundal",
|
||||
"Reload Page": "Reîncarcă pagina",
|
||||
"Settings": "Setări",
|
||||
"Advanced Settings": "Setări avansate",
|
||||
@@ -598,7 +597,6 @@
|
||||
"Clear search history": "Șterge istoricul căutărilor",
|
||||
"Chapter": "Capitol",
|
||||
"Match Case": "Sensibil la majuscule/minuscule",
|
||||
"Match Whole Words": "Doar cuvinte întregi",
|
||||
"Match Diacritics": "Potrivește diacriticele",
|
||||
"Search results for '{{term}}'": "Rezultatele căutării pentru „{{term}}”",
|
||||
"Previous Result": "Rezultatul anterior",
|
||||
@@ -625,14 +623,11 @@
|
||||
"{{value}} hour": "{{value}} oră",
|
||||
"{{value}} hours": "{{value}} ore",
|
||||
"Voices for {{lang}}": "Voci pentru {{lang}}",
|
||||
"Slow": "Încet",
|
||||
"Fast": "Rapid",
|
||||
"Set Timeout": "Setează limita de timp",
|
||||
"Select Voice": "Selectează vocea",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} voce",
|
||||
"{{engine}}: {{count}} voices_few": "{{engine}}: {{count}} voci",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} de voci",
|
||||
"Toggle Sticky Bottom TTS Bar": "Comută bara TTS fixată jos",
|
||||
"Zoom Level": "Nivel de zoom",
|
||||
"Zoom Out": "Micșorare",
|
||||
"Reset Zoom": "Resetează zoomul",
|
||||
@@ -660,8 +655,6 @@
|
||||
"Translating...": "Se traduce...",
|
||||
"Please log in to use advanced TTS features": "Vă rugăm să vă conectați pentru a utiliza funcțiile TTS avansate",
|
||||
"TTS not supported for this document": "TTS nu este acceptat pentru acest document",
|
||||
"Read Aloud": "Citiți cu voce tare",
|
||||
"Ready to read aloud": "Gata pentru citire cu voce tare",
|
||||
"Delete Your Account?": "Ștergeți contul dvs.?",
|
||||
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Această acțiune nu poate fi anulată. Toate datele dvs. din cloud vor fi șterse permanent.",
|
||||
"Delete Permanently": "Șterge definitiv",
|
||||
@@ -1560,14 +1553,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Autentificarea WebDAV a eșuat. Reconectează-te în Setări.",
|
||||
"Downloading": "Se descarcă",
|
||||
"Uploading": "Se încarcă",
|
||||
"downloaded {{n}} book(s)": "s-au descărcat {{n}} carte/cărți",
|
||||
"pushed {{n}} config(s)": "s-au trimis {{n}} configurări",
|
||||
"uploaded {{n}} new file(s)": "s-au încărcat {{n}} fișier(e) nou(noi)",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sincronizare finalizată cu {{failed}} eșec(uri). {{ok}} ok.",
|
||||
"Sync complete": "Sincronizare completă",
|
||||
"Everything is already up to date.": "Totul este deja la zi.",
|
||||
"Browsing {{path}} on {{server}}": "Răsfoiește {{path}} pe {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Conectează-te la un server WebDAV pentru a-ți răsfoi fișierele de la distanță.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Încarcă fișierele de carte",
|
||||
"Sync now": "Sincronizează acum",
|
||||
@@ -1575,33 +1561,8 @@
|
||||
"Show password": "Arată parola",
|
||||
"Root Directory": "Director rădăcină",
|
||||
"Syncing…": "Se sincronizează…",
|
||||
"pulled progress for {{n}} book(s)": "s-a preluat progresul pentru {{n}} carte/cărți",
|
||||
"Sync History": "Istoric sincronizare",
|
||||
"Clear Sync History": "Șterge istoricul de sincronizare",
|
||||
"No manual syncs yet": "Nicio sincronizare manuală încă",
|
||||
"Partial": "Parțial",
|
||||
"Cleanup": "Curățare",
|
||||
"Cleanup failed": "Curățarea a eșuat",
|
||||
"Sync failed": "Sincronizarea a eșuat",
|
||||
"{{n}} deleted": "{{n}} șterse",
|
||||
"{{n}} failed": "{{n}} eșuate",
|
||||
"Nothing deleted": "Nimic șters",
|
||||
"{{n}} downloaded": "{{n}} descărcate",
|
||||
"{{n}} uploaded": "{{n}} încărcate",
|
||||
"{{n}} progress": "{{n}} progres",
|
||||
"Up to date": "La zi",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Cărți descărcate",
|
||||
"Files uploaded": "Fișiere încărcate",
|
||||
"Configs uploaded": "Configurări încărcate",
|
||||
"Configs downloaded": "Configurări descărcate",
|
||||
"Covers uploaded": "Coperți încărcate",
|
||||
"Books deleted": "Cărți șterse",
|
||||
"Files in sync": "Fișiere sincronizate",
|
||||
"Failures": "Eșecuri",
|
||||
"Total books": "Total cărți",
|
||||
"Error:": "Eroare:",
|
||||
"Failed books": "Cărți eșuate",
|
||||
"Deleted {{n}} book(s) from server.": "S-au șters {{n}} carte/cărți de pe server.",
|
||||
"Failed to load directory": "Eroare la încărcarea directorului",
|
||||
"File download is only supported on the desktop and mobile apps.": "Descărcarea fișierelor este acceptată doar în aplicațiile desktop și mobile.",
|
||||
@@ -1630,10 +1591,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Instalează extensia de browser Readest pentru a trimite articolul pe care îl citești în biblioteca ta. Extensia decupează pagina din browser, astfel încât și site-urile cu plată sau care necesită conectare să funcționeze.",
|
||||
"Added to your library. It will sync to your other devices.": "Adăugat în biblioteca ta. Se va sincroniza cu celelalte dispozitive.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Parola de sincronizare uitată. Toate câmpurile criptate au fost șterse.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Doar sincronizări manuale și curățări. Sincronizările automate în timpul citirii nu sunt înregistrate aici.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Ștergi {{n}} carte/cărți de pe serverul WebDAV?\n\nAceasta elimină doar fișierele de la distanță; biblioteca locală nu este afectată. Ștergerea nu poate fi anulată. Datele de pe server vor dispărea definitiv.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Încarcă fișierele de carte pe celelalte dispozitive ale tale.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Parolă de sincronizare incorectă. Acreditările sincronizate nu au putut fi decriptate.",
|
||||
"Email books straight to your library": "Trimite cărți prin e-mail direct în biblioteca ta",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Redirecționează atașamente și articole către adresa ta Readest privată. Disponibil în planurile Plus, Pro și Lifetime.",
|
||||
@@ -1825,9 +1784,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Șterge de asemenea progresul citirii, notele și marcajele.",
|
||||
"Background Image (Library)": "Imagine de fundal (Bibliotecă)",
|
||||
"Background Image (Reader)": "Imagine de fundal (Vizualizare de lectură)",
|
||||
"updated metadata for {{n}} book(s)": "metadate actualizate pentru {{n}} carte/cărți",
|
||||
"{{n}} metadata": "{{n}} metadate",
|
||||
"Metadata updated": "Metadate actualizate",
|
||||
"Filter": "Filtrează",
|
||||
"Sort by": "Sortează după",
|
||||
"Date modified": "Data modificării",
|
||||
@@ -1842,5 +1798,117 @@
|
||||
"Granularity": "Granularitate",
|
||||
"Refresh Page": "Reîmprospătează pagina",
|
||||
"Recently read": "Citite recent",
|
||||
"Show recently read": "Afișează citite recent"
|
||||
"Show recently read": "Afișează citite recent",
|
||||
"Find:": "Găsește:",
|
||||
"Enable rule": "Activează regula",
|
||||
"Disable rule": "Dezactivează regula",
|
||||
"Progress Read": "Progresul citirii",
|
||||
"Auto-import new books from this folder": "Importă automat cărțile noi din acest folder",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Când se adaugă cărți noi în acest folder, acestea vor fi importate automat data viitoare când Readest se deschide sau revine în prim-plan.",
|
||||
"Reading aloud": "Se citește cu voce tare",
|
||||
"Open Book": "Deschide cartea",
|
||||
"Stop reading aloud": "Oprește citirea cu voce tare",
|
||||
"Enter at least two words": "Introduceți cel puțin două cuvinte",
|
||||
"Search failed": "Căutarea a eșuat",
|
||||
"Search with regex": "Căutați cu regex",
|
||||
"Words to find near each other": "Cuvinte care apar aproape unele de altele",
|
||||
"Contains": "Conține",
|
||||
"Whole Words": "Cuvinte întregi",
|
||||
"Regular Expression": "Expresie regulată",
|
||||
"Nearby Words": "Cuvinte apropiate",
|
||||
"Within N words": "La cel mult N cuvinte",
|
||||
"Not for regex": "Indisponibil pentru regex",
|
||||
"No results found": "Nu s-au găsit rezultate",
|
||||
"{{count}} results_one": "{{count}} rezultat",
|
||||
"{{count}} results_few": "{{count}} rezultate",
|
||||
"{{count}} results_other": "{{count}} de rezultate",
|
||||
"Failed to seek": "Derularea a eșuat",
|
||||
"Chapter progress": "Progresul capitolului",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} din {{total}}",
|
||||
"Decrease Contrast": "Micșorează contrastul",
|
||||
"Reset Contrast": "Resetează contrastul",
|
||||
"Increase Contrast": "Mărește contrastul",
|
||||
"Push": "Împingere",
|
||||
"Slide": "Glisare",
|
||||
"Page Curl": "Răsfoire de pagină",
|
||||
"Animation Style": "Stil de animație",
|
||||
"Appearance": "Aspect",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Setează dimensiunea textului rezultatelor din dicționar, independent de vizualizarea de lectură.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autentificarea a eșuat. Reconectează-te în Setări.",
|
||||
"Full Sync": "Sincronizare integrală",
|
||||
"Waiting for sign-in…": "Se așteaptă conectarea…",
|
||||
"Reconnect": "Reconectare",
|
||||
"Connected as {{account}}": "Conectat ca {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Setează Google Drive ca furnizor de cloud activ.",
|
||||
"Use Google Drive": "Folosește Google Drive",
|
||||
"Sign-in opens in your browser.": "Conectarea se deschide în browser.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest accesează doar fișierele pe care le creează în Drive-ul tău.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu un server WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu Google Drive-ul tău.",
|
||||
"Configured": "Configurat",
|
||||
"Use WebDAV": "Folosește WebDAV",
|
||||
"Cloud Sync": "Sincronizare în cloud",
|
||||
"Extra Large": "Foarte mare",
|
||||
"Hint size": "Dimensiunea indiciului",
|
||||
"Gloss text size above the word": "Dimensiunea textului afișat deasupra cuvântului",
|
||||
"Hint color": "Culoarea indiciului",
|
||||
"Adjust Text Selection": "Ajustează selecția de text",
|
||||
"Your books will appear here": "Cărțile tale vor apărea aici",
|
||||
"Reading aloud continues in the background": "Citirea cu voce tare continuă în fundal",
|
||||
"Stopped reading aloud": "Citirea cu voce tare a fost oprită",
|
||||
"Read aloud stopped": "Citirea cu voce tare a fost oprită",
|
||||
"Cloud provider switched": "Furnizorul de cloud a fost schimbat",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Încărcările în Readest Cloud sunt suspendate cât timp este selectată sincronizarea {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Gestionat de {{provider}} cât timp este furnizorul tău de sincronizare cloud",
|
||||
"Not signed in": "Neautentificat",
|
||||
"Paused — plan required": "Suspendat — este necesar un abonament",
|
||||
"Active · Book file uploads off": "Activ · Încărcarea fișierelor de carte este oprită",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Setările aplicației, statisticile de citire și dicționarele continuă să se sincronizeze prin contul tău Readest cât timp ești autentificat.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu Readest Cloud.",
|
||||
"Account and Storage": "Cont și stocare",
|
||||
"Manage your plan and stored files": "Gestionează-ți abonamentul și fișierele stocate",
|
||||
"Cloud sync provider": "Furnizor de sincronizare cloud",
|
||||
"Use Readest Cloud": "Folosește Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Un alt dispozitiv încă sincronizează această bibliotecă prin Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} încărcare eșuată: cotă de stocare insuficientă",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} încărcări eșuate: cotă de stocare insuficientă",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} de încărcări eșuate: cotă de stocare insuficientă",
|
||||
"Library sync via {{provider}}": "Sincronizarea bibliotecii prin {{provider}}",
|
||||
"Google Drive session expired": "Sesiunea Google Drive a expirat",
|
||||
"Cloud sync session expired": "Sesiunea de sincronizare în cloud a expirat",
|
||||
"Uploads book files to your other devices": "Încarcă fișierele cărților pe celelalte dispozitive ale tale",
|
||||
"Re-check every book instead of only changed ones": "Reverifică fiecare carte în loc de doar cele modificate",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucketul nu a fost găsit",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Regiune",
|
||||
"Access Key ID": "ID cheie de acces",
|
||||
"Your Access Key ID": "ID-ul cheii tale de acces",
|
||||
"Secret Access Key": "Cheie de acces secretă",
|
||||
"Your Secret Access Key": "Cheia ta de acces secretă",
|
||||
"S3-Compatible Storage": "Stocare compatibilă S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sincronizează-ți biblioteca, progresul de citire și evidențierile cu un bucket compatibil S3, precum Cloudflare R2, AWS S3 sau MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "În browser, politica CORS a bucketului trebuie să permită originea acestui site.",
|
||||
"Use S3": "Folosește S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Înainte de conectare, asigură-te că bucketul există și că datele de autentificare au acces de citire/scriere.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Cât timp {{provider}} este selectat, cărțile, progresul și adnotările se sincronizează doar cu serverul tău.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Cât timp {{provider}} este selectat, cărțile, progresul și adnotările se sincronizează doar cu Drive-ul tău.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Cât timp {{provider}} este selectat, cărțile, progresul și adnotările se sincronizează doar cu bucketul tău.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Stocare S3",
|
||||
"Speed": "Viteză",
|
||||
"{{time}} left in chapter": "{{time}} rămas în capitol",
|
||||
"Open Read Aloud player": "Deschide playerul de citire cu voce tare",
|
||||
"Read Aloud": "Citire cu voce tare",
|
||||
"Voice": "Voce",
|
||||
"Sleep Timer": "Temporizator de somn",
|
||||
"Slower": "Mai lent",
|
||||
"Faster": "Mai rapid",
|
||||
"Exit Auto Scroll": "Ieșire din derularea automată",
|
||||
"Auto Scroll": "Derulare automată",
|
||||
"End of book": "Sfârșitul cărții",
|
||||
"Toggle Auto Scroll": "Comută derularea automată"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Редактировать",
|
||||
"Excerpts": "Отрывки",
|
||||
"Failed to import book(s): {{filenames}}": "Не удалось импортировать книгу(и): {{filenames}}",
|
||||
"Fast": "Быстро",
|
||||
"Font": "Шрифт",
|
||||
"Font & Layout": "Шрифт и макет",
|
||||
"Font Face": "Начертание шрифта",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Вход выполнен как {{userDisplayName}}",
|
||||
"Match Case": "Учитывать регистр",
|
||||
"Match Diacritics": "Учитывать диакритические знаки",
|
||||
"Match Whole Words": "Только целые слова",
|
||||
"Maximum Number of Columns": "Максимальное количество колонок",
|
||||
"Minimum Font Size": "Минимальный размер шрифта",
|
||||
"Monospace Font": "Моноширинный шрифт",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Войти",
|
||||
"Sign Out": "Выйти",
|
||||
"Sky": "Небесный",
|
||||
"Slow": "Медленно",
|
||||
"Solarized": "Солнечный",
|
||||
"Speak": "Произнести",
|
||||
"Subjects": "Темы",
|
||||
@@ -590,9 +587,6 @@
|
||||
"Start Migration": "Начать миграцию",
|
||||
"Advanced Settings": "Расширенные настройки",
|
||||
"File count: {{size}}": "Количество файлов: {{size}}",
|
||||
"Background Read Aloud": "Озвучивание в фоне",
|
||||
"Ready to read aloud": "Готов к чтению вслух",
|
||||
"Read Aloud": "Читать вслух",
|
||||
"Screen Brightness": "Яркость экрана",
|
||||
"Background Image": "Фоновое изображение",
|
||||
"Import Image": "Импортировать изображение",
|
||||
@@ -902,7 +896,6 @@
|
||||
"Export": "Экспортировать",
|
||||
"Set Timeout": "Установить тайм-аут",
|
||||
"Select Voice": "Выбрать голос",
|
||||
"Toggle Sticky Bottom TTS Bar": "Переключить закреплённую панель TTS",
|
||||
"Display what I'm reading on Discord": "Показывать книгу в Discord",
|
||||
"Show on Discord": "Показать в Discord",
|
||||
"Instant {{action}}": "Мгновенное {{action}}",
|
||||
@@ -1589,14 +1582,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Аутентификация WebDAV не удалась. Подключитесь заново в настройках.",
|
||||
"Downloading": "Загрузка",
|
||||
"Uploading": "Отправка",
|
||||
"downloaded {{n}} book(s)": "загружено {{n}} книг",
|
||||
"pushed {{n}} config(s)": "отправлено {{n}} конфигураций",
|
||||
"uploaded {{n}} new file(s)": "отправлено {{n}} новых файлов",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Синхронизация завершена с {{failed}} ошибками. {{ok}} ок.",
|
||||
"Sync complete": "Синхронизация завершена",
|
||||
"Everything is already up to date.": "Всё уже актуально.",
|
||||
"Browsing {{path}} on {{server}}": "Просмотр {{path}} на {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Подключитесь к серверу WebDAV, чтобы просматривать удалённые файлы.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Отправить файлы книг",
|
||||
"Sync now": "Синхронизировать сейчас",
|
||||
@@ -1604,33 +1590,8 @@
|
||||
"Show password": "Показать пароль",
|
||||
"Root Directory": "Корневой каталог",
|
||||
"Syncing…": "Синхронизация…",
|
||||
"pulled progress for {{n}} book(s)": "получен прогресс для {{n}} книг",
|
||||
"Sync History": "История синхронизации",
|
||||
"Clear Sync History": "Очистить историю синхронизации",
|
||||
"No manual syncs yet": "Ручных синхронизаций пока нет",
|
||||
"Partial": "Частично",
|
||||
"Cleanup": "Очистка",
|
||||
"Cleanup failed": "Очистка не удалась",
|
||||
"Sync failed": "Синхронизация не удалась",
|
||||
"{{n}} deleted": "{{n}} удалено",
|
||||
"{{n}} failed": "{{n}} с ошибкой",
|
||||
"Nothing deleted": "Ничего не удалено",
|
||||
"{{n}} downloaded": "{{n}} загружено",
|
||||
"{{n}} uploaded": "{{n}} отправлено",
|
||||
"{{n}} progress": "{{n}} прогресса",
|
||||
"Up to date": "Актуально",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Загруженные книги",
|
||||
"Files uploaded": "Отправленные файлы",
|
||||
"Configs uploaded": "Отправленные конфигурации",
|
||||
"Configs downloaded": "Загруженные конфигурации",
|
||||
"Covers uploaded": "Отправленные обложки",
|
||||
"Books deleted": "Удалённые книги",
|
||||
"Files in sync": "Синхронизированные файлы",
|
||||
"Failures": "Ошибки",
|
||||
"Total books": "Всего книг",
|
||||
"Error:": "Ошибка:",
|
||||
"Failed books": "Книги с ошибкой",
|
||||
"Deleted {{n}} book(s) from server.": "Удалено {{n}} книг с сервера.",
|
||||
"Failed to load directory": "Не удалось загрузить папку",
|
||||
"File download is only supported on the desktop and mobile apps.": "Загрузка файлов поддерживается только в настольных и мобильных приложениях.",
|
||||
@@ -1660,10 +1621,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Установите браузерное расширение Readest, чтобы отправлять читаемые статьи в библиотеку. Расширение вырезает страницу из браузера, поэтому работают даже сайты по подписке и сайты, требующие входа.",
|
||||
"Added to your library. It will sync to your other devices.": "Добавлено в вашу библиотеку. Синхронизируется с другими устройствами.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Парольная фраза синхронизации забыта. Все зашифрованные поля очищены.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Только ручные синхронизации и очистки. Автоматические синхронизации во время чтения здесь не отображаются.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Удалить {{n}} книг с сервера WebDAV?\n\nЭто удалит только удалённые файлы; ваша локальная библиотека не пострадает. Удаление невозможно отменить. Данные на сервере исчезнут навсегда.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Загружает файлы книг на ваши другие устройства.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Неверная парольная фраза синхронизации. Не удалось расшифровать синхронизированные данные.",
|
||||
"Email books straight to your library": "Отправляйте книги по электронной почте прямо в библиотеку",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Пересылайте вложения и статьи на ваш личный адрес Readest. Доступно в тарифах Plus, Pro и Lifetime.",
|
||||
@@ -1858,9 +1817,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Также удаляет прогресс чтения, заметки и закладки.",
|
||||
"Background Image (Library)": "Фоновое изображение (Библиотека)",
|
||||
"Background Image (Reader)": "Фоновое изображение (Режим чтения)",
|
||||
"updated metadata for {{n}} book(s)": "обновлены метаданные для {{n}} книг",
|
||||
"{{n}} metadata": "{{n}} метаданные",
|
||||
"Metadata updated": "Метаданные обновлены",
|
||||
"Filter": "Фильтр",
|
||||
"Sort by": "Сортировать по",
|
||||
"Date modified": "Дата изменения",
|
||||
@@ -1875,5 +1831,119 @@
|
||||
"Granularity": "Детализация",
|
||||
"Refresh Page": "Обновить страницу",
|
||||
"Recently read": "Недавно прочитанные",
|
||||
"Show recently read": "Показывать недавно прочитанные"
|
||||
"Show recently read": "Показывать недавно прочитанные",
|
||||
"Find:": "Найти:",
|
||||
"Enable rule": "Включить правило",
|
||||
"Disable rule": "Отключить правило",
|
||||
"Progress Read": "Прогресс чтения",
|
||||
"Auto-import new books from this folder": "Автоматический импорт новых книг из этой папки",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Когда в эту папку добавляются новые книги, они будут автоматически импортированы при следующем запуске Readest или его возвращении на передний план.",
|
||||
"Reading aloud": "Чтение вслух",
|
||||
"Open Book": "Открыть книгу",
|
||||
"Stop reading aloud": "Остановить чтение вслух",
|
||||
"Enter at least two words": "Введите не менее двух слов",
|
||||
"Search failed": "Не удалось выполнить поиск",
|
||||
"Search with regex": "Поиск по регулярному выражению",
|
||||
"Words to find near each other": "Слова, которые нужно найти рядом",
|
||||
"Contains": "Содержит",
|
||||
"Whole Words": "Целые слова",
|
||||
"Regular Expression": "Регулярное выражение",
|
||||
"Nearby Words": "Слова рядом",
|
||||
"Within N words": "В пределах N слов",
|
||||
"Not for regex": "Не для регулярных выражений",
|
||||
"No results found": "Ничего не найдено",
|
||||
"{{count}} results_one": "{{count}} результат",
|
||||
"{{count}} results_few": "{{count}} результата",
|
||||
"{{count}} results_many": "{{count}} результатов",
|
||||
"{{count}} results_other": "{{count}} результата",
|
||||
"Failed to seek": "Не удалось перемотать",
|
||||
"Chapter progress": "Прогресс главы",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} из {{total}}",
|
||||
"Decrease Contrast": "Уменьшить контраст",
|
||||
"Reset Contrast": "Сбросить контраст",
|
||||
"Increase Contrast": "Увеличить контраст",
|
||||
"Push": "Сдвиг",
|
||||
"Slide": "Скольжение",
|
||||
"Page Curl": "Загиб страницы",
|
||||
"Animation Style": "Стиль анимации",
|
||||
"Appearance": "Внешний вид",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Задаёт размер текста результатов словаря независимо от области чтения.",
|
||||
"Authentication failed. Reconnect in Settings.": "Ошибка аутентификации. Переподключитесь в настройках.",
|
||||
"Full Sync": "Полная синхронизация",
|
||||
"Waiting for sign-in…": "Ожидание входа…",
|
||||
"Reconnect": "Переподключиться",
|
||||
"Connected as {{account}}": "Подключено как {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Сделать Google Drive активным облачным провайдером.",
|
||||
"Use Google Drive": "Использовать Google Drive",
|
||||
"Sign-in opens in your browser.": "Вход откроется в вашем браузере.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest получает доступ только к тем файлам, которые сам создаёт на вашем Google Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с сервером WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с вашим Google Drive.",
|
||||
"Configured": "Настроено",
|
||||
"Use WebDAV": "Использовать WebDAV",
|
||||
"Cloud Sync": "Облачная синхронизация",
|
||||
"Extra Large": "Очень большой",
|
||||
"Hint size": "Размер подсказки",
|
||||
"Gloss text size above the word": "Размер текста подсказки над словом",
|
||||
"Hint color": "Цвет подсказки",
|
||||
"Adjust Text Selection": "Настройка выделения текста",
|
||||
"Your books will appear here": "Здесь появятся ваши книги",
|
||||
"Reading aloud continues in the background": "Чтение вслух продолжается в фоновом режиме",
|
||||
"Stopped reading aloud": "Чтение вслух остановлено",
|
||||
"Read aloud stopped": "Озвучивание остановлено",
|
||||
"Cloud provider switched": "Облачный провайдер изменён",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Загрузки в Readest Cloud приостановлены, пока выбрана синхронизация {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Управляется {{provider}}, пока это ваш провайдер облачной синхронизации",
|
||||
"Not signed in": "Вход не выполнен",
|
||||
"Paused — plan required": "Приостановлено — требуется тарифный план",
|
||||
"Active · Book file uploads off": "Активно · Загрузка файлов книг выключена",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Настройки приложения, статистика чтения и словари продолжают синхронизироваться через ваш аккаунт Readest, пока вы вошли в систему.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с Readest Cloud.",
|
||||
"Account and Storage": "Аккаунт и хранилище",
|
||||
"Manage your plan and stored files": "Управляйте тарифом и сохранёнными файлами",
|
||||
"Cloud sync provider": "Провайдер облачной синхронизации",
|
||||
"Use Readest Cloud": "Использовать Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Другое устройство всё ещё синхронизирует эту библиотеку через Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} загрузка не удалась: недостаточно квоты хранилища",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} загрузки не удались: недостаточно квоты хранилища",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} загрузок не удалось: недостаточно квоты хранилища",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} загрузки не удалось: недостаточно квоты хранилища",
|
||||
"Library sync via {{provider}}": "Синхронизация библиотеки через {{provider}}",
|
||||
"Google Drive session expired": "Сеанс Google Drive истёк",
|
||||
"Cloud sync session expired": "Сеанс облачной синхронизации истёк",
|
||||
"Uploads book files to your other devices": "Загружает файлы книг на другие ваши устройства",
|
||||
"Re-check every book instead of only changed ones": "Повторно проверять каждую книгу, а не только изменённые",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Бакет не найден",
|
||||
"Endpoint": "Конечная точка",
|
||||
"Bucket": "Бакет",
|
||||
"Region": "Регион",
|
||||
"Access Key ID": "ID ключа доступа",
|
||||
"Your Access Key ID": "Ваш ID ключа доступа",
|
||||
"Secret Access Key": "Секретный ключ доступа",
|
||||
"Your Secret Access Key": "Ваш секретный ключ доступа",
|
||||
"S3-Compatible Storage": "S3-совместимое хранилище",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Синхронизируйте библиотеку, прогресс чтения и выделения с S3-совместимым бакетом, например Cloudflare R2, AWS S3 или MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "В браузере политика CORS бакета должна разрешать источник этого сайта.",
|
||||
"Use S3": "Использовать S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Перед подключением убедитесь, что бакет существует, а учётные данные имеют доступ на чтение и запись.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Пока выбран {{provider}}, книги, прогресс и аннотации синхронизируются только с вашим сервером.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Пока выбран {{provider}}, книги, прогресс и аннотации синхронизируются только с вашим Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Пока выбран {{provider}}, книги, прогресс и аннотации синхронизируются только с вашим бакетом.",
|
||||
"Premium": "Премиум",
|
||||
"S3 Storage": "Хранилище S3",
|
||||
"Speed": "Скорость",
|
||||
"{{time}} left in chapter": "Осталось {{time}} в главе",
|
||||
"Open Read Aloud player": "Открыть плеер чтения вслух",
|
||||
"Read Aloud": "Чтение вслух",
|
||||
"Voice": "Голос",
|
||||
"Sleep Timer": "Таймер сна",
|
||||
"Slower": "Медленнее",
|
||||
"Faster": "Быстрее",
|
||||
"Exit Auto Scroll": "Выйти из автопрокрутки",
|
||||
"Auto Scroll": "Автопрокрутка",
|
||||
"End of book": "Конец книги",
|
||||
"Toggle Auto Scroll": "Переключить автопрокрутку"
|
||||
}
|
||||
|
||||
@@ -308,7 +308,6 @@
|
||||
"Book": "පොත",
|
||||
"Chapter": "පරිච්ඡේදය",
|
||||
"Match Case": "අකුරු ගැළපීම",
|
||||
"Match Whole Words": "සම්පූර්ණ වචන ගැළපීම",
|
||||
"Match Diacritics": "ධ්වනි ලකුණු ගැළපීම",
|
||||
"TOC": "සූචිය",
|
||||
"Table of Contents": "සූචිය",
|
||||
@@ -321,8 +320,6 @@
|
||||
"{{value}} hour": "පැය {{value}}",
|
||||
"{{value}} hours": "පැය {{value}}",
|
||||
"Voices for {{lang}}": "{{lang}} සඳහා හඬ",
|
||||
"Slow": "මන්දගාමී",
|
||||
"Fast": "වේගවත්",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: හඬ 1",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: හඬ {{count}}",
|
||||
"Sign in to Sync": "සමමුහුර්ත කිරීම සඳහා ඇතුල් වන්න",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "මැතිවරණය ආරම්භ කරන්න",
|
||||
"Advanced Settings": "උසස් සැකසුම්",
|
||||
"File count: {{size}}": "ගොනු ගණන: {{size}}",
|
||||
"Background Read Aloud": "පසුබිම් පවසා කියවීම",
|
||||
"Ready to read aloud": "වාදනය කිරීමට සූදානම්",
|
||||
"Read Aloud": "පවසා කියවීම",
|
||||
"Screen Brightness": "තිරයේ දිදුලනුම",
|
||||
"Background Image": "පසුබිම් රූපය",
|
||||
"Import Image": "රූපය ආයාත කරන්න",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "අපනයනය කරන්න",
|
||||
"Set Timeout": "කාල සීමාව සකසන්න",
|
||||
"Select Voice": "හඬ තෝරන්න",
|
||||
"Toggle Sticky Bottom TTS Bar": "ඇලවූ TTS තීරුව මාරු කරන්න",
|
||||
"Display what I'm reading on Discord": "Discord හි කියවන පොත පෙන්වන්න",
|
||||
"Show on Discord": "Discord හි පෙන්වන්න",
|
||||
"Instant {{action}}": "ක්ෂණික {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV සත්යාපනය අසාර්ථකයි. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
|
||||
"Downloading": "බාගත වෙමින්",
|
||||
"Uploading": "උඩුගත වෙමින්",
|
||||
"downloaded {{n}} book(s)": "පොත් {{n}} බාගත කළා",
|
||||
"pushed {{n}} config(s)": "වින්යාසයන් {{n}}ක් යවන ලදී",
|
||||
"uploaded {{n}} new file(s)": "නව ගොනු {{n}}ක් උඩුගත කළා",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "සමමුහුර්තකරණය අසාර්ථකතා {{failed}}ක් සමඟ අවසන් විය. {{ok}} සාර්ථකයි.",
|
||||
"Sync complete": "සමමුහුර්තකරණය සම්පූර්ණයි",
|
||||
"Everything is already up to date.": "සියල්ල දැනටමත් යාවත්කාලීනයි.",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} මත {{path}} බ්රවුස් කරමින්",
|
||||
"Connect to a WebDAV server to browse your remote files.": "ඔබේ දුරස්ථ ගොනු බ්රවුස් කිරීමට WebDAV සේවාදායකයකට සම්බන්ධ වන්න.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "පොත් ගොනු උඩුගත කරන්න",
|
||||
"Sync now": "දැන් සමමුහුර්ත කරන්න",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "මුරපදය පෙන්වන්න",
|
||||
"Root Directory": "මූල නාමාවලිය",
|
||||
"Syncing…": "සමමුහුර්ත කරමින්…",
|
||||
"pulled progress for {{n}} book(s)": "පොත් {{n}}ක ප්රගතිය ලබා ගත්තා",
|
||||
"Sync History": "සමමුහුර්ත ඉතිහාසය",
|
||||
"Clear Sync History": "සමමුහුර්ත ඉතිහාසය හිස් කරන්න",
|
||||
"No manual syncs yet": "තවම අතින් සමමුහුර්තකරණ නැත",
|
||||
"Partial": "අර්ධ",
|
||||
"Cleanup": "පිරිසිදු කිරීම",
|
||||
"Cleanup failed": "පිරිසිදු කිරීම අසාර්ථකයි",
|
||||
"Sync failed": "සමමුහුර්තකරණය අසාර්ථකයි",
|
||||
"{{n}} deleted": "{{n}} මකා දැමුවා",
|
||||
"{{n}} failed": "{{n}} අසාර්ථකයි",
|
||||
"Nothing deleted": "කිසිවක් මකා නැත",
|
||||
"{{n}} downloaded": "{{n}} බාගත කළා",
|
||||
"{{n}} uploaded": "{{n}} උඩුගත කළා",
|
||||
"{{n}} progress": "{{n}} ප්රගතිය",
|
||||
"Up to date": "යාවත්කාලීනයි",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "බාගත කළ පොත්",
|
||||
"Files uploaded": "උඩුගත කළ ගොනු",
|
||||
"Configs uploaded": "උඩුගත කළ වින්යාසයන්",
|
||||
"Configs downloaded": "බාගත කළ වින්යාසයන්",
|
||||
"Covers uploaded": "උඩුගත කළ කවර",
|
||||
"Books deleted": "මකා දැමූ පොත්",
|
||||
"Files in sync": "සමමුහුර්ත ගොනු",
|
||||
"Failures": "අසාර්ථකතා",
|
||||
"Total books": "සම්පූර්ණ පොත්",
|
||||
"Error:": "දෝෂය:",
|
||||
"Failed books": "අසාර්ථක පොත්",
|
||||
"Deleted {{n}} book(s) from server.": "සේවාදායකයෙන් පොත් {{n}} මකන ලදී.",
|
||||
"Failed to load directory": "නාමාවලිය පූරණය කිරීමට අසමත් විය",
|
||||
"File download is only supported on the desktop and mobile apps.": "ගොනු බාගත කිරීම සඳහා සහාය වන්නේ ඩෙස්ක්ටොප් සහ ජංගම යෙදුම්වල පමණි.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ඔබ කියවන ලිපිය ඔබේ පුස්තකාලයට යැවීමට Readest බ්රවුසර දිගුව ස්ථාපනය කරන්න. එය ඔබේ බ්රවුසරයේ සිට පිටුව කපා ගන්නා නිසා ගෙවීම් සහ පිවිසුම් අවශ්ය වෙබ් අඩවි ද ක්රියා කරයි.",
|
||||
"Added to your library. It will sync to your other devices.": "ඔබේ පුස්තකාලයට එක් කරන ලදී. එය ඔබේ අනෙකුත් උපාංගවලට සමමුහුර්ත වේ.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "සමමුහුර්ත මුරපදය අමතක කරන ලදී. සියලුම සංකේතාංකන ක්ෂේත්ර හිස් කරන ලදී.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "අතින් සමමුහුර්තකරණ සහ පිරිසිදු කිරීම් පමණක්. කියවීමේදී ස්වයංක්රීය සමමුහුර්තකරණ මෙහි සටහන් නොවේ.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV සේවාදායකයෙන් පොත් {{n}}ක් මකන්න ද?\n\nමෙය දුරස්ථ ගොනු පමණක් ඉවත් කරයි; ඔබේ දේශීය පුස්තකාලය බලපාන්නේ නැත. මැකීම අහෝසි කළ නොහැක. සේවාදායකයේ දත්ත සදහටම නැති වේ.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "පොත් ගොනු ඔබගේ අනෙක් උපාංගවලට උඩුගත කරයි.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "වැරදි සමමුහුර්ත මුරපදය. සමමුහුර්ත අක්තපත්ර විකේතනය කළ නොහැකි විය.",
|
||||
"Email books straight to your library": "ඊමේල් මගින් ඔබේ පුස්තකාලයට කෙලින්ම පොත් යවන්න",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "ඇමුණුම් සහ ලිපි ඔබේ පෞද්ගලික Readest ලිපිනය වෙත ඉදිරියට යවන්න. Plus, Pro සහ Lifetime සැලසුම් වල ලබා ගත හැක.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "කියවීමේ ප්රගතිය, සටහන් සහ පොත් සලකුණු ද මකා දමයි.",
|
||||
"Background Image (Library)": "පසුබිම් රූපය (පුස්තකාලය)",
|
||||
"Background Image (Reader)": "පසුබිම් රූපය (කියවීමේ දසුන)",
|
||||
"updated metadata for {{n}} book(s)": "පොත් {{n}}ක මෙටාඩේටා යාවත්කාලීන කරන ලදී",
|
||||
"{{n}} metadata": "{{n}} මෙටාඩේටා",
|
||||
"Metadata updated": "මෙටාඩේටා යාවත්කාලීන කරන ලදී",
|
||||
"Filter": "පෙරහන",
|
||||
"Sort by": "අනුව සකසන්න",
|
||||
"Date modified": "වෙනස් කළ දිනය",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "විස්තර මට්ටම",
|
||||
"Refresh Page": "පිටුව නැවුම් කරන්න",
|
||||
"Recently read": "මෑතකදී කියවූ",
|
||||
"Show recently read": "මෑතකදී කියවූ ඒවා පෙන්වන්න"
|
||||
"Show recently read": "මෑතකදී කියවූ ඒවා පෙන්වන්න",
|
||||
"Find:": "සොයන්න:",
|
||||
"Enable rule": "නියමය සක්රීය කරන්න",
|
||||
"Disable rule": "නියමය අක්රීය කරන්න",
|
||||
"Progress Read": "කියවීමේ ප්රගතිය",
|
||||
"Auto-import new books from this folder": "මෙම ෆෝල්ඩරයෙන් නව පොත් ස්වයංක්රීයව ආයාත කරන්න",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "මෙම ෆෝල්ඩරයට නව පොත් එකතු වූ විට, ඊළඟ වතාවේ Readest විවෘත වන විට හෝ ඉදිරිපසට නැවත පැමිණෙන විට ඒවා ස්වයංක්රීයව ආයාත කෙරේ.",
|
||||
"Reading aloud": "පවසා කියවමින්",
|
||||
"Open Book": "පොත විවෘත කරන්න",
|
||||
"Stop reading aloud": "පවසා කියවීම නවත්වන්න",
|
||||
"Enter at least two words": "අවම වශයෙන් වචන දෙකක් ඇතුළත් කරන්න",
|
||||
"Search failed": "සෙවීම අසාර්ථක විය",
|
||||
"Search with regex": "regex සමඟ සොයන්න",
|
||||
"Words to find near each other": "එකිනෙකට ආසන්නව සෙවීමට වචන",
|
||||
"Contains": "අඩංගු වේ",
|
||||
"Whole Words": "සම්පූර්ණ වචන",
|
||||
"Regular Expression": "Regular Expression",
|
||||
"Nearby Words": "ආසන්න වචන",
|
||||
"Within N words": "වචන N ක් තුළ",
|
||||
"Not for regex": "regex සඳහා නොවේ",
|
||||
"No results found": "ප්රතිඵල හමු නොවීය",
|
||||
"{{count}} results_one": "ප්රතිඵල {{count}}ක්",
|
||||
"{{count}} results_other": "ප්රතිඵල {{count}}ක්",
|
||||
"Failed to seek": "ස්ථානය වෙනස් කිරීමට නොහැකි විය",
|
||||
"Chapter progress": "පරිච්ඡේද ප්රගතිය",
|
||||
"{{elapsed}} of {{total}}": "{{total}} න් {{elapsed}}",
|
||||
"Decrease Contrast": "පරස්පරය අඩු කරන්න",
|
||||
"Reset Contrast": "පරස්පරය යළි සකසන්න",
|
||||
"Increase Contrast": "පරස්පරය වැඩි කරන්න",
|
||||
"Push": "තල්ලුව",
|
||||
"Slide": "ලිස්සීම",
|
||||
"Page Curl": "පිටු නැමීම",
|
||||
"Animation Style": "සජීවිකරණ විලාසය",
|
||||
"Appearance": "පෙනුම",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "කියවීමේ දසුනෙන් ස්වාධීනව ශබ්දකෝෂ ප්රතිඵලවල අකුරු ප්රමාණය සකසයි.",
|
||||
"Authentication failed. Reconnect in Settings.": "සත්යාපනය අසාර්ථක විය. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.",
|
||||
"Full Sync": "සම්පූර්ණ සමමුහුර්තය",
|
||||
"Waiting for sign-in…": "ඇතුල් වීම සඳහා රැඳී සිටිමින්…",
|
||||
"Reconnect": "නැවත සම්බන්ධ වන්න",
|
||||
"Connected as {{account}}": "{{account}} ලෙස සම්බන්ධ වී ඇත",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive සක්රිය cloud සපයන්නා ලෙස සකසන්න.",
|
||||
"Use Google Drive": "Google Drive භාවිතා කරන්න",
|
||||
"Sign-in opens in your browser.": "ඇතුල් වීම ඔබේ බ්රව්සරයේ විවෘත වේ.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest ප්රවේශ වන්නේ ඔබේ Drive හි එය සාදන ගොනුවලට පමණි.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "ඔබේ පුස්තකාලය, කියවීමේ ප්රගතිය සහ ඉස්මතු කිරීම් WebDAV සේවාදායකයක් සමඟ සමමුහුර්ත කරන්න.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "ඔබේ පුස්තකාලය, කියවීමේ ප්රගතිය සහ ඉස්මතු කිරීම් ඔබේ Google Drive සමඟ සමමුහුර්ත කරන්න.",
|
||||
"Configured": "වින්යාස කර ඇත",
|
||||
"Use WebDAV": "WebDAV භාවිතා කරන්න",
|
||||
"Cloud Sync": "Cloud සමමුහුර්තය",
|
||||
"Extra Large": "ඉතා විශාල",
|
||||
"Hint size": "ඉඟි ප්රමාණය",
|
||||
"Gloss text size above the word": "වචනයට ඉහළින් ඇති ඉඟි අකුරු ප්රමාණය",
|
||||
"Hint color": "ඉඟි වර්ණය",
|
||||
"Adjust Text Selection": "පෙළ තේරීම ගලපන්න",
|
||||
"Your books will appear here": "ඔබේ පොත් මෙහි දිස්වනු ඇත",
|
||||
"Reading aloud continues in the background": "පවසා කියවීම පසුබිමේ දිගටම සිදු වේ",
|
||||
"Stopped reading aloud": "පවසා කියවීම නවත්වන ලදී",
|
||||
"Read aloud stopped": "පවසා කියවීම නතර විය",
|
||||
"Cloud provider switched": "වලාකුළු සැපයුම්කරු වෙනස් විය",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} සමමුහුර්තකරණය තෝරා ඇති අතරතුර Readest Cloud වෙත උඩුගත කිරීම් නවතා ඇත",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} ඔබේ වලාකුළු සමමුහුර්ත සැපයුම්කරු ලෙස පවතින අතරතුර එය මගින් කළමනාකරණය වේ",
|
||||
"Not signed in": "පුරනය වී නැත",
|
||||
"Paused — plan required": "නවතා ඇත — සැලසුමක් අවශ්යයි",
|
||||
"Active · Book file uploads off": "සක්රීය · පොත් ගොනු උඩුගත කිරීම අක්රීයයි",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "පුරනය වී සිටින අතරතුර යෙදුම් සැකසුම්, කියවීම් සංඛ්යාලේඛන සහ ශබ්දකෝෂ ඔබේ Readest ගිණුම හරහා දිගටම සමමුහුර්ත වේ.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "ඔබේ පුස්තකාලය, කියවීමේ ප්රගතිය සහ ඉස්මතු කිරීම් Readest Cloud සමඟ සමමුහුර්ත කරන්න.",
|
||||
"Account and Storage": "ගිණුම සහ ගබඩාව",
|
||||
"Manage your plan and stored files": "ඔබේ සැලසුම සහ ගබඩා කළ ගොනු කළමනාකරණය කරන්න",
|
||||
"Cloud sync provider": "වලාකුළු සමමුහුර්ත සැපයුම්කරු",
|
||||
"Use Readest Cloud": "Readest Cloud භාවිතා කරන්න",
|
||||
"Another device is still syncing this library via Readest Cloud": "තවත් උපාංගයක් තවමත් Readest Cloud හරහා මෙම පුස්තකාලය සමමුහුර්ත කරයි",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "උඩුගත කිරීම් {{count}}ක් අසාර්ථකයි: ප්රමාණවත් නොවන ගබඩා ප්රමාණය",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "උඩුගත කිරීම් {{count}}ක් අසාර්ථකයි: ප්රමාණවත් නොවන ගබඩා ප්රමාණය",
|
||||
"Library sync via {{provider}}": "{{provider}} හරහා පුස්තකාල සමමුහූර්තකරණය",
|
||||
"Google Drive session expired": "Google Drive සැසිය කල් ඉකුත් වී ඇත",
|
||||
"Cloud sync session expired": "වලාකුළු සමමුහූර්ත සැසිය කල් ඉකුත් වී ඇත",
|
||||
"Uploads book files to your other devices": "පොත් ගොනු ඔබගේ අනෙක් උපාංගවලට උඩුගත කරයි",
|
||||
"Re-check every book instead of only changed ones": "වෙනස් වූ ඒවා පමණක් නොව සෑම පොතක්ම නැවත පරීක්ෂා කරන්න",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "බකට් හමු නොවීය",
|
||||
"Endpoint": "එන්ඩ්පොයින්ට්",
|
||||
"Bucket": "බකට්",
|
||||
"Region": "කලාපය",
|
||||
"Access Key ID": "ප්රවේශ යතුරු ID",
|
||||
"Your Access Key ID": "ඔබගේ ප්රවේශ යතුරු ID",
|
||||
"Secret Access Key": "රහස් ප්රවේශ යතුර",
|
||||
"Your Secret Access Key": "ඔබගේ රහස් ප්රවේශ යතුර",
|
||||
"S3-Compatible Storage": "S3-ගැළපෙන ගබඩාව",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2, AWS S3 හෝ MinIO වැනි S3-ගැළපෙන බකට් එකක් සමඟ ඔබේ පුස්තකාලය, කියවීමේ ප්රගතිය සහ ඉස්මතු කිරීම් සමමුහුර්ත කරන්න.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "බ්රවුසරයේදී, බකට් එකේ CORS ප්රතිපත්තිය මෙම අඩවියේ origin ට ඉඩ දිය යුතුය.",
|
||||
"Use S3": "S3 භාවිතා කරන්න",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "සම්බන්ධ වීමට පෙර බකට් එක පවතින බවත්, අක්තපත්රවලට කියවීමේ/ලිවීමේ ප්රවේශය ඇති බවත් තහවුරු කරගන්න.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} තෝරා ඇති විට, පොත්, ප්රගතිය සහ සටහන් ඔබේ සේවාදායකයට පමණක් සමමුහුර්ත වේ.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} තෝරා ඇති විට, පොත්, ප්රගතිය සහ සටහන් ඔබේ Drive වෙත පමණක් සමමුහුර්ත වේ.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} තෝරා ඇති විට, පොත්, ප්රගතිය සහ සටහන් ඔබේ බකට් එකට පමණක් සමමුහුර්ත වේ.",
|
||||
"Premium": "ප්රිමියම්",
|
||||
"S3 Storage": "S3 ගබඩාව",
|
||||
"Speed": "වේගය",
|
||||
"{{time}} left in chapter": "පරිච්ඡේදයේ {{time}} ඉතිරිය",
|
||||
"Open Read Aloud player": "ශබ්ද නඟා කියවීමේ ධාවකය විවෘත කරන්න",
|
||||
"Read Aloud": "ශබ්ද නඟා කියවීම",
|
||||
"Voice": "හඬ",
|
||||
"Sleep Timer": "නින්ද කාල ගණකය",
|
||||
"Slower": "මන්දගාමී",
|
||||
"Faster": "වේගවත්",
|
||||
"Exit Auto Scroll": "ස්වයංක්රීය අනුචලනයෙන් පිටවන්න",
|
||||
"Auto Scroll": "ස්වයංක්රීය අනුචලනය",
|
||||
"End of book": "පොතේ අවසානය",
|
||||
"Toggle Auto Scroll": "ස්වයංක්රීය අනුචලනය මාරු කරන්න"
|
||||
}
|
||||
|
||||
@@ -147,7 +147,6 @@
|
||||
"Always on Top": "Vedno na vrhu",
|
||||
"Always Show Status Bar": "Vedno prikaži vrstico stanja",
|
||||
"Keep Screen Awake": "Prepreči spanje zaslona",
|
||||
"Background Read Aloud": "Branje na glas v ozadju",
|
||||
"Reload Page": "Ponovno naloži stran",
|
||||
"Settings": "Nastavitve",
|
||||
"Advanced Settings": "Napredne nastavitve",
|
||||
@@ -571,7 +570,6 @@
|
||||
"Clear search history": "Počisti zgodovino iskanja",
|
||||
"Chapter": "Poglavje",
|
||||
"Match Case": "Razlikuj velike/male črke",
|
||||
"Match Whole Words": "Ujemanje celih besed",
|
||||
"Match Diacritics": "Ujemanje diakritičnih znakov",
|
||||
"Search results for '{{term}}'": "Rezultati iskanja za '{{term}}'",
|
||||
"Previous Result": "Prejšnji rezultat",
|
||||
@@ -598,15 +596,12 @@
|
||||
"{{value}} hour": "{{value}} ura",
|
||||
"{{value}} hours": "{{value}} ur",
|
||||
"Voices for {{lang}}": "Glasovi za {{lang}}",
|
||||
"Slow": "Počasi",
|
||||
"Fast": "Hitro",
|
||||
"Set Timeout": "Nastavi časovno omejitev",
|
||||
"Select Voice": "Izberi glas",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} glas",
|
||||
"{{engine}}: {{count}} voices_two": "{{engine}}: {{count}} glasova",
|
||||
"{{engine}}: {{count}} voices_few": "{{engine}}: {{count}} glasovi",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} glasov",
|
||||
"Toggle Sticky Bottom TTS Bar": "Preklopi fiksno spodnjo TTS vrstico",
|
||||
"Zoom Level": "Raven povečave",
|
||||
"Zoom Out": "Pomanjšaj",
|
||||
"Reset Zoom": "Ponastavi povečavo",
|
||||
@@ -634,8 +629,6 @@
|
||||
"Translating...": "Prevajanje...",
|
||||
"Please log in to use advanced TTS features": "Prosimo, prijavite se za uporabo naprednih TTS funkcij",
|
||||
"TTS not supported for this document": "TTS ni podprt za ta dokument",
|
||||
"Read Aloud": "Branje na glas",
|
||||
"Ready to read aloud": "Pripravljeno na branje na glas",
|
||||
"Delete Your Account?": "Izbrišem vaš račun?",
|
||||
"This action cannot be undone. All your data in the cloud will be permanently deleted.": "Tega dejanja ni mogoče razveljaviti. Vsi vaši podatki v oblaku bodo trajno izbrisani.",
|
||||
"Delete Permanently": "Trajno izbriši",
|
||||
@@ -1589,14 +1582,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Overjanje WebDAV ni uspelo. Ponovno se povežite v Nastavitvah.",
|
||||
"Downloading": "Prenašanje",
|
||||
"Uploading": "Nalaganje",
|
||||
"downloaded {{n}} book(s)": "preneseno {{n}} knjig",
|
||||
"pushed {{n}} config(s)": "poslano {{n}} konfiguracij",
|
||||
"uploaded {{n}} new file(s)": "naloženo {{n}} novih datotek",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinhronizacija končana z {{failed}} napakami. {{ok}} ok.",
|
||||
"Sync complete": "Sinhronizacija končana",
|
||||
"Everything is already up to date.": "Vse je že posodobljeno.",
|
||||
"Browsing {{path}} on {{server}}": "Brskanje po {{path}} na {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Povežite se s strežnikom WebDAV za brskanje po oddaljenih datotekah.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Naloži datoteke knjig",
|
||||
"Sync now": "Sinhroniziraj zdaj",
|
||||
@@ -1604,33 +1590,8 @@
|
||||
"Show password": "Pokaži geslo",
|
||||
"Root Directory": "Korenska mapa",
|
||||
"Syncing…": "Sinhronizacija…",
|
||||
"pulled progress for {{n}} book(s)": "preneseno napredek za {{n}} knjig",
|
||||
"Sync History": "Zgodovina sinhronizacije",
|
||||
"Clear Sync History": "Počisti zgodovino sinhronizacije",
|
||||
"No manual syncs yet": "Še ni ročnih sinhronizacij",
|
||||
"Partial": "Delno",
|
||||
"Cleanup": "Čiščenje",
|
||||
"Cleanup failed": "Čiščenje ni uspelo",
|
||||
"Sync failed": "Sinhronizacija ni uspela",
|
||||
"{{n}} deleted": "{{n}} izbrisano",
|
||||
"{{n}} failed": "{{n}} neuspelo",
|
||||
"Nothing deleted": "Nič ni bilo izbrisano",
|
||||
"{{n}} downloaded": "{{n}} preneseno",
|
||||
"{{n}} uploaded": "{{n}} naloženo",
|
||||
"{{n}} progress": "{{n}} napredek",
|
||||
"Up to date": "Posodobljeno",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Prenesene knjige",
|
||||
"Files uploaded": "Naložene datoteke",
|
||||
"Configs uploaded": "Naložene konfiguracije",
|
||||
"Configs downloaded": "Prenesene konfiguracije",
|
||||
"Covers uploaded": "Naložene naslovnice",
|
||||
"Books deleted": "Izbrisane knjige",
|
||||
"Files in sync": "Sinhronizirane datoteke",
|
||||
"Failures": "Napake",
|
||||
"Total books": "Skupaj knjig",
|
||||
"Error:": "Napaka:",
|
||||
"Failed books": "Neuspele knjige",
|
||||
"Deleted {{n}} book(s) from server.": "Iz strežnika izbrisano {{n}} knjig.",
|
||||
"Failed to load directory": "Mape ni bilo mogoče naložiti",
|
||||
"File download is only supported on the desktop and mobile apps.": "Prenos datotek je podprt samo v namizni in mobilni aplikaciji.",
|
||||
@@ -1660,10 +1621,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Namestite razširitev brskalnika Readest, da članek, ki ga berete, pošljete v knjižnico. Razširitev izreže stran iz brskalnika, zato delujejo tudi plačljive in samo za prijavljene strani.",
|
||||
"Added to your library. It will sync to your other devices.": "Dodano v vašo knjižnico. Sinhronizirano bo z drugimi napravami.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Sinhronizacijska gesla pozabljena. Vsa šifrirana polja so počiščena.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Samo ročne sinhronizacije in čiščenja. Samodejne sinhronizacije med branjem se tu ne beležijo.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Izbrišem {{n}} knjig s strežnika WebDAV?\n\nTo odstrani samo oddaljene datoteke; vaša lokalna knjižnica ostane nedotaknjena. Izbrisa ni mogoče razveljaviti. Biti na strežniku bodo trajno izgubljeni.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Naloži datoteke knjig v vaše druge naprave.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Napačno geslo sinhronizacije. Sinhroniziranih poverilnic ni bilo mogoče dešifrirati.",
|
||||
"Email books straight to your library": "Knjige po e-pošti pošljite naravnost v knjižnico",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Posredujte priponke in članke na svoj zasebni Readest naslov. Na voljo v paketih Plus, Pro in Lifetime.",
|
||||
@@ -1858,9 +1817,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Izbriše tudi napredek branja, opombe in zaznamke.",
|
||||
"Background Image (Library)": "Slikovno ozadje (Knjižnica)",
|
||||
"Background Image (Reader)": "Slikovno ozadje (Bralni pogled)",
|
||||
"updated metadata for {{n}} book(s)": "posodobljeni metapodatki za {{n}} knjig",
|
||||
"{{n}} metadata": "{{n}} metapodatki",
|
||||
"Metadata updated": "Metapodatki posodobljeni",
|
||||
"Filter": "Filtriraj",
|
||||
"Sort by": "Razvrsti po",
|
||||
"Date modified": "Datum spremembe",
|
||||
@@ -1875,5 +1831,119 @@
|
||||
"Granularity": "Granularnost",
|
||||
"Refresh Page": "Osveži stran",
|
||||
"Recently read": "Nedavno prebrano",
|
||||
"Show recently read": "Pokaži nedavno prebrano"
|
||||
"Show recently read": "Pokaži nedavno prebrano",
|
||||
"Find:": "Najdi:",
|
||||
"Enable rule": "Omogoči pravilo",
|
||||
"Disable rule": "Onemogoči pravilo",
|
||||
"Progress Read": "Napredek branja",
|
||||
"Auto-import new books from this folder": "Samodejni uvoz novih knjig iz te mape",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Ko so v to mapo dodane nove knjige, bodo samodejno uvožene, ko se Readest naslednjič odpre ali vrne v ospredje.",
|
||||
"Reading aloud": "Branje na glas",
|
||||
"Open Book": "Odpri knjigo",
|
||||
"Stop reading aloud": "Ustavi branje na glas",
|
||||
"Enter at least two words": "Vnesite vsaj dve besedi",
|
||||
"Search failed": "Iskanje ni uspelo",
|
||||
"Search with regex": "Iskanje z regularnim izrazom",
|
||||
"Words to find near each other": "Besede, ki naj bodo blizu skupaj",
|
||||
"Contains": "Vsebuje",
|
||||
"Whole Words": "Cele besede",
|
||||
"Regular Expression": "Regularni izraz",
|
||||
"Nearby Words": "Bližnje besede",
|
||||
"Within N words": "Znotraj N besed",
|
||||
"Not for regex": "Ne velja za regularne izraze",
|
||||
"No results found": "Ni najdenih rezultatov",
|
||||
"{{count}} results_one": "{{count}} rezultat",
|
||||
"{{count}} results_two": "{{count}} rezultata",
|
||||
"{{count}} results_few": "{{count}} rezultati",
|
||||
"{{count}} results_other": "{{count}} rezultatov",
|
||||
"Failed to seek": "Premik ni uspel",
|
||||
"Chapter progress": "Napredek poglavja",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} od {{total}}",
|
||||
"Decrease Contrast": "Zmanjšaj kontrast",
|
||||
"Reset Contrast": "Ponastavi kontrast",
|
||||
"Increase Contrast": "Povečaj kontrast",
|
||||
"Push": "Potisk",
|
||||
"Slide": "Drsenje",
|
||||
"Page Curl": "Zvijanje strani",
|
||||
"Animation Style": "Slog animacije",
|
||||
"Appearance": "Videz",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Nastavi velikost besedila rezultatov slovarja, neodvisno od pogleda branja.",
|
||||
"Authentication failed. Reconnect in Settings.": "Preverjanje pristnosti ni uspelo. Znova se povežite v Nastavitvah.",
|
||||
"Full Sync": "Polna sinhronizacija",
|
||||
"Waiting for sign-in…": "Čakanje na prijavo…",
|
||||
"Reconnect": "Znova poveži",
|
||||
"Connected as {{account}}": "Povezano kot {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Nastavite Google Drive kot aktivnega ponudnika oblaka.",
|
||||
"Use Google Drive": "Uporabi Google Drive",
|
||||
"Sign-in opens in your browser.": "Prijava se odpre v vašem brskalniku.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest dostopa le do datotek, ki jih sam ustvari v vašem Google Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Sinhronizirajte knjižnico, napredek branja in označbe s strežnikom WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Sinhronizirajte knjižnico, napredek branja in označbe s svojim Google Drive.",
|
||||
"Configured": "Nastavljeno",
|
||||
"Use WebDAV": "Uporabi WebDAV",
|
||||
"Cloud Sync": "Sinhronizacija v oblaku",
|
||||
"Extra Large": "Zelo veliko",
|
||||
"Hint size": "Velikost namiga",
|
||||
"Gloss text size above the word": "Velikost besedila namiga nad besedo",
|
||||
"Hint color": "Barva namiga",
|
||||
"Adjust Text Selection": "Prilagodi izbiro besedila",
|
||||
"Your books will appear here": "Tukaj se bodo prikazale vaše knjige",
|
||||
"Reading aloud continues in the background": "Branje na glas se nadaljuje v ozadju",
|
||||
"Stopped reading aloud": "Branje na glas ustavljeno",
|
||||
"Read aloud stopped": "Branje na glas se je ustavilo",
|
||||
"Cloud provider switched": "Ponudnik oblaka zamenjan",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Nalaganja v Readest Cloud so ustavljena, dokler je izbrana sinhronizacija {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Upravlja {{provider}}, dokler je vaš ponudnik oblačne sinhronizacije",
|
||||
"Not signed in": "Niste prijavljeni",
|
||||
"Paused — plan required": "Ustavljeno — potreben je paket",
|
||||
"Active · Book file uploads off": "Aktivno · Nalaganje datotek knjig je izklopljeno",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Nastavitve aplikacije, statistika branja in slovarji se še naprej sinhronizirajo prek vašega računa Readest, dokler ste prijavljeni.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Sinhronizirajte knjižnico, napredek branja in označbe z Readest Cloud.",
|
||||
"Account and Storage": "Račun in shramba",
|
||||
"Manage your plan and stored files": "Upravljajte svoj paket in shranjene datoteke",
|
||||
"Cloud sync provider": "Ponudnik oblačne sinhronizacije",
|
||||
"Use Readest Cloud": "Uporabi Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Druga naprava še vedno sinhronizira to knjižnico prek Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} nalaganje ni uspelo: nezadostna kvota v shrambi",
|
||||
"{{count}} uploads failed: insufficient storage quota_two": "{{count}} nalaganji nista uspeli: nezadostna kvota v shrambi",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} nalaganja niso uspela: nezadostna kvota v shrambi",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} nalaganj ni uspelo: nezadostna kvota v shrambi",
|
||||
"Library sync via {{provider}}": "Sinhronizacija knjižnice prek {{provider}}",
|
||||
"Google Drive session expired": "Seja Google Drive je potekla",
|
||||
"Cloud sync session expired": "Seja sinhronizacije v oblaku je potekla",
|
||||
"Uploads book files to your other devices": "Naloži datoteke knjig v vaše druge naprave",
|
||||
"Re-check every book instead of only changed ones": "Znova preveri vsako knjigo namesto le spremenjenih",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Vedro ni bilo najdeno",
|
||||
"Endpoint": "Končna točka",
|
||||
"Bucket": "Vedro",
|
||||
"Region": "Regija",
|
||||
"Access Key ID": "ID dostopnega ključa",
|
||||
"Your Access Key ID": "Vaš ID dostopnega ključa",
|
||||
"Secret Access Key": "Skrivni dostopni ključ",
|
||||
"Your Secret Access Key": "Vaš skrivni dostopni ključ",
|
||||
"S3-Compatible Storage": "Shramba, združljiva s S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Sinhronizirajte svojo knjižnico, bralni napredek in označbe z vedrom, združljivim s S3, kot so Cloudflare R2, AWS S3 ali MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "V brskalniku mora politika CORS vedra dovoliti izvor tega spletnega mesta.",
|
||||
"Use S3": "Uporabi S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Pred povezovanjem se prepričajte, da vedro obstaja in da imajo poverilnice dostop za branje/pisanje.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Dokler je izbran {{provider}}, se knjige, napredek in opombe sinhronizirajo samo z vašim strežnikom.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Dokler je izbran {{provider}}, se knjige, napredek in opombe sinhronizirajo samo z vašim Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Dokler je izbran {{provider}}, se knjige, napredek in opombe sinhronizirajo samo z vašim vedrom.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Shramba S3",
|
||||
"Speed": "Hitrost",
|
||||
"{{time}} left in chapter": "{{time}} preostalo v poglavju",
|
||||
"Open Read Aloud player": "Odpri predvajalnik glasnega branja",
|
||||
"Read Aloud": "Glasno branje",
|
||||
"Voice": "Glas",
|
||||
"Sleep Timer": "Časovnik spanja",
|
||||
"Slower": "Počasneje",
|
||||
"Faster": "Hitreje",
|
||||
"Exit Auto Scroll": "Izhod iz samodejnega pomikanja",
|
||||
"Auto Scroll": "Samodejno pomikanje",
|
||||
"End of book": "Konec knjige",
|
||||
"Toggle Auto Scroll": "Preklopi samodejno pomikanje"
|
||||
}
|
||||
|
||||
@@ -111,7 +111,6 @@
|
||||
"Always on Top": "Alltid överst",
|
||||
"Always Show Status Bar": "Visa alltid statusfält",
|
||||
"Keep Screen Awake": "Håll skärm vaken",
|
||||
"Background Read Aloud": "Läs upp i bakgrunden",
|
||||
"Reload Page": "Ladda om sida",
|
||||
"Settings": "Inställningar",
|
||||
"Advanced Settings": "Avancerade inställningar",
|
||||
@@ -256,7 +255,6 @@
|
||||
"Book": "Bok",
|
||||
"Chapter": "Kapitel",
|
||||
"Match Case": "Matchning av versaler",
|
||||
"Match Whole Words": "Matchning av hela ord",
|
||||
"Match Diacritics": "Matchning av diakritiska tecken",
|
||||
"Sidebar": "Sidofält",
|
||||
"Resize Sidebar": "Ändra storlek på sidofält",
|
||||
@@ -273,8 +271,6 @@
|
||||
"Play": "Spela",
|
||||
"Next Sentence": "Nästa mening",
|
||||
"Next Paragraph": "Nästa stycke",
|
||||
"Read Aloud": "Läs upp",
|
||||
"Ready to read aloud": "Redo att läsa upp",
|
||||
"TTS not supported for this document": "Uppläsning stöds inte för detta dokument",
|
||||
"No Timeout": "Ingen timeout",
|
||||
"{{value}} minute": "{{value}} minut",
|
||||
@@ -282,8 +278,6 @@
|
||||
"{{value}} hour": "{{value}} timme",
|
||||
"{{value}} hours": "{{value}} timmar",
|
||||
"Voices for {{lang}}": "Röster för {{lang}}",
|
||||
"Slow": "Långsam",
|
||||
"Fast": "Snabb",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} röst",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} röster",
|
||||
"Zoom Level": "Zoomnivå",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "Exportera",
|
||||
"Set Timeout": "Ställ in timeout",
|
||||
"Select Voice": "Välj röst",
|
||||
"Toggle Sticky Bottom TTS Bar": "Växla fast TTS-fält",
|
||||
"Display what I'm reading on Discord": "Visa vad jag läser på Discord",
|
||||
"Show on Discord": "Visa på Discord",
|
||||
"Instant {{action}}": "Omedelbar {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV-autentisering misslyckades. Återanslut i Inställningar.",
|
||||
"Downloading": "Laddar ned",
|
||||
"Uploading": "Laddar upp",
|
||||
"downloaded {{n}} book(s)": "{{n}} bok/böcker nedladdade",
|
||||
"pushed {{n}} config(s)": "{{n}} konfiguration(er) skickade",
|
||||
"uploaded {{n}} new file(s)": "{{n}} ny(a) fil(er) uppladdade",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Synkroniseringen slutfördes med {{failed}} fel. {{ok}} ok.",
|
||||
"Sync complete": "Synkronisering klar",
|
||||
"Everything is already up to date.": "Allt är redan uppdaterat.",
|
||||
"Browsing {{path}} on {{server}}": "Bläddrar i {{path}} på {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Anslut till en WebDAV-server för att bläddra bland dina fjärrfiler.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Ladda upp bokfiler",
|
||||
"Sync now": "Synkronisera nu",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Visa lösenord",
|
||||
"Root Directory": "Rotmapp",
|
||||
"Syncing…": "Synkroniserar…",
|
||||
"pulled progress for {{n}} book(s)": "läsförlopp för {{n}} bok/böcker hämtat",
|
||||
"Sync History": "Synkroniseringshistorik",
|
||||
"Clear Sync History": "Rensa synkroniseringshistorik",
|
||||
"No manual syncs yet": "Inga manuella synkroniseringar än",
|
||||
"Partial": "Delvis",
|
||||
"Cleanup": "Rensning",
|
||||
"Cleanup failed": "Rensning misslyckades",
|
||||
"Sync failed": "Synkroniseringen misslyckades",
|
||||
"{{n}} deleted": "{{n}} borttagna",
|
||||
"{{n}} failed": "{{n}} misslyckades",
|
||||
"Nothing deleted": "Inget borttaget",
|
||||
"{{n}} downloaded": "{{n}} nedladdade",
|
||||
"{{n}} uploaded": "{{n}} uppladdade",
|
||||
"{{n}} progress": "{{n}} läsförlopp",
|
||||
"Up to date": "Uppdaterad",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Nedladdade böcker",
|
||||
"Files uploaded": "Uppladdade filer",
|
||||
"Configs uploaded": "Uppladdade konfigurationer",
|
||||
"Configs downloaded": "Nedladdade konfigurationer",
|
||||
"Covers uploaded": "Uppladdade omslag",
|
||||
"Books deleted": "Borttagna böcker",
|
||||
"Files in sync": "Synkroniserade filer",
|
||||
"Failures": "Misslyckanden",
|
||||
"Total books": "Totalt antal böcker",
|
||||
"Error:": "Fel:",
|
||||
"Failed books": "Misslyckade böcker",
|
||||
"Deleted {{n}} book(s) from server.": "Tog bort {{n}} bok/böcker från servern.",
|
||||
"Failed to load directory": "Kunde inte läsa in katalogen",
|
||||
"File download is only supported on the desktop and mobile apps.": "Filnedladdning stöds endast i skrivbords- och mobilappar.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Installera webbläsartillägget för Readest för att skicka artikeln du läser till ditt bibliotek. Tillägget klipper sidan direkt från din webbläsare, så att betal- och inloggningssidor också fungerar.",
|
||||
"Added to your library. It will sync to your other devices.": "Tillagd i ditt bibliotek. Synkroniseras med dina andra enheter.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Synklösenfras glömd. Alla krypterade fält rensade.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Endast manuella synkroniseringar och rensningar. Automatiska synkroniseringar under läsning loggas inte här.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Ta bort {{n}} bok/böcker från WebDAV-servern?\n\nDetta tar bara bort fjärrfiler; ditt lokala bibliotek påverkas inte. Borttagningen kan inte ångras. Data på servern försvinner permanent.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Laddar upp bokfiler till dina andra enheter.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Fel synklösenfras. Synkroniserade autentiseringsuppgifter kunde inte dekrypteras.",
|
||||
"Email books straight to your library": "E-posta böcker direkt till ditt bibliotek",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Vidarebefordra bilagor och artiklar till din privata Readest-adress. Tillgänglig i Plus-, Pro- och Lifetime-abonnemangen.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Raderar även läsframsteg, anteckningar och bokmärken.",
|
||||
"Background Image (Library)": "Bakgrundsbild (Bibliotek)",
|
||||
"Background Image (Reader)": "Bakgrundsbild (Läsvy)",
|
||||
"updated metadata for {{n}} book(s)": "uppdaterade metadata för {{n}} bok/böcker",
|
||||
"{{n}} metadata": "{{n}} metadata",
|
||||
"Metadata updated": "Metadata uppdaterad",
|
||||
"Filter": "Filtrera",
|
||||
"Sort by": "Sortera efter",
|
||||
"Date modified": "Ändringsdatum",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Detaljnivå",
|
||||
"Refresh Page": "Uppdatera sidan",
|
||||
"Recently read": "Nyligen lästa",
|
||||
"Show recently read": "Visa nyligen lästa"
|
||||
"Show recently read": "Visa nyligen lästa",
|
||||
"Find:": "Sök:",
|
||||
"Enable rule": "Aktivera regel",
|
||||
"Disable rule": "Inaktivera regel",
|
||||
"Progress Read": "Läsframsteg",
|
||||
"Auto-import new books from this folder": "Importera nya böcker från den här mappen automatiskt",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "När nya böcker läggs till i den här mappen importeras de automatiskt nästa gång Readest öppnas eller återgår till förgrunden.",
|
||||
"Reading aloud": "Läser upp",
|
||||
"Open Book": "Öppna bok",
|
||||
"Stop reading aloud": "Sluta läsa upp",
|
||||
"Enter at least two words": "Ange minst två ord",
|
||||
"Search failed": "Sökningen misslyckades",
|
||||
"Search with regex": "Sök med regex",
|
||||
"Words to find near each other": "Ord som ska hittas nära varandra",
|
||||
"Contains": "Innehåller",
|
||||
"Whole Words": "Hela ord",
|
||||
"Regular Expression": "Reguljärt uttryck",
|
||||
"Nearby Words": "Närliggande ord",
|
||||
"Within N words": "Inom N ord",
|
||||
"Not for regex": "Inte för regex",
|
||||
"No results found": "Inga resultat hittades",
|
||||
"{{count}} results_one": "{{count}} resultat",
|
||||
"{{count}} results_other": "{{count}} resultat",
|
||||
"Failed to seek": "Kunde inte spola",
|
||||
"Chapter progress": "Kapitelframsteg",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} av {{total}}",
|
||||
"Decrease Contrast": "Minska kontrast",
|
||||
"Reset Contrast": "Återställ kontrast",
|
||||
"Increase Contrast": "Öka kontrast",
|
||||
"Push": "Skjut",
|
||||
"Slide": "Glid",
|
||||
"Page Curl": "Bläddring",
|
||||
"Animation Style": "Animationsstil",
|
||||
"Appearance": "Utseende",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Ställer in textstorleken för ordboksresultat, oberoende av läsvyn.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autentiseringen misslyckades. Anslut igen i Inställningar.",
|
||||
"Full Sync": "Fullständig synk",
|
||||
"Waiting for sign-in…": "Väntar på inloggning…",
|
||||
"Reconnect": "Anslut igen",
|
||||
"Connected as {{account}}": "Ansluten som {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Gör Google Drive till aktiv molnleverantör.",
|
||||
"Use Google Drive": "Använd Google Drive",
|
||||
"Sign-in opens in your browser.": "Inloggningen öppnas i din webbläsare.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest kommer bara åt de filer som appen skapar i din Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Synka ditt bibliotek, dina läsframsteg och markeringar med en WebDAV-server.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Synka ditt bibliotek, dina läsframsteg och markeringar med din Google Drive.",
|
||||
"Configured": "Konfigurerad",
|
||||
"Use WebDAV": "Använd WebDAV",
|
||||
"Cloud Sync": "Molnsynk",
|
||||
"Extra Large": "Extra stor",
|
||||
"Hint size": "Hintstorlek",
|
||||
"Gloss text size above the word": "Textstorlek för hinten ovanför ordet",
|
||||
"Hint color": "Hintfärg",
|
||||
"Adjust Text Selection": "Justera textmarkering",
|
||||
"Your books will appear here": "Dina böcker visas här",
|
||||
"Reading aloud continues in the background": "Uppläsningen fortsätter i bakgrunden",
|
||||
"Stopped reading aloud": "Uppläsningen stoppades",
|
||||
"Read aloud stopped": "Uppläsning stoppad",
|
||||
"Cloud provider switched": "Molnleverantör bytt",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Uppladdningar till Readest Cloud är pausade så länge {{provider}}-synkning är vald",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Hanteras av {{provider}} så länge det är din molnsynkleverantör",
|
||||
"Not signed in": "Inte inloggad",
|
||||
"Paused — plan required": "Pausad — abonnemang krävs",
|
||||
"Active · Book file uploads off": "Aktiv · Uppladdning av bokfiler av",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Appinställningar, läsestatistik och ordböcker fortsätter att synkas via ditt Readest-konto så länge du är inloggad.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Synka ditt bibliotek, dina läsframsteg och markeringar med Readest Cloud.",
|
||||
"Account and Storage": "Konto och lagring",
|
||||
"Manage your plan and stored files": "Hantera ditt abonnemang och lagrade filer",
|
||||
"Cloud sync provider": "Molnsynkleverantör",
|
||||
"Use Readest Cloud": "Använd Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "En annan enhet synkar fortfarande det här biblioteket via Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} uppladdning misslyckades: otillräcklig lagringskvot",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} uppladdningar misslyckades: otillräcklig lagringskvot",
|
||||
"Library sync via {{provider}}": "Bibliotekssynkronisering via {{provider}}",
|
||||
"Google Drive session expired": "Google Drive-sessionen har upphört",
|
||||
"Cloud sync session expired": "Molnsynkroniseringssessionen har upphört",
|
||||
"Uploads book files to your other devices": "Laddar upp bokfiler till dina andra enheter",
|
||||
"Re-check every book instead of only changed ones": "Kontrollera varje bok igen i stället för bara ändrade",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucketen hittades inte",
|
||||
"Endpoint": "Slutpunkt",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Region",
|
||||
"Access Key ID": "Åtkomstnyckel-ID",
|
||||
"Your Access Key ID": "Ditt åtkomstnyckel-ID",
|
||||
"Secret Access Key": "Hemlig åtkomstnyckel",
|
||||
"Your Secret Access Key": "Din hemliga åtkomstnyckel",
|
||||
"S3-Compatible Storage": "S3-kompatibel lagring",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Synkronisera ditt bibliotek, din läsprogress och dina markeringar med en S3-kompatibel bucket som Cloudflare R2, AWS S3 eller MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "I webbläsaren måste bucketens CORS-policy tillåta den här webbplatsens ursprung.",
|
||||
"Use S3": "Använd S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Innan du ansluter, se till att bucketen finns och att autentiseringsuppgifterna har läs-/skrivåtkomst.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "När {{provider}} är valt synkroniseras böcker, framsteg och anteckningar endast med din server.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "När {{provider}} är valt synkroniseras böcker, framsteg och anteckningar endast med din Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "När {{provider}} är valt synkroniseras böcker, framsteg och anteckningar endast med din bucket.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "S3-lagring",
|
||||
"Speed": "Hastighet",
|
||||
"{{time}} left in chapter": "{{time}} kvar i kapitlet",
|
||||
"Open Read Aloud player": "Öppna uppläsningsspelaren",
|
||||
"Read Aloud": "Uppläsning",
|
||||
"Voice": "Röst",
|
||||
"Sleep Timer": "Sovtimer",
|
||||
"Slower": "Långsammare",
|
||||
"Faster": "Snabbare",
|
||||
"Exit Auto Scroll": "Avsluta automatisk rullning",
|
||||
"Auto Scroll": "Automatisk rullning",
|
||||
"End of book": "Slutet av boken",
|
||||
"Toggle Auto Scroll": "Växla automatisk rullning"
|
||||
}
|
||||
|
||||
@@ -308,7 +308,6 @@
|
||||
"Book": "புத்தகம்",
|
||||
"Chapter": "அத்தியாயம்",
|
||||
"Match Case": "எழுத்து பொருத்தம்",
|
||||
"Match Whole Words": "முழு வார்த்தைகள் பொருத்தம்",
|
||||
"Match Diacritics": "உச்சரிப்பு குறிகள் பொருத்தம்",
|
||||
"TOC": "உள்ளடக்கம்",
|
||||
"Table of Contents": "உள்ளடக்கம்",
|
||||
@@ -321,8 +320,6 @@
|
||||
"{{value}} hour": "{{value}} மணிநேரம்",
|
||||
"{{value}} hours": "{{value}} மணிநேரங்கள்",
|
||||
"Voices for {{lang}}": "{{lang}} க்கான குரல்கள்",
|
||||
"Slow": "மெதுவாக",
|
||||
"Fast": "வேகமாக",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: 1 குரல்",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} குரல்கள்",
|
||||
"Sign in to Sync": "ஒத்திசைக்க உள்நுழையவும்",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "மொத்தமாக்கலை தொடங்கவும்",
|
||||
"Advanced Settings": "மேம்பட்ட அமைப்புகள்",
|
||||
"File count: {{size}}": "கோப்பு எண்ணிக்கை: {{size}}",
|
||||
"Background Read Aloud": "பின்னணி உரை வாசிப்பு",
|
||||
"Ready to read aloud": "வாசிக்க தயாராக உள்ளது",
|
||||
"Read Aloud": "உரை வாசிப்பு",
|
||||
"Screen Brightness": "திரை பிரகாசம்",
|
||||
"Background Image": "பின்னணி படம்",
|
||||
"Import Image": "புகைப்படம் இறக்குமதி",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "ஏற்றுமதி",
|
||||
"Set Timeout": "நேர வரம்பை அமைக்கவும்",
|
||||
"Select Voice": "குரலைத் தேர்ந்தெடுக்கவும்",
|
||||
"Toggle Sticky Bottom TTS Bar": "நிலையான TTS பட்டியை மாற்றவும்",
|
||||
"Display what I'm reading on Discord": "Discord இல் படிக்கும் புத்தகத்தை காட்டு",
|
||||
"Show on Discord": "Discord இல் காட்டு",
|
||||
"Instant {{action}}": "உடனடி {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV அங்கீகாரம் தோல்வி. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
|
||||
"Downloading": "பதிவிறக்கப்படுகிறது",
|
||||
"Uploading": "பதிவேற்றப்படுகிறது",
|
||||
"downloaded {{n}} book(s)": "{{n}} புத்தகம்(ங்கள்) பதிவிறக்கப்பட்டன",
|
||||
"pushed {{n}} config(s)": "{{n}} கட்டமைப்பு(கள்) அனுப்பப்பட்டன",
|
||||
"uploaded {{n}} new file(s)": "{{n}} புதிய கோப்பு(கள்) பதிவேற்றப்பட்டன",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "ஒத்திசைவு {{failed}} தோல்விகளுடன் முடிந்தது. {{ok}} சரி.",
|
||||
"Sync complete": "ஒத்திசைவு முடிந்தது",
|
||||
"Everything is already up to date.": "அனைத்தும் ஏற்கனவே புதுப்பித்த நிலையில் உள்ளன.",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} இல் {{path}} ஐ உலாவுகிறது",
|
||||
"Connect to a WebDAV server to browse your remote files.": "உங்கள் தொலைதூர கோப்புகளை உலாவ WebDAV சேவையகத்துடன் இணைக்கவும்.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "புத்தக கோப்புகளை பதிவேற்று",
|
||||
"Sync now": "இப்போது ஒத்திசை",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "கடவுச்சொல்லைக் காட்டு",
|
||||
"Root Directory": "மூல கோப்பகம்",
|
||||
"Syncing…": "ஒத்திசைக்கப்படுகிறது…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} புத்தகம்(ங்கள்) முன்னேற்றம் இழுக்கப்பட்டது",
|
||||
"Sync History": "ஒத்திசைவு வரலாறு",
|
||||
"Clear Sync History": "ஒத்திசைவு வரலாற்றை அழி",
|
||||
"No manual syncs yet": "இதுவரை கைமுறை ஒத்திசைவுகள் இல்லை",
|
||||
"Partial": "பகுதியளவு",
|
||||
"Cleanup": "சுத்தம்",
|
||||
"Cleanup failed": "சுத்தம் தோல்வி",
|
||||
"Sync failed": "ஒத்திசைவு தோல்வியடைந்தது",
|
||||
"{{n}} deleted": "{{n}} நீக்கப்பட்டன",
|
||||
"{{n}} failed": "{{n}} தோல்வி",
|
||||
"Nothing deleted": "எதுவும் நீக்கப்படவில்லை",
|
||||
"{{n}} downloaded": "{{n}} பதிவிறக்கப்பட்டன",
|
||||
"{{n}} uploaded": "{{n}} பதிவேற்றப்பட்டன",
|
||||
"{{n}} progress": "{{n}} முன்னேற்றம்",
|
||||
"Up to date": "புதுப்பித்த நிலையில்",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "பதிவிறக்கிய புத்தகங்கள்",
|
||||
"Files uploaded": "பதிவேற்றிய கோப்புகள்",
|
||||
"Configs uploaded": "பதிவேற்றிய கட்டமைப்புகள்",
|
||||
"Configs downloaded": "பதிவிறக்கிய கட்டமைப்புகள்",
|
||||
"Covers uploaded": "பதிவேற்றிய அட்டைகள்",
|
||||
"Books deleted": "நீக்கிய புத்தகங்கள்",
|
||||
"Files in sync": "ஒத்திசைவில் உள்ள கோப்புகள்",
|
||||
"Failures": "தோல்விகள்",
|
||||
"Total books": "மொத்த புத்தகங்கள்",
|
||||
"Error:": "பிழை:",
|
||||
"Failed books": "தோல்வியடைந்த புத்தகங்கள்",
|
||||
"Deleted {{n}} book(s) from server.": "சேவையகத்திலிருந்து {{n}} புத்தகம்(ங்கள்) நீக்கப்பட்டன.",
|
||||
"Failed to load directory": "கோப்பகத்தை ஏற்ற முடியவில்லை",
|
||||
"File download is only supported on the desktop and mobile apps.": "கோப்பு பதிவிறக்கம் டெஸ்க்டாப் மற்றும் மொபைல் பயன்பாடுகளில் மட்டுமே ஆதரிக்கப்படுகிறது.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "நீங்கள் படிக்கும் கட்டுரையை உங்கள் நூலகத்திற்கு அனுப்ப Readest உலாவி நீட்டிப்பை நிறுவவும். அது உங்கள் உலாவியில் இருந்து பக்கத்தை வெட்டியெடுக்கிறது, எனவே பணம் செலுத்திய மற்றும் உள்நுழைவு மட்டுமே தேவைப்படும் தளங்களும் இயங்கும்.",
|
||||
"Added to your library. It will sync to your other devices.": "உங்கள் நூலகத்தில் சேர்க்கப்பட்டது. உங்கள் மற்ற சாதனங்களுக்கு ஒத்திசைக்கப்படும்.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "ஒத்திசைவு கடவுச்சொற்றொடர் மறக்கப்பட்டது. அனைத்து குறியாக்கப்பட்ட புலங்களும் அழிக்கப்பட்டன.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "கைமுறை ஒத்திசைவுகள் மற்றும் சுத்திகரிப்புகள் மட்டுமே. வாசிக்கும்போது தானியங்கி ஒத்திசைவுகள் இங்கு பதிவாகாது.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV சேவையகத்திலிருந்து {{n}} புத்தகம்(ங்கள்) நீக்க வேண்டுமா?\n\nஇது தொலைதூர கோப்புகளை மட்டுமே நீக்கும்; உங்கள் உள்ளூர் நூலகம் பாதிக்கப்படாது. நீக்கலை மீட்க முடியாது. சேவையகத்தில் உள்ள தரவு நிரந்தரமாக மறையும்.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "புத்தக கோப்புகளை உங்கள் பிற சாதனங்களுக்கு பதிவேற்றுகிறது.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "தவறான ஒத்திசைவு கடவுச்சொற்றொடர். ஒத்திசைக்கப்பட்ட சான்றுகளை மறைகுறியாக்க முடியவில்லை.",
|
||||
"Email books straight to your library": "புத்தகங்களை மின்னஞ்சல் வழியாக நேரடியாக உங்கள் நூலகத்திற்கு அனுப்பவும்",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "இணைப்புகள் மற்றும் கட்டுரைகளை உங்கள் தனிப்பட்ட Readest முகவரிக்கு முன்னனுப்பவும். Plus, Pro மற்றும் Lifetime திட்டங்களில் கிடைக்கும்.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "வாசிப்பு முன்னேற்றம், குறிப்புகள் மற்றும் புக்மார்க்குகளையும் அழிக்கும்.",
|
||||
"Background Image (Library)": "பின்னணி படம் (நூலகம்)",
|
||||
"Background Image (Reader)": "பின்னணி படம் (வாசிப்புப் பக்கம்)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} புத்தகத்தின் மெட்டாடேட்டா புதுப்பிக்கப்பட்டது",
|
||||
"{{n}} metadata": "{{n}} மெட்டாடேட்டா",
|
||||
"Metadata updated": "மெட்டாடேட்டா புதுப்பிக்கப்பட்டது",
|
||||
"Filter": "வடிகட்டு",
|
||||
"Sort by": "வரிசைப்படுத்து",
|
||||
"Date modified": "மாற்றிய தேதி",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "நுண்மை",
|
||||
"Refresh Page": "பக்கத்தைப் புதுப்பி",
|
||||
"Recently read": "சமீபத்தில் படித்தவை",
|
||||
"Show recently read": "சமீபத்தில் படித்தவற்றைக் காட்டு"
|
||||
"Show recently read": "சமீபத்தில் படித்தவற்றைக் காட்டு",
|
||||
"Find:": "தேடு:",
|
||||
"Enable rule": "விதியை இயக்கு",
|
||||
"Disable rule": "விதியை முடக்கு",
|
||||
"Progress Read": "வாசிப்பு முன்னேற்றம்",
|
||||
"Auto-import new books from this folder": "இந்த கோப்புறையிலிருந்து புதிய புத்தகங்களை தானாக இறக்குமதி செய்யவும்",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "இந்த கோப்புறையில் புதிய புத்தகங்கள் சேர்க்கப்படும்போது, அடுத்த முறை Readest திறக்கும்போது அல்லது முன்னணிக்குத் திரும்பும்போது அவை தானாக இறக்குமதி செய்யப்படும்.",
|
||||
"Reading aloud": "உரை வாசிக்கப்படுகிறது",
|
||||
"Open Book": "புத்தகத்தைத் திற",
|
||||
"Stop reading aloud": "உரை வாசிப்பை நிறுத்து",
|
||||
"Enter at least two words": "குறைந்தது இரண்டு வார்த்தைகளை உள்ளிடவும்",
|
||||
"Search failed": "தேடல் தோல்வியடைந்தது",
|
||||
"Search with regex": "regex மூலம் தேடவும்",
|
||||
"Words to find near each other": "ஒன்றுக்கொன்று அருகில் தேட வேண்டிய வார்த்தைகள்",
|
||||
"Contains": "உள்ளடக்கியது",
|
||||
"Whole Words": "முழு வார்த்தைகள்",
|
||||
"Regular Expression": "Regular Expression",
|
||||
"Nearby Words": "அருகிலுள்ள வார்த்தைகள்",
|
||||
"Within N words": "N வார்த்தைகளுக்குள்",
|
||||
"Not for regex": "regex க்கு பொருந்தாது",
|
||||
"No results found": "முடிவுகள் எதுவும் கிடைக்கவில்லை",
|
||||
"{{count}} results_one": "{{count}} முடிவு",
|
||||
"{{count}} results_other": "{{count}} முடிவுகள்",
|
||||
"Failed to seek": "நகர்த்த முடியவில்லை",
|
||||
"Chapter progress": "அத்தியாய முன்னேற்றம்",
|
||||
"{{elapsed}} of {{total}}": "{{total}} இல் {{elapsed}}",
|
||||
"Decrease Contrast": "மாறுபாட்டைக் குறை",
|
||||
"Reset Contrast": "மாறுபாட்டை மீட்டமை",
|
||||
"Increase Contrast": "மாறுபாட்டை அதிகரி",
|
||||
"Push": "தள்ளல்",
|
||||
"Slide": "சறுக்கல்",
|
||||
"Page Curl": "பக்கச் சுருட்டல்",
|
||||
"Animation Style": "அனிமேஷன் பாணி",
|
||||
"Appearance": "தோற்றம்",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "வாசிப்புக் காட்சியைச் சாராமல், அகராதி முடிவுகளின் உரை அளவை அமைக்கிறது.",
|
||||
"Authentication failed. Reconnect in Settings.": "அங்கீகாரம் தோல்வியடைந்தது. அமைப்புகளில் மீண்டும் இணைக்கவும்.",
|
||||
"Full Sync": "முழு ஒத்திசைவு",
|
||||
"Waiting for sign-in…": "உள்நுழைவுக்காகக் காத்திருக்கிறது…",
|
||||
"Reconnect": "மீண்டும் இணைக்கவும்",
|
||||
"Connected as {{account}}": "{{account}} ஆக இணைக்கப்பட்டுள்ளது",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive ஐ செயலில் உள்ள cloud வழங்குநராக அமைக்கவும்.",
|
||||
"Use Google Drive": "Google Drive ஐப் பயன்படுத்தவும்",
|
||||
"Sign-in opens in your browser.": "உள்நுழைவு உங்கள் உலாவியில் திறக்கும்.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest உங்கள் Drive இல் தானே உருவாக்கும் கோப்புகளை மட்டுமே அணுகும்.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை ஒரு WebDAV சேவையகத்துடன் ஒத்திசைக்கவும்.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை உங்கள் Google Drive உடன் ஒத்திசைக்கவும்.",
|
||||
"Configured": "கட்டமைக்கப்பட்டது",
|
||||
"Use WebDAV": "WebDAV ஐப் பயன்படுத்தவும்",
|
||||
"Cloud Sync": "Cloud ஒத்திசைவு",
|
||||
"Extra Large": "மிகப் பெரிய",
|
||||
"Hint size": "குறிப்பு அளவு",
|
||||
"Gloss text size above the word": "வார்த்தைக்கு மேலே உள்ள குறிப்பு உரையின் அளவு",
|
||||
"Hint color": "குறிப்பு நிறம்",
|
||||
"Adjust Text Selection": "உரை தேர்வை சரிசெய்யவும்",
|
||||
"Your books will appear here": "உங்கள் புத்தகங்கள் இங்கே தோன்றும்",
|
||||
"Reading aloud continues in the background": "உரை வாசிப்பு பின்னணியில் தொடர்கிறது",
|
||||
"Stopped reading aloud": "உரை வாசிப்பு நிறுத்தப்பட்டது",
|
||||
"Read aloud stopped": "உரை வாசிப்பு நின்றது",
|
||||
"Cloud provider switched": "கிளவுட் வழங்குநர் மாற்றப்பட்டது",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} ஒத்திசைவு தேர்ந்தெடுக்கப்பட்டிருக்கும் வரை Readest Cloud-க்கு பதிவேற்றங்கள் இடைநிறுத்தப்படும்",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} உங்கள் கிளவுட் ஒத்திசைவு வழங்குநராக இருக்கும் வரை அதனால் நிர்வகிக்கப்படுகிறது",
|
||||
"Not signed in": "உள்நுழையவில்லை",
|
||||
"Paused — plan required": "இடைநிறுத்தப்பட்டது — திட்டம் தேவை",
|
||||
"Active · Book file uploads off": "செயலில் · புத்தக கோப்பு பதிவேற்றம் அணைக்கப்பட்டுள்ளது",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "உள்நுழைந்திருக்கும் வரை ஆப் அமைப்புகள், வாசிப்பு புள்ளிவிவரங்கள் மற்றும் அகராதிகள் உங்கள் Readest கணக்கு வழியாக ஒத்திசைக்கப்பட்டுக்கொண்டே இருக்கும்.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை Readest Cloud-உடன் ஒத்திசைக்கவும்.",
|
||||
"Account and Storage": "கணக்கு மற்றும் சேமிப்பகம்",
|
||||
"Manage your plan and stored files": "உங்கள் திட்டம் மற்றும் சேமிக்கப்பட்ட கோப்புகளை நிர்வகிக்கவும்",
|
||||
"Cloud sync provider": "கிளவுட் ஒத்திசைவு வழங்குநர்",
|
||||
"Use Readest Cloud": "Readest Cloud-ஐப் பயன்படுத்து",
|
||||
"Another device is still syncing this library via Readest Cloud": "மற்றொரு சாதனம் இன்னும் Readest Cloud வழியாக இந்த நூலகத்தை ஒத்திசைக்கிறது",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} பதிவேற்றம் தோல்வியடைந்தது: போதுமான சேமிப்பக ஒதுக்கீடு இல்லை",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} பதிவேற்றங்கள் தோல்வியடைந்தன: போதுமான சேமிப்பக ஒதுக்கீடு இல்லை",
|
||||
"Library sync via {{provider}}": "{{provider}} வழியாக நூலக ஒத்திசைவு",
|
||||
"Google Drive session expired": "Google Drive அமர்வு காலாவதியானது",
|
||||
"Cloud sync session expired": "கிளவுட் ஒத்திசைவு அமர்வு காலாவதியானது",
|
||||
"Uploads book files to your other devices": "புத்தகக் கோப்புகளை உங்கள் மற்ற சாதனங்களுக்குப் பதிவேற்றுகிறது",
|
||||
"Re-check every book instead of only changed ones": "மாற்றப்பட்டவை மட்டுமல்லாமல் ஒவ்வொரு புத்தகத்தையும் மீண்டும் சரிபார்க்கவும்",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "பக்கெட் கிடைக்கவில்லை",
|
||||
"Endpoint": "எண்ட்பாயின்ட்",
|
||||
"Bucket": "பக்கெட்",
|
||||
"Region": "மண்டலம்",
|
||||
"Access Key ID": "அணுகல் விசை ID",
|
||||
"Your Access Key ID": "உங்கள் அணுகல் விசை ID",
|
||||
"Secret Access Key": "இரகசிய அணுகல் விசை",
|
||||
"Your Secret Access Key": "உங்கள் இரகசிய அணுகல் விசை",
|
||||
"S3-Compatible Storage": "S3-இணக்கமான சேமிப்பகம்",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Cloudflare R2, AWS S3 அல்லது MinIO போன்ற S3-இணக்கமான பக்கெட்டுடன் உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பு குறிப்புகளை ஒத்திசைக்கவும்.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "உலாவியில், பக்கெட்டின் CORS கொள்கை இந்த தளத்தின் origin-ஐ அனுமதிக்க வேண்டும்.",
|
||||
"Use S3": "S3 பயன்படுத்து",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "இணைப்பதற்கு முன், பக்கெட் இருப்பதையும் சான்றுகளுக்கு படிக்க/எழுத அணுகல் இருப்பதையும் உறுதிசெய்யவும்.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} தேர்ந்தெடுக்கப்பட்டிருக்கும் போது, புத்தகங்கள், முன்னேற்றம் மற்றும் குறிப்புகள் உங்கள் சேவையகத்துடன் மட்டுமே ஒத்திசைக்கப்படும்.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} தேர்ந்தெடுக்கப்பட்டிருக்கும் போது, புத்தகங்கள், முன்னேற்றம் மற்றும் குறிப்புகள் உங்கள் Drive உடன் மட்டுமே ஒத்திசைக்கப்படும்.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} தேர்ந்தெடுக்கப்பட்டிருக்கும் போது, புத்தகங்கள், முன்னேற்றம் மற்றும் குறிப்புகள் உங்கள் பக்கெட்டுடன் மட்டுமே ஒத்திசைக்கப்படும்.",
|
||||
"Premium": "பிரீமியம்",
|
||||
"S3 Storage": "S3 சேமிப்பகம்",
|
||||
"Speed": "வேகம்",
|
||||
"{{time}} left in chapter": "அத்தியாயத்தில் {{time}} மீதம்",
|
||||
"Open Read Aloud player": "உரக்க வாசித்தல் பிளேயரைத் திற",
|
||||
"Read Aloud": "உரக்க வாசித்தல்",
|
||||
"Voice": "குரல்",
|
||||
"Sleep Timer": "ஸ்லீப் டைமர்",
|
||||
"Slower": "மெதுவாக",
|
||||
"Faster": "வேகமாக",
|
||||
"Exit Auto Scroll": "தானியங்கி உருட்டலில் இருந்து வெளியேறு",
|
||||
"Auto Scroll": "தானியங்கி உருட்டல்",
|
||||
"End of book": "புத்தகத்தின் முடிவு",
|
||||
"Toggle Auto Scroll": "தானியங்கி உருட்டலை மாற்று"
|
||||
}
|
||||
|
||||
@@ -261,7 +261,6 @@
|
||||
"Book": "หนังสือ",
|
||||
"Chapter": "บท",
|
||||
"Match Case": "ตรงตามตัวอักษร",
|
||||
"Match Whole Words": "ตรงทั้งคำ",
|
||||
"Match Diacritics": "ตรงตามเครื่องหมายวรรณยุกต์",
|
||||
"TOC": "สารบัญ",
|
||||
"Table of Contents": "สารบัญ",
|
||||
@@ -272,8 +271,6 @@
|
||||
"{{value}} minutes": "{{value}} นาที",
|
||||
"{{value}} hour": "{{value}} ชั่วโมง",
|
||||
"{{value}} hours": "{{value}} ชั่วโมง",
|
||||
"Slow": "ช้า",
|
||||
"Fast": "เร็ว",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} เสียง",
|
||||
"Sign in to Sync": "เข้าสู่ระบบเพื่อซิงค์",
|
||||
"Never synced": "ไม่เคยซิงค์",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "เริ่มการย้ายข้อมูล",
|
||||
"Advanced Settings": "การตั้งค่าขั้นสูง",
|
||||
"File count: {{size}}": "จำนวนไฟล์: {{size}}",
|
||||
"Background Read Aloud": "อ่านออกเสียงเบื้องหลัง",
|
||||
"Ready to read aloud": "พร้อมที่จะอ่านออกเสียง",
|
||||
"Read Aloud": "อ่านออกเสียง",
|
||||
"Screen Brightness": "ความสว่างหน้าจอ",
|
||||
"Background Image": "ภาพพื้นหลัง",
|
||||
"Import Image": "นำเข้าภาพ",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "ส่งออก",
|
||||
"Set Timeout": "ตั้งค่าหมดเวลา",
|
||||
"Select Voice": "เลือกเสียง",
|
||||
"Toggle Sticky Bottom TTS Bar": "สลับแถบ TTS แบบติด",
|
||||
"Display what I'm reading on Discord": "แสดงหนังสือที่กำลังอ่านบน Discord",
|
||||
"Show on Discord": "แสดงบน Discord",
|
||||
"Instant {{action}}": "{{action}}ทันที",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "การยืนยันตัวตน WebDAV ล้มเหลว เชื่อมต่อใหม่ในการตั้งค่า",
|
||||
"Downloading": "กำลังดาวน์โหลด",
|
||||
"Uploading": "กำลังอัปโหลด",
|
||||
"downloaded {{n}} book(s)": "ดาวน์โหลด {{n}} เล่ม",
|
||||
"pushed {{n}} config(s)": "อัปโหลดการตั้งค่า {{n}} รายการ",
|
||||
"uploaded {{n}} new file(s)": "อัปโหลด {{n}} ไฟล์ใหม่",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "ซิงค์เสร็จสิ้นโดยมี {{failed}} รายการล้มเหลว สำเร็จ {{ok}}",
|
||||
"Sync complete": "ซิงค์เสร็จสมบูรณ์",
|
||||
"Everything is already up to date.": "ทุกอย่างเป็นเวอร์ชันล่าสุดอยู่แล้ว",
|
||||
"Browsing {{path}} on {{server}}": "กำลังเรียกดู {{path}} บน {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "เชื่อมต่อกับเซิร์ฟเวอร์ WebDAV เพื่อเรียกดูไฟล์ระยะไกลของคุณ",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "อัปโหลดไฟล์หนังสือ",
|
||||
"Sync now": "ซิงค์ทันที",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "แสดงรหัสผ่าน",
|
||||
"Root Directory": "ไดเรกทอรีราก",
|
||||
"Syncing…": "กำลังซิงค์…",
|
||||
"pulled progress for {{n}} book(s)": "ดึงความคืบหน้าของ {{n}} เล่ม",
|
||||
"Sync History": "ประวัติการซิงค์",
|
||||
"Clear Sync History": "ล้างประวัติการซิงค์",
|
||||
"No manual syncs yet": "ยังไม่มีการซิงค์ด้วยตนเอง",
|
||||
"Partial": "บางส่วน",
|
||||
"Cleanup": "ล้างข้อมูล",
|
||||
"Cleanup failed": "ล้างข้อมูลไม่สำเร็จ",
|
||||
"Sync failed": "ซิงค์ไม่สำเร็จ",
|
||||
"{{n}} deleted": "ลบ {{n}}",
|
||||
"{{n}} failed": "ล้มเหลว {{n}}",
|
||||
"Nothing deleted": "ไม่มีอะไรถูกลบ",
|
||||
"{{n}} downloaded": "ดาวน์โหลด {{n}}",
|
||||
"{{n}} uploaded": "อัปโหลด {{n}}",
|
||||
"{{n}} progress": "{{n}} ความคืบหน้า",
|
||||
"Up to date": "เป็นเวอร์ชันล่าสุด",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "หนังสือที่ดาวน์โหลด",
|
||||
"Files uploaded": "ไฟล์ที่อัปโหลด",
|
||||
"Configs uploaded": "การตั้งค่าที่อัปโหลด",
|
||||
"Configs downloaded": "การตั้งค่าที่ดาวน์โหลด",
|
||||
"Covers uploaded": "ปกที่อัปโหลด",
|
||||
"Books deleted": "หนังสือที่ลบ",
|
||||
"Files in sync": "ไฟล์ที่ซิงค์แล้ว",
|
||||
"Failures": "ความล้มเหลว",
|
||||
"Total books": "หนังสือทั้งหมด",
|
||||
"Error:": "ข้อผิดพลาด:",
|
||||
"Failed books": "หนังสือที่ล้มเหลว",
|
||||
"Deleted {{n}} book(s) from server.": "ลบหนังสือ {{n}} เล่มจากเซิร์ฟเวอร์",
|
||||
"Failed to load directory": "ไม่สามารถโหลดไดเรกทอรี",
|
||||
"File download is only supported on the desktop and mobile apps.": "การดาวน์โหลดไฟล์รองรับเฉพาะในแอปเดสก์ท็อปและมือถือเท่านั้น",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "ติดตั้งส่วนขยายเบราว์เซอร์ Readest เพื่อส่งบทความที่คุณกำลังอ่านไปยังคลังของคุณ ส่วนขยายจะตัดหน้านี้จากเบราว์เซอร์ของคุณ ดังนั้นเว็บไซต์แบบมีเพย์วอลล์และที่ต้องล็อกอินก็ยังใช้งานได้",
|
||||
"Added to your library. It will sync to your other devices.": "เพิ่มลงในคลังของคุณแล้ว จะซิงค์ไปยังอุปกรณ์อื่นๆ ของคุณ",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "ลืมรหัสผ่านการซิงค์แล้ว ฟิลด์ที่เข้ารหัสทั้งหมดถูกล้าง",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "การซิงค์และล้างข้อมูลด้วยตนเองเท่านั้น การซิงค์อัตโนมัติระหว่างอ่านจะไม่ถูกบันทึกที่นี่",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "ลบหนังสือ {{n}} เล่มจากเซิร์ฟเวอร์ WebDAV?\n\nสิ่งนี้จะลบเฉพาะไฟล์ระยะไกล; คลังข้อมูลในเครื่องของคุณจะไม่ได้รับผลกระทบ การลบไม่สามารถย้อนกลับได้ ข้อมูลบนเซิร์ฟเวอร์จะหายไปอย่างถาวร",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "อัปโหลดไฟล์หนังสือไปยังอุปกรณ์อื่นของคุณ",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "รหัสผ่านการซิงค์ไม่ถูกต้อง ไม่สามารถถอดรหัสข้อมูลรับรองที่ซิงค์ได้",
|
||||
"Email books straight to your library": "ส่งหนังสือทางอีเมลไปยังคลังของคุณโดยตรง",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "ส่งต่อไฟล์แนบและบทความไปยังที่อยู่ Readest ส่วนตัวของคุณ ใช้งานได้ในแผน Plus, Pro และ Lifetime",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "ลบความคืบหน้าในการอ่าน บันทึก และบุ๊กมาร์กด้วย",
|
||||
"Background Image (Library)": "ภาพพื้นหลัง (คลังหนังสือ)",
|
||||
"Background Image (Reader)": "ภาพพื้นหลัง (มุมมองการอ่าน)",
|
||||
"updated metadata for {{n}} book(s)": "อัปเดตเมทาดาตาสำหรับ {{n}} เล่ม",
|
||||
"{{n}} metadata": "{{n}} เมทาดาตา",
|
||||
"Metadata updated": "อัปเดตเมทาดาตาแล้ว",
|
||||
"Filter": "กรอง",
|
||||
"Sort by": "เรียงตาม",
|
||||
"Date modified": "วันที่แก้ไข",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "ระดับความละเอียด",
|
||||
"Refresh Page": "รีเฟรชหน้า",
|
||||
"Recently read": "อ่านล่าสุด",
|
||||
"Show recently read": "แสดงรายการอ่านล่าสุด"
|
||||
"Show recently read": "แสดงรายการอ่านล่าสุด",
|
||||
"Find:": "ค้นหา:",
|
||||
"Enable rule": "เปิดใช้กฎ",
|
||||
"Disable rule": "ปิดใช้กฎ",
|
||||
"Progress Read": "ความคืบหน้าในการอ่าน",
|
||||
"Auto-import new books from this folder": "นำเข้าหนังสือใหม่จากโฟลเดอร์นี้โดยอัตโนมัติ",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "เมื่อมีหนังสือใหม่ถูกเพิ่มลงในโฟลเดอร์นี้ ระบบจะนำเข้าให้โดยอัตโนมัติเมื่อ Readest เปิดขึ้นหรือกลับมาทำงานในครั้งถัดไป",
|
||||
"Reading aloud": "กำลังอ่านออกเสียง",
|
||||
"Open Book": "เปิดหนังสือ",
|
||||
"Stop reading aloud": "หยุดอ่านออกเสียง",
|
||||
"Enter at least two words": "ป้อนอย่างน้อยสองคำ",
|
||||
"Search failed": "การค้นหาล้มเหลว",
|
||||
"Search with regex": "ค้นหาด้วยนิพจน์ปกติ",
|
||||
"Words to find near each other": "คำที่ต้องการค้นหาให้อยู่ใกล้กัน",
|
||||
"Contains": "ประกอบด้วย",
|
||||
"Whole Words": "ทั้งคำ",
|
||||
"Regular Expression": "นิพจน์ปกติ",
|
||||
"Nearby Words": "คำที่อยู่ใกล้กัน",
|
||||
"Within N words": "ภายใน N คำ",
|
||||
"Not for regex": "ไม่ใช้กับนิพจน์ปกติ",
|
||||
"No results found": "ไม่พบผลลัพธ์",
|
||||
"{{count}} results_other": "ผลลัพธ์ {{count}} รายการ",
|
||||
"Failed to seek": "ไม่สามารถเลื่อนตำแหน่งเล่นได้",
|
||||
"Chapter progress": "ความคืบหน้าของบท",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} จาก {{total}}",
|
||||
"Decrease Contrast": "ลดความคมชัด",
|
||||
"Reset Contrast": "รีเซ็ตความคมชัด",
|
||||
"Increase Contrast": "เพิ่มความคมชัด",
|
||||
"Push": "ดัน",
|
||||
"Slide": "สไลด์",
|
||||
"Page Curl": "ม้วนกระดาษ",
|
||||
"Animation Style": "รูปแบบภาพเคลื่อนไหว",
|
||||
"Appearance": "รูปลักษณ์",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "กำหนดขนาดตัวอักษรของผลลัพธ์พจนานุกรม โดยไม่ขึ้นกับมุมมองการอ่าน",
|
||||
"Authentication failed. Reconnect in Settings.": "การยืนยันตัวตนล้มเหลว เชื่อมต่อใหม่ในการตั้งค่า",
|
||||
"Full Sync": "ซิงค์แบบเต็ม",
|
||||
"Waiting for sign-in…": "กำลังรอการเข้าสู่ระบบ…",
|
||||
"Reconnect": "เชื่อมต่อใหม่",
|
||||
"Connected as {{account}}": "เชื่อมต่อในชื่อ {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". ตั้งให้ Google Drive เป็นผู้ให้บริการคลาวด์ที่ใช้งานอยู่",
|
||||
"Use Google Drive": "ใช้ Google Drive",
|
||||
"Sign-in opens in your browser.": "การเข้าสู่ระบบจะเปิดในเบราว์เซอร์ของคุณ",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest จะเข้าถึงเฉพาะไฟล์ที่สร้างขึ้นเองใน Drive ของคุณเท่านั้น",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับเซิร์ฟเวอร์ WebDAV",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับ Google Drive ของคุณ",
|
||||
"Configured": "กำหนดค่าแล้ว",
|
||||
"Use WebDAV": "ใช้ WebDAV",
|
||||
"Cloud Sync": "ซิงค์คลาวด์",
|
||||
"Extra Large": "ใหญ่พิเศษ",
|
||||
"Hint size": "ขนาดคำใบ้",
|
||||
"Gloss text size above the word": "ขนาดข้อความคำใบ้ที่แสดงเหนือคำศัพท์",
|
||||
"Hint color": "สีคำใบ้",
|
||||
"Adjust Text Selection": "ปรับการเลือกข้อความ",
|
||||
"Your books will appear here": "หนังสือของคุณจะแสดงที่นี่",
|
||||
"Reading aloud continues in the background": "การอ่านออกเสียงดำเนินต่อในเบื้องหลัง",
|
||||
"Stopped reading aloud": "หยุดอ่านออกเสียงแล้ว",
|
||||
"Read aloud stopped": "การอ่านออกเสียงหยุดแล้ว",
|
||||
"Cloud provider switched": "เปลี่ยนผู้ให้บริการคลาวด์แล้ว",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "การอัปโหลดไปยัง Readest Cloud หยุดชั่วคราวขณะที่เลือกการซิงค์ {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "จัดการโดย {{provider}} ขณะที่เป็นผู้ให้บริการซิงค์คลาวด์ของคุณ",
|
||||
"Not signed in": "ยังไม่ได้เข้าสู่ระบบ",
|
||||
"Paused — plan required": "หยุดชั่วคราว — ต้องมีแพ็กเกจ",
|
||||
"Active · Book file uploads off": "ใช้งานอยู่ · ปิดการอัปโหลดไฟล์หนังสือ",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "การตั้งค่าแอป สถิติการอ่าน และพจนานุกรมยังคงซิงค์ผ่านบัญชี Readest ของคุณขณะที่เข้าสู่ระบบอยู่",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับ Readest Cloud",
|
||||
"Account and Storage": "บัญชีและพื้นที่จัดเก็บ",
|
||||
"Manage your plan and stored files": "จัดการแพ็กเกจและไฟล์ที่จัดเก็บของคุณ",
|
||||
"Cloud sync provider": "ผู้ให้บริการซิงค์คลาวด์",
|
||||
"Use Readest Cloud": "ใช้ Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "อุปกรณ์อื่นยังคงซิงค์คลังหนังสือนี้ผ่าน Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "อัปโหลดล้มเหลว {{count}} รายการ: พื้นที่จัดเก็บไม่เพียงพอ",
|
||||
"Library sync via {{provider}}": "ซิงค์คลังหนังสือผ่าน {{provider}}",
|
||||
"Google Drive session expired": "เซสชัน Google Drive หมดอายุแล้ว",
|
||||
"Cloud sync session expired": "เซสชันการซิงค์บนคลาวด์หมดอายุแล้ว",
|
||||
"Uploads book files to your other devices": "อัปโหลดไฟล์หนังสือไปยังอุปกรณ์อื่นของคุณ",
|
||||
"Re-check every book instead of only changed ones": "ตรวจสอบหนังสือทุกเล่มอีกครั้งแทนที่จะเฉพาะเล่มที่เปลี่ยนแปลง",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "ไม่พบบักเก็ต",
|
||||
"Endpoint": "เอ็นด์พอยต์",
|
||||
"Bucket": "บักเก็ต",
|
||||
"Region": "ภูมิภาค",
|
||||
"Access Key ID": "Access Key ID",
|
||||
"Your Access Key ID": "Access Key ID ของคุณ",
|
||||
"Secret Access Key": "Secret Access Key",
|
||||
"Your Secret Access Key": "Secret Access Key ของคุณ",
|
||||
"S3-Compatible Storage": "พื้นที่จัดเก็บที่รองรับ S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับบักเก็ตที่รองรับ S3 เช่น Cloudflare R2, AWS S3 หรือ MinIO",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "ในเบราว์เซอร์ นโยบาย CORS ของบักเก็ตต้องอนุญาต origin ของเว็บไซต์นี้",
|
||||
"Use S3": "ใช้ S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "ก่อนเชื่อมต่อ ตรวจสอบว่าบักเก็ตมีอยู่และข้อมูลรับรองมีสิทธิ์อ่าน/เขียน",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "เมื่อเลือก {{provider}} หนังสือ ความคืบหน้า และคำอธิบายประกอบจะซิงค์ไปยังเซิร์ฟเวอร์ของคุณเท่านั้น",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "เมื่อเลือก {{provider}} หนังสือ ความคืบหน้า และคำอธิบายประกอบจะซิงค์ไปยัง Drive ของคุณเท่านั้น",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "เมื่อเลือก {{provider}} หนังสือ ความคืบหน้า และคำอธิบายประกอบจะซิงค์ไปยังบักเก็ตของคุณเท่านั้น",
|
||||
"Premium": "พรีเมียม",
|
||||
"S3 Storage": "พื้นที่จัดเก็บ S3",
|
||||
"Speed": "ความเร็ว",
|
||||
"{{time}} left in chapter": "เหลือ {{time}} ในบทนี้",
|
||||
"Open Read Aloud player": "เปิดเครื่องเล่นอ่านออกเสียง",
|
||||
"Read Aloud": "อ่านออกเสียง",
|
||||
"Voice": "เสียง",
|
||||
"Sleep Timer": "ตั้งเวลาปิด",
|
||||
"Slower": "ช้าลง",
|
||||
"Faster": "เร็วขึ้น",
|
||||
"Exit Auto Scroll": "ออกจากการเลื่อนอัตโนมัติ",
|
||||
"Auto Scroll": "เลื่อนอัตโนมัติ",
|
||||
"End of book": "จุดสิ้นสุดของหนังสือ",
|
||||
"Toggle Auto Scroll": "สลับการเลื่อนอัตโนมัติ"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Düzenle",
|
||||
"Excerpts": "Alıntılar",
|
||||
"Failed to import book(s): {{filenames}}": "Kitap(lar) içe aktarılamadı: {{filenames}}",
|
||||
"Fast": "Hızlı",
|
||||
"Font": "Yazı Tipi",
|
||||
"Font & Layout": "Yazı Tipi ve Düzen",
|
||||
"Font Face": "Yazı Tipi Yüzü",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}} olarak giriş yapıldı",
|
||||
"Match Case": "Büyük/Küçük Harf Eşleştir",
|
||||
"Match Diacritics": "Aksan İşaretlerini Eşleştir",
|
||||
"Match Whole Words": "Tam Kelimeleri Eşleştir",
|
||||
"Maximum Number of Columns": "Maksimum Sütun Sayısı",
|
||||
"Minimum Font Size": "Minimum Yazı Boyutu",
|
||||
"Monospace Font": "Eş Aralıklı Yazı Tipi",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Giriş Yap",
|
||||
"Sign Out": "Çıkış Yap",
|
||||
"Sky": "Gökyüzü",
|
||||
"Slow": "Yavaş",
|
||||
"Solarized": "Solarized",
|
||||
"Speak": "Konuş",
|
||||
"Subjects": "Konular",
|
||||
@@ -582,9 +579,6 @@
|
||||
"Start Migration": "Taşımayı Başlat",
|
||||
"Advanced Settings": "Gelişmiş Ayarlar",
|
||||
"File count: {{size}}": "Dosya sayısı: {{size}}",
|
||||
"Background Read Aloud": "Arka Planda Sesli Okuma",
|
||||
"Ready to read aloud": "Sesli okumaya hazır",
|
||||
"Read Aloud": "Sesli Oku",
|
||||
"Screen Brightness": "Ekran Parlaklığı",
|
||||
"Background Image": "Arka Plan Görüntüsü",
|
||||
"Import Image": "Görüntü İçe Aktar",
|
||||
@@ -880,7 +874,6 @@
|
||||
"Export": "Dışa Aktar",
|
||||
"Set Timeout": "Zaman aşımını ayarla",
|
||||
"Select Voice": "Ses seç",
|
||||
"Toggle Sticky Bottom TTS Bar": "Sabit TTS çubuğunu değiştir",
|
||||
"Display what I'm reading on Discord": "Discord'da okuduğumu göster",
|
||||
"Show on Discord": "Discord'da göster",
|
||||
"Instant {{action}}": "Anında {{action}}",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV kimlik doğrulaması başarısız. Ayarlar'dan yeniden bağlanın.",
|
||||
"Downloading": "İndiriliyor",
|
||||
"Uploading": "Yükleniyor",
|
||||
"downloaded {{n}} book(s)": "{{n}} kitap indirildi",
|
||||
"pushed {{n}} config(s)": "{{n}} yapılandırma gönderildi",
|
||||
"uploaded {{n}} new file(s)": "{{n}} yeni dosya yüklendi",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Eşitleme {{failed}} hatayla tamamlandı. {{ok}} başarılı.",
|
||||
"Sync complete": "Eşitleme tamamlandı",
|
||||
"Everything is already up to date.": "Her şey zaten güncel.",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} üzerinde {{path}} göz atılıyor",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Uzak dosyalarınıza göz atmak için bir WebDAV sunucusuna bağlanın.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Kitap dosyalarını yükle",
|
||||
"Sync now": "Şimdi eşitle",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Parolayı göster",
|
||||
"Root Directory": "Kök dizin",
|
||||
"Syncing…": "Eşitleniyor…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} kitap için ilerleme alındı",
|
||||
"Sync History": "Eşitleme geçmişi",
|
||||
"Clear Sync History": "Eşitleme geçmişini temizle",
|
||||
"No manual syncs yet": "Henüz manuel eşitleme yok",
|
||||
"Partial": "Kısmi",
|
||||
"Cleanup": "Temizlik",
|
||||
"Cleanup failed": "Temizlik başarısız",
|
||||
"Sync failed": "Eşitleme başarısız",
|
||||
"{{n}} deleted": "{{n}} silindi",
|
||||
"{{n}} failed": "{{n}} başarısız",
|
||||
"Nothing deleted": "Hiçbir şey silinmedi",
|
||||
"{{n}} downloaded": "{{n}} indirildi",
|
||||
"{{n}} uploaded": "{{n}} yüklendi",
|
||||
"{{n}} progress": "{{n}} ilerleme",
|
||||
"Up to date": "Güncel",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "İndirilen kitaplar",
|
||||
"Files uploaded": "Yüklenen dosyalar",
|
||||
"Configs uploaded": "Yüklenen yapılandırmalar",
|
||||
"Configs downloaded": "İndirilen yapılandırmalar",
|
||||
"Covers uploaded": "Yüklenen kapaklar",
|
||||
"Books deleted": "Silinen kitaplar",
|
||||
"Files in sync": "Eşitlenmiş dosyalar",
|
||||
"Failures": "Başarısızlıklar",
|
||||
"Total books": "Toplam kitap",
|
||||
"Error:": "Hata:",
|
||||
"Failed books": "Başarısız kitaplar",
|
||||
"Deleted {{n}} book(s) from server.": "Sunucudan {{n}} kitap silindi.",
|
||||
"Failed to load directory": "Dizin yüklenemedi",
|
||||
"File download is only supported on the desktop and mobile apps.": "Dosya indirme yalnızca masaüstü ve mobil uygulamalarda desteklenir.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Okuduğunuz makaleyi kitaplığınıza göndermek için Readest tarayıcı uzantısını yükleyin. Uzantı sayfayı tarayıcınızdan keser, bu sayede ödemeli ve yalnızca girişli siteler de çalışır.",
|
||||
"Added to your library. It will sync to your other devices.": "Kitaplığınıza eklendi. Diğer cihazlarınızla eşitlenecek.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Eşitleme parola tümcesi unutuldu. Tüm şifreli alanlar temizlendi.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Yalnızca manuel eşitlemeler ve temizlikler. Okuma sırasında otomatik eşitlemeler burada kaydedilmez.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV sunucusundan {{n}} kitap silinsin mi?\n\nBu yalnızca uzak dosyaları kaldırır; yerel kitaplığınız etkilenmez. Silme geri alınamaz. Sunucudaki veriler kalıcı olarak yok olur.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Kitap dosyalarını diğer cihazlarınıza yükler.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Yanlış eşitleme parola tümcesi. Eşitlenmiş kimlik bilgileri çözülemedi.",
|
||||
"Email books straight to your library": "Kitapları e-postayla doğrudan kitaplığınıza gönderin",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Ekleri ve makaleleri özel Readest adresinize iletin. Plus, Pro ve Lifetime planlarında kullanılabilir.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Okuma ilerlemesi, notlar ve yer işaretlerini de siler.",
|
||||
"Background Image (Library)": "Arka Plan Görüntüsü (Kütüphane)",
|
||||
"Background Image (Reader)": "Arka Plan Görüntüsü (Okuma Görünümü)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} kitabın meta verileri güncellendi",
|
||||
"{{n}} metadata": "{{n}} meta veri",
|
||||
"Metadata updated": "Meta veriler güncellendi",
|
||||
"Filter": "Filtrele",
|
||||
"Sort by": "Sıralama ölçütü",
|
||||
"Date modified": "Değiştirilme tarihi",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Ayrıntı düzeyi",
|
||||
"Refresh Page": "Sayfayı Yenile",
|
||||
"Recently read": "Son okunanlar",
|
||||
"Show recently read": "Son okunanları göster"
|
||||
"Show recently read": "Son okunanları göster",
|
||||
"Find:": "Bul:",
|
||||
"Enable rule": "Kuralı etkinleştir",
|
||||
"Disable rule": "Kuralı devre dışı bırak",
|
||||
"Progress Read": "Okuma İlerlemesi",
|
||||
"Auto-import new books from this folder": "Bu klasördeki yeni kitapları otomatik olarak içe aktar",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Bu klasöre yeni kitaplar eklendiğinde, Readest bir sonraki açılışında veya ön plana döndüğünde bunları otomatik olarak içe aktarır.",
|
||||
"Reading aloud": "Sesli okuma",
|
||||
"Open Book": "Kitabı Aç",
|
||||
"Stop reading aloud": "Sesli okumayı durdur",
|
||||
"Enter at least two words": "En az iki kelime girin",
|
||||
"Search failed": "Arama başarısız oldu",
|
||||
"Search with regex": "Regex ile ara",
|
||||
"Words to find near each other": "Birbirine yakın aranacak kelimeler",
|
||||
"Contains": "İçerir",
|
||||
"Whole Words": "Tam Kelimeler",
|
||||
"Regular Expression": "Düzenli İfade",
|
||||
"Nearby Words": "Yakın Kelimeler",
|
||||
"Within N words": "N kelime içinde",
|
||||
"Not for regex": "Regex için geçerli değil",
|
||||
"No results found": "Sonuç bulunamadı",
|
||||
"{{count}} results_one": "{{count}} sonuç",
|
||||
"{{count}} results_other": "{{count}} sonuç",
|
||||
"Failed to seek": "Atlama başarısız oldu",
|
||||
"Chapter progress": "Bölüm ilerlemesi",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "Kontrastı Azalt",
|
||||
"Reset Contrast": "Kontrastı Sıfırla",
|
||||
"Increase Contrast": "Kontrastı Artır",
|
||||
"Push": "İtme",
|
||||
"Slide": "Kaydırma",
|
||||
"Page Curl": "Sayfa Kıvırma",
|
||||
"Animation Style": "Animasyon Stili",
|
||||
"Appearance": "Görünüm",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Sözlük sonuçlarının metin boyutunu okuma görünümünden bağımsız olarak ayarlar.",
|
||||
"Authentication failed. Reconnect in Settings.": "Kimlik doğrulama başarısız oldu. Ayarlar'dan yeniden bağlanın.",
|
||||
"Full Sync": "Tam Senkronizasyon",
|
||||
"Waiting for sign-in…": "Giriş bekleniyor…",
|
||||
"Reconnect": "Yeniden Bağlan",
|
||||
"Connected as {{account}}": "{{account}} olarak bağlanıldı",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive'ı etkin bulut sağlayıcısı yapın.",
|
||||
"Use Google Drive": "Google Drive Kullan",
|
||||
"Sign-in opens in your browser.": "Giriş tarayıcınızda açılır.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest yalnızca Drive'ınızda kendi oluşturduğu dosyalara erişir.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı bir WebDAV sunucusuyla senkronize edin.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı Google Drive'ınızla senkronize edin.",
|
||||
"Configured": "Yapılandırıldı",
|
||||
"Use WebDAV": "WebDAV Kullan",
|
||||
"Cloud Sync": "Bulut Senkronizasyonu",
|
||||
"Extra Large": "Çok Büyük",
|
||||
"Hint size": "İpucu boyutu",
|
||||
"Gloss text size above the word": "Kelimenin üzerindeki açıklama metninin boyutu",
|
||||
"Hint color": "İpucu rengi",
|
||||
"Adjust Text Selection": "Metin Seçimini Ayarla",
|
||||
"Your books will appear here": "Kitaplarınız burada görünecek",
|
||||
"Reading aloud continues in the background": "Sesli okuma arka planda devam ediyor",
|
||||
"Stopped reading aloud": "Sesli okuma durduruldu",
|
||||
"Read aloud stopped": "Sesli okuma durdu",
|
||||
"Cloud provider switched": "Bulut sağlayıcı değiştirildi",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} senkronizasyonu seçili olduğu sürece Readest Cloud yüklemeleri duraklatılır",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Bulut senkronizasyon sağlayıcınız olduğu sürece {{provider}} tarafından yönetilir",
|
||||
"Not signed in": "Oturum açılmadı",
|
||||
"Paused — plan required": "Duraklatıldı — plan gerekli",
|
||||
"Active · Book file uploads off": "Etkin · Kitap dosyası yükleme kapalı",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Uygulama ayarları, okuma istatistikleri ve sözlükler, oturum açık olduğu sürece Readest hesabınız üzerinden senkronize edilmeye devam eder.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı Readest Cloud ile senkronize edin.",
|
||||
"Account and Storage": "Hesap ve depolama",
|
||||
"Manage your plan and stored files": "Planınızı ve depolanan dosyalarınızı yönetin",
|
||||
"Cloud sync provider": "Bulut senkronizasyon sağlayıcısı",
|
||||
"Use Readest Cloud": "Readest Cloud kullan",
|
||||
"Another device is still syncing this library via Readest Cloud": "Başka bir cihaz bu kütüphaneyi hâlâ Readest Cloud üzerinden senkronize ediyor",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} yükleme başarısız: yetersiz depolama kotası",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} yükleme başarısız: yetersiz depolama kotası",
|
||||
"Library sync via {{provider}}": "{{provider}} ile kitaplık eşitleme",
|
||||
"Google Drive session expired": "Google Drive oturumunun süresi doldu",
|
||||
"Cloud sync session expired": "Bulut eşitleme oturumunun süresi doldu",
|
||||
"Uploads book files to your other devices": "Kitap dosyalarını diğer cihazlarınıza yükler",
|
||||
"Re-check every book instead of only changed ones": "Yalnızca değişenleri değil her kitabı yeniden denetle",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket bulunamadı",
|
||||
"Endpoint": "Uç nokta",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Bölge",
|
||||
"Access Key ID": "Erişim Anahtarı Kimliği",
|
||||
"Your Access Key ID": "Erişim Anahtarı Kimliğiniz",
|
||||
"Secret Access Key": "Gizli Erişim Anahtarı",
|
||||
"Your Secret Access Key": "Gizli Erişim Anahtarınız",
|
||||
"S3-Compatible Storage": "S3 uyumlu depolama",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Kitaplığınızı, okuma ilerlemenizi ve vurgularınızı Cloudflare R2, AWS S3 veya MinIO gibi S3 uyumlu bir bucket ile senkronize edin.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Tarayıcıda, bucket'ın CORS politikası bu sitenin kaynağına izin vermelidir.",
|
||||
"Use S3": "S3 kullan",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Bağlanmadan önce bucket'ın var olduğundan ve kimlik bilgilerinin okuma/yazma erişimine sahip olduğundan emin olun.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} seçili olduğunda kitaplar, ilerleme ve açıklamalar yalnızca sunucunuzla senkronize edilir.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} seçili olduğunda kitaplar, ilerleme ve açıklamalar yalnızca Drive'ınızla senkronize edilir.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} seçili olduğunda kitaplar, ilerleme ve açıklamalar yalnızca bucket'ınızla senkronize edilir.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "S3 depolama",
|
||||
"Speed": "Hız",
|
||||
"{{time}} left in chapter": "Bölümde {{time}} kaldı",
|
||||
"Open Read Aloud player": "Sesli okuma oynatıcısını aç",
|
||||
"Read Aloud": "Sesli Okuma",
|
||||
"Voice": "Ses",
|
||||
"Sleep Timer": "Uyku Zamanlayıcısı",
|
||||
"Slower": "Daha yavaş",
|
||||
"Faster": "Daha hızlı",
|
||||
"Exit Auto Scroll": "Otomatik kaydırmadan çık",
|
||||
"Auto Scroll": "Otomatik Kaydırma",
|
||||
"End of book": "Kitabın sonu",
|
||||
"Toggle Auto Scroll": "Otomatik kaydırmayı aç/kapat"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Редагувати",
|
||||
"Excerpts": "Уривки",
|
||||
"Failed to import book(s): {{filenames}}": "Не вдалося імпортувати книгу(и): {{filenames}}",
|
||||
"Fast": "Швидко",
|
||||
"Font": "Шрифт",
|
||||
"Font & Layout": "Шрифт та макет",
|
||||
"Font Face": "Налаштування шрифту",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Увійдено як {{userDisplayName}}",
|
||||
"Match Case": "Враховувати реґістр",
|
||||
"Match Diacritics": "Враховувати діакритичні знаки",
|
||||
"Match Whole Words": "Шукати цілі слова",
|
||||
"Maximum Number of Columns": "Максимальна кількість колонок",
|
||||
"Minimum Font Size": "Мінімальний розмір шрифту",
|
||||
"Monospace Font": "Моноширинний шрифт",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Увійти",
|
||||
"Sign Out": "Вийти",
|
||||
"Sky": "Небесний",
|
||||
"Slow": "Повільно",
|
||||
"Solarized": "Сонячний",
|
||||
"Speak": "Озвучити",
|
||||
"Subjects": "Жанри",
|
||||
@@ -590,9 +587,6 @@
|
||||
"Start Migration": "Почати переміщення",
|
||||
"Advanced Settings": "Розширені налаштування",
|
||||
"File count: {{size}}": "Кількість файлів: {{size}}",
|
||||
"Background Read Aloud": "Озвучування у фоновому режимі",
|
||||
"Ready to read aloud": "Готовність до читання вголос",
|
||||
"Read Aloud": "Читати вголос",
|
||||
"Screen Brightness": "Яскравість екрану",
|
||||
"Background Image": "Фонове зображення",
|
||||
"Import Image": "Імпортувати зображення",
|
||||
@@ -902,7 +896,6 @@
|
||||
"Export": "Експортувати",
|
||||
"Set Timeout": "Встановити тайм-аут",
|
||||
"Select Voice": "Вибрати голос",
|
||||
"Toggle Sticky Bottom TTS Bar": "Перемкнути закріплену панель TTS",
|
||||
"Display what I'm reading on Discord": "Показувати книгу в Discord",
|
||||
"Show on Discord": "Показати в Discord",
|
||||
"Instant {{action}}": "Швидка дія: {{action}}",
|
||||
@@ -1589,14 +1582,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Не вдалося пройти автентифікацію WebDAV. Підключіться знову в Налаштуваннях.",
|
||||
"Downloading": "Завантаження",
|
||||
"Uploading": "Вивантаження",
|
||||
"downloaded {{n}} book(s)": "завантажено {{n}} книг",
|
||||
"pushed {{n}} config(s)": "надіслано {{n}} конфігурацій",
|
||||
"uploaded {{n}} new file(s)": "вивантажено {{n}} нових файлів",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Синхронізацію завершено з {{failed}} помилок. {{ok}} успішно.",
|
||||
"Sync complete": "Синхронізацію завершено",
|
||||
"Everything is already up to date.": "Усе вже актуально.",
|
||||
"Browsing {{path}} on {{server}}": "Перегляд {{path}} на {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Підключіться до сервера WebDAV, щоб переглядати віддалені файли.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Вивантажити файли книг",
|
||||
"Sync now": "Синхронізувати зараз",
|
||||
@@ -1604,33 +1590,8 @@
|
||||
"Show password": "Показати пароль",
|
||||
"Root Directory": "Кореневий каталог",
|
||||
"Syncing…": "Синхронізація…",
|
||||
"pulled progress for {{n}} book(s)": "отримано прогрес для {{n}} книг",
|
||||
"Sync History": "Історія синхронізації",
|
||||
"Clear Sync History": "Очистити історію синхронізації",
|
||||
"No manual syncs yet": "Ручних синхронізацій поки немає",
|
||||
"Partial": "Частково",
|
||||
"Cleanup": "Очищення",
|
||||
"Cleanup failed": "Очищення не вдалося",
|
||||
"Sync failed": "Синхронізація не вдалася",
|
||||
"{{n}} deleted": "{{n}} видалено",
|
||||
"{{n}} failed": "{{n}} з помилкою",
|
||||
"Nothing deleted": "Нічого не видалено",
|
||||
"{{n}} downloaded": "{{n}} завантажено",
|
||||
"{{n}} uploaded": "{{n}} вивантажено",
|
||||
"{{n}} progress": "{{n}} прогрес",
|
||||
"Up to date": "Актуально",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Завантажені книги",
|
||||
"Files uploaded": "Вивантажені файли",
|
||||
"Configs uploaded": "Вивантажені конфігурації",
|
||||
"Configs downloaded": "Завантажені конфігурації",
|
||||
"Covers uploaded": "Вивантажені обкладинки",
|
||||
"Books deleted": "Видалені книги",
|
||||
"Files in sync": "Синхронізовані файли",
|
||||
"Failures": "Помилки",
|
||||
"Total books": "Усього книг",
|
||||
"Error:": "Помилка:",
|
||||
"Failed books": "Книги з помилкою",
|
||||
"Deleted {{n}} book(s) from server.": "Видалено {{n}} книг із сервера.",
|
||||
"Failed to load directory": "Не вдалося завантажити теку",
|
||||
"File download is only supported on the desktop and mobile apps.": "Завантаження файлів підтримується лише в настільному та мобільному застосунках.",
|
||||
@@ -1660,10 +1621,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Встановіть розширення браузера Readest, щоб надсилати статтю, яку ви читаєте, до бібліотеки. Розширення вирізає сторінку з вашого браузера, тому платні та логін-only сайти також працюють.",
|
||||
"Added to your library. It will sync to your other devices.": "Додано до вашої бібліотеки. Синхронізується з іншими пристроями.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Парольну фразу синхронізації забуто. Усі зашифровані поля очищено.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Лише ручні синхронізації та очищення. Автоматичні синхронізації під час читання тут не записуються.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Видалити {{n}} книг із сервера WebDAV?\n\nЦе видалить лише віддалені файли; ваша локальна бібліотека не зміниться. Видалення неможливо скасувати. Дані на сервері зникнуть назавжди.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Вивантажує файли книг на ваші інші пристрої.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Неправильна парольна фраза синхронізації. Не вдалося розшифрувати синхронізовані облікові дані.",
|
||||
"Email books straight to your library": "Надсилайте книги електронною поштою прямо в бібліотеку",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Пересилайте вкладення та статті на свою приватну адресу Readest. Доступно в планах Plus, Pro і Lifetime.",
|
||||
@@ -1858,9 +1817,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Також видаляє проґрес читання, нотатки та закладки.",
|
||||
"Background Image (Library)": "Фонове зображення (Бібліотека)",
|
||||
"Background Image (Reader)": "Фонове зображення (Режим читання)",
|
||||
"updated metadata for {{n}} book(s)": "оновлено метадані для {{n}} книг",
|
||||
"{{n}} metadata": "{{n}} метадані",
|
||||
"Metadata updated": "Метадані оновлено",
|
||||
"Filter": "Фільтр",
|
||||
"Sort by": "Сортувати за",
|
||||
"Date modified": "Дата зміни",
|
||||
@@ -1875,5 +1831,119 @@
|
||||
"Granularity": "Деталізація",
|
||||
"Refresh Page": "Оновити сторінку",
|
||||
"Recently read": "Нещодавно прочитані",
|
||||
"Show recently read": "Показувати нещодавно прочитані"
|
||||
"Show recently read": "Показувати нещодавно прочитані",
|
||||
"Find:": "Знайти:",
|
||||
"Enable rule": "Увімкнути правило",
|
||||
"Disable rule": "Вимкнути правило",
|
||||
"Progress Read": "Проґрес читання",
|
||||
"Auto-import new books from this folder": "Автоматично імпортувати нові книги з цієї папки",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Коли до цієї папки додаються нові книги, вони будуть автоматично імпортовані під час наступного запуску Readest або його повернення на передній план.",
|
||||
"Reading aloud": "Читання вголос",
|
||||
"Open Book": "Відкрити книгу",
|
||||
"Stop reading aloud": "Зупинити читання вголос",
|
||||
"Enter at least two words": "Введіть щонайменше два слова",
|
||||
"Search failed": "Не вдалося виконати пошук",
|
||||
"Search with regex": "Пошук за регулярним виразом",
|
||||
"Words to find near each other": "Слова, які потрібно знайти поруч",
|
||||
"Contains": "Містить",
|
||||
"Whole Words": "Цілі слова",
|
||||
"Regular Expression": "Регулярний вираз",
|
||||
"Nearby Words": "Слова поруч",
|
||||
"Within N words": "У межах N слів",
|
||||
"Not for regex": "Не для регулярних виразів",
|
||||
"No results found": "Нічого не знайдено",
|
||||
"{{count}} results_one": "{{count}} результат",
|
||||
"{{count}} results_few": "{{count}} результати",
|
||||
"{{count}} results_many": "{{count}} результатів",
|
||||
"{{count}} results_other": "{{count}} результата",
|
||||
"Failed to seek": "Не вдалося перемотати",
|
||||
"Chapter progress": "Проґрес розділу",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} з {{total}}",
|
||||
"Decrease Contrast": "Зменшити контраст",
|
||||
"Reset Contrast": "Скинути контраст",
|
||||
"Increase Contrast": "Збільшити контраст",
|
||||
"Push": "Зсув",
|
||||
"Slide": "Ковзання",
|
||||
"Page Curl": "Загин сторінки",
|
||||
"Animation Style": "Стиль анімації",
|
||||
"Appearance": "Зовнішній вигляд",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Визначає розмір тексту результатів словника незалежно від області читання.",
|
||||
"Authentication failed. Reconnect in Settings.": "Помилка автентифікації. Повторно під'єднайтеся в налаштуваннях.",
|
||||
"Full Sync": "Повна синхронізація",
|
||||
"Waiting for sign-in…": "Очікування входу…",
|
||||
"Reconnect": "Під'єднатися повторно",
|
||||
"Connected as {{account}}": "Під'єднано як {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Зробити Google Drive активним хмарним провайдером.",
|
||||
"Use Google Drive": "Використовувати Google Drive",
|
||||
"Sign-in opens in your browser.": "Вхід відкриється у вашому браузері.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest має доступ лише до файлів, які сам створює у вашому Google Drive.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення із сервером WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення з вашим Google Drive.",
|
||||
"Configured": "Налаштовано",
|
||||
"Use WebDAV": "Використовувати WebDAV",
|
||||
"Cloud Sync": "Хмарна синхронізація",
|
||||
"Extra Large": "Дуже великий",
|
||||
"Hint size": "Розмір підказки",
|
||||
"Gloss text size above the word": "Розмір тексту підказки над словом",
|
||||
"Hint color": "Колір підказки",
|
||||
"Adjust Text Selection": "Коригування виділення тексту",
|
||||
"Your books will appear here": "Тут з'являться ваші книги",
|
||||
"Reading aloud continues in the background": "Читання вголос триває у фоновому режимі",
|
||||
"Stopped reading aloud": "Читання вголос зупинено",
|
||||
"Read aloud stopped": "Озвучування зупинено",
|
||||
"Cloud provider switched": "Хмарного провайдера змінено",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Вивантаження до Readest Cloud призупинено, поки вибрано синхронізацію {{provider}}",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Керується {{provider}}, поки це ваш провайдер хмарної синхронізації",
|
||||
"Not signed in": "Не виконано вхід",
|
||||
"Paused — plan required": "Призупинено — потрібен тарифний план",
|
||||
"Active · Book file uploads off": "Активно · Вивантаження файлів книг вимкнено",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Налаштування застосунку, статистика читання та словники й далі синхронізуються через ваш обліковий запис Readest, поки ви ввійшли.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення з Readest Cloud.",
|
||||
"Account and Storage": "Обліковий запис і сховище",
|
||||
"Manage your plan and stored files": "Керуйте своїм тарифом і збереженими файлами",
|
||||
"Cloud sync provider": "Провайдер хмарної синхронізації",
|
||||
"Use Readest Cloud": "Використовувати Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Інший пристрій усе ще синхронізує цю бібліотеку через Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} вивантаження не вдалося: недостатньо місця у сховищі",
|
||||
"{{count}} uploads failed: insufficient storage quota_few": "{{count}} вивантаження не вдалися: недостатньо місця у сховищі",
|
||||
"{{count}} uploads failed: insufficient storage quota_many": "{{count}} вивантажень не вдалися: недостатньо місця у сховищі",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} вивантаження не вдалося: недостатньо місця у сховищі",
|
||||
"Library sync via {{provider}}": "Синхронізація бібліотеки через {{provider}}",
|
||||
"Google Drive session expired": "Сеанс Google Drive завершився",
|
||||
"Cloud sync session expired": "Сеанс хмарної синхронізації завершився",
|
||||
"Uploads book files to your other devices": "Завантажує файли книжок на інші ваші пристрої",
|
||||
"Re-check every book instead of only changed ones": "Повторно перевіряти кожну книжку, а не лише змінені",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Бакет не знайдено",
|
||||
"Endpoint": "Кінцева точка",
|
||||
"Bucket": "Бакет",
|
||||
"Region": "Регіон",
|
||||
"Access Key ID": "ID ключа доступу",
|
||||
"Your Access Key ID": "Ваш ID ключа доступу",
|
||||
"Secret Access Key": "Секретний ключ доступу",
|
||||
"Your Secret Access Key": "Ваш секретний ключ доступу",
|
||||
"S3-Compatible Storage": "S3-сумісне сховище",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Синхронізуйте бібліотеку, прогрес читання та виділення з S3-сумісним бакетом, наприклад Cloudflare R2, AWS S3 або MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "У браузері політика CORS бакета має дозволяти джерело цього сайту.",
|
||||
"Use S3": "Використовувати S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Перед підключенням переконайтеся, що бакет існує, а облікові дані мають доступ на читання й запис.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Поки вибрано {{provider}}, книги, прогрес і анотації синхронізуються лише з вашим сервером.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Поки вибрано {{provider}}, книги, прогрес і анотації синхронізуються лише з вашим Drive.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Поки вибрано {{provider}}, книги, прогрес і анотації синхронізуються лише з вашим бакетом.",
|
||||
"Premium": "Преміум",
|
||||
"S3 Storage": "Сховище S3",
|
||||
"Speed": "Швидкість",
|
||||
"{{time}} left in chapter": "Залишилося {{time}} у розділі",
|
||||
"Open Read Aloud player": "Відкрити програвач читання вголос",
|
||||
"Read Aloud": "Читання вголос",
|
||||
"Voice": "Голос",
|
||||
"Sleep Timer": "Таймер сну",
|
||||
"Slower": "Повільніше",
|
||||
"Faster": "Швидше",
|
||||
"Exit Auto Scroll": "Вийти з автоматичної прокрутки",
|
||||
"Auto Scroll": "Автоматична прокрутка",
|
||||
"End of book": "Кінець книги",
|
||||
"Toggle Auto Scroll": "Перемкнути автоматичну прокрутку"
|
||||
}
|
||||
|
||||
@@ -160,7 +160,6 @@
|
||||
"Fullscreen": "Toʻliq ekran",
|
||||
"Always on Top": "Doimo yuqorida",
|
||||
"Always Show Status Bar": "Holat panelini doimo koʻrsatish",
|
||||
"Background Read Aloud": "Fonda ovoz chiqarib oʻqish",
|
||||
"Settings": "Sozlamalar",
|
||||
"Advanced Settings": "Kengaytirilgan sozlamalar",
|
||||
"Refresh Metadata": "Metamaʼlumotlarni yangilash",
|
||||
@@ -659,7 +658,6 @@
|
||||
"Clear search history": "Qidiruv tarixini tozalash",
|
||||
"Chapter": "Bob",
|
||||
"Match Case": "Registrga mos kelishi",
|
||||
"Match Whole Words": "Butun soʻzlarga mos kelishi",
|
||||
"Match Diacritics": "Diakritik belgilarga mos kelishi",
|
||||
"Search results for '{{term}}'": "'{{term}}' uchun qidiruv natijalari",
|
||||
"Previous Result": "Oldingi natija",
|
||||
@@ -691,13 +689,10 @@
|
||||
"{{value}} hour": "{{value}} soat",
|
||||
"{{value}} hours": "{{value}} soat",
|
||||
"Voices for {{lang}}": "{{lang}} uchun ovozlar",
|
||||
"Slow": "Sekin",
|
||||
"Fast": "Tez",
|
||||
"Set Timeout": "Vaqt cheklovini belgilash",
|
||||
"Select Voice": "Ovozni tanlash",
|
||||
"{{engine}}: {{count}} voices_one": "{{engine}}: {{count}} ovoz",
|
||||
"{{engine}}: {{count}} voices_other": "{{engine}}: {{count}} ovoz",
|
||||
"Toggle Sticky Bottom TTS Bar": "Pastki yopishqoq TTS panelini ochish/yopish",
|
||||
"Zoom Level": "Kattalashtirish darajasi",
|
||||
"Zoom Out": "Kichraytirish",
|
||||
"Reset Zoom": "Kattalashtirishni tiklash",
|
||||
@@ -733,8 +728,6 @@
|
||||
"Translating...": "Tarjima qilinmoqda...",
|
||||
"Please log in to use advanced TTS features": "Kengaytirilgan TTS xususiyatlaridan foydalanish uchun tizimga kiring",
|
||||
"TTS not supported for this document": "Ushbu hujjat uchun TTS qoʻllab-quvvatlanmaydi",
|
||||
"Read Aloud": "Ovoz chiqarib oʻqish",
|
||||
"Ready to read aloud": "Ovoz chiqarib oʻqishga tayyor",
|
||||
"Expires in {{count}} days_one": "{{count}} kunda muddati tugaydi",
|
||||
"Expires in {{count}} days_other": "{{count}} kunda muddati tugaydi",
|
||||
"Expires in {{count}} hours_one": "{{count}} soatda muddati tugaydi",
|
||||
@@ -1531,14 +1524,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV autentifikatsiyasi muvaffaqiyatsiz. Sozlamalardan qayta ulanish.",
|
||||
"Downloading": "Yuklab olinmoqda",
|
||||
"Uploading": "Yuklanmoqda",
|
||||
"downloaded {{n}} book(s)": "{{n}} ta kitob yuklab olindi",
|
||||
"pushed {{n}} config(s)": "{{n}} ta konfiguratsiya yuborildi",
|
||||
"uploaded {{n}} new file(s)": "{{n}} ta yangi fayl yuklandi",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Sinxronlash {{failed}} ta xato bilan tugadi. {{ok}} ta muvaffaqiyatli.",
|
||||
"Sync complete": "Sinxronlash tugadi",
|
||||
"Everything is already up to date.": "Hammasi allaqachon yangilangan.",
|
||||
"Browsing {{path}} on {{server}}": "{{server}} dagi {{path}} ko'rib chiqilmoqda",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Masofaviy fayllaringizni ko'rish uchun WebDAV serveriga ulanish.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Kitob fayllarini yuklash",
|
||||
"Sync now": "Hozir sinxronlash",
|
||||
@@ -1546,33 +1532,8 @@
|
||||
"Show password": "Parolni ko'rsatish",
|
||||
"Root Directory": "Asosiy katalog",
|
||||
"Syncing…": "Sinxronlanmoqda…",
|
||||
"pulled progress for {{n}} book(s)": "{{n}} ta kitob jarayoni olindi",
|
||||
"Sync History": "Sinxronlash tarixi",
|
||||
"Clear Sync History": "Sinxronlash tarixini tozalash",
|
||||
"No manual syncs yet": "Hali qo'lda sinxronlashlar yo'q",
|
||||
"Partial": "Qisman",
|
||||
"Cleanup": "Tozalash",
|
||||
"Cleanup failed": "Tozalash muvaffaqiyatsiz",
|
||||
"Sync failed": "Sinxronlash muvaffaqiyatsiz",
|
||||
"{{n}} deleted": "{{n}} ta o'chirildi",
|
||||
"{{n}} failed": "{{n}} ta xato",
|
||||
"Nothing deleted": "Hech narsa o'chirilmadi",
|
||||
"{{n}} downloaded": "{{n}} ta yuklab olindi",
|
||||
"{{n}} uploaded": "{{n}} ta yuklandi",
|
||||
"{{n}} progress": "{{n}} ta jarayon",
|
||||
"Up to date": "Yangilangan",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Yuklab olingan kitoblar",
|
||||
"Files uploaded": "Yuklangan fayllar",
|
||||
"Configs uploaded": "Yuklangan konfiguratsiyalar",
|
||||
"Configs downloaded": "Yuklab olingan konfiguratsiyalar",
|
||||
"Covers uploaded": "Yuklangan muqovalar",
|
||||
"Books deleted": "O'chirilgan kitoblar",
|
||||
"Files in sync": "Sinxronlangan fayllar",
|
||||
"Failures": "Xatolar",
|
||||
"Total books": "Jami kitoblar",
|
||||
"Error:": "Xato:",
|
||||
"Failed books": "Xatolik kitoblar",
|
||||
"Deleted {{n}} book(s) from server.": "Serverdan {{n}} ta kitob o'chirildi.",
|
||||
"Failed to load directory": "Katalogni yuklab bo'lmadi",
|
||||
"File download is only supported on the desktop and mobile apps.": "Fayllarni yuklab olish faqat ish stoli va mobil ilovalarda qo'llab-quvvatlanadi.",
|
||||
@@ -1600,10 +1561,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "O'qiyotgan maqolangizni kutubxonangizga yuborish uchun Readest brauzer kengaytmasini o'rnating. Kengaytma sahifani brauzeringizdan kesib oladi, shu sababli pulli va kirish talab qiladigan saytlar ham ishlaydi.",
|
||||
"Added to your library. It will sync to your other devices.": "Kutubxonangizga qo'shildi. Boshqa qurilmalaringizga sinxronlanadi.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Sinxronlash parol iborasi unutildi. Barcha shifrlangan maydonlar tozalandi.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Faqat qo'lda sinxronlashlar va tozalashlar. O'qish paytidagi avtomatik sinxronlashlar bu yerda qayd etilmaydi.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "WebDAV serveridan {{n}} ta kitob o'chirilsinmi?\n\nBu faqat masofaviy fayllarni o'chiradi; mahalliy kutubxonangiz ta'sirlanmaydi. O'chirishni bekor qilib bo'lmaydi. Serverdagi ma'lumotlar mangulikka yo'qoladi.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Kitob fayllarini boshqa qurilmalaringizga yuklaydi.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Noto'g'ri sinxronlash parol iborasi. Sinxronlangan hisob ma'lumotlarini parolini ochib bo'lmadi.",
|
||||
"Email books straight to your library": "Kitoblarni elektron pochta orqali to'g'ridan-to'g'ri kutubxonangizga yuboring",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Ilovalar va maqolalarni shaxsiy Readest manzilingizga yuboring. Plus, Pro va Lifetime tariflarida mavjud.",
|
||||
@@ -1792,9 +1751,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Shuningdek, oʻqish jarayoni, eslatmalar va xatchoʻplarni ham oʻchiradi.",
|
||||
"Background Image (Library)": "Fon rasmi (Kutubxona)",
|
||||
"Background Image (Reader)": "Fon rasmi (Oʻqish koʻrinishi)",
|
||||
"updated metadata for {{n}} book(s)": "{{n}} ta kitob metamaʼlumotlari yangilandi",
|
||||
"{{n}} metadata": "{{n}} metamaʼlumot",
|
||||
"Metadata updated": "Metamaʼlumotlar yangilandi",
|
||||
"Filter": "Filtr",
|
||||
"Sort by": "Saralash tartibi",
|
||||
"Date modified": "Oʻzgartirilgan sana",
|
||||
@@ -1809,5 +1765,115 @@
|
||||
"Granularity": "Tafsilot darajasi",
|
||||
"Refresh Page": "Sahifani yangilash",
|
||||
"Recently read": "Yaqinda o'qilgan",
|
||||
"Show recently read": "Yaqinda o'qilganlarni ko'rsatish"
|
||||
"Show recently read": "Yaqinda o'qilganlarni ko'rsatish",
|
||||
"Find:": "Topish:",
|
||||
"Enable rule": "Qoidani yoqish",
|
||||
"Disable rule": "Qoidani o‘chirish",
|
||||
"Progress Read": "Oʻqish jarayoni",
|
||||
"Auto-import new books from this folder": "Bu papkadan yangi kitoblarni avtomatik import qilish",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Bu papkaga yangi kitoblar qoʻshilganda, Readest keyingi safar ochilganda yoki qayta faollashganda ular avtomatik import qilinadi.",
|
||||
"Reading aloud": "Ovoz chiqarib oʻqilmoqda",
|
||||
"Open Book": "Kitobni ochish",
|
||||
"Stop reading aloud": "Ovoz chiqarib oʻqishni toʻxtatish",
|
||||
"Enter at least two words": "Kamida ikkita soʻz kiriting",
|
||||
"Search failed": "Qidirib boʻlmadi",
|
||||
"Search with regex": "Regex bilan qidirish",
|
||||
"Words to find near each other": "Bir-biriga yaqin qidiriladigan soʻzlar",
|
||||
"Contains": "Oʻz ichiga oladi",
|
||||
"Whole Words": "Butun soʻzlar",
|
||||
"Regular Expression": "Regulyar ifoda",
|
||||
"Nearby Words": "Yaqin soʻzlar",
|
||||
"Within N words": "N soʻz ichida",
|
||||
"Not for regex": "Regex uchun emas",
|
||||
"No results found": "Natijalar topilmadi",
|
||||
"{{count}} results_one": "{{count}} ta natija",
|
||||
"{{count}} results_other": "{{count}} ta natija",
|
||||
"Failed to seek": "Kerakli joyga oʻtib boʻlmadi",
|
||||
"Chapter progress": "Bob jarayoni",
|
||||
"{{elapsed}} of {{total}}": "{{total}} dan {{elapsed}}",
|
||||
"Decrease Contrast": "Kontrastni kamaytirish",
|
||||
"Reset Contrast": "Kontrastni tiklash",
|
||||
"Increase Contrast": "Kontrastni oshirish",
|
||||
"Push": "Itarish",
|
||||
"Slide": "Sirpanish",
|
||||
"Page Curl": "Varaqlash",
|
||||
"Animation Style": "Animatsiya uslubi",
|
||||
"Appearance": "Koʻrinish",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Lugʻat natijalari matn oʻlchamini oʻqish koʻrinishidan mustaqil belgilaydi.",
|
||||
"Authentication failed. Reconnect in Settings.": "Autentifikatsiya muvaffaqiyatsiz. Sozlamalardan qayta ulaning.",
|
||||
"Full Sync": "Toʻliq sinxronlash",
|
||||
"Waiting for sign-in…": "Kirish kutilmoqda…",
|
||||
"Reconnect": "Qayta ulanish",
|
||||
"Connected as {{account}}": "{{account}} sifatida ulangan",
|
||||
". Make Google Drive the active cloud provider.": ". Google Drive-ni faol bulut provayderi qiling.",
|
||||
"Use Google Drive": "Google Drive-dan foydalanish",
|
||||
"Sign-in opens in your browser.": "Kirish brauzeringizda ochiladi.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest Drive-ingizda faqat oʻzi yaratgan fayllarga kiradi.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni WebDAV serveri bilan sinxronlang.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni Google Drive bilan sinxronlang.",
|
||||
"Configured": "Sozlangan",
|
||||
"Use WebDAV": "WebDAV-dan foydalanish",
|
||||
"Cloud Sync": "Bulutli sinxronlash",
|
||||
"Extra Large": "Juda katta",
|
||||
"Hint size": "Izoh oʻlchami",
|
||||
"Gloss text size above the word": "Soʻz ustida koʻrsatiladigan izoh matni oʻlchami",
|
||||
"Hint color": "Izoh rangi",
|
||||
"Adjust Text Selection": "Matn tanlovini sozlash",
|
||||
"Your books will appear here": "Kitoblaringiz shu yerda paydo boʻladi",
|
||||
"Reading aloud continues in the background": "Ovoz chiqarib oʻqish fonda davom etadi",
|
||||
"Stopped reading aloud": "Ovoz chiqarib oʻqish toʻxtatildi",
|
||||
"Read aloud stopped": "Ovoz chiqarib oʻqish toʻxtadi",
|
||||
"Cloud provider switched": "Bulut provayderi almashtirildi",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "{{provider}} sinxronlash tanlangan paytda Readest Cloudga yuklashlar toʻxtatib turiladi",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "{{provider}} sizning bulutli sinxronlash provayderingiz boʻlib turgan paytda u tomonidan boshqariladi",
|
||||
"Not signed in": "Tizimga kirilmagan",
|
||||
"Paused — plan required": "Toʻxtatilgan — tarif reja kerak",
|
||||
"Active · Book file uploads off": "Faol · Kitob fayllarini yuklash oʻchirilgan",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Ilova sozlamalari, oʻqish statistikasi va lugʻatlar tizimga kirgan paytingizda Readest hisobingiz orqali sinxronlanishda davom etadi.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni Readest Cloud bilan sinxronlang.",
|
||||
"Account and Storage": "Hisob va xotira",
|
||||
"Manage your plan and stored files": "Tarif reja va saqlangan fayllarni boshqaring",
|
||||
"Cloud sync provider": "Bulutli sinxronlash provayderi",
|
||||
"Use Readest Cloud": "Readest Clouddan foydalanish",
|
||||
"Another device is still syncing this library via Readest Cloud": "Boshqa qurilma hali ham bu kutubxonani Readest Cloud orqali sinxronlamoqda",
|
||||
"{{count}} uploads failed: insufficient storage quota_one": "{{count}} ta yuklash muvaffaqiyatsiz: yetarli xotira kvotasi yoʻq",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} ta yuklash muvaffaqiyatsiz: yetarli xotira kvotasi yoʻq",
|
||||
"Library sync via {{provider}}": "Kutubxona {{provider}} orqali sinxronlashtiriladi",
|
||||
"Google Drive session expired": "Google Drive seansi muddati tugadi",
|
||||
"Cloud sync session expired": "Bulutli sinxronlash seansi muddati tugadi",
|
||||
"Uploads book files to your other devices": "Kitob fayllarini boshqa qurilmalaringizga yuklaydi",
|
||||
"Re-check every book instead of only changed ones": "Faqat o'zgarganlar o'rniga har bir kitobni qayta tekshirish",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Bucket topilmadi",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Mintaqa",
|
||||
"Access Key ID": "Kirish kaliti ID",
|
||||
"Your Access Key ID": "Kirish kaliti ID'ingiz",
|
||||
"Secret Access Key": "Maxfiy kirish kaliti",
|
||||
"Your Secret Access Key": "Maxfiy kirish kalitingiz",
|
||||
"S3-Compatible Storage": "S3 bilan mos saqlash",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Kutubxonangiz, o'qish jarayoni va belgilaringizni Cloudflare R2, AWS S3 yoki MinIO kabi S3 bilan mos bucket bilan sinxronlang.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Brauzerda bucketning CORS siyosati ushbu sayt originiga ruxsat berishi kerak.",
|
||||
"Use S3": "S3 dan foydalanish",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Ulanishdan oldin bucket mavjudligiga va hisob ma'lumotlari o‘qish/yozish huquqiga ega ekaniga ishonch hosil qiling.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "{{provider}} tanlangan paytda kitoblar, jarayon va izohlar faqat serveringizga sinxronlanadi.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "{{provider}} tanlangan paytda kitoblar, jarayon va izohlar faqat Drive'ingizga sinxronlanadi.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "{{provider}} tanlangan paytda kitoblar, jarayon va izohlar faqat bucketingizga sinxronlanadi.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "S3 saqlash",
|
||||
"Speed": "Tezlik",
|
||||
"{{time}} left in chapter": "Bobda {{time}} qoldi",
|
||||
"Open Read Aloud player": "Ovoz chiqarib oʻqish pleyerini ochish",
|
||||
"Read Aloud": "Ovoz chiqarib oʻqish",
|
||||
"Voice": "Ovoz",
|
||||
"Sleep Timer": "Uyqu taymeri",
|
||||
"Slower": "Sekinroq",
|
||||
"Faster": "Tezroq",
|
||||
"Exit Auto Scroll": "Avtomatik aylantirishdan chiqish",
|
||||
"Auto Scroll": "Avtomatik aylantirish",
|
||||
"End of book": "Kitob oxiri",
|
||||
"Toggle Auto Scroll": "Avtomatik aylantirishni ochish/yopish"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "Chỉnh sửa",
|
||||
"Excerpts": "Trích dẫn",
|
||||
"Failed to import book(s): {{filenames}}": "Không thể nhập sách: {{filenames}}",
|
||||
"Fast": "Nhanh",
|
||||
"Font": "Phông chữ",
|
||||
"Font & Layout": "Phông chữ & Bố cục",
|
||||
"Font Face": "Kiểu chữ",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "Đăng nhập với tên {{userDisplayName}}",
|
||||
"Match Case": "Phân biệt chữ hoa/thường",
|
||||
"Match Diacritics": "Phân biệt dấu",
|
||||
"Match Whole Words": "Khớp toàn bộ từ",
|
||||
"Maximum Number of Columns": "Số cột tối đa",
|
||||
"Minimum Font Size": "Cỡ chữ tối thiểu",
|
||||
"Monospace Font": "Phông chữ đơn cách",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "Đăng nhập",
|
||||
"Sign Out": "Đăng xuất",
|
||||
"Sky": "Xanh trời",
|
||||
"Slow": "Chậm",
|
||||
"Solarized": "Solarized",
|
||||
"Speak": "Đọc",
|
||||
"Subjects": "Chủ đề",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "Bắt đầu di chuyển",
|
||||
"Advanced Settings": "Cài đặt nâng cao",
|
||||
"File count: {{size}}": "Số lượng tệp: {{size}}",
|
||||
"Background Read Aloud": "Đọc To Nền",
|
||||
"Ready to read aloud": "Sẵn sàng để đọc to",
|
||||
"Read Aloud": "Đọc To",
|
||||
"Screen Brightness": "Độ sáng màn hình",
|
||||
"Background Image": "Ảnh nền",
|
||||
"Import Image": "Nhập ảnh",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "Xuất",
|
||||
"Set Timeout": "Đặt thời gian chờ",
|
||||
"Select Voice": "Chọn giọng nói",
|
||||
"Toggle Sticky Bottom TTS Bar": "Bật/tắt thanh TTS cố định",
|
||||
"Display what I'm reading on Discord": "Hiển thị sách đang đọc trên Discord",
|
||||
"Show on Discord": "Hiện trên Discord",
|
||||
"Instant {{action}}": "{{action}} tức thì",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "Xác thực WebDAV thất bại. Kết nối lại trong Cài đặt.",
|
||||
"Downloading": "Đang tải",
|
||||
"Uploading": "Đang tải lên",
|
||||
"downloaded {{n}} book(s)": "đã tải {{n}} sách",
|
||||
"pushed {{n}} config(s)": "đã đẩy {{n}} cấu hình",
|
||||
"uploaded {{n}} new file(s)": "đã tải lên {{n}} tệp mới",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "Đồng bộ kết thúc với {{failed}} lỗi. {{ok}} thành công.",
|
||||
"Sync complete": "Đồng bộ hoàn tất",
|
||||
"Everything is already up to date.": "Mọi thứ đã được cập nhật.",
|
||||
"Browsing {{path}} on {{server}}": "Đang duyệt {{path}} trên {{server}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "Kết nối với máy chủ WebDAV để duyệt các tệp từ xa của bạn.",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "Tải lên tệp sách",
|
||||
"Sync now": "Đồng bộ ngay",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "Hiện mật khẩu",
|
||||
"Root Directory": "Thư mục gốc",
|
||||
"Syncing…": "Đang đồng bộ…",
|
||||
"pulled progress for {{n}} book(s)": "đã tải tiến độ cho {{n}} sách",
|
||||
"Sync History": "Lịch sử đồng bộ",
|
||||
"Clear Sync History": "Xóa lịch sử đồng bộ",
|
||||
"No manual syncs yet": "Chưa có lần đồng bộ thủ công nào",
|
||||
"Partial": "Một phần",
|
||||
"Cleanup": "Dọn dẹp",
|
||||
"Cleanup failed": "Dọn dẹp thất bại",
|
||||
"Sync failed": "Đồng bộ thất bại",
|
||||
"{{n}} deleted": "{{n}} đã xóa",
|
||||
"{{n}} failed": "{{n}} lỗi",
|
||||
"Nothing deleted": "Không xóa gì",
|
||||
"{{n}} downloaded": "{{n}} đã tải",
|
||||
"{{n}} uploaded": "{{n}} đã tải lên",
|
||||
"{{n}} progress": "{{n}} tiến độ",
|
||||
"Up to date": "Đã cập nhật",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "Sách đã tải",
|
||||
"Files uploaded": "Tệp đã tải lên",
|
||||
"Configs uploaded": "Cấu hình đã tải lên",
|
||||
"Configs downloaded": "Cấu hình đã tải",
|
||||
"Covers uploaded": "Bìa đã tải lên",
|
||||
"Books deleted": "Sách đã xóa",
|
||||
"Files in sync": "Tệp đồng bộ",
|
||||
"Failures": "Lỗi",
|
||||
"Total books": "Tổng số sách",
|
||||
"Error:": "Lỗi:",
|
||||
"Failed books": "Sách lỗi",
|
||||
"Deleted {{n}} book(s) from server.": "Đã xóa {{n}} sách khỏi máy chủ.",
|
||||
"Failed to load directory": "Không thể tải thư mục",
|
||||
"File download is only supported on the desktop and mobile apps.": "Tải xuống tệp chỉ được hỗ trợ trên các ứng dụng máy tính và di động.",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "Cài tiện ích trình duyệt Readest để gửi bài viết bạn đang đọc vào thư viện. Tiện ích cắt trang từ trình duyệt nên các trang trả phí hoặc yêu cầu đăng nhập vẫn hoạt động.",
|
||||
"Added to your library. It will sync to your other devices.": "Đã thêm vào thư viện của bạn. Sẽ đồng bộ sang các thiết bị khác.",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "Đã quên cụm mật khẩu đồng bộ. Tất cả các trường được mã hóa đã bị xóa.",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "Chỉ đồng bộ thủ công và dọn dẹp. Các lần đồng bộ tự động khi đọc không được ghi tại đây.",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "Xóa {{n}} sách khỏi máy chủ WebDAV?\n\nThao tác này chỉ xóa các tệp từ xa; thư viện cục bộ của bạn không bị ảnh hưởng. Không thể hoàn tác. Dữ liệu trên máy chủ sẽ mất vĩnh viễn.",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "Tải lên tệp sách đến các thiết bị khác của bạn.",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "Cụm mật khẩu đồng bộ không đúng. Không thể giải mã thông tin xác thực đã đồng bộ.",
|
||||
"Email books straight to your library": "Gửi sách qua email thẳng đến thư viện của bạn",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "Chuyển tiếp tệp đính kèm và bài viết đến địa chỉ Readest riêng của bạn. Có sẵn trong các gói Plus, Pro và Lifetime.",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "Đồng thời xóa tiến độ đọc, ghi chú và dấu trang.",
|
||||
"Background Image (Library)": "Ảnh nền (Thư viện)",
|
||||
"Background Image (Reader)": "Ảnh nền (Trình đọc)",
|
||||
"updated metadata for {{n}} book(s)": "đã cập nhật siêu dữ liệu cho {{n}} sách",
|
||||
"{{n}} metadata": "{{n}} siêu dữ liệu",
|
||||
"Metadata updated": "Đã cập nhật siêu dữ liệu",
|
||||
"Filter": "Lọc",
|
||||
"Sort by": "Sắp xếp theo",
|
||||
"Date modified": "Ngày sửa đổi",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "Mức độ chi tiết",
|
||||
"Refresh Page": "Làm mới trang",
|
||||
"Recently read": "Đã đọc gần đây",
|
||||
"Show recently read": "Hiển thị mục đã đọc gần đây"
|
||||
"Show recently read": "Hiển thị mục đã đọc gần đây",
|
||||
"Find:": "Tìm:",
|
||||
"Enable rule": "Bật quy tắc",
|
||||
"Disable rule": "Tắt quy tắc",
|
||||
"Progress Read": "Tiến độ đọc",
|
||||
"Auto-import new books from this folder": "Tự động nhập sách mới từ thư mục này",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Khi có sách mới được thêm vào thư mục này, chúng sẽ được nhập tự động vào lần tiếp theo Readest được mở hoặc quay lại nền trước.",
|
||||
"Reading aloud": "Đang đọc to",
|
||||
"Open Book": "Mở sách",
|
||||
"Stop reading aloud": "Dừng đọc to",
|
||||
"Enter at least two words": "Nhập ít nhất hai từ",
|
||||
"Search failed": "Tìm kiếm thất bại",
|
||||
"Search with regex": "Tìm kiếm bằng biểu thức chính quy",
|
||||
"Words to find near each other": "Các từ cần tìm ở gần nhau",
|
||||
"Contains": "Chứa",
|
||||
"Whole Words": "Toàn bộ từ",
|
||||
"Regular Expression": "Biểu thức chính quy",
|
||||
"Nearby Words": "Từ gần nhau",
|
||||
"Within N words": "Trong phạm vi N từ",
|
||||
"Not for regex": "Không áp dụng cho biểu thức chính quy",
|
||||
"No results found": "Không tìm thấy kết quả",
|
||||
"{{count}} results_other": "{{count}} kết quả",
|
||||
"Failed to seek": "Không thể tua",
|
||||
"Chapter progress": "Tiến độ chương",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} trên {{total}}",
|
||||
"Decrease Contrast": "Giảm tương phản",
|
||||
"Reset Contrast": "Đặt lại tương phản",
|
||||
"Increase Contrast": "Tăng tương phản",
|
||||
"Push": "Đẩy",
|
||||
"Slide": "Trượt",
|
||||
"Page Curl": "Lật giấy",
|
||||
"Animation Style": "Kiểu hiệu ứng động",
|
||||
"Appearance": "Giao diện",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "Đặt cỡ chữ của kết quả từ điển, không phụ thuộc vào chế độ xem đọc.",
|
||||
"Authentication failed. Reconnect in Settings.": "Xác thực thất bại. Kết nối lại trong Cài đặt.",
|
||||
"Full Sync": "Đồng bộ đầy đủ",
|
||||
"Waiting for sign-in…": "Đang chờ đăng nhập…",
|
||||
"Reconnect": "Kết nối lại",
|
||||
"Connected as {{account}}": "Đã kết nối với tư cách {{account}}",
|
||||
". Make Google Drive the active cloud provider.": ". Đặt Google Drive làm nhà cung cấp đám mây đang hoạt động.",
|
||||
"Use Google Drive": "Dùng Google Drive",
|
||||
"Sign-in opens in your browser.": "Đăng nhập sẽ mở trong trình duyệt của bạn.",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest chỉ truy cập các tệp do chính nó tạo trong Drive của bạn.",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với máy chủ WebDAV.",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với Google Drive của bạn.",
|
||||
"Configured": "Đã cấu hình",
|
||||
"Use WebDAV": "Dùng WebDAV",
|
||||
"Cloud Sync": "Đồng bộ đám mây",
|
||||
"Extra Large": "Rất lớn",
|
||||
"Hint size": "Cỡ gợi ý",
|
||||
"Gloss text size above the word": "Cỡ chữ của chú giải phía trên từ",
|
||||
"Hint color": "Màu gợi ý",
|
||||
"Adjust Text Selection": "Điều chỉnh vùng chọn văn bản",
|
||||
"Your books will appear here": "Sách của bạn sẽ xuất hiện ở đây",
|
||||
"Reading aloud continues in the background": "Đọc to tiếp tục chạy trong nền",
|
||||
"Stopped reading aloud": "Đã dừng đọc to",
|
||||
"Read aloud stopped": "Đọc to đã dừng",
|
||||
"Cloud provider switched": "Đã chuyển nhà cung cấp đám mây",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "Tải lên Readest Cloud tạm dừng khi đồng bộ {{provider}} đang được chọn",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "Do {{provider}} quản lý khi nó là nhà cung cấp đồng bộ đám mây của bạn",
|
||||
"Not signed in": "Chưa đăng nhập",
|
||||
"Paused — plan required": "Tạm dừng — cần gói đăng ký",
|
||||
"Active · Book file uploads off": "Đang hoạt động · Tải lên tệp sách đang tắt",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "Cài đặt ứng dụng, thống kê đọc và từ điển vẫn đồng bộ qua tài khoản Readest của bạn khi bạn đã đăng nhập.",
|
||||
"Readest Cloud": "Readest Cloud",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với Readest Cloud.",
|
||||
"Account and Storage": "Tài khoản và lưu trữ",
|
||||
"Manage your plan and stored files": "Quản lý gói đăng ký và tệp đã lưu của bạn",
|
||||
"Cloud sync provider": "Nhà cung cấp đồng bộ đám mây",
|
||||
"Use Readest Cloud": "Dùng Readest Cloud",
|
||||
"Another device is still syncing this library via Readest Cloud": "Một thiết bị khác vẫn đang đồng bộ thư viện này qua Readest Cloud",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} lượt tải lên thất bại: không đủ lượng lưu trữ",
|
||||
"Library sync via {{provider}}": "Đồng bộ thư viện qua {{provider}}",
|
||||
"Google Drive session expired": "Phiên Google Drive đã hết hạn",
|
||||
"Cloud sync session expired": "Phiên đồng bộ đám mây đã hết hạn",
|
||||
"Uploads book files to your other devices": "Tải tệp sách lên các thiết bị khác của bạn",
|
||||
"Re-check every book instead of only changed ones": "Kiểm tra lại mọi cuốn sách thay vì chỉ những cuốn đã thay đổi",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "Không tìm thấy bucket",
|
||||
"Endpoint": "Endpoint",
|
||||
"Bucket": "Bucket",
|
||||
"Region": "Khu vực",
|
||||
"Access Key ID": "ID khóa truy cập",
|
||||
"Your Access Key ID": "ID khóa truy cập của bạn",
|
||||
"Secret Access Key": "Khóa truy cập bí mật",
|
||||
"Your Secret Access Key": "Khóa truy cập bí mật của bạn",
|
||||
"S3-Compatible Storage": "Lưu trữ tương thích S3",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "Đồng bộ thư viện, tiến độ đọc và phần tô sáng của bạn với một bucket tương thích S3 như Cloudflare R2, AWS S3 hoặc MinIO.",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "Trên trình duyệt, chính sách CORS của bucket phải cho phép origin của trang này.",
|
||||
"Use S3": "Dùng S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "Trước khi kết nối, hãy đảm bảo bucket tồn tại và thông tin xác thực có quyền đọc/ghi.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "Khi {{provider}} được chọn, sách, tiến độ và chú thích chỉ đồng bộ với máy chủ của bạn.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "Khi {{provider}} được chọn, sách, tiến độ và chú thích chỉ đồng bộ với Drive của bạn.",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "Khi {{provider}} được chọn, sách, tiến độ và chú thích chỉ đồng bộ với bucket của bạn.",
|
||||
"Premium": "Premium",
|
||||
"S3 Storage": "Lưu trữ S3",
|
||||
"Speed": "Tốc độ",
|
||||
"{{time}} left in chapter": "Còn {{time}} trong chương",
|
||||
"Open Read Aloud player": "Mở trình phát đọc to",
|
||||
"Read Aloud": "Đọc to",
|
||||
"Voice": "Giọng đọc",
|
||||
"Sleep Timer": "Hẹn giờ ngủ",
|
||||
"Slower": "Chậm hơn",
|
||||
"Faster": "Nhanh hơn",
|
||||
"Exit Auto Scroll": "Thoát tự động cuộn",
|
||||
"Auto Scroll": "Tự động cuộn",
|
||||
"End of book": "Cuối sách",
|
||||
"Toggle Auto Scroll": "Chuyển chế độ tự động cuộn"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "编辑",
|
||||
"Excerpts": "摘录",
|
||||
"Failed to import book(s): {{filenames}}": "导入书籍失败:{{filenames}}",
|
||||
"Fast": "快",
|
||||
"Font": "字体",
|
||||
"Font & Layout": "字体和布局",
|
||||
"Font Face": "字型",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登录",
|
||||
"Match Case": "匹配大小写",
|
||||
"Match Diacritics": "匹配重音符号",
|
||||
"Match Whole Words": "匹配整个单词",
|
||||
"Maximum Number of Columns": "分栏数",
|
||||
"Minimum Font Size": "最小字号",
|
||||
"Monospace Font": "等宽字体",
|
||||
@@ -91,7 +89,6 @@
|
||||
"Sign In": "登录",
|
||||
"Sign Out": "登出账户",
|
||||
"Sky": "天青",
|
||||
"Slow": "慢",
|
||||
"Solarized": "日晖",
|
||||
"Speak": "朗读",
|
||||
"Subjects": "主题",
|
||||
@@ -579,9 +576,6 @@
|
||||
"Start Migration": "开始迁移",
|
||||
"Advanced Settings": "高级设置",
|
||||
"File count: {{size}}": "文件数量: {{size}}",
|
||||
"Background Read Aloud": "后台语音朗读",
|
||||
"Ready to read aloud": "语音朗读已就绪",
|
||||
"Read Aloud": "语音朗读",
|
||||
"Screen Brightness": "屏幕亮度",
|
||||
"Background Image": "背景图片",
|
||||
"Import Image": "导入图片",
|
||||
@@ -870,7 +864,6 @@
|
||||
"Export": "导出",
|
||||
"Set Timeout": "设置超时",
|
||||
"Select Voice": "选择语音",
|
||||
"Toggle Sticky Bottom TTS Bar": "切换固定TTS栏",
|
||||
"Display what I'm reading on Discord": "在Discord显示阅读状态",
|
||||
"Show on Discord": "在Discord显示",
|
||||
"Instant {{action}}": "即时{{action}}",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 认证失败。请在设置中重新连接。",
|
||||
"Downloading": "正在下载",
|
||||
"Uploading": "正在上传",
|
||||
"downloaded {{n}} book(s)": "已下载 {{n}} 本书",
|
||||
"pushed {{n}} config(s)": "已推送 {{n}} 项配置",
|
||||
"uploaded {{n}} new file(s)": "已上传 {{n}} 个新文件",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同步完成,{{failed}} 项失败,{{ok}} 项成功。",
|
||||
"Sync complete": "同步完成",
|
||||
"Everything is already up to date.": "一切均已是最新。",
|
||||
"Browsing {{path}} on {{server}}": "正在浏览 {{server}} 上的 {{path}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "连接到 WebDAV 服务器以浏览您的远程文件。",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "上传书籍文件",
|
||||
"Sync now": "立即同步",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "显示密码",
|
||||
"Root Directory": "根目录",
|
||||
"Syncing…": "正在同步…",
|
||||
"pulled progress for {{n}} book(s)": "已拉取 {{n}} 本书的进度",
|
||||
"Sync History": "同步历史",
|
||||
"Clear Sync History": "清除同步历史",
|
||||
"No manual syncs yet": "暂无手动同步记录",
|
||||
"Partial": "部分",
|
||||
"Cleanup": "清理",
|
||||
"Cleanup failed": "清理失败",
|
||||
"Sync failed": "同步失败",
|
||||
"{{n}} deleted": "已删除 {{n}}",
|
||||
"{{n}} failed": "{{n}} 失败",
|
||||
"Nothing deleted": "未删除任何项",
|
||||
"{{n}} downloaded": "已下载 {{n}}",
|
||||
"{{n}} uploaded": "已上传 {{n}}",
|
||||
"{{n}} progress": "{{n}} 进度",
|
||||
"Up to date": "已是最新",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "已下载书籍",
|
||||
"Files uploaded": "已上传文件",
|
||||
"Configs uploaded": "已上传配置",
|
||||
"Configs downloaded": "已下载配置",
|
||||
"Covers uploaded": "已上传封面",
|
||||
"Books deleted": "已删除书籍",
|
||||
"Files in sync": "已同步文件",
|
||||
"Failures": "失败项",
|
||||
"Total books": "书籍总数",
|
||||
"Error:": "错误:",
|
||||
"Failed books": "失败的书籍",
|
||||
"Deleted {{n}} book(s) from server.": "已从服务器删除 {{n}} 本书。",
|
||||
"Failed to load directory": "加载目录失败",
|
||||
"File download is only supported on the desktop and mobile apps.": "文件下载仅在桌面端和移动端应用中支持。",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "安装 Readest 浏览器扩展,将正在阅读的文章发送到您的书库。扩展从浏览器抓取页面,因此付费墙和需要登录的网站也可用。",
|
||||
"Added to your library. It will sync to your other devices.": "已添加到您的书库。将同步到您的其他设备。",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "已忘记同步密码短语。所有加密字段已清空。",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "仅显示手动同步与清理。阅读时的自动同步不在此记录。",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "从 WebDAV 服务器删除 {{n}} 本书?\n\n这只会移除远程文件;您的本地书库不受影响。删除无法撤销。服务器上的数据将永久消失。",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "将书籍文件上传到您的其他设备。",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同步密码短语错误。无法解密已同步的凭据。",
|
||||
"Email books straight to your library": "通过电子邮件直接将书籍发送到您的书库",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "将附件和文章转发到您的专属 Readest 地址。Plus、Pro 和 Lifetime 套餐可用。",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "同时清除阅读进度、笔记和书签。",
|
||||
"Background Image (Library)": "背景图片(书库)",
|
||||
"Background Image (Reader)": "背景图片(阅读界面)",
|
||||
"updated metadata for {{n}} book(s)": "已更新 {{n}} 本书的元数据",
|
||||
"{{n}} metadata": "{{n}} 元数据",
|
||||
"Metadata updated": "已更新元数据",
|
||||
"Filter": "筛选",
|
||||
"Sort by": "排序方式",
|
||||
"Date modified": "修改日期",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "粒度",
|
||||
"Refresh Page": "刷新页面",
|
||||
"Recently read": "最近阅读",
|
||||
"Show recently read": "显示最近阅读"
|
||||
"Show recently read": "显示最近阅读",
|
||||
"Find:": "查找:",
|
||||
"Enable rule": "启用规则",
|
||||
"Disable rule": "禁用规则",
|
||||
"Progress Read": "阅读进度",
|
||||
"Auto-import new books from this folder": "自动导入此文件夹中的新书",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "当此文件夹中添加了新书时,下次打开 Readest 或返回前台时将自动导入。",
|
||||
"Reading aloud": "正在朗读",
|
||||
"Open Book": "打开书籍",
|
||||
"Stop reading aloud": "停止朗读",
|
||||
"Enter at least two words": "请至少输入两个单词",
|
||||
"Search failed": "搜索失败",
|
||||
"Search with regex": "使用正则表达式搜索",
|
||||
"Words to find near each other": "要就近查找的单词",
|
||||
"Contains": "包含",
|
||||
"Whole Words": "整个单词",
|
||||
"Regular Expression": "正则表达式",
|
||||
"Nearby Words": "邻近单词",
|
||||
"Within N words": "N 个单词以内",
|
||||
"Not for regex": "不适用于正则表达式",
|
||||
"No results found": "未找到结果",
|
||||
"{{count}} results_other": "{{count}} 个结果",
|
||||
"Failed to seek": "跳转失败",
|
||||
"Chapter progress": "章节进度",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "降低对比度",
|
||||
"Reset Contrast": "重置对比度",
|
||||
"Increase Contrast": "提高对比度",
|
||||
"Push": "平移",
|
||||
"Slide": "覆盖",
|
||||
"Page Curl": "仿真",
|
||||
"Animation Style": "动画样式",
|
||||
"Appearance": "外观",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "设置词典结果的文字大小,与阅读界面相互独立。",
|
||||
"Authentication failed. Reconnect in Settings.": "认证失败。请在设置中重新连接。",
|
||||
"Full Sync": "完全同步",
|
||||
"Waiting for sign-in…": "等待登录…",
|
||||
"Reconnect": "重新连接",
|
||||
"Connected as {{account}}": "已以 {{account}} 身份连接",
|
||||
". Make Google Drive the active cloud provider.": "。将 Google Drive 设为当前使用的云服务提供商。",
|
||||
"Use Google Drive": "使用 Google Drive",
|
||||
"Sign-in opens in your browser.": "登录将在浏览器中打开。",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest 只会访问它在您的 Drive 中创建的文件。",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "将您的书库、阅读进度和高亮与 WebDAV 服务器同步。",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "将您的书库、阅读进度和高亮与您的 Google Drive 同步。",
|
||||
"Configured": "已配置",
|
||||
"Use WebDAV": "使用 WebDAV",
|
||||
"Cloud Sync": "云同步",
|
||||
"Extra Large": "特大",
|
||||
"Hint size": "提示大小",
|
||||
"Gloss text size above the word": "单词上方注释文字的大小",
|
||||
"Hint color": "提示颜色",
|
||||
"Adjust Text Selection": "调整文本选择",
|
||||
"Your books will appear here": "您的书籍将显示在这里",
|
||||
"Reading aloud continues in the background": "语音朗读在后台继续",
|
||||
"Stopped reading aloud": "已停止语音朗读",
|
||||
"Read aloud stopped": "语音朗读已停止",
|
||||
"Cloud provider switched": "云服务提供方已切换",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "选择 {{provider}} 同步期间,上传到 Readest 云端已暂停",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "当 {{provider}} 是您的云同步提供方时由其管理",
|
||||
"Not signed in": "未登录",
|
||||
"Paused — plan required": "已暂停 — 需要订阅方案",
|
||||
"Active · Book file uploads off": "已启用 · 书籍文件上传已关闭",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "登录期间,应用设置、阅读统计和词典仍会通过您的 Readest 账户同步。",
|
||||
"Readest Cloud": "Readest 云端",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "将您的书库、阅读进度和高亮与 Readest 云端同步。",
|
||||
"Account and Storage": "账户与存储",
|
||||
"Manage your plan and stored files": "管理您的订阅方案和已存储的文件",
|
||||
"Cloud sync provider": "云同步提供方",
|
||||
"Use Readest Cloud": "使用 Readest 云端",
|
||||
"Another device is still syncing this library via Readest Cloud": "另一台设备仍在通过 Readest 云端同步此书库",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 个上传失败:云存储空间不足",
|
||||
"Library sync via {{provider}}": "通过 {{provider}} 同步书库",
|
||||
"Google Drive session expired": "Google Drive 会话已过期",
|
||||
"Cloud sync session expired": "云同步会话已过期",
|
||||
"Uploads book files to your other devices": "将书籍文件上传到您的其他设备",
|
||||
"Re-check every book instead of only changed ones": "重新检查每一本书,而不仅仅是已更改的书",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "未找到存储桶",
|
||||
"Endpoint": "端点",
|
||||
"Bucket": "存储桶",
|
||||
"Region": "区域",
|
||||
"Access Key ID": "访问密钥 ID",
|
||||
"Your Access Key ID": "您的访问密钥 ID",
|
||||
"Secret Access Key": "秘密访问密钥",
|
||||
"Your Secret Access Key": "您的秘密访问密钥",
|
||||
"S3-Compatible Storage": "S3 兼容存储",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "通过 Cloudflare R2、AWS S3 或 MinIO 等 S3 兼容存储桶同步您的书库、阅读进度和标注。",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "在浏览器中使用时,存储桶的 CORS 策略必须允许本站点的来源。",
|
||||
"Use S3": "使用 S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "连接前请确保存储桶已存在,且凭证具有读写权限。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "选择 {{provider}} 后,书籍、进度和标注仅同步到您的服务器。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "选择 {{provider}} 后,书籍、进度和标注仅同步到您的 Drive。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "选择 {{provider}} 后,书籍、进度和标注仅同步到您的存储桶。",
|
||||
"Premium": "高级版",
|
||||
"S3 Storage": "S3 存储",
|
||||
"Speed": "语速",
|
||||
"{{time}} left in chapter": "本章剩余 {{time}}",
|
||||
"Open Read Aloud player": "打开朗读播放器",
|
||||
"Read Aloud": "朗读",
|
||||
"Voice": "语音",
|
||||
"Sleep Timer": "定时关闭",
|
||||
"Slower": "减慢",
|
||||
"Faster": "加快",
|
||||
"Exit Auto Scroll": "退出自动滚动",
|
||||
"Auto Scroll": "自动滚动",
|
||||
"End of book": "已到达书末",
|
||||
"Toggle Auto Scroll": "切换自动滚动"
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
"Edit": "編輯",
|
||||
"Excerpts": "摘錄",
|
||||
"Failed to import book(s): {{filenames}}": "導入書籍失敗:{{filenames}}",
|
||||
"Fast": "快",
|
||||
"Font": "字體",
|
||||
"Font & Layout": "字體和版面",
|
||||
"Font Face": "字型",
|
||||
@@ -54,7 +53,6 @@
|
||||
"Logged in as {{userDisplayName}}": "{{userDisplayName}} 已登入",
|
||||
"Match Case": "匹配大小寫",
|
||||
"Match Diacritics": "匹配重音符號",
|
||||
"Match Whole Words": "匹配整個單詞",
|
||||
"Maximum Number of Columns": "分欄數",
|
||||
"Minimum Font Size": "最小字號",
|
||||
"Monospace Font": "等寬字體",
|
||||
@@ -90,7 +88,6 @@
|
||||
"Sign In": "登入",
|
||||
"Sign Out": "登出",
|
||||
"Sky": "天青",
|
||||
"Slow": "慢",
|
||||
"Solarized": "日暉",
|
||||
"Speak": "朗讀",
|
||||
"Subjects": "主題",
|
||||
@@ -578,9 +575,6 @@
|
||||
"Start Migration": "開始遷移",
|
||||
"Advanced Settings": "高級設置",
|
||||
"File count: {{size}}": "文件數量: {{size}}",
|
||||
"Background Read Aloud": "背景朗讀",
|
||||
"Ready to read aloud": "朗讀準備就緒",
|
||||
"Read Aloud": "朗讀",
|
||||
"Screen Brightness": "螢幕亮度",
|
||||
"Background Image": "背景圖片",
|
||||
"Import Image": "匯入圖片",
|
||||
@@ -869,7 +863,6 @@
|
||||
"Export": "匯出",
|
||||
"Set Timeout": "設定逾時",
|
||||
"Select Voice": "選擇語音",
|
||||
"Toggle Sticky Bottom TTS Bar": "切換固定TTS欄",
|
||||
"Display what I'm reading on Discord": "在Discord顯示閱讀狀態",
|
||||
"Show on Discord": "在Discord顯示",
|
||||
"Instant {{action}}": "即時{{action}}",
|
||||
@@ -1502,14 +1495,7 @@
|
||||
"WebDAV authentication failed. Reconnect in Settings.": "WebDAV 驗證失敗。請在設定中重新連線。",
|
||||
"Downloading": "正在下載",
|
||||
"Uploading": "正在上傳",
|
||||
"downloaded {{n}} book(s)": "已下載 {{n}} 本書",
|
||||
"pushed {{n}} config(s)": "已推送 {{n}} 項設定",
|
||||
"uploaded {{n}} new file(s)": "已上傳 {{n}} 個新檔案",
|
||||
"Sync finished with {{failed}} failure(s). {{ok}} ok.": "同步完成,{{failed}} 項失敗,{{ok}} 項成功。",
|
||||
"Sync complete": "同步完成",
|
||||
"Everything is already up to date.": "一切均已是最新。",
|
||||
"Browsing {{path}} on {{server}}": "正在瀏覽 {{server}} 上的 {{path}}",
|
||||
"Connect to a WebDAV server to browse your remote files.": "連線到 WebDAV 伺服器以瀏覽您的遠端檔案。",
|
||||
"WebDAV": "WebDAV",
|
||||
"Upload Book Files": "上傳書籍檔案",
|
||||
"Sync now": "立即同步",
|
||||
@@ -1517,33 +1503,8 @@
|
||||
"Show password": "顯示密碼",
|
||||
"Root Directory": "根目錄",
|
||||
"Syncing…": "正在同步…",
|
||||
"pulled progress for {{n}} book(s)": "已拉取 {{n}} 本書的進度",
|
||||
"Sync History": "同步歷史",
|
||||
"Clear Sync History": "清除同步歷史",
|
||||
"No manual syncs yet": "尚無手動同步記錄",
|
||||
"Partial": "部分",
|
||||
"Cleanup": "清理",
|
||||
"Cleanup failed": "清理失敗",
|
||||
"Sync failed": "同步失敗",
|
||||
"{{n}} deleted": "已刪除 {{n}}",
|
||||
"{{n}} failed": "{{n}} 失敗",
|
||||
"Nothing deleted": "未刪除任何項目",
|
||||
"{{n}} downloaded": "已下載 {{n}}",
|
||||
"{{n}} uploaded": "已上傳 {{n}}",
|
||||
"{{n}} progress": "{{n}} 進度",
|
||||
"Up to date": "已是最新",
|
||||
"{{when}} · {{dur}}": "{{when}} · {{dur}}",
|
||||
"Books downloaded": "已下載書籍",
|
||||
"Files uploaded": "已上傳檔案",
|
||||
"Configs uploaded": "已上傳設定",
|
||||
"Configs downloaded": "已下載設定",
|
||||
"Covers uploaded": "已上傳封面",
|
||||
"Books deleted": "已刪除書籍",
|
||||
"Files in sync": "已同步檔案",
|
||||
"Failures": "失敗項目",
|
||||
"Total books": "書籍總數",
|
||||
"Error:": "錯誤:",
|
||||
"Failed books": "失敗的書籍",
|
||||
"Deleted {{n}} book(s) from server.": "已從伺服器刪除 {{n}} 本書。",
|
||||
"Failed to load directory": "載入目錄失敗",
|
||||
"File download is only supported on the desktop and mobile apps.": "檔案下載僅在桌面端和行動端應用程式中支援。",
|
||||
@@ -1570,10 +1531,8 @@
|
||||
"Install the Readest browser extension to send the article you are reading to your library. It clips the page from your browser so paywalled and login-only sites still work.": "安裝 Readest 瀏覽器擴充功能,將正在閱讀的文章傳送到您的書庫。擴充功能會從您的瀏覽器擷取頁面,因此付費牆和需要登入的網站也能使用。",
|
||||
"Added to your library. It will sync to your other devices.": "已加入您的書庫。將同步到您的其他裝置。",
|
||||
"Sync passphrase forgotten. All encrypted fields cleared.": "已忘記同步密碼短語。所有加密欄位已清空。",
|
||||
"Manual syncs and cleanups only. Automatic syncs while reading aren't logged here.": "僅顯示手動同步與清理。閱讀時的自動同步不在此記錄。",
|
||||
"Delete {{n}} book(s) from the WebDAV server?\n\nThis only removes the remote files; your local library is unaffected. The deletion cannot be undone. The bytes on the server will be permanently gone.": "從 WebDAV 伺服器刪除 {{n}} 本書?\n\n這只會移除遠端檔案;您的本機書庫不受影響。刪除無法復原。伺服器上的資料將永久消失。",
|
||||
"{{action}} {{n}} / {{total}}": "{{action}} {{n}} / {{total}}",
|
||||
"Uploads book files to your other devices.": "將書籍檔案上傳到您的其他裝置。",
|
||||
"Wrong sync passphrase. Synced credentials could not be decrypted.": "同步密碼短語錯誤。無法解密已同步的憑證。",
|
||||
"Email books straight to your library": "透過電子郵件直接將書籍傳送到您的書庫",
|
||||
"Forward attachments and articles to your private Readest address. Available on the Plus, Pro, and Lifetime plans.": "將附件和文章轉寄到您的專屬 Readest 地址。Plus、Pro 和 Lifetime 方案可用。",
|
||||
@@ -1759,9 +1718,6 @@
|
||||
"Also erase reading progress, notes, and bookmarks.": "同時清除閱讀進度、筆記和書籤。",
|
||||
"Background Image (Library)": "背景圖片(書庫)",
|
||||
"Background Image (Reader)": "背景圖片(閱讀介面)",
|
||||
"updated metadata for {{n}} book(s)": "已更新 {{n}} 本書的中繼資料",
|
||||
"{{n}} metadata": "{{n}} 中繼資料",
|
||||
"Metadata updated": "已更新中繼資料",
|
||||
"Filter": "篩選",
|
||||
"Sort by": "排序方式",
|
||||
"Date modified": "修改日期",
|
||||
@@ -1776,5 +1732,113 @@
|
||||
"Granularity": "粒度",
|
||||
"Refresh Page": "重新整理頁面",
|
||||
"Recently read": "最近閱讀",
|
||||
"Show recently read": "顯示最近閱讀"
|
||||
"Show recently read": "顯示最近閱讀",
|
||||
"Find:": "尋找:",
|
||||
"Enable rule": "啟用規則",
|
||||
"Disable rule": "停用規則",
|
||||
"Progress Read": "閱讀進度",
|
||||
"Auto-import new books from this folder": "自動匯入此資料夾中的新書",
|
||||
"When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "當此資料夾中加入新書時,下次開啟 Readest 或回到前景時將自動匯入。",
|
||||
"Reading aloud": "朗讀中",
|
||||
"Open Book": "打開書籍",
|
||||
"Stop reading aloud": "停止朗讀",
|
||||
"Enter at least two words": "請至少輸入兩個單詞",
|
||||
"Search failed": "搜尋失敗",
|
||||
"Search with regex": "使用正規表示式搜尋",
|
||||
"Words to find near each other": "要就近尋找的單詞",
|
||||
"Contains": "包含",
|
||||
"Whole Words": "整個單詞",
|
||||
"Regular Expression": "正規表示式",
|
||||
"Nearby Words": "鄰近單詞",
|
||||
"Within N words": "N 個單詞以內",
|
||||
"Not for regex": "不適用於正規表示式",
|
||||
"No results found": "未找到結果",
|
||||
"{{count}} results_other": "{{count}} 個結果",
|
||||
"Failed to seek": "跳轉失敗",
|
||||
"Chapter progress": "章節進度",
|
||||
"{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}",
|
||||
"Decrease Contrast": "降低對比度",
|
||||
"Reset Contrast": "重設對比度",
|
||||
"Increase Contrast": "提高對比度",
|
||||
"Push": "平移",
|
||||
"Slide": "覆蓋",
|
||||
"Page Curl": "擬真",
|
||||
"Animation Style": "動畫樣式",
|
||||
"Appearance": "外觀",
|
||||
"Sets the text size of dictionary results, independent of the reading view.": "設定詞典結果的文字大小,與閱讀介面相互獨立。",
|
||||
"Authentication failed. Reconnect in Settings.": "驗證失敗。請在設定中重新連線。",
|
||||
"Full Sync": "完全同步",
|
||||
"Waiting for sign-in…": "等待登入…",
|
||||
"Reconnect": "重新連線",
|
||||
"Connected as {{account}}": "已以 {{account}} 身分連線",
|
||||
". Make Google Drive the active cloud provider.": "。將 Google Drive 設為目前使用的雲端服務供應商。",
|
||||
"Use Google Drive": "使用 Google Drive",
|
||||
"Sign-in opens in your browser.": "登入將在瀏覽器中開啟。",
|
||||
"Readest only accesses the files it creates in your Drive.": "Readest 只會存取它在您的 Drive 中建立的檔案。",
|
||||
"Sync your library, reading progress, and highlights with a WebDAV server.": "將您的書庫、閱讀進度和高亮與 WebDAV 伺服器同步。",
|
||||
"Google Drive": "Google Drive",
|
||||
"Sync your library, reading progress, and highlights with your Google Drive.": "將您的書庫、閱讀進度和高亮與您的 Google Drive 同步。",
|
||||
"Configured": "已設定",
|
||||
"Use WebDAV": "使用 WebDAV",
|
||||
"Cloud Sync": "雲同步",
|
||||
"Extra Large": "特大",
|
||||
"Hint size": "提示大小",
|
||||
"Gloss text size above the word": "單詞上方註釋文字的大小",
|
||||
"Hint color": "提示顏色",
|
||||
"Adjust Text Selection": "調整文字選取",
|
||||
"Your books will appear here": "您的書籍將顯示在這裡",
|
||||
"Reading aloud continues in the background": "朗讀將在背景繼續",
|
||||
"Stopped reading aloud": "已停止朗讀",
|
||||
"Read aloud stopped": "朗讀已停止",
|
||||
"Cloud provider switched": "雲端服務提供方已切換",
|
||||
"Uploads to Readest Cloud are paused while {{provider}} sync is selected": "選擇 {{provider}} 同步期間,上傳到 Readest 雲端已暫停",
|
||||
"Managed by {{provider}} while it is your cloud sync provider": "當 {{provider}} 是您的雲端同步提供方時由其管理",
|
||||
"Not signed in": "未登入",
|
||||
"Paused — plan required": "已暫停 — 需要訂閱方案",
|
||||
"Active · Book file uploads off": "已啟用 · 書籍檔案上傳已關閉",
|
||||
"App settings, reading statistics, and dictionaries still sync through your Readest account while signed in.": "登入期間,應用程式設定、閱讀統計和詞典仍會透過您的 Readest 帳戶同步。",
|
||||
"Readest Cloud": "Readest 雲端",
|
||||
"Sync your library, reading progress, and highlights with Readest Cloud.": "將您的書庫、閱讀進度和高亮與 Readest 雲端同步。",
|
||||
"Account and Storage": "帳戶與儲存",
|
||||
"Manage your plan and stored files": "管理您的訂閱方案和已儲存的檔案",
|
||||
"Cloud sync provider": "雲端同步提供方",
|
||||
"Use Readest Cloud": "使用 Readest 雲端",
|
||||
"Another device is still syncing this library via Readest Cloud": "另一台裝置仍在透過 Readest 雲端同步此書庫",
|
||||
"{{count}} uploads failed: insufficient storage quota_other": "{{count}} 個上傳失敗:雲存儲空間不足",
|
||||
"Library sync via {{provider}}": "透過 {{provider}} 同步書庫",
|
||||
"Google Drive session expired": "Google Drive 工作階段已過期",
|
||||
"Cloud sync session expired": "雲端同步工作階段已過期",
|
||||
"Uploads book files to your other devices": "將書籍檔案上傳到您的其他裝置",
|
||||
"Re-check every book instead of only changed ones": "重新檢查每一本書,而非僅限已變更的",
|
||||
"KOReader": "KOReader",
|
||||
"Bucket not found": "未找到儲存桶",
|
||||
"Endpoint": "端點",
|
||||
"Bucket": "儲存桶",
|
||||
"Region": "區域",
|
||||
"Access Key ID": "存取金鑰 ID",
|
||||
"Your Access Key ID": "您的存取金鑰 ID",
|
||||
"Secret Access Key": "秘密存取金鑰",
|
||||
"Your Secret Access Key": "您的秘密存取金鑰",
|
||||
"S3-Compatible Storage": "S3 相容儲存",
|
||||
"Sync your library, reading progress, and highlights with an S3-compatible bucket such as Cloudflare R2, AWS S3, or MinIO.": "透過 Cloudflare R2、AWS S3 或 MinIO 等 S3 相容儲存桶同步您的書庫、閱讀進度和標註。",
|
||||
"In the browser, the bucket must allow this site's origin in its CORS policy.": "在瀏覽器中使用時,儲存桶的 CORS 政策必須允許本網站的來源。",
|
||||
"Use S3": "使用 S3",
|
||||
"Make sure the bucket exists and the credentials have read/write access before connecting.": "連線前請確保儲存桶已存在,且憑證具有讀寫權限。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your server.": "選擇 {{provider}} 後,書籍、進度和標註僅同步到您的伺服器。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your Drive.": "選擇 {{provider}} 後,書籍、進度和標註僅同步到您的 Drive。",
|
||||
"While {{provider}} is selected, books, progress, and annotations sync only to your bucket.": "選擇 {{provider}} 後,書籍、進度和標註僅同步到您的儲存桶。",
|
||||
"Premium": "進階版",
|
||||
"S3 Storage": "S3 儲存",
|
||||
"Speed": "語速",
|
||||
"{{time}} left in chapter": "本章剩餘 {{time}}",
|
||||
"Open Read Aloud player": "開啟朗讀播放器",
|
||||
"Read Aloud": "朗讀",
|
||||
"Voice": "語音",
|
||||
"Sleep Timer": "定時關閉",
|
||||
"Slower": "減慢",
|
||||
"Faster": "加快",
|
||||
"Exit Auto Scroll": "退出自動捲動",
|
||||
"Auto Scroll": "自動捲動",
|
||||
"End of book": "已到達書末",
|
||||
"Toggle Auto Scroll": "切換自動捲動"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
{
|
||||
"releases": {
|
||||
"0.11.18": {
|
||||
"date": "2026-07-08",
|
||||
"notes": [
|
||||
"Reading: Added Auto Scroll, a hands-free mode that scrolls the page for you at an adjustable pace, plus middle-click autoscroll on the desktop",
|
||||
"Reading: Added slide and page-curl animations when turning pages for a more natural feel",
|
||||
"Reading: Fixed page turning and the reading ruler for vertical right-to-left books, PDF text selection when system font scaling is on, and header/footer readability over light PDFs in dark mode",
|
||||
"Text-to-Speech: Redesigned read-aloud as a mini player with an expandable full player, and playback now keeps going even after you close the book",
|
||||
"Text-to-Speech: Online voices now play gap-free with chapter seeking and lock-screen controls, plus Android Auto support so you can listen in the car",
|
||||
"Sync: Added S3-compatible cloud storage and a new Cloud Sync screen to choose and switch between your sync providers",
|
||||
"Integrations: Added a Calibre plugin to push books and custom columns into Readest, and improved OPDS sign-in and auto-download for self-hosted catalogs",
|
||||
"Library: New books dropped into watched folders now import automatically, and you can sort your shelf by reading progress",
|
||||
"More: Added a speak button in the dictionary popup, a cleaner theme switcher, and per-rule toggles for proofreading"
|
||||
]
|
||||
},
|
||||
"0.11.17": {
|
||||
"date": "2026-06-29",
|
||||
"notes": [
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
import { spawn, spawnSync } from 'node:child_process';
|
||||
import fs from 'node:fs';
|
||||
import http from 'node:http';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const appRoot = path.resolve(__dirname, '..');
|
||||
const toolRoot = path.join(appRoot, 'tools', 'epub-review-editor');
|
||||
const reviewRoot = path.resolve(process.env.READEST_REVIEW_ROOT || path.join(appRoot, 'epub_review_sessions'));
|
||||
const defaultPort = Number(process.env.READEST_REVIEW_PORT || 5177);
|
||||
const venvRoot = path.join(toolRoot, '.venv');
|
||||
const venvPython =
|
||||
process.platform === 'win32'
|
||||
? path.join(venvRoot, 'Scripts', 'python.exe')
|
||||
: path.join(venvRoot, 'bin', 'python');
|
||||
|
||||
const run = (command, args, options = {}) =>
|
||||
spawnSync(command, args, {
|
||||
cwd: options.cwd,
|
||||
encoding: 'utf8',
|
||||
timeout: options.timeout ?? 30_000,
|
||||
windowsHide: true,
|
||||
});
|
||||
|
||||
const pythonCandidates =
|
||||
process.platform === 'win32'
|
||||
? [
|
||||
['py', ['-3']],
|
||||
['python', []],
|
||||
['python3', []],
|
||||
]
|
||||
: [
|
||||
['python3', []],
|
||||
['python', []],
|
||||
];
|
||||
|
||||
const findPython = () => {
|
||||
for (const [command, args] of pythonCandidates) {
|
||||
const result = run(command, [...args, '--version'], { timeout: 10_000 });
|
||||
if (result.status === 0) return { command, args };
|
||||
}
|
||||
throw new Error('Python 3 was not found.');
|
||||
};
|
||||
|
||||
const requestJson = (port, pathname) =>
|
||||
new Promise((resolve) => {
|
||||
const req = http.get({ host: '127.0.0.1', port, path: pathname, timeout: 800 }, (res) => {
|
||||
let body = '';
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', (chunk) => {
|
||||
body += chunk;
|
||||
});
|
||||
res.on('end', () => {
|
||||
try {
|
||||
resolve(res.statusCode === 200 ? JSON.parse(body) : null);
|
||||
} catch {
|
||||
resolve(null);
|
||||
}
|
||||
});
|
||||
});
|
||||
req.on('timeout', () => {
|
||||
req.destroy();
|
||||
resolve(null);
|
||||
});
|
||||
req.on('error', () => resolve(null));
|
||||
});
|
||||
|
||||
const findRunning = async () => {
|
||||
for (let port = defaultPort; port < defaultPort + 100; port++) {
|
||||
const payload = await requestJson(port, '/api/version');
|
||||
if (payload?.version) return `http://localhost:${port}`;
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
if (!fs.existsSync(path.join(toolRoot, 'server.py'))) {
|
||||
throw new Error(`Missing review editor server: ${path.join(toolRoot, 'server.py')}`);
|
||||
}
|
||||
|
||||
const existing = await findRunning();
|
||||
if (existing) {
|
||||
console.log(`EPUB review editor is already running: ${existing}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(venvPython)) {
|
||||
console.log('Creating review editor Python environment...');
|
||||
const python = findPython();
|
||||
const result = run(python.command, [...python.args, '-m', 'venv', venvRoot], {
|
||||
cwd: appRoot,
|
||||
timeout: 120_000,
|
||||
});
|
||||
if (result.status !== 0) {
|
||||
throw new Error(result.stderr || result.stdout || 'Failed to create virtual environment.');
|
||||
}
|
||||
}
|
||||
|
||||
const flaskCheck = run(
|
||||
venvPython,
|
||||
['-c', 'import importlib.util, sys; sys.exit(0 if importlib.util.find_spec("flask") else 1)'],
|
||||
{ cwd: toolRoot, timeout: 30_000 },
|
||||
);
|
||||
|
||||
if (flaskCheck.status !== 0) {
|
||||
console.log('Installing review editor dependencies...');
|
||||
const install = run(venvPython, ['-m', 'pip', 'install', '-r', path.join(toolRoot, 'requirements.txt')], {
|
||||
cwd: toolRoot,
|
||||
timeout: 180_000,
|
||||
});
|
||||
if (install.status !== 0) {
|
||||
throw new Error(install.stderr || install.stdout || 'Failed to install dependencies.');
|
||||
}
|
||||
}
|
||||
|
||||
fs.mkdirSync(reviewRoot, { recursive: true });
|
||||
|
||||
const child = spawn(
|
||||
venvPython,
|
||||
[
|
||||
path.join(toolRoot, 'server.py'),
|
||||
'--review-root',
|
||||
reviewRoot,
|
||||
'--host',
|
||||
'127.0.0.1',
|
||||
'--port',
|
||||
String(defaultPort),
|
||||
'--no-browser',
|
||||
],
|
||||
{
|
||||
cwd: toolRoot,
|
||||
stdio: 'inherit',
|
||||
windowsHide: true,
|
||||
},
|
||||
);
|
||||
|
||||
child.on('exit', (code) => {
|
||||
process.exit(code ?? 0);
|
||||
});
|
||||
@@ -0,0 +1,104 @@
|
||||
// Generate the "Sign in with Apple" client secret JWT for the Supabase Apple
|
||||
// OAuth provider. Apple caps this secret's lifetime at 6 months, so the web
|
||||
// OAuth flow (macOS non-store .dmg + Linux) breaks with
|
||||
// "server_error ... Unable to exchange external code"
|
||||
// whenever it expires. Regenerate here and paste the output into
|
||||
// Supabase -> Authentication -> Providers -> Apple -> Secret Key (for OAuth)
|
||||
//
|
||||
// The native flow (iOS + macOS App Store, signInWithIdToken) does NOT use this
|
||||
// secret, which is why those keep working while the web flow fails.
|
||||
//
|
||||
// Usage (flags override env; env vars mirror the CI naming):
|
||||
// node scripts/generate-apple-client-secret.mjs \
|
||||
// --team-id J5W48D69VR \
|
||||
// --client-id com.bilingify.readest.signin \ # the Services ID, NOT the app bundle id
|
||||
// --key-id ABCDE12345 \
|
||||
// --key-path ../private_keys/AuthKey_ABCDE12345.p8 \
|
||||
// [--days 180]
|
||||
//
|
||||
// Env fallbacks: APPLE_TEAM_ID, APPLE_CLIENT_ID (or APPLE_SERVICES_ID),
|
||||
// APPLE_KEY_ID, APPLE_KEY_PATH, APPLE_SECRET_DAYS
|
||||
//
|
||||
// The signed JWT is printed to stdout (pipe-friendly); everything else to stderr.
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { resolve } from 'node:path';
|
||||
import { createPrivateKey, sign } from 'node:crypto';
|
||||
|
||||
const AUD = 'https://appleid.apple.com';
|
||||
const MAX_DAYS = 180; // Apple rejects secrets with exp more than ~6 months out
|
||||
|
||||
const parseArgs = (argv) => {
|
||||
const args = {};
|
||||
for (let i = 0; i < argv.length; i++) {
|
||||
const arg = argv[i];
|
||||
if (!arg.startsWith('--')) continue;
|
||||
const eq = arg.indexOf('=');
|
||||
if (eq !== -1) {
|
||||
args[arg.slice(2, eq)] = arg.slice(eq + 1);
|
||||
} else if (argv[i + 1] === undefined || argv[i + 1].startsWith('--')) {
|
||||
args[arg.slice(2)] = true; // boolean flag, e.g. --help
|
||||
} else {
|
||||
args[arg.slice(2)] = argv[++i];
|
||||
}
|
||||
}
|
||||
return args;
|
||||
};
|
||||
|
||||
const die = (msg) => {
|
||||
console.error(`Error: ${msg}`);
|
||||
console.error('Run with --help for usage.');
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
const args = parseArgs(process.argv.slice(2));
|
||||
|
||||
if (args.help || args.h) {
|
||||
console.error(readFileSync(new URL(import.meta.url)).toString().split('\n')
|
||||
.filter((l) => l.startsWith('//')).map((l) => l.slice(3)).join('\n'));
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
const teamId = args['team-id'] ?? process.env.APPLE_TEAM_ID;
|
||||
const clientId =
|
||||
args['client-id'] ?? process.env.APPLE_CLIENT_ID ?? process.env.APPLE_SERVICES_ID;
|
||||
const keyId = args['key-id'] ?? process.env.APPLE_KEY_ID;
|
||||
const keyPath = args['key-path'] ?? process.env.APPLE_KEY_PATH;
|
||||
const days = Number(args.days ?? process.env.APPLE_SECRET_DAYS ?? MAX_DAYS);
|
||||
|
||||
if (!teamId) die('missing --team-id (Apple Developer Team ID)');
|
||||
if (!clientId) die('missing --client-id (the Services ID / OAuth Client ID)');
|
||||
if (!keyId) die('missing --key-id (the "Sign in with Apple" key ID)');
|
||||
if (!keyPath) die('missing --key-path (path to the AuthKey_*.p8 file)');
|
||||
if (!Number.isFinite(days) || days <= 0) die(`invalid --days: ${args.days}`);
|
||||
if (days > MAX_DAYS) die(`--days ${days} exceeds Apple's ${MAX_DAYS}-day maximum`);
|
||||
|
||||
let privateKey;
|
||||
try {
|
||||
privateKey = createPrivateKey(readFileSync(resolve(keyPath)));
|
||||
} catch (err) {
|
||||
die(`could not read private key at ${keyPath}: ${err.message}`);
|
||||
}
|
||||
|
||||
const base64url = (input) =>
|
||||
Buffer.from(typeof input === 'string' ? input : JSON.stringify(input)).toString('base64url');
|
||||
|
||||
const now = Math.floor(Date.now() / 1000);
|
||||
const exp = now + days * 24 * 60 * 60;
|
||||
|
||||
const header = { alg: 'ES256', kid: keyId, typ: 'JWT' };
|
||||
const payload = { iss: teamId, iat: now, exp, aud: AUD, sub: clientId };
|
||||
|
||||
const signingInput = `${base64url(header)}.${base64url(payload)}`;
|
||||
// dsaEncoding 'ieee-p1363' emits the raw R||S signature JOSE/JWT requires (not DER).
|
||||
const signature = sign('sha256', Buffer.from(signingInput), {
|
||||
key: privateKey,
|
||||
dsaEncoding: 'ieee-p1363',
|
||||
}).toString('base64url');
|
||||
|
||||
const jwt = `${signingInput}.${signature}`;
|
||||
|
||||
console.error(`Generated Apple client secret for Services ID "${clientId}"`);
|
||||
console.error(` Team ID: ${teamId} Key ID: ${keyId}`);
|
||||
console.error(` Expires: ${new Date(exp * 1000).toISOString()} (${days} days)`);
|
||||
console.error('Paste the JWT below into Supabase -> Auth -> Providers -> Apple -> Secret Key:\n');
|
||||
console.log(jwt);
|
||||
@@ -3,6 +3,10 @@ pnpm tauri ios build --export-method app-store-connect
|
||||
BUNDLE_DIR=src-tauri/gen/apple/build/arm64
|
||||
IPA_BUNDLE=$BUNDLE_DIR/Readest.ipa
|
||||
|
||||
# Guard: the App Store export re-sign must not strip the App Group entitlement
|
||||
# from the widget / share extensions, or the reading widget ships dead.
|
||||
bash scripts/verify-ios-appstore-entitlements.sh "$IPA_BUNDLE"
|
||||
|
||||
xcrun altool --upload-app --type ios --file $IPA_BUNDLE --apiKey $APPLE_API_KEY --apiIssuer $APPLE_API_ISSUER
|
||||
|
||||
echo "iOS build uploaded to App Store Connect."
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env bash
|
||||
# Verify the App Store IPA's app extensions carry the App Group entitlement.
|
||||
#
|
||||
# group.com.bilingify.readest is how the main app hands the reading-widget
|
||||
# snapshot (and the share extension its shared state) to its extensions via the
|
||||
# shared App Group container. Automatic App Store signing re-signs embedded
|
||||
# extensions during `xcodebuild -exportArchive`; if a target sets
|
||||
# CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION=YES, that re-sign silently strips
|
||||
# com.apple.security.application-groups from the extension binary even though
|
||||
# the provisioning profile and source .entitlements both grant it. The widget
|
||||
# then reads an empty snapshot and shows only a placeholder book icon, with no
|
||||
# build error. This guard fails the release before upload so it can't ship
|
||||
# broken again.
|
||||
set -euo pipefail
|
||||
|
||||
IPA="${1:-src-tauri/gen/apple/build/arm64/Readest.ipa}"
|
||||
GROUP="group.com.bilingify.readest"
|
||||
EXTS=(ReadestWidget ShareExtension)
|
||||
|
||||
if [ ! -f "$IPA" ]; then
|
||||
echo "verify-ios-appstore-entitlements: IPA not found at $IPA" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
WORK="$(mktemp -d)"
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
unzip -q "$IPA" -d "$WORK"
|
||||
APP="$WORK/Payload/Readest.app"
|
||||
|
||||
fail=0
|
||||
for ext in "${EXTS[@]}"; do
|
||||
appex="$APP/PlugIns/$ext.appex"
|
||||
if codesign -d --entitlements :- "$appex" 2>/dev/null | grep -q "$GROUP"; then
|
||||
echo "OK $ext.appex carries $GROUP"
|
||||
else
|
||||
echo "FAIL $ext.appex is MISSING $GROUP (App Group access broken)"
|
||||
fail=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$fail" -ne 0 ]; then
|
||||
echo "" >&2
|
||||
echo "App Group entitlement missing from an extension binary. Do NOT set" >&2
|
||||
echo "CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION on extension targets in" >&2
|
||||
echo "src-tauri/gen/apple/project.yml." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "All app extensions carry the App Group entitlement."
|
||||
@@ -99,6 +99,20 @@ image = { version = "0.25", default-features = false, features = ["jpeg", "png",
|
||||
# WebView). Pure-Rust crate, ships to every Tauri target.
|
||||
mobi = "0.8"
|
||||
|
||||
# Crash/error reporting. `tauri-plugin-sentry` injects @sentry/browser into
|
||||
# every webview and routes browser + Rust panic events through one client; it
|
||||
# re-exports sentry-rust-minidump for desktop native crashes. `rustls` avoids
|
||||
# the native-tls/OpenSSL system dependency so the transport builds for
|
||||
# Android/iOS. Native mobile crashes are handled by sentry-android/-cocoa.
|
||||
sentry = { version = "0.42", default-features = false, features = [
|
||||
"backtrace",
|
||||
"contexts",
|
||||
"panic",
|
||||
"reqwest",
|
||||
"rustls",
|
||||
] }
|
||||
tauri-plugin-sentry = "0.5"
|
||||
|
||||
[target."cfg(target_os = \"macos\")".dependencies]
|
||||
rand = "0.8"
|
||||
cocoa = "0.25"
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
use std::{env, fs, path::PathBuf, process::Command};
|
||||
use std::{
|
||||
env, fs,
|
||||
path::{Path, PathBuf},
|
||||
process::Command,
|
||||
};
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rerun-if-changed=../extensions/windows-thumbnail/src");
|
||||
@@ -7,9 +11,102 @@ fn main() {
|
||||
build_windows_thumbnail();
|
||||
}
|
||||
|
||||
propagate_sentry_dsn();
|
||||
propagate_app_version();
|
||||
|
||||
tauri_build::build()
|
||||
}
|
||||
|
||||
/// Bake the app version from `package.json` into the crate as `READEST_APP_VERSION`
|
||||
/// (read back via `option_env!`). Sentry keys its release/environment off this
|
||||
/// rather than `CARGO_PKG_VERSION`, because the crate version in `Cargo.toml` is
|
||||
/// not kept in sync with the app version (and only `package.json` carries the
|
||||
/// nightly `-YYYYMMDDHH` stamp). Absent/unparseable => unset, so the Rust code
|
||||
/// falls back to the crate version.
|
||||
fn propagate_app_version() {
|
||||
let package_json = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
|
||||
.join("..")
|
||||
.join("package.json");
|
||||
println!("cargo:rerun-if-changed={}", package_json.display());
|
||||
|
||||
if let Some(version) = read_json_string_field(&package_json, "version") {
|
||||
println!("cargo:rustc-env=READEST_APP_VERSION={version}");
|
||||
}
|
||||
}
|
||||
|
||||
/// Read a top-level `"key": "value"` string from a JSON file without pulling in a
|
||||
/// JSON parser. Returns the first match; `None` if the file/key is absent or the
|
||||
/// value is empty. `package.json`'s own `"version"` is the first `"version"` key.
|
||||
fn read_json_string_field(path: &Path, key: &str) -> Option<String> {
|
||||
let contents = fs::read_to_string(path).ok()?;
|
||||
let needle = format!("\"{key}\"");
|
||||
for line in contents.lines() {
|
||||
let Some(rest) = line.trim_start().strip_prefix(&needle) else {
|
||||
continue;
|
||||
};
|
||||
let value = rest
|
||||
.trim_start()
|
||||
.strip_prefix(':')?
|
||||
.trim()
|
||||
.trim_end_matches(',')
|
||||
.trim()
|
||||
.trim_matches('"');
|
||||
if !value.is_empty() {
|
||||
return Some(value.to_string());
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
/// Bake the Sentry DSN into the crate at build time via `cargo:rustc-env`, so
|
||||
/// `option_env!("SENTRY_DSN")` (and, on iOS, the `readest_sentry_dsn` FFI) sees
|
||||
/// it. Precedence: an existing `SENTRY_DSN` in the environment (CI secret / shell
|
||||
/// export) wins; otherwise fall back to the gitignored `.env.local`, then `.env`,
|
||||
/// at the app root. Absent everywhere => unset, so reporting stays disabled for
|
||||
/// local and fork builds. `rerun-if-*` makes cargo recompile when the value or
|
||||
/// the dotenv files change (avoiding a stale baked-in value).
|
||||
fn propagate_sentry_dsn() {
|
||||
println!("cargo:rerun-if-env-changed=SENTRY_DSN");
|
||||
let app_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("..");
|
||||
let env_local = app_dir.join(".env.local");
|
||||
let env_file = app_dir.join(".env");
|
||||
println!("cargo:rerun-if-changed={}", env_local.display());
|
||||
println!("cargo:rerun-if-changed={}", env_file.display());
|
||||
|
||||
let dsn = env::var("SENTRY_DSN")
|
||||
.ok()
|
||||
.filter(|v| !v.is_empty())
|
||||
.or_else(|| read_env_value(&env_local, "SENTRY_DSN"))
|
||||
.or_else(|| read_env_value(&env_file, "SENTRY_DSN"));
|
||||
|
||||
if let Some(dsn) = dsn {
|
||||
println!("cargo:rustc-env=SENTRY_DSN={dsn}");
|
||||
}
|
||||
}
|
||||
|
||||
/// Read a single `KEY=value` from a dotenv-style file, skipping blank lines and
|
||||
/// `#` comments and stripping surrounding quotes. `None` if the file/key is
|
||||
/// absent or the value is empty.
|
||||
fn read_env_value(path: &Path, key: &str) -> Option<String> {
|
||||
let contents = fs::read_to_string(path).ok()?;
|
||||
for line in contents.lines() {
|
||||
let line = line.trim();
|
||||
if line.is_empty() || line.starts_with('#') {
|
||||
continue;
|
||||
}
|
||||
if let Some(value) = line
|
||||
.strip_prefix(key)
|
||||
.and_then(|rest| rest.trim_start().strip_prefix('='))
|
||||
{
|
||||
let value = value.trim().trim_matches(|c| c == '"' || c == '\'');
|
||||
if !value.is_empty() {
|
||||
return Some(value.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
fn build_windows_thumbnail() {
|
||||
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||
let dll_crate_dir = manifest_dir
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
"fs:allow-stat",
|
||||
"fs:allow-fstat",
|
||||
"fs:allow-lstat",
|
||||
"fs:read-all",
|
||||
"fs:write-all",
|
||||
{
|
||||
"identifier": "fs:scope-appconfig-recursive",
|
||||
"allow": [
|
||||
@@ -49,28 +51,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-cache-read",
|
||||
"allow": [
|
||||
{
|
||||
"path": "$APPCACHE/**/*"
|
||||
},
|
||||
{
|
||||
"path": "/private/var/mobile/Containers/Data/Application/**/*"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-cache-write",
|
||||
"allow": [
|
||||
{
|
||||
"path": "$APPCACHE/**/*"
|
||||
},
|
||||
{
|
||||
"path": "/private/var/mobile/Containers/Data/Application/**/*"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:scope",
|
||||
"allow": [
|
||||
@@ -88,6 +68,12 @@
|
||||
},
|
||||
{
|
||||
"path": "$TEMP/**/*"
|
||||
},
|
||||
{
|
||||
"path": "$APPCACHE/**/*"
|
||||
},
|
||||
{
|
||||
"path": "/private/var/mobile/Containers/Data/Application/**/*"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -202,6 +188,7 @@
|
||||
"device-info:default",
|
||||
"turso:default",
|
||||
"native-tts:default",
|
||||
"native-bridge:default"
|
||||
"native-bridge:default",
|
||||
"sentry:default"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -24,6 +24,20 @@ android {
|
||||
}
|
||||
defaultConfig {
|
||||
manifestPlaceholders["usesCleartextTraffic"] = "false"
|
||||
// Sentry DSN precedence: environment (CI secret / shell export) wins,
|
||||
// else the gitignored .env.local, else .env at the app root (../../../
|
||||
// from this module). Empty => Sentry auto-init no-ops.
|
||||
manifestPlaceholders["sentryDsn"] = System.getenv("SENTRY_DSN")?.takeIf { it.isNotBlank() }
|
||||
?: listOf("../../../.env.local", "../../../.env")
|
||||
.map { rootProject.file(it) }
|
||||
.filter { it.exists() }
|
||||
.firstNotNullOfOrNull { f ->
|
||||
f.readLines()
|
||||
.map { it.trim() }
|
||||
.firstOrNull { it.startsWith("SENTRY_DSN=") }
|
||||
?.substringAfter("=")?.trim()?.trim('"', '\'')?.takeIf { it.isNotEmpty() }
|
||||
}
|
||||
?: ""
|
||||
applicationId = "com.bilingify.readest"
|
||||
minSdk = 26
|
||||
targetSdk = 36
|
||||
@@ -88,6 +102,15 @@ dependencies {
|
||||
implementation("androidx.activity:activity-ktx:1.10.1")
|
||||
implementation("com.google.android.material:material:1.12.0")
|
||||
implementation("androidx.lifecycle:lifecycle-process:2.10.0")
|
||||
implementation("io.sentry:sentry-android:8.47.0") {
|
||||
// androidx.lifecycle:lifecycle-common-java8 was merged into
|
||||
// lifecycle-common and is no longer published at 2.9.0+. The project
|
||||
// pins androidx.lifecycle to 2.10.0 (lifecycle-process above), which
|
||||
// version-aligns this Sentry transitive to a nonexistent 2.10.0 and
|
||||
// breaks dependency resolution. The Java8 lifecycle APIs Sentry uses now
|
||||
// live in lifecycle-common, pulled in transitively via lifecycle-process.
|
||||
exclude(group = "androidx.lifecycle", module = "lifecycle-common-java8")
|
||||
}
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.4")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
|
||||
|
||||
@@ -22,6 +22,19 @@
|
||||
android:theme="@style/Theme.readest"
|
||||
android:hardwareAccelerated="true"
|
||||
android:usesCleartextTraffic="${usesCleartextTraffic}">
|
||||
|
||||
<!-- Android Auto: advertise the media capability so the Readest icon
|
||||
shows up in the car launcher and projects the TTS media session. -->
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.car.application"
|
||||
android:resource="@xml/automotive_app_desc" />
|
||||
|
||||
<!-- Sentry auto-init (ContentProvider). Empty DSN => disabled. Release
|
||||
is auto-detected from versionName; performance and PII stay at
|
||||
their safe off/false defaults. -->
|
||||
<meta-data android:name="io.sentry.dsn" android:value="${sentryDsn}" />
|
||||
<meta-data android:name="io.sentry.environment" android:value="production" />
|
||||
|
||||
<activity
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
|
||||
android:launchMode="singleTask"
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<automotiveApp>
|
||||
<uses name="media" />
|
||||
</automotiveApp>
|
||||
@@ -19,7 +19,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.11.12</string>
|
||||
<string>0.11.17</string>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
@import Sentry;
|
||||
|
||||
// Provided by the Rust static library (see src-tauri/src/sentry_config.rs).
|
||||
extern const char *readest_sentry_dsn(void);
|
||||
|
||||
// Starts sentry-cocoa at class-load time (before main), so native iOS crashes
|
||||
// are captured from launch without editing the generated main.mm / Info.plist.
|
||||
// The DSN comes from the Rust side (single SENTRY_DSN build-time source); a null
|
||||
// or empty DSN leaves the native SDK disabled, so local and fork builds do not
|
||||
// report. Crashes + errors only: no tracing, no PII.
|
||||
@interface ReadestSentryBootstrap : NSObject
|
||||
@end
|
||||
|
||||
@implementation ReadestSentryBootstrap
|
||||
|
||||
+ (void)load {
|
||||
const char *dsn = readest_sentry_dsn();
|
||||
if (dsn == NULL || dsn[0] == '\0') {
|
||||
return;
|
||||
}
|
||||
NSString *dsnString = [NSString stringWithUTF8String:dsn];
|
||||
[SentrySDK startWithConfigureOptions:^(SentryOptions *options) {
|
||||
options.dsn = dsnString;
|
||||
options.environment = @"production";
|
||||
options.tracesSampleRate = @0.0;
|
||||
options.sendDefaultPii = NO;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -4,6 +4,10 @@ options:
|
||||
deploymentTarget:
|
||||
iOS: 15.0
|
||||
fileGroups: [../../src]
|
||||
packages:
|
||||
Sentry:
|
||||
url: https://github.com/getsentry/sentry-cocoa
|
||||
from: 8.0.0
|
||||
configs:
|
||||
debug: debug
|
||||
release: release
|
||||
@@ -45,6 +49,7 @@ targets:
|
||||
# than ship a malformed one. IAP works without it.
|
||||
sources:
|
||||
- path: Sources
|
||||
- path: SentrySupport
|
||||
- path: Assets.xcassets
|
||||
# Only reference Externals as a file group (no compile/resource
|
||||
# phases) — the actual libapp.a lookup happens via the
|
||||
@@ -92,6 +97,8 @@ targets:
|
||||
EXCLUDED_ARCHS[sdk=iphoneos*]: x86_64
|
||||
groups: [app]
|
||||
dependencies:
|
||||
- package: Sentry
|
||||
product: Sentry
|
||||
- framework: libapp.a
|
||||
embed: false
|
||||
- target: ShareExtension
|
||||
@@ -139,9 +146,13 @@ targets:
|
||||
NSExtensionPointIdentifier: com.apple.share-services
|
||||
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController
|
||||
NSExtensionAttributes:
|
||||
# Web URLs only. Do NOT add NSExtensionActivationSupportsText: a
|
||||
# .txt file is public.plain-text (conforms to public.text), so that
|
||||
# key makes this article-URL clipper activate for plain-text FILES
|
||||
# it can't handle (the share sheet hangs). Book files must fall
|
||||
# through to the main app's CFBundleDocumentTypes import path.
|
||||
NSExtensionActivationRule:
|
||||
NSExtensionActivationSupportsWebURLWithMaxCount: 1
|
||||
NSExtensionActivationSupportsText: true
|
||||
# Entitlements referenced via CODE_SIGN_ENTITLEMENTS build setting
|
||||
# rather than xcodegen's `entitlements:` block — otherwise xcodegen
|
||||
# may overwrite the file (even with no properties declared) during
|
||||
@@ -153,16 +164,16 @@ targets:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.bilingify.readest.ShareExtension
|
||||
DEVELOPMENT_TEAM: J5W48D69VR
|
||||
CODE_SIGN_ENTITLEMENTS: ShareExtension/ShareExtension.entitlements
|
||||
# Permit Xcode's productPackagingUtility to write the auto-derived
|
||||
# signing entitlements (application-identifier, team-identifier,
|
||||
# get-task-allow) back to the source entitlements file at build
|
||||
# time. Without this, Xcode 16+ refuses the modification it
|
||||
# itself just performed and the build fails with:
|
||||
# "Entitlements file ... was modified during the build"
|
||||
# Safe for this target because the entitlements file is empty —
|
||||
# the only modifications Xcode performs are the team / app-id
|
||||
# auto-population every iOS extension target needs anyway.
|
||||
CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION: YES
|
||||
# Do NOT set CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION here. This
|
||||
# entitlements file declares com.apple.security.application-groups
|
||||
# (group.com.bilingify.readest). With automatic App Store signing,
|
||||
# that flag lets `xcodebuild -exportArchive` overwrite the extension
|
||||
# entitlements with a minimal auto-derived set that DROPS the app
|
||||
# group — silently breaking App Group access in App Store builds
|
||||
# (dev builds are unaffected). The main app ships the group
|
||||
# correctly without this flag. If Xcode ever reports "Entitlements
|
||||
# file was modified during the build", fix it by adding the
|
||||
# auto-derived keys to the source file, not by re-enabling this flag.
|
||||
SWIFT_VERSION: "5.0"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: 15.0
|
||||
ARCHS: [arm64]
|
||||
@@ -192,7 +203,10 @@ targets:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.bilingify.readest.ReadestWidget
|
||||
DEVELOPMENT_TEAM: J5W48D69VR
|
||||
CODE_SIGN_ENTITLEMENTS: ReadestWidget/ReadestWidget.entitlements
|
||||
CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION: YES
|
||||
# CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION is intentionally omitted
|
||||
# (see ShareExtension): with it, the App Store export re-sign strips
|
||||
# com.apple.security.application-groups, so the widget reads an empty
|
||||
# snapshot from the App Group and shows only the placeholder book icon.
|
||||
SWIFT_VERSION: "5.0"
|
||||
IPHONEOS_DEPLOYMENT_TARGET: 15.0
|
||||
ARCHS: [arm64]
|
||||
|
||||
@@ -37,6 +37,16 @@ keyring-core = "1"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
apple-native-keyring-store = { version = "1", features = ["keychain"] }
|
||||
# WKWebView snapshot for the mesh page-curl texture (#555) — same
|
||||
# dynamic-ObjC stack the main app's `src/macos/` modules use.
|
||||
objc = "0.2.7"
|
||||
cocoa = "0.25"
|
||||
block = "0.1.6"
|
||||
|
||||
[target.'cfg(any(target_os = "ios", target_os = "android"))'.dependencies]
|
||||
# The Swift/Kotlin plugin boundary is JSON-only, so webview snapshots
|
||||
# arrive base64-encoded and are decoded back to bytes in mobile.rs.
|
||||
base64 = "0.22"
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
windows-native-keyring-store = "1"
|
||||
|
||||
+87
@@ -19,7 +19,13 @@ import android.view.KeyEvent
|
||||
import android.view.WindowInsets
|
||||
import android.view.WindowManager
|
||||
import android.view.WindowInsetsController
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Color
|
||||
import android.graphics.Rect
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Base64
|
||||
import android.view.PixelCopy
|
||||
import android.webkit.WebView
|
||||
import android.content.pm.ActivityInfo
|
||||
import android.content.pm.PackageManager
|
||||
@@ -123,6 +129,14 @@ class UpdateReadingWidgetBookArgs {
|
||||
var coverPath: String = ""
|
||||
}
|
||||
|
||||
@InvokeArg
|
||||
class CaptureWebviewRegionArgs {
|
||||
var x: Float = 0f
|
||||
var y: Float = 0f
|
||||
var width: Float = 0f
|
||||
var height: Float = 0f
|
||||
}
|
||||
|
||||
@InvokeArg
|
||||
class UpdateReadingWidgetTtsArgs {
|
||||
var active: Boolean = false
|
||||
@@ -177,6 +191,7 @@ class NativeBridgePlugin(private val activity: Activity): Plugin(activity) {
|
||||
private val implementation = NativeBridge()
|
||||
private var redirectScheme = "readest"
|
||||
private var redirectHost = "auth-callback"
|
||||
private var webViewRef: WebView? = null
|
||||
private val billingManager by lazy {
|
||||
BillingManager(activity)
|
||||
}
|
||||
@@ -202,6 +217,7 @@ class NativeBridgePlugin(private val activity: Activity): Plugin(activity) {
|
||||
|
||||
override fun load(webView: WebView) {
|
||||
instance = this
|
||||
webViewRef = webView
|
||||
super.load(webView)
|
||||
handleIntent(activity.intent)
|
||||
}
|
||||
@@ -1511,6 +1527,77 @@ class NativeBridgePlugin(private val activity: Activity): Plugin(activity) {
|
||||
invoke.resolve(ret)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Snapshot a region of the webview for the mesh page-curl texture
|
||||
* (readest#555). The rect arrives in CSS pixels of the JS viewport;
|
||||
* scaling by the display density (devicePixelRatio) maps it to window
|
||||
* pixels. PixelCopy reads back from the window surface, which includes
|
||||
* the hardware-accelerated WebView that View.draw would miss. Resolved
|
||||
* as base64 because the plugin boundary is JSON-only; the Rust side
|
||||
* decodes back to bytes.
|
||||
*
|
||||
* The result is JPEG, not PNG: a full-screen 3x PNG took ~1.5s to
|
||||
* encode per page turn on a Xiaomi 13, which read as the curl not
|
||||
* working at all. The page is opaque so JPEG loses nothing visible,
|
||||
* and the destination bitmap is capped at 2x CSS pixels — PixelCopy
|
||||
* scales into a smaller bitmap for free and the moving page stays
|
||||
* visually sharp.
|
||||
*/
|
||||
@Command
|
||||
fun capture_webview_region(invoke: Invoke) {
|
||||
val args = invoke.parseArgs(CaptureWebviewRegionArgs::class.java)
|
||||
val webView = webViewRef
|
||||
val window = activity.window
|
||||
if (webView == null || window == null) {
|
||||
invoke.reject("WebView not available")
|
||||
return
|
||||
}
|
||||
activity.runOnUiThread {
|
||||
val density = webView.resources.displayMetrics.density
|
||||
val location = IntArray(2)
|
||||
webView.getLocationInWindow(location)
|
||||
val left = location[0] + (args.x * density).toInt()
|
||||
val top = location[1] + (args.y * density).toInt()
|
||||
val width = (args.width * density).toInt()
|
||||
val height = (args.height * density).toInt()
|
||||
if (width <= 0 || height <= 0) {
|
||||
invoke.reject("Empty capture region")
|
||||
return@runOnUiThread
|
||||
}
|
||||
val captureScale = minOf(density, 2f)
|
||||
val destWidth = (args.width * captureScale).toInt()
|
||||
val destHeight = (args.height * captureScale).toInt()
|
||||
val bitmap = Bitmap.createBitmap(destWidth, destHeight, Bitmap.Config.ARGB_8888)
|
||||
try {
|
||||
PixelCopy.request(
|
||||
window,
|
||||
Rect(left, top, left + width, top + height),
|
||||
bitmap,
|
||||
{ result ->
|
||||
if (result == PixelCopy.SUCCESS) {
|
||||
// Encode off the main thread; ~100ms of work for
|
||||
// a full-screen 2x JPEG.
|
||||
pluginScope.launch {
|
||||
val data = withContext(Dispatchers.IO) {
|
||||
val out = ByteArrayOutputStream()
|
||||
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
|
||||
Base64.encodeToString(out.toByteArray(), Base64.NO_WRAP)
|
||||
}
|
||||
invoke.resolve(JSObject().put("data", data))
|
||||
}
|
||||
} else {
|
||||
invoke.reject("PixelCopy failed: $result")
|
||||
}
|
||||
},
|
||||
Handler(Looper.getMainLooper())
|
||||
)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
// Thrown when the rect falls outside the window bounds.
|
||||
invoke.reject("Capture region out of bounds: ${e.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@app.tauri.annotation.InvokeArg
|
||||
|
||||
@@ -39,6 +39,7 @@ const COMMANDS: &[&str] = &[
|
||||
"clear_secure_item",
|
||||
"refresh_eink_screen",
|
||||
"update_reading_widget",
|
||||
"capture_webview_region",
|
||||
];
|
||||
|
||||
fn main() {
|
||||
|
||||
@@ -7,7 +7,11 @@ let package = Package(
|
||||
name: "tauri-plugin-native-bridge",
|
||||
platforms: [
|
||||
.macOS(.v10_13),
|
||||
.iOS(.v14),
|
||||
// Matches the app's IPHONEOS_DEPLOYMENT_TARGET (15.0); StoreKit's
|
||||
// Storefront is used unguarded and needs iOS 15. SPM takes the
|
||||
// deployment floor from this stanza, not from the build triple.
|
||||
// (String form: `.v15` needs swift-tools 5.5, this manifest is 5.3.)
|
||||
.iOS("15.0"),
|
||||
],
|
||||
products: [
|
||||
// Products define the executables and libraries a package produces, and make them visible to other packages.
|
||||
|
||||
+92
-8
@@ -470,6 +470,16 @@ class NativeBridgePlugin: Plugin {
|
||||
private var webViewLifecycleManager: WebViewLifecycleManager?
|
||||
private var traitChangeRegistered = false
|
||||
|
||||
// Screen-brightness management. `UIScreen.main.brightness` is a *global*
|
||||
// device setting, not a per-window one: once the app writes to it, iOS
|
||||
// suppresses ambient auto-brightness and the override survives backgrounding,
|
||||
// leaving the system stuck at the app's level until the user nudges it
|
||||
// manually (issue #4885). We remember the value that was there before the
|
||||
// first override so we can hand it back whenever the app leaves the
|
||||
// foreground, and re-assert the app's value when it returns.
|
||||
private var appDesiredBrightness: CGFloat?
|
||||
private var systemBrightnessBeforeOverride: CGFloat?
|
||||
|
||||
@objc public override func load(webview: WKWebView) {
|
||||
self.webView = webview
|
||||
logger.log("NativeBridgePlugin loaded")
|
||||
@@ -536,6 +546,10 @@ class NativeBridgePlugin: Plugin {
|
||||
|
||||
@objc func appWillEnterForeground() {
|
||||
logger.log("NativeBridgePlugin: App will enter foreground")
|
||||
// Re-assert the app's brightness that was released on background (#4885).
|
||||
if let desired = appDesiredBrightness {
|
||||
UIScreen.main.brightness = desired
|
||||
}
|
||||
webViewLifecycleManager?.handleAppWillEnterForeground()
|
||||
}
|
||||
|
||||
@@ -662,6 +676,11 @@ class NativeBridgePlugin: Plugin {
|
||||
if let handler = volumeKeyHandler, handler.isIntercepting {
|
||||
handler.stopInterception()
|
||||
}
|
||||
// Hand screen brightness back to iOS so ambient auto-brightness resumes
|
||||
// while backgrounded; the override is re-applied on foreground (#4885).
|
||||
if appDesiredBrightness != nil, let original = systemBrightnessBeforeOverride {
|
||||
UIScreen.main.brightness = original
|
||||
}
|
||||
webViewLifecycleManager?.handleAppDidEnterBackground()
|
||||
}
|
||||
|
||||
@@ -1050,22 +1069,39 @@ class NativeBridgePlugin: Plugin {
|
||||
|
||||
let brightness = args.brightness ?? 0.5
|
||||
|
||||
if brightness < 0.0 {
|
||||
// Revert to system brightness - iOS doesn't have a direct "system brightness" setting
|
||||
// We will restore the brightness that was set before the app modified it
|
||||
return invoke.resolve(["success": true])
|
||||
}
|
||||
|
||||
if brightness > 1.0 {
|
||||
return invoke.reject("Brightness must be between 0.0 and 1.0")
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
UIScreen.main.brightness = CGFloat(brightness)
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self = self else { return }
|
||||
if brightness < 0.0 {
|
||||
// A negative value means "release control back to the system", mirroring
|
||||
// Android's BRIGHTNESS_OVERRIDE_NONE. Restore the pre-override brightness
|
||||
// so iOS resumes ambient auto-brightness.
|
||||
self.releaseBrightnessControl()
|
||||
} else {
|
||||
if self.systemBrightnessBeforeOverride == nil {
|
||||
self.systemBrightnessBeforeOverride = UIScreen.main.brightness
|
||||
}
|
||||
self.appDesiredBrightness = CGFloat(brightness)
|
||||
UIScreen.main.brightness = CGFloat(brightness)
|
||||
}
|
||||
}
|
||||
invoke.resolve(["success": true])
|
||||
}
|
||||
|
||||
/// Restore the brightness captured before the app first overrode it so iOS
|
||||
/// resumes ambient auto-brightness, then forget our managed state. Must run
|
||||
/// on the main thread.
|
||||
private func releaseBrightnessControl() {
|
||||
if let original = systemBrightnessBeforeOverride {
|
||||
UIScreen.main.brightness = original
|
||||
}
|
||||
appDesiredBrightness = nil
|
||||
systemBrightnessBeforeOverride = nil
|
||||
}
|
||||
|
||||
@objc public func copy_uri_to_path(_ invoke: Invoke) {
|
||||
guard let args = try? invoke.parseArgs(CopyUriToPathRequestArgs.self) else {
|
||||
return invoke.reject("Failed to parse arguments")
|
||||
@@ -1522,6 +1558,47 @@ class NativeBridgePlugin: Plugin {
|
||||
invoke.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
/// Snapshot a region of the webview for the mesh page-curl texture
|
||||
/// (#555). The rect is in CSS pixels of the JS viewport (== points of
|
||||
/// the WKWebView). Like Android, the snapshot is capped at 2x CSS
|
||||
/// pixels (Pro iPhones render at 3x) and encoded as JPEG — the page is
|
||||
/// opaque and JPEG encodes several times faster than PNG, keeping the
|
||||
/// dead time between the tap and the first curl frame short. Resolved
|
||||
/// as base64 because the plugin boundary is JSON-only; the Rust side
|
||||
/// decodes back to bytes.
|
||||
@objc public func capture_webview_region(_ invoke: Invoke) {
|
||||
guard let args = try? invoke.parseArgs(CaptureWebviewRegionArgs.self) else {
|
||||
return invoke.reject("Failed to parse arguments")
|
||||
}
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let webView = self?.webView else {
|
||||
return invoke.reject("WebView not available")
|
||||
}
|
||||
let config = WKSnapshotConfiguration()
|
||||
config.rect = CGRect(x: args.x, y: args.y, width: args.width, height: args.height)
|
||||
// snapshotWidth is in points and the produced image is snapshotWidth
|
||||
// x screen-scale pixels wide, so width x (2 / scale) points yields a
|
||||
// 2x-CSS-pixel bitmap on 3x screens and native size elsewhere.
|
||||
let scale = webView.window?.screen.scale ?? UIScreen.main.scale
|
||||
if scale > 2 {
|
||||
config.snapshotWidth = NSNumber(value: args.width * 2.0 / scale)
|
||||
}
|
||||
webView.takeSnapshot(with: config) { image, error in
|
||||
guard let image = image else {
|
||||
return invoke.reject(error?.localizedDescription ?? "Snapshot failed")
|
||||
}
|
||||
// Encode and base64 off the main thread; the completion arrives on
|
||||
// main and a full-screen encode is fast but not free.
|
||||
DispatchQueue.global(qos: .userInteractive).async {
|
||||
guard let data = image.jpegData(compressionQuality: 0.85) else {
|
||||
return invoke.reject("JPEG encoding failed")
|
||||
}
|
||||
invoke.resolve(["data": data.base64EncodedString()])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Persistent store for security-scoped folder bookmarks.
|
||||
@@ -1764,6 +1841,13 @@ struct UpdateReadingWidgetRequestArgs: Decodable {
|
||||
let emptyTitle: String
|
||||
}
|
||||
|
||||
struct CaptureWebviewRegionArgs: Decodable {
|
||||
let x: Double
|
||||
let y: Double
|
||||
let width: Double
|
||||
let height: Double
|
||||
}
|
||||
|
||||
@_cdecl("init_plugin_native_bridge")
|
||||
func initPlugin() -> Plugin {
|
||||
return NativeBridgePlugin()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user