Compare commits

..

26 commits

Author SHA1 Message Date
github-actions[bot]
361d20df2c build(webui): update Browserslist db 2025-12-01 11:23:06 +08:00
github-actions
ced89c5c54 chore(release): 1.23.6 [skip ci] 2025-11-28 03:43:03 +00:00
Hosted Weblate
a5548a5429 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 <hosted@weblate.org>
Co-authored-by: redaloe <farahks@proton.me>
Co-authored-by: redaloe <redaloe@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ar/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
8f8d20a324 i18n(komga-tray): translated using Weblate (Russian)
Currently translated at 77.7% (7 of 9 strings)

Co-authored-by: Aleksey <mitin_aleksey@mail.ru>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/ru/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
0f69a3a4cb i18n(komga-tray): translated using Weblate (Galician)
Currently translated at 100.0% (9 of 9 strings)

Co-authored-by: Francisco José Aquino García <fj.aquino@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/komga/desktop/gl/
Translation: komga/desktop
2025-11-28 11:11:17 +08:00
Hosted Weblate
9d10ed31a7 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 <hosted@weblate.org>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: redaloe <redaloe@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ar/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
dde0169f2a i18n(webui): translated using Weblate (Croatian)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/hr/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
a2ed7d319d 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 <mitin_aleksey@mail.ru>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/ru/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
475f026749 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 <hosted@weblate.org>
Co-authored-by: Luiz Henrique Moreira de Souza <cloud.5623tumacacori@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/pt_BR/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
a03f1bdf7b i18n(webui): translated using Weblate (Thai)
Currently translated at 100.0% (840 of 840 strings)

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: altinat <al@altqx.com>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/th/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Hosted Weblate
b43046fbeb chore: update translation files
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 <fj.aquino@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/komga/webui/
Translate-URL: https://hosted.weblate.org/projects/komga/webui/gl/
Translation: komga/webui
2025-11-28 11:10:47 +08:00
Jason
3739951b36
fix(kobo): proxy 401 errors on initialization
Co-authored-by: Gauthier Roebroeck <gauthier.roebroeck@gmail.com>
2025-11-28 11:10:01 +08:00
dependabot[bot]
0f25453949 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] <support@github.com>
2025-11-27 11:02:30 +08:00
dependabot[bot]
cd47fc777a 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] <support@github.com>
2025-11-24 16:07:21 +08:00
dependabot[bot]
f138fe31e7 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] <support@github.com>
2025-11-24 15:39:11 +08:00
Jason
454c6c7202
refactor(kobo): log error responses 2025-11-13 13:32:16 +08:00
Jason
ce3ad4c1c7
fix(kobo): prevent double URL encoding when proxying
Closes: #2130
2025-11-11 15:52:32 +08:00
Jason
b925f3e19d
fix(kobo): proxy Content-Type headers for kobo
Closes: #2074
2025-11-10 15:26:07 +08:00
Gauthier Roebroeck
9a56b30b6c ci: fix svu install 2025-11-03 16:00:14 +08:00
dependabot[bot]
6b07fda273 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] <support@github.com>
2025-11-03 15:12:21 +08:00
github-actions[bot]
727fe39e6d build(webui): update Browserslist db 2025-11-03 10:39:12 +08:00
Gauthier Roebroeck
f8ca936ee7 fix: properly decode cover href when generating epub cover
Closes: #2118
2025-11-03 10:38:43 +08:00
dependabot[bot]
fe40ede34a 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] <support@github.com>
2025-10-28 10:46:45 +08:00
dependabot[bot]
c23f2d3810 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] <support@github.com>
2025-10-20 15:51:56 +08:00
Gauthier Roebroeck
af66144060 docs(api): fix mediatype 2025-10-14 14:00:34 +08:00
Gauthier Roebroeck
ba7b82631f build(docker): use old-releases apt repo 2025-10-08 16:42:12 +08:00
21 changed files with 1503 additions and 229 deletions

View file

@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Configure git - name: Configure git

View file

@ -43,14 +43,14 @@ jobs:
version_next: ${{ steps.versions.outputs.version_next }} version_next: ${{ steps.versions.outputs.version_next }}
should_release: ${{ steps.versions.outputs.should_release }} should_release: ${{ steps.versions.outputs.should_release }}
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Set up Homebrew - name: Set up Homebrew
id: set-up-homebrew id: set-up-homebrew
uses: Homebrew/actions/setup-homebrew@master uses: Homebrew/actions/setup-homebrew@master
- name: Install svu - name: Install svu
run: brew install caarlos0/tap/svu run: brew install --cask caarlos0/tap/svu
- name: Compute next version for release - name: Compute next version for release
run: | run: |
echo "VERSION_NEXT=`svu ${{ inputs.bump }}`" | tee -a $GITHUB_ENV echo "VERSION_NEXT=`svu ${{ inputs.bump }}`" | tee -a $GITHUB_ENV
@ -72,7 +72,7 @@ jobs:
sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY" sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- uses: actions/checkout@v5 - uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
@ -84,7 +84,7 @@ jobs:
if: needs.version.outputs.should_release #only redo if the version changed 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 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: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'npm' cache: 'npm'
@ -143,7 +143,7 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Changelog output - name: JReleaser Changelog output
if: always() && needs.version.outputs.should_release if: always() && needs.version.outputs.should_release
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: jreleaser-changelog name: jreleaser-changelog
path: | path: |
@ -182,7 +182,7 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log - name: Upload Conveyor log
if: always() && inputs.conveyor-copied-site if: always() && inputs.conveyor-copied-site
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: conveyor-make-copied-site name: conveyor-make-copied-site
path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt
@ -194,7 +194,7 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Release output - name: JReleaser Release output
if: always() && inputs.github_release if: always() && inputs.github_release
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: jreleaser-release name: jreleaser-release
path: | path: |
@ -212,7 +212,7 @@ jobs:
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: JReleaser Publish output - name: JReleaser Publish output
if: always() && inputs.docker_release if: always() && inputs.docker_release
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: jreleaser-publish name: jreleaser-publish
path: | path: |
@ -236,7 +236,7 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.B2_SECRET_ACCESS_KEY }}
- name: Upload Conveyor log - name: Upload Conveyor log
if: always() && inputs.msstore_release if: always() && inputs.msstore_release
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: conveyor-ms-store-release name: conveyor-ms-store-release
path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt path: ~/.cache/hydraulic/conveyor/logs/log.latest.txt

View file

@ -19,7 +19,7 @@ jobs:
fail-fast: false fail-fast: false
name: Test server - ${{ matrix.os }} name: Test server - ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Setup Java 21 - name: Setup Java 21
uses: actions/setup-java@v5 uses: actions/setup-java@v5
with: with:
@ -35,20 +35,20 @@ jobs:
- name: Upload Unit Test Results - name: Upload Unit Test Results
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: test-results-${{ matrix.os }} name: test-results-${{ matrix.os }}
path: komga/build/test-results/ path: komga/build/test-results/
- name: Upload Unit Test Reports - name: Upload Unit Test Reports
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: test-reports-${{ matrix.os }} name: test-reports-${{ matrix.os }}
path: komga/build/reports/tests/ path: komga/build/reports/tests/
- name: Publish Test Report - name: Publish Test Report
uses: mikepenz/action-junit-report@v5 uses: mikepenz/action-junit-report@v6
if: always() if: always()
with: with:
report_paths: '**/build/test-results/test/TEST-*.xml' report_paths: '**/build/test-results/test/TEST-*.xml'
@ -69,7 +69,7 @@ jobs:
- name: Upload JDK required modules - name: Upload JDK required modules
if: steps.conveyor_compare.outcome == 'failure' if: steps.conveyor_compare.outcome == 'failure'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: conveyor-required-jdk-modules name: conveyor-required-jdk-modules
path: ./output/required-jdk-modules.txt path: ./output/required-jdk-modules.txt
@ -78,8 +78,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Test webui builds name: Test webui builds
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- uses: actions/setup-node@v5 - uses: actions/setup-node@v6
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
cache: 'npm' cache: 'npm'

View file

@ -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) # [1.23.5](https://github.com/gotson/komga/compare/1.23.4...1.23.5) (2025-10-08)
## 🚀 Features ## 🚀 Features

View file

@ -1,2 +1,2 @@
version=1.23.5 version=1.23.6
org.gradle.jvmargs=-Xmx2G org.gradle.jvmargs=-Xmx2G

View file

@ -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=إظهار ملف السجل

View file

@ -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

View file

@ -1,7 +1,7 @@
dialog_error.close=Закрыть dialog_error.close=Закрыть
dialog_error.copy_clipboard=Скопировать в буфер обмена dialog_error.copy_clipboard=Скопировать в буфер обмена
dialog_error.title=Komga не смог запуститься dialog_error.title=Komga не удалось запустить
error_message.port_in_use=Порт {] уже используется.\nKomga возможно уже работает.\nПроверьте панель задач или меню на наличие иконки Komga. error_message.port_in_use=Порт {} уже используется.\nВероятно, Komga уже запущен.\nПроверьте область уведомлений или панель меню на наличие иконки Komga.
error_message.unexpected=Произошла непредвиденная ошибка. error_message.unexpected=Произошла непредвиденная ошибка.
menu.open_komga=Открыть Komga menu.open_komga=Открыть Komga
menu.quit=Закрыть Komga menu.quit=Закрыть Komga

View file

@ -5779,9 +5779,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001746", "version": "1.0.30001757",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
"integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -13026,9 +13026,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
"version": "3.14.1", "version": "3.14.2",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
@ -14161,9 +14161,9 @@
} }
}, },
"node_modules/node-forge": { "node_modules/node-forge": {
"version": "1.3.1", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">= 6.13.0" "node": ">= 6.13.0"
@ -24153,9 +24153,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001746", "version": "1.0.30001757",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
"integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==" "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ=="
}, },
"case-sensitive-paths-webpack-plugin": { "case-sensitive-paths-webpack-plugin": {
"version": "2.4.0", "version": "2.4.0",
@ -29505,9 +29505,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
}, },
"js-yaml": { "js-yaml": {
"version": "3.14.1", "version": "3.14.2",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
"dev": true, "dev": true,
"requires": { "requires": {
"argparse": "^1.0.7", "argparse": "^1.0.7",
@ -30398,9 +30398,9 @@
} }
}, },
"node-forge": { "node-forge": {
"version": "1.3.1", "version": "1.3.2",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz",
"integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==",
"dev": true "dev": true
}, },
"node-int64": { "node-int64": {

View file

@ -19,7 +19,15 @@
}, },
"account_settings": { "account_settings": {
"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": { "announcements": {
"mark_all_read": "اشر عليها بانها قرأت", "mark_all_read": "اشر عليها بانها قرأت",
@ -27,6 +35,7 @@
"tab_title": "إعلانات" "tab_title": "إعلانات"
}, },
"authentication_activity": { "authentication_activity": {
"api_key": "مفتاح API",
"datetime": "التاريخ والوقت", "datetime": "التاريخ والوقت",
"email": "البريد الإلكتروني", "email": "البريد الإلكتروني",
"error": "خطأ", "error": "خطأ",
@ -85,7 +94,8 @@
"bookreader": { "bookreader": {
"beginning_of_book": "أنت في بداية الكتاب.", "beginning_of_book": "أنت في بداية الكتاب.",
"changing_reading_direction": "تغيير اتجاه القراءة إلى", "changing_reading_direction": "تغيير اتجاه القراءة إلى",
"cycling_page_layout": "تخطيط دوري للصفحة", "cycling_page_layout": "تغيير تخطيط الصفحة",
"cycling_page_margin": "تغيير هامش الصفحة",
"cycling_scale": "تغيير حجم التحرير", "cycling_scale": "تغيير حجم التحرير",
"cycling_side_padding": "تغيير الحدود الجانبية", "cycling_side_padding": "تغيير الحدود الجانبية",
"download_current_page": "تنزيل الصفحة الحالية", "download_current_page": "تنزيل الصفحة الحالية",
@ -128,6 +138,7 @@
"general": "إعدادات عامة", "general": "إعدادات عامة",
"gestures": "الإيماءات", "gestures": "الإيماءات",
"page_layout": "تخطيط الصفحة", "page_layout": "تخطيط الصفحة",
"page_margin": "هامش الصفحة",
"paged": "خيارات القارئ المرقم", "paged": "خيارات القارئ المرقم",
"reading_mode": "وضع القراءة", "reading_mode": "وضع القراءة",
"scale_type": "نوع القياس", "scale_type": "نوع القياس",
@ -137,8 +148,9 @@
}, },
"shortcuts": { "shortcuts": {
"close": "إغلاق", "close": "إغلاق",
"cycle_page_layout": "دورة تخطيط الصفحة", "cycle_page_layout": "تغيير تخطيط الصفحة",
"cycle_scale": "مقياس الدورة", "cycle_page_margin": "تغيير هامش الصفحة",
"cycle_scale": "تغيير الحجم",
"cycle_side_padding": "تغيير الحدود الجانبية", "cycle_side_padding": "تغيير الحدود الجانبية",
"first_page": "الصفحة الأولى", "first_page": "الصفحة الأولى",
"fullscreen": "إدخال/إنهاء ملء الشاشة", "fullscreen": "إدخال/إنهاء ملء الشاشة",
@ -161,6 +173,8 @@
}, },
"browse_book": { "browse_book": {
"comment": "تعليق", "comment": "تعليق",
"date_created": "صُنِع",
"date_modified": "آخر تعديل",
"download_file": "تحميل الملف", "download_file": "تحميل الملف",
"file": "ملف", "file": "ملف",
"format": "صيغة", "format": "صيغة",
@ -170,6 +184,8 @@
"outdated_tooltip": "تم تغيير ملف هذا الكتاب ، يجب إعادة تحليل هذا الكتاب", "outdated_tooltip": "تم تغيير ملف هذا الكتاب ، يجب إعادة تحليل هذا الكتاب",
"read_book": "قراءة كتاب", "read_book": "قراءة كتاب",
"read_incognito": "قراءة التصفح المتخفي", "read_incognito": "قراءة التصفح المتخفي",
"remove_from_collection": "إزالة الكتاب من المجموعة",
"remove_from_readlist": "إزالة الكتاب من قائمة القراءة",
"size": "حجم" "size": "حجم"
}, },
"browse_collection": { "browse_collection": {
@ -184,6 +200,7 @@
}, },
"browse_series": { "browse_series": {
"earliest_year_from_release_dates": "هذه هي السنة الأولى من تواريخ الإصدار لجميع الكتب في السلسلة", "earliest_year_from_release_dates": "هذه هي السنة الأولى من تواريخ الإصدار لجميع الكتب في السلسلة",
"remove_from_collection": "إزالة السلسلة من المجموعة",
"series_no_summary": "هذه السلسلة لا تحتوي على ملخص ، لذلك اخترنا واحدًا لك!", "series_no_summary": "هذه السلسلة لا تحتوي على ملخص ، لذلك اخترنا واحدًا لك!",
"summary_from_book": "ملخص من الكتاب {number}:" "summary_from_book": "ملخص من الكتاب {number}:"
}, },
@ -194,6 +211,8 @@
"common": { "common": {
"age": "العمر", "age": "العمر",
"all_libraries": "كل المكتبات", "all_libraries": "كل المكتبات",
"all_of": "كل من",
"any_of": "أي من",
"book": "كتاب", "book": "كتاب",
"books": "كتب", "books": "كتب",
"books_n": "لا يوجد كتاب | 1 كتاب | {count} كتب", "books_n": "لا يوجد كتاب | 1 كتاب | {count} كتب",
@ -203,15 +222,19 @@
"choose_image": "اختر صورة", "choose_image": "اختر صورة",
"close": "إغلاق", "close": "إغلاق",
"collections": "المجموعات", "collections": "المجموعات",
"copied": "تم النسخ!",
"create": "صنع", "create": "صنع",
"delete": "حذف", "delete": "حذف",
"discard": "تجاهل", "dimension": "ع:{width}, ط:{height}",
"discard": "تخلص",
"disk_space": "مساحة القرص", "disk_space": "مساحة القرص",
"dismiss": "رفض", "dismiss": "رفض",
"download": "تحميل", "download": "تحميل",
"drag_drop": "أمسك واسحب", "drag_drop": "أمسك واسحب",
"duplicate": "مكرر",
"email": "البريد الإلكتروني", "email": "البريد الإلكتروني",
"epub": "Epub", "epub": "EPUB",
"error": "خطأ",
"filename": "اسم الملف", "filename": "اسم الملف",
"filter_no_matches": "الفلتر النشط ليس له تطابق", "filter_no_matches": "الفلتر النشط ليس له تطابق",
"genre": "نوع", "genre": "نوع",
@ -219,13 +242,17 @@
"go_to_library": "اذهب إلى المكتبة", "go_to_library": "اذهب إلى المكتبة",
"go_to_readlist": "انتقل إلى قائمة القراءة", "go_to_readlist": "انتقل إلى قائمة القراءة",
"go_to_series": "الانتقال إلى السلسلة", "go_to_series": "الانتقال إلى السلسلة",
"i_understand": "فهمت",
"library": "مكتبة", "library": "مكتبة",
"locale_name": "العربية", "locale_name": "العربية",
"locale_rtl": "true", "locale_rtl": "true",
"lock_all": "قفل الكل", "lock_all": "قفل الكل",
"media": "الوسائط",
"more": "المزيد",
"n_selected": "{count} مختار", "n_selected": "{count} مختار",
"nothing_to_show": "لا شيء للعرض", "nothing_to_show": "لا شيء للعرض",
"oneshot": "طلقة واحدة", "ok": "حسنا",
"oneshot": "قصة منفردة",
"outdated": "متقادمة", "outdated": "متقادمة",
"page": "صفحة", "page": "صفحة",
"page_number": "رقم الصفحة", "page_number": "رقم الصفحة",
@ -235,19 +262,23 @@
"password": "كلمة السر", "password": "كلمة السر",
"pdf": "PDF", "pdf": "PDF",
"pending_tasks": "لا توجد مهام معلقة | مهمة واحدة معلقة | {count} مهام معلقة", "pending_tasks": "لا توجد مهام معلقة | مهمة واحدة معلقة | {count} مهام معلقة",
"pinned_libraries": "المكتبات المثبتة",
"publisher": "الناشر", "publisher": "الناشر",
"read": "اقرأ", "read": "اقرأ",
"read_on": "قرأ في {date}", "read_on": "قرأ في {date}",
"readlist": "قائمة القراءة", "readlist": "قائمة القراءة",
"readlists": "قوائم القراءة", "readlists": "قوائم القراءة",
"remember-me": "تذكرني", "remember-me": "تذكرني",
"reorder": "تغيير الترتيب",
"required": "مطلوب", "required": "مطلوب",
"reset_filters": "إعادة تعيين فلتر", "reset_filters": "إعادة تعيين فلتر",
"roles": "أدوار", "roles": "أدوار",
"save_changes": "حفظ التغييرات", "save_changes": "حفظ التغييرات",
"series": "سلسلة", "series": "سلسلة",
"settings": "الإعدادات",
"sidecars": "Sidecars", "sidecars": "Sidecars",
"tags": "التصنيف", "tags": "التصنيف",
"ui": "واجهة المستخدم",
"unavailable": "غير متوفر", "unavailable": "غير متوفر",
"unlock_all": "فتح الكل", "unlock_all": "فتح الكل",
"url": "عنوان URL", "url": "عنوان URL",
@ -271,10 +302,11 @@
"comicrack_preambule_html": "يمكنك استيراد قوائم قراءة ComicRack الحالية بتنسيق <code>cbl</code>.<br>سيحاول Komga مطابقة السلسلة ورقم الكتاب المقدمين مع السلسلة والكتب في مكتباتك.", "comicrack_preambule_html": "يمكنك استيراد قوائم قراءة ComicRack الحالية بتنسيق <code>cbl</code>.<br>سيحاول Komga مطابقة السلسلة ورقم الكتاب المقدمين مع السلسلة والكتب في مكتباتك.",
"dialog_confirmation": { "dialog_confirmation": {
"body": "{unmatched} / {total} الكتب غير متطابقة", "body": "{unmatched} / {total} الكتب غير متطابقة",
"body2": "{duplicates} / {total} كتاب مكرر",
"create": "الخلق على أي حال", "create": "الخلق على أي حال",
"title": "بعض الكتب لا تتطابق" "title": "بعض الكتب لا تتطابق"
}, },
"field_file_label": "ComicRack Reading List (.cbl)", "field_file_label": "قائمة قراءة ComicRack (من نوع cbl.)",
"field_files_label": "قوائم القراءة ComicRack (.cbl)", "field_files_label": "قوائم القراءة ComicRack (.cbl)",
"import_read_lists": "استيراد قوائم القراءة", "import_read_lists": "استيراد قوائم القراءة",
"imported_as": "مستورد كـ {name}", "imported_as": "مستورد كـ {name}",
@ -286,6 +318,14 @@
"tab_title": "استيراد البيانات" "tab_title": "استيراد البيانات"
}, },
"dialog": { "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": { "add_to_collection": {
"button_create": "خلق", "button_create": "خلق",
"card_collection_subtitle": "لا توجد سلسلة | 1 سلسلة | {count} سلسلة", "card_collection_subtitle": "لا توجد سلسلة | 1 سلسلة | {count} سلسلة",
@ -319,6 +359,12 @@
"filter": "مصنف حسب رقم الكتاب أو العنوان أو تاريخ الإصدار", "filter": "مصنف حسب رقم الكتاب أو العنوان أو تاريخ الإصدار",
"title": "حدد كتاب" "title": "حدد كتاب"
}, },
"delete_apikey": {
"button_confirm": "حذف",
"confirm_delete": "فهمت, حذف مفتاح الAPI المسمى {name}",
"dialog_title": "حذف مفتاح الAPI",
"warning_html": "كل التطبيقات التي تستعمل مفتاح الAPI هذا ستصبح غير قادرة على الوصول إلى الAPI التابع لKomga. لا يمكن التراجع عن هذا الإجراء."
},
"delete_book": { "delete_book": {
"button_confirm": "حذف", "button_confirm": "حذف",
"confirm_delete": "نعم، حذف كتاب \"{name}\" وملفاته", "confirm_delete": "نعم، حذف كتاب \"{name}\" وملفاته",
@ -389,6 +435,8 @@
"field_summary": "ملخص", "field_summary": "ملخص",
"field_tags": "التصنيف", "field_tags": "التصنيف",
"field_title": "العنوان", "field_title": "العنوان",
"number_sort_decrement": "تقليل الجميع ب1",
"number_sort_increment": "زيادة الجميع ب1",
"tab_authors": "المؤلفون", "tab_authors": "المؤلفون",
"tab_general": "إعدادات عامة", "tab_general": "إعدادات عامة",
"tab_links": "الروابط", "tab_links": "الروابط",
@ -415,6 +463,7 @@
"dialot_title_edit": "تحرير المكتبة", "dialot_title_edit": "تحرير المكتبة",
"field_analysis_analyze_dimensions": "تحليل أبعاد الصفحات", "field_analysis_analyze_dimensions": "تحليل أبعاد الصفحات",
"field_analysis_hash_files": "حساب تجزئة للملفات", "field_analysis_hash_files": "حساب تجزئة للملفات",
"field_analysis_hash_koreader": "حسابة التلبيد لملفات KOReader",
"field_analysis_hash_pages": "حساب تجزئة الصفحات", "field_analysis_hash_pages": "حساب تجزئة الصفحات",
"field_convert_to_cbz": "تحويل تلقائيا إلى CBZ", "field_convert_to_cbz": "تحويل تلقائيا إلى CBZ",
"field_import_barcode_isbn": "الباركود ردمك", "field_import_barcode_isbn": "الباركود ردمك",
@ -422,15 +471,19 @@
"field_import_comicinfo_collections": "المجموعات", "field_import_comicinfo_collections": "المجموعات",
"field_import_comicinfo_readlists": "قوائم القراءة", "field_import_comicinfo_readlists": "قوائم القراءة",
"field_import_comicinfo_series": "سلسلة البيانات الوصفية", "field_import_comicinfo_series": "سلسلة البيانات الوصفية",
"field_import_comicinfo_series_append_volume": "إضافة المجلد إلى عنوان المسلسل",
"field_import_epub_book": "البيانات الوصفية للكتاب", "field_import_epub_book": "البيانات الوصفية للكتاب",
"field_import_epub_series": "سلسلة البيانات الوصفية", "field_import_epub_series": "سلسلة البيانات الوصفية",
"field_import_local_artwork": "الأعمال الفنية المحلية", "field_import_local_artwork": "الأعمال الفنية المحلية",
"field_import_mylar_series": "سلسلة البيانات الوصفية", "field_import_mylar_series": "سلسلة البيانات الوصفية",
"field_name": "الاسم", "field_name": "الاسم",
"field_oneshotsdirectory": "‬موقع القصص المنفردة",
"field_repair_extensions": "إصلاح ملحقات الملفات غير الصحيحة تلقائيًا", "field_repair_extensions": "إصلاح ملحقات الملفات غير الصحيحة تلقائيًا",
"field_root_folder": "المجلد الرئيسي", "field_root_folder": "المجلد الرئيسي",
"field_scan_interval": "تكرار البحث عن الملفات",
"field_scanner_empty_trash_after_scan": "تفريغ المهملات تلقائيا بعد كل فحص", "field_scanner_empty_trash_after_scan": "تفريغ المهملات تلقائيا بعد كل فحص",
"field_scanner_force_directory_modified_time": "فرض وقت تعديل الدليل", "field_scanner_force_directory_modified_time": "فرض وقت تعديل الدليل",
"field_scanner_scan_startup": "البحث عن الملفات عند بدء البرنامج",
"field_series_cover": "غلاف السلسلة", "field_series_cover": "غلاف السلسلة",
"file_browser_dialog_button_confirm": "إختيار", "file_browser_dialog_button_confirm": "إختيار",
"file_browser_dialog_title": "المجلد الجذر للمكتبة", "file_browser_dialog_title": "المجلد الجذر للمكتبة",
@ -441,11 +494,14 @@
"label_import_epub": "استيراد البيانات الوصفية من ملفات EPUB", "label_import_epub": "استيراد البيانات الوصفية من ملفات EPUB",
"label_import_local": "استيراد أصول الوسائط المحلية", "label_import_local": "استيراد أصول الوسائط المحلية",
"label_import_mylar": "استيراد البيانات الوصفية التي تم إنشاؤها بواسطة Mylar", "label_import_mylar": "استيراد البيانات الوصفية التي تم إنشاؤها بواسطة Mylar",
"label_scan_directory_exclusions": "استبعاد المواقع",
"label_scan_types": "البحث عن أنواع الملفات هذه",
"label_scanner": "الماسح الضوئي", "label_scanner": "الماسح الضوئي",
"label_series_cover": "غلاف السلسلة", "label_series_cover": "غلاف السلسلة",
"tab_general": "إعدادات عامة", "tab_general": "إعدادات عامة",
"tab_metadata": "البيانات الوصفية", "tab_metadata": "البيانات الوصفية",
"tab_options": "الخيارات", "tab_options": "الخيارات",
"tooltip_oneshotsdirectory": "يترك فارغا للتعطيل",
"tooltip_scanner_force_modified_time": "تمكين إذا كانت المكتبة على Google Drive", "tooltip_scanner_force_modified_time": "تمكين إذا كانت المكتبة على Google Drive",
"tooltip_use_resources": "يمكن أن تستهلك الكثير من الموارد في مكتبات كبيرة أو أجهزة بطيئة" "tooltip_use_resources": "يمكن أن تستهلك الكثير من الموارد في مكتبات كبيرة أو أجهزة بطيئة"
}, },
@ -453,11 +509,16 @@
"button_cancel": "إلغاء", "button_cancel": "إلغاء",
"button_confirm": "حفظ التغييرات", "button_confirm": "حفظ التغييرات",
"dialog_title": "تحرير قائمة القراءة", "dialog_title": "تحرير قائمة القراءة",
"field_manual_ordering": "ترتيب يدوي",
"field_name": "الاسم", "field_name": "الاسم",
"field_summary": "ملخص", "field_summary": "ملخص",
"tab_general": "عام", "tab_general": "عام",
"tab_poster": "ملصق" "tab_poster": "ملصق"
}, },
"edit_recommended": {
"button_confirm": "حفظ التعديلات",
"button_reset": "الإعادة إلى التعديلات الأصلية"
},
"edit_series": { "edit_series": {
"button_cancel": "إلغاء", "button_cancel": "إلغاء",
"button_confirm": "حفظ التغييرات", "button_confirm": "حفظ التغييرات",
@ -483,6 +544,7 @@
"tab_poster": "ملصق", "tab_poster": "ملصق",
"tab_sharing": "مشاركة", "tab_sharing": "مشاركة",
"tab_tags": "التصنيف", "tab_tags": "التصنيف",
"tab_titles": "العناوين البديلة",
"tags_notice_multiple_edit": "أنت تقوم بتحرير العلامات لسلسلة متعددة. سيؤدي هذا إلى تجاوز العلامات الموجودة في كل سلسلة." "tags_notice_multiple_edit": "أنت تقوم بتحرير العلامات لسلسلة متعددة. سيؤدي هذا إلى تجاوز العلامات الموجودة في كل سلسلة."
}, },
"edit_user": { "edit_user": {
@ -525,6 +587,9 @@
}, },
"title": "اسم الوجهة" "title": "اسم الوجهة"
}, },
"force_kobo_sync": {
"dialog_title": "إجبار مزامنة Kobo"
},
"password_change": { "password_change": {
"button_cancel": "إلغاء", "button_cancel": "إلغاء",
"button_confirm": "تغيير كلمة السر", "button_confirm": "تغيير كلمة السر",
@ -541,6 +606,7 @@
}, },
"series_picker": { "series_picker": {
"label_search_series": "سلسلة البحث", "label_search_series": "سلسلة البحث",
"no_results": "لم يتم العثور على أي سلسلة",
"title": "اختيار سلسلة" "title": "اختيار سلسلة"
}, },
"server_stop": { "server_stop": {
@ -579,21 +645,31 @@
} }
}, },
"duplicate_pages": { "duplicate_pages": {
"action_auto_delete_remaining": "باق إلغاء {count} أوتوماتيكيا",
"action_delete_auto": "حذف تلقائي", "action_delete_auto": "حذف تلقائي",
"action_delete_manual": "حذف يدوي", "action_delete_manual": "حذف يدوي",
"action_delete_matches": "حذف المطابقات", "action_delete_matches": "حذف المطابقات",
"action_ignore": "تجاهل", "action_ignore": "تجاهل",
"action_ignore_remaining": "تجاهل الباقي ({count})",
"action_manual_delete_remaining": "إلغاء الباقي يدويا ({count})",
"delete_to_save": "حذف لحفظ {size}", "delete_to_save": "حذف لحفظ {size}",
"deleted_count": "تم حذف {count} مرة", "deleted_count": "تم حذف {count} مرة",
"empty_title": "لم يتم العثور على صفحات مكررة",
"empty_title_known": "لا توجد نسخ مكررة معروف عنها",
"filter": { "filter": {
"count": "عدد", "count": "عدد",
"date_added": "تاريخ الإضافة",
"date_modified": "تاريخ التعديل",
"delete_count": "عدد الحذف", "delete_count": "عدد الحذف",
"delete_size": "المساحة المحفوظة", "delete_size": "المساحة المحفوظة",
"match_count": "عدد النتائج المتطابقة",
"size": "حجم", "size": "حجم",
"total_size": "الحجم الإجمالي" "total_size": "الحجم الإجمالي"
}, },
"info": "حذف الصفحات المكررة سيغيّر ملفاتك. احتفظ بنسخة احتياطية من ملفاتك واستخدم الحذف اليدوي قبل استخدام الحذف التلقائي.", "info": "حذف الصفحات المكررة سيغيّر ملفاتك. احتفظ بنسخة احتياطية من ملفاتك واستخدم الحذف اليدوي قبل استخدام الحذف التلقائي.",
"known": "المعروفة",
"matches_n": "لا يوجد تطابق | 1 تطابق | {count} التطابق", "matches_n": "لا يوجد تطابق | 1 تطابق | {count} التطابق",
"new": "الجديدة",
"saved_size": "حُفظ {size}", "saved_size": "حُفظ {size}",
"title": "صفحات مكررة", "title": "صفحات مكررة",
"unknown_size": "حجم مجهول" "unknown_size": "حجم مجهول"
@ -609,6 +685,23 @@
"HARDLINK": "ملفات الروابط الثابتة/النسخ", "HARDLINK": "ملفات الروابط الثابتة/النسخ",
"MOVE": "نقل الملفات" "MOVE": "نقل الملفات"
}, },
"epubreader": {
"appearances": {
"day": "النهار",
"night": "الليل",
"sepia": "سيبيا"
},
"column_count": {
"auto": "أوتوماتيكي",
"one": "واحد",
"two": "اثنان"
},
"reading_direction": {
"auto": "أوتوماتيكي",
"ltr": "من اليسار إلى اليمين",
"rtl": "من اليمين إلى اليسار"
}
},
"historical_event_type": { "historical_event_type": {
"BookConverted": "تمّ تحويل الكتاب", "BookConverted": "تمّ تحويل الكتاب",
"BookFileDeleted": "تمّ مسح ملف الكتاب", "BookFileDeleted": "تمّ مسح ملف الكتاب",
@ -616,6 +709,11 @@
"DuplicatePageDeleted": "تمّ حذف الصفحة المكررة", "DuplicatePageDeleted": "تمّ حذف الصفحة المكررة",
"SeriesFolderDeleted": "تمّ حذف مجلد السلسلة" "SeriesFolderDeleted": "تمّ حذف مجلد السلسلة"
}, },
"media_profile": {
"DIVINA": "DIVINA",
"EPUB": "EPUB",
"PDF": "PDF"
},
"media_status": { "media_status": {
"ERROR": "خطأ", "ERROR": "خطأ",
"OUTDATED": "قديمه", "OUTDATED": "قديمه",
@ -634,6 +732,14 @@
"VERTICAL": "عمودي", "VERTICAL": "عمودي",
"WEBTOON": "ويبتون" "WEBTOON": "ويبتون"
}, },
"scan_interval": {
"DAILY": "يوميا",
"DISABLED": "معطل",
"EVERY_12H": "كل 12 ساعة",
"EVERY_6H": "كل 6 ساعات",
"HOURLY": "كل ساعة",
"WEEKLY": "كل أسبوع"
},
"series_cover": { "series_cover": {
"FIRST": "أول", "FIRST": "أول",
"LAST": "أخير" "LAST": "أخير"
@ -645,6 +751,34 @@
"ONGOING": "مستمر" "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": { "error_codes": {
"ERR_1000": "تعذر الوصول إلى الملف أثناء التحليل", "ERR_1000": "تعذر الوصول إلى الملف أثناء التحليل",
"ERR_1001": "نوع الوسائط غير مدعوم", "ERR_1001": "نوع الوسائط غير مدعوم",
@ -667,11 +801,13 @@
"filter": { "filter": {
"age_rating": "التصنيف العمري", "age_rating": "التصنيف العمري",
"age_rating_none": "لا شيء", "age_rating_none": "لا شيء",
"any": "أي",
"complete": "اكتمل", "complete": "اكتمل",
"genre": "نوع", "genre": "نوع",
"in_progress": "قيد التقدم", "in_progress": "قيد التقدم",
"language": "اللغة", "language": "اللغة",
"library": "المكتبة", "library": "المكتبة",
"oneshot": "قصة منفردة",
"publisher": "الناشر", "publisher": "الناشر",
"read": "اقرأ", "read": "اقرأ",
"release_date": "تاريخ الاصدار", "release_date": "تاريخ الاصدار",
@ -699,6 +835,8 @@
}, },
"library_navigation": { "library_navigation": {
"browse": "تصفّح", "browse": "تصفّح",
"browse_books": "كتب",
"browse_series": "سلسلات",
"collections": "المجموعات", "collections": "المجموعات",
"readlists": "قوائم القراءة", "readlists": "قوائم القراءة",
"recommended": "موصى به" "recommended": "موصى به"
@ -730,6 +868,7 @@
"empty_trash": "إفراغ سلة المهملات", "empty_trash": "إفراغ سلة المهملات",
"mark_read": "تحديد كمقروء", "mark_read": "تحديد كمقروء",
"mark_unread": "تحديد كغير مقروء", "mark_unread": "تحديد كغير مقروء",
"pin": "تثبيت",
"refresh_metadata": "تحديث البيانات الوصفية", "refresh_metadata": "تحديث البيانات الوصفية",
"scan_library_files": "فحص ملفات المكتبة", "scan_library_files": "فحص ملفات المكتبة",
"select_all": "تحديد الكل" "select_all": "تحديد الكل"
@ -745,6 +884,9 @@
"libraries": "المكتبات", "libraries": "المكتبات",
"logout": "تسجيل الخروج" "logout": "تسجيل الخروج"
}, },
"no_libraries_pinned": {
"title": "لا مكتبات مثبتة"
},
"page_not_found": { "page_not_found": {
"go_back_to_home_page": "العودة إلى الصفحة الرئيسية", "go_back_to_home_page": "العودة إلى الصفحة الرئيسية",
"page_does_not_exist": "الصفحة التي تبحث عنها غير موجودة.", "page_does_not_exist": "الصفحة التي تبحث عنها غير موجودة.",
@ -754,6 +896,12 @@
"less": "أقرأ أقل", "less": "أقرأ أقل",
"more": "اقرأ أكثر" "more": "اقرأ أكثر"
}, },
"readlist_import": {
"row": {
"duplicate_book": "كتاب مكرر",
"error_choose_book": "اختيار كتاب"
}
},
"readlists_expansion_panel": { "readlists_expansion_panel": {
"manage_readlist": "إدارة قائمة القراءة", "manage_readlist": "إدارة قائمة القراءة",
"title": "{name} قائمة القراءة" "title": "{name} قائمة القراءة"
@ -775,12 +923,21 @@
"button_empty_trash": "إفراغ سلة المهملات لكل المكتبات", "button_empty_trash": "إفراغ سلة المهملات لكل المكتبات",
"button_scan_libraries": "مسح جميع المكتبات", "button_scan_libraries": "مسح جميع المكتبات",
"button_shutdown": "إيقاف التشغيل", "button_shutdown": "إيقاف التشغيل",
"download_log": "تحميل ملف السجل",
"notification_tasks_cancelled": "لا يوجد مهام لإلغائها | تمّ إلغاء 1 مهمة | تمّ إلغاء {count} مهمة", "notification_tasks_cancelled": "لا يوجد مهام لإلغائها | تمّ إلغاء 1 مهمة | تمّ إلغاء {count} مهمة",
"section_title": "إدارة الخادم" "section_title": "إدارة الخادم"
}, },
"tab_title": "خادم" "tab_title": "خادم",
"updates": "تحديثات"
}, },
"server_settings": { "server_settings": {
"dialog_regenerate_thumbnails": {
"btn_alternate": "نعم، جميع الكتب",
"btn_cancel": "لا",
"btn_confirm": "نعم، لكن فقط إن كانت اكبر"
},
"label_kobo_port": "باب مزامنة Kobo الخارجي",
"label_server_port": "باب الخادم",
"server_settings": "إعدادات الخادم" "server_settings": "إعدادات الخادم"
}, },
"settings_user": { "settings_user": {
@ -795,12 +952,15 @@
"sort": { "sort": {
"books_count": "عدد الكتب", "books_count": "عدد الكتب",
"date_added": "تاريخ الإضافة", "date_added": "تاريخ الإضافة",
"date_read": "تاريخ القراءة",
"date_updated": "تاريخ التحديث", "date_updated": "تاريخ التحديث",
"file_name": "اسم الملف", "file_name": "اسم الملف",
"file_size": "حجم الملف", "file_size": "حجم الملف",
"folder_name": "اسم المجلد", "folder_name": "اسم المجلد",
"name": "الاسم", "name": "الاسم",
"number": "رقم", "number": "رقم",
"page_count": "عدد الصفحات",
"random": "عشوائي",
"release_date": "تاريخ الإصدار" "release_date": "تاريخ الإصدار"
}, },
"theme": { "theme": {
@ -818,16 +978,36 @@
"tooltip_too_big": "الملف كبير جدًا!", "tooltip_too_big": "الملف كبير جدًا!",
"tooltip_user_uploaded": "تمّ الرفع بواسطة المستخدم" "tooltip_user_uploaded": "تمّ الرفع بواسطة المستخدم"
}, },
"titles_more": {
"less": "عناوين أقل",
"more": "عناوين أكثر"
},
"ui_settings": {
"general": "عام",
"section_oauth2": "OAuth2",
"series_groups": {
"alpha": "ابجدي",
"japanese": "غوجون (ياباني)"
}
},
"updates": {
"available": "توجد تحديثات"
},
"user_roles": { "user_roles": {
"ADMIN": "مدير", "ADMIN": "مدير",
"FILE_DOWNLOAD": "تحميل الملف", "FILE_DOWNLOAD": "تحميل الملف",
"PAGE_STREAMING": "صفحات البث", "KOBO_SYNC": "مزامنة Kobo",
"KOREADER_SYNC": "مزامنة KOReader",
"PAGE_STREAMING": "بث الصفحات",
"USER": "مستخدم" "USER": "مستخدم"
}, },
"users": { "users": {
"api_keys": "مفاتيح الAPI",
"users": "المستخدمين" "users": "المستخدمين"
}, },
"validation": { "validation": {
"one_or_more": "يجب أن يكون 1 أو أكثر",
"tcp_port": "يجب أن يكون بين 1 و 65535",
"zero_or_more": "يجب أن يكون 0 أو أكثر" "zero_or_more": "يجب أن يكون 0 أو أكثر"
}, },
"welcome": { "welcome": {

View file

@ -19,7 +19,15 @@
}, },
"account_settings": { "account_settings": {
"account_settings": "Configuración da conta", "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": { "announcements": {
"mark_all_read": "Marcar todo como lido", "mark_all_read": "Marcar todo como lido",
@ -27,6 +35,7 @@
"tab_title": "Avisos" "tab_title": "Avisos"
}, },
"authentication_activity": { "authentication_activity": {
"api_key": "Clave API",
"datetime": "Data e Hora", "datetime": "Data e Hora",
"email": "Correo electrónico", "email": "Correo electrónico",
"error": "Erro", "error": "Erro",
@ -58,9 +67,159 @@
"button_scan": "Escanear", "button_scan": "Escanear",
"button_select_series": "Escolle a serie", "button_select_series": "Escolle a serie",
"field_import_path": "Importar dende un cartafol", "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": { "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"
} }
} }

View file

@ -46,7 +46,7 @@
}, },
"author_roles": { "author_roles": {
"colorist": "koloristi", "colorist": "koloristi",
"cover": "omot", "cover": "naslovnica",
"editor": "urednici", "editor": "urednici",
"inker": "bojitelj", "inker": "bojitelj",
"letterer": "tipografi", "letterer": "tipografi",
@ -109,7 +109,7 @@
"notification_poster_set_series": "Trenutačna stranica je sada postavljena kao poster serije.", "notification_poster_set_series": "Trenutačna stranica je sada postavljena kao poster serije.",
"paged_reader_layout": { "paged_reader_layout": {
"double": "Dvije stranice", "double": "Dvije stranice",
"double_no_cover": "Dvije stranice (bez omota)", "double_no_cover": "Dvije stranice (bez naslovnice)",
"single": "Jedna stranica" "single": "Jedna stranica"
}, },
"reader_settings": "Postavke čitača", "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_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_force_directory_modified_time": "Pretraži mape na osnovi vremena promjene",
"field_scanner_scan_startup": "Pretraži tijekom pokretanja", "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_button_confirm": "Odaberi",
"file_browser_dialog_title": "Osnovna mapa biblioteke", "file_browser_dialog_title": "Osnovna mapa biblioteke",
"label_analysis": "Analiza", "label_analysis": "Analiza",
@ -497,7 +497,7 @@
"label_scan_directory_exclusions": "Isključivanja mapa", "label_scan_directory_exclusions": "Isključivanja mapa",
"label_scan_types": "Traži ove vrste datoteka", "label_scan_types": "Traži ove vrste datoteka",
"label_scanner": "Tražilica", "label_scanner": "Tražilica",
"label_series_cover": "Omot serije", "label_series_cover": "Naslovnica serije",
"tab_general": "Općenito", "tab_general": "Općenito",
"tab_metadata": "Metapodaci", "tab_metadata": "Metapodaci",
"tab_options": "Opcije", "tab_options": "Opcije",
@ -989,7 +989,7 @@
"btn_confirm": "Da, ali samo ako su veće", "btn_confirm": "Da, ali samo ako su veće",
"title": "Nanovo generiraj minijature" "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_collections": "Izbriši prazne zbirke nakon pretraživanja",
"label_delete_empty_readlists": "Izbriši prazne liste čitanja nakon pretraživanja", "label_delete_empty_readlists": "Izbriši prazne liste čitanja nakon pretraživanja",
"label_kepubify_path": "Staza do kepubify", "label_kepubify_path": "Staza do kepubify",

View file

@ -319,7 +319,12 @@
}, },
"dialog": { "dialog": {
"add_api_key": { "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": { "add_to_collection": {
"button_create": "Criar", "button_create": "Criar",
@ -354,6 +359,12 @@
"filter": "Filtrar por número, título ou data de lançamento", "filter": "Filtrar por número, título ou data de lançamento",
"title": "Selecionar livro" "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": { "delete_book": {
"button_confirm": "Excluir", "button_confirm": "Excluir",
"confirm_delete": "Sim, exclua o livro \"{name}\" e seus arquivos", "confirm_delete": "Sim, exclua o livro \"{name}\" e seus arquivos",
@ -503,6 +514,9 @@
"tab_general": "Geral", "tab_general": "Geral",
"tab_poster": "Pôster" "tab_poster": "Pôster"
}, },
"edit_recommended": {
"button_confirm": "Salvar mudanças"
},
"edit_series": { "edit_series": {
"button_cancel": "Cancelar", "button_cancel": "Cancelar",
"button_confirm": "Salvar mudanças", "button_confirm": "Salvar mudanças",
@ -571,6 +585,9 @@
}, },
"title": "Nome do Arquivo de Destino" "title": "Nome do Arquivo de Destino"
}, },
"force_kobo_sync": {
"dialog_title": "Forçar sincronização com Kobo"
},
"password_change": { "password_change": {
"button_cancel": "Cancelar", "button_cancel": "Cancelar",
"button_confirm": "Mudar senha", "button_confirm": "Mudar senha",
@ -638,6 +655,9 @@
"HARDLINK": "Hardlink/Copiar arquivos", "HARDLINK": "Hardlink/Copiar arquivos",
"MOVE": "Mover Arquivos" "MOVE": "Mover Arquivos"
}, },
"media_profile": {
"PDF": "PDF"
},
"media_status": { "media_status": {
"ERROR": "Erro", "ERROR": "Erro",
"OUTDATED": "Desatualizado", "OUTDATED": "Desatualizado",
@ -664,6 +684,14 @@
"ONGOING": "Em andamento" "ONGOING": "Em andamento"
} }
}, },
"epubreader": {
"settings": {
"page_margins": "Margem de Páginas"
},
"shortcuts": {
"settings": "Configurações"
}
},
"error_codes": { "error_codes": {
"ERR_1000": "O arquivo não pôde ser acessado durante a análise", "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", "ERR_1001": "O tipo de mídia não é compatível",
@ -695,6 +723,7 @@
"in_progress": "Em progresso", "in_progress": "Em progresso",
"language": "idioma", "language": "idioma",
"library": "biblioteca", "library": "biblioteca",
"oneshot": "One-shot",
"publisher": "editora", "publisher": "editora",
"read": "Lidos", "read": "Lidos",
"release_date": "data de lançamento", "release_date": "data de lançamento",
@ -708,7 +737,8 @@
}, },
"history": { "history": {
"header": { "header": {
"book": "Livro" "book": "Livro",
"details": "Detalhes"
} }
}, },
"home": { "home": {
@ -830,6 +860,9 @@
"tooltip_too_big": "Arquivo muito grande!", "tooltip_too_big": "Arquivo muito grande!",
"tooltip_user_uploaded": "Enviado pelo usuário" "tooltip_user_uploaded": "Enviado pelo usuário"
}, },
"ui_settings": {
"general": "Geral"
},
"user_roles": { "user_roles": {
"ADMIN": "Administrador", "ADMIN": "Administrador",
"FILE_DOWNLOAD": "Baixar arquivos", "FILE_DOWNLOAD": "Baixar arquivos",
@ -837,6 +870,7 @@
"USER": "Usuário" "USER": "Usuário"
}, },
"users": { "users": {
"api_keys": "Chaves API",
"authentication_activity": "Atividade de Autenticação", "authentication_activity": "Atividade de Autenticação",
"users": "Usuários" "users": "Usuários"
}, },

View file

@ -4,8 +4,8 @@
"pageText": "{0}-{1} из {2}" "pageText": "{0}-{1} из {2}"
}, },
"dataIterator": { "dataIterator": {
"loadingText": "Загрузка объектов...", "loadingText": "Загрузка элементов...",
"noResultsText": "Подходящих записей не найдено" "noResultsText": "Совпадений не найдено"
}, },
"dataTable": { "dataTable": {
"itemsPerPageText": "Строк на странице:", "itemsPerPageText": "Строк на странице:",
@ -15,30 +15,33 @@
"counter": "Файлов: {0}", "counter": "Файлов: {0}",
"counterSize": "Файлов: {0} (всего {1})" "counterSize": "Файлов: {0} (всего {1})"
}, },
"noDataText": "Отсутствуют данные" "noDataText": "Данные отсутствуют"
}, },
"account_settings": { "account_settings": {
"account_settings": "Настройки Аккаунта", "account_settings": "Настройки аккаунта",
"api_key": { "api_key": {
"created_date": "Дата создания: {date}", "created_date": "Дата создания: {date}",
"generate_api_key": "Сгенерировать API ключ", "force_kobo_sync": "Принудительная синхронизация с Kobo",
"generate_api_key": "Сгенерировать ключ API",
"no_keys": "Ни одного ключа API еще не создано" "no_keys": "Ни одного ключа API еще не создано"
}, },
"change_password": "изменить пароль" "change_password": "изменить пароль",
"details": "Подробности",
"my_account": "Мой аккаунт"
}, },
"announcements": { "announcements": {
"mark_all_read": "Пометить всё как прочитанное", "mark_all_read": "Отметить всё как прочитанное",
"mark_read": "Пометить как прочитанное", "mark_read": "Отметить как прочитанное",
"tab_title": "Объявления" "tab_title": "Объявления"
}, },
"authentication_activity": { "authentication_activity": {
"api_key": "API Ключ", "api_key": "APIлюч",
"datetime": "Дата / Время", "datetime": "Дата/Время",
"email": "Эл. почта", "email": "Эл. почта",
"error": "Ошибка", "error": "Ошибка",
"ip": "IP-адрес", "ip": "IP-адрес",
"source": "Источник", "source": "Источник",
"success": "Статус", "success": "Успех",
"user_agent": "User Agent" "user_agent": "User Agent"
}, },
"author_roles": { "author_roles": {
@ -54,18 +57,18 @@
"book_card": { "book_card": {
"error": "Ошибка", "error": "Ошибка",
"no_release_date": "Дата релиза отсутствует", "no_release_date": "Дата релиза отсутствует",
"unknown": "Необходимо проанализировать", "unknown": "Подлежит анализу",
"unread": "Не прочитано", "unread": "Не прочитано",
"unsupported": "Неподдерживаемый" "unsupported": "Не поддерживается"
}, },
"book_import": { "book_import": {
"button_browse": "Обзор", "button_browse": "Обзор",
"button_import": "Импортировать", "button_import": "Импорт",
"button_scan": "Сканировать", "button_scan": "Сканировать",
"button_select_series": "Выберите Серию", "button_select_series": "Выберите серию",
"field_import_path": "Импортировать из каталога", "field_import_path": "Импортировать из каталога",
"info_part1": "Этот раздел позволяет вам импортировать файлы, которые находятся за пределами ваших существующих библиотек. Вы можете импортировать файлы только в существующие Серии, в этом случае Komga переместит или скопирует файлы в каталог выбранной Серии.", "info_part1": "Этот раздел позволяет вам импортировать файлы, которые находятся за пределами ваших существующих библиотек. Вы можете импортировать файлы только в существующие серии; в этом случае Komga переместит или скопирует файлы в каталог выбранной серии.",
"info_part2": "Если вы выберете номер для книги и книга с таким номером уже существует, то вы сможете сравнить 2 книги. Если вы решите импортировать книгу, Komga обновит существующую книгу, эффективно заменив старый файл новым.", "info_part2": "Если вы укажете номер для книги, и книга с таким номером уже существует, вы сможете сравнить оба варианта. Если вы решите импортировать книгу, Komga обновит существующий вариант, заменив старый файл новым.",
"no_files_found": "Файлы не найдены", "no_files_found": "Файлы не найдены",
"notification": { "notification": {
"go_to_book": "Перейти к книге", "go_to_book": "Перейти к книге",
@ -74,9 +77,9 @@
"source_file": "Исходный файл: {file}" "source_file": "Исходный файл: {file}"
}, },
"row": { "row": {
"error_analyze_first": "Книгу нужно сначала проанализировать", "error_analyze_first": "Книга нуждается в предварительном анализе",
"error_choose_series": "Выберите серию", "error_choose_series": "Выберите серию",
"error_only_import_no_errors": "Можно импортировать только книги без ошибок", "error_only_import_no_errors": "Можно импортировать только книги без наличия ошибок",
"warning_upgrade": "Существующая книга будет обновлена" "warning_upgrade": "Существующая книга будет обновлена"
}, },
"table": { "table": {
@ -90,10 +93,11 @@
}, },
"bookreader": { "bookreader": {
"beginning_of_book": "Вы находитесь в начале книги.", "beginning_of_book": "Вы находитесь в начале книги.",
"changing_reading_direction": "Изменение Направления Чтения на", "changing_reading_direction": "Изменение направления чтения на",
"cycling_page_layout": "Переключить Формат Страниц", "cycling_page_layout": "Переключение макета страницы",
"cycling_scale": "Переключить Масштабирование", "cycling_page_margin": "Переключение полей страницы",
"cycling_side_padding": "Переключить Боковой Отступ", "cycling_scale": "Масштабирование",
"cycling_side_padding": "Переключение боковых отступов",
"download_current_page": "Скачать текущую страницу", "download_current_page": "Скачать текущую страницу",
"end_of_book": "Вы достигли конца книги.", "end_of_book": "Вы достигли конца книги.",
"from_series_metadata": "из метаданных серии", "from_series_metadata": "из метаданных серии",
@ -104,8 +108,8 @@
"notification_poster_set_readlist": "Текущая страница теперь используется в качестве постера списка чтения.", "notification_poster_set_readlist": "Текущая страница теперь используется в качестве постера списка чтения.",
"notification_poster_set_series": "Текущая страница теперь используется в качестве постера серии.", "notification_poster_set_series": "Текущая страница теперь используется в качестве постера серии.",
"paged_reader_layout": { "paged_reader_layout": {
"double": "Двойные страницы", "double": "Две страницы",
"double_no_cover": "Двойные страницы (без обложки)", "double_no_cover": "Две страницы (без обложки)",
"single": "Одна страница" "single": "Одна страница"
}, },
"reader_settings": "Настройки Ридера", "reader_settings": "Настройки Ридера",
@ -114,16 +118,16 @@
"continuous_width": "По ширине", "continuous_width": "По ширине",
"height": "По высоте", "height": "По высоте",
"original": "Исходное", "original": "Исходное",
"screen": "По экрану", "screen": "По размеру экрана",
"width": "По ширине", "width": "По ширине",
"width_shrink_only": "По ширине (с отступами)" "width_shrink_only": "По ширине (с отступами)"
}, },
"set_current_page_as_book_poster": "Установить страницу в качестве постера для книги", "set_current_page_as_book_poster": "Установить страницу в качестве обложки для книги",
"set_current_page_as_readlist_poster": "Установить страницу в качестве постера для списка чтения", "set_current_page_as_readlist_poster": "Установить страницу в качестве обложки для списка чтения",
"set_current_page_as_series_poster": "Установить страницу в качестве постера для серии", "set_current_page_as_series_poster": "Установить страницу в качестве обложки для серии",
"settings": { "settings": {
"always_fullscreen": "Всегда в полный экран", "always_fullscreen": "Всегда полноэкранный режим",
"animate_page_transitions": "Анимировать переходы страниц", "animate_page_transitions": "Анимировать переходы между страницами",
"background_color": "Цвет фона", "background_color": "Цвет фона",
"background_colors": { "background_colors": {
"black": "Чёрный", "black": "Чёрный",
@ -134,54 +138,60 @@
"general": "Общее", "general": "Общее",
"gestures": "Жесты", "gestures": "Жесты",
"page_layout": "Формат страницы", "page_layout": "Формат страницы",
"paged": "Настройки Отображения Страниц", "page_margin": "Поля страницы",
"paged": "Настройки отображения страниц",
"reading_mode": "Режим чтения", "reading_mode": "Режим чтения",
"scale_type": "Масштабирование", "scale_type": "Масштабирование",
"side_padding": "Боковой отступ", "side_padding": "Боковые отступы",
"side_padding_none": "Нет", "side_padding_none": "Нет",
"webtoon": "Параметры Режима Webtoon" "webtoon": "Настройки режима цифрового комикса"
}, },
"shortcuts": { "shortcuts": {
"close": "Закрыть", "close": "Закрыть",
"cycle_page_layout": "Переключить формат страниц", "cycle_page_layout": "Переключить макет страницы",
"cycle_page_margin": "Переключить поля страницы",
"cycle_scale": "Переключить масштаб", "cycle_scale": "Переключить масштаб",
"cycle_side_padding": "Переключить боковой отступ", "cycle_side_padding": "Переключить боковые отступы",
"first_page": "Первая страница", "first_page": "Первая страница",
"fullscreen": "Войти/выйти из полноэкранного режима", "fullscreen": "Войти/выйти из полноэкранного режима",
"last_page": "Последняя страница", "last_page": "Последняя страница",
"left_to_right": "Слева Направо", "left_to_right": "Слева направо",
"menus": "Меню", "menus": "Меню",
"next_page": "Следующая страница", "next_page": "Следующая страница",
"previous_page": "Предыдущая страница", "previous_page": "Предыдущая страница",
"reader_navigation": "Навигация", "reader_navigation": "Навигация",
"right_to_left": "Справа Налево", "right_to_left": "Справа налево",
"settings": "Настройки", "settings": "Настройки",
"show_hide_help": "Показать/скрыть помощь", "show_hide_help": "Показать/скрыть помощь",
"show_hide_settings": "Показать/скрыть меню настроек", "show_hide_settings": "Показать/скрыть меню настроек",
"show_hide_thumbnails": "Показать/скрыть просмотр эскизов", "show_hide_thumbnails": "Показать/скрыть обозреватель миниатюр",
"show_hide_toolbars": "Показать/скрыть панели инструментов", "show_hide_toolbars": "Показать/скрыть панели инструментов",
"vertical": "Вертикально", "vertical": "Вертикально",
"webtoon": "Webtoon" "webtoon": "Цифровой комикс"
}, },
"tooltip_incognito": "Прогресс чтения не будет сохранен" "tooltip_incognito": "Прогресс чтения не будет сохранен"
}, },
"browse_book": { "browse_book": {
"comment": "КОММЕНТАРИЙ", "comment": "КОММЕНТАРИЙ",
"date_created": "СОЗДАНО",
"date_modified": "ПОСЛЕДНЕЕ ИЗМЕНЕНИЕ",
"download_file": "Скачать файл", "download_file": "Скачать файл",
"file": "ФАЙЛ", "file": "ФАЙЛ",
"format": "ФОРМАТ", "format": "ФОРМАТ",
"isbn": "ISBN", "isbn": "ISBN",
"links": "ССЫЛКИ", "links": "ССЫЛКИ",
"navigation_within_readlist": "Навигация в пределах списка чтения: {name}", "navigation_within_readlist": "Навигация внутри списка чтения: {name}",
"outdated_tooltip": "Файл этой книги изменен, книгу необходимо повторно проанализировать", "outdated_tooltip": "Файл этой книги изменился, книгу необходимо повторно проанализировать",
"read_book": "Читать книгу", "read_book": "Читать книгу",
"read_incognito": "Читать инкогнито", "read_incognito": "Читать инкогнито",
"remove_from_collection": "Удалить книгу из коллекции",
"remove_from_readlist": "Удалить книгу из списка чтения",
"size": "РАЗМЕР" "size": "РАЗМЕР"
}, },
"browse_collection": { "browse_collection": {
"edit_collection": "Редактировать коллекцию", "edit_collection": "Редактировать коллекцию",
"edit_elements": "Редактировать элементы", "edit_elements": "Редактировать элементы",
"manual_ordering": "ручной порядок" "manual_ordering": "ручная сортировка"
}, },
"browse_readlist": { "browse_readlist": {
"edit_elements": "Редактировать элементы", "edit_elements": "Редактировать элементы",
@ -189,17 +199,19 @@
"manual_ordering": "ручная сортировка" "manual_ordering": "ручная сортировка"
}, },
"browse_series": { "browse_series": {
"earliest_year_from_release_dates": "Это самая ранняя дата выпуска из всех книг в этой серии", "earliest_year_from_release_dates": "Это самый ранний год из дат выхода всех книг серии",
"series_no_summary": "У серии нет описания, поэтому мы подобрали его для вас!", "remove_from_collection": "Удалить серию из коллекции",
"series_no_summary": "У этой серии нет описания, поэтому мы подобрали его для вас!",
"summary_from_book": "Краткое описание из книги {number}:" "summary_from_book": "Краткое описание из книги {number}:"
}, },
"collections_expansion_panel": { "collections_expansion_panel": {
"manage_collection": "Управлять коллекцией", "manage_collection": "Управление коллекцией",
"title": "Коллекция {name}" "title": "Коллекция {name}"
}, },
"common": { "common": {
"age": "Возраст", "age": "Возраст",
"all_libraries": "Все Библиотеки", "all_libraries": "Все библиотеки",
"any_of": "Любой из",
"book": "Книга", "book": "Книга",
"books": "Книги", "books": "Книги",
"books_n": "Книг нет | 1 книга | {count} книг", "books_n": "Книг нет | 1 книга | {count} книг",
@ -212,14 +224,16 @@
"copied": "Скопировано!", "copied": "Скопировано!",
"create": "Создать", "create": "Создать",
"delete": "Удалить", "delete": "Удалить",
"dimension": "шир.: {width} выс.: {height}", "dimension": "шир.: {width}, выс.: {height}",
"discard": "Отмена", "discard": "Отмена",
"disk_space": "Дисковое пространство", "disk_space": "Дисковое пространство",
"dismiss": "Отклонить", "dismiss": "Отклонить",
"download": "Скачать", "download": "Скачать",
"drag_drop": "перетащить", "drag_drop": "перетащить",
"duplicate": "Дублировать",
"email": "Эл. почта", "email": "Эл. почта",
"epub": "Epub", "epub": "Epub",
"error": "Ошибка",
"filename": "Имя файла", "filename": "Имя файла",
"filter_no_matches": "Нет совпадений по заданному фильтру", "filter_no_matches": "Нет совпадений по заданному фильтру",
"genre": "Жанр", "genre": "Жанр",
@ -227,12 +241,16 @@
"go_to_library": "Вернуться к библиотеке", "go_to_library": "Вернуться к библиотеке",
"go_to_readlist": "Перейти к списку чтения", "go_to_readlist": "Перейти к списку чтения",
"go_to_series": "Перейти к серии", "go_to_series": "Перейти к серии",
"i_understand": "Я понимаю",
"library": "Библиотека", "library": "Библиотека",
"locale_name": "Русский", "locale_name": "Русский",
"locale_rtl": "false", "locale_rtl": "false",
"lock_all": "Заблокировать все", "lock_all": "Заблокировать все",
"media": "Медиа",
"more": "Ещё",
"n_selected": "{count} выбрано", "n_selected": "{count} выбрано",
"nothing_to_show": "Нет данных для отображения", "nothing_to_show": "Нет данных для отображения",
"ok": "OK",
"outdated": "Устарело", "outdated": "Устарело",
"page": "Страница", "page": "Страница",
"page_number": "Номер страницы", "page_number": "Номер страницы",
@ -242,17 +260,20 @@
"password": "Пароль", "password": "Пароль",
"pdf": "PDF", "pdf": "PDF",
"pending_tasks": "Нет незавершенных задач | 1 незавершенная задача | {count} незавершенных задач", "pending_tasks": "Нет незавершенных задач | 1 незавершенная задача | {count} незавершенных задач",
"pinned_libraries": "Закреплённые библиотеки",
"publisher": "Издатель", "publisher": "Издатель",
"read": "Читать", "read": "Читать",
"read_on": "Читать {date}", "read_on": "Прочитано {date}",
"readlist": "Список чтения", "readlist": "Список чтения",
"readlists": "Списки чтения", "readlists": "Списки чтения",
"remember-me": "Запомнить", "remember-me": "Запомнить меня",
"required": "Необходимо", "reorder": "Изменить порядок",
"required": "Обязательно",
"reset_filters": "Сбросить фильтры", "reset_filters": "Сбросить фильтры",
"roles": "Роли", "roles": "Роли",
"save_changes": "Сохранить изменения", "save_changes": "Сохранить изменения",
"series": "Серии", "series": "Серии",
"settings": "Настройки",
"tags": "Теги", "tags": "Теги",
"unavailable": "Недоступно", "unavailable": "Недоступно",
"unlock_all": "Разблокировать все", "unlock_all": "Разблокировать все",

File diff suppressed because it is too large Load diff

View file

@ -9,7 +9,8 @@ FROM ubuntu:24.10 as build-amd64
ENV JAVA_HOME=/opt/java/openjdk ENV JAVA_HOME=/opt/java/openjdk
COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME
ENV PATH="${JAVA_HOME}/bin:${PATH}" 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 && \ 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 && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \
locale-gen en_US.UTF-8 && \ locale-gen en_US.UTF-8 && \
@ -23,7 +24,8 @@ FROM ubuntu:24.10 as build-arm64
ENV JAVA_HOME=/opt/java/openjdk ENV JAVA_HOME=/opt/java/openjdk
COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME COPY --from=eclipse-temurin:23-jre $JAVA_HOME $JAVA_HOME
ENV PATH="${JAVA_HOME}/bin:${PATH}" 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 && \ 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 && \ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen && \
locale-gen en_US.UTF-8 && \ locale-gen en_US.UTF-8 && \

View file

@ -7,7 +7,7 @@
"url": "https://github.com/gotson/komga/blob/master/LICENSE" "url": "https://github.com/gotson/komga/blob/master/LICENSE"
}, },
"title": "Komga API", "title": "Komga API",
"version": "1.23.5" "version": "1.23.6"
}, },
"externalDocs": { "externalDocs": {
"description": "Komga documentation", "description": "Komga documentation",
@ -4919,7 +4919,7 @@
"operationId": "matchComicRackList", "operationId": "matchComicRackList",
"requestBody": { "requestBody": {
"content": { "content": {
"application/json": { "multipart/form-data": {
"schema": { "schema": {
"type": "object", "type": "object",
"properties": { "properties": {

View file

@ -18,6 +18,7 @@ import org.springframework.util.LinkedMultiValueMap
import org.springframework.web.client.RestClient import org.springframework.web.client.RestClient
import org.springframework.web.client.toEntity import org.springframework.web.client.toEntity
import org.springframework.web.server.ResponseStatusException import org.springframework.web.server.ResponseStatusException
import org.springframework.web.util.DefaultUriBuilderFactory
import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.minutes
import kotlin.time.toJavaDuration import kotlin.time.toJavaDuration
@ -29,11 +30,15 @@ class KoboProxy(
private val komgaSyncTokenGenerator: KomgaSyncTokenGenerator, private val komgaSyncTokenGenerator: KomgaSyncTokenGenerator,
private val komgaSettingsProvider: KomgaSettingsProvider, private val komgaSettingsProvider: KomgaSettingsProvider,
) { ) {
private val koboApiClient = private val koboApiClient: RestClient =
RestClient RestClient
.builder() .builder()
.baseUrl("https://storeapi.kobo.com") .uriBuilderFactory(
.requestFactory( DefaultUriBuilderFactory("https://storeapi.kobo.com")
.apply {
this.encodingMode = DefaultUriBuilderFactory.EncodingMode.NONE
},
).requestFactory(
ClientHttpRequestFactoryBuilder.reactor().build( ClientHttpRequestFactoryBuilder.reactor().build(
ClientHttpRequestFactorySettings ClientHttpRequestFactorySettings
.defaults() .defaults()
@ -42,7 +47,7 @@ class KoboProxy(
), ),
).build() ).build()
private val pathRegex = """\/kobo\/[-\w]*(.*)""".toRegex() private val pathRegex = """/kobo/[-\w]*(.*)""".toRegex()
private val headersOutInclude = private val headersOutInclude =
setOf( setOf(
@ -50,6 +55,7 @@ class KoboProxy(
HttpHeaders.USER_AGENT, HttpHeaders.USER_AGENT,
HttpHeaders.ACCEPT, HttpHeaders.ACCEPT,
HttpHeaders.ACCEPT_LANGUAGE, HttpHeaders.ACCEPT_LANGUAGE,
HttpHeaders.CONTENT_TYPE,
) )
private val headersOutExclude = private val headersOutExclude =
@ -110,6 +116,7 @@ class KoboProxy(
}.apply { if (body != null) body(body) } }.apply { if (body != null) body(body) }
.retrieve() .retrieve()
.onStatus(HttpStatusCode::isError) { _, response -> .onStatus(HttpStatusCode::isError) { _, response ->
logger.debug { "Kobo response: ${response.statusCode}: ${response.body.bufferedReader().use { it.readText() }}" }
throw ResponseStatusException(response.statusCode, response.statusText) throw ResponseStatusException(response.statusCode, response.statusText)
}.toEntity<JsonNode>() }.toEntity<JsonNode>()

View file

@ -67,7 +67,7 @@ class EpubExtractor(
?: // try id="cover-image" ?: // try id="cover-image"
manifest.values.firstOrNull { it.id == "cover-image" } manifest.values.firstOrNull { it.id == "cover-image" }
if (coverManifestItem != null) { if (coverManifestItem != null) {
val href = coverManifestItem.href val href = URLDecoder.decode(coverManifestItem.href, Charsets.UTF_8)
val mediaType = coverManifestItem.mediaType val mediaType = coverManifestItem.mediaType
val coverPath = normalizeHref(opfDir, href) val coverPath = normalizeHref(opfDir, href)
zip.getEntryBytes(coverPath)?.let { coverBytes -> zip.getEntryBytes(coverPath)?.let { coverBytes ->

View file

@ -194,6 +194,7 @@ class KoboController(
try { try {
koboProxy.proxyCurrentRequest().body?.get("Resources") koboProxy.proxyCurrentRequest().body?.get("Resources")
} catch (e: Exception) { } 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" } logger.warn { "Failed to get response from Kobo /v1/initialization, fallback to noproxy" }
null null
} ?: koboProxy.nativeKoboResources } ?: koboProxy.nativeKoboResources
@ -233,7 +234,7 @@ class KoboController(
): Any { ): Any {
try { try {
return koboProxy.proxyCurrentRequest(body) return koboProxy.proxyCurrentRequest(body)
} catch (e: Exception) { } catch (_: Exception) {
logger.warn { "Failed to get response from Kobo /v1/auth/device, fallback to noproxy" } logger.warn { "Failed to get response from Kobo /v1/auth/device, fallback to noproxy" }
} }
@ -395,7 +396,7 @@ class KoboController(
addAll( addAll(
// changed books are also passed as changed reading state because Kobo does not process ChangedEntitlement even if it contains a ReadingState // 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 -> (booksChanged.content + changedReadingState.content).mapNotNull { book ->
readProgress[book.bookId]?.let { it -> readProgress[book.bookId]?.let {
ChangedReadingStateDto( ChangedReadingStateDto(
WrappedReadingStateDto( WrappedReadingStateDto(
it.toDto(), it.toDto(),

View file

@ -268,7 +268,7 @@ class ReadListController(
} }
@Operation(summary = "Match ComicRack list", tags = [OpenApiConfiguration.TagNames.COMICRACK]) @Operation(summary = "Match ComicRack list", tags = [OpenApiConfiguration.TagNames.COMICRACK])
@PostMapping("match/comicrack") @PostMapping("match/comicrack", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
@PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasRole('ADMIN')")
fun matchComicRackList( fun matchComicRackList(
@RequestParam("file") file: MultipartFile, @RequestParam("file") file: MultipartFile,