WebDAV connection settings were never part of the bundled settings replica, so the "Credentials" sync toggle had no effect on them and users had to re-enter their WebDAV server, username, and password on every device. Add webdav.serverUrl / username / password / rootPath to SETTINGS_WHITELIST and gate username / password behind SETTINGS_ENCRYPTED_FIELDS, matching how KOSync / Readwise / Hardcover credentials are handled. Per-device bookkeeping (enabled, deviceId, lastSyncedAt, sync sub-toggles) stays local, mirroring KOSync which syncs credentials but not its enabled flag: a fresh device pre-fills the connect form and the user clicks Connect. Also add a webdav deep-merge case to mergeSettings. Without it the top-level shallow merge on pull would replace the whole webdav object with the four-field patch and wipe the local per-device fields. Update the credentials category description to mention WebDAV and migrate the i18n key across all locales. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1480,7 +1480,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "يُعاد الضبط خلال {{hours}} س {{minutes}} د",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "اختر رمز PIN مكوّنًا من 4 أرقام. ستحتاج إلى إدخاله في كل مرة تفتح فيها Readest. لا توجد طريقة لاستعادة رمز PIN المنسي. مسح بيانات التطبيق هو الطريقة الوحيدة لإعادة ضبطه.",
|
||||
"Credentials": "بيانات الاعتماد",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "الرموز وأسماء المستخدمين وكلمات المرور لـ OPDS و KOReader و Hardcover و Readwise. عند التعطيل، تبقى بيانات الاعتماد على هذا الجهاز فقط ولا تُرفع أبدًا.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "الرموز وأسماء المستخدمين وكلمات المرور لـ OPDS و KOReader و Hardcover و Readwise و WebDAV. عند التعطيل، تبقى بيانات الاعتماد على هذا الجهاز فقط ولا تُرفع أبدًا.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "تُشفَّر الحقول الحساسة المتزامنة قبل الرفع. عيّن عبارة مرور الآن أو لاحقًا عند الحاجة إلى التشفير.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "محفوظة في هذا الحساب. سيُطلب منك إدخالها عند فك تشفير بيانات الاعتماد.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "يختلف تقدم القراءة على هذا الجهاز عن «{{deviceName}}».",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} ঘ {{minutes}} মি পরে রিসেট হবে",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "একটি ৪-অঙ্কের পিন বেছে নিন। প্রতিবার Readest খোলার সময় আপনাকে এটি প্রবেশ করাতে হবে। ভুলে যাওয়া পিন পুনরুদ্ধারের কোনো উপায় নেই। অ্যাপের ডেটা মুছে ফেলাই এটি রিসেট করার একমাত্র উপায়।",
|
||||
"Credentials": "ক্রেডেনশিয়াল",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover এবং Readwise-এর জন্য টোকেন, ব্যবহারকারীর নাম এবং পাসওয়ার্ড। নিষ্ক্রিয় থাকলে ক্রেডেনশিয়ালগুলি কেবল এই ডিভাইসেই থাকে এবং কখনই আপলোড হয় না।",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise এবং WebDAV-এর জন্য টোকেন, ব্যবহারকারীর নাম এবং পাসওয়ার্ড। নিষ্ক্রিয় থাকলে ক্রেডেনশিয়ালগুলি কেবল এই ডিভাইসেই থাকে এবং কখনই আপলোড হয় না।",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "সংবেদনশীল সিঙ্ক করা ক্ষেত্রগুলি আপলোডের আগে এনক্রিপ্ট করা হয়। এনক্রিপশনের প্রয়োজন হলে এখনই অথবা পরে একটি পাসফ্রেজ সেট করুন।",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "এই অ্যাকাউন্টে সংরক্ষিত। ক্রেডেনশিয়াল ডিক্রিপ্ট করার সময় আপনাকে এটি দিতে বলা হবে।",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "এই ডিভাইসে পড়ার অগ্রগতি \"{{deviceName}}\" থেকে আলাদা।",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} ཆུ་ཚོད་ {{minutes}} སྐར་མ་ནང་སླར་གསོ་བྱེད།",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "ཨང་གྲངས་བཞི་ཅན་གྱི་ PIN ཞིག་འདེམས་རོགས། Readest ཕྱེ་རུས་ཐེངས་རེར་ཁྱེད་ཀྱིས་དེ་ནང་འཇུག་དགོས། བརྗེད་སོང་བའི་ PIN ཞིག་སླར་གསོ་བྱེད་ཐབས་མེད། ཉེར་སྤྱོད་ཀྱི་གཞི་གྲངས་གཙང་སེལ་བྱེད་པ་ནི་སླར་སྒྲིག་བྱེད་ཐབས་གཅིག་པོ་ཡིན།",
|
||||
"Credentials": "ངོས་སྦྱོར་ཆ་འཕྲིན།",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, དང་ Readwise བཅས་ཀྱི་ཐོ་ཀེན་དང་སྤྱོད་མི་མིང་དང་གསང་གྲངས། སྤོ་འཛུགས་མེད་པའི་སྐབས། ངོས་སྦྱོར་ཆ་འཕྲིན་ཡིག་ཆས་འདི་ཁོ་ནར་གནས་པ་དང་ནམ་ཡང་སྤོ་གཏོང་མི་བྱེད།",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise, དང་ WebDAV བཅས་ཀྱི་ཐོ་ཀེན་དང་སྤྱོད་མི་མིང་དང་གསང་གྲངས། སྤོ་འཛུགས་མེད་པའི་སྐབས། ངོས་སྦྱོར་ཆ་འཕྲིན་ཡིག་ཆས་འདི་ཁོ་ནར་གནས་པ་དང་ནམ་ཡང་སྤོ་གཏོང་མི་བྱེད།",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "གཙོ་གནད་ཆགས་པའི་མཉམ་སྡེབ་ཐོ་ཁོངས་ཡིག་ཆ་སྤོ་གཏོང་མ་བྱས་སྔོན་ལ་གསང་སྦས་སུ་འགྱུར་བར་བཟོ། གསང་སྦས་དགོས་སྐབས་ད་ལྟ་འམ་ཕྱིས་སུ་གསང་ཚིག་ཕྲེང་གཅིག་སྒྲིག་འཛུགས་གནང་རོགས།",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "རྩིས་ཐོ་འདིར་ཉར་ཚགས་བྱས་ཡོད། ངོས་སྦྱོར་ཆ་འཕྲིན་ལ་གསང་སྦས་འགྲོལ་སྐབས་ཁྱེད་ལ་འདྲི་སློང་གནང་འགྱུར།",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "སྒྲིག་ཆས་འདིའི་ཀློག་འགྲོས་ནི་\"{{deviceName}}\"དང་མི་འདྲ།",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Zurückgesetzt in {{hours}} Std. {{minutes}} Min.",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Wählen Sie eine 4-stellige PIN. Sie müssen sie jedes Mal eingeben, wenn Sie Readest öffnen. Eine vergessene PIN kann nicht wiederhergestellt werden. Das Löschen der App-Daten ist die einzige Möglichkeit, sie zurückzusetzen.",
|
||||
"Credentials": "Anmeldedaten",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, Benutzernamen und Passwörter für OPDS, KOReader, Hardcover und Readwise. Wenn deaktiviert, bleiben die Anmeldedaten nur auf diesem Gerät und werden nie hochgeladen.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, Benutzernamen und Passwörter für OPDS, KOReader, Hardcover, Readwise und WebDAV. Wenn deaktiviert, bleiben die Anmeldedaten nur auf diesem Gerät und werden nie hochgeladen.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Sensible synchronisierte Felder werden vor dem Hochladen verschlüsselt. Lege jetzt oder später eine Passphrase fest, wenn die Verschlüsselung benötigt wird.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "In diesem Konto gespeichert. Du wirst beim Entschlüsseln von Anmeldedaten danach gefragt.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Der Lesefortschritt auf diesem Gerät weicht von „{{deviceName}}“ ab.",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Επαναφορά σε {{hours}} ώρ. {{minutes}} λεπ.",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Επιλέξτε ένα 4ψήφιο PIN. Θα πρέπει να το εισάγετε κάθε φορά που ανοίγετε το Readest. Δεν υπάρχει τρόπος ανάκτησης ενός ξεχασμένου PIN. Η εκκαθάριση των δεδομένων της εφαρμογής είναι ο μοναδικός τρόπος επαναφοράς του.",
|
||||
"Credentials": "Διαπιστευτήρια",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Διακριτικά, ονόματα χρήστη και κωδικοί πρόσβασης για OPDS, KOReader, Hardcover και Readwise. Όταν είναι απενεργοποιημένο, τα διαπιστευτήρια παραμένουν μόνο σε αυτή τη συσκευή και δεν αποστέλλονται ποτέ.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Διακριτικά, ονόματα χρήστη και κωδικοί πρόσβασης για OPDS, KOReader, Hardcover, Readwise και WebDAV. Όταν είναι απενεργοποιημένο, τα διαπιστευτήρια παραμένουν μόνο σε αυτή τη συσκευή και δεν αποστέλλονται ποτέ.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Τα ευαίσθητα συγχρονισμένα πεδία κρυπτογραφούνται πριν τη μεταφόρτωση. Ορίστε μια φράση πρόσβασης τώρα ή αργότερα, όταν χρειαστεί η κρυπτογράφηση.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Αποθηκεύτηκε σε αυτόν τον λογαριασμό. Θα σας ζητηθεί όταν χρειαστεί να αποκρυπτογραφηθούν διαπιστευτήρια.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Η πρόοδος ανάγνωσης σε αυτή τη συσκευή διαφέρει από το «{{deviceName}}».",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Se restablece en {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Elige un PIN de 4 dígitos. Tendrás que introducirlo cada vez que abras Readest. No hay forma de recuperar un PIN olvidado. Borrar los datos de la aplicación es la única forma de restablecerlo.",
|
||||
"Credentials": "Credenciales",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nombres de usuario y contraseñas de OPDS, KOReader, Hardcover y Readwise. Si está desactivado, las credenciales permanecen solo en este dispositivo y nunca se cargan.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nombres de usuario y contraseñas de OPDS, KOReader, Hardcover, Readwise y WebDAV. Si está desactivado, las credenciales permanecen solo en este dispositivo y nunca se cargan.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Los campos sincronizados sensibles se cifran antes de subirlos. Establece una frase de contraseña ahora o más tarde, cuando se necesite el cifrado.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Guardada en esta cuenta. Se te pedirá cuando se necesite descifrar credenciales.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "El progreso de lectura en este dispositivo difiere del de «{{deviceName}}».",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "تنظیم مجدد در {{hours}} ساعت {{minutes}} دقیقه",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "یک پین ۴ رقمی انتخاب کنید. هر بار که Readest را باز میکنید باید آن را وارد کنید. راهی برای بازیابی پین فراموششده وجود ندارد. پاک کردن دادههای برنامه تنها راه بازنشانی آن است.",
|
||||
"Credentials": "اعتبارنامهها",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "توکنها، نامهای کاربری و رمزهای عبور OPDS، KOReader، Hardcover و Readwise. هنگام غیرفعال بودن، اعتبارنامهها فقط روی این دستگاه باقی میمانند و هرگز بارگذاری نمیشوند.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "توکنها، نامهای کاربری و رمزهای عبور OPDS، KOReader، Hardcover، Readwise و WebDAV. هنگام غیرفعال بودن، اعتبارنامهها فقط روی این دستگاه باقی میمانند و هرگز بارگذاری نمیشوند.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "فیلدهای حساسِ همگامسازیشده پیش از بارگذاری رمزگذاری میشوند. اکنون یا بعداً، هنگامی که به رمزگذاری نیاز شد، یک عبارت عبور تنظیم کنید.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "در این حساب ذخیره شد. هنگام رمزگشایی اعتبارنامهها از شما خواسته میشود.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "پیشرفت مطالعه در این دستگاه با «{{deviceName}}» تفاوت دارد.",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Réinitialisation dans {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Choisissez un code PIN à 4 chiffres. Vous devrez le saisir chaque fois que vous ouvrirez Readest. Il n'existe aucun moyen de récupérer un code PIN oublié. Effacer les données de l'application est le seul moyen de le réinitialiser.",
|
||||
"Credentials": "Identifiants",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Jetons, noms d'utilisateur et mots de passe pour OPDS, KOReader, Hardcover et Readwise. Lorsqu'ils sont désactivés, les identifiants restent uniquement sur cet appareil et ne sont jamais téléversés.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Jetons, noms d'utilisateur et mots de passe pour OPDS, KOReader, Hardcover, Readwise et WebDAV. Lorsqu'ils sont désactivés, les identifiants restent uniquement sur cet appareil et ne sont jamais téléversés.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Les champs sensibles synchronisés sont chiffrés avant l'envoi. Définissez une phrase de passe maintenant ou plus tard, lorsque le chiffrement sera nécessaire.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Enregistrée sur ce compte. Elle vous sera demandée lors du déchiffrement des identifiants.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "La progression de lecture sur cet appareil diffère de « {{deviceName}} ».",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "מתאפס בעוד {{hours}} ש׳ {{minutes}} ד׳",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "בחר PIN בן 4 ספרות. תצטרך להזין אותו בכל פעם שתפתח את Readest. אין דרך לשחזר PIN שנשכח. ניקוי נתוני האפליקציה הוא הדרך היחידה לאפס אותו.",
|
||||
"Credentials": "אישורים",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "אסימונים, שמות משתמש וסיסמאות עבור OPDS, KOReader, Hardcover ו-Readwise. כאשר מבוטל, האישורים נשמרים רק במכשיר זה ולעולם אינם מועלים.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "אסימונים, שמות משתמש וסיסמאות עבור OPDS, KOReader, Hardcover, Readwise ו-WebDAV. כאשר מבוטל, האישורים נשמרים רק במכשיר זה ולעולם אינם מועלים.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "שדות מסונכרנים רגישים מוצפנים לפני העלאה. הגדר ביטוי סיסמה עכשיו או מאוחר יותר, כאשר תידרש הצפנה.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "נשמר בחשבון זה. תתבקש להזינו בעת פענוח אישורים.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "התקדמות הקריאה במכשיר זה שונה מ-\"{{deviceName}}\".",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} घं {{minutes}} मि में रीसेट",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "एक 4-अंकों का पिन चुनें। Readest खोलने पर आपको हर बार इसे दर्ज करना होगा। भूले हुए पिन को पुनः प्राप्त करने का कोई तरीका नहीं है। ऐप डेटा मिटाना इसे रीसेट करने का एकमात्र तरीका है।",
|
||||
"Credentials": "क्रेडेंशियल",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover और Readwise के लिए टोकन, उपयोगकर्ता नाम और पासवर्ड। अक्षम होने पर, क्रेडेंशियल केवल इसी डिवाइस पर रहते हैं और कभी अपलोड नहीं किए जाते।",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise और WebDAV के लिए टोकन, उपयोगकर्ता नाम और पासवर्ड। अक्षम होने पर, क्रेडेंशियल केवल इसी डिवाइस पर रहते हैं और कभी अपलोड नहीं किए जाते।",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "संवेदनशील सिंक किए गए फ़ील्ड अपलोड से पहले एन्क्रिप्ट किए जाते हैं। अभी पासफ़्रेज़ सेट करें या बाद में जब एन्क्रिप्शन की आवश्यकता हो।",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "इस खाते में सहेजा गया। क्रेडेंशियल डिक्रिप्ट करते समय आपसे पूछा जाएगा।",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "इस डिवाइस पर पढ़ने की प्रगति \"{{deviceName}}\" से भिन्न है।",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Visszaállás {{hours}} ó {{minutes}} p múlva",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Válasszon egy 4 számjegyű PIN-kódot. Minden alkalommal meg kell adnia, amikor megnyitja a Readestet. Az elfelejtett PIN-kódot nem lehet visszaállítani. Az alkalmazás adatainak törlése az egyetlen módja a visszaállításának.",
|
||||
"Credentials": "Hitelesítő adatok",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokenek, felhasználónevek és jelszavak az OPDS, KOReader, Hardcover és Readwise szolgáltatásokhoz. Ha le van tiltva, a hitelesítő adatok csak ezen az eszközön maradnak, és soha nem töltődnek fel.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokenek, felhasználónevek és jelszavak az OPDS, KOReader, Hardcover, Readwise és WebDAV szolgáltatásokhoz. Ha le van tiltva, a hitelesítő adatok csak ezen az eszközön maradnak, és soha nem töltődnek fel.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Az érzékeny szinkronizált mezők feltöltés előtt titkosítva vannak. Állíts be egy jelmondatot most, vagy később, amikor titkosításra lesz szükség.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Mentve ehhez a fiókhoz. Akkor kérjük majd, amikor hitelesítő adatokat kell visszafejteni.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Az olvasási előrehaladás ezen az eszközön eltér a következőtől: „{{deviceName}}”.",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Direset dalam {{hours}} j {{minutes}} mnt",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Pilih PIN 4 digit. Anda harus memasukkannya setiap kali membuka Readest. Tidak ada cara untuk memulihkan PIN yang terlupa. Menghapus data aplikasi adalah satu-satunya cara untuk mengaturnya ulang.",
|
||||
"Credentials": "Kredensial",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna, dan kata sandi untuk OPDS, KOReader, Hardcover, dan Readwise. Saat dinonaktifkan, kredensial hanya tetap di perangkat ini dan tidak pernah diunggah.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna, dan kata sandi untuk OPDS, KOReader, Hardcover, Readwise, dan WebDAV. Saat dinonaktifkan, kredensial hanya tetap di perangkat ini dan tidak pernah diunggah.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Bidang sinkron yang sensitif dienkripsi sebelum diunggah. Atur frasa sandi sekarang atau nanti saat enkripsi diperlukan.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Disimpan di akun ini. Anda akan diminta memasukkannya saat mendekripsi kredensial.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Progres membaca di perangkat ini berbeda dari \"{{deviceName}}\".",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Si reimposta tra {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Scegli un PIN di 4 cifre. Dovrai inserirlo ogni volta che apri Readest. Non c'è modo di recuperare un PIN dimenticato. Cancellare i dati dell'app è l'unico modo per reimpostarlo.",
|
||||
"Credentials": "Credenziali",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nomi utente e password per OPDS, KOReader, Hardcover e Readwise. Quando disattivato, le credenziali restano solo su questo dispositivo e non vengono mai caricate.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Token, nomi utente e password per OPDS, KOReader, Hardcover, Readwise e WebDAV. Quando disattivato, le credenziali restano solo su questo dispositivo e non vengono mai caricate.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "I campi sincronizzati sensibili vengono cifrati prima del caricamento. Imposta una passphrase ora o più tardi, quando servirà la cifratura.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Salvata in questo account. Ti verrà richiesta quando occorrerà decifrare le credenziali.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "L'avanzamento di lettura su questo dispositivo è diverso da «{{deviceName}}».",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}}時間{{minutes}}分でリセット",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4桁のPINを設定してください。Readestを開くたびに入力する必要があります。忘れたPINを復元する方法はありません。アプリのデータを消去することがリセットする唯一の方法です。",
|
||||
"Credentials": "認証情報",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover、Readwise のトークン、ユーザー名、パスワード。無効にすると、認証情報はこのデバイスにのみ残り、アップロードされません。",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover、Readwise、WebDAV のトークン、ユーザー名、パスワード。無効にすると、認証情報はこのデバイスにのみ残り、アップロードされません。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "機密性の高い同期フィールドはアップロード前に暗号化されます。パスフレーズは今すぐ設定するか、暗号化が必要なときに後で設定できます。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "このアカウントに保存されました。認証情報を復号する際に入力を求められます。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "このデバイスの読書進捗は「{{deviceName}}」と異なります。",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}}시간 {{minutes}}분 후 재설정",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4자리 PIN을 선택하세요. Readest를 열 때마다 입력해야 합니다. 잊어버린 PIN을 복구할 방법은 없습니다. 앱 데이터를 지우는 것이 PIN을 재설정하는 유일한 방법입니다.",
|
||||
"Credentials": "자격 증명",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise의 토큰, 사용자 이름, 비밀번호입니다. 비활성화되면 자격 증명이 이 기기에만 남아 있고 절대 업로드되지 않습니다.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise, WebDAV의 토큰, 사용자 이름, 비밀번호입니다. 비활성화되면 자격 증명이 이 기기에만 남아 있고 절대 업로드되지 않습니다.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "민감한 동기화 필드는 업로드 전에 암호화됩니다. 지금 또는 암호화가 필요할 때 나중에 암호 문구를 설정하세요.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "이 계정에 저장되었습니다. 자격 증명을 복호화할 때 입력하라는 메시지가 표시됩니다.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "이 기기의 읽기 진행 상황이 \"{{deviceName}}\"와(과) 다릅니다.",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Set semula dalam {{hours}} j {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Pilih PIN 4 digit. Anda perlu memasukkannya setiap kali anda membuka Readest. Tiada cara untuk memulihkan PIN yang terlupa. Mengosongkan data aplikasi adalah satu-satunya cara untuk menetapkannya semula.",
|
||||
"Credentials": "Kelayakan",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna dan kata laluan untuk OPDS, KOReader, Hardcover dan Readwise. Apabila dilumpuhkan, kelayakan hanya kekal pada peranti ini dan tidak pernah dimuat naik.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Token, nama pengguna dan kata laluan untuk OPDS, KOReader, Hardcover, Readwise dan WebDAV. Apabila dilumpuhkan, kelayakan hanya kekal pada peranti ini dan tidak pernah dimuat naik.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Medan disegerakkan yang sensitif disulitkan sebelum dimuat naik. Tetapkan frasa laluan sekarang atau kemudian apabila penyulitan diperlukan.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Disimpan dalam akaun ini. Anda akan diminta memasukkannya apabila kelayakan perlu dinyahsulit.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Kemajuan membaca pada peranti ini berbeza daripada \"{{deviceName}}\".",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Reset over {{hours}} u {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Kies een viercijferige pincode. Je moet deze elke keer invoeren wanneer je Readest opent. Een vergeten pincode kan niet worden hersteld. Het wissen van de app-gegevens is de enige manier om deze opnieuw in te stellen.",
|
||||
"Credentials": "Inloggegevens",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, gebruikersnamen en wachtwoorden voor OPDS, KOReader, Hardcover en Readwise. Wanneer uitgeschakeld blijven inloggegevens alleen op dit apparaat en worden ze nooit geüpload.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, gebruikersnamen en wachtwoorden voor OPDS, KOReader, Hardcover, Readwise en WebDAV. Wanneer uitgeschakeld blijven inloggegevens alleen op dit apparaat en worden ze nooit geüpload.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Gevoelige gesynchroniseerde velden worden vóór het uploaden versleuteld. Stel nu of later een wachtwoordzin in wanneer versleuteling nodig is.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Opgeslagen op dit account. Er wordt om gevraagd wanneer inloggegevens ontsleuteld moeten worden.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "De leesvoortgang op dit apparaat verschilt van \"{{deviceName}}\".",
|
||||
|
||||
@@ -1430,7 +1430,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Resetuje się za {{hours}} godz. {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Wybierz 4-cyfrowy PIN. Będziesz musiał go wprowadzać za każdym razem, gdy otworzysz Readest. Nie ma sposobu na odzyskanie zapomnianego PIN-u. Wyczyszczenie danych aplikacji to jedyny sposób, aby go zresetować.",
|
||||
"Credentials": "Poświadczenia",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokeny, nazwy użytkowników i hasła do OPDS, KOReader, Hardcover i Readwise. Gdy wyłączone, poświadczenia pozostają tylko na tym urządzeniu i nigdy nie są przesyłane.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokeny, nazwy użytkowników i hasła do OPDS, KOReader, Hardcover, Readwise i WebDAV. Gdy wyłączone, poświadczenia pozostają tylko na tym urządzeniu i nigdy nie są przesyłane.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Wrażliwe zsynchronizowane pola są szyfrowane przed wysłaniem. Ustaw hasło teraz lub później, gdy szyfrowanie będzie potrzebne.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Zapisane w tym koncie. Zostaniesz o nie poproszony przy odszyfrowywaniu poświadczeń.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Postęp czytania na tym urządzeniu różni się od „{{deviceName}}”.",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Redefine em {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Escolha um PIN de 4 dígitos. Você precisará digitá-lo toda vez que abrir o Readest. Não há como recuperar um PIN esquecido. Limpar os dados do aplicativo é a única forma de redefini-lo.",
|
||||
"Credentials": "Credenciais",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nomes de usuário e senhas para OPDS, KOReader, Hardcover e Readwise. Quando desativado, as credenciais permanecem apenas neste dispositivo e nunca são enviadas.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nomes de usuário e senhas para OPDS, KOReader, Hardcover, Readwise e WebDAV. Quando desativado, as credenciais permanecem apenas neste dispositivo e nunca são enviadas.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Os campos sincronizados sensíveis são criptografados antes do envio. Defina uma senha agora ou mais tarde, quando a criptografia for necessária.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Salva nesta conta. Você será solicitado a informá-la quando precisar descriptografar credenciais.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "O progresso de leitura neste dispositivo difere do de \"{{deviceName}}\".",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Repõe em {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Escolha um PIN de 4 dígitos. Terá de o introduzir sempre que abrir o Readest. Não há forma de recuperar um PIN esquecido. Limpar os dados da aplicação é a única maneira de o redefinir.",
|
||||
"Credentials": "Credenciais",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nomes de utilizador e palavras-passe para OPDS, KOReader, Hardcover e Readwise. Quando desativado, as credenciais permanecem apenas neste dispositivo e nunca são enviadas.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, nomes de utilizador e palavras-passe para OPDS, KOReader, Hardcover, Readwise e WebDAV. Quando desativado, as credenciais permanecem apenas neste dispositivo e nunca são enviadas.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Os campos sincronizados sensíveis são cifrados antes do envio. Defina uma frase-senha agora ou mais tarde, quando a cifragem for necessária.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Guardada nesta conta. Ser-lhe-á pedida quando precisar de decifrar credenciais.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "O progresso de leitura neste dispositivo difere do «{{deviceName}}».",
|
||||
|
||||
@@ -1405,7 +1405,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Se resetează în {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Alege un PIN din 4 cifre. Va trebui să îl introduci de fiecare dată când deschizi Readest. Nu există nicio modalitate de a recupera un PIN uitat. Ștergerea datelor aplicației este singura modalitate de a-l reseta.",
|
||||
"Credentials": "Acreditări",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Token-uri, nume de utilizator și parole pentru OPDS, KOReader, Hardcover și Readwise. Când sunt dezactivate, acreditările rămân doar pe acest dispozitiv și nu sunt niciodată încărcate.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Token-uri, nume de utilizator și parole pentru OPDS, KOReader, Hardcover, Readwise și WebDAV. Când sunt dezactivate, acreditările rămân doar pe acest dispozitiv și nu sunt niciodată încărcate.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Câmpurile sincronizate sensibile sunt criptate înainte de încărcare. Setați o frază de acces acum sau mai târziu, când criptarea va fi necesară.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Salvată în acest cont. Vi se va cere când va trebui să se decripteze acreditările.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Progresul de citire pe acest dispozitiv diferă de „{{deviceName}}”.",
|
||||
|
||||
@@ -1430,7 +1430,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Сброс через {{hours}} ч {{minutes}} мин",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Выберите 4-значный PIN-код. Вам нужно будет вводить его каждый раз при открытии Readest. Восстановить забытый PIN-код невозможно. Очистка данных приложения — единственный способ его сбросить.",
|
||||
"Credentials": "Учётные данные",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Токены, имена пользователей и пароли для OPDS, KOReader, Hardcover и Readwise. Если отключено, учётные данные остаются только на этом устройстве и никогда не отправляются.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Токены, имена пользователей и пароли для OPDS, KOReader, Hardcover, Readwise и WebDAV. Если отключено, учётные данные остаются только на этом устройстве и никогда не отправляются.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Конфиденциальные синхронизируемые поля шифруются перед загрузкой. Задайте парольную фразу сейчас или позже, когда понадобится шифрование.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Сохранено в этой учётной записи. Вы получите запрос при расшифровке учётных данных.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Прогресс чтения на этом устройстве отличается от «{{deviceName}}».",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} පැ {{minutes}} මි කින් යළි පිහිටුවයි",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "අංක 4ක PIN එකක් තෝරන්න. ඔබ Readest විවෘත කරන සෑම විටම ඔබට එය ඇතුළත් කිරීමට අවශ්ය වේ. අමතක වූ PIN එකක් ලබා ගැනීමට ක්රමයක් නැත. එය යළි පිහිටුවීමට ඇති එකම ක්රමය යෙදුම් දත්ත මකා දැමීමයි.",
|
||||
"Credentials": "අක්තපත්ර",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, සහ Readwise සඳහා ටෝකන, පරිශීලක නාම සහ මුරපද. අක්රිය කළ විට, අක්තපත්ර මෙම උපාංගයේ පමණක් රැඳී පවතින අතර කිසිදා උඩුගත නොකෙරේ.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise, සහ WebDAV සඳහා ටෝකන, පරිශීලක නාම සහ මුරපද. අක්රිය කළ විට, අක්තපත්ර මෙම උපාංගයේ පමණක් රැඳී පවතින අතර කිසිදා උඩුගත නොකෙරේ.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "සංවේදී සමමුහූර්ත ක්ෂේත්ර උඩුගත කිරීමට පෙර සංකේතනය වේ. සංකේතනය අවශ්ය වූ විට දැන් හෝ පසුව මුර වැකියක් සකසන්න.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "මෙම ගිණුමට සුරකින ලදී. අක්තපත්ර විකේතනය කිරීමේදී ඔබෙන් එය ඉල්ලනු ලැබේ.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "මෙම උපාංගයේ කියවීමේ ප්රගතිය \"{{deviceName}}\" වලින් වෙනස් වේ.",
|
||||
|
||||
@@ -1430,7 +1430,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Ponastavi se čez {{hours}} h {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Izberite 4-mestno kodo PIN. Vnesti jo boste morali vsakič, ko boste odprli Readest. Pozabljene kode PIN ni mogoče obnoviti. Edini način za ponastavitev je brisanje podatkov aplikacije.",
|
||||
"Credentials": "Poverilnice",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Žetoni, uporabniška imena in gesla za OPDS, KOReader, Hardcover in Readwise. Ko je onemogočeno, poverilnice ostanejo le na tej napravi in se nikoli ne naložijo.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Žetoni, uporabniška imena in gesla za OPDS, KOReader, Hardcover, Readwise in WebDAV. Ko je onemogočeno, poverilnice ostanejo le na tej napravi in se nikoli ne naložijo.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Občutljiva sinhronizirana polja so pred nalaganjem šifrirana. Nastavite geselsko frazo zdaj ali pozneje, ko bo šifriranje potrebno.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Shranjeno v tem računu. Pozvani boste, ko bo treba dešifrirati poverilnice.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Napredek branja na tej napravi se razlikuje od »{{deviceName}}«.",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Återställs om {{hours}} tim {{minutes}} min",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Välj en 4-siffrig PIN-kod. Du kommer att behöva ange den varje gång du öppnar Readest. Det finns inget sätt att återställa en glömd PIN-kod. Att rensa appdata är det enda sättet att återställa den.",
|
||||
"Credentials": "Inloggningsuppgifter",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, användarnamn och lösenord för OPDS, KOReader, Hardcover och Readwise. När inaktiverat förblir inloggningsuppgifterna endast på denna enhet och laddas aldrig upp.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Tokens, användarnamn och lösenord för OPDS, KOReader, Hardcover, Readwise och WebDAV. När inaktiverat förblir inloggningsuppgifterna endast på denna enhet och laddas aldrig upp.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Känsliga synkroniserade fält krypteras före uppladdning. Ange en lösenfras nu eller senare när kryptering behövs.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Sparad på det här kontot. Du blir tillfrågad när inloggningsuppgifter ska dekrypteras.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Läsförloppet på den här enheten skiljer sig från \"{{deviceName}}\".",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} மணி {{minutes}} நிமிடத்தில் மீட்டமைக்கப்படும்",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4 இலக்க PIN ஒன்றைத் தேர்ந்தெடுக்கவும். Readest திறக்கும் ஒவ்வொரு முறையும் அதை உள்ளிட வேண்டும். மறந்துபோன PIN ஐ மீட்டெடுக்க வழியில்லை. அதை மீட்டமைக்க ஒரே வழி பயன்பாட்டுத் தரவை அழிப்பதே ஆகும்.",
|
||||
"Credentials": "அங்கீகாரத் தரவுகள்",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover மற்றும் Readwise-க்கான டோக்கன்கள், பயனர் பெயர்கள் மற்றும் கடவுச்சொற்கள். முடக்கப்பட்டிருக்கும் போது, அங்கீகாரத் தரவுகள் இந்த சாதனத்தில் மட்டுமே இருக்கும், ஒருபோதும் பதிவேற்றப்படாது.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise மற்றும் WebDAV-க்கான டோக்கன்கள், பயனர் பெயர்கள் மற்றும் கடவுச்சொற்கள். முடக்கப்பட்டிருக்கும் போது, அங்கீகாரத் தரவுகள் இந்த சாதனத்தில் மட்டுமே இருக்கும், ஒருபோதும் பதிவேற்றப்படாது.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "முக்கியமான ஒத்திசைக்கப்பட்ட புலங்கள் பதிவேற்றத்திற்கு முன் குறியாக்கம் செய்யப்படுகின்றன. குறியாக்கம் தேவைப்படும் போது இப்போது அல்லது பின்னர் கடவுச்சொற்றொடரை அமைக்கவும்.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "இந்த கணக்கில் சேமிக்கப்பட்டது. அங்கீகாரத் தரவுகளை மறைகுறியாக்கும்போது உங்களிடம் கேட்கப்படும்.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "இந்தச் சாதனத்தில் படிப்பு முன்னேற்றம் \"{{deviceName}}\" என்பதிலிருந்து வேறுபடுகிறது.",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "รีเซ็ตใน {{hours}} ชม. {{minutes}} นาที",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "เลือก PIN 4 หลัก คุณจะต้องป้อนทุกครั้งที่เปิด Readest ไม่มีวิธีกู้คืน PIN ที่ลืม การล้างข้อมูลแอปเป็นวิธีเดียวในการรีเซ็ต",
|
||||
"Credentials": "ข้อมูลรับรอง",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "โทเคน ชื่อผู้ใช้ และรหัสผ่านสำหรับ OPDS, KOReader, Hardcover และ Readwise เมื่อปิดใช้งาน ข้อมูลรับรองจะยังคงอยู่ในอุปกรณ์นี้เท่านั้นและจะไม่ถูกอัปโหลด",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "โทเคน ชื่อผู้ใช้ และรหัสผ่านสำหรับ OPDS, KOReader, Hardcover, Readwise และ WebDAV เมื่อปิดใช้งาน ข้อมูลรับรองจะยังคงอยู่ในอุปกรณ์นี้เท่านั้นและจะไม่ถูกอัปโหลด",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "ฟิลด์ที่ซิงค์ที่มีความละเอียดอ่อนจะถูกเข้ารหัสก่อนอัปโหลด ตั้งวลีรหัสผ่านตอนนี้หรือภายหลังเมื่อจำเป็นต้องเข้ารหัส",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "บันทึกในบัญชีนี้แล้ว คุณจะได้รับแจ้งเมื่อจำเป็นต้องถอดรหัสข้อมูลรับรอง",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "ความคืบหน้าการอ่านบนอุปกรณ์นี้แตกต่างจาก \"{{deviceName}}\"",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} sa {{minutes}} dk içinde sıfırlanır",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4 haneli bir PIN seçin. Readest'i her açtığınızda bunu girmeniz gerekecek. Unutulan bir PIN'i kurtarmanın yolu yoktur. Uygulama verilerini temizlemek, sıfırlamanın tek yoludur.",
|
||||
"Credentials": "Kimlik Bilgileri",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover ve Readwise için belirteçler, kullanıcı adları ve parolalar. Devre dışı bırakıldığında kimlik bilgileri yalnızca bu cihazda kalır ve hiçbir zaman karşıya yüklenmez.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise ve WebDAV için belirteçler, kullanıcı adları ve parolalar. Devre dışı bırakıldığında kimlik bilgileri yalnızca bu cihazda kalır ve hiçbir zaman karşıya yüklenmez.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Hassas senkronize alanlar yüklemeden önce şifrelenir. Şifreleme gerektiğinde şimdi ya da daha sonra bir parola tümcesi belirleyin.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Bu hesaba kaydedildi. Kimlik bilgileri şifresi çözülürken sizden istenecektir.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Bu cihazdaki okuma ilerlemesi \"{{deviceName}}\" cihazından farklı.",
|
||||
|
||||
@@ -1430,7 +1430,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Скидання через {{hours}} год {{minutes}} хв",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Виберіть 4-значний PIN-код. Вам потрібно буде вводити його щоразу, коли ви відкриваєте Readest. Відновити забутий PIN-код неможливо. Очищення даних застосунку — єдиний спосіб його скинути.",
|
||||
"Credentials": "Облікові дані",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Токени, імена користувачів і паролі для OPDS, KOReader, Hardcover та Readwise. Якщо вимкнено, облікові дані залишаються лише на цьому пристрої і ніколи не вивантажуються.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Токени, імена користувачів і паролі для OPDS, KOReader, Hardcover, Readwise та WebDAV. Якщо вимкнено, облікові дані залишаються лише на цьому пристрої і ніколи не вивантажуються.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Конфіденційні синхронізовані поля шифруються перед вивантаженням. Установіть парольну фразу зараз або пізніше, коли знадобиться шифрування.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Збережено в цьому обліковому записі. Вас запитають про неї під час розшифровування облікових даних.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Прогрес читання на цьому пристрої відрізняється від «{{deviceName}}».",
|
||||
|
||||
@@ -1380,7 +1380,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} soat {{minutes}} daqiqada tiklanadi",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "4 raqamli PIN tanlang. Readestni har ochganingizda uni kiritishingiz kerak bo'ladi. Unutilgan PIN-ni tiklash imkoni yo'q. Uni qayta tiklashning yagona yo'li — ilova ma'lumotlarini tozalash.",
|
||||
"Credentials": "Hisob ma'lumotlari",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover va Readwise uchun tokenlar, foydalanuvchi nomlari va parollar. O'chirilganda, hisob ma'lumotlari faqat shu qurilmada qoladi va hech qachon yuklanmaydi.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS, KOReader, Hardcover, Readwise va WebDAV uchun tokenlar, foydalanuvchi nomlari va parollar. O'chirilganda, hisob ma'lumotlari faqat shu qurilmada qoladi va hech qachon yuklanmaydi.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Maxfiy sinxronlashtirilgan maydonlar yuklashdan oldin shifrlanadi. Hozir yoki keyinroq, shifrlash kerak bo'lganda parol iborasini o'rnating.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Ushbu hisobga saqlangan. Hisob ma'lumotlarini deshifrlashda sizdan so'raladi.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Bu qurilmadagi o'qish jarayoni \"{{deviceName}}\" qurilmasidan farq qiladi.",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "Đặt lại sau {{hours}} g {{minutes}} ph",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "Chọn mã PIN 4 chữ số. Bạn sẽ cần nhập mã mỗi khi mở Readest. Không có cách nào để khôi phục mã PIN đã quên. Xóa dữ liệu ứng dụng là cách duy nhất để đặt lại mã.",
|
||||
"Credentials": "Thông tin xác thực",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "Mã thông báo, tên người dùng và mật khẩu cho OPDS, KOReader, Hardcover và Readwise. Khi bị tắt, thông tin xác thực chỉ ở trên thiết bị này và không bao giờ được tải lên.",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "Mã thông báo, tên người dùng và mật khẩu cho OPDS, KOReader, Hardcover, Readwise và WebDAV. Khi bị tắt, thông tin xác thực chỉ ở trên thiết bị này và không bao giờ được tải lên.",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "Các trường đồng bộ nhạy cảm được mã hóa trước khi tải lên. Đặt cụm mật khẩu ngay bây giờ hoặc sau khi cần mã hóa.",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "Đã lưu vào tài khoản này. Bạn sẽ được nhắc nhập khi cần giải mã thông tin xác thực.",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "Tiến trình đọc trên thiết bị này khác với \"{{deviceName}}\".",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} 小时 {{minutes}} 分钟后重置",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "请设置一个 4 位数字 PIN 码。每次打开 Readest 时都需要输入。忘记的 PIN 码无法找回,清除应用数据是重置它的唯一方法。",
|
||||
"Credentials": "凭据",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover 和 Readwise 的令牌、用户名和密码。关闭时,凭据仅保留在此设备上,永远不会上传。",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover、Readwise 和 WebDAV 的令牌、用户名和密码。关闭时,凭据仅保留在此设备上,永远不会上传。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "敏感的同步字段在上传前会被加密。立即设置密码短语,或稍后在需要加密时再设置。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "已保存到此账户。需要解密凭据时会提示您输入。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "此设备上的阅读进度与“{{deviceName}}”不同。",
|
||||
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"Resets in {{hours}} hr {{minutes}} min": "{{hours}} 小時 {{minutes}} 分鐘後重設",
|
||||
"Pick a 4-digit PIN. You will need to enter it every time you open Readest. There is no way to recover a forgotten PIN. Clearing the app data is the only way to reset it.": "請設定一組 4 位數的 PIN 碼。每次開啟 Readest 時都需要輸入。遺忘的 PIN 碼無法復原,清除應用程式資料是重設它的唯一方法。",
|
||||
"Credentials": "憑證",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover 與 Readwise 的權杖、使用者名稱與密碼。停用時,憑證僅留在此裝置上,永不上傳。",
|
||||
"Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.": "OPDS、KOReader、Hardcover、Readwise 與 WebDAV 的權杖、使用者名稱與密碼。停用時,憑證僅留在此裝置上,永不上傳。",
|
||||
"Sensitive synced fields are encrypted before upload. Set a passphrase now or later when encryption is needed.": "敏感的同步欄位會在上傳前加密。立即設定密碼短語,或稍後在需要加密時再設定。",
|
||||
"Saved to this account. You will be prompted for it when decrypting credentials.": "已儲存到此帳號。需要解密憑證時會提示您輸入。",
|
||||
"Reading progress on this device differs from \"{{deviceName}}\".": "此裝置上的閱讀進度與「{{deviceName}}」不同。",
|
||||
|
||||
@@ -74,6 +74,39 @@ describe('settingsAdapter', () => {
|
||||
expect(fields['kosync.serverUrl']).toBe('https://kosync.example');
|
||||
});
|
||||
|
||||
test('pack ∘ unpack round-trips WebDAV connection fields, dropping per-device state', () => {
|
||||
const record: SettingsRemoteRecord = {
|
||||
name: 'singleton',
|
||||
patch: {
|
||||
webdav: {
|
||||
enabled: true,
|
||||
serverUrl: 'https://dav.example.com',
|
||||
username: 'alice',
|
||||
password: 'hunter2',
|
||||
rootPath: '/Books',
|
||||
deviceId: 'this-device',
|
||||
lastSyncedAt: 123,
|
||||
},
|
||||
} as unknown as Partial<SystemSettings>,
|
||||
};
|
||||
const fields = settingsAdapter.pack(record);
|
||||
expect(fields['webdav.serverUrl']).toBe('https://dav.example.com');
|
||||
expect(fields['webdav.username']).toBe('alice');
|
||||
expect(fields['webdav.password']).toBe('hunter2');
|
||||
expect(fields['webdav.rootPath']).toBe('/Books');
|
||||
// Per-device bookkeeping must not ship.
|
||||
expect(fields['webdav.enabled']).toBeUndefined();
|
||||
expect(fields['webdav.deviceId']).toBeUndefined();
|
||||
expect(fields['webdav.lastSyncedAt']).toBeUndefined();
|
||||
|
||||
const out = settingsAdapter.unpack(fields);
|
||||
expect(out.patch.webdav?.serverUrl).toBe('https://dav.example.com');
|
||||
expect(out.patch.webdav?.username).toBe('alice');
|
||||
expect(out.patch.webdav?.password).toBe('hunter2');
|
||||
expect(out.patch.webdav?.rootPath).toBe('/Books');
|
||||
expect(out.patch.webdav?.enabled).toBeUndefined();
|
||||
});
|
||||
|
||||
test('pack ∘ unpack round-trips object-valued nested fields (highlight palette)', () => {
|
||||
const customColors = { yellow: '#ffeb3b', blue: '#2196f3' };
|
||||
const userColors = [{ name: 'mint', color: '#a8e6cf' }];
|
||||
@@ -92,13 +125,15 @@ describe('settingsAdapter', () => {
|
||||
expect(out.patch.globalReadSettings?.userHighlightColors).toEqual(userColors);
|
||||
});
|
||||
|
||||
test('declares encryptedFields covering kosync / readwise / hardcover credentials only (not serverUrl)', () => {
|
||||
test('declares encryptedFields covering kosync / readwise / hardcover / webdav credentials only (not serverUrl)', () => {
|
||||
expect(settingsAdapter.encryptedFields).toEqual([
|
||||
'kosync.username',
|
||||
'kosync.userkey',
|
||||
'kosync.password',
|
||||
'readwise.accessToken',
|
||||
'hardcover.accessToken',
|
||||
'webdav.username',
|
||||
'webdav.password',
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -106,6 +141,11 @@ describe('settingsAdapter', () => {
|
||||
expect(settingsAdapter.encryptedFields).not.toContain('kosync.serverUrl');
|
||||
});
|
||||
|
||||
test('webdav.serverUrl and webdav.rootPath are plaintext (not in encryptedFields)', () => {
|
||||
expect(settingsAdapter.encryptedFields).not.toContain('webdav.serverUrl');
|
||||
expect(settingsAdapter.encryptedFields).not.toContain('webdav.rootPath');
|
||||
});
|
||||
|
||||
test('unpackRow reconstructs the patch from CRDT envelopes', () => {
|
||||
const userColors = [{ name: 'mint', color: '#a8e6cf' }];
|
||||
const row = makeRow({
|
||||
@@ -152,6 +192,21 @@ describe('SETTINGS_WHITELIST', () => {
|
||||
test('syncs library-scope proofread rules (issue #4700 — PC rules not reaching mobile)', () => {
|
||||
expect(SETTINGS_WHITELIST).toContain('globalViewSettings.proofreadRules');
|
||||
});
|
||||
|
||||
test('syncs WebDAV connection + credentials (issue #4810 — credentials not synced)', () => {
|
||||
expect(SETTINGS_WHITELIST).toContain('webdav.serverUrl');
|
||||
expect(SETTINGS_WHITELIST).toContain('webdav.username');
|
||||
expect(SETTINGS_WHITELIST).toContain('webdav.password');
|
||||
expect(SETTINGS_WHITELIST).toContain('webdav.rootPath');
|
||||
});
|
||||
|
||||
test('does NOT sync per-device WebDAV bookkeeping fields', () => {
|
||||
// enabled / deviceId / lastSyncedAt / sync sub-toggles are per-device
|
||||
// state — syncing them would auto-arm a fresh device or rotate its id.
|
||||
expect(SETTINGS_WHITELIST).not.toContain('webdav.enabled');
|
||||
expect(SETTINGS_WHITELIST).not.toContain('webdav.deviceId');
|
||||
expect(SETTINGS_WHITELIST).not.toContain('webdav.lastSyncedAt');
|
||||
});
|
||||
});
|
||||
|
||||
describe('settingsAdapter proofread rules', () => {
|
||||
|
||||
@@ -44,6 +44,7 @@ const makeSettings = (overrides: Partial<SystemSettings> = {}): SystemSettings =
|
||||
kosync: { serverUrl: '', username: '', userkey: '', password: '' },
|
||||
readwise: { accessToken: '' },
|
||||
hardcover: { accessToken: '' },
|
||||
webdav: { serverUrl: '', username: '', password: '', rootPath: '/' },
|
||||
...overrides,
|
||||
}) as unknown as SystemSettings;
|
||||
|
||||
@@ -317,6 +318,50 @@ describe('publishSettingsIfChanged', () => {
|
||||
expect(patch.kosync?.password).toBe('hunter2');
|
||||
});
|
||||
|
||||
test('omits WebDAV credentials but keeps serverUrl/rootPath when credentials sync is OFF (issue #4810)', async () => {
|
||||
await setCredentials(undefined); // default OFF
|
||||
isUnlocked = false;
|
||||
await publishSettingsIfChanged(
|
||||
makeSettings({
|
||||
webdav: {
|
||||
serverUrl: 'https://dav.example.com',
|
||||
username: 'alice',
|
||||
password: 'hunter2',
|
||||
rootPath: '/Books',
|
||||
} as SystemSettings['webdav'],
|
||||
}),
|
||||
);
|
||||
expect(publishMock).toHaveBeenCalledTimes(1);
|
||||
const patch = publishMock.mock.calls[0]![1].patch as Partial<SystemSettings>;
|
||||
// Plaintext connection metadata still ships.
|
||||
expect(patch.webdav?.serverUrl).toBe('https://dav.example.com');
|
||||
expect(patch.webdav?.rootPath).toBe('/Books');
|
||||
// Credentials are gated off.
|
||||
expect(patch.webdav?.username).toBeUndefined();
|
||||
expect(patch.webdav?.password).toBeUndefined();
|
||||
});
|
||||
|
||||
test('publishes WebDAV credentials when credentials sync is ON (issue #4810)', async () => {
|
||||
await setCredentials(true);
|
||||
isUnlocked = true;
|
||||
await publishSettingsIfChanged(
|
||||
makeSettings({
|
||||
webdav: {
|
||||
serverUrl: 'https://dav.example.com',
|
||||
username: 'alice',
|
||||
password: 'hunter2',
|
||||
rootPath: '/Books',
|
||||
} as SystemSettings['webdav'],
|
||||
}),
|
||||
);
|
||||
expect(publishMock).toHaveBeenCalledTimes(1);
|
||||
const patch = publishMock.mock.calls[0]![1].patch as Partial<SystemSettings>;
|
||||
expect(patch.webdav?.serverUrl).toBe('https://dav.example.com');
|
||||
expect(patch.webdav?.username).toBe('alice');
|
||||
expect(patch.webdav?.password).toBe('hunter2');
|
||||
expect(patch.webdav?.rootPath).toBe('/Books');
|
||||
});
|
||||
|
||||
test('skipping all of the only-credential changes is a clean no-op (no empty publish)', async () => {
|
||||
await setCredentials(undefined);
|
||||
isUnlocked = false;
|
||||
@@ -528,6 +573,47 @@ describe('applyRemoteSettings', () => {
|
||||
expect(publishMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test('deep-merges webdav credentials without clobbering local per-device fields (issue #4810)', () => {
|
||||
const env = makeEnvConfig();
|
||||
useSettingsStore.setState({
|
||||
...useSettingsStore.getState(),
|
||||
settings: makeSettings({
|
||||
webdav: {
|
||||
enabled: true,
|
||||
serverUrl: 'https://old.example.com',
|
||||
username: 'old',
|
||||
password: 'old-pass',
|
||||
rootPath: '/Old',
|
||||
deviceId: 'this-device',
|
||||
lastSyncedAt: 999,
|
||||
syncBooks: true,
|
||||
} as unknown as SystemSettings['webdav'],
|
||||
}),
|
||||
});
|
||||
applyRemoteSettings(env, {
|
||||
name: 'singleton',
|
||||
patch: {
|
||||
webdav: {
|
||||
serverUrl: 'https://dav.example.com',
|
||||
username: 'alice',
|
||||
password: 'hunter2',
|
||||
rootPath: '/Books',
|
||||
},
|
||||
} as unknown as Partial<SystemSettings>,
|
||||
});
|
||||
const merged = useSettingsStore.getState().settings.webdav;
|
||||
// Synced connection fields are applied.
|
||||
expect(merged.serverUrl).toBe('https://dav.example.com');
|
||||
expect(merged.username).toBe('alice');
|
||||
expect(merged.password).toBe('hunter2');
|
||||
expect(merged.rootPath).toBe('/Books');
|
||||
// Per-device fields the remote patch omits must survive the merge.
|
||||
expect(merged.enabled).toBe(true);
|
||||
expect(merged.deviceId).toBe('this-device');
|
||||
expect(merged.lastSyncedAt).toBe(999);
|
||||
expect(merged.syncBooks).toBe(true);
|
||||
});
|
||||
|
||||
test('empty patch is a no-op', () => {
|
||||
const env = makeEnvConfig();
|
||||
const before = useSettingsStore.getState().settings;
|
||||
|
||||
@@ -56,7 +56,7 @@ const useCategoryCopy = (): Record<SyncCategory, CategoryCopy> => {
|
||||
credentials: {
|
||||
title: _('Credentials'),
|
||||
description: _(
|
||||
'Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, and Readwise. When disabled, credentials remain on this device only and are never uploaded.',
|
||||
'Tokens, usernames, and passwords for OPDS, KOReader, Hardcover, Readwise, and WebDAV. When disabled, credentials remain on this device only and are never uploaded.',
|
||||
),
|
||||
},
|
||||
stats: {
|
||||
|
||||
@@ -60,6 +60,15 @@ export const SETTINGS_WHITELIST = [
|
||||
'readwise.baseUrl',
|
||||
'readwise.accessToken',
|
||||
'hardcover.accessToken',
|
||||
// WebDAV connection. serverUrl + rootPath sync as plaintext so a fresh
|
||||
// device pre-fills the connect form; username / password are listed in
|
||||
// `encryptedFields` below. Per-device bookkeeping (enabled, deviceId,
|
||||
// lastSyncedAt, sync sub-toggles) is deliberately excluded — see KOSync,
|
||||
// which likewise syncs credentials but not its `enabled` flag.
|
||||
'webdav.serverUrl',
|
||||
'webdav.username',
|
||||
'webdav.password',
|
||||
'webdav.rootPath',
|
||||
] as const;
|
||||
|
||||
/**
|
||||
@@ -81,6 +90,8 @@ export const SETTINGS_ENCRYPTED_FIELDS = [
|
||||
'kosync.password',
|
||||
'readwise.accessToken',
|
||||
'hardcover.accessToken',
|
||||
'webdav.username',
|
||||
'webdav.password',
|
||||
] as const;
|
||||
|
||||
export type SettingsWhitelistKey = (typeof SETTINGS_WHITELIST)[number];
|
||||
|
||||
@@ -372,6 +372,13 @@ const mergeSettings = (current: SystemSettings, patch: Partial<SystemSettings>):
|
||||
if (patch.hardcover) {
|
||||
out.hardcover = { ...current.hardcover, ...patch.hardcover };
|
||||
}
|
||||
if (patch.webdav) {
|
||||
// Only serverUrl / username / password / rootPath are whitelisted, so
|
||||
// the remote patch never carries the per-device fields (enabled,
|
||||
// deviceId, lastSyncedAt, sync sub-toggles). Spread-with-current
|
||||
// preserves them when the remote updates the synced connection fields.
|
||||
out.webdav = { ...current.webdav, ...patch.webdav };
|
||||
}
|
||||
if (patch.dictionarySettings) {
|
||||
// `defaultProviderId` (last-used tab) is per-device — not in the
|
||||
// whitelist, so the remote patch never sends it. Spread-with-current
|
||||
|
||||
Reference in New Issue
Block a user