From ba7b82631f2b29cea3f034b42d52404a42e20960 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Wed, 8 Oct 2025 16:42:12 +0800 Subject: [PATCH 001/114] build(docker): use old-releases apt repo --- komga/docker/Dockerfile.tpl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/komga/docker/Dockerfile.tpl b/komga/docker/Dockerfile.tpl index 9f092a16..ec84b45f 100644 --- a/komga/docker/Dockerfile.tpl +++ b/komga/docker/Dockerfile.tpl @@ -9,7 +9,8 @@ FROM ubuntu:24.10 as build-amd64 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" -RUN apt -y update && \ +RUN sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list.d/ubuntu.sources && \ + apt -y update && \ apt -y install ca-certificates locales libjxl-dev libheif-dev libwebp-dev libarchive-dev wget curl && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ @@ -23,7 +24,8 @@ FROM ubuntu:24.10 as build-arm64 ENV JAVA_HOME=/opt/java/openjdk COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME ENV PATH="${JAVA_HOME}/bin:${PATH}" -RUN apt -y update && \ +RUN sed -i -re 's/([a-z]{2}\.)?ports.ubuntu.com\/ubuntu-ports/old-releases.ubuntu.com\/ubuntu/g' /etc/apt/sources.list.d/ubuntu.sources && \ + apt -y update && \ apt -y install ca-certificates locales libjxl-dev libheif-dev libwebp-dev libarchive-dev wget curl && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \ locale-gen en_US.UTF-8 && \ From af66144060769678eea1b2ecc9a9886231fde50d Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Tue, 14 Oct 2025 13:57:53 +0800 Subject: [PATCH 002/114] docs(api): fix mediatype --- .../org/gotson/komga/interfaces/api/rest/ReadListController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt index f2d3347b..b5aa73bc 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/ReadListController.kt @@ -268,7 +268,7 @@ class ReadListController( } @Operation(summary = "Match ComicRack list", tags = [OpenApiConfiguration.TagNames.COMICRACK]) - @PostMapping("match/comicrack") + @PostMapping("match/comicrack", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE]) @PreAuthorize("hasRole('ADMIN')") fun matchComicRackList( @RequestParam("file") file: MultipartFile, From c23f2d3810d90bed109f52f79e2cb8a223b8ecf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 07:11:11 +0000 Subject: [PATCH 003/114] deps(ci): bump actions/setup-node from 5 to 6 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- .github/workflows/tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 32fbf25d..4e0c5caf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,7 +84,7 @@ jobs: if: needs.version.outputs.should_release #only redo if the version changed run: sed -i -e "s/version=.*/version=${{ needs.version.outputs.version_next }}/" gradle.properties - - uses: actions/setup-node@v5 + - uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' cache: 'npm' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 42053eea..d40cff56 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -79,7 +79,7 @@ jobs: name: Test webui builds steps: - uses: actions/checkout@v5 - - uses: actions/setup-node@v5 + - uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' cache: 'npm' From fe40ede34adffa61f4c4e6aa211e3420c5ce22db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 07:19:06 +0000 Subject: [PATCH 004/114] deps(ci): bump actions/upload-artifact from 4 to 5 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 10 +++++----- .github/workflows/tests.yml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4e0c5caf..6d1acdf0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -143,7 +143,7 @@ jobs: JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: JReleaser Changelog output if: always() && needs.version.outputs.should_release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: jreleaser-changelog path: | @@ -182,7 +182,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }} - name: Upload Conveyor log if: always() && inputs.conveyor-copied-site - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: conveyor-make-copied-site path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt @@ -194,7 +194,7 @@ jobs: JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: JReleaser Release output if: always() && inputs.github_release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: jreleaser-release path: | @@ -212,7 +212,7 @@ jobs: JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: JReleaser Publish output if: always() && inputs.docker_release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: jreleaser-publish path: | @@ -236,7 +236,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }} - name: Upload Conveyor log if: always() && inputs.msstore_release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: conveyor-ms-store-release path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d40cff56..d155b18f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,14 +35,14 @@ jobs: - name: Upload Unit Test Results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: test-results-${{ matrix.os }} path: komga/build/test-results/ - name: Upload Unit Test Reports if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: test-reports-${{ matrix.os }} path: komga/build/reports/tests/ @@ -69,7 +69,7 @@ jobs: - name: Upload JDK required modules if: steps.conveyor_compare.outcome == 'failure' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: conveyor-required-jdk-modules path: ./output/required-jdk-modules.txt From f8ca936ee7ffcfd9b2a71e6444d0ce8130f006b6 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Mon, 3 Nov 2025 10:37:32 +0800 Subject: [PATCH 005/114] fix: properly decode cover href when generating epub cover Closes: #2118 --- .../komga/infrastructure/mediacontainer/epub/EpubExtractor.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/EpubExtractor.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/EpubExtractor.kt index d2072e31..8db0230c 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/EpubExtractor.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/mediacontainer/epub/EpubExtractor.kt @@ -67,7 +67,7 @@ class EpubExtractor( ?: // try id="cover-image" manifest.values.firstOrNull { it.id == "cover-image" } if (coverManifestItem != null) { - val href = coverManifestItem.href + val href = URLDecoder.decode(coverManifestItem.href, Charsets.UTF_8) val mediaType = coverManifestItem.mediaType val coverPath = normalizeHref(opfDir, href) zip.getEntryBytes(coverPath)?.let { coverBytes -> From 727fe39e6dfe1915f8710d5c59ecfb1dca49b7ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 02:33:01 +0000 Subject: [PATCH 006/114] build(webui): update Browserslist db --- komga-webui/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index 41ac510d..a316b2ef 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -5779,9 +5779,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001752", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz", + "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==", "funding": [ { "type": "opencollective", @@ -24153,9 +24153,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==" + "version": "1.0.30001752", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz", + "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", From 6b07fda273040c50ce9eefc2a1a2f4370a3fc540 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 07:01:56 +0000 Subject: [PATCH 007/114] deps(ci): bump mikepenz/action-junit-report from 5 to 6 Bumps [mikepenz/action-junit-report](https://github.com/mikepenz/action-junit-report) from 5 to 6. - [Release notes](https://github.com/mikepenz/action-junit-report/releases) - [Commits](https://github.com/mikepenz/action-junit-report/compare/v5...v6) --- updated-dependencies: - dependency-name: mikepenz/action-junit-report dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d155b18f..a13b16b3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -48,7 +48,7 @@ jobs: path: komga/build/reports/tests/ - name: Publish Test Report - uses: mikepenz/action-junit-report@v5 + uses: mikepenz/action-junit-report@v6 if: always() with: report_paths: '**/build/test-results/test/TEST-*.xml' From 9a56b30b6cba085bdc0bd6af99d59ab6153d3d16 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Mon, 3 Nov 2025 16:00:05 +0800 Subject: [PATCH 008/114] ci: fix svu install --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6d1acdf0..20ede344 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,7 +50,7 @@ jobs: id: set-up-homebrew uses: Homebrew/actions/setup-homebrew@master - name: Install svu - run: brew install caarlos0/tap/svu + run: brew install --cask caarlos0/tap/svu - name: Compute next version for release run: | echo "VERSION_NEXT=`svu ${{ inputs.bump }}`" | tee -a $GITHUB_ENV From b925f3e19df8f73d3d1a94a82b33e08afc979088 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 9 Nov 2025 23:26:07 -0800 Subject: [PATCH 009/114] fix(kobo): proxy Content-Type headers for kobo Closes: #2074 --- .../kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 67e628f2..6aa3da1a 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -50,6 +50,7 @@ class KoboProxy( HttpHeaders.USER_AGENT, HttpHeaders.ACCEPT, HttpHeaders.ACCEPT_LANGUAGE, + HttpHeaders.CONTENT_TYPE, ) private val headersOutExclude = From ce3ad4c1c7877709bcaa73ac01ea62e6258c8b44 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 10 Nov 2025 23:52:32 -0800 Subject: [PATCH 010/114] fix(kobo): prevent double URL encoding when proxying Closes: #2130 --- .../komga/infrastructure/kobo/KoboProxy.kt | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 6aa3da1a..2a35c911 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -18,6 +18,7 @@ import org.springframework.util.LinkedMultiValueMap import org.springframework.web.client.RestClient import org.springframework.web.client.toEntity import org.springframework.web.server.ResponseStatusException +import org.springframework.web.util.DefaultUriBuilderFactory import kotlin.time.Duration.Companion.minutes import kotlin.time.toJavaDuration @@ -29,18 +30,26 @@ class KoboProxy( private val komgaSyncTokenGenerator: KomgaSyncTokenGenerator, private val komgaSettingsProvider: KomgaSettingsProvider, ) { - private val koboApiClient = - RestClient - .builder() - .baseUrl("https://storeapi.kobo.com") - .requestFactory( - ClientHttpRequestFactoryBuilder.reactor().build( - ClientHttpRequestFactorySettings - .defaults() - .withReadTimeout(1.minutes.toJavaDuration()) - .withConnectTimeout(1.minutes.toJavaDuration()), - ), - ).build() + private val koboApiClient: RestClient + + init { + val uriBuilderFactory = DefaultUriBuilderFactory("https://storeapi.kobo.com") + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) + + koboApiClient = + RestClient + .builder() + .uriBuilderFactory( + uriBuilderFactory, + ).requestFactory( + ClientHttpRequestFactoryBuilder.reactor().build( + ClientHttpRequestFactorySettings + .defaults() + .withReadTimeout(1.minutes.toJavaDuration()) + .withConnectTimeout(1.minutes.toJavaDuration()), + ), + ).build() + } private val pathRegex = """\/kobo\/[-\w]*(.*)""".toRegex() From 454c6c72023dc8242db287ba8a968f4f682b1f88 Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 12 Nov 2025 21:32:16 -0800 Subject: [PATCH 011/114] refactor(kobo): log error responses --- .../kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 2a35c911..70ea3080 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -120,6 +120,7 @@ class KoboProxy( }.apply { if (body != null) body(body) } .retrieve() .onStatus(HttpStatusCode::isError) { _, response -> + logger.debug { "Kobo response: $response" } throw ResponseStatusException(response.statusCode, response.statusText) }.toEntity() From f138fe31e76abb0cb8ad6bae456c3a8b26f59e48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 07:01:45 +0000 Subject: [PATCH 012/114] deps(ci): bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/browserlist-update.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/tests.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/browserlist-update.yml b/.github/workflows/browserlist-update.yml index 0893bab1..0f0a0ccb 100644 --- a/.github/workflows/browserlist-update.yml +++ b/.github/workflows/browserlist-update.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Configure git diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 20ede344..5686e390 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,7 +43,7 @@ jobs: version_next: ${{ steps.versions.outputs.version_next }} should_release: ${{ steps.versions.outputs.should_release }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Homebrew @@ -72,7 +72,7 @@ jobs: sudo rm -rf /usr/share/dotnet sudo rm -rf "$AGENT_TOOLSDIRECTORY" - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a13b16b3..f5ded219 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,7 +19,7 @@ jobs: fail-fast: false name: Test server - ${{ matrix.os }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup Java 21 uses: actions/setup-java@v5 with: @@ -78,7 +78,7 @@ jobs: runs-on: ubuntu-latest name: Test webui builds steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: node-version-file: '.nvmrc' From cd47fc777a7178c26deec5841bcf5cadc1047ad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 07:46:33 +0000 Subject: [PATCH 013/114] deps(webui): bump js-yaml from 3.14.1 to 3.14.2 in /komga-webui Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.1 to 3.14.2. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 3.14.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- komga-webui/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index a316b2ef..eb7f19db 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -13026,9 +13026,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -29505,9 +29505,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "requires": { "argparse": "^1.0.7", From 0f2545394939d767263c8e04ed0960721ef5640e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 22:29:26 +0000 Subject: [PATCH 014/114] deps(webui): bump node-forge from 1.3.1 to 1.3.2 in /komga-webui Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2. - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2) --- updated-dependencies: - dependency-name: node-forge dependency-version: 1.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- komga-webui/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index eb7f19db..e036ed76 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -14161,9 +14161,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -30398,9 +30398,9 @@ } }, "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "dev": true }, "node-int64": { From 3739951b360f9f2e10727cc9dd2e587aabcc791d Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 27 Nov 2025 19:10:01 -0800 Subject: [PATCH 015/114] fix(kobo): proxy 401 errors on initialization Co-authored-by: Gauthier Roebroeck --- .../komga/infrastructure/kobo/KoboProxy.kt | 40 +++++++++---------- .../interfaces/api/kobo/KoboController.kt | 5 ++- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt index 70ea3080..2df061ec 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/kobo/KoboProxy.kt @@ -30,28 +30,24 @@ class KoboProxy( private val komgaSyncTokenGenerator: KomgaSyncTokenGenerator, private val komgaSettingsProvider: KomgaSettingsProvider, ) { - private val koboApiClient: RestClient + private val koboApiClient: RestClient = + RestClient + .builder() + .uriBuilderFactory( + DefaultUriBuilderFactory("https://storeapi.kobo.com") + .apply { + this.encodingMode = DefaultUriBuilderFactory.EncodingMode.NONE + }, + ).requestFactory( + ClientHttpRequestFactoryBuilder.reactor().build( + ClientHttpRequestFactorySettings + .defaults() + .withReadTimeout(1.minutes.toJavaDuration()) + .withConnectTimeout(1.minutes.toJavaDuration()), + ), + ).build() - init { - val uriBuilderFactory = DefaultUriBuilderFactory("https://storeapi.kobo.com") - uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE) - - koboApiClient = - RestClient - .builder() - .uriBuilderFactory( - uriBuilderFactory, - ).requestFactory( - ClientHttpRequestFactoryBuilder.reactor().build( - ClientHttpRequestFactorySettings - .defaults() - .withReadTimeout(1.minutes.toJavaDuration()) - .withConnectTimeout(1.minutes.toJavaDuration()), - ), - ).build() - } - - private val pathRegex = """\/kobo\/[-\w]*(.*)""".toRegex() + private val pathRegex = """/kobo/[-\w]*(.*)""".toRegex() private val headersOutInclude = setOf( @@ -120,7 +116,7 @@ class KoboProxy( }.apply { if (body != null) body(body) } .retrieve() .onStatus(HttpStatusCode::isError) { _, response -> - logger.debug { "Kobo response: $response" } + logger.debug { "Kobo response: ${response.statusCode}: ${response.body.bufferedReader().use { it.readText() }}" } throw ResponseStatusException(response.statusCode, response.statusText) }.toEntity() diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt index f92fba46..53eb11a6 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/kobo/KoboController.kt @@ -194,6 +194,7 @@ class KoboController( try { koboProxy.proxyCurrentRequest().body?.get("Resources") } catch (e: Exception) { + if (e is ResponseStatusException && e.statusCode == HttpStatus.UNAUTHORIZED) throw e logger.warn { "Failed to get response from Kobo /v1/initialization, fallback to noproxy" } null } ?: koboProxy.nativeKoboResources @@ -233,7 +234,7 @@ class KoboController( ): Any { try { return koboProxy.proxyCurrentRequest(body) - } catch (e: Exception) { + } catch (_: Exception) { logger.warn { "Failed to get response from Kobo /v1/auth/device, fallback to noproxy" } } @@ -395,7 +396,7 @@ class KoboController( addAll( // changed books are also passed as changed reading state because Kobo does not process ChangedEntitlement even if it contains a ReadingState (booksChanged.content + changedReadingState.content).mapNotNull { book -> - readProgress[book.bookId]?.let { it -> + readProgress[book.bookId]?.let { ChangedReadingStateDto( WrappedReadingStateDto( it.toDto(), From b43046fbeb80c2a34b41e1c7d62280a71af9acaf Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:22 +0100 Subject: [PATCH 016/114] chore: update translation files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated by "Remove blank strings" hook in Weblate. i18n(webui): translated using Weblate (Galician) Currently translated at 20.1% (169 of 840 strings) Co-authored-by: Francisco José Aquino García Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/komga/webui/ Translate-URL: https://hosted.weblate.org/projects/komga/webui/gl/ Translation: komga/webui --- komga-webui/src/locales/gl.json | 165 +++++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 3 deletions(-) diff --git a/komga-webui/src/locales/gl.json b/komga-webui/src/locales/gl.json index 3408fe19..cc4dcba7 100644 --- a/komga-webui/src/locales/gl.json +++ b/komga-webui/src/locales/gl.json @@ -19,7 +19,15 @@ }, "account_settings": { "account_settings": "Configuración da conta", - "change_password": "Cambiar o contrasinal" + "api_key": { + "created_date": "Data de creación: {date}", + "force_kobo_sync": "Forzar a sincronización con Kobo", + "generate_api_key": "Xerar clave API", + "no_keys": "Aínda non se xerou clave API ningunha" + }, + "change_password": "Cambiar o contrasinal", + "details": "Detalles", + "my_account": "A miña conta" }, "announcements": { "mark_all_read": "Marcar todo como lido", @@ -27,6 +35,7 @@ "tab_title": "Avisos" }, "authentication_activity": { + "api_key": "Clave API", "datetime": "Data e Hora", "email": "Correo electrónico", "error": "Erro", @@ -58,9 +67,159 @@ "button_scan": "Escanear", "button_select_series": "Escolle a serie", "field_import_path": "Importar dende un cartafol", - "info_part1": "Esta pantalla permitiralle importar arquivos que están fóra das súas bibliotecas existentes. Só pódese importar arquivos a series que xa existan, nese caso Komga moverá ou copiará os arquivos cara o directorio da serie escollida." + "info_part1": "Esta pantalla permitiralle importar arquivos que están fóra das súas bibliotecas existentes. Só pódese importar arquivos a series que xa existan, nese caso Komga moverá ou copiará os arquivos cara o directorio da serie escollida.", + "info_part2": "Se escolles un número para un libro e existe xa algún outro libro con ese número, poderás comparalos. Se decides importar o libro, Komga actualizará o existente co novo, substituindo o ficheiro existente co novo.", + "no_files_found": "Non se atoparon ficheiros", + "notification": { + "go_to_book": "Ir ao libro", + "import_failure": "Fallou a importación do libro: {file}", + "import_successful": "Libro importado con éxito: {book}", + "source_file": "Ficheiro orixe: {file}" + }, + "row": { + "error_analyze_first": "É necesario analizar antes o libro", + "error_choose_series": "Escoller serie", + "error_only_import_no_errors": "Só se poden importar libros sen erros", + "warning_upgrade": "Actualizarase o libro existente" + }, + "table": { + "destination_name": "Nome de destino", + "file_name": "Nome do ficheiro", + "number": "Número", + "series": "Serie" + }, + "title": "Importar", + "try_another_directory": "Tenta atopar outro directorio" + }, + "bookreader": { + "beginning_of_book": "Atópaste ao principio do libro.", + "changing_reading_direction": "Trocar o sentido de lectura a", + "download_current_page": "Baixar a páxina actual", + "end_of_book": "Chegaches ao final do libro.", + "from_series_metadata": "dende os metadatos da serie", + "move_next": "Volve pulsar \"Seguinte\" para pasar ao seguinte libro.", + "move_next_exit": "Volve pulser \"Seguinte\" para saír do lector.", + "move_previous": "Volve pulsar \"Anterior\" para pasar ao libro anterior.", + "notification_poster_set_book": "A portada do libro estableceuse á páxina actual.", + "notification_poster_set_readlist": "A portada da lista de lectura estableceuse á páxina actual.", + "notification_poster_set_series": "A portada de serie estableceuse á páxina actual.", + "paged_reader_layout": { + "double": "Dobre páxina", + "double_no_cover": "Dobre páxina (sen portada)", + "single": "Páxina simple" + }, + "reader_settings": "Configuración do lector", + "scale_type": { + "continuous_original": "Orixinal", + "continuous_width": "Axuste á anchura", + "height": "Axuste á altura", + "original": "Orixinal", + "screen": "Pantalla" + }, + "settings": { + "always_fullscreen": "Sempre a pantalla completa", + "animate_page_transitions": "Transicións de páxina animadas", + "background_color": "Cor de fondo", + "background_colors": { + "black": "Negro", + "gray": "Gris", + "white": "Branco" + }, + "general": "Xeral", + "gestures": "Xestos", + "page_layout": "Disposición de páxina", + "page_margin": "Marxe de páxina", + "reading_mode": "Modo de lectura", + "side_padding_none": "Ningún" + }, + "shortcuts": { + "close": "Pechar", + "first_page": "Primeira páxina", + "last_page": "Derradeira páxina", + "left_to_right": "De esquerda a dereita", + "menus": "Menús", + "next_page": "Seguinte páxina", + "previous_page": "Páxina anterior", + "right_to_left": "De dereita a esquerda" + }, + "tooltip_incognito": "Non se gardará o progreso de lectura" + }, + "browse_book": { + "comment": "COMENTARIO", + "date_created": "CREACIÓN", + "date_modified": "ÚLTIMA MODIFICACIÓN", + "download_file": "Baixar ficheiro", + "file": "FICHEIRO", + "format": "FORMATO", + "isbn": "ISBN", + "links": "LIGAZÓNS", + "outdated_tooltip": "Cambiouse o ficheiro deste libro; é necesario volver analizalo", + "read_book": "Ler libro", + "read_incognito": "Ler de incógnito", + "remove_from_collection": "Quitar libro da colección", + "remove_from_readlist": "Quitar libro da lista de lectura", + "size": "TAMAÑO" + }, + "browse_collection": { + "edit_collection": "Editar colección", + "edit_elements": "Editar elementos", + "manual_ordering": "Ordenación manual" + }, + "browse_readlist": { + "edit_elements": "Editar elementos", + "edit_readlist": "Editar lista de lectura", + "manual_ordering": "Ordenación manual" + }, + "browse_series": { + "earliest_year_from_release_dates": "Este é o ano máis temperán entre as datas de lanzamento de tódolos libros da serie", + "remove_from_collection": "Quitar serie da colección", + "series_no_summary": "Esta serie non ten sumario, así que escollemos un por ti!", + "summary_from_book": "Sumario do libro {number}:" + }, + "collections_expansion_panel": { + "manage_collection": "Xestionar colección", + "title": "{name} colección" }, "common": { - "locale_name": "Galego" + "age": "Idade", + "all_libraries": "Tódalas bibliotecas", + "all_of": "Todo", + "any_of": "Calquera", + "book": "Libro", + "books": "Libros", + "books_n": "Ningún libro | 1 libro | {count} libros", + "books_total": "{count} / {total} libros", + "cancel": "Cancelar", + "choose_image": "Escoller unha imaxe", + "close": "Pechar", + "collections": "Coleccións", + "copied": "Copiado!", + "create": "Crear", + "delete": "Borrar", + "discard": "Descartar", + "disk_space": "Espazo en disco", + "download": "Baixar", + "duplicate": "Duplicar", + "epub": "EPUB", + "error": "Erro", + "filename": "Nome de ficheiro", + "genre": "Xénero", + "go_to_collection": "Ir á colección", + "go_to_library": "Ir á biblioteca", + "go_to_readlist": "Ir á lista de lectura", + "go_to_series": "Ir á serie", + "i_understand": "Entendido", + "library": "Biblioteca", + "locale_name": "Galego", + "more": "Máis", + "nothing_to_show": "Nada que amosar", + "page": "Páxina", + "page_number": "Número de páxina", + "pages": "páxinas", + "pages_left": "Non quedan páxinas | Queda 1 páxina | Quedan {count} páxinas", + "pages_n": "Ningunha páxina | 1 páxina | {count} páxinas", + "password": "Contrasinal", + "pdf": "PDF", + "pending_tasks": "Sen tarefas pendentes | 1 tarefa pendente | {count} tarefas pendentes" } } From a03f1bdf7baf3241063874a7d5bf0875f76045c8 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:24 +0100 Subject: [PATCH 017/114] i18n(webui): translated using Weblate (Thai) Currently translated at 100.0% (840 of 840 strings) Co-authored-by: Hosted Weblate Co-authored-by: altinat Translate-URL: https://hosted.weblate.org/projects/komga/webui/th/ Translation: komga/webui --- komga-webui/src/locales/th.json | 1017 +++++++++++++++++++++++++++---- 1 file changed, 909 insertions(+), 108 deletions(-) diff --git a/komga-webui/src/locales/th.json b/komga-webui/src/locales/th.json index 27685fc7..7f3cc2ce 100644 --- a/komga-webui/src/locales/th.json +++ b/komga-webui/src/locales/th.json @@ -5,27 +5,29 @@ }, "dataIterator": { "loadingText": "กำลังโหลดรายการ...", - "noResultsText": "ไม่พบบันทึกที่ตรงกัน" + "noResultsText": "ไม่พบข้อมูลที่ตรงกัน" }, "dataTable": { "itemsPerPageText": "แถวต่อหน้า:", - "sortBy": "เรียงตาม" + "sortBy": "จัดเรียงตาม" }, "fileInput": { "counter": "{0} ไฟล์", - "counterSize": "{0} ไฟล์ (รวม {1})" + "counterSize": "{0} ไฟล์ (ทั้งหมด {1})" }, - "noDataText": "ไม่มีข้อมูลพร้อมใช้งาน" + "noDataText": "ไม่มีข้อมูล" }, "account_settings": { "account_settings": "การตั้งค่าบัญชี", "api_key": { "created_date": "วันที่สร้าง: {date}", - "force_kobo_sync": "บังคับซิงก์ Kobo", - "generate_api_key": "สร้างกุญแจ API", - "no_keys": "ยังไม่มีกุญแจ API สร้างขึ้นมา" + "force_kobo_sync": "บังคับให้ Kobo ซิงค์", + "generate_api_key": "สร้างคีย์ API", + "no_keys": "ยังไม่มีคีย์ API ที่สร้างขึ้น" }, - "change_password": "เปลี่ยนรหัสผ่าน" + "change_password": "เปลี่ยนรหัสผ่าน", + "details": "รายละเอียด", + "my_account": "บัญชีของฉัน" }, "announcements": { "mark_all_read": "ทำเครื่องหมายทั้งหมดว่าอ่านแล้ว", @@ -33,98 +35,99 @@ "tab_title": "ประกาศ" }, "authentication_activity": { - "api_key": "กุญแจ API", + "api_key": "คีย์ API", "datetime": "วันและเวลา", "email": "อีเมล", - "error": "ผิดพลาด", + "error": "ข้อผิดพลาด", "ip": "IP", - "source": "ที่มา", + "source": "แหล่งที่มา", "success": "สำเร็จ", "user_agent": "User Agent" }, "author_roles": { "colorist": "ผู้ลงสี", - "cover": "ปก", - "editor": "ผู้แก้ไข", - "inker": "ผู้ลงหมึก", - "letterer": "ผู้ลงตัวอักษร", - "penciller": "ผู้วาดร่าง", + "cover": "หน้าปก", + "editor": "บรรณาธิการ", + "inker": "ผู้ตัดเส้น", + "letterer": "ผู้วางตัวอักษร", + "penciller": "ผู้วาดดินสอ", "translator": "ผู้แปล", "writer": "ผู้เขียน" }, "book_card": { - "error": "ผิดพลาด", + "error": "ข้อผิดพลาด", "no_release_date": "ไม่มีวันที่เผยแพร่", - "unknown": "กำลังจะวิเคราะห์", - "unread": "ยังไม่ได้อ่าน", - "unsupported": "ไม่สนับสนุน" + "unknown": "รอการวิเคราะห์", + "unread": "ยังไม่อ่าน", + "unsupported": "ไม่รองรับ" }, "book_import": { - "button_browse": "เรียกดู", + "button_browse": "เลือกไฟล์", "button_import": "นำเข้า", "button_scan": "สแกน", "button_select_series": "เลือกซีรีส์", "field_import_path": "นำเข้าจากโฟลเดอร์", - "info_part1": "คุณสามารถนำเข้าไฟล์ที่อยู่นอกไลบรารีที่มีอยู่ได้ผ่านหน้านี้ คุณสามารถนำเข้าไฟล์ลงในซีรีส์ที่มีอยู่ได้เท่านั้น ซึ่งในกรณีนี้ Komga จะย้ายหรือคัดลอกไฟล์ไปยังไดเร็กทอรีของซีรีส์ที่เลือก", - "info_part2": "หากคุณตังหมายเลขหนังสือ และมีหนังสือที่มีหมายเลขนั้นอยู่แล้ว คุณจะสามารถเปรียบเทียบหนังสือทั้ง 2 เล่มได้ หากคุณตัดสินใจนำเข้าหนังสือ Komga จะอัปเกรดหนังสือที่มีอยู่ด้วยเล่มใหม่ โดยแทนที่ไฟล์เก่าด้วยไฟล์ใหม่ไปเลย", + "info_part1": "หน้านี้ให้คุณนำเข้าไฟล์ที่อยู่นอกไลบรารีที่มีอยู่ของคุณ คุณสามารถนำเข้าไฟล์ลงในซีรีส์ที่มีอยู่เท่านั้น ซึ่งในกรณีนี้ Komga จะย้ายหรือคัดลอกไฟล์ไปยังไดเรกทอรีของซีรีส์ที่เลือก", + "info_part2": "หากคุณเลือกหมายเลขสำหรับหนังสือ และมีหนังสือที่มีหมายเลขนั้นอยู่แล้ว คุณจะสามารถเปรียบเทียบหนังสือทั้ง 2 เล่มได้ หากคุณตัดสินใจนำเข้าหนังสือ Komga จะอัปเกรดหนังสือที่มีอยู่ด้วยเล่มใหม่ ซึ่งจะแทนที่ไฟล์เก่าด้วยไฟล์ใหม่", "no_files_found": "ไม่พบไฟล์", "notification": { - "go_to_book": "ไปยังหนังสือ", - "import_failure": "ไม่สามารถนำเข้าหนังสือได้: {file}", - "import_successful": "นำเข้าหนังสือสำเร็จแล้ว: {book}", + "go_to_book": "ไปที่หนังสือ", + "import_failure": "นำเข้าหนังสือล้มเหลว: {file}", + "import_successful": "นำเข้าหนังสือสำเร็จ: {book}", "source_file": "ไฟล์ต้นฉบับ: {file}" }, "row": { - "error_analyze_first": "หนังสือต้องมีการวิเคราะห์ก่อน", + "error_analyze_first": "ต้องวิเคราะห์หนังสือก่อน", "error_choose_series": "เลือกซีรีส์", - "error_only_import_no_errors": "สามารถนำเข้าหนังสือได้โดยไม่มีข้อผิดพลาดเท่านั้น", + "error_only_import_no_errors": "สามารถนำเข้าได้เฉพาะหนังสือที่ไม่มีข้อผิดพลาด", "warning_upgrade": "หนังสือที่มีอยู่จะถูกอัปเกรด" }, "table": { - "destination_name": "ชื่อจุดหมาย", + "destination_name": "ชื่อปลายทาง", "file_name": "ชื่อไฟล์", "number": "หมายเลข", "series": "ซีรีส์" }, "title": "นำเข้า", - "try_another_directory": "ลองค้นหาไดเรกทอรีอื่น" + "try_another_directory": "ลองค้นหาในไดเรกทอรีอื่น" }, "bookreader": { - "beginning_of_book": "คุณอยู่ที่จุดเริ่มต้นของหนังสือ", - "changing_reading_direction": "เปลี่ยนทิศทางการอ่านเป็น", - "cycling_page_layout": "สลับเค้าโครงหน้า", - "cycling_scale": "สลับขนาด", - "cycling_side_padding": "สลับระยะห่างด้านข้าง", + "beginning_of_book": "คุณอยู่ที่ตอนต้นของหนังสือ", + "changing_reading_direction": "กำลังเปลี่ยนทิศทางการอ่านเป็น", + "cycling_page_layout": "กำลังสลับรูปแบบหน้า", + "cycling_page_margin": "กำลังสลับระยะขอบหน้า", + "cycling_scale": "กำลังสลับมาตราส่วน", + "cycling_side_padding": "กำลังสลับระยะห่างด้านข้าง", "download_current_page": "ดาวน์โหลดหน้าปัจจุบัน", - "end_of_book": "คุณมาถึงตอนจบของหนังสือแล้ว", + "end_of_book": "คุณได้อ่านถึงตอนท้ายของหนังสือแล้ว", "from_series_metadata": "จากข้อมูลเมตาของซีรีส์", "move_next": "คลิกหรือกด \"ถัดไป\" อีกครั้งเพื่อไปยังหนังสือเล่มถัดไป", - "move_next_exit": "คลิกหรือกด \"ถัดไป\" อีกครั้งเพื่อออกจากตัวอ่าน", - "move_previous": "คลิกหรือกด \"ก่อนหน้า\" อีกครั้งเพื่อไปยังหนังสือเล่มก่อนหน้า", - "notification_poster_set_book": "โปสเตอร์หนังสือได้รับการตั้งค่าตามหน้าปัจจุบันแล้ว", - "notification_poster_set_readlist": "โปสเตอร์รายการอ่านได้ถูกตั้งค่าตามหน้าปัจจุบันแล้ว", - "notification_poster_set_series": "โปสเตอร์ซีรีย์ได้ถูกตั้งค่าตามหน้าปัจจุบันแล้ว", + "move_next_exit": "คลิกหรือกด \"ถัดไป\" อีกครั้งเพื่อออกจากโปรแกรมอ่าน", + "move_previous": "คลิกหรือกด \"ก่อนหน้า\" อีกครั้งเพื่อไปยังหนังสือก่อนหน้า", + "notification_poster_set_book": "โปสเตอร์หนังสือถูกตั้งเป็นหน้าปัจจุบันแล้ว", + "notification_poster_set_readlist": "โปสเตอร์รายการอ่านถูกตั้งเป็นหน้าปัจจุบันแล้ว", + "notification_poster_set_series": "โปสเตอร์ซีรีส์ถูกตั้งเป็นหน้าปัจจุบันแล้ว", "paged_reader_layout": { "double": "หน้าคู่", "double_no_cover": "หน้าคู่ (ไม่มีปก)", "single": "หน้าเดี่ยว" }, - "reader_settings": "การตั้งค่าตัวอ่าน", + "reader_settings": "การตั้งค่าโปรแกรมอ่าน", "scale_type": { - "continuous_original": "ต้นฉบับ", + "continuous_original": "ขนาดดั้งเดิม", "continuous_width": "พอดีความกว้าง", "height": "พอดีความสูง", - "original": "ต้นฉบับ", - "screen": "หน้าจอ", + "original": "ขนาดดั้งเดิม", + "screen": "พอดีหน้าจอ", "width": "พอดีความกว้าง", - "width_shrink_only": "พอดีความกว้าง (หดเท่านั้น)" + "width_shrink_only": "พอดีความกว้าง (ย่อเท่านั้น)" }, - "set_current_page_as_book_poster": "ตั้งค่าหน้านี้เป็นโปสเตอร์ของหนังสือ", - "set_current_page_as_readlist_poster": "ตั้งค่าหน้านี้เป็นโปสเตอร์ของรายการอ่าน", - "set_current_page_as_series_poster": "ตั้งค่าหน้านี้เป็นโปสเตอร์ของซีรีส์", + "set_current_page_as_book_poster": "ตั้งค่าหน้าปัจจุบันเป็นโปสเตอร์หนังสือ", + "set_current_page_as_readlist_poster": "ตั้งค่าหน้าปัจจุบันเป็นโปสเตอร์รายการอ่าน", + "set_current_page_as_series_poster": "ตั้งค่าหน้าปัจจุบันเป็นโปสเตอร์ซีรีส์", "settings": { - "always_fullscreen": "เต็มจอเสมอ", - "animate_page_transitions": "ภาพเคลื่อนไหวเมื่อเปลี่ยนหน้า", + "always_fullscreen": "เต็มหน้าจอตลอดเวลา", + "animate_page_transitions": "ภาพเคลื่อนไหวการเปลี่ยนหน้า", "background_color": "สีพื้นหลัง", "background_colors": { "black": "สีดำ", @@ -134,158 +137,956 @@ "display": "การแสดงผล", "general": "ทั่วไป", "gestures": "ท่าทาง", - "page_layout": "เค้าโครงหน้า", - "paged": "ตัวเลือกตัวอ่านแบบแบ่งหน้า", + "page_layout": "รูปแบบหน้า", + "page_margin": "ระยะขอบหน้า", + "paged": "ตัวเลือกโปรแกรมอ่านแบบแบ่งหน้า", "reading_mode": "โหมดการอ่าน", - "scale_type": "ประเภทขนาด", + "scale_type": "ประเภทมาตราส่วน", "side_padding": "ระยะห่างด้านข้าง", "side_padding_none": "ไม่มี", - "webtoon": "ตัวเลือกตัวอ่านเว็บตูน" + "webtoon": "ตัวเลือกโปรแกรมอ่าน Webtoon" }, "shortcuts": { "close": "ปิด", - "cycle_page_layout": "สลับเค้าโครงหน้า", - "cycle_scale": "สลับขนาด", + "cycle_page_layout": "สลับรูปแบบหน้า", + "cycle_page_margin": "สลับระยะขอบหน้า", + "cycle_scale": "สลับมาตราส่วน", "cycle_side_padding": "สลับระยะห่างด้านข้าง", "first_page": "หน้าแรก", - "fullscreen": "เข้าสู่/ออกจากเต็มจอ", + "fullscreen": "เข้า/ออกจากโหมดเต็มหน้าจอ", "last_page": "หน้าสุดท้าย", - "left_to_right": "ซ้ายไปขวา", + "left_to_right": "จากซ้ายไปขวา", "menus": "เมนู", "next_page": "หน้าถัดไป", "previous_page": "หน้าก่อนหน้า", - "reader_navigation": "การนำทางตัวอ่าน", - "right_to_left": "ขวาไปซ้าย", + "reader_navigation": "การนำทางในโปรแกรมอ่าน", + "right_to_left": "จากขวาไปซ้าย", "settings": "การตั้งค่า", "show_hide_help": "แสดง/ซ่อนความช่วยเหลือ", "show_hide_settings": "แสดง/ซ่อนเมนูการตั้งค่า", - "show_hide_thumbnails": "แสดง/ซ่อนตัวสำรวจรูปขนาดย่อ", + "show_hide_thumbnails": "แสดง/ซ่อนภาพขนาดย่อ", "show_hide_toolbars": "แสดง/ซ่อนแถบเครื่องมือ", "vertical": "แนวตั้ง", "webtoon": "เว็บตูน" }, - "tooltip_incognito": "ความคืบหน้าการอ่านจะไม่ได้รับการบันทึก" + "tooltip_incognito": "ความคืบหน้าในการอ่านจะไม่ถูกบันทึก" }, "browse_book": { "comment": "ความคิดเห็น", + "date_created": "สร้างเมื่อ", + "date_modified": "แก้ไขล่าสุด", "download_file": "ดาวน์โหลดไฟล์", "file": "ไฟล์", "format": "รูปแบบ", "isbn": "ISBN", "links": "ลิงก์", "navigation_within_readlist": "การนำทางภายในรายการอ่าน: {name}", - "outdated_tooltip": "ไฟล์สำหรับหนังสือเล่มนี้มีการเปลี่ยนแปลง หนังสือเล่มนี้จะต้องถูกวิเคราะห์ใหม่", + "outdated_tooltip": "ไฟล์สำหรับหนังสือเล่มนี้มีการเปลี่ยนแปลง ต้องวิเคราะห์หนังสือเล่มนี้ใหม่อีกครั้ง", "read_book": "อ่านหนังสือ", "read_incognito": "อ่านแบบไม่ระบุตัวตน", + "remove_from_collection": "ลบหนังสือออกจากคอลเลกชัน", + "remove_from_readlist": "ลบหนังสือออกจากรายการอ่าน", "size": "ขนาด" }, "browse_collection": { - "edit_collection": "แก้ไขคอลเลคชั่น", + "edit_collection": "แก้ไขคอลเลกชัน", "edit_elements": "แก้ไของค์ประกอบ", - "manual_ordering": "การจัดลำดับด้วยตนเอง" + "manual_ordering": "จัดลำดับด้วยตนเอง" }, "browse_readlist": { "edit_elements": "แก้ไของค์ประกอบ", "edit_readlist": "แก้ไขรายการอ่าน", - "manual_ordering": "การจัดลำดับด้วยตนเอง" + "manual_ordering": "จัดลำดับด้วยตนเอง" }, "browse_series": { - "earliest_year_from_release_dates": "นี่คือปีแรกสุดที่หนังสือทั้งหมดในซีรีส์นี้วางจำหน่าย", - "series_no_summary": "ซีรีส์นี้ไม่มีบทสรุป ดังนั้นเราจึงเลือกบทสรุปมาให้คุณ!", - "summary_from_book": "บทสรุปจากเล่ม {number}:" + "earliest_year_from_release_dates": "นี่คือปีแรกสุดจากวันที่เผยแพร่ของหนังสือทุกเล่มในซีรีส์", + "remove_from_collection": "ลบซีรีส์ออกจากคอลเลกชัน", + "series_no_summary": "ซีรีส์นี้ไม่มีบทสรุป เราจึงเลือกบทสรุปมาให้คุณ!", + "summary_from_book": "บทสรุปจากหนังสือ {number}:" }, "collections_expansion_panel": { - "manage_collection": "จัดการคอลเลคชั่น", - "title": "คอลเลคชั่น {name}" + "manage_collection": "จัดการคอลเลกชัน", + "title": "คอลเลกชัน {name}" }, "common": { "age": "อายุ", - "all_libraries": "ห้องสมุดทั้งหมด", + "all_libraries": "ไลบรารีทั้งหมด", + "all_of": "ทั้งหมดของ", + "any_of": "อย่างใดอย่างหนึ่งของ", "book": "หนังสือ", "books": "หนังสือ", "books_n": "ไม่มีหนังสือ | 1 เล่ม | {count} เล่ม", - "books_total": "{count}/{total} เล่ม", + "books_total": "{count} / {total} เล่ม", "cancel": "ยกเลิก", - "cbx": "Comic Book archives", - "choose_image": "เลือกภาพ", + "cbx": "ไฟล์ Comic Book", + "choose_image": "เลือกรูปภาพ", "close": "ปิด", - "collections": "คอลเลคชั่น", + "collections": "คอลเลกชัน", "copied": "คัดลอกแล้ว!", "create": "สร้าง", "delete": "ลบ", - "dimension": "w: {width}, h: {height}", - "discard": "ทิ้ง", + "dimension": "ก: {width}, ส: {height}", + "discard": "ยกเลิก", "disk_space": "พื้นที่ดิสก์", - "dismiss": "ปิด", + "dismiss": "ปิดไป", "download": "ดาวน์โหลด", "drag_drop": "ลากและวาง", + "duplicate": "ทำซ้ำ", "email": "อีเมล", "epub": "Epub", + "error": "ข้อผิดพลาด", "filename": "ชื่อไฟล์", - "filter_no_matches": "ไม่พบรายการที่ตรงตามตัวกรอง", + "filter_no_matches": "ตัวกรองที่ใช้งานไม่มีผลลัพธ์ที่ตรงกัน", "genre": "ประเภท", - "go_to_collection": "ไปที่คอลเลคชั่น", - "go_to_library": "ไปที่ห้องสมุด", + "go_to_collection": "ไปที่คอลเลกชัน", + "go_to_library": "ไปที่ไลบรารี", "go_to_readlist": "ไปที่รายการอ่าน", "go_to_series": "ไปที่ซีรีส์", "i_understand": "ฉันเข้าใจ", - "library": "ห้องสมุด", - "locale_name": "ภาษาไทย", + "library": "ไลบรารี", + "locale_name": "ไทย", "locale_rtl": "false", - "lock_all": "ล็อคทั้งหมด", - "n_selected": "เลือกแล้ว {count}", + "lock_all": "ล็อกทั้งหมด", + "media": "สื่อ", + "more": "เพิ่มเติม", + "n_selected": "เลือก {count} รายการ", "nothing_to_show": "ไม่มีอะไรจะแสดง", - "oneshot": "One-shot", + "ok": "ตกลง", + "oneshot": "เรื่องสั้นจบในตอน", "outdated": "ล้าสมัย", "page": "หน้า", "page_number": "หมายเลขหน้า", "pages": "หน้า", - "pages_left": "ไม่มีหน้าเหลืออยู่ | เหลือ 1 หน้า | เหลือ {count} หน้า", - "pages_n": "ไม่มีหน้า | 1 หน้า | เหลือ {count} หน้า", + "pages_left": "ไม่มีหน้าเหลือ | เหลือ 1 หน้า | เหลือ {count} หน้า", + "pages_n": "ไม่มีหน้า | 1 หน้า | {count} หน้า", "password": "รหัสผ่าน", "pdf": "PDF", - "pending_tasks": "ไม่มีงานที่ค้างไว้ | 1 งานที่ค้างอยู่ | {count} งานที่ค้างอยู่", + "pending_tasks": "ไม่มีงานค้าง | 1 งานค้าง | {count} งานค้าง", + "pinned_libraries": "ไลบรารีที่ปักหมุด", "publisher": "สำนักพิมพ์", - "read": "อ่าน", - "read_on": "อ่านแล้ว {date}", + "read": "อ่านแล้ว", + "read_on": "อ่านเมื่อ {date}", "readlist": "รายการอ่าน", "readlists": "รายการอ่าน", - "remember-me": "จำฉันไว้", - "required": "จำเป็นต้องป้อน", + "remember-me": "จดจำฉันไว้", + "reorder": "จัดลำดับใหม่", + "required": "จำเป็น", "reset_filters": "รีเซ็ตตัวกรอง", "roles": "บทบาท", "save_changes": "บันทึกการเปลี่ยนแปลง", - "series": "ซีรีส์ | ซีรีส์", - "sidecars": "รถพ่วง", + "series": "ซีรีส์", + "settings": "การตั้งค่า", + "sidecars": "ไฟล์เสริม", "tags": "แท็ก", + "ui": "ส่วนติดต่อผู้ใช้", "unavailable": "ไม่พร้อมใช้งาน", - "unlock_all": "ปลดล็อคทั้งหมด", + "unlock_all": "ปลดล็อกทั้งหมด", "url": "URL", - "use_filter_panel_to_change_filter": "ใช้แผงตัวกรองเพื่อเปลี่ยนตัวกรองที่ต้องการ", + "use_filter_panel_to_change_filter": "ใช้แผงตัวกรองเพื่อเปลี่ยนตัวกรองที่ใช้งาน", "year": "ปี" }, "dashboard": { - "keep_reading": "อ่านต่อไป", - "on_deck": "ที่อ่านไว้", + "keep_reading": "อ่านต่อ", + "on_deck": "รออ่าน", "recently_added_books": "หนังสือที่เพิ่มล่าสุด", "recently_added_series": "ซีรีส์ที่เพิ่มล่าสุด", "recently_read_books": "หนังสือที่อ่านล่าสุด", - "recently_released_books": "หนังสือที่เพิ่งออกใหม่", - "recently_updated_series": "ซีรีส์ที่เพิ่งอัพเดตล่าสุด" + "recently_released_books": "หนังสือที่ออกใหม่ล่าสุด", + "recently_updated_series": "ซีรีส์ที่อัปเดตล่าสุด" }, "data_import": { - "book_number": "เลขที่หนังสือ: {name}", + "book_number": "หมายเลขหนังสือ: {name}", "book_series": "ซีรีส์: {name}", "button_import": "นำเข้า", "button_match": "จับคู่", - "comicrack_preambule_html": "คุณสามารถนำเข้ารายการอ่าน ComicRack ที่มีอยู่ในรูปแบบ .cbl ได้
โดย Komga จะพยายามจับคู่ชุดและหมายเลขหนังสือที่ให้มาด้วยชุดและหนังสือในห้องสมุดของคุณ", + "comicrack_preambule_html": "คุณสามารถนำเข้ารายการอ่าน ComicRack ที่มีอยู่ในรูปแบบ .cbl
Komga จะพยายามจับคู่ซีรีส์และหมายเลขหนังสือที่ให้มากับซีรีส์และหนังสือในไลบรารีของคุณ", "dialog_confirmation": { - "body": "หนังสือ {unmatched} / {total} เล่มไม่ตรงกัน", - "create": "สร้างอยู่ดี", - "title": "หนังสือบางเล่มไม่ตรงกัน" + "body": "{unmatched} / {total} เล่มไม่ถูกจับคู่", + "body2": "{duplicates} / {total} เล่มซ้ำกัน", + "create": "สร้างต่อไป", + "title": "หนังสือบางเล่มไม่ถูกจับคู่" + }, + "field_file_label": "รายการอ่าน ComicRack (.cbl)", + "field_files_label": "รายการอ่าน ComicRack (.cbl)", + "import_read_lists": "นำเข้ารายการอ่าน", + "imported_as": "นำเข้าเป็น {name}", + "readlist_created": "สร้างรายการอ่านแล้ว: {name}", + "requested_number": "หมายเลขที่ร้องขอ", + "requested_series": "ซีรีส์ที่ร้องขอ", + "results_preambule": "ผลลัพธ์ของการนำเข้าจะแสดงด้านล่าง คุณยังสามารถตรวจสอบหนังสือที่ไม่ถูกจับคู่สำหรับแต่ละไฟล์ที่ให้มา", + "size_limit": "ขนาดควรน้อยกว่า {size} MB", + "tab_title": "นำเข้าข้อมูล" + }, + "dialog": { + "add_api_key": { + "button_confirm": "สร้าง", + "context": "คีย์ API สามารถใช้เพื่อยืนยันตัวตนผ่านโปรโตคอล Kobo Sync", + "dialog_title": "สร้างคีย์ API ใหม่", + "field_comment": "ความคิดเห็น", + "field_comment_hint": "คีย์ API นี้ใช้สำหรับอะไร?", + "info_copy": "โปรดคัดลอกคีย์ API ของคุณตอนนี้ คุณจะไม่สามารถเห็นมันได้อีก!" + }, + "add_to_collection": { + "button_create": "สร้าง", + "card_collection_subtitle": "ไม่มีซีรีส์ | 1 ซีรีส์ | {count} ซีรีส์", + "dialog_title": "เพิ่มไปยังคอลเลกชัน", + "field_search_create": "ค้นหาหรือสร้างคอลเลกชัน", + "field_search_create_error": "มีคอลเลกชันชื่อนี้อยู่แล้ว", + "label_no_matching_collection": "ไม่พบคอลเลกชันที่ตรงกัน" + }, + "add_to_readlist": { + "button_create": "สร้าง", + "card_readlist_subtitle": "ไม่มีหนังสือ | 1 เล่ม | {count} เล่ม", + "dialog_title": "เพิ่มไปยังรายการอ่าน", + "field_search_create": "ค้นหาหรือสร้างรายการอ่าน", + "field_search_create_error": "มีรายการอ่านชื่อนี้อยู่แล้ว", + "label_no_matching_readlist": "ไม่พบรายการอ่านที่ตรงกัน" + }, + "add_user": { + "button_cancel": "ยกเลิก", + "button_confirm": "เพิ่ม", + "dialog_title": "เพิ่มผู้ใช้", + "field_email": "อีเมล", + "field_email_error": "ต้องเป็นที่อยู่อีเมลที่ถูกต้อง", + "field_password": "รหัสผ่าน" + }, + "analyze_library": { + "body": "วิเคราะห์ไฟล์สื่อทั้งหมดในไลบรารี การวิเคราะห์จะรวบรวมข้อมูลเกี่ยวกับสื่อ อาจใช้เวลานานขึ้นอยู่กับขนาดไลบรารีของคุณ", + "button_confirm": "วิเคราะห์", + "title": "วิเคราะห์ไลบรารี" + }, + "book_picker": { + "filter": "กรองตามหมายเลขหนังสือ, ชื่อเรื่อง, หรือวันที่เผยแพร่", + "title": "เลือกหนังสือ" + }, + "delete_apikey": { + "button_confirm": "ลบ", + "confirm_delete": "ฉันเข้าใจ, ลบคีย์ API \"{name}\"", + "dialog_title": "ลบคีย์ API", + "warning_html": "แอปพลิเคชันหรือสคริปต์ใดๆ ที่ใช้คีย์ API นี้จะไม่สามารถเข้าถึง Komga API ได้อีกต่อไป คุณไม่สามารถยกเลิกการกระทำนี้ได้" + }, + "delete_book": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบหนังสือ \"{name}\" และไฟล์ของมัน", + "confirm_delete_multiple": "ใช่, ลบ {count} เล่มและไฟล์ของมัน", + "dialog_title": "ลบหนังสือ", + "dialog_title_multiple": "ลบหนังสือ", + "warning_html": "หนังสือ {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้พร้อมกับไฟล์สื่อที่เก็บไว้ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?", + "warning_multiple_html": "หนังสือ {count} เล่มจะถูกลบออกจากเซิร์ฟเวอร์นี้พร้อมกับไฟล์สื่อที่เก็บไว้ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "delete_collection": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบคอลเลกชัน \"{name}\"", + "confirm_delete_multiple": "ใช่, ลบ {count} คอลเลกชัน", + "dialog_title": "ลบคอลเลกชัน", + "dialog_title_multiple": "ลบคอลเลกชัน", + "warning_html": "คอลเลกชัน {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้ ไฟล์สื่อของคุณจะไม่ได้รับผลกระทบ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?", + "warning_multiple_html": "คอลเลกชัน {count} รายการจะถูกลบออกจากเซิร์ฟเวอร์นี้ ไฟล์สื่อของคุณจะไม่ได้รับผลกระทบ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "delete_library": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบไลบรารี \"{name}\"", + "title": "ลบไลบรารี", + "warning_html": "ไลบรารี {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้ ไฟล์สื่อของคุณจะไม่ได้รับผลกระทบ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "delete_readlist": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบรายการอ่าน \"{name}\"", + "confirm_delete_multiple": "ใช่, ลบ {count} รายการอ่าน", + "dialog_title": "ลบรายการอ่าน", + "dialog_title_multiple": "ลบรายการอ่าน", + "warning_html": "รายการอ่าน {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้ ไฟล์สื่อของคุณจะไม่ได้รับผลกระทบ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?", + "warning_multiple_html": "รายการอ่าน {count} รายการจะถูกลบออกจากเซิร์ฟเวอร์นี้ ไฟล์สื่อของคุณจะไม่ได้รับผลกระทบ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "delete_series": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบซีรีส์ \"{name}\" และไฟล์ของมัน", + "confirm_delete_multiple": "ใช่, ลบ {count} ซีรีส์และไฟล์ของมัน", + "dialog_title": "ลบซีรีส์", + "warning_html": "ซีรีส์ {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้พร้อมกับไฟล์สื่อที่เก็บไว้ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?", + "warning_multiple_html": "ซีรีส์ {count} รายการจะถูกลบออกจากเซิร์ฟเวอร์นี้พร้อมกับไฟล์สื่อที่เก็บไว้ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "delete_user": { + "button_confirm": "ลบ", + "confirm_delete": "ใช่, ลบผู้ใช้ \"{name}\"", + "dialog_title": "ลบผู้ใช้", + "warning_html": "ผู้ใช้ {name} จะถูกลบออกจากเซิร์ฟเวอร์นี้ การกระทำนี้ ไม่สามารถ ยกเลิกได้ ดำเนินการต่อหรือไม่?" + }, + "edit_books": { + "add_author_role_error_duplicate": "มีอยู่แล้ว", + "authors_notice_multiple_edit": "คุณกำลังแก้ไขผู้แต่งสำหรับหนังสือหลายเล่ม ซึ่งจะเขียนทับผู้แต่งที่มีอยู่ของแต่ละเล่ม", + "button_cancel": "ยกเลิก", + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "copy_from": "คัดลอกจาก {field}", + "dialog_title_multiple": "แก้ไข {count} เล่ม | แก้ไข {count} เล่ม", + "dialog_title_single": "แก้ไข {book}", + "field_alternate_title": "ชื่อเรื่องทางเลือก", + "field_isbn": "ISBN", + "field_isbn_error": "ต้องเป็น ISBN 13 ที่ถูกต้อง", + "field_link_label": "ป้ายกำกับ", + "field_link_url": "URL", + "field_link_url_error_protocol": "ต้องเป็น http หรือ https", + "field_link_url_error_url": "ต้องเป็น URL ที่ถูกต้อง", + "field_number": "หมายเลข", + "field_number_sort": "หมายเลขเรียงลำดับ", + "field_number_sort_hint": "คุณสามารถใช้เลขทศนิยมได้", + "field_release_date": "วันที่เผยแพร่", + "field_release_date_error": "ต้องเป็นวันที่ที่ถูกต้องในรูปแบบ YYYY-MM-DD", + "field_summary": "บทสรุป", + "field_tags": "แท็ก", + "field_title": "ชื่อเรื่อง", + "number_sort_decrement": "ลดทั้งหมดลง 1", + "number_sort_increment": "เพิ่มทั้งหมดขึ้น 1", + "tab_authors": "ผู้แต่ง", + "tab_general": "ทั่วไป", + "tab_links": "ลิงก์", + "tab_poster": "โปสเตอร์", + "tab_tags": "แท็ก", + "tags_notice_multiple_edit": "คุณกำลังแก้ไขแท็กสำหรับหนังสือหลายเล่ม ซึ่งจะเขียนทับแท็กที่มีอยู่ของแต่ละเล่ม" + }, + "edit_collection": { + "button_cancel": "ยกเลิก", + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "dialog_title": "แก้ไขคอลเลกชัน", + "field_manual_ordering": "จัดลำดับด้วยตนเอง", + "label_ordering": "โดยค่าเริ่มต้น ซีรีส์ในคอลเลกชันจะเรียงตามชื่อ คุณสามารถเปิดใช้งานการจัดลำดับด้วยตนเองเพื่อกำหนดลำดับของคุณเองได้", + "tab_general": "ทั่วไป", + "tab_poster": "โปสเตอร์" + }, + "edit_library": { + "button_browse": "เลือกไฟล์", + "button_cancel": "ยกเลิก", + "button_confirm_add": "เพิ่ม", + "button_confirm_edit": "แก้ไข", + "button_next": "ถัดไป", + "dialog_title_add": "เพิ่มไลบรารี", + "dialot_title_edit": "แก้ไขไลบรารี", + "field_analysis_analyze_dimensions": "วิเคราะห์ขนาดหน้า", + "field_analysis_hash_files": "คำนวณแฮชสำหรับไฟล์", + "field_analysis_hash_koreader": "คำนวณแฮชสำหรับไฟล์สำหรับ KOReader", + "field_analysis_hash_pages": "คำนวณแฮชสำหรับหน้า", + "field_convert_to_cbz": "แปลงเป็น CBZ โดยอัตโนมัติ", + "field_import_barcode_isbn": "บาร์โค้ด ISBN", + "field_import_comicinfo_book": "ข้อมูลเมตาของหนังสือ", + "field_import_comicinfo_collections": "คอลเลกชัน", + "field_import_comicinfo_readlists": "รายการอ่าน", + "field_import_comicinfo_series": "ข้อมูลเมตาของซีรีส์", + "field_import_comicinfo_series_append_volume": "เพิ่มเล่มต่อท้ายชื่อซีรีส์", + "field_import_epub_book": "ข้อมูลเมตาของหนังสือ", + "field_import_epub_series": "ข้อมูลเมตาของซีรีส์", + "field_import_local_artwork": "อาร์ตเวิร์กในเครื่อง", + "field_import_mylar_series": "ข้อมูลเมตาของซีรีส์", + "field_name": "ชื่อ", + "field_oneshotsdirectory": "ไดเรกทอรีเรื่องสั้นจบในตอน", + "field_repair_extensions": "ซ่อมแซมนามสกุลไฟล์ที่ไม่ถูกต้องโดยอัตโนมัติ", + "field_root_folder": "โฟลเดอร์ราก", + "field_scan_interval": "ช่วงเวลาสแกน", + "field_scanner_empty_trash_after_scan": "ล้างถังขยะโดยอัตโนมัติหลังจากการสแกนทุกครั้ง", + "field_scanner_force_directory_modified_time": "บังคับเวลาแก้ไขไดเรกทอรี", + "field_scanner_scan_startup": "สแกนเมื่อเริ่มต้น", + "field_series_cover": "ปกซีรีส์", + "file_browser_dialog_button_confirm": "เลือก", + "file_browser_dialog_title": "โฟลเดอร์รากของไลบรารี", + "label_analysis": "การวิเคราะห์", + "label_file_management": "การจัดการไฟล์", + "label_import_barcode_isbn": "นำเข้า ISBN ภายในบาร์โค้ด", + "label_import_comicinfo": "นำเข้าข้อมูลเมตาสำหรับ CBR/CBZ ที่มีไฟล์ ComicInfo.xml", + "label_import_epub": "นำเข้าข้อมูลเมตาจากไฟล์ EPUB", + "label_import_local": "นำเข้าสินทรัพย์สื่อในเครื่อง", + "label_import_mylar": "นำเข้าข้อมูลเมตาที่สร้างโดย Mylar", + "label_scan_directory_exclusions": "การยกเว้นไดเรกทอรีในการสแกน", + "label_scan_types": "สแกนหาไฟล์ประเภทเหล่านี้", + "label_scanner": "สแกนเนอร์", + "label_series_cover": "ปกซีรีส์", + "tab_general": "ทั่วไป", + "tab_metadata": "ข้อมูลเมตา", + "tab_options": "ตัวเลือก", + "tooltip_oneshotsdirectory": "ปล่อยว่างเพื่อปิดใช้งาน", + "tooltip_scanner_force_modified_time": "เปิดใช้งานหากไลบรารีอยู่บน Google Drive", + "tooltip_use_resources": "อาจใช้ทรัพยากรจำนวนมากในไลบรารีขนาดใหญ่หรือฮาร์ดแวร์ที่ช้า" + }, + "edit_readlist": { + "button_cancel": "ยกเลิก", + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "dialog_title": "แก้ไขรายการอ่าน", + "field_manual_ordering": "จัดลำดับด้วยตนเอง", + "field_name": "ชื่อ", + "field_summary": "บทสรุป", + "label_ordering": "โดยค่าเริ่มต้น หนังสือในรายการอ่านจะเรียงลำดับด้วยตนเอง คุณสามารถปิดใช้งานการจัดลำดับด้วยตนเองเพื่อเรียงหนังสือตามวันที่เผยแพร่ได้", + "tab_general": "ทั่วไป", + "tab_poster": "โปสเตอร์" + }, + "edit_recommended": { + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "button_reset": "รีเซ็ตเป็นค่าเริ่มต้น", + "dialog_title": "แก้ไขมุมมองแนะนำ" + }, + "edit_series": { + "button_cancel": "ยกเลิก", + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "dialog_title_multiple": "แก้ไข {count} ซีรีส์ | แก้ไข {count} ซีรีส์", + "dialog_title_single": "แก้ไข {series}", + "field_age_rating": "การจัดระดับอายุ", + "field_age_rating_error": "การจัดระดับอายุต้องเป็น 0 หรือมากกว่า", + "field_genres": "ประเภท", + "field_labels": "ป้ายกำกับ", + "field_language": "ภาษา", + "field_language_hint": "แท็กภาษา IETF BCP 47", + "field_publisher": "สำนักพิมพ์", + "field_reading_direction": "ทิศทางการอ่าน", + "field_sort_title": "ชื่อเรื่องสำหรับเรียงลำดับ", + "field_status": "สถานะ", + "field_summary": "บทสรุป", + "field_tags": "แท็ก", + "field_title": "ชื่อเรื่อง", + "field_total_book_count": "จำนวนหนังสือทั้งหมด", + "field_total_book_count_error": "จำนวนหนังสือทั้งหมดต้องเป็น 1 หรือมากกว่า", + "mixed": "ผสม", + "tab_general": "ทั่วไป", + "tab_poster": "โปสเตอร์", + "tab_sharing": "การแชร์", + "tab_tags": "แท็ก", + "tab_titles": "ชื่อเรื่องทางเลือก", + "tags_notice_multiple_edit": "คุณกำลังแก้ไขแท็กสำหรับซีรีส์หลายรายการ ซึ่งจะเขียนทับแท็กที่มีอยู่ของแต่ละซีรีส์" + }, + "edit_user": { + "button_cancel": "ยกเลิก", + "button_confirm": "บันทึกการเปลี่ยนแปลง", + "dialog_title": "แก้ไขผู้ใช้", + "label_roles_for": "บทบาทสำหรับ {name}" + }, + "edit_user_restrictions": { + "age_restriction": { + "allow_under": "อนุญาตเฉพาะต่ำกว่า", + "exclude_over": "ไม่รวมที่สูงกว่า", + "none": "ไม่มีข้อจำกัด" + }, + "edit_restrictions_for": "แก้ไขข้อจำกัดสำหรับ {name}", + "label_age_restriction": "ข้อจำกัดด้านอายุ", + "label_allow_only_labels": "อนุญาตเฉพาะป้ายกำกับ", + "label_exclude_labels": "ไม่รวมป้ายกำกับ", + "tab_content_restrictions": "ข้อจำกัดด้านเนื้อหา", + "tab_shared_libraries": "ไลบรารีที่แชร์" + }, + "empty_trash": { + "body": "โดยค่าเริ่มต้น เซิร์ฟเวอร์สื่อจะไม่ลบข้อมูลสำหรับสื่อทันที ซึ่งจะช่วยได้หากไดรฟ์ถูกตัดการเชื่อมต่อชั่วคราว เมื่อคุณล้างถังขยะสำหรับไลบรารี ข้อมูลทั้งหมดเกี่ยวกับสื่อที่หายไปจะถูกลบ", + "button_confirm": "ล้าง", + "title": "ล้างถังขยะสำหรับไลบรารี" + }, + "file_browser": { + "button_cancel": "ยกเลิก", + "button_confirm_default": "เลือก", + "dialog_title_default": "เบราว์เซอร์ไฟล์", + "parent_directory": "ไดเรกทอรีแม่" + }, + "filename_chooser": { + "button_choose": "เลือก", + "field_destination_filename": "ชื่อไฟล์ปลายทาง", + "label_source_filename": "ชื่อไฟล์ต้นฉบับ", + "table": { + "existing_file": "ไฟล์ที่มีอยู่", + "order": "ลำดับ" + }, + "title": "ชื่อไฟล์ปลายทาง" + }, + "force_kobo_sync": { + "dialog_title": "บังคับให้ Kobo ซิงค์", + "warning_html": "การกระทำนี้จะลบประวัติการซิงค์ทั้งหมดสำหรับคีย์ API นี้ Kobo ของคุณจะซิงค์ทุกอย่างในการซิงค์ครั้งถัดไป" + }, + "password_change": { + "button_cancel": "ยกเลิก", + "button_confirm": "เปลี่ยนรหัสผ่าน", + "dialog_title": "เปลี่ยนรหัสผ่าน", + "field_new_password": "รหัสผ่านใหม่", + "field_new_password_error": "จำเป็นต้องใช้รหัสผ่านใหม่", + "field_repeat_password": "ทำซ้ำรหัสผ่านใหม่", + "field_repeat_password_error": "รหัสผ่านต้องเหมือนกัน" + }, + "refresh_library_metadata": { + "body": "รีเฟรชข้อมูลเมตาสำหรับไฟล์สื่อทั้งหมดในไลบรารี อาจใช้เวลานานขึ้นอยู่กับขนาดไลบรารีของคุณ", + "button_confirm": "รีเฟรช", + "title": "รีเฟรชข้อมูลเมตาสำหรับไลบรารี" + }, + "series_picker": { + "label_search_series": "ค้นหาซีรีส์", + "no_results": "ไม่พบซีรีส์", + "title": "เลือกซีรีส์" + }, + "server_stop": { + "button_confirm": "หยุด", + "confirmation_message": "คุณแน่ใจหรือไม่ว่าต้องการหยุด Komga?", + "dialog_title": "ปิดเซิร์ฟเวอร์" + }, + "shortcut_help": { + "label_description": "คำอธิบาย", + "label_key": "คีย์" + }, + "transient_book_details": { + "label_candidate": "ตัวเลือก", + "label_existing": "ที่มีอยู่", + "label_format": "รูปแบบ", + "label_name": "ชื่อ", + "label_pages": "หน้า", + "label_size": "ขนาด", + "pages_table": { + "filename": "ชื่อไฟล์", + "height": "ความสูง", + "index": "ดัชนี", + "media_type": "ประเภทสื่อ", + "size": "ขนาด", + "width": "ความกว้าง" + }, + "title": "รายละเอียดหนังสือ", + "title_comparison": "เปรียบเทียบหนังสือ" + }, + "transient_book_viewer": { + "label_candidate": "ตัวเลือก", + "label_existing": "ที่มีอยู่", + "page_of_pages": "{page} / {pages}", + "title": "ตรวจสอบหนังสือ", + "title_comparison": "เปรียบเทียบหนังสือ" } }, + "duplicate_pages": { + "action_auto_delete_remaining": "ลบที่เหลืออัตโนมัติ ({count})", + "action_delete_auto": "ลบอัตโนมัติ", + "action_delete_manual": "ลบด้วยตนเอง", + "action_delete_matches": "ลบรายการที่ตรงกัน", + "action_ignore": "ไม่สนใจ", + "action_ignore_remaining": "ไม่สนใจที่เหลือ ({count})", + "action_manual_delete_remaining": "ลบที่เหลือด้วยตนเอง ({count})", + "confirm_auto_delete_remaining": "แฮชของหน้าที่เหลือทั้งหมดในหน้านี้ ({count}) จะถูกทำเครื่องหมายสำหรับการลบอัตโนมัติ", + "confirm_manual_delete_remaining": "แฮชของหน้าที่เหลือทั้งหมดในหน้านี้ ({count}) จะถูกทำเครื่องหมายสำหรับการลบด้วยตนเอง", + "delete_to_save": "ลบเพื่อประหยัด {size}", + "deleted_count": "ลบไปแล้ว {count} ครั้ง", + "empty_title": "ไม่พบหน้าที่ซ้ำกัน", + "empty_title_known": "ไม่มีรายการซ้ำที่รู้จัก", + "filter": { + "count": "จำนวน", + "date_added": "วันที่เพิ่ม", + "date_modified": "วันที่แก้ไข", + "delete_count": "จำนวนการลบ", + "delete_size": "พื้นที่ที่ประหยัดได้", + "match_count": "จำนวนที่ตรงกัน", + "size": "ขนาด", + "total_size": "ขนาดทั้งหมด" + }, + "info": "การลบหน้าที่ซ้ำกันจะแก้ไขไฟล์ของคุณ สำรองไฟล์ของคุณและใช้การลบด้วยตนเองก่อนใช้การลบอัตโนมัติ", + "known": "รู้จัก", + "matches_n": "ไม่ตรงกัน | 1 รายการที่ตรงกัน | {count} รายการที่ตรงกัน", + "new": "ใหม่", + "saved_size": "ประหยัดได้ {size}", + "title": "หน้าที่ซ้ำกัน", + "unknown_size": "ไม่ทราบขนาด" + }, + "duplicates": { + "file_hash": "แฮชไฟล์", + "size": "ขนาด", + "title": "ไฟล์ที่ซ้ำกัน", + "url": "URL" + }, + "enums": { + "copy_mode": { + "HARDLINK": "ฮาร์ดลิงก์/คัดลอกไฟล์", + "MOVE": "ย้ายไฟล์" + }, + "epubreader": { + "appearances": { + "day": "กลางวัน", + "night": "กลางคืน", + "sepia": "ซีเปีย" + }, + "column_count": { + "auto": "อัตโนมัติ", + "one": "หนึ่ง", + "two": "สอง" + }, + "reading_direction": { + "auto": "อัตโนมัติ", + "ltr": "จากซ้ายไปขวา", + "rtl": "จากขวาไปซ้าย" + } + }, + "historical_event_type": { + "BookConverted": "หนังสือถูกแปลง", + "BookFileDeleted": "ไฟล์หนังสือถูกลบ", + "BookImported": "หนังสือนำเข้า", + "DuplicatePageDeleted": "หน้าที่ซ้ำกันถูกลบ", + "SeriesFolderDeleted": "โฟลเดอร์ซีรีส์ถูกลบ" + }, + "media_profile": { + "DIVINA": "DIVINA", + "EPUB": "EPUB", + "PDF": "PDF" + }, + "media_status": { + "ERROR": "ข้อผิดพลาด", + "OUTDATED": "ล้าสมัย", + "READY": "พร้อม", + "UNKNOWN": "ไม่ทราบ", + "UNSUPPORTED": "ไม่รองรับ" + }, + "page_hash_action": { + "DELETE_AUTO": "ลบอัตโนมัติ", + "DELETE_MANUAL": "ลบด้วยตนเอง", + "IGNORE": "ไม่สนใจ" + }, + "reading_direction": { + "LEFT_TO_RIGHT": "จากซ้ายไปขวา", + "RIGHT_TO_LEFT": "จากขวาไปซ้าย", + "VERTICAL": "แนวตั้ง", + "WEBTOON": "เว็บตูน" + }, + "scan_interval": { + "DAILY": "รายวัน", + "DISABLED": "ปิดใช้งาน", + "EVERY_12H": "ทุก 12 ชั่วโมง", + "EVERY_6H": "ทุก 6 ชั่วโมง", + "HOURLY": "รายชั่วโมง", + "WEEKLY": "รายสัปดาห์" + }, + "series_cover": { + "FIRST": "แรกสุด", + "FIRST_UNREAD_OR_FIRST": "เล่มแรกที่ยังไม่อ่าน หรือเล่มแรกสุด", + "FIRST_UNREAD_OR_LAST": "เล่มแรกที่ยังไม่อ่าน หรือเล่มล่าสุด", + "LAST": "ล่าสุด" + }, + "series_status": { + "ABANDONED": "ถูกทิ้ง", + "ENDED": "จบแล้ว", + "HIATUS": "หยุดพัก", + "ONGOING": "กำลังดำเนินเรื่อง" + }, + "thumbnail_size": { + "DEFAULT": "ค่าเริ่มต้น (300px)", + "LARGE": "ใหญ่ (900px)", + "MEDIUM": "กลาง (600px)", + "XLARGE": "ใหญ่พิเศษ (1200px)" + } + }, + "epubreader": { + "current_chapter": "บทปัจจุบัน", + "page_of": "หน้า {page} จาก {count}", + "publisher_font": "สำนักพิมพ์", + "settings": { + "column_count": "จำนวนคอลัมน์", + "font_family": "แบบอักษร", + "layout": "เค้าโครง", + "layout_paginated": "แบ่งหน้า", + "layout_scroll": "เลื่อน", + "navigation_mode": "โหมดการนำทาง", + "navigation_options": { + "both": "ทั้งสอง", + "buttons": "ปุ่ม", + "click": "คลิก / แตะ" + }, + "page_margins": "ระยะขอบหน้า", + "viewing_theme": "ธีมการดู" + }, + "shortcuts": { + "cycle_pagination": "สลับจำนวนคอลัมน์", + "cycle_viewing_theme": "สลับธีมการดู", + "font_size_decrease": "ลดขนาดตัวอักษร", + "font_size_increase": "เพิ่มขนาดตัวอักษร", + "menus": "เมนู", + "next": "ไปข้างหน้า", + "previous": "ย้อนกลับ", + "reader_navigation": "การนำทางในโปรแกรมอ่าน", + "scroll": "เปลี่ยนเค้าโครงเป็นการเลื่อน", + "settings": "การตั้งค่า", + "show_hide_toc": "แสดง/ซ่อนสารบัญ" + } + }, + "error_codes": { + "ERR_1000": "ไม่สามารถเข้าถึงไฟล์ได้ในระหว่างการวิเคราะห์", + "ERR_1001": "ไม่รองรับประเภทสื่อ", + "ERR_1002": "ไม่รองรับไฟล์ RAR ที่เข้ารหัส", + "ERR_1003": "ไม่รองรับไฟล์ RAR แบบ Solid", + "ERR_1004": "ไม่รองรับไฟล์ RAR แบบหลายวอลุ่ม", + "ERR_1005": "เกิดข้อผิดพลาดที่ไม่รู้จักขณะวิเคราะห์หนังสือ", + "ERR_1006": "หนังสือไม่มีหน้าใดๆ", + "ERR_1007": "ไม่สามารถวิเคราะห์บางรายการได้", + "ERR_1008": "เกิดข้อผิดพลาดที่ไม่รู้จักขณะรับรายการของหนังสือ", + "ERR_1009": "มีรายการอ่านชื่อนั้นอยู่แล้ว", + "ERR_1015": "เกิดข้อผิดพลาดขณะดีซีเรียลไลซ์ ComicRack CBL", + "ERR_1016": "ไดเรกทอรีไม่สามารถเข้าถึงได้หรือไม่ใช่ไดเรกทอรี", + "ERR_1017": "ไม่สามารถสแกนโฟลเดอร์ที่เป็นส่วนหนึ่งของไลบรารีที่มีอยู่", + "ERR_1018": "ไม่พบไฟล์", + "ERR_1019": "ไม่สามารถนำเข้าไฟล์ที่เป็นส่วนหนึ่งของไลบรารีที่มีอยู่", + "ERR_1020": "หนังสือที่จะอัปเกรดไม่ได้อยู่ในซีรีส์ที่ให้มา", + "ERR_1021": "ไฟล์ปลายทางมีอยู่แล้ว", + "ERR_1022": "ไม่สามารถสแกนหนังสือที่นำเข้าใหม่ได้", + "ERR_1023": "หนังสือมีอยู่ใน ReadingList แล้ว", + "ERR_1024": "ข้อผิดพลาดในการเข้าสู่ระบบ OAuth2: ไม่มีแอตทริบิวต์อีเมล", + "ERR_1025": "ข้อผิดพลาดในการเข้าสู่ระบบ OAuth2: ไม่มีผู้ใช้ในเครื่องที่มีอีเมลนั้น", + "ERR_1026": "ข้อผิดพลาดในการเข้าสู่ระบบ OpenID Connect: อีเมลไม่ได้รับการยืนยัน", + "ERR_1027": "ข้อผิดพลาดในการเข้าสู่ระบบ OpenID Connect: ไม่มีแอตทริบิวต์ email_verified", + "ERR_1028": "ข้อผิดพลาดในการเข้าสู่ระบบ OpenID Connect: ไม่มีแอตทริบิวต์อีเมล", + "ERR_1029": "ComicRack CBL ไม่มีองค์ประกอบ Book ใดๆ", + "ERR_1030": "ComicRack CBL ไม่มีองค์ประกอบ Name", + "ERR_1031": "ComicRack CBL Book ขาดซีรีส์หรือหมายเลข", + "ERR_1032": "ไฟล์ EPUB มีประเภทสื่อที่ไม่ถูกต้อง", + "ERR_1033": "บางรายการหายไป", + "ERR_1034": "มีคีย์ API ที่มีความคิดเห็นนั้นอยู่แล้ว", + "ERR_1035": "เกิดข้อผิดพลาดขณะรับ TOC ของ EPUB", + "ERR_1036": "เกิดข้อผิดพลาดขณะรับ Landmarks ของ EPUB", + "ERR_1037": "เกิดข้อผิดพลาดขณะรับรายการหน้าของ EPUB", + "ERR_1038": "เกิดข้อผิดพลาดขณะรับหน้า divina ของ EPUB", + "ERR_1039": "เกิดข้อผิดพลาดขณะรับตำแหน่งของ EPUB" + }, + "filter": { + "age_rating": "การจัดระดับอายุ", + "age_rating_none": "ไม่มี", + "any": "ใดๆ", + "complete": "สมบูรณ์", + "genre": "ประเภท", + "in_progress": "กำลังดำเนินการ", + "language": "ภาษา", + "library": "ไลบรารี", + "media_profile": "โปรไฟล์สื่อ", + "media_status": "สถานะสื่อ", + "oneshot": "เรื่องสั้นจบในตอน", + "publisher": "สำนักพิมพ์", + "read": "อ่านแล้ว", + "release_date": "วันที่เผยแพร่", + "sharing_label": "ป้ายกำกับการแชร์", + "status": "สถานะ", + "tag": "แท็ก", + "unread": "ยังไม่อ่าน" + }, + "filter_drawer": { + "filter": "ตัวกรอง", + "sort": "จัดเรียง" + }, + "history": { + "header": { + "book": "หนังสือ", + "date": "วันที่", + "details": "รายละเอียด", + "series": "ซีรีส์", + "type": "ประเภท" + }, + "title": "ประวัติ" + }, + "home": { + "theme": "ธีม", + "translation": "การแปล" + }, + "library_navigation": { + "browse": "เลือกชม", + "browse_books": "หนังสือ", + "browse_series": "ซีรีส์", + "collections": "คอลเลกชัน", + "readlists": "รายการอ่าน", + "recommended": "แนะนำ" + }, + "login": { + "create_user_account": "สร้างบัญชีผู้ใช้", + "login": "ลงชื่อเข้าใช้", + "unclaimed_html": "เซิร์ฟเวอร์ Komga นี้ยังไม่เปิดใช้งาน คุณต้องสร้างบัญชีผู้ใช้เพื่อเข้าถึง

เลือก อีเมล และ รหัสผ่าน แล้วคลิกที่ สร้างบัญชีผู้ใช้" + }, + "media_analysis": { + "comment": "ความคิดเห็น", + "media_analysis": "การวิเคราะห์สื่อ", + "media_type": "ประเภทสื่อ", + "name": "ชื่อ", + "size": "ขนาด", + "status": "สถานะ", + "url": "URL" + }, + "menu": { + "add_to_collection": "เพิ่มไปยังคอลเลกชัน", + "add_to_readlist": "เพิ่มไปยังรายการอ่าน", + "analyze": "วิเคราะห์", + "bulk_edit_metadata": "แก้ไขข้อมูลเมตาหลายรายการ", + "delete": "ลบ", + "deselect_all": "ยกเลิกการเลือกทั้งหมด", + "download_readlist": "ดาวน์โหลดรายการอ่าน", + "download_series": "ดาวน์โหลดซีรีส์", + "edit": "แก้ไข", + "edit_metadata": "แก้ไขข้อมูลเมตา", + "empty_trash": "ล้างถังขยะ", + "mark_read": "ทำเครื่องหมายว่าอ่านแล้ว", + "mark_unread": "ทำเครื่องหมายว่ายังไม่อ่าน", + "pin": "ปักหมุด", + "refresh_metadata": "รีเฟรชข้อมูลเมตา", + "scan_library_files": "สแกนไฟล์ไลบรารี", + "scan_library_files_deep": "สแกนไฟล์ไลบรารี (เชิงลึก)", + "select_all": "เลือกทั้งหมด", + "unpin": "ถอดหมุด" + }, + "metrics": { + "library_books": "หนังสือต่อไลบรารี", + "library_disk_space": "พื้นที่ดิสก์ไลบรารี", + "library_series": "ซีรีส์ต่อไลบรารี", + "library_sidecars": "ไฟล์เสริมต่อไลบรารี", + "tasks_executed": "งานที่ดำเนินการ", + "tasks_total_time": "เวลารวมของงาน", + "title": "เมตริก" + }, + "missing_posters": { + "title": "โปสเตอร์ที่หายไป" + }, + "navigation": { + "home": "หน้าแรก", + "libraries": "ไลบรารี", + "logout": "ออกจากระบบ" + }, + "no_libraries_pinned": { + "subtitle": "คุณสามารถปักหมุดไลบรารีได้จากเมนู 3 จุด", + "title": "ไม่มีไลบรารีที่ปักหมุด" + }, + "page_not_found": { + "go_back_to_home_page": "กลับไปที่หน้าแรก", + "page_does_not_exist": "หน้าที่คุณกำลังมองหาไม่มีอยู่", + "page_not_found": "ไม่พบหน้า" + }, + "read_more": { + "less": "อ่านน้อยลง", + "more": "อ่านเพิ่มเติม" + }, + "readlist_import": { + "row": { + "duplicate_book": "หนังสือซ้ำ", + "error_choose_book": "เลือกหนังสือ" + } + }, + "readlists_expansion_panel": { + "manage_readlist": "จัดการรายการอ่าน", + "title": "รายการอ่าน {name}" + }, + "search": { + "no_results": "การค้นหาไม่พบผลลัพธ์", + "search": "ค้นหา", + "search_for_something_else": "ลองค้นหาสิ่งอื่น", + "search_results_for": "ผลการค้นหาสำหรับ \"{name}\"" + }, + "searchbox": { + "in_library": "ใน {library}", + "no_results": "ไม่มีผลลัพธ์", + "search_all": "ค้นหาทั้งหมด…" + }, + "server": { + "server_management": { + "button_cancel_all_tasks": "ยกเลิกงานทั้งหมด", + "button_empty_trash": "ล้างถังขยะสำหรับไลบรารีทั้งหมด", + "button_scan_libraries": "สแกนไลบรารีทั้งหมด", + "button_scan_libraries_deep": "สแกนไลบรารีทั้งหมด (เชิงลึก)", + "button_shutdown": "ปิด", + "download_log": "ดาวน์โหลดไฟล์บันทึก", + "notification_tasks_cancelled": "ไม่มีงานที่จะยกเลิก | ยกเลิกหนึ่งงาน | ยกเลิก {count} งาน", + "section_title": "การจัดการเซิร์ฟเวอร์" + }, + "tab_title": "เซิร์ฟเวอร์", + "updates": "อัปเดต" + }, + "server_settings": { + "config_precedence": "มีความสำคัญเหนือกว่าไฟล์การกำหนดค่า", + "dialog_regenerate_thumbnails": { + "body": "ขนาดภาพขนาดย่อมีการเปลี่ยนแปลง คุณต้องการสร้างภาพขนาดย่อของหนังสือใหม่หรือไม่?", + "btn_alternate": "ใช่, ทุกเล่ม", + "btn_cancel": "ไม่", + "btn_confirm": "ใช่, แต่เฉพาะถ้าใหญ่กว่า", + "title": "สร้างภาพขนาดย่อใหม่" + }, + "hint_kobo_port": "ตั้งค่าเฉพาะในกรณีที่มีปัญหาการซิงค์กับปกและการดาวน์โหลด", + "label_delete_empty_collections": "ลบคอลเลกชันที่ว่างเปล่าหลังจากการสแกน", + "label_delete_empty_readlists": "ลบรายการอ่านที่ว่างเปล่าหลังจากการสแกน", + "label_kepubify_path": "เส้นทางไปยัง kepubify", + "label_kobo_port": "พอร์ตภายนอกของ Kobo Sync", + "label_kobo_proxy": "พร็อกซีคำขอ Kobo Sync ไปยัง Kobo Store", + "label_rememberme_duration": "ระยะเวลาจดจำฉัน (เป็นวัน)", + "label_server_context_path": "URL พื้นฐาน", + "label_server_port": "พอร์ตเซิร์ฟเวอร์", + "label_task_pool_size": "เธรดงาน", + "label_thumbnail_size": "ขนาดภาพขนาดย่อ", + "requires_restart": "ต้องรีสตาร์ทเพื่อให้มีผล", + "server_settings": "การตั้งค่าเซิร์ฟเวอร์" + }, + "settings_user": { + "change_password": "เปลี่ยนรหัสผ่าน", + "edit_restrictions": "แก้ไขข้อจำกัด", + "edit_user": "แก้ไขผู้ใช้", + "latest_activity": "กิจกรรมล่าสุด: {date}", + "no_recent_activity": "ไม่มีกิจกรรมล่าสุด", + "role_administrator": "ผู้ดูแลระบบ", + "role_user": "ผู้ใช้" + }, + "sort": { + "books_count": "จำนวนหนังสือ", + "date_added": "วันที่เพิ่ม", + "date_read": "วันที่อ่าน", + "date_updated": "วันที่อัปเดต", + "file_name": "ชื่อไฟล์", + "file_size": "ขนาดไฟล์", + "folder_name": "ชื่อโฟลเดอร์", + "name": "ชื่อ", + "number": "หมายเลข", + "page_count": "จำนวนหน้า", + "random": "สุ่ม", + "release_date": "วันที่เผยแพร่", + "series": "ซีรีส์" + }, + "theme": { + "dark": "มืด", + "light": "สว่าง", + "system": "ระบบ" + }, + "thumbnail_card": { + "tooltip_delete": "ลบ", + "tooltip_generated": "อาร์ตเวิร์กที่สร้างขึ้น", + "tooltip_mark_as_selected": "ทำเครื่องหมายว่าเลือกแล้ว", + "tooltip_selected": "เลือกแล้ว", + "tooltip_sidecar": "อาร์ตเวิร์กในเครื่อง", + "tooltip_to_be_deleted": "จะถูกลบ", + "tooltip_to_be_uploaded": "จะถูกอัปโหลด", + "tooltip_too_big": "ไฟล์ใหญ่เกินไป!", + "tooltip_user_uploaded": "ผู้ใช้อัปโหลด" + }, + "titles_more": { + "less": "ชื่อเรื่องน้อยลง", + "more": "ชื่อเรื่องเพิ่มเติม" + }, + "ui_settings": { + "general": "ทั่วไป", + "label_oauth2_auto_login": "เข้าสู่ระบบ OAuth2 อัตโนมัติ", + "label_oauth2_hide_login": "ซ่อนฟิลด์เข้าสู่ระบบหากเปิดใช้งาน OAuth2", + "label_poster_blur_unread": "เบลอโปสเตอร์สำหรับหนังสือและซีรีส์ที่ยังไม่อ่าน", + "label_poster_stretch": "ยืดโปสเตอร์ให้พอดีกับการ์ด", + "label_series_groups": "การจัดกลุ่มซีรีส์", + "section_oauth2": "OAuth2", + "series_groups": { + "alpha": "ตามตัวอักษร", + "japanese": "โกจูอง (ญี่ปุ่น)" + }, + "tooltip_oauth2_auto_login": "ต้องมีผู้ให้บริการ OAuth2 เพียงรายเดียว และเปิดใช้งาน 'ซ่อนฟิลด์เข้าสู่ระบบ'" + }, + "updates": { + "available": "มีการอัปเดต", + "latest_installed": "ติดตั้ง Komga เวอร์ชันล่าสุดแล้ว" + }, + "user_roles": { + "ADMIN": "ผู้ดูแลระบบ", + "FILE_DOWNLOAD": "ดาวน์โหลดไฟล์", + "KOBO_SYNC": "ซิงค์ Kobo", + "KOREADER_SYNC": "ซิงค์ KOReader", + "PAGE_STREAMING": "สตรีมหน้า", + "USER": "ผู้ใช้" + }, + "users": { + "api_keys": "คีย์ API", + "authentication_activity": "กิจกรรมการรับรองตัวเอง", + "users": "ผู้ใช้" + }, + "validation": { + "context_path": "ต้องขึ้นต้นด้วย '/', ไม่ลงท้ายด้วย '/-_', และมีเฉพาะ '/-_a-z0-9'", + "one_or_more": "ต้องเป็น 1 หรือมากกว่า", + "tcp_port": "ต้องอยู่ระหว่าง 1 ถึง 65535", + "zero_or_more": "ต้องเป็น 0 หรือมากกว่า" + }, "welcome": { + "add_library": "เพิ่มไลบรารี", + "no_libraries_yet": "ยังไม่มีการเพิ่มไลบรารี!", "welcome_message": "ยินดีต้อนรับสู่ Komga" } } From 475f0267494d7ebb015bab76fc4f7a48abbe6719 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:25 +0100 Subject: [PATCH 018/114] i18n(webui): translated using Weblate (Portuguese (Brazil)) Currently translated at 79.5% (668 of 840 strings) i18n(webui): translated using Weblate (Portuguese (Brazil)) Currently translated at 79.5% (668 of 840 strings) i18n(webui): translated using Weblate (Portuguese (Brazil)) Currently translated at 79.5% (668 of 840 strings) Co-authored-by: Hosted Weblate Co-authored-by: Luiz Henrique Moreira de Souza Co-authored-by: Weblate Translation Memory Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/ Translation: komga/webui --- komga-webui/src/locales/pt-BR.json | 38 ++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/komga-webui/src/locales/pt-BR.json b/komga-webui/src/locales/pt-BR.json index 4ea17322..592ebfa8 100644 --- a/komga-webui/src/locales/pt-BR.json +++ b/komga-webui/src/locales/pt-BR.json @@ -319,7 +319,12 @@ }, "dialog": { "add_api_key": { - "button_confirm": "Gerar" + "button_confirm": "Gerar", + "context": "Chaves API podem ser usadas para autenticar no protocolo Kobo Sync.", + "dialog_title": "Gerar chave de API", + "field_comment": "Comentar", + "field_comment_hint": "Como a chave API será usada?", + "info_copy": "Tenha a certeza de que a chave API foi salva. Você não poderá vê-la novamente!" }, "add_to_collection": { "button_create": "Criar", @@ -354,6 +359,12 @@ "filter": "Filtrar por número, título ou data de lançamento", "title": "Selecionar livro" }, + "delete_apikey": { + "button_confirm": "Excluir", + "confirm_delete": "Eu entendo, exclua a chave API \"{name}\"", + "dialog_title": "Deletar chave API", + "warning_html": "Quaisquer aplicativos ou scripts que utilizem esta chave API não poderão mais acessar a API Komga. Você não poderá desfazer esta ação." + }, "delete_book": { "button_confirm": "Excluir", "confirm_delete": "Sim, exclua o livro \"{name}\" e seus arquivos", @@ -503,6 +514,9 @@ "tab_general": "Geral", "tab_poster": "Pôster" }, + "edit_recommended": { + "button_confirm": "Salvar mudanças" + }, "edit_series": { "button_cancel": "Cancelar", "button_confirm": "Salvar mudanças", @@ -571,6 +585,9 @@ }, "title": "Nome do Arquivo de Destino" }, + "force_kobo_sync": { + "dialog_title": "Forçar sincronização com Kobo" + }, "password_change": { "button_cancel": "Cancelar", "button_confirm": "Mudar senha", @@ -638,6 +655,9 @@ "HARDLINK": "Hardlink/Copiar arquivos", "MOVE": "Mover Arquivos" }, + "media_profile": { + "PDF": "PDF" + }, "media_status": { "ERROR": "Erro", "OUTDATED": "Desatualizado", @@ -664,6 +684,14 @@ "ONGOING": "Em andamento" } }, + "epubreader": { + "settings": { + "page_margins": "Margem de Páginas" + }, + "shortcuts": { + "settings": "Configurações" + } + }, "error_codes": { "ERR_1000": "O arquivo não pôde ser acessado durante a análise", "ERR_1001": "O tipo de mídia não é compatível", @@ -695,6 +723,7 @@ "in_progress": "Em progresso", "language": "idioma", "library": "biblioteca", + "oneshot": "One-shot", "publisher": "editora", "read": "Lidos", "release_date": "data de lançamento", @@ -708,7 +737,8 @@ }, "history": { "header": { - "book": "Livro" + "book": "Livro", + "details": "Detalhes" } }, "home": { @@ -830,6 +860,9 @@ "tooltip_too_big": "Arquivo muito grande!", "tooltip_user_uploaded": "Enviado pelo usuário" }, + "ui_settings": { + "general": "Geral" + }, "user_roles": { "ADMIN": "Administrador", "FILE_DOWNLOAD": "Baixar arquivos", @@ -837,6 +870,7 @@ "USER": "Usuário" }, "users": { + "api_keys": "Chaves API", "authentication_activity": "Atividade de Autenticação", "users": "Usuários" }, From a2ed7d319dc8c4916735815ea1fada5deae15258 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:27 +0100 Subject: [PATCH 019/114] i18n(webui): translated using Weblate (Russian) Currently translated at 64.6% (543 of 840 strings) i18n(webui): translated using Weblate (Russian) Currently translated at 67.0% (563 of 840 strings) Co-authored-by: Aleksey Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/komga/webui/ru/ Translation: komga/webui --- komga-webui/src/locales/ru.json | 123 +++++++++++++++++++------------- 1 file changed, 72 insertions(+), 51 deletions(-) diff --git a/komga-webui/src/locales/ru.json b/komga-webui/src/locales/ru.json index d074cd35..8392c3b2 100644 --- a/komga-webui/src/locales/ru.json +++ b/komga-webui/src/locales/ru.json @@ -4,8 +4,8 @@ "pageText": "{0}-{1} из {2}" }, "dataIterator": { - "loadingText": "Загрузка объектов...", - "noResultsText": "Подходящих записей не найдено" + "loadingText": "Загрузка элементов...", + "noResultsText": "Совпадений не найдено" }, "dataTable": { "itemsPerPageText": "Строк на странице:", @@ -15,30 +15,33 @@ "counter": "Файлов: {0}", "counterSize": "Файлов: {0} (всего {1})" }, - "noDataText": "Отсутствуют данные" + "noDataText": "Данные отсутствуют" }, "account_settings": { - "account_settings": "Настройки Аккаунта", + "account_settings": "Настройки аккаунта", "api_key": { "created_date": "Дата создания: {date}", - "generate_api_key": "Сгенерировать API ключ", + "force_kobo_sync": "Принудительная синхронизация с Kobo", + "generate_api_key": "Сгенерировать ключ API", "no_keys": "Ни одного ключа API еще не создано" }, - "change_password": "изменить пароль" + "change_password": "изменить пароль", + "details": "Подробности", + "my_account": "Мой аккаунт" }, "announcements": { - "mark_all_read": "Пометить всё как прочитанное", - "mark_read": "Пометить как прочитанное", + "mark_all_read": "Отметить всё как прочитанное", + "mark_read": "Отметить как прочитанное", "tab_title": "Объявления" }, "authentication_activity": { - "api_key": "API Ключ", - "datetime": "Дата / Время", + "api_key": "API-ключ", + "datetime": "Дата/Время", "email": "Эл. почта", "error": "Ошибка", "ip": "IP-адрес", "source": "Источник", - "success": "Статус", + "success": "Успех", "user_agent": "User Agent" }, "author_roles": { @@ -54,18 +57,18 @@ "book_card": { "error": "Ошибка", "no_release_date": "Дата релиза отсутствует", - "unknown": "Необходимо проанализировать", + "unknown": "Подлежит анализу", "unread": "Не прочитано", - "unsupported": "Неподдерживаемый" + "unsupported": "Не поддерживается" }, "book_import": { "button_browse": "Обзор", - "button_import": "Импортировать", + "button_import": "Импорт", "button_scan": "Сканировать", - "button_select_series": "Выберите Серию", + "button_select_series": "Выберите серию", "field_import_path": "Импортировать из каталога", - "info_part1": "Этот раздел позволяет вам импортировать файлы, которые находятся за пределами ваших существующих библиотек. Вы можете импортировать файлы только в существующие Серии, в этом случае Komga переместит или скопирует файлы в каталог выбранной Серии.", - "info_part2": "Если вы выберете номер для книги и книга с таким номером уже существует, то вы сможете сравнить 2 книги. Если вы решите импортировать книгу, Komga обновит существующую книгу, эффективно заменив старый файл новым.", + "info_part1": "Этот раздел позволяет вам импортировать файлы, которые находятся за пределами ваших существующих библиотек. Вы можете импортировать файлы только в существующие серии; в этом случае Komga переместит или скопирует файлы в каталог выбранной серии.", + "info_part2": "Если вы укажете номер для книги, и книга с таким номером уже существует, вы сможете сравнить оба варианта. Если вы решите импортировать книгу, Komga обновит существующий вариант, заменив старый файл новым.", "no_files_found": "Файлы не найдены", "notification": { "go_to_book": "Перейти к книге", @@ -74,9 +77,9 @@ "source_file": "Исходный файл: {file}" }, "row": { - "error_analyze_first": "Книгу нужно сначала проанализировать", + "error_analyze_first": "Книга нуждается в предварительном анализе", "error_choose_series": "Выберите серию", - "error_only_import_no_errors": "Можно импортировать только книги без ошибок", + "error_only_import_no_errors": "Можно импортировать только книги без наличия ошибок", "warning_upgrade": "Существующая книга будет обновлена" }, "table": { @@ -90,10 +93,11 @@ }, "bookreader": { "beginning_of_book": "Вы находитесь в начале книги.", - "changing_reading_direction": "Изменение Направления Чтения на", - "cycling_page_layout": "Переключить Формат Страниц", - "cycling_scale": "Переключить Масштабирование", - "cycling_side_padding": "Переключить Боковой Отступ", + "changing_reading_direction": "Изменение направления чтения на", + "cycling_page_layout": "Переключение макета страницы", + "cycling_page_margin": "Переключение полей страницы", + "cycling_scale": "Масштабирование", + "cycling_side_padding": "Переключение боковых отступов", "download_current_page": "Скачать текущую страницу", "end_of_book": "Вы достигли конца книги.", "from_series_metadata": "из метаданных серии", @@ -104,8 +108,8 @@ "notification_poster_set_readlist": "Текущая страница теперь используется в качестве постера списка чтения.", "notification_poster_set_series": "Текущая страница теперь используется в качестве постера серии.", "paged_reader_layout": { - "double": "Двойные страницы", - "double_no_cover": "Двойные страницы (без обложки)", + "double": "Две страницы", + "double_no_cover": "Две страницы (без обложки)", "single": "Одна страница" }, "reader_settings": "Настройки Ридера", @@ -114,16 +118,16 @@ "continuous_width": "По ширине", "height": "По высоте", "original": "Исходное", - "screen": "По экрану", + "screen": "По размеру экрана", "width": "По ширине", "width_shrink_only": "По ширине (с отступами)" }, - "set_current_page_as_book_poster": "Установить страницу в качестве постера для книги", - "set_current_page_as_readlist_poster": "Установить страницу в качестве постера для списка чтения", - "set_current_page_as_series_poster": "Установить страницу в качестве постера для серии", + "set_current_page_as_book_poster": "Установить страницу в качестве обложки для книги", + "set_current_page_as_readlist_poster": "Установить страницу в качестве обложки для списка чтения", + "set_current_page_as_series_poster": "Установить страницу в качестве обложки для серии", "settings": { - "always_fullscreen": "Всегда в полный экран", - "animate_page_transitions": "Анимировать переходы страниц", + "always_fullscreen": "Всегда полноэкранный режим", + "animate_page_transitions": "Анимировать переходы между страницами", "background_color": "Цвет фона", "background_colors": { "black": "Чёрный", @@ -134,54 +138,60 @@ "general": "Общее", "gestures": "Жесты", "page_layout": "Формат страницы", - "paged": "Настройки Отображения Страниц", + "page_margin": "Поля страницы", + "paged": "Настройки отображения страниц", "reading_mode": "Режим чтения", "scale_type": "Масштабирование", - "side_padding": "Боковой отступ", + "side_padding": "Боковые отступы", "side_padding_none": "Нет", - "webtoon": "Параметры Режима Webtoon" + "webtoon": "Настройки режима цифрового комикса" }, "shortcuts": { "close": "Закрыть", - "cycle_page_layout": "Переключить формат страниц", + "cycle_page_layout": "Переключить макет страницы", + "cycle_page_margin": "Переключить поля страницы", "cycle_scale": "Переключить масштаб", - "cycle_side_padding": "Переключить боковой отступ", + "cycle_side_padding": "Переключить боковые отступы", "first_page": "Первая страница", "fullscreen": "Войти/выйти из полноэкранного режима", "last_page": "Последняя страница", - "left_to_right": "Слева Направо", + "left_to_right": "Слева направо", "menus": "Меню", "next_page": "Следующая страница", "previous_page": "Предыдущая страница", "reader_navigation": "Навигация", - "right_to_left": "Справа Налево", + "right_to_left": "Справа налево", "settings": "Настройки", "show_hide_help": "Показать/скрыть помощь", "show_hide_settings": "Показать/скрыть меню настроек", - "show_hide_thumbnails": "Показать/скрыть просмотр эскизов", + "show_hide_thumbnails": "Показать/скрыть обозреватель миниатюр", "show_hide_toolbars": "Показать/скрыть панели инструментов", "vertical": "Вертикально", - "webtoon": "Webtoon" + "webtoon": "Цифровой комикс" }, "tooltip_incognito": "Прогресс чтения не будет сохранен" }, "browse_book": { "comment": "КОММЕНТАРИЙ", + "date_created": "СОЗДАНО", + "date_modified": "ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ", "download_file": "Скачать файл", "file": "ФАЙЛ", "format": "ФОРМАТ", "isbn": "ISBN", "links": "ССЫЛКИ", - "navigation_within_readlist": "Навигация в пределах списка чтения: {name}", - "outdated_tooltip": "Файл этой книги изменен, книгу необходимо повторно проанализировать", + "navigation_within_readlist": "Навигация внутри списка чтения: {name}", + "outdated_tooltip": "Файл этой книги изменился, книгу необходимо повторно проанализировать", "read_book": "Читать книгу", "read_incognito": "Читать инкогнито", + "remove_from_collection": "Удалить книгу из коллекции", + "remove_from_readlist": "Удалить книгу из списка чтения", "size": "РАЗМЕР" }, "browse_collection": { "edit_collection": "Редактировать коллекцию", "edit_elements": "Редактировать элементы", - "manual_ordering": "ручной порядок" + "manual_ordering": "ручная сортировка" }, "browse_readlist": { "edit_elements": "Редактировать элементы", @@ -189,17 +199,19 @@ "manual_ordering": "ручная сортировка" }, "browse_series": { - "earliest_year_from_release_dates": "Это самая ранняя дата выпуска из всех книг в этой серии", - "series_no_summary": "У серии нет описания, поэтому мы подобрали его для вас!", + "earliest_year_from_release_dates": "Это самый ранний год из дат выхода всех книг серии", + "remove_from_collection": "Удалить серию из коллекции", + "series_no_summary": "У этой серии нет описания, поэтому мы подобрали его для вас!", "summary_from_book": "Краткое описание из книги {number}:" }, "collections_expansion_panel": { - "manage_collection": "Управлять коллекцией", + "manage_collection": "Управление коллекцией", "title": "Коллекция {name}" }, "common": { "age": "Возраст", - "all_libraries": "Все Библиотеки", + "all_libraries": "Все библиотеки", + "any_of": "Любой из", "book": "Книга", "books": "Книги", "books_n": "Книг нет | 1 книга | {count} книг", @@ -212,14 +224,16 @@ "copied": "Скопировано!", "create": "Создать", "delete": "Удалить", - "dimension": "шир.: {width} выс.: {height}", + "dimension": "шир.: {width}, выс.: {height}", "discard": "Отмена", "disk_space": "Дисковое пространство", "dismiss": "Отклонить", "download": "Скачать", "drag_drop": "перетащить", + "duplicate": "Дублировать", "email": "Эл. почта", "epub": "Epub", + "error": "Ошибка", "filename": "Имя файла", "filter_no_matches": "Нет совпадений по заданному фильтру", "genre": "Жанр", @@ -227,12 +241,16 @@ "go_to_library": "Вернуться к библиотеке", "go_to_readlist": "Перейти к списку чтения", "go_to_series": "Перейти к серии", + "i_understand": "Я понимаю", "library": "Библиотека", "locale_name": "Русский", "locale_rtl": "false", "lock_all": "Заблокировать все", + "media": "Медиа", + "more": "Ещё", "n_selected": "{count} выбрано", "nothing_to_show": "Нет данных для отображения", + "ok": "OK", "outdated": "Устарело", "page": "Страница", "page_number": "Номер страницы", @@ -242,17 +260,20 @@ "password": "Пароль", "pdf": "PDF", "pending_tasks": "Нет незавершенных задач | 1 незавершенная задача | {count} незавершенных задач", + "pinned_libraries": "Закреплённые библиотеки", "publisher": "Издатель", "read": "Читать", - "read_on": "Читать {date}", + "read_on": "Прочитано {date}", "readlist": "Список чтения", "readlists": "Списки чтения", - "remember-me": "Запомнить", - "required": "Необходимо", + "remember-me": "Запомнить меня", + "reorder": "Изменить порядок", + "required": "Обязательно", "reset_filters": "Сбросить фильтры", "roles": "Роли", "save_changes": "Сохранить изменения", "series": "Серии", + "settings": "Настройки", "tags": "Теги", "unavailable": "Недоступно", "unlock_all": "Разблокировать все", From dde0169f2ae8fc4dc5f18965d3bdd90013d45bc4 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:28 +0100 Subject: [PATCH 020/114] i18n(webui): translated using Weblate (Croatian) Currently translated at 100.0% (840 of 840 strings) Co-authored-by: Hosted Weblate Co-authored-by: Milo Ivir Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/ Translation: komga/webui --- komga-webui/src/locales/hr.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/komga-webui/src/locales/hr.json b/komga-webui/src/locales/hr.json index 102cd561..db499b5f 100644 --- a/komga-webui/src/locales/hr.json +++ b/komga-webui/src/locales/hr.json @@ -46,7 +46,7 @@ }, "author_roles": { "colorist": "koloristi", - "cover": "omot", + "cover": "naslovnica", "editor": "urednici", "inker": "bojitelj", "letterer": "tipografi", @@ -109,7 +109,7 @@ "notification_poster_set_series": "Trenutačna stranica je sada postavljena kao poster serije.", "paged_reader_layout": { "double": "Dvije stranice", - "double_no_cover": "Dvije stranice (bez omota)", + "double_no_cover": "Dvije stranice (bez naslovnice)", "single": "Jedna stranica" }, "reader_settings": "Postavke čitača", @@ -484,7 +484,7 @@ "field_scanner_empty_trash_after_scan": "Automatski isprazni smeće nakon svakog pretraživanja", "field_scanner_force_directory_modified_time": "Pretraži mape na osnovi vremena promjene", "field_scanner_scan_startup": "Pretraži tijekom pokretanja", - "field_series_cover": "Omot serije", + "field_series_cover": "Naslovnica serije", "file_browser_dialog_button_confirm": "Odaberi", "file_browser_dialog_title": "Osnovna mapa biblioteke", "label_analysis": "Analiza", @@ -497,7 +497,7 @@ "label_scan_directory_exclusions": "Isključivanja mapa", "label_scan_types": "Traži ove vrste datoteka", "label_scanner": "Tražilica", - "label_series_cover": "Omot serije", + "label_series_cover": "Naslovnica serije", "tab_general": "Općenito", "tab_metadata": "Metapodaci", "tab_options": "Opcije", @@ -989,7 +989,7 @@ "btn_confirm": "Da, ali samo ako su veće", "title": "Nanovo generiraj minijature" }, - "hint_kobo_port": "Postavi samo u slučaju problema sa sinkronizacijom omota i preuzimanja", + "hint_kobo_port": "Postavi samo u slučaju problema sa sinkronizacijom naslovnica i preuzimanja", "label_delete_empty_collections": "Izbriši prazne zbirke nakon pretraživanja", "label_delete_empty_readlists": "Izbriši prazne liste čitanja nakon pretraživanja", "label_kepubify_path": "Staza do kepubify", From 9d10ed31a79a26f699b24dbccf76b01b15985e10 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:52:29 +0100 Subject: [PATCH 021/114] chore: update translation files Updated by "Remove blank strings" hook in Weblate. i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) i18n(webui): translated using Weblate (Arabic) Currently translated at 91.6% (770 of 840 strings) Co-authored-by: Hosted Weblate Co-authored-by: Weblate Translation Memory Co-authored-by: redaloe Translate-URL: https://hosted.weblate.org/projects/komga/webui/ Translate-URL: https://hosted.weblate.org/projects/komga/webui/ar/ Translation: komga/webui --- komga-webui/src/locales/ar.json | 200 ++++++++++++++++++++++++++++++-- 1 file changed, 190 insertions(+), 10 deletions(-) diff --git a/komga-webui/src/locales/ar.json b/komga-webui/src/locales/ar.json index 7da7bcb9..7d8b0715 100644 --- a/komga-webui/src/locales/ar.json +++ b/komga-webui/src/locales/ar.json @@ -19,7 +19,15 @@ }, "account_settings": { "account_settings": "إعدادات الحساب", - "change_password": "تغيير كلمة السر" + "api_key": { + "created_date": "تاريخ الصنع: {date}", + "force_kobo_sync": "إجبار مزامنة Kobo", + "generate_api_key": "توليد مفتاح API", + "no_keys": "لم يخلق مفتاح API بعد" + }, + "change_password": "تغيير كلمة السر", + "details": "تفاصيل", + "my_account": "حسابي" }, "announcements": { "mark_all_read": "اشر عليها بانها قرأت", @@ -27,6 +35,7 @@ "tab_title": "إعلانات" }, "authentication_activity": { + "api_key": "مفتاح API", "datetime": "التاريخ والوقت", "email": "البريد الإلكتروني", "error": "خطأ", @@ -85,7 +94,8 @@ "bookreader": { "beginning_of_book": "أنت في بداية الكتاب.", "changing_reading_direction": "تغيير اتجاه القراءة إلى", - "cycling_page_layout": "تخطيط دوري للصفحة", + "cycling_page_layout": "تغيير تخطيط الصفحة", + "cycling_page_margin": "تغيير هامش الصفحة", "cycling_scale": "تغيير حجم التحرير", "cycling_side_padding": "تغيير الحدود الجانبية", "download_current_page": "تنزيل الصفحة الحالية", @@ -128,6 +138,7 @@ "general": "إعدادات عامة", "gestures": "الإيماءات", "page_layout": "تخطيط الصفحة", + "page_margin": "هامش الصفحة", "paged": "خيارات القارئ المرقم", "reading_mode": "وضع القراءة", "scale_type": "نوع القياس", @@ -137,8 +148,9 @@ }, "shortcuts": { "close": "إغلاق", - "cycle_page_layout": "دورة تخطيط الصفحة", - "cycle_scale": "مقياس الدورة", + "cycle_page_layout": "تغيير تخطيط الصفحة", + "cycle_page_margin": "تغيير هامش الصفحة", + "cycle_scale": "تغيير الحجم", "cycle_side_padding": "تغيير الحدود الجانبية", "first_page": "الصفحة الأولى", "fullscreen": "إدخال/إنهاء ملء الشاشة", @@ -161,6 +173,8 @@ }, "browse_book": { "comment": "تعليق", + "date_created": "صُنِع", + "date_modified": "آخر تعديل", "download_file": "تحميل الملف", "file": "ملف", "format": "صيغة", @@ -170,6 +184,8 @@ "outdated_tooltip": "تم تغيير ملف هذا الكتاب ، يجب إعادة تحليل هذا الكتاب", "read_book": "قراءة كتاب", "read_incognito": "قراءة التصفح المتخفي", + "remove_from_collection": "إزالة الكتاب من المجموعة", + "remove_from_readlist": "إزالة الكتاب من قائمة القراءة", "size": "حجم" }, "browse_collection": { @@ -184,6 +200,7 @@ }, "browse_series": { "earliest_year_from_release_dates": "هذه هي السنة الأولى من تواريخ الإصدار لجميع الكتب في السلسلة", + "remove_from_collection": "إزالة السلسلة من المجموعة", "series_no_summary": "هذه السلسلة لا تحتوي على ملخص ، لذلك اخترنا واحدًا لك!", "summary_from_book": "ملخص من الكتاب {number}:" }, @@ -194,6 +211,8 @@ "common": { "age": "العمر", "all_libraries": "كل المكتبات", + "all_of": "كل من", + "any_of": "أي من", "book": "كتاب", "books": "كتب", "books_n": "لا يوجد كتاب | 1 كتاب | {count} كتب", @@ -203,15 +222,19 @@ "choose_image": "اختر صورة", "close": "إغلاق", "collections": "المجموعات", + "copied": "تم النسخ!", "create": "صنع", "delete": "حذف", - "discard": "تجاهل", + "dimension": "ع:{width}, ط:{height}", + "discard": "تخلص", "disk_space": "مساحة القرص", "dismiss": "رفض", "download": "تحميل", "drag_drop": "أمسك واسحب", + "duplicate": "مكرر", "email": "البريد الإلكتروني", - "epub": "Epub", + "epub": "EPUB", + "error": "خطأ", "filename": "اسم الملف", "filter_no_matches": "الفلتر النشط ليس له تطابق", "genre": "نوع", @@ -219,13 +242,17 @@ "go_to_library": "اذهب إلى المكتبة", "go_to_readlist": "انتقل إلى قائمة القراءة", "go_to_series": "الانتقال إلى السلسلة", + "i_understand": "فهمت", "library": "مكتبة", "locale_name": "العربية", "locale_rtl": "true", "lock_all": "قفل الكل", + "media": "الوسائط", + "more": "المزيد", "n_selected": "{count} مختار", "nothing_to_show": "لا شيء للعرض", - "oneshot": "طلقة واحدة", + "ok": "حسنا", + "oneshot": "قصة منفردة", "outdated": "متقادمة", "page": "صفحة", "page_number": "رقم الصفحة", @@ -235,19 +262,23 @@ "password": "كلمة السر", "pdf": "PDF", "pending_tasks": "لا توجد مهام معلقة | مهمة واحدة معلقة | {count} مهام معلقة", + "pinned_libraries": "المكتبات المثبتة", "publisher": "الناشر", "read": "اقرأ", "read_on": "قرأ في {date}", "readlist": "قائمة القراءة", "readlists": "قوائم القراءة", "remember-me": "تذكرني", + "reorder": "تغيير الترتيب", "required": "مطلوب", "reset_filters": "إعادة تعيين فلتر", "roles": "أدوار", "save_changes": "حفظ التغييرات", "series": "سلسلة", + "settings": "الإعدادات", "sidecars": "Sidecars", "tags": "التصنيف", + "ui": "واجهة المستخدم", "unavailable": "غير متوفر", "unlock_all": "فتح الكل", "url": "عنوان URL", @@ -271,10 +302,11 @@ "comicrack_preambule_html": "يمكنك استيراد قوائم قراءة ComicRack الحالية بتنسيق cbl.
سيحاول Komga مطابقة السلسلة ورقم الكتاب المقدمين مع السلسلة والكتب في مكتباتك.", "dialog_confirmation": { "body": "{unmatched} / {total} الكتب غير متطابقة", + "body2": "{duplicates} / {total} كتاب مكرر", "create": "الخلق على أي حال", "title": "بعض الكتب لا تتطابق" }, - "field_file_label": "ComicRack Reading List (.cbl)", + "field_file_label": "قائمة قراءة ComicRack (من نوع cbl.)", "field_files_label": "قوائم القراءة ComicRack (.cbl)", "import_read_lists": "استيراد قوائم القراءة", "imported_as": "مستورد كـ {name}", @@ -286,6 +318,14 @@ "tab_title": "استيراد البيانات" }, "dialog": { + "add_api_key": { + "button_confirm": "توليد", + "context": "يمكن استعمال مفاتيح الAPI للتوثيق عبر بروتوكول Kobo Sync.", + "dialog_title": "توليد مفتاح API جديد", + "field_comment": "تعليق", + "field_comment_hint": "ما الغرض من مفتاح الAPI هذا؟", + "info_copy": "يرجى التأكد من نسخ مفتاح الAPI الآن. لا يستطاع النظر عليه مجددا!" + }, "add_to_collection": { "button_create": "خلق", "card_collection_subtitle": "لا توجد سلسلة | 1 سلسلة | {count} سلسلة", @@ -319,6 +359,12 @@ "filter": "مصنف حسب رقم الكتاب أو العنوان أو تاريخ الإصدار", "title": "حدد كتاب" }, + "delete_apikey": { + "button_confirm": "حذف", + "confirm_delete": "فهمت, حذف مفتاح الAPI المسمى {name}", + "dialog_title": "حذف مفتاح الAPI", + "warning_html": "كل التطبيقات التي تستعمل مفتاح الAPI هذا ستصبح غير قادرة على الوصول إلى الAPI التابع لKomga. لا يمكن التراجع عن هذا الإجراء." + }, "delete_book": { "button_confirm": "حذف", "confirm_delete": "نعم، حذف كتاب \"{name}\" وملفاته", @@ -389,6 +435,8 @@ "field_summary": "ملخص", "field_tags": "التصنيف", "field_title": "العنوان", + "number_sort_decrement": "تقليل الجميع ب1", + "number_sort_increment": "زيادة الجميع ب1", "tab_authors": "المؤلفون", "tab_general": "إعدادات عامة", "tab_links": "الروابط", @@ -415,6 +463,7 @@ "dialot_title_edit": "تحرير المكتبة", "field_analysis_analyze_dimensions": "تحليل أبعاد الصفحات", "field_analysis_hash_files": "حساب تجزئة للملفات", + "field_analysis_hash_koreader": "حسابة التلبيد لملفات KOReader", "field_analysis_hash_pages": "حساب تجزئة الصفحات", "field_convert_to_cbz": "تحويل تلقائيا إلى CBZ", "field_import_barcode_isbn": "الباركود ردمك", @@ -422,15 +471,19 @@ "field_import_comicinfo_collections": "المجموعات", "field_import_comicinfo_readlists": "قوائم القراءة", "field_import_comicinfo_series": "سلسلة البيانات الوصفية", + "field_import_comicinfo_series_append_volume": "إضافة المجلد إلى عنوان المسلسل", "field_import_epub_book": "البيانات الوصفية للكتاب", "field_import_epub_series": "سلسلة البيانات الوصفية", "field_import_local_artwork": "الأعمال الفنية المحلية", "field_import_mylar_series": "سلسلة البيانات الوصفية", "field_name": "الاسم", + "field_oneshotsdirectory": "‬موقع القصص المنفردة", "field_repair_extensions": "إصلاح ملحقات الملفات غير الصحيحة تلقائيًا", "field_root_folder": "المجلد الرئيسي", + "field_scan_interval": "تكرار البحث عن الملفات", "field_scanner_empty_trash_after_scan": "تفريغ المهملات تلقائيا بعد كل فحص", "field_scanner_force_directory_modified_time": "فرض وقت تعديل الدليل", + "field_scanner_scan_startup": "البحث عن الملفات عند بدء البرنامج", "field_series_cover": "غلاف السلسلة", "file_browser_dialog_button_confirm": "إختيار", "file_browser_dialog_title": "المجلد الجذر للمكتبة", @@ -441,11 +494,14 @@ "label_import_epub": "استيراد البيانات الوصفية من ملفات EPUB", "label_import_local": "استيراد أصول الوسائط المحلية", "label_import_mylar": "استيراد البيانات الوصفية التي تم إنشاؤها بواسطة Mylar", + "label_scan_directory_exclusions": "استبعاد المواقع", + "label_scan_types": "البحث عن أنواع الملفات هذه", "label_scanner": "الماسح الضوئي", "label_series_cover": "غلاف السلسلة", "tab_general": "إعدادات عامة", "tab_metadata": "البيانات الوصفية", "tab_options": "الخيارات", + "tooltip_oneshotsdirectory": "يترك فارغا للتعطيل", "tooltip_scanner_force_modified_time": "تمكين إذا كانت المكتبة على Google Drive", "tooltip_use_resources": "يمكن أن تستهلك الكثير من الموارد في مكتبات كبيرة أو أجهزة بطيئة" }, @@ -453,11 +509,16 @@ "button_cancel": "إلغاء", "button_confirm": "حفظ التغييرات", "dialog_title": "تحرير قائمة القراءة", + "field_manual_ordering": "ترتيب يدوي", "field_name": "الاسم", "field_summary": "ملخص", "tab_general": "عام", "tab_poster": "ملصق" }, + "edit_recommended": { + "button_confirm": "حفظ التعديلات", + "button_reset": "الإعادة إلى التعديلات الأصلية" + }, "edit_series": { "button_cancel": "إلغاء", "button_confirm": "حفظ التغييرات", @@ -483,6 +544,7 @@ "tab_poster": "ملصق", "tab_sharing": "مشاركة", "tab_tags": "التصنيف", + "tab_titles": "العناوين البديلة", "tags_notice_multiple_edit": "أنت تقوم بتحرير العلامات لسلسلة متعددة. سيؤدي هذا إلى تجاوز العلامات الموجودة في كل سلسلة." }, "edit_user": { @@ -525,6 +587,9 @@ }, "title": "اسم الوجهة" }, + "force_kobo_sync": { + "dialog_title": "إجبار مزامنة Kobo" + }, "password_change": { "button_cancel": "إلغاء", "button_confirm": "تغيير كلمة السر", @@ -541,6 +606,7 @@ }, "series_picker": { "label_search_series": "سلسلة البحث", + "no_results": "لم يتم العثور على أي سلسلة", "title": "اختيار سلسلة" }, "server_stop": { @@ -579,21 +645,31 @@ } }, "duplicate_pages": { + "action_auto_delete_remaining": "باق إلغاء {count} أوتوماتيكيا", "action_delete_auto": "حذف تلقائي", "action_delete_manual": "حذف يدوي", "action_delete_matches": "حذف المطابقات", "action_ignore": "تجاهل", + "action_ignore_remaining": "تجاهل الباقي ({count})", + "action_manual_delete_remaining": "إلغاء الباقي يدويا ({count})", "delete_to_save": "حذف لحفظ {size}", "deleted_count": "تم حذف {count} مرة", + "empty_title": "لم يتم العثور على صفحات مكررة", + "empty_title_known": "لا توجد نسخ مكررة معروف عنها", "filter": { "count": "عدد", + "date_added": "تاريخ الإضافة", + "date_modified": "تاريخ التعديل", "delete_count": "عدد الحذف", "delete_size": "المساحة المحفوظة", + "match_count": "عدد النتائج المتطابقة", "size": "حجم", "total_size": "الحجم الإجمالي" }, "info": "حذف الصفحات المكررة سيغيّر ملفاتك. احتفظ بنسخة احتياطية من ملفاتك واستخدم الحذف اليدوي قبل استخدام الحذف التلقائي.", + "known": "المعروفة", "matches_n": "لا يوجد تطابق | 1 تطابق | {count} التطابق", + "new": "الجديدة", "saved_size": "حُفظ {size}", "title": "صفحات مكررة", "unknown_size": "حجم مجهول" @@ -609,6 +685,23 @@ "HARDLINK": "ملفات الروابط الثابتة/النسخ", "MOVE": "نقل الملفات" }, + "epubreader": { + "appearances": { + "day": "النهار", + "night": "الليل", + "sepia": "سيبيا" + }, + "column_count": { + "auto": "أوتوماتيكي", + "one": "واحد", + "two": "اثنان" + }, + "reading_direction": { + "auto": "أوتوماتيكي", + "ltr": "من اليسار إلى اليمين", + "rtl": "من اليمين إلى اليسار" + } + }, "historical_event_type": { "BookConverted": "تمّ تحويل الكتاب", "BookFileDeleted": "تمّ مسح ملف الكتاب", @@ -616,6 +709,11 @@ "DuplicatePageDeleted": "تمّ حذف الصفحة المكررة", "SeriesFolderDeleted": "تمّ حذف مجلد السلسلة" }, + "media_profile": { + "DIVINA": "DIVINA", + "EPUB": "EPUB", + "PDF": "PDF" + }, "media_status": { "ERROR": "خطأ", "OUTDATED": "قديمه", @@ -634,6 +732,14 @@ "VERTICAL": "عمودي", "WEBTOON": "ويبتون" }, + "scan_interval": { + "DAILY": "يوميا", + "DISABLED": "معطل", + "EVERY_12H": "كل 12 ساعة", + "EVERY_6H": "كل 6 ساعات", + "HOURLY": "كل ساعة", + "WEEKLY": "كل أسبوع" + }, "series_cover": { "FIRST": "أول", "LAST": "أخير" @@ -645,6 +751,34 @@ "ONGOING": "مستمر" } }, + "epubreader": { + "current_chapter": "الفصل الحالي", + "page_of": "الصفحة {page} من {count}", + "publisher_font": "الناشر", + "settings": { + "column_count": "عدد أعمدة", + "font_family": "الخط", + "layout": "تخطيط", + "layout_scroll": "تمرير", + "navigation_mode": "وضع التنقل", + "navigation_options": { + "both": "كلاهما", + "buttons": "أزرار", + "click": "نقر/ضغط" + }, + "page_margins": "هوامش الصفحة" + }, + "shortcuts": { + "cycle_pagination": "تغيير عدد الأعمدة", + "font_size_decrease": "تصغير الخط", + "font_size_increase": "تكبير الخط", + "menus": "القائمات", + "next": "أمام", + "previous": "خلف", + "settings": "الإعدادات", + "show_hide_toc": "إظهار/إخفاء الفهرس" + } + }, "error_codes": { "ERR_1000": "تعذر الوصول إلى الملف أثناء التحليل", "ERR_1001": "نوع الوسائط غير مدعوم", @@ -667,11 +801,13 @@ "filter": { "age_rating": "التصنيف العمري", "age_rating_none": "لا شيء", + "any": "أي", "complete": "اكتمل", "genre": "نوع", "in_progress": "قيد التقدم", "language": "اللغة", "library": "المكتبة", + "oneshot": "قصة منفردة", "publisher": "الناشر", "read": "اقرأ", "release_date": "تاريخ الاصدار", @@ -699,6 +835,8 @@ }, "library_navigation": { "browse": "تصفّح", + "browse_books": "كتب", + "browse_series": "سلسلات", "collections": "المجموعات", "readlists": "قوائم القراءة", "recommended": "موصى به" @@ -730,6 +868,7 @@ "empty_trash": "إفراغ سلة المهملات", "mark_read": "تحديد كمقروء", "mark_unread": "تحديد كغير مقروء", + "pin": "تثبيت", "refresh_metadata": "تحديث البيانات الوصفية", "scan_library_files": "فحص ملفات المكتبة", "select_all": "تحديد الكل" @@ -745,6 +884,9 @@ "libraries": "المكتبات", "logout": "تسجيل الخروج" }, + "no_libraries_pinned": { + "title": "لا مكتبات مثبتة" + }, "page_not_found": { "go_back_to_home_page": "العودة إلى الصفحة الرئيسية", "page_does_not_exist": "الصفحة التي تبحث عنها غير موجودة.", @@ -754,6 +896,12 @@ "less": "أقرأ أقل", "more": "اقرأ أكثر" }, + "readlist_import": { + "row": { + "duplicate_book": "كتاب مكرر", + "error_choose_book": "اختيار كتاب" + } + }, "readlists_expansion_panel": { "manage_readlist": "إدارة قائمة القراءة", "title": "{name} قائمة القراءة" @@ -775,12 +923,21 @@ "button_empty_trash": "إفراغ سلة المهملات لكل المكتبات", "button_scan_libraries": "مسح جميع المكتبات", "button_shutdown": "إيقاف التشغيل", + "download_log": "تحميل ملف السجل", "notification_tasks_cancelled": "لا يوجد مهام لإلغائها | تمّ إلغاء 1 مهمة | تمّ إلغاء {count} مهمة", "section_title": "إدارة الخادم" }, - "tab_title": "خادم" + "tab_title": "خادم", + "updates": "تحديثات" }, "server_settings": { + "dialog_regenerate_thumbnails": { + "btn_alternate": "نعم، جميع الكتب", + "btn_cancel": "لا", + "btn_confirm": "نعم، لكن فقط إن كانت اكبر" + }, + "label_kobo_port": "باب مزامنة Kobo الخارجي", + "label_server_port": "باب الخادم", "server_settings": "إعدادات الخادم" }, "settings_user": { @@ -795,12 +952,15 @@ "sort": { "books_count": "عدد الكتب", "date_added": "تاريخ الإضافة", + "date_read": "تاريخ القراءة", "date_updated": "تاريخ التحديث", "file_name": "اسم الملف", "file_size": "حجم الملف", "folder_name": "اسم المجلد", "name": "الاسم", "number": "رقم", + "page_count": "عدد الصفحات", + "random": "عشوائي", "release_date": "تاريخ الإصدار" }, "theme": { @@ -818,16 +978,36 @@ "tooltip_too_big": "الملف كبير جدًا!", "tooltip_user_uploaded": "تمّ الرفع بواسطة المستخدم" }, + "titles_more": { + "less": "عناوين أقل", + "more": "عناوين أكثر" + }, + "ui_settings": { + "general": "عام", + "section_oauth2": "OAuth2", + "series_groups": { + "alpha": "ابجدي", + "japanese": "غوجون (ياباني)" + } + }, + "updates": { + "available": "توجد تحديثات" + }, "user_roles": { "ADMIN": "مدير", "FILE_DOWNLOAD": "تحميل الملف", - "PAGE_STREAMING": "صفحات البث", + "KOBO_SYNC": "مزامنة Kobo", + "KOREADER_SYNC": "مزامنة KOReader", + "PAGE_STREAMING": "بث الصفحات", "USER": "مستخدم" }, "users": { + "api_keys": "مفاتيح الAPI", "users": "المستخدمين" }, "validation": { + "one_or_more": "يجب أن يكون 1 أو أكثر", + "tcp_port": "يجب أن يكون بين 1 و 65535", "zero_or_more": "يجب أن يكون 0 أو أكثر" }, "welcome": { From 0f69a3a4cb3a13a39ee927ddbc92fd8bb08558f7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:51:20 +0100 Subject: [PATCH 022/114] i18n(komga-tray): translated using Weblate (Galician) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (9 of 9 strings) Co-authored-by: Francisco José Aquino García Translate-URL: https://hosted.weblate.org/projects/komga/desktop/gl/ Translation: komga/desktop --- .../resources/org/gotson/komga/messages_gl.properties | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/komga-tray/src/main/resources/org/gotson/komga/messages_gl.properties b/komga-tray/src/main/resources/org/gotson/komga/messages_gl.properties index e69de29b..906ef913 100644 --- a/komga-tray/src/main/resources/org/gotson/komga/messages_gl.properties +++ b/komga-tray/src/main/resources/org/gotson/komga/messages_gl.properties @@ -0,0 +1,9 @@ +dialog_error.close=Pechar +dialog_error.copy_clipboard=Copiar ao portapapeis +dialog_error.title=Komga fallou ao iniciar +error_message.port_in_use=O porto {} está en uso.\nÉ probable que Komga xa esté a executarse.\nBusca a icona de Komga na bandexa de sistema ou a barra de menú. +error_message.unexpected=Aconteceu un erro imprevisto. +menu.open_komga=Abrir Komga +menu.quit=Saír de Komga +menu.show_conf_dir=Abrir o cartafol de configuración +menu.show_log=Amosar o ficheiro de rexistro From 8f8d20a324be8ed4d4cbc674f93b4e92dbd3cd32 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:51:21 +0100 Subject: [PATCH 023/114] i18n(komga-tray): translated using Weblate (Russian) Currently translated at 77.7% (7 of 9 strings) Co-authored-by: Aleksey Co-authored-by: Hosted Weblate Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ru/ Translation: komga/desktop --- .../main/resources/org/gotson/komga/messages_ru.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/komga-tray/src/main/resources/org/gotson/komga/messages_ru.properties b/komga-tray/src/main/resources/org/gotson/komga/messages_ru.properties index aea1b375..9c795425 100644 --- a/komga-tray/src/main/resources/org/gotson/komga/messages_ru.properties +++ b/komga-tray/src/main/resources/org/gotson/komga/messages_ru.properties @@ -1,7 +1,7 @@ dialog_error.close=Закрыть dialog_error.copy_clipboard=Скопировать в буфер обмена -dialog_error.title=Komga не смог запуститься -error_message.port_in_use=Порт {] уже используется.\nKomga возможно уже работает.\nПроверьте панель задач или меню на наличие иконки Komga. +dialog_error.title=Komga не удалось запустить +error_message.port_in_use=Порт {} уже используется.\nВероятно, Komga уже запущен.\nПроверьте область уведомлений или панель меню на наличие иконки Komga. error_message.unexpected=Произошла непредвиденная ошибка. menu.open_komga=Открыть Komga menu.quit=Закрыть Komga From a5548a5429e6f978dffb1d2a6c6cc3dff740a119 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 14 Nov 2025 10:51:22 +0100 Subject: [PATCH 024/114] i18n(komga-tray): translated using Weblate (Arabic) Currently translated at 100.0% (9 of 9 strings) i18n(komga-tray): translated using Weblate (Arabic) Currently translated at 33.3% (3 of 9 strings) Co-authored-by: Hosted Weblate Co-authored-by: redaloe Co-authored-by: redaloe Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ar/ Translation: komga/desktop --- .../resources/org/gotson/komga/messages_ar.properties | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/komga-tray/src/main/resources/org/gotson/komga/messages_ar.properties b/komga-tray/src/main/resources/org/gotson/komga/messages_ar.properties index e69de29b..ade4a7a4 100644 --- a/komga-tray/src/main/resources/org/gotson/komga/messages_ar.properties +++ b/komga-tray/src/main/resources/org/gotson/komga/messages_ar.properties @@ -0,0 +1,9 @@ +dialog_error.close=إغلاق +dialog_error.copy_clipboard=النسخ إلى الحافظة +dialog_error.title=Komga لم يقدر على البدء +error_message.port_in_use=الباب {} على قيد الاستعمال.\nربما Komga جارٍ بالفعل.\nتحقق أيقونة علبة النظام أو القائمة لأيقونة Komga. +error_message.unexpected=حصل خطأ غير متوقع. +menu.open_komga=فتح Komga +menu.quit=إغلاق Komga +menu.show_conf_dir=فتح موقع الإعدادات +menu.show_log=إظهار ملف السجل From ced89c5c54f515ed77444103252cf196f4be2042 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 03:43:03 +0000 Subject: [PATCH 025/114] chore(release): 1.23.6 [skip ci] --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++++++++++++ gradle.properties | 2 +- komga/docs/openapi.json | 4 ++-- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dfbe54b..b20c461d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,54 @@ +# [1.23.6](https://github.com/gotson/komga/compare/1.23.5...1.23.6) (2025-11-28) +## 🐛 Fixes +**kobo** +- proxy 401 errors on initialization ([3739951](https://github.com/gotson/komga/commits/3739951)) +- prevent double URL encoding when proxying ([ce3ad4c](https://github.com/gotson/komga/commits/ce3ad4c)), closes [#2130](https://github.com/gotson/komga/issues/2130) +- proxy Content-Type headers for kobo ([b925f3e](https://github.com/gotson/komga/commits/b925f3e)), closes [#2074](https://github.com/gotson/komga/issues/2074) + +**unscoped** +- properly decode cover href when generating epub cover ([f8ca936](https://github.com/gotson/komga/commits/f8ca936)), closes [#2118](https://github.com/gotson/komga/issues/2118) + +## 🔄️ Changes +**kobo** +- log error responses ([454c6c7](https://github.com/gotson/komga/commits/454c6c7)) + +## 🛠 Build +**docker** +- use old-releases apt repo ([ba7b826](https://github.com/gotson/komga/commits/ba7b826)) + +**webui** +- update Browserslist db ([727fe39](https://github.com/gotson/komga/commits/727fe39)) + +**unscoped** +- fix svu install ([9a56b30](https://github.com/gotson/komga/commits/9a56b30)) + +## 📝 Documentation +**api** +- fix mediatype ([af66144](https://github.com/gotson/komga/commits/af66144)) + +## 🌐 Translation +**komga-tray** +- translated using Weblate (Arabic) ([a5548a5](https://github.com/gotson/komga/commits/a5548a5)) +- translated using Weblate (Russian) ([8f8d20a](https://github.com/gotson/komga/commits/8f8d20a)) +- translated using Weblate (Galician) ([0f69a3a](https://github.com/gotson/komga/commits/0f69a3a)) + +**webui** +- translated using Weblate (Croatian) ([dde0169](https://github.com/gotson/komga/commits/dde0169)) +- translated using Weblate (Russian) ([a2ed7d3](https://github.com/gotson/komga/commits/a2ed7d3)) +- translated using Weblate (Portuguese (Brazil)) ([475f026](https://github.com/gotson/komga/commits/475f026)) +- translated using Weblate (Thai) ([a03f1bd](https://github.com/gotson/komga/commits/a03f1bd)) + +## ⚙️ Dependencies +**ci** +- bump actions/checkout from 5 to 6 ([f138fe3](https://github.com/gotson/komga/commits/f138fe3)) +- bump mikepenz/action-junit-report from 5 to 6 ([6b07fda](https://github.com/gotson/komga/commits/6b07fda)) +- bump actions/upload-artifact from 4 to 5 ([fe40ede](https://github.com/gotson/komga/commits/fe40ede)) +- bump actions/setup-node from 5 to 6 ([c23f2d3](https://github.com/gotson/komga/commits/c23f2d3)) + +**webui** +- bump node-forge from 1.3.1 to 1.3.2 in /komga-webui ([0f25453](https://github.com/gotson/komga/commits/0f25453)) +- bump js-yaml from 3.14.1 to 3.14.2 in /komga-webui ([cd47fc7](https://github.com/gotson/komga/commits/cd47fc7)) + # [1.23.5](https://github.com/gotson/komga/compare/1.23.4...1.23.5) (2025-10-08) ## 🚀 Features diff --git a/gradle.properties b/gradle.properties index fe655d1b..30b383cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version=1.23.5 +version=1.23.6 org.gradle.jvmargs=-Xmx2G diff --git a/komga/docs/openapi.json b/komga/docs/openapi.json index aab45f67..71e54bec 100644 --- a/komga/docs/openapi.json +++ b/komga/docs/openapi.json @@ -7,7 +7,7 @@ "url": "https://github.com/gotson/komga/blob/master/LICENSE" }, "title": "Komga API", - "version": "1.23.5" + "version": "1.23.6" }, "externalDocs": { "description": "Komga documentation", @@ -4919,7 +4919,7 @@ "operationId": "matchComicRackList", "requestBody": { "content": { - "application/json": { + "multipart/form-data": { "schema": { "type": "object", "properties": { From 361d20df2c06a6f422ddd22039b06ae6891dca8e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 02:46:50 +0000 Subject: [PATCH 026/114] build(webui): update Browserslist db --- komga-webui/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index e036ed76..1f4eb3ad 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -5779,9 +5779,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001752", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz", - "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==", + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", "funding": [ { "type": "opencollective", @@ -24153,9 +24153,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001752", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001752.tgz", - "integrity": "sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==" + "version": "1.0.30001757", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", + "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.4.0", From 7d1c9b8cabbafc2f8209c7ed806d209b1fbca6b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 07:01:37 +0000 Subject: [PATCH 027/114] deps(ci): bump hydraulic-software/conveyor from 20.0 to 21.0 Bumps [hydraulic-software/conveyor](https://github.com/hydraulic-software/conveyor) from 20.0 to 21.0. - [Commits](https://github.com/hydraulic-software/conveyor/compare/v20.0...v21.0) --- updated-dependencies: - dependency-name: hydraulic-software/conveyor dependency-version: '21.0' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 4 ++-- .github/workflows/tests.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5686e390..980ec410 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -167,7 +167,7 @@ jobs: echo $APPLE_PRIVATE_KEY | base64 --decode > ./secret/apple_private_key.p8 - name: Conveyor make copied-site - uses: hydraulic-software/conveyor/actions/build@v20.0 + uses: hydraulic-software/conveyor/actions/build@v21.0 if: inputs.conveyor-copied-site with: command: --cache-limit=2.0 -f conveyor.ci.conf make copied-site -o ./output/site @@ -220,7 +220,7 @@ jobs: build/jreleaser/output.properties - name: Conveyor - publish to Microsoft Store - uses: hydraulic-software/conveyor/actions/build@v20.0 + uses: hydraulic-software/conveyor/actions/build@v21.0 if: inputs.msstore_release with: command: --cache-limit=2.0 -f conveyor.msstore.ci.conf make ms-store-release -o ./output/msstore diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f5ded219..497342aa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -56,7 +56,7 @@ jobs: - name: Conveyor - compute JDK module list if: github.event_name == 'push' && github.repository_owner == 'gotson' && contains(matrix.os, 'ubuntu') - uses: hydraulic-software/conveyor/actions/build@v20.0 + uses: hydraulic-software/conveyor/actions/build@v21.0 with: command: -f conveyor.detect.conf -Kapp.machines=mac.aarch64 make processed-jars signing_key: ${{ secrets.CONVEYOR_SIGNING_KEY }} From 62b4154156d79db46f7ea439bf421f70fe03b3f8 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Thu, 11 Dec 2025 13:23:43 +0800 Subject: [PATCH 028/114] deps(webui): update package name for isbn-verify --- komga-webui/package-lock.json | 23 ++++++++++--------- komga-webui/package.json | 2 +- .../dialogs/BulkEditBooksDialog.vue | 2 +- .../components/dialogs/EditBooksDialog.vue | 2 +- .../components/dialogs/EditOneshotDialog.vue | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/komga-webui/package-lock.json b/komga-webui/package-lock.json index 1f4eb3ad..07a6bd04 100644 --- a/komga-webui/package-lock.json +++ b/komga-webui/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@d-i-t-a/reader": "github:gotson/R2D2BC#fork", - "@saekitominaga/isbn-verify": "^2.0.1", + "@w0s/isbn-verify": "^3.1.2", "axios": "^1.12.0", "chart.js": "^2.9.4", "core-js": "^3.8.3", @@ -2757,11 +2757,6 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, - "node_modules/@saekitominaga/isbn-verify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@saekitominaga/isbn-verify/-/isbn-verify-2.0.1.tgz", - "integrity": "sha512-DD0qC+JOlS8yqSLjOPagPLcNPgkwt5cRwM89+5aaNXUrGvQ4Joh/31s/zV584hkhLt+B3fQG8yLRB9esk+gvvA==" - }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -4405,6 +4400,12 @@ "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", "dev": true }, + "node_modules/@w0s/isbn-verify": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@w0s/isbn-verify/-/isbn-verify-3.1.2.tgz", + "integrity": "sha512-BO+GkoYNCNLkG3Vx31/+vPI/ev9BYBzFI1p7HV1Ll70X10ZVJYF4QXjWMGK3Qb3Sd1oomzeiQYRj+LnFysnKyA==", + "license": "MIT" + }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -21837,11 +21838,6 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, - "@saekitominaga/isbn-verify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@saekitominaga/isbn-verify/-/isbn-verify-2.0.1.tgz", - "integrity": "sha512-DD0qC+JOlS8yqSLjOPagPLcNPgkwt5cRwM89+5aaNXUrGvQ4Joh/31s/zV584hkhLt+B3fQG8yLRB9esk+gvvA==" - }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -23116,6 +23112,11 @@ "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", "dev": true }, + "@w0s/isbn-verify": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@w0s/isbn-verify/-/isbn-verify-3.1.2.tgz", + "integrity": "sha512-BO+GkoYNCNLkG3Vx31/+vPI/ev9BYBzFI1p7HV1Ll70X10ZVJYF4QXjWMGK3Qb3Sd1oomzeiQYRj+LnFysnKyA==" + }, "@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", diff --git a/komga-webui/package.json b/komga-webui/package.json index d98f88ee..746555d0 100644 --- a/komga-webui/package.json +++ b/komga-webui/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@d-i-t-a/reader": "github:gotson/R2D2BC#fork", - "@saekitominaga/isbn-verify": "^2.0.1", + "@w0s/isbn-verify": "^3.1.2", "axios": "^1.12.0", "chart.js": "^2.9.4", "core-js": "^3.8.3", diff --git a/komga-webui/src/components/dialogs/BulkEditBooksDialog.vue b/komga-webui/src/components/dialogs/BulkEditBooksDialog.vue index cee03e8c..4bb5712d 100644 --- a/komga-webui/src/components/dialogs/BulkEditBooksDialog.vue +++ b/komga-webui/src/components/dialogs/BulkEditBooksDialog.vue @@ -200,7 +200,7 @@