* Updated readme to have progress bars on localization to help motivate users.

* Fixed a bug where downloads could trigger on lazy loaded module boundaries.

* Updated all packages to latest

* Fixed a bug where remove from on deck would show on all series cards when it shouldn't have.

* Fixed a bug where virtualized reading list page wasn't showing the correct order on the UI

* Localization fixes from shakeout

* Fixed fullscreen mode broken in nightly from localization.

* Fixed a bug where duplicate series add events could show duplicate items in library detail page.

* Translations update from Hosted Weblate (#2184)

* Added translation using Weblate (Kannada)

* Added translation using Weblate (Hindi)

* Added translation using Weblate (German)

* Added translation using Weblate (Russian)

* Added translation using Weblate (Malay)

* Translated using Weblate (Dutch)

Currently translated at 20.8% (296 of 1423 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/nl/

* Translated using Weblate (Portuguese)

Currently translated at 5.2% (75 of 1423 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/pt/

* Translated using Weblate (German)

Currently translated at 98.7% (156 of 158 strings)

Translation: Kavita/backend
Translate-URL: https://hosted.weblate.org/projects/kavita/backend/de/

* Translated using Weblate (Japanese)

Currently translated at 1.9% (28 of 1423 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/ja/

* Translated using Weblate (Spanish)

Currently translated at 1.8% (3 of 158 strings)

Translation: Kavita/backend
Translate-URL: https://hosted.weblate.org/projects/kavita/backend/es/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (158 of 158 strings)

Translation: Kavita/backend
Translate-URL: https://hosted.weblate.org/projects/kavita/backend/hi/

* Translated using Weblate (German)

Currently translated at 7.3% (105 of 1423 strings)

Translation: Kavita/ui
Translate-URL: https://hosted.weblate.org/projects/kavita/ui/de/

* Deleted translation using Weblate (Undetermined)

* Added translation using Weblate (Italian)

---------

Co-authored-by: Shashank Pujari <shashankppujari@gmail.com>
Co-authored-by: Andre <andruecha32@gmail.com>
Co-authored-by: Hans Kalisvaart <hans.kalisvaart@gmail.com>
Co-authored-by: Duarte Silva <smallflake@protonmail.com>
Co-authored-by: Andre Smith <andrepsmithjr@gmail.com>
Co-authored-by: ThePromidius <thepromidiusyt@gmail.com>
Co-authored-by: majora2007 <kavitareader@gmail.com>
Co-authored-by: Tomas Battistini <tomas.battistini@gmail.com>

---------

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Shashank Pujari <shashankppujari@gmail.com>
Co-authored-by: Andre <andruecha32@gmail.com>
Co-authored-by: Hans Kalisvaart <hans.kalisvaart@gmail.com>
Co-authored-by: Duarte Silva <smallflake@protonmail.com>
Co-authored-by: Andre Smith <andrepsmithjr@gmail.com>
Co-authored-by: ThePromidius <thepromidiusyt@gmail.com>
Co-authored-by: majora2007 <kavitareader@gmail.com>
Co-authored-by: Tomas Battistini <tomas.battistini@gmail.com>
This commit is contained in:
Joe Milazzo 2023-08-07 09:14:57 -05:00 committed by GitHub
parent e9f8ecfc27
commit 7358ba7220
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 7838 additions and 771 deletions

View File

@ -80,5 +80,81 @@
"reading-list-permission": "Sie haben keine Berechtigung für diese Leseliste oder die Liste existiert nicht",
"delete-library-while-scan": "Sie können eine Bibliothek nicht löschen, während ein Scanvorgang läuft. Bitte warten Sie, bis der Scanvorgang abgeschlossen ist oder starten Sie Kavita neu und versuchen Sie es dann zu löschen",
"generic-library-update": "Es gab ein schwerwiegendes Problem bei der Aktualisierung der Bibliothek.",
"generic-read-progress": "Es gab ein Problem beim Erfassen des Fortschritts"
"generic-read-progress": "Es gab ein Problem beim Erfassen des Fortschritts",
"reading-list-updated": "Aktualisiert",
"reading-list-item-delete": "Element(e) konnte(n) nicht gelöscht werden",
"reading-list-deleted": "Leseliste wurde gelöscht",
"generic-reading-list-delete": "Es gab ein Problem beim Löschen der Leseliste",
"generic-reading-list-create": "Es gab ein Problem bei der Erstellung der Leseliste",
"generic-reading-list-update": "Es gab ein Problem bei der Aktualisierung der Leseliste",
"reading-list-doesnt-exist": "Die Leseliste existiert nicht",
"series-restricted": "Der Benutzer hat keinen Zugriff auf diese Serie",
"generic-series-update": "Beim Aktualisieren der Serie ist ein Fehler aufgetreten",
"series-updated": "Erfolgreich aktualisiert",
"update-metadata-fail": "Metadaten konnten nicht aktualisiert werden",
"job-already-running": "Aufgabe läuft bereits",
"generic-cover-series-save": "Das Coverbild konnte nicht für die Serie gespeichert werden",
"generic-cover-library-save": "Das Coverbild konnte nicht für die Bibliothek gespeichert werden",
"no-series-collection": "Es konnten keine Serien zur Sammlung hinzugefügt werden",
"generic-user-pref": "Es gab ein Problem beim Speichern von Präferenzen",
"browse-recently-added": "Zuletzt hinzugefügtes ansehen",
"search-description": "Suche nach Serien, Sammlungen oder Leselisten",
"not-authenticated": "Benutzer ist nicht authentifiziert",
"scrobble-bad-payload": "Schlechte Daten vom Scrobble Anbieter",
"theme-doesnt-exist": "Designdatei fehlt oder ist ungültig",
"epub-malformed": "Die Datei ist fehlerhaft formatiert! Kann nicht gelesen werden.",
"collection-tag-duplicate": "Eine Sammlung mit diesem Namen existiert bereits",
"send-to-permission": "Nicht-EPUB oder -PDF können nicht an Geräte gesendet werden, da sie von Kindle nicht unterstützt werden",
"progress-must-exist": "Der Fortschritt muss beim Benutzer vorhanden sein",
"device-duplicate": "Ein Gerät mit diesem Namen existiert bereits",
"device-not-created": "Dieses Gerät existiert noch nicht. Bitte zuerst erstellen",
"reading-list-name-exists": "Eine Leseliste mit diesem Namen existiert bereits",
"user-no-access-library-from-series": "Der Benutzer hat keinen Zugang zu der Bibliothek, der zu dieser Serie gehört",
"series-restricted-age-restriction": "Benutzer darf diese Serie aufgrund von Altersbeschränkungen nicht sehen",
"book-num": "Buch {0}",
"issue-num": "Fehler {0}{1}",
"chapter-num": "Kapitel {0}",
"reading-list-position": "Position konnte nicht aktualisiert werden",
"libraries-restricted": "Benutzer hat keinen Zugriff auf jegliche Bibliothek",
"no-series": "Es konnte keine Serie zur Bibliothek hinzugefügt werden",
"generic-scrobble-hold": "Beim Pausieren der Funktion ist ein Fehler aufgetreten",
"generic-series-delete": "Es gab ein Fehler beim Löschen der Serie",
"age-restriction-not-applicable": "Keine Einschränkung",
"generic-relationship": "Es gab ein Problem bei der Aktualisierung von Relationen",
"encode-as-warning": "Sie können nicht in PNG konvertieren. Für Covers verwenden Sie Covers aktualisieren. Lesezeichen und Favicons können nicht zurückkodiert werden.",
"ip-address-invalid": "IP-Adresse '{0}' ist ungültig",
"bookmark-dir-permissions": "Das Lesezeichenverzeichnis hat nicht die richtigen Rechte für die Verwendung durch Kavita",
"total-backups": "Die Gesamtzahl der Backups muss zwischen 1 und 30 liegen",
"total-logs": "Die Gesamtzahl der Protokolle muss zwischen 1 und 30 liegen",
"stats-permission-denied": "Sie sind nicht berechtigt, die Statistiken eines anderen Benutzers einzusehen",
"url-not-valid": "Url gibt kein gültiges Bild zurück oder erfordert Autorisierung",
"url-required": "Sie müssen eine Url angeben, um zu verwenden",
"generic-cover-collection-save": "Das Coverbild konnte nicht für die Sammlung gespeichert werden",
"generic-cover-reading-list-save": "Das Coverbild konnte nicht für die Leseliste gespeichert werden",
"generic-cover-chapter-save": "Das Coverbild konnte nicht für das Kapitel gespeichert werden",
"access-denied": "Sie haben keinen Zugriff",
"reset-chapter-lock": "Die Cover Sperre konnte für das Kapitel nicht zurückgesetzt werden",
"generic-user-delete": "Der Benutzer konnte nicht gelöscht werden",
"opds-disabled": "OPDS ist auf diesem Server nicht aktiviert",
"recently-added": "Zuletzt hinzugefügt",
"reading-lists": "Leselisten",
"libraries": "Alle Bibliotheken",
"collections": "Alle Sammlungen",
"browse-reading-lists": "Leselisten durchsuchen",
"browse-libraries": "Bibliotheken durchsuchen",
"browse-collections": "Sammlungen durchsuchen",
"search": "Suche",
"reading-list-restricted": "Die Leseliste existiert nicht oder Sie haben keinen Zugriff darauf",
"query-required": "Sie müssen einen Abfrageparameter angeben",
"favicon-doesnt-exist": "Favicon existiert nicht",
"unable-to-register-k+": "Die Lizenz kann aufgrund eines Fehlers nicht registriert werden. Wenden Sie sich an den Kavita+ Support",
"anilist-cred-expired": "AniList Zugangsdaten sind abgelaufen oder nicht vorhanden",
"bad-copy-files-for-download": "Dateien konnten nicht in das Temporärverzeichnis des Archivdownloads kopiert werden.",
"generic-create-temp-archive": "Es gab ein Fehler bei der Erstellung eines temporären Archivs",
"epub-html-missing": "Die entsprechende HTML-Datei für diese Seite konnte nicht gefunden werden",
"collection-tag-title-required": "Titel der Sammlung darf nicht leer sein",
"reading-list-title-required": "Leselisten Titel darf nicht leer sein",
"volume-num": "Band {0}",
"on-deck": "On Deck",
"browse-on-deck": "On Deck durchsuchen"
}

View File

@ -1 +1,5 @@
{}
{
"bad-credentials": "Las credenciales son incorrectas",
"confirm-email": "Debes confirmar el correo electrónico primero",
"disabled-account": "La cuenta está deshabilitada. Contacta con un administrador."
}

160
API/I18N/hi.json Normal file
View File

@ -0,0 +1,160 @@
{
"generic-device-create": "डिवाइस बनाते समय एक त्रुटि हुई",
"validate-email": "हम आपके ईमेल की पुष्टि नहीं कर पा रहे हैं: {0}",
"confirm-token-gen": "पुष्टिकरण टोकन उत्पन्न करने में एक समस्याआ रही है",
"denied": "अनुमति नहीं है",
"permission-denied": "आपको इस ऑपरेशन की अनुमति नहीं है",
"password-required": "अपना खाता बदलने के लिए आपको अपना मौजूदा पासवर्ड दर्ज करना होगा,जब तक आप व्यवस्थापक न हों",
"invalid-password": "अवैध पासवर्ड",
"invalid-payload": "अमान्य पेलोड",
"age-restriction-update": "आयु प्रतिबंध को अद्यतन करने में त्रुटि आ रही है",
"generic-user-update": "उपयोगकर्ता को अपडेट करते समय एक एक्सेप्शन आ रहा है",
"user-already-invited": "उपयोगकर्ता को इस ईमेल के अंतर्गत पहले ही आमंत्रित किया जा चुका है और उसने अभी तक आमंत्रण स्वीकार नहीं किया है।",
"invalid-email-confirmation": "अवैध ईमेल पुष्टिकरण",
"password-updated": "पासवर्ड अपडेट किया गया",
"not-accessible": "आपका सर्वर बाह्य रूप से पहुंच योग्य नहीं है",
"email-sent": "ईमेल भेजा",
"generic-invite-email": "आमंत्रण ईमेल पुनः भेजने में एक समस्या है",
"file-missing": "पुस्तक में फ़ाइल नहीं मिली",
"generic-error": "कुछ गलत हो गया, फिर से कोशिश करें",
"device-doesnt-exist": "डिवाइस मौजूद नहीं है",
"generic-device-delete": "डिवाइस को हटाते समय एक त्रुटि हुई",
"send-to-device-status": "अपने डिवाइस पर फ़ाइलों को स्थानांतरित करना",
"volume-doesnt-exist": "वोलूम(Volume) मौजूद नहीं है",
"bookmark-doesnt-exist": "बुकमार्क मौजूद नहीं है",
"invalid-filename": "अमान्य फ़ाइल नाम",
"library-name-exists": "पुस्तकालय का नाम पहले से ही मौजूद है। कृपया सर्वर पर एक अद्वितीय नाम चुनें।।",
"no-library-access": "उपयोगकर्ता के पास इस पुस्तकालय तक पहुंच नहीं है",
"user-doesnt-exist": "उपयोगकर्ता मौजूद नहीं है",
"generic-library-update": "लाइब्रेरी(Library) को अपडेट करने में एक गंभीर समस्या है।",
"pdf-doesnt-exist": "जब यह होना चाहिए तो पीडीएफ मौजूद नहीं है",
"invalid-access": "अवैध पहुँच",
"perform-scan": "कृपया इस श्रृंखला(Series) या पुस्तकालय(Library) पर एक स्कैन करें और फिर से कोशिश करें",
"generic-clear-bookmarks": "बुकमार्क साफ़ नहीं किए जा सके",
"bookmark-permission": "आपको बुकमार्क/अनबुकमार्क करने की अनुमति नहीं है",
"cache-file-find": "कैश्ड छवि(Image) नहीं मिल सका। पुनः लोड करें और फिर से प्रयास करें।।",
"reading-list-permission": "इस सूची में आपको अनुमति नहीं है या सूची मौजूद नहीं है",
"reading-list-position": "स्थिति अपडेट नहीं की जा सका",
"reading-list-updated": "अपडेटेड",
"reading-list-deleted": "पठन सूची(Reading List) को हटा दिया गया",
"generic-reading-list-update": "पठन सूची(Reading List) को अपडेट करने में एक समस्या है",
"reading-list-doesnt-exist": "पठन सूची(Reading List) मौजूद नहीं है",
"no-series": "पुस्तकालय के लिए श्रृंखला(Series) नहीं मिल सका",
"no-series-collection": "संग्रह(Collection) के लिए श्रृंखला(Series) नहीं मिल सका",
"generic-scrobble-hold": "होल्ड जोड़ते समय एक त्रुटि उत्पन्न हुई",
"generic-series-update": "श्रृंखला(Series) को अपडेट करने में त्रुटि हुई",
"update-metadata-fail": "मेटाडाटा अद्यतन नहीं कर सका",
"total-backups": "कुल बैकअप 1 और 30 के बीच होना चाहिए",
"total-logs": "कुल लॉग 1 और 30 के बीच होना चाहिए",
"url-not-valid": "Url एक वैध छवि वापस नहीं करता है या प्राधिकरण की आवश्यकता है",
"url-required": "आपको उपयोग करने के लिए एक URL पास करना होगा",
"generic-cover-chapter-save": "कवर छवि को अध्याय में बचाने में असमर्थ",
"generic-cover-library-save": "पुस्तकालय(Library) में कवर छवि को बचाने में असमर्थ",
"access-denied": "आपके पास पहुंच नहीं है",
"browse-recently-added": "हाल ही में जोड़ा गया ब्राउज़ करें",
"browse-libraries": "पुस्तकालयों द्वारा ब्राउज़ करें",
"query-required": "आपको एक क्वेरी पैरामीटर पास करना होगा",
"search": "खोज",
"scrobble-bad-payload": "Scrobble प्रदाता से बुरा पेलोड",
"epub-malformed": "फ़ाइल विकृत है! पढ़ा नहीं जा सकता हैं।।",
"epub-html-missing": "उस पृष्ठ(Page) के लिए उपयुक्त HTML नहीं मिल सका",
"reading-list-title-required": "पठन सूची शीर्षक खाली नहीं हो सकता",
"device-duplicate": "इस नाम के साथ पहले से मौजूद एक डिवाइस",
"progress-must-exist": "उपयोगकर्ता पर प्रगति होना चाहिए",
"confirm-email": "आपको पहले अपने ईमेल की पुष्टि करनी होगी",
"reading-list-name-exists": "इस नाम की पठन सूची पहले से मौजूद है",
"series-restricted-age-restriction": "उपयोगकर्ता को आयु प्रतिबंध के कारण इस श्रृंखला को देखने की अनुमति नहीं है",
"volume-num": "वॉल्यूम {0}",
"book-num": "बुक {0}",
"issue-num": "अंक(Issue) {0}{1}",
"bad-credentials": "आपकी क्रेडेंशियल सही नहीं हैं",
"locked-out": "आपको कई प्राधिकरण प्रयासों के कारण बंद कर दिया गया है। कृपया 10 मिनट प्रतीक्षा करें।।",
"register-user": "उपयोगकर्ता पंजीकरण करते समय कुछ गलत हो गया",
"disabled-account": "आपका खाता अक्षम है। सर्वर व्यवस्थापक से संपर्क करें।।",
"invalid-token": "अमान्य टोकन",
"unable-to-reset-key": "कुछ गलत हो गया, कुंजी को रीसेट करने में असमर्थ",
"nothing-to-do": "कुछ नहीं करना",
"share-multiple-emails": "आप एकाधिक खातों में ईमेल साझा नहीं कर सकते",
"generate-token": "पुष्टिकरण ईमेल टोकन उत्पन्न करने में एक समस्याआ रही है। लॉग देखें",
"no-user": "उपयोगकर्ता मौजूद नहीं है",
"username-taken": "उपयोगकर्ता नाम पहले से ही लिया गया है",
"user-already-confirmed": "उपयोगकर्ता पहले से ही पुष्टि की है",
"manual-setup-fail": "मैनुअल सेटअप पूरा करने में असमर्थ है। कृपया निमंत्रण रद्द करें और फिर से बनाएँ",
"user-already-registered": "उपयोगकर्ता पहले से ही {0} के रूप में पंजीकृत है",
"generic-invite-user": "एक्सेप्शन आ रहा है उपयोगकर्ता को आमंत्रित करने का एक समस्या आ रहा है। कृपया लॉग की जाँच करें।।",
"generic-user-email-update": "उपयोगकर्ता के लिए ईमेल अद्यतन करने में असमर्थ। लॉग की जाँच करें।।",
"generic-password-update": "नए पासवर्ड की पुष्टि करते समय एक अप्रत्याशित त्रुटि आ रहा है",
"forgot-password-generic": "यदि यह हमारे डेटाबेस में मौजूद है तो ईमेल को भेजा जाएगा",
"user-migration-needed": "इस उपयोगकर्ता को माइग्रेट करने की जरूरत है। उन्हें लॉग आउट करें और माइग्रेशन प्रवाह को ट्रिगर करने के लिए लॉगिन करें",
"chapter-doesnt-exist": "अध्याय मौजूद नहीं है",
"series-doesnt-exist": "सीरीज(Series) मौजूद नहीं है",
"generic-device-update": "डिवाइस को अपडेट करते समय एक त्रुटि हुई",
"not-accessible-password": "आपका सर्वर पहुंच योग्य नहीं है. आपका पासवर्ड रीसेट करने का लिंक लॉग में है",
"admin-already-exists": "व्यवस्थापक पहले से ही मौजूद है",
"invalid-username": "अमान्य उपयोगकर्ता नाम",
"critical-email-migration": "ईमेल माइग्रेशन के दौरान एक समस्या थी. समर्थन से संपर्क करें",
"greater-0": "{0} 0 से अधिक होना चाहिए",
"send-to-kavita-email": "सेंड टु डिवाइस कविता की ईमेल सेवा के साथ इस्तेमाल नहीं किया जा सकता है। कृपया अपना खुद का ईमेल विन्यास करें।",
"generic-send-to": "डिवाइस पर फ़ाइल भेजने में त्रुटि हुई",
"collection-updated": "कलेक्शन सफलतापूर्वक अपडेट किया गया",
"collection-doesnt-exist": "कलेक्शन मौजूद नहीं है",
"bookmarks-empty": "बुकमार्क खाली नहीं हो सकता",
"no-cover-image": "कोई कवर नहीं",
"must-be-defined": "{0} को परिभाषित किया जाना चाहिए",
"generic-favicon": "डोमेन के लिए फ़ेविकॉन लाने में एक समस्या है",
"file-doesnt-exist": "फ़ाइल मौजूद नहीं है",
"generic-library": "एक महत्वपूर्ण समस्या है। फिर से प्रयास करें।।",
"library-doesnt-exist": "पुस्तकालय(Library) मौजूद नहीं है",
"invalid-path": "अवैध पथ",
"no-image-for-page": "पृष्ठ {0} के लिए ऐसी कोई छवि नहीं। फिर से कैश की अनुमति देने के लिए ताज़ा प्रयास करें।।",
"delete-library-while-scan": "आप पुस्तकालय को नष्ट नहीं कर सकते जबकि स्कैन प्रगति पर है।",
"duplicate-bookmark": "डुप्लिकेट बुकमार्क प्रविष्टि पहले से मौजूद है",
"reading-list-item-delete": "आइटम को नष्ट नहीं कर सकता",
"generic-read-progress": "प्रगति को सहेजने में एक समस्या है",
"bookmark-save": "बुकमार्क नहीं बचा सकता",
"valid-number": "मान्य पृष्ठ(Page) संख्या होना चाहिए",
"libraries-restricted": "उपयोगकर्ता को किसी भी पुस्तकालय(Library) तक पहुंच अधिकार नहीं है",
"name-required": "नाम खाली नहीं हो सकता है",
"generic-reading-list-delete": "पठन सूची(Reading List) को हटाने में एक समस्या है",
"generic-series-delete": "श्रृंखला(Series) को हटाने का एक समस्या है",
"generic-reading-list-create": "पठन सूची(Reading List) को बनाने में एक समस्या है",
"series-restricted": "उपयोगकर्ता के पास इस श्रृंखला(Series) तक पहुंच नहीं है",
"series-updated": "सफलतापूर्वक अपडेटेड",
"job-already-running": "पहले से ही चल रहा है",
"ip-address-invalid": "आईपी एड्रेस '{0}' अमान्य है",
"age-restriction-not-applicable": "कोई प्रतिबंध नहीं",
"generic-relationship": "रिश्तों को अपडेट करने में एक समस्या हुई",
"generic-cover-series-save": "श्रृंखला(Series) के लिए कवर छवि(Cover Image) को बचाने में असमर्थ",
"encode-as-warning": "आप पीएनजी में परिवर्तित नहीं कर सकते। कवर के लिए, रिफ्रेश कवर का उपयोग करें। बुकमार्क और favicons को वापस कोडित नहीं किया जा सकता है।।",
"chapter-num": "अध्याय {0}",
"bookmark-dir-permissions": "Bookmark डायरेक्टरी के पास Kavita के लिए सही अनुमति नहीं है",
"stats-permission-denied": "आप किसी अन्य उपयोगकर्ता के आंकड़े देखने के लिए अधिकृत नहीं हैं",
"generic-cover-collection-save": "संग्रह(Collection) के लिए कवर छवि को बचाने में असमर्थ",
"browse-reading-lists": "पठन सूचियों द्वारा ब्राउज़ करें",
"generic-cover-reading-list-save": "पठन सूचि(Reading List) में कवर छवि(Cover Image) को बचाने में असमर्थ",
"on-deck": "डेक पर",
"reset-chapter-lock": "अध्याय के लिए कवर लॉक को रीसेट करने में असमर्थ",
"opds-disabled": "इस सर्वर पर OPDS सक्षम नहीं है",
"reading-lists": "पठन सूची",
"collections": "सभी संग्रह",
"browse-collections": "संग्रह द्वारा ब्राउज़ करें",
"theme-doesnt-exist": "थीम फ़ाइल लापता या अमान्य",
"bad-copy-files-for-download": "फ़ाइलों को अस्थायी निर्देशिका संग्रह डाउनलोड करने में असमर्थ।।",
"generic-user-delete": "उपयोगकर्ता को नष्ट नहीं कर सकता",
"generic-user-pref": "प्राथमिकताएँ सहेजने में एक समस्या है",
"browse-on-deck": "डेक पर ब्राउज़ करें",
"recently-added": "हाल ही में जोड़ा गया",
"reading-list-restricted": "पठन सूची मौजूद नहीं है या आपके पास एक्सेस नहीं है",
"search-description": "श्रृंखला, संग्रह, या पठन सूची के लिए खोज",
"favicon-doesnt-exist": "Favicon मौजूद नहीं है",
"anilist-cred-expired": "AniList Credentials समाप्त हो गया है या निर्धारित नहीं है",
"collection-tag-title-required": "संग्रह(Collection) शीर्षक खाली नहीं हो सकता",
"libraries": "सभी पुस्तकालय",
"not-authenticated": "उपयोगकर्ता प्रमाणित नहीं है",
"unable-to-register-k+": "त्रुटि के कारण लाइसेंस पंजीकृत करने में असमर्थ। Kavita+ समर्थन तक पहुंचें",
"generic-create-temp-archive": "वहाँ एक समस्या अस्थायी संग्रह बनाने में",
"collection-tag-duplicate": "इस नाम के साथ संग्रह पहले से मौजूद है",
"send-to-permission": "किंडल पर समर्थित नहीं होने के रूप में उपकरणों के लिए गैर-EPUB या PDF नहीं भेजा जा सकता",
"device-not-created": "यह डिवाइस अभी तक मौजूद नहीं है। कृपया पहले बनाएं",
"user-no-access-library-from-series": "उपयोगकर्ता के पास पुस्तकालय तक पहुंच नहीं है इस श्रृंखला के अंतर्गत आता है"
}

View File

@ -8,7 +8,7 @@
"invalid-password": "Password non valida",
"invalid-token": "Token non valido",
"unable-to-reset-key": "Qualcosa è andato storto, impossibile reimpostare la chiave",
"invalid-payload": "Carico non valido",
"invalid-payload": "Payload non valido",
"nothing-to-do": "Nulla da fare",
"share-multiple-emails": "Non puoi condividere email su più account",
"generate-token": "Si è verificato un problema durante la generazione di un token di email di conferma. Vedi i log",
@ -31,7 +31,7 @@
"invalid-username": "nome utente non valido",
"critical-email-migration": "Si è verificato un problema durante la migrazione della posta elettronica. Contatta il supporto",
"name-required": "Il nome non può essere vuoto",
"valid-number": "Il file non è stato trovato nel libro",
"valid-number": "Deve essere un numero di pagina valido",
"reading-list-permission": "Non disponi delle autorizzazioni per questo elenco di lettura o l'elenco non esiste",
"reading-list-position": "Impossibile aggiornare la posizione",
"reading-list-updated": "Aggiornato",
@ -108,5 +108,53 @@
"invalid-filename": "Nome file non valido",
"invalid-path": "Percorso non valido",
"user-doesnt-exist": "L'utente non esiste",
"reading-list-name-exists": "Esiste già un elenco di letture con questo nome"
"reading-list-name-exists": "Esiste già un elenco di letture con questo nome",
"delete-library-while-scan": "Non è possibile eliminare una libreria mentre è in corso una scansione. Attendi il completamento della scansione o riavvia Kavita, quindi prova a eliminare",
"no-image-for-page": "Nessuna immagine simile per la pagina {0}. Prova ad aggiornare per consentire il re-cache.",
"browse-recently-added": "Sfoglia Aggiunti di recente",
"generic-cover-series-save": "Impossibile salvare l'immagine di copertina nella serie",
"reset-chapter-lock": "Impossibile reimpostare il blocco del coperchio per il capitolo",
"generic-cover-chapter-save": "Impossibile salvare l'immagine di copertina nel capitolo",
"recently-added": "Aggiunto recentemente",
"device-doesnt-exist": "Il dispositivo non esiste",
"generic-device-create": "Si è verificato un errore durante la creazione del dispositivo",
"generic-device-update": "Si è verificato un errore durante l'aggiornamento del dispositivo",
"generic-device-delete": "Si è verificato un errore durante l'eliminazione del dispositivo",
"greater-0": "{0} deve essere maggiore di 0",
"send-to-kavita-email": "Invia al dispositivo non può essere utilizzato con il servizio e-mail di Kavita. Si prega di configurare il proprio.",
"generic-send-to": "Si è verificato un errore durante l'invio dei file al dispositivo",
"generic-favicon": "Si è verificato un problema durante il recupero della favicon per il dominio",
"library-name-exists": "Il nome della libreria esiste già. Scegli un nome univoco per il server.",
"generic-library": "Si è verificato un problema critico. Per favore riprova.",
"no-library-access": "L'utente non ha accesso a questa libreria",
"generic-library-update": "Si è verificato un problema critico durante l'aggiornamento della libreria.",
"pdf-doesnt-exist": "PDF non esiste quando dovrebbe",
"invalid-access": "Accesso non valido",
"perform-scan": "Esegui una scansione su questa serie o libreria e riprova",
"generic-read-progress": "Si è verificato un problema durante il salvataggio dei progressi",
"generic-clear-bookmarks": "Impossibile cancellare i segnalibri",
"bookmark-permission": "Non sei autorizzato ad aggiungere/rimuovere i segnalibri",
"bookmark-save": "Impossibile salvare il segnalibro",
"cache-file-find": "Impossibile trovare l'immagine memorizzata nella cache. Ricarica e riprova.",
"total-backups": "I backup totali devono essere compresi tra 1 e 30",
"total-logs": "I log totali devono essere compresi tra 1 e 30",
"stats-permission-denied": "Non sei autorizzato a visualizzare le statistiche di un altro utente",
"url-not-valid": "L'URL non restituisce un'immagine valida o richiede l'autorizzazione",
"url-required": "Devi passare un URL da usare",
"generic-cover-collection-save": "Impossibile salvare l'immagine di copertina nella raccolta",
"generic-cover-reading-list-save": "Impossibile salvare l'immagine di copertina in Elenco di lettura",
"generic-cover-library-save": "Impossibile salvare l'immagine di copertina nella Libreria",
"access-denied": "Non hai accesso",
"generic-user-delete": "Impossibile eliminare l'utente",
"generic-user-pref": "Si è verificato un problema durante il salvataggio delle preferenze",
"opds-disabled": "OPDS non è abilitato su questo server",
"on-deck": "Sul Ponte",
"browse-on-deck": "Sfoglia Sul ponte",
"reading-lists": "Liste di lettura",
"browse-reading-lists": "Sfoglia Liste di lettura",
"libraries": "Tutte le Librerie",
"browse-libraries": "Sfoglia Librerie",
"collections": "Tutte le Collezioni",
"browse-collections": "Sfoglia per Collezioni",
"reading-list-restricted": "L'elenco di lettura non esiste o non hai accesso"
}

View File

@ -1,3 +1,4 @@
{
"chapter-num": "章 {0}"
"chapter-num": "章 {0}",
"invalid-token": "無効トークン"
}

View File

@ -103,8 +103,12 @@ Thank you to [<img src="/Logo/jetbrains.svg" alt="" width="32"> JetBrains](http:
## Palace-Designs
We would like to extend a big thank you to [<img src="/Logo/hosting-sponsor.png" alt="" width="128">](https://www.palace-designs.com/) who hosts our infrastructure pro-bono.
## Weblate
Thank you to [Weblate](https://hosted.weblate.org/engage/kavita/) who hosts our localization infrastructure pro-bono. If you want to help localize Kavita, please visit them.
## Localization
Thank you to [Weblate](https://hosted.weblate.org/engage/kavita/) who hosts our localization infrastructure pro-bono. If you want to see Kavita in your language, please help us localize.
<a href="https://hosted.weblate.org/engage/kavita/">
<img src="https://hosted.weblate.org/widgets/kavita/-/horizontal-blue.svg" alt="Translation status" />
</a>
## Huntr
We would like to extend a big thank you to [Huntr](https://huntr.dev/repos/kareadita/kavita) who has worked with Kavita in reporting security vulnerabilities. If you are interested in

588
UI/Web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -13,31 +13,31 @@
},
"private": true,
"dependencies": {
"@angular/animations": "^16.1.6",
"@angular/cdk": "^16.1.5",
"@angular/common": "^16.1.6",
"@angular/compiler": "^16.1.6",
"@angular/core": "^16.1.6",
"@angular/forms": "^16.1.6",
"@angular/localize": "^16.1.6",
"@angular/platform-browser": "^16.1.6",
"@angular/platform-browser-dynamic": "^16.1.6",
"@angular/router": "^16.1.6",
"@fortawesome/fontawesome-free": "^6.4.0",
"@angular/animations": "^16.1.8",
"@angular/cdk": "^16.1.7",
"@angular/common": "^16.1.8",
"@angular/compiler": "^16.1.8",
"@angular/core": "^16.1.8",
"@angular/forms": "^16.1.8",
"@angular/localize": "^16.1.8",
"@angular/platform-browser": "^16.1.8",
"@angular/platform-browser-dynamic": "^16.1.8",
"@angular/router": "^16.1.8",
"@fortawesome/fontawesome-free": "^6.4.2",
"@iharbeck/ngx-virtual-scroller": "^16.0.0",
"@iplab/ngx-file-upload": "^16.0.1",
"@microsoft/signalr": "^7.0.9",
"@ng-bootstrap/ng-bootstrap": "^15.1.0",
"@ngneat/transloco": "^4.3.0",
"@ngneat/transloco-locale": "^4.1.0",
"@ngneat/transloco-persist-lang": "^4.0.0",
"@ngneat/transloco-persist-translations": "^4.0.0",
"@ngneat/transloco-preload-langs": "^4.0.1",
"@ngneat/transloco": "^5.0.6",
"@ngneat/transloco-locale": "^5.1.1",
"@ngneat/transloco-persist-lang": "^5.0.0",
"@ngneat/transloco-persist-translations": "^5.0.0",
"@ngneat/transloco-preload-langs": "^5.0.0",
"@popperjs/core": "^2.11.7",
"@swimlane/ngx-charts": "^20.1.2",
"@tweenjs/tween.js": "^21.0.0",
"@types/file-saver": "^2.0.5",
"bootstrap": "^5.2.3",
"bootstrap": "^5.3.1",
"eventsource": "^2.0.2",
"file-saver": "^2.0.5",
"lazysizes": "^5.3.2",
@ -51,24 +51,24 @@
"rxjs": "^7.8.0",
"screenfull": "^6.0.2",
"swiper": "^8.4.6",
"tslib": "^2.3.0",
"tslib": "^2.6.1",
"zone.js": "^0.13.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "^16.1.5",
"@angular-devkit/build-angular": "^16.1.8",
"@angular-eslint/builder": "^16.1.0",
"@angular-eslint/eslint-plugin": "^16.1.0",
"@angular-eslint/eslint-plugin-template": "^16.1.0",
"@angular-eslint/schematics": "^16.1.0",
"@angular-eslint/template-parser": "^16.1.0",
"@angular/cli": "^16.1.5",
"@angular/compiler-cli": "^16.1.6",
"@ngneat/transloco-optimize": "^3.0.2",
"@angular/cli": "^16.1.8",
"@angular/compiler-cli": "^16.1.8",
"@ngneat/transloco-optimize": "^5.0.2",
"@types/d3": "^7.4.0",
"@types/node": "^20.4.4",
"@typescript-eslint/eslint-plugin": "^6.1.0",
"@typescript-eslint/parser": "^6.1.0",
"eslint": "^8.45.0",
"@types/node": "^20.4.8",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
"eslint": "^8.46.0",
"karma-coverage": "~2.2.0",
"ts-node": "~10.9.1",
"typescript": "^5.1.6",

View File

@ -41,7 +41,7 @@ export class ErrorInterceptor implements HttpInterceptor {
break;
default:
// Don't throw multiple Something unexpected went wrong
const genericError = this.translocoService.translate('errors.generic');
let genericError = translate('errors.generic');
if (this.toastr.previousToastMessage !== 'Something unexpected went wrong.' && this.toastr.previousToastMessage !== genericError) {
this.toast(genericError);
}

View File

@ -1,5 +1,5 @@
<ng-container *transloco="let t; read: 'book-reader'">
<div class="container-flex {{darkMode ? 'dark-mode' : ''}} reader-container {{ColumnLayout}} {{WritingStyleClass}}" tabindex="0" #reader>
<div class="container-flex {{darkMode ? 'dark-mode' : ''}} reader-container {{ColumnLayout}} {{WritingStyleClass}}" tabindex="0" #reader>
<ng-container *transloco="let t; read: 'book-reader'">
<div class="fixed-top" #stickyTop>
<a class="visually-hidden-focusable focus-visible" href="javascript:void(0);" (click)="moveFocus()">{{t('skip-header')}}</a>
<ng-container [ngTemplateOutlet]="actionBar"></ng-container>
@ -141,8 +141,8 @@
</div>
</ng-container>
<ng-template #showTitle>
<span *ngIf="incognitoMode" (click)="turnOffIncognito()" role="button" [attr.aria-label]="t('incognito-mode-alt')">
(<i class="fa fa-glasses" aria-hidden="true"></i><span class="visually-hidden">{{t('incognito-mode-label')}}</span>)</span>
<span *ngIf="incognitoMode" (click)="turnOffIncognito()" role="button" [attr.aria-label]="t('incognito-mode-alt')">
(<i class="fa fa-glasses" aria-hidden="true"></i><span class="visually-hidden">{{t('incognito-mode-label')}}</span>)</span>
<span class="book-title-text ms-1" [ngbTooltip]="bookTitle">{{bookTitle}}</span>
</ng-template>
</div>
@ -154,6 +154,5 @@
</button>
</div>
</ng-template>
</div>
</ng-container>
</ng-container>
</div>

View File

@ -306,7 +306,7 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
@ViewChild('readingHtml', {static: false}) bookContentElemRef!: ElementRef<HTMLDivElement>;
@ViewChild('readingSection', {static: false}) readingSectionElemRef!: ElementRef<HTMLDivElement>;
@ViewChild('stickyTop', {static: false}) stickyTopElemRef!: ElementRef<HTMLDivElement>;
@ViewChild('reader', {static: true}) reader!: ElementRef;
@ViewChild('reader', {static: false}) reader!: ElementRef;
get BookPageLayoutMode() {
@ -855,7 +855,7 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
promptForPage() {
const question = 'There are ' + (this.maxPages - 1) + ' pages. What page do you want to go to?';
const question = translate('book-reader.go-to-page-prompt', {totalPages: this.maxPages - 1});
const goToPageNum = window.prompt(question, '');
if (goToPageNum === null || goToPageNum.trim().length === 0) { return null; }
return goToPageNum;
@ -1597,6 +1597,4 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy {
refreshPersonalToC() {
this.refreshPToC.emit();
}
protected readonly undefined = undefined;
}

View File

@ -24,6 +24,30 @@ import {RelationshipPipe} from "../../pipe/relationship.pipe";
import {Device} from "../../_models/device/device";
import {TranslocoService} from "@ngneat/transloco";
function deepClone(obj: any): any {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (obj instanceof Array) {
return obj.map(item => deepClone(item));
}
const clonedObj: any = {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
clonedObj[key] = deepClone(obj[key]);
} else {
clonedObj[key] = obj[key];
}
}
}
return clonedObj;
}
@Component({
selector: 'app-series-card',
standalone: true,
@ -85,11 +109,12 @@ export class SeriesCardComponent implements OnInit, OnChanges {
ngOnChanges(changes: any) {
if (this.data) {
this.actions = this.actionFactoryService.getSeriesActions((action: ActionItem<Series>, series: Series) => this.handleSeriesActionCallback(action, series));
this.actions = [...this.actionFactoryService.getSeriesActions((action: ActionItem<Series>, series: Series) => this.handleSeriesActionCallback(action, series))];
if (this.isOnDeck) {
const othersIndex = this.actions.findIndex(obj => obj.title === 'others');
if (this.actions[othersIndex].children.findIndex(o => o.action === Action.RemoveFromOnDeck) < 0) {
this.actions[othersIndex].children.push({
const othersAction = deepClone(this.actions[othersIndex]) as ActionItem<Series>;
if (othersAction.children.findIndex(o => o.action === Action.RemoveFromOnDeck) < 0) {
othersAction.children.push({
action: Action.RemoveFromOnDeck,
title: 'remove-from-on-deck',
callback: (action: ActionItem<Series>, series: Series) => this.handleSeriesActionCallback(action, series),
@ -97,6 +122,7 @@ export class SeriesCardComponent implements OnInit, OnChanges {
requiresAdmin: false,
children: [],
});
this.actions[othersIndex] = othersAction;
}
}
this.cdRef.markForCheck();

View File

@ -173,6 +173,7 @@ export class LibraryDetailComponent implements OnInit {
return;
}
this.seriesService.getSeries(seriesAdded.seriesId).subscribe(s => {
if (this.series.filter(sObj => s.id === sObj.id).length > 0) return;
this.series = [...this.series, s].sort((s1: Series, s2: Series) => {
if (s1.sortName < s2.sortName) return -1;
if (s1.sortName > s2.sortName) return 1;

View File

@ -1497,7 +1497,8 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy {
// This is menu only code
promptForPage() {
const goToPageNum = window.prompt('There are ' + this.maxPages + ' pages. What page would you like to go to?', '');
const question = translate('book-reader.go-to-page-prompt', {totalPages: this.maxPages});
const goToPageNum = window.prompt(question, '');
if (goToPageNum === null || goToPageNum.trim().length === 0) { return null; }
return goToPageNum;
}

View File

@ -7,8 +7,8 @@
<div class="d-flex list-container">
<div class="me-3 align-middle">
<div style="padding-top: 40px">
<label for="reorder-{{i}}" class="form-label visually-hidden">{{t('reorder')}}</label>
<input *ngIf="accessibilityMode" id="reorder-{{i}}" class="form-control" type="number" inputmode="numeric" min="0" [max]="items.length - 1" [value]="i" style="width: 60px"
<label for="reorder-{{i}}" class="form-label visually-hidden">{{t('reorder-label')}}</label>
<input *ngIf="accessibilityMode" id="reorder-{{i}}" class="form-control" type="number" inputmode="numeric" min="0" [max]="items.length - 1" [value]="item.order" style="width: 60px"
(focusout)="updateIndex(i, item)" (keydown.enter)="updateIndex(i, item)" aria-describedby="instructions">
</div>
</div>

View File

@ -1,18 +1,27 @@
import { HttpClient } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import {DestroyRef, inject, Inject, Injectable} from '@angular/core';
import { Series } from 'src/app/_models/series';
import { environment } from 'src/environments/environment';
import { ConfirmService } from '../confirm.service';
import { Chapter } from 'src/app/_models/chapter';
import { Volume } from 'src/app/_models/volume';
import { asyncScheduler, BehaviorSubject, Observable, tap, finalize, of, filter } from 'rxjs';
import {
asyncScheduler,
BehaviorSubject,
Observable,
tap,
finalize,
of,
filter,
} from 'rxjs';
import { SAVER, Saver } from '../_providers/saver.provider';
import { download, Download } from '../_models/download';
import { PageBookmark } from 'src/app/_models/readers/page-bookmark';
import { switchMap, takeWhile, throttleTime } from 'rxjs/operators';
import {switchMap, take, takeWhile, throttleTime} from 'rxjs/operators';
import { AccountService } from 'src/app/_services/account.service';
import { BytesPipe } from 'src/app/pipe/bytes.pipe';
import {translate} from "@ngneat/transloco";
import {takeUntilDestroyed} from "@angular/core/rxjs-interop";
export const DEBOUNCE_TIME = 100;
@ -42,6 +51,7 @@ export type DownloadEntityType = 'volume' | 'chapter' | 'series' | 'bookmark' |
*/
export type DownloadEntity = Series | Volume | Chapter | PageBookmark[] | undefined;
@Injectable({
providedIn: 'root'
})
@ -56,10 +66,12 @@ export class DownloadService {
private downloadsSource: BehaviorSubject<DownloadEvent[]> = new BehaviorSubject<DownloadEvent[]>([]);
public activeDownloads$ = this.downloadsSource.asObservable();
private readonly destroyRef = inject(DestroyRef);
constructor(private httpClient: HttpClient, private confirmService: ConfirmService,
@Inject(SAVER) private save: Saver, private accountService: AccountService) { }
/**
* Returns the entity subtitle (for the event widget) for a given entity
* @param downloadEntityType
@ -117,7 +129,7 @@ export class DownloadService {
}
this.accountService.currentUser$.pipe(switchMap(user => {
this.accountService.currentUser$.pipe(take(1), switchMap(user => {
if (user && user.preferences.promptForDownloadSize) {
return sizeCheckCall;
}
@ -138,7 +150,8 @@ export class DownloadService {
finalize(() => {
if (callback) callback(undefined);
}))
})).subscribe(() => {});
}), takeUntilDestroyed(this.destroyRef)
).subscribe(() => {});
}
private downloadSeriesSize(seriesId: number) {

View File

@ -15,7 +15,7 @@ export class DevicePlatformPipe implements PipeTransform {
case DevicePlatform.Kindle: return 'Kindle';
case DevicePlatform.Kobo: return 'Kobo';
case DevicePlatform.PocketBook: return 'PocketBook';
case DevicePlatform.Custom: return this.translocoService.translate('device.platform-pipe.custom');
case DevicePlatform.Custom: return this.translocoService.translate('device-platform-pipe.custom');
default: return value + '';
}
}

File diff suppressed because it is too large Load Diff

View File

@ -615,8 +615,8 @@
"incognito-mode-alt": "Incognito mode is on. Toggle to turn off.",
"incognito-mode-label": "Incognito Mode",
"next": "Next",
"previous": "Previous"
"previous": "Previous",
"go-to-page-prompt": "There are {{totalPages}} pages. What page do you want to go to?"
},
"personal-table-of-contents": {
@ -1474,7 +1474,8 @@
"layout-mode-switched": "Layout mode switched to Single due to insufficient space to render double layout",
"no-next-chapter": "No Next Chapter",
"no-prev-chapter": "No Previous Chapter",
"user-preferences-updated": "User preferences updated"
"user-preferences-updated": "User preferences updated",
"emulate-comic-book-label": "{{user-preferences.emulate-comic-book-label}}"
},
"metadata-filter": {
@ -1787,7 +1788,8 @@
"details": "Details",
"view-series": "View Series",
"clear": "Clear",
"import-cbl": "Import CBL"
"import-cbl": "Import CBL",
"read": "Read"
},
"preferences": {

View File

@ -405,5 +405,11 @@
"chapter-missing": "{{series}}: Capítulo {{chapter}} no presente en Kavita. Este item será saltado.",
"empty-file": "El archivo CBL está vacío. Ninguna acción realizada.",
"name-conflict": "Una lista de lectura que coincide con el archivo CBL ({{readingListName}}) ya existe en tu cuenta."
},
"library-type-pipe": {
"manga": "Manga"
},
"age-rating-pipe": {
"unknown": "Desconocido"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@
"chapter-read": "",
"score-updated": "",
"want-to-read-add": "読みたい:追加",
"want-to-read-remove": "",
"want-to-read-remove": "読みたい:消除",
"review": ""
},
"spoiler": {
@ -56,7 +56,7 @@
"review-series-modal": {
"title": "",
"tagline-label": "",
"review-label": "",
"review-label": "レビュー",
"close": "",
"save": ""
},
@ -69,7 +69,7 @@
"review-card": {
"your-review": "",
"external-review": "",
"local-review": "",
"local-review": "レビュー",
"rating-percentage": ""
},
"want-to-read": {
@ -239,7 +239,7 @@
"save": ""
},
"api-key": {
"copy": "",
"copy": "コピー",
"regen-warning": "",
"no-key": "",
"confirm-reset": "",
@ -312,7 +312,7 @@
"path-placeholder": "",
"instructions": "",
"type-header": "",
"name-header": "",
"name-header": "名前",
"cancel": "",
"share": "",
"help": ""
@ -339,13 +339,13 @@
"custom": ""
},
"day-of-week-pipe": {
"monday": "",
"tuesday": "",
"wednesday": "",
"thursday": "",
"friday": "",
"saturday": "",
"sunday": ""
"monday": "月曜日",
"tuesday": "火曜日",
"wednesday": "水曜日",
"thursday": "木曜日",
"friday": "金曜日",
"saturday": "土曜日",
"sunday": "日曜日"
},
"cbl-import-result-pipe": {
"success": "",
@ -388,9 +388,9 @@
"adaptation": "",
"alternative-setting": "",
"alternative-version": "",
"character": "",
"character": "キャラクター",
"contains": "",
"doujinshi": "",
"doujinshi": "同人誌",
"other": "",
"prequel": "",
"sequel": "",
@ -540,7 +540,7 @@
"next-chapter": "",
"skip-header": "",
"virtual-pages": "",
"settings-header": "",
"settings-header": "設定",
"table-of-contents-header": "",
"bookmarks-header": "",
"toc-header": "",
@ -548,7 +548,7 @@
"go-back": "",
"incognito-mode-alt": "",
"incognito-mode-label": "",
"next": "",
"next": "次へ",
"previous": ""
},
"personal-table-of-contents": {
@ -583,7 +583,7 @@
"password-validation": ""
},
"register": {
"title": "",
"title": "登録",
"description": "",
"username-label": "",
"email-label": "",
@ -609,7 +609,7 @@
"add-to-want-to-read": "",
"edit-series-alt": "",
"download-series--tooltip": "",
"downloading-status": "",
"downloading-status": "ダウンロード中。。。",
"user-reviews-alt": "",
"storyline-tab": "",
"books-tab": "",
@ -1472,7 +1472,7 @@
"title": "",
"visualisation-label": "",
"data-table-label": "",
"year-header": "",
"year-header": "",
"count-header": ""
},
"server-stats": {
@ -1601,7 +1601,7 @@
"refresh-covers": "",
"analyze-files": "",
"settings": "",
"edit": "",
"edit": "編集",
"mark-as-read": "",
"mark-as-unread": "",
"scan-series": "",
@ -1613,8 +1613,8 @@
"add-to-reading-list": "",
"add-to-collection": "",
"send-to": "",
"delete": "",
"download": "",
"delete": "削除",
"download": "ダウンロード",
"read-incognito": "",
"details": "",
"view-series": "",
@ -1670,7 +1670,7 @@
"submit": "",
"email": "",
"read": "",
"loading": "",
"loading": "読み込み中。。。",
"username": "",
"password": "",
"promoted": "",

File diff suppressed because it is too large Load Diff

View File

@ -140,211 +140,211 @@
"margin-book-label": "Marge",
"margin-book-tooltip": "Hoeveel ruimte aan elke kant van het scherm. Dit overschrijft naar 0 op mobiele apparaten, ongeacht deze instelling.",
"clients-opds-alert": "OPDS is niet ingeschakeld op deze server. Dit heeft geen invloed op Tachiyomi-gebruikers.",
"clients-opds-description": "",
"clients-api-key-tooltip": "",
"clients-opds-url-tooltip": "",
"reset": "",
"save": ""
"clients-opds-description": "Alle externe clients gebruiken de API-sleutel of de onderstaande verbindings-URL. Dit zijn net wachtwoorden, houd het privé.",
"clients-api-key-tooltip": "De API-sleutel is als een wachtwoord. Houd het geheim, houd het veilig.",
"clients-opds-url-tooltip": "OPDS URL",
"reset": "{{common.reset}}",
"save": "{{common.save}}"
},
"user-holds": {
"title": "",
"title": "Scrobble Holds",
"description": ""
},
"theme-manager": {
"title": "",
"looking-for-theme": "",
"looking-for-theme-continued": "",
"scan": "",
"site-themes": "",
"set-default": "",
"apply": "",
"applied": "",
"updated-toastr": "",
"scan-queued": ""
"title": "Thema Beheerder",
"looking-for-theme": "Op zoek naar een licht of e-inkt thema? We hebben enkele aangepaste thema's die u kunt gebruiken ",
"looking-for-theme-continued": "thema github.",
"scan": "Scan",
"site-themes": "Site Thema's",
"set-default": "Stel de standaard in",
"apply": "{{common.apply}}",
"applied": "Toegepast",
"updated-toastr": "Sitestandaard is bijgewerkt naar {{name}}",
"scan-queued": "Er is een sitethema-scan in de wachtrij geplaatst"
},
"restriction-selector": {
"title": "",
"description": "",
"not-applicable-for-admins": "",
"age-rating-label": "",
"no-restriction": "",
"include-unknowns-label": "",
"include-unknowns-tooltip": ""
"title": "Beperking leeftijdsclassificatie",
"description": "Indien geselecteerd, worden alle series en leeslijsten met ten minste één item dat groter is dan de geselecteerde beperking, uit de resultaten verwijderd.",
"not-applicable-for-admins": "Dit is niet van toepassing op beheerders.",
"age-rating-label": "Leeftijdsclassificatie",
"no-restriction": "Geen beperkingen",
"include-unknowns-label": "Inclusief onbekenden",
"include-unknowns-tooltip": "Als dit waar is, zijn onbekenden toegestaan met leeftijdsbeperking. Dit kan ertoe leiden dat niet-gecodeerde media uitlekken naar gebruikers met leeftijdsbeperkingen."
},
"site-theme-provider-pipe": {
"system": "",
"user": ""
"system": "Systeem",
"user": "Gebruiker"
},
"manage-devices": {
"title": "",
"description": "",
"devices-title": "",
"no-devices": "",
"platform-label": "",
"email-label": "",
"add": "",
"title": "Apparaat beheerder",
"description": "Deze sectie is bedoeld voor het instellen van apparaten die geen verbinding kunnen maken met Kavita via een webbrowser en in plaats daarvan een e-mailadres hebben dat bestanden accepteert.",
"devices-title": "Apparaten",
"no-devices": "Er zijn nog geen apparaten ingesteld",
"platform-label": "Platform: ",
"email-label": "Email: ",
"add": "{{common.add}}",
"delete": "{{common.delete}}",
"edit": "{{common.edit}}"
},
"edit-device": {
"device-name-label": "",
"email-label": "",
"email-tooltip": "",
"device-platform-label": "",
"save": "",
"required-field": "",
"valid-email": ""
"device-name-label": "Apparaat naam",
"email-label": "{{common.email}}",
"email-tooltip": "Dit e-mailadres wordt gebruikt om het bestand via Verzenden naar te accepteren",
"device-platform-label": "Apparaatplatform",
"save": "{{common.save}}",
"required-field": "{{validation.required-field}}",
"valid-email": "{{validation.valid-email}}"
},
"change-password": {
"password-label": "",
"current-password-label": "",
"new-password-label": "",
"confirm-password-label": "",
"reset": "",
"edit": "",
"cancel": "",
"save": "",
"required-field": "",
"passwords-must-match": "",
"permission-error": ""
"password-label": "{{common.password}}",
"current-password-label": "Huidig wachtwoord",
"new-password-label": "Nieuw Wachtwoord",
"confirm-password-label": "Bevestig wachtwoord",
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}",
"required-field": "{{validation.required-field}}",
"passwords-must-match": "Wachtwoorden moeten overeenkomen",
"permission-error": "U heeft geen toestemming om uw wachtwoord te wijzigen. Neem contact op met de beheerder van de server."
},
"change-email": {
"email-label": "",
"current-password-label": "",
"email-not-confirmed": "",
"email-updated-title": "",
"email-updated-description": "",
"setup-user-account": "",
"invite-url-label": "",
"invite-url-tooltip": "",
"permission-error": "",
"required-field": "",
"reset": "",
"edit": "",
"cancel": "",
"save": ""
"email-label": "{{common.email}}",
"current-password-label": "Huidig paswoord",
"email-not-confirmed": "Deze e-mail is niet bevestigd",
"email-updated-title": "E-mail bijgewerkt",
"email-updated-description": "U kunt de volgende link hieronder gebruiken om de e-mail voor uw account te bevestigen. Als uw server extern toegankelijk is, is er een e-mail naar de e-mail verzonden en kan de link worden gebruikt om de e-mail te bevestigen.",
"setup-user-account": "Gebruikersaccount instellen",
"invite-url-label": "Uitnodigings-URL",
"invite-url-tooltip": "Kopieer dit en plak in een nieuw tabblad",
"permission-error": "U heeft geen toestemming om uw e-mailadres te wijzigen. Neem contact op met de beheerder van de server.",
"required-field": "{{validation.required-field}}",
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"change-age-restriction": {
"age-restriction-label": "",
"unknowns": "",
"reset": "",
"edit": "",
"cancel": "",
"save": ""
"age-restriction-label": "Leeftijdsbeperking",
"unknowns": "Onbekenden",
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"api-key": {
"copy": "",
"regen-warning": "",
"no-key": "",
"confirm-reset": "",
"key-reset": ""
"copy": "Kopie",
"regen-warning": "Door uw API-sleutel opnieuw te genereren, worden alle bestaande clients ongeldig.",
"no-key": "FOUT - SLEUTEL NIET INGESTELD",
"confirm-reset": "Hierdoor worden alle OPDS-configuraties die u hebt ingesteld, ongeldig. Weet je zeker dat je door wilt gaan?",
"key-reset": "API-sleutel reset"
},
"scrobbling-providers": {
"title": "",
"requires": "",
"token-expired": "",
"no-token-set": "",
"token-set": "",
"generate": "",
"instructions": "",
"token-input-label": "",
"edit": "",
"cancel": "",
"save": ""
"requires": "Voor deze functie is een actieve {{product}} licentie vereist",
"token-expired": "Token verlopen",
"no-token-set": "Geen Token Ingesteld",
"token-set": "Token Ingesteld",
"generate": "Genereer",
"instructions": "Nieuwe gebruikers moeten hieronder op \"{{scrobbling-providers.generate}}\" klikken om Kavita+ toe te staan te praten met {{service}}. Nadat u het programma hebt geautoriseerd, kopieert en plakt u het token in de onderstaande invoer. U kunt uw token op elk moment opnieuw genereren.",
"token-input-label": "{{service}} Token komt hier",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"typeahead": {
"locked-field": "",
"close": "",
"loading": "",
"add-item": "",
"no-data": "",
"add-custom-item": ""
"locked-field": "Veld is vergrendeld",
"close": "{{common.close}}",
"loading": "{{common.loading}}",
"add-item": "{{item}} toevoegen…",
"no-data": "Geen data",
"add-custom-item": ", typ om een gepersonaliseerd item toe te voegen"
},
"generic-list-modal": {
"close": "",
"clear": "",
"filter": "",
"open-filtered-search": ""
"close": "{{common.close}}",
"clear": "Wissen",
"filter": "Filter",
"open-filtered-search": "Open een gefilterde zoekopdracht voor {{item}}"
},
"user-stats-info-cards": {
"total-pages-read-label": "",
"total-pages-read-tooltip": "",
"total-words-read-label": "",
"total-words-read-tooltip": "",
"time-spent-reading-label": "",
"time-spent-reading-tooltip": "",
"chapters-read-label": "",
"chapters-read-tooltip": "",
"avg-reading-per-week-label": "",
"last-active-label": "",
"chapters": ""
"total-pages-read-label": "Totaal pagina's gelezen",
"total-pages-read-tooltip": "{{user-stats-info-cards.total-pages-read-label}}: {{value}}",
"total-words-read-label": "Totaal gelezen woorden",
"total-words-read-tooltip": "{{user-stats-info-cards.total-words-read-label}}: {{value}}",
"time-spent-reading-label": "Tijd besteed aan lezen",
"time-spent-reading-tooltip": "{{user-stats-info-cards.time-spent-reading-label}}: {{value}}",
"chapters-read-label": "Hoofdstukken gelezen",
"chapters-read-tooltip": "{{user-stats-info-cards.chapters-read-label}}: {{value}}",
"avg-reading-per-week-label": "Gemiddelde lezing / week",
"last-active-label": "Laatst actief",
"chapters": "{{value}} hoofdstukken"
},
"user-stats": {
"library-read-progress-title": "",
"read-percentage": ""
"library-read-progress-title": "Leesvoortgang bibliotheek",
"read-percentage": "% gelezen"
},
"top-readers": {
"title": "",
"time-selection-label": "",
"comics-label": "",
"manga-label": "",
"books-label": "",
"this-week": "",
"last-7-days": "",
"last-30-days": "",
"last-90-days": "",
"last-year": "",
"all-time": ""
"title": "Toplezers",
"time-selection-label": "Tijdsbestek",
"comics-label": "Strips: {{value}} uur",
"manga-label": "Manga: {{value}} uur",
"books-label": "Boeken: {{value}} uur",
"this-week": "{{time-periods.this-week}}",
"last-7-days": "{{time-periods.last-7-days}}",
"last-30-days": "{{time-periods.last-30-days}}",
"last-90-days": "{{time-periods.last-90-days}}",
"last-year": "{{time-periods.last-year}}",
"all-time": "{{time-periods.all-time}}"
},
"role-selector": {
"title": ""
"title": "Rollen"
},
"directory-picker": {
"title": "",
"close": "",
"path-label": "",
"path-placeholder": "",
"instructions": "",
"type-header": "",
"name-header": "",
"cancel": "",
"share": "",
"help": ""
"title": "Kies een map",
"close": "{{common.close}}",
"path-label": "Pad",
"path-placeholder": "Begin met typen of selecteer pad",
"instructions": "Selecteer een map om breadcrumb te bekijken. Zie je je directory niet? Probeer eerst / te controleren.",
"type-header": "Type",
"name-header": "Naam",
"cancel": "{{common.cancel}}",
"share": "Deel",
"help": "{{common.help}}"
},
"library-access-modal": {
"select-all": "",
"deselect-all": "",
"title": "",
"close": "",
"reset": "",
"cancel": "",
"save": "",
"no-data": ""
"select-all": "{{common.select-all}}",
"deselect-all": "{{common.deselect-all}}",
"title": "Bibliotheek toegang",
"close": "{{common.close}}",
"reset": "{{common.reset}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}",
"no-data": "Er zijn nog geen bibliotheken ingesteld."
},
"time-periods": {
"this-week": "",
"last-7-days": "",
"last-30-days": "",
"last-90-days": "",
"last-year": "",
"all-time": ""
"this-week": "Deze Week",
"last-7-days": "Laatste 7 dagen",
"last-30-days": "Laatste 30 dagen",
"last-90-days": "Laatste 90 dagen",
"last-year": "Vorig jaar",
"all-time": "Altijd"
},
"device-platform-pipe": {
"custom": ""
"custom": "Op maat"
},
"day-of-week-pipe": {
"monday": "",
"tuesday": "",
"wednesday": "",
"thursday": "",
"friday": "",
"saturday": "",
"sunday": ""
"monday": "Maandag",
"tuesday": "Dinsdag",
"wednesday": "Woensdag",
"thursday": "Donderdag",
"friday": "Vrijdag",
"saturday": "Zaterdag",
"sunday": "Zondag"
},
"cbl-import-result-pipe": {
"success": "",
"partial": "",
"failure": ""
"success": "Succes",
"partial": "Gedeeltelijk",
"failure": "Mislukt"
},
"cbl-conflict-reason-pipe": {
"all-series-missing": "",
@ -1627,5 +1627,11 @@
"issue-num": "",
"chapter-num": "",
"volume-num": ""
},
"theme": {
"theme-dark": "Donker",
"theme-black": "Zwart",
"theme-paper": "Papier",
"theme-white": "Wit"
}
}

View File

@ -12,166 +12,166 @@
"server-settings-link": "Definições do servidor",
"not-granted": "Não lhe foi atribuído acesso a nenhuma biblioteca.",
"on-deck-title": "",
"recently-updated-title": "",
"recently-added-title": ""
"recently-updated-title": "Séries Atualizadas Recentemente",
"recently-added-title": "Séries Adicionadas Recentemente"
},
"edit-user": {
"edit": "",
"close": "",
"username": "",
"required": "",
"email": "",
"not-valid-email": "",
"cancel": "",
"saving": "",
"update": ""
"edit": "{{common.edit}}",
"close": "{{common.close}}",
"username": "{{common.username}}",
"required": "{{validation.required-field}}",
"email": "{{common.email}}",
"not-valid-email": "{{validation.valid-email}}",
"cancel": "{{common.cancel}}",
"saving": "A Guardar…",
"update": "Atualizar"
},
"user-scrobble-history": {
"title": "",
"description": "",
"filter-label": "",
"created-header": "",
"last-modified-header": "",
"type-header": "",
"series-header": "",
"data-header": "",
"is-processed-header": "",
"no-data": "",
"volume-and-chapter-num": "",
"rating": "",
"not-applicable": "",
"processed": "",
"not-processed": ""
"filter-label": "Filtro",
"created-header": "Criado",
"last-modified-header": "Última alteração",
"type-header": "Tipo",
"series-header": "Séries",
"data-header": "Dados",
"is-processed-header": "Processado",
"no-data": "Sem Dados",
"volume-and-chapter-num": "Volume {{v}} Capítulo {{n}}",
"rating": "Classificação {{r}}",
"not-applicable": "Não Aplicável",
"processed": "Processado",
"not-processed": "Não Processado"
},
"scrobble-event-type-pipe": {
"chapter-read": "",
"score-updated": "",
"score-updated": "Atualização de Classificação",
"want-to-read-add": "",
"want-to-read-remove": "",
"review": ""
"review": "Atualização de crítica"
},
"spoiler": {
"click-to-show": ""
},
"review-series-modal": {
"title": "",
"title": "Editar Crítica",
"tagline-label": "",
"review-label": "",
"close": "",
"save": ""
"review-label": "Crítica",
"close": "{{common.close}}",
"save": "{{common.save}}"
},
"review-card-modal": {
"close": "",
"user-review": "",
"external-mod": "",
"go-to-review": ""
"close": "{{common.close}}",
"user-review": "Crítica de {{username}}",
"external-mod": "(externo/a)",
"go-to-review": "Ir Para Crítica"
},
"review-card": {
"your-review": "",
"external-review": "",
"local-review": "",
"rating-percentage": ""
"your-review": "Esta é a sua crítica",
"external-review": "Crítica externa",
"local-review": "Crítica",
"rating-percentage": "Classificação {{r}}%"
},
"want-to-read": {
"title": "",
"series-count": "",
"no-items": "",
"no-items-filtered": ""
"title": "Leituras Futuras",
"series-count": "{{common.series-count}}",
"no-items": "Não existem itens. Tente adicionar uma série.",
"no-items-filtered": "Não existem itens para o filtro atual."
},
"user-preferences": {
"title": "",
"pref-description": "",
"account-tab": "",
"preferences-tab": "",
"3rd-party-clients-tab": "",
"theme-tab": "",
"devices-tab": "",
"stats-tab": "",
"pref-description": "Estas definições globais estão ligadas à sua conta.",
"account-tab": "Conta",
"preferences-tab": "Preferências",
"3rd-party-clients-tab": "Clientes de Terceiros",
"theme-tab": "Tema",
"devices-tab": "Dispositivos",
"stats-tab": "Estatísticas",
"scrobbling-tab": "",
"success-toast": "",
"global-settings-title": "",
"success-toast": "Preferências de utilizador atualizadas",
"global-settings-title": "Definições globais",
"page-layout-mode-label": "",
"page-layout-mode-tooltip": "",
"locale-label": "",
"locale-tooltip": "",
"blur-unread-summaries-label": "",
"blur-unread-summaries-tooltip": "",
"prompt-on-download-label": "",
"prompt-on-download-tooltip": "",
"disable-animations-label": "",
"disable-animations-tooltip": "",
"collapse-series-relationships-label": "",
"locale-tooltip": "O idiota que o Kavita deve usar",
"blur-unread-summaries-label": "Ofuscar sumários não lidos",
"blur-unread-summaries-tooltip": "Ofusca o sumário em volumes ou capítulos que não tenham leitura em curso (para evitar spoilers)",
"prompt-on-download-label": "Aviso nos Downloads",
"prompt-on-download-tooltip": "Aviso quando um download excede {{size}}MB de tamanho",
"disable-animations-label": "Desabilitar animações",
"disable-animations-tooltip": "Desligar animações no site. Útil para leitores e-ink.",
"collapse-series-relationships-label": "Colapsar Relações de Séries",
"collapse-series-relationships-tooltip": "",
"share-series-reviews-label": "",
"share-series-reviews-tooltip": "",
"share-series-reviews-label": "Partilhar Críticas de Séries",
"share-series-reviews-tooltip": "As suas críticas de Séries devem ser incluídas para outros utilizadores pelo Kavita",
"image-reader-settings-title": "",
"reading-direction-label": "",
"reading-direction-label": "Direção de Leitura",
"reading-direction-tooltip": "",
"scaling-option-label": "",
"scaling-option-tooltip": "",
"scaling-option-label": "Opções de Dimensionamento",
"scaling-option-tooltip": "Como adaptar a dimensão da imagem ao seu ecrã.",
"page-splitting-label": "",
"page-splitting-tooltip": "",
"reading-mode-label": "",
"reading-mode-label": "Modo de Leitura",
"layout-mode-label": "",
"layout-mode-tooltip": "",
"background-color-label": "",
"auto-close-menu-label": "",
"background-color-label": "Cor de Fundo",
"auto-close-menu-label": "Fechar Menu Automaticamente",
"show-screen-hints-label": "",
"emulate-comic-book-label": "",
"swipe-to-paginate-label": "",
"book-reader-settings-title": "",
"tap-to-paginate-label": "",
"tap-to-paginate-tooltip": "",
"immersive-mode-label": "",
"immersive-mode-label": "Modo Imersivo",
"immersive-mode-tooltip": "",
"reading-direction-book-label": "",
"reading-direction-book-label": "Direção de Leitura",
"reading-direction-book-tooltip": "",
"font-family-label": "",
"font-family-tooltip": "",
"writing-style-label": "",
"writing-style-tooltip": "",
"writing-style-tooltip": "Muda a direção do texto. Horizontal é da esquerda para direita, vertical é do topo para o fundo.",
"layout-mode-book-label": "",
"layout-mode-book-tooltip": "",
"color-theme-book-label": "",
"color-theme-book-label": "Tema de Cor",
"color-theme-book-tooltip": "",
"font-size-book-label": "",
"line-height-book-label": "",
"line-height-book-tooltip": "",
"margin-book-label": "",
"margin-book-tooltip": "",
"clients-opds-alert": "",
"clients-opds-description": "",
"clients-api-key-tooltip": "",
"clients-opds-url-tooltip": "",
"reset": "",
"save": ""
"line-height-book-label": "Espaçamento Entre Linhas",
"line-height-book-tooltip": "Quanto espaçamento entre as linhas do livro",
"margin-book-label": "Margem",
"margin-book-tooltip": "Espaçamento em cada lado do ecrã. Nos dispositivos móveis o valor desta definição será sempre substituído por 0.",
"clients-opds-alert": "O OPDS não está habilitado neste servidor. Isto não irá afectar os utilizadores do Tachiyomi.",
"clients-opds-description": "Todos os clientes de terceiros utilizarão a chave de API ou URL abaixo. Estes elementos são semelhantes a palavras passe, mantenha-os privados.",
"clients-api-key-tooltip": "A chave de API é como uma palavra passe. Mantenha-a privada e em segurança.",
"clients-opds-url-tooltip": "URL OPDS",
"reset": "{{common.reset}}",
"save": "{{common.save}}"
},
"user-holds": {
"title": "",
"description": ""
},
"theme-manager": {
"title": "",
"looking-for-theme": "",
"looking-for-theme-continued": "",
"title": "Gestor de Temas",
"looking-for-theme": "À procura de um tema 'light' ou e-ink? Pode encontrar alguns temas customizados no nosso ",
"looking-for-theme-continued": "github de temas.",
"scan": "",
"site-themes": "",
"set-default": "",
"apply": "",
"site-themes": "Temas do Site",
"set-default": "Tema Por Defeito",
"apply": "{{common.apply}}",
"applied": "",
"updated-toastr": "",
"updated-toastr": "O tema por defeito do site foi atualizado para {{name}}",
"scan-queued": ""
},
"theme": {
"theme-dark": "",
"theme-black": "",
"theme-paper": "",
"theme-white": ""
"theme-dark": "Escuro",
"theme-black": "Preto",
"theme-paper": "Papel",
"theme-white": "Branco"
},
"restriction-selector": {
"title": "",
"description": "",
"not-applicable-for-admins": "",
"description": "Quando selecionado, todas as séries e listas de leitura, que tenham pelo menos um elemento que seja superior à restrição selecionada, serão removidas dos resultados.",
"not-applicable-for-admins": "Não aplicável a administradores.",
"age-rating-label": "",
"no-restriction": "",
"include-unknowns-label": "",
@ -206,70 +206,70 @@
"current-password-label": "",
"new-password-label": "",
"confirm-password-label": "",
"reset": "",
"edit": "",
"cancel": "",
"save": "",
"required-field": "",
"passwords-must-match": "",
"permission-error": ""
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}",
"required-field": "{{validation.required-field}}",
"passwords-must-match": "As palavras passe têm de ser iguais",
"permission-error": "Não tem permissões para alterar a sua palavra passe. Contacte o administrador do servidor."
},
"change-email": {
"email-label": "",
"current-password-label": "",
"email-not-confirmed": "",
"email-updated-title": "",
"email-updated-description": "",
"setup-user-account": "",
"invite-url-label": "",
"invite-url-tooltip": "",
"permission-error": "",
"required-field": "",
"reset": "",
"edit": "",
"cancel": "",
"save": ""
"email-label": "{{common.email}}",
"current-password-label": "Palavra Passe Atual",
"email-not-confirmed": "Este email não está confirmado",
"email-updated-title": "Email Atualizado",
"email-updated-description": "Pode usar o link abaixo para confirmar o endereço de email da sua conta. Se o seu servidor tiver acesso externo, um email terá sido enviado para o seu endereço e o link pode ser usado para confirmar o endereço.",
"setup-user-account": "Configurar conta de utilizador",
"invite-url-label": "Url de Convite",
"invite-url-tooltip": "Copie e cole o url numa nova aba",
"permission-error": "Não tem permissões para alterar o seu email. Contacte o administrador do servidor.",
"required-field": "{{validation.required-field}}",
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"change-age-restriction": {
"age-restriction-label": "",
"unknowns": "",
"reset": "",
"edit": "",
"cancel": "",
"save": ""
"age-restriction-label": "Restrição Etária",
"unknowns": "Desconhecidos",
"reset": "{{common.reset}}",
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"api-key": {
"copy": "",
"regen-warning": "",
"copy": "Copiar",
"regen-warning": "Se recriar a chave da API, os clientes de terceiros existentes deixarão de ter acesso.",
"no-key": "",
"confirm-reset": "",
"key-reset": ""
"confirm-reset": "Isto irá invalidar todas as configurações OPDS. Tem a certeza que deseja continuar?",
"key-reset": "Repor chave da API"
},
"scrobbling-providers": {
"title": "",
"requires": "",
"token-expired": "",
"no-token-set": "",
"token-set": "",
"generate": "",
"requires": "Esta funcionalidade requer uma licença {{product}} ativa",
"token-expired": "Token Expirado",
"no-token-set": "Token Não Definido",
"token-set": "Token Definido",
"generate": "Gerar",
"instructions": "",
"token-input-label": "",
"edit": "",
"cancel": "",
"save": ""
"edit": "{{common.edit}}",
"cancel": "{{common.cancel}}",
"save": "{{common.save}}"
},
"typeahead": {
"locked-field": "",
"close": "",
"loading": "",
"add-item": "",
"no-data": "",
"locked-field": "Campo bloqueado",
"close": "{{common.close}}",
"loading": "{{common.loading}}",
"add-item": "Adicionar {{item}}…",
"no-data": "Sem dados",
"add-custom-item": ""
},
"generic-list-modal": {
"close": "",
"clear": "",
"filter": "",
"close": "{{common.close}}",
"clear": "Limpar",
"filter": "Filtro",
"open-filtered-search": ""
},
"user-stats-info-cards": {

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,7 @@
},
"user-scrobble-history": {
"title": "ประวัติการทำ Scrobble",
"description": "",
"description": "ที่นี่คุณสามารถดูรายการ Scrobble ที่เกิดขึ้นภายใต้บัญชีคุณได้ โดยรายการจะเกิดขึ้นก็ต่อเมื่อคุณได้ตั้งค่า Scrobble เรียบร้อยแล้ว รายการต่างๆ จะถูกลบเมื่อผ่านไปหนึ่งเดือน ถ้ามีรายการที่ยังไม่ถูกประมวลผล นั่นหมายความว่าอาจเกิดปัญหาที่ต้นทาง กรุณาติดต่อผู้ดูแลระบบเพื่อแก้ไขปัญหานี้",
"filter-label": "ตัวกรอง",
"created-header": "สร้างแล้ว",
"last-modified-header": "แก้ไขล่าสุด",
@ -90,42 +90,42 @@
"scrobbling-tab": "การดึงข้อมูลภายนอก",
"success-toast": "อัปเดทการตั้งค่าแล้ว",
"global-settings-title": "ตั้งค่าส่วนกลาง",
"page-layout-mode-label": "",
"page-layout-mode-tooltip": "",
"locale-label": "",
"locale-tooltip": "",
"blur-unread-summaries-label": "",
"blur-unread-summaries-tooltip": "",
"prompt-on-download-label": "",
"prompt-on-download-tooltip": "",
"disable-animations-label": "",
"disable-animations-tooltip": "",
"collapse-series-relationships-label": "",
"collapse-series-relationships-tooltip": "",
"share-series-reviews-label": "",
"share-series-reviews-tooltip": "",
"image-reader-settings-title": "",
"reading-direction-label": "",
"reading-direction-tooltip": "",
"scaling-option-label": "",
"scaling-option-tooltip": "",
"page-splitting-label": "",
"page-splitting-tooltip": "",
"reading-mode-label": "",
"layout-mode-label": "",
"layout-mode-tooltip": "",
"background-color-label": "",
"auto-close-menu-label": "",
"show-screen-hints-label": "",
"emulate-comic-book-label": "",
"swipe-to-paginate-label": "",
"book-reader-settings-title": "",
"tap-to-paginate-label": "",
"tap-to-paginate-tooltip": "",
"immersive-mode-label": "",
"immersive-mode-tooltip": "",
"reading-direction-book-label": "",
"reading-direction-book-tooltip": "",
"page-layout-mode-label": "รูปแบบหน้าจอ",
"page-layout-mode-tooltip": "แสดงหนังสือในรูปแบบการ์ดหรือรายการบนหน้ารายละเอียดซีรีย์",
"locale-label": "ภาษา",
"locale-tooltip": "ภาษาที่ใช้งานบน Kavita",
"blur-unread-summaries-label": "เบลอบทสรุปที่ยังไม่ได้อ่าน",
"blur-unread-summaries-tooltip": "เบลอข้อความสรุปในเล่มหรือบทที่ไม่มีความคืบหน้าในการอ่าน (เพื่อหลีกเลี่ยงการสปอยล์)",
"prompt-on-download-label": "แจ้งเตือนเมื่อดาวน์โหลด",
"prompt-on-download-tooltip": "แจ้งเมื่อการดาวน์โหลดมีขนาดเกิน {{size}} MB",
"disable-animations-label": "ปิดการใช้งานแอนิเมชั่น",
"disable-animations-tooltip": "ปิดภาพเคลื่อนไหว ใช้งานได้ดีสำหรับผู้ใช้เครื่อง e-ink",
"collapse-series-relationships-label": "ยุบความสัมพันธ์ของซีรี่ส์",
"collapse-series-relationships-tooltip": "Kavita ควรแสดงซีรีส์ที่ไม่มีความสัมพันธ์หรือเป็นพาเรนต์/พรีเควล",
"share-series-reviews-label": "แบ่งปันบทวิจารณ์ซีรีส์",
"share-series-reviews-tooltip": "Kavita ควรรวมบทวิจารณ์ซีรี่ส์ของคุณสำหรับผู้ใช้รายอื่นหรือไม่",
"image-reader-settings-title": "โปรแกรมอ่านรูปภาพ",
"reading-direction-label": "ทิศทางการอ่าน",
"reading-direction-tooltip": "ทิศทางการคลิกเพื่อไปยังหน้าถัดไป ขวาไปซ้าย หมายถึงคุณคลิกที่ด้านซ้ายของหน้าจอเพื่อไปยังหน้าถัดไป",
"scaling-option-label": "ตัวเลือกการปรับขนาด",
"scaling-option-tooltip": "วิธีปรับขนาดภาพให้พอดีกับหน้าจอของคุณ",
"page-splitting-label": "การแยกหน้า",
"page-splitting-tooltip": "วิธีแยกภาพเต็มความกว้าง (เช่น รวมภาพซ้ายและขวาเข้าด้วยกัน)",
"reading-mode-label": "โหมดการอ่าน",
"layout-mode-label": "โหมดเค้าโครง",
"layout-mode-tooltip": "เรนเดอร์ภาพเดียวไปที่หน้าจอหรือสองภาพเคียงข้างกัน",
"background-color-label": "สีพื้นหลัง",
"auto-close-menu-label": "ปิดเมนูอัตโนมัติ",
"show-screen-hints-label": "แสดงคำแนะนำบนหน้าจอ",
"emulate-comic-book-label": "เลียนแบบหนังสือการ์ตูน",
"swipe-to-paginate-label": "ปัดเพื่อเปลี่ยนหน้า",
"book-reader-settings-title": "เครื่องอ่านหนังสือ",
"tap-to-paginate-label": "แตะเพื่อเปลี่ยนหน้า",
"tap-to-paginate-tooltip": "อนุญาตให้แตะมุมหนังสือเพื่อเลื่อนไปยังหน้าก่อนหน้า/ถัดไป",
"immersive-mode-label": "โหมดดื่มด่ำ",
"immersive-mode-tooltip": "วิธีนี้จะซ่อนเมนูหลังการคลิกบนเอกสารของผู้อ่านและเปิดการแตะเพื่อแบ่งหน้า",
"reading-direction-book-label": "ทิศทางการอ่าน",
"reading-direction-book-tooltip": "ทิศทางการคลิกเพื่อไปยังหน้าถัดไป ขวาไปซ้าย หมายถึงคุณคลิกที่ด้านซ้ายของหน้าจอเพื่อไปยังหน้าถัดไป",
"font-family-label": "",
"font-family-tooltip": "",
"writing-style-label": "",

View File

@ -1,5 +1,9 @@
/// <reference types="@angular/localize" />
import {APP_INITIALIZER, importProvidersFrom, isDevMode} from '@angular/core';
import {
APP_INITIALIZER, ApplicationConfig,
importProvidersFrom,
isDevMode,
} from '@angular/core';
import { AppComponent } from './app/app.component';
import { NgCircleProgressModule } from 'ng-circle-progress';
import { ToastrModule } from 'ngx-toastr';
@ -9,18 +13,20 @@ import { SAVER, getSaver } from './app/shared/_providers/saver.provider';
import { Title, BrowserModule, bootstrapApplication } from '@angular/platform-browser';
import { JwtInterceptor } from './app/_interceptors/jwt.interceptor';
import { ErrorInterceptor } from './app/_interceptors/error.interceptor';
import {HTTP_INTERCEPTORS, withInterceptorsFromDi, provideHttpClient, HttpClient} from '@angular/common/http';
import {TRANSLOCO_CONFIG, TranslocoConfig, TranslocoModule, TranslocoService} from "@ngneat/transloco";
import {environment} from "./environments/environment";
import {HttpLoader, translocoLoader} from "./httpLoader";
import {HTTP_INTERCEPTORS, withInterceptorsFromDi, provideHttpClient} from '@angular/common/http';
import {
TRANSLOCO_PERSIST_LANG_STORAGE,
TranslocoPersistLangModule,
provideTransloco,
TranslocoService
} from "@ngneat/transloco";
import {environment} from "./environments/environment";
import {HttpLoader} from "./httpLoader";
import {
provideTranslocoPersistLang,
} from '@ngneat/transloco-persist-lang';
import {PERSIST_TRANSLATIONS_STORAGE, TranslocoPersistTranslationsModule} from "@ngneat/transloco-persist-translations";
import {TranslocoLocaleModule} from "@ngneat/transloco-locale";
import {AccountService} from "./app/_services/account.service";
import {switchMap} from "rxjs";
import {provideTranslocoLocale} from "@ngneat/transloco-locale";
import {provideTranslocoPersistTranslations} from "@ngneat/transloco-persist-translations";
const disableAnimations = !('animate' in document.documentElement);
@ -40,6 +46,7 @@ export function preloadUser(userService: AccountService, transloco: TranslocoSer
};
}
export const preLoad = {
provide: APP_INITIALIZER,
multi: true,
@ -74,6 +81,23 @@ const languageCodes = [
'zh-SG', 'zh-TW', 'zu', 'zu-ZA', 'zh_Hans'
];
const translocoOptions = {
config: {
reRenderOnLangChange: true,
availableLangs: languageCodes,
prodMode: environment.production,
defaultLang: 'en',
fallbackLang: 'en',
missingHandler: {
useFallbackTranslation: true,
allowEmpty: false,
},
flatten: {
aot: !isDevMode()
}
}
};
bootstrapApplication(AppComponent, {
providers: [
importProvidersFrom(BrowserModule,
@ -87,46 +111,26 @@ bootstrapApplication(AppComponent, {
autoDismiss: true
}),
NgCircleProgressModule.forRoot(),
TranslocoModule,
TranslocoPersistLangModule.forRoot({
storage: {
provide: TRANSLOCO_PERSIST_LANG_STORAGE,
useValue: localStorage,
},
}),
TranslocoLocaleModule.forRoot(),
TranslocoPersistTranslationsModule.forRoot({
loader: HttpLoader,
storage: {
provide: PERSIST_TRANSLATIONS_STORAGE,
useValue: sessionStorage
}
})
),
provideTransloco(translocoOptions),
provideTranslocoLocale({
defaultLocale: 'en'
}),
provideTranslocoPersistTranslations({
loader: HttpLoader,
storage: { useValue: localStorage }
}),
provideTranslocoPersistLang({
storage: {
useValue: localStorage,
},
}),
{ provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true },
{
provide: TRANSLOCO_CONFIG,
useValue: {
reRenderOnLangChange: true,
availableLangs: languageCodes,
prodMode: environment.production,
defaultLang: 'en',
fallbackLang: 'en',
missingHandler: {
useFallbackTranslation: true,
allowEmpty: false,
},
flatten: {
aot: !isDevMode()
}
} as TranslocoConfig
},
preLoad,
Title,
{ provide: SAVER, useFactory: getSaver },
provideHttpClient(withInterceptorsFromDi())
]
})
} as ApplicationConfig)
.catch(err => console.error(err));

View File

@ -7,7 +7,7 @@
"name": "GPL-3.0",
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
},
"version": "0.7.6.8"
"version": "0.7.6.10"
},
"servers": [
{