From 30dee7b909990551dbfb21fa905654034704b986 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 6 May 2026 14:27:58 +0800 Subject: [PATCH] feat(dict): improve MDict rendering and dictionary management (#4072) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(reader): play sound:// links in MDict definitions via MDD lookup MDX entries reference audio resources with ``. Until now those anchors fell through to the browser, which tried to navigate to an invalid scheme and did nothing useful. Wire each `sound://` anchor inside the rendered MDX body to: - preventDefault + stopPropagation (so the parent card's tap-to-expand doesn't fire), - look up the path in every companion `.mdd` until one returns bytes (js-mdict's `MDD.locateBytes` auto-normalizes the leading separator), - wrap the bytes in a Blob and play via `new Audio(URL.createObjectURL)`, - cache the resolved URL on the anchor so subsequent clicks reuse it, with the URL tracked for revocation in `dispose()`. Note: many MW-style dictionaries use `.spx` (Speex) which Chromium and Safari don't natively decode — the lookup will succeed but playback may fail silently. Other formats (mp3, wav, ogg vorbis) play fine. Co-Authored-By: Claude Opus 4.7 (1M context) * feat(dict): improve MDict rendering and dictionary management Builds on the sound:// fix to round out MDict rendering and tighten the dictionary settings panel. MDict provider: - Follow MDict-specific URL schemes inside the rendered HTML: `sound://path` plays via Audio (with a deprecation toast for `.spx` whose codec no major browser decodes), and `entry://word` / `bword://word` forward to ctx.onNavigate so the popup re-looks-up the target. Cycle-bounded (5 hops) `@@@LINK=` content-level redirects are followed transparently, so entries that are pure redirect strings (e.g. "questions" → "question") render the canonical entry instead of the literal redirect text. - Render the body inside a shadow root so each dict's CSS stays scoped — `` references are resolved against the companion .mdd, loose .css files imported alongside the bundle are read at init, and `url(...)` refs inside both are rewritten to blob URLs sourced from the MDD (covers sound icons, background images, @font-face sources). The body is tagged `data-dict-kind="mdict"` for downstream targeting. - A baseline app-level stylesheet (`getDictStyles`) is injected into every shadow root with theme-adaptive `mix-blend-mode` for `` background icons / ` img` (multiply on light, screen on dark); isDarkMode is forwarded via the lookup context. - `` is now treated as MDD-relative (the tightened IMG_SRC_PROTOCOL_RX skips schemes / protocol-relative only); a fallback retry strips the leading slash for bundles that store the resource without it. - The auto-prepended light-DOM headword `

` is hidden when the dict body either leads with a same-text element (any tag — covers `

`, etc.) or contains an `

` with the same trimmed text anywhere (covers wrapper-div-then-h1 layouts). Dictionary management: - Importing a dict whose name matches an existing one now replaces it in place, preserving the slot in providerOrder and inheriting the previous enabled flag. The .css extension is added to the file picker, and loose .css files imported alongside .mdx/.mdd are bundled with the dictionary regardless of stem-match. - The settings panel gains an Edit mode (parity with Delete mode): trailing pencil button on imported dicts and custom web searches opens a rename modal. Edit and Delete are mutually exclusive. Below 400px, the Edit/Delete labels collapse to icons only. Card UX: - The card's tap-to-expand handler now walks `composedPath()` so clicks on anchors / buttons / images inside the shadow root no longer fold the card. i18n: - Translations added for new strings across 33 locales. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .../public/locales/ar/translation.json | 24 +- .../public/locales/bn/translation.json | 20 +- .../public/locales/bo/translation.json | 19 +- .../public/locales/de/translation.json | 20 +- .../public/locales/el/translation.json | 20 +- .../public/locales/en/translation.json | 2 + .../public/locales/es/translation.json | 21 +- .../public/locales/fa/translation.json | 20 +- .../public/locales/fr/translation.json | 21 +- .../public/locales/he/translation.json | 21 +- .../public/locales/hi/translation.json | 20 +- .../public/locales/hu/translation.json | 20 +- .../public/locales/id/translation.json | 19 +- .../public/locales/it/translation.json | 21 +- .../public/locales/ja/translation.json | 19 +- .../public/locales/ko/translation.json | 19 +- .../public/locales/ms/translation.json | 19 +- .../public/locales/nl/translation.json | 20 +- .../public/locales/pl/translation.json | 22 +- .../public/locales/pt-BR/translation.json | 21 +- .../public/locales/pt/translation.json | 21 +- .../public/locales/ro/translation.json | 21 +- .../public/locales/ru/translation.json | 22 +- .../public/locales/si/translation.json | 20 +- .../public/locales/sl/translation.json | 22 +- .../public/locales/sv/translation.json | 20 +- .../public/locales/ta/translation.json | 20 +- .../public/locales/th/translation.json | 19 +- .../public/locales/tr/translation.json | 20 +- .../public/locales/uk/translation.json | 22 +- .../public/locales/uz/translation.json | 20 +- .../public/locales/vi/translation.json | 19 +- .../public/locales/zh-CN/translation.json | 19 +- .../public/locales/zh-TW/translation.json | 19 +- .../dictionaries/mdictProvider.test.ts | 649 +++++++++++++++++- .../store/custom-dictionary-store.test.ts | 29 + .../annotator/DictionaryResultsView.tsx | 17 +- .../settings/CustomDictionaries.tsx | 239 +++++-- apps/readest-app/src/hooks/useFileSelector.ts | 4 +- apps/readest-app/src/services/appService.ts | 7 +- .../dictionaries/dictionaryService.ts | 104 ++- .../dictionaries/providers/mdictProvider.ts | 333 ++++++++- .../src/services/dictionaries/types.ts | 13 + .../src/store/customDictionaryStore.ts | 78 +++ apps/readest-app/src/types/system.ts | 5 +- apps/readest-app/src/utils/style.ts | 20 + 46 files changed, 1824 insertions(+), 346 deletions(-) diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 3e86015f..fbee1f31 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -876,7 +876,6 @@ "Failed to export the book.": "فشل تصدير الكتاب.", "Export Book": "تصدير الكتاب", "Whole word:": "كلمة كاملة:", - "Error": "خطأ", "Date Published": "تاريخ النشر", "Only for TTS:": "فقط لـ TTS:", "Uploaded": "تم الرفع", @@ -1279,11 +1278,6 @@ "Failed to start stream": "فشل بدء البث", "No dictionaries enabled": "لا توجد قواميس مفعلة", "Enable a dictionary in Settings → Language → Dictionaries.": "فعّل قاموسًا من الإعدادات ← اللغة ← القواميس.", - "No definitions found": "لم يتم العثور على تعريفات", - "Search for {{word}} on the web.": "ابحث عن {{word}} على الويب.", - "Dictionary unsupported": "القاموس غير مدعوم", - "This dictionary format is not supported yet.": "تنسيق هذا القاموس غير مدعوم بعد.", - "Unable to load the word.": "تعذّر تحميل الكلمة.", "Wiktionary": "ويكاموس", "Drag to reorder": "اسحب لإعادة الترتيب", "Built-in": "مدمج", @@ -1305,7 +1299,6 @@ "Import Dictionary": "استيراد قاموس", "No dictionaries available.": "لا تتوفر قواميس.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "تحتاج حزم StarDict إلى ملفات ‎.ifo و‎.idx و‎.dict.dz (الـ‎.syn اختياري).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "حزم MDict تستخدم ملفات ‎.mdx؛ ملفات ‎.mdd المرافقة اختيارية.", "Select all the bundle files together when importing.": "حدد جميع ملفات الحزمة معًا عند الاستيراد.", "Manage Dictionaries": "إدارة القواميس", "Select Dictionary Files": "اختر ملفات القاموس", @@ -1420,5 +1413,20 @@ "Use %WORD% where the looked-up word should appear.": "استخدم %WORD% حيث يجب أن تظهر الكلمة المبحوث عنها.", "Open the search result in your browser:": "افتح نتيجة البحث في متصفحك:", "Open in {{name}}": "افتح في {{name}}", - "Book Fingerprint": "بصمة الكتاب" + "Book Fingerprint": "بصمة الكتاب", + "Search the web": "البحث في الويب", + "App deeplink (readest://)": "رابط التطبيق (readest://)", + "Universal web link (https://)": "رابط ويب شامل (https://)", + "Name cannot be empty.": "لا يمكن أن يكون الاسم فارغًا.", + "Replaced {{count}} existing dictionary_zero": "لم يتم استبدال أي قاموس", + "Replaced {{count}} existing dictionary_one": "تم استبدال قاموس واحد", + "Replaced {{count}} existing dictionary_two": "تم استبدال قاموسين", + "Replaced {{count}} existing dictionary_few": "تم استبدال {{count}} قواميس", + "Replaced {{count}} existing dictionary_many": "تم استبدال {{count}} قاموسًا", + "Replaced {{count}} existing dictionary_other": "تم استبدال {{count}} قاموس", + "Cancel Edit": "إلغاء التعديل", + "Edit Dictionary": "تعديل القاموس", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "تستخدم حزم MDict ملفات .mdx؛ ملفات .mdd و .css المرافقة اختيارية.", + "Dictionary name": "اسم القاموس", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "لا يمكن تشغيل هذا الصوت هنا — يستخدم القاموس تنسيقًا قديمًا. جرّب قاموسًا يستخدم صوت Opus أو MP3 أو WAV." } diff --git a/apps/readest-app/public/locales/bn/translation.json b/apps/readest-app/public/locales/bn/translation.json index 3eac0829..86596a51 100644 --- a/apps/readest-app/public/locales/bn/translation.json +++ b/apps/readest-app/public/locales/bn/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "বই রপ্তানি করতে ব্যর্থ।", "Export Book": "বই রপ্তানি করুন", "Whole word:": "সম্পূর্ণ শব্দ:", - "Error": "ত্রুটি", "Date Published": "প্রকাশনার তারিখ", "Only for TTS:": "শুধুমাত্র TTS-এর জন্য:", "Uploaded": "আপলোড হয়েছে", @@ -1211,11 +1210,6 @@ "Failed to start stream": "স্ট্রিম শুরু করতে ব্যর্থ", "No dictionaries enabled": "কোনো অভিধান সক্রিয় নেই", "Enable a dictionary in Settings → Language → Dictionaries.": "সেটিংস → ভাষা → অভিধান থেকে একটি অভিধান সক্রিয় করুন।", - "No definitions found": "কোনো সংজ্ঞা পাওয়া যায়নি", - "Search for {{word}} on the web.": "ওয়েবে {{word}} খুঁজুন।", - "Dictionary unsupported": "অভিধান সমর্থিত নয়", - "This dictionary format is not supported yet.": "এই অভিধান বিন্যাস এখনো সমর্থিত নয়।", - "Unable to load the word.": "শব্দটি লোড করা যায়নি।", "Wiktionary": "উইক্‌শনারি", "Drag to reorder": "পুনঃক্রম করতে টানুন", "Built-in": "বিল্ট-ইন", @@ -1233,7 +1227,6 @@ "Import Dictionary": "অভিধান আমদানি করুন", "No dictionaries available.": "কোনো অভিধান উপলব্ধ নেই।", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict বান্ডলে .ifo, .idx এবং .dict.dz ফাইল প্রয়োজন (.syn ঐচ্ছিক)।", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict বান্ডলে .mdx ফাইল ব্যবহৃত হয়; সঙ্গী .mdd ফাইল ঐচ্ছিক।", "Select all the bundle files together when importing.": "আমদানির সময় বান্ডলের সব ফাইল একসঙ্গে নির্বাচন করুন।", "Manage Dictionaries": "অভিধান পরিচালনা", "Select Dictionary Files": "অভিধান ফাইল নির্বাচন করুন", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "যেখানে অনুসন্ধান করা শব্দ উপস্থিত হওয়া উচিত সেখানে %WORD% ব্যবহার করুন।", "Open the search result in your browser:": "আপনার ব্রাউজারে অনুসন্ধান ফলাফল খুলুন:", "Open in {{name}}": "{{name}}-এ খুলুন", - "Book Fingerprint": "বইয়ের ফিঙ্গারপ্রিন্ট" + "Book Fingerprint": "বইয়ের ফিঙ্গারপ্রিন্ট", + "Search the web": "ওয়েবে অনুসন্ধান করুন", + "App deeplink (readest://)": "অ্যাপ ডিপলিংক (readest://)", + "Universal web link (https://)": "সর্বজনীন ওয়েব লিঙ্ক (https://)", + "Name cannot be empty.": "নাম খালি রাখা যাবে না।", + "Replaced {{count}} existing dictionary_one": "{{count}}টি বিদ্যমান অভিধান প্রতিস্থাপিত হয়েছে", + "Replaced {{count}} existing dictionary_other": "{{count}}টি বিদ্যমান অভিধান প্রতিস্থাপিত হয়েছে", + "Cancel Edit": "সম্পাদনা বাতিল করুন", + "Edit Dictionary": "অভিধান সম্পাদনা করুন", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict বান্ডেল .mdx ফাইল ব্যবহার করে; সহগামী .mdd ও .css ফাইল ঐচ্ছিক।", + "Dictionary name": "অভিধানের নাম", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "এই অডিও এখানে চালানো যাচ্ছে না — অভিধানটি একটি পুরনো ফর্ম্যাট ব্যবহার করছে। Opus, MP3 বা WAV অডিও সহ একটি ব্যবহার করে দেখুন।" } diff --git a/apps/readest-app/public/locales/bo/translation.json b/apps/readest-app/public/locales/bo/translation.json index e2ce18be..853542c9 100644 --- a/apps/readest-app/public/locales/bo/translation.json +++ b/apps/readest-app/public/locales/bo/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "དཔེ་དེབ་ཕྱིར་འདོན་མི་ཐུབ།", "Export Book": "དཔེ་དེབ་ཕྱིར་འདོན།", "Whole word:": "ཚིག་གྲུབ་ཆ་ཚང་:", - "Error": "ནོར་འཁྲུལ།", "Date Published": "པར་སྐྲུན་ཚེས་གྲངས།", "Only for TTS:": "TTS ལ་ཁོ་ན།:", "Uploaded": "ཡར་སྐྱེལ་བྱས་ཟིན།", @@ -1194,11 +1193,6 @@ "Failed to start stream": "རྒྱུན་སྤེལ་འགོ་འཛུགས་མ་ཐུབ།", "No dictionaries enabled": "ཚིག་མཛོད་གང་ཡང་སྒོ་མི་འབྱེད།", "Enable a dictionary in Settings → Language → Dictionaries.": "སྒྲིག་འགོད ← སྐད་ཡིག ← ཚིག་མཛོད་ནས་ཚིག་མཛོད་ཤིག་ལ་སྒོ་འབྱེད།", - "No definitions found": "གོ་དོན་མི་རྙེད།", - "Search for {{word}} on the web.": "དྲ་ཐོག་ཏུ་ {{word}} ཞིབ་འཚོལ།", - "Dictionary unsupported": "ཚིག་མཛོད་འདི་རྒྱབ་སྐྱོར་མི་བྱེད།", - "This dictionary format is not supported yet.": "ཚིག་མཛོད་འདིའི་རྣམ་པར་ད་དུང་རྒྱབ་སྐྱོར་མི་བྱེད།", - "Unable to load the word.": "ཚིག་འདི་འཇུག་ཐུབ་མ་སོང༌།", "Wiktionary": "ཝི་ཀེ་ཤོག་ནར།", "Drag to reorder": "གོ་རིམ་སྒྱུར་བར་འཐེན།", "Built-in": "ནང་ཁུལ།", @@ -1215,7 +1209,6 @@ "Import Dictionary": "ཚིག་མཛོད་ནང་འདྲེན།", "No dictionaries available.": "ཚིག་མཛོད་གང་ཡང་མི་འདུག།", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict ཡོ་བྱད་ལ་ .ifo དང་ .idx, .dict.dz ཡིག་ཆ་ཁག་དགོས་པ་ཡིན། (.syn ནི་འདེམས་འཁྱོངས་ཡིན།)", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict ཡོ་བྱད་ཀྱིས་ .mdx ཡིག་ཆ་སྤྱོད། མཉམ་འགྲོགས་ .mdd ཡིག་ཆ་ནི་འདེམས་འཁྱོངས་ཡིན།", "Select all the bundle files together when importing.": "ནང་འདྲེན་སྐབས་ཡོ་བྱད་ཡིག་ཆ་ཡོངས་མཉམ་དུ་འདེམས་རོགས།", "Manage Dictionaries": "ཚིག་མཛོད་སྟངས་འཛིན།", "Select Dictionary Files": "ཚིག་མཛོད་ཡིག་ཆ་འདེམས།", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "འཚོལ་བཤེར་བྱས་པའི་ཚིག་འཆར་ས་གནས་སུ་ %WORD% བཀོལ་སྤྱོད་གནང་རོགས།", "Open the search result in your browser:": "ཁྱེད་ཀྱི་བརྡ་འཚོལ་མཁོ་ཆས་ལ་འཚོལ་བཤེར་གྲུབ་འབྲས་ཁ་ཕྱེ:", "Open in {{name}}": "{{name}} ནང་ཁ་ཕྱེ།", - "Book Fingerprint": "དཔེ་ཆའི་མཛུབ་རྗེས།" + "Book Fingerprint": "དཔེ་ཆའི་མཛུབ་རྗེས།", + "Search the web": "དྲ་ངོས་སུ་འཚོལ་ཞིབ།", + "App deeplink (readest://)": "ཉེར་སྤྱོད་ཟབ་སྦྲེལ (readest://)", + "Universal web link (https://)": "སྤྱི་ཁྱབ་དྲ་སྦྲེལ (https://)", + "Name cannot be empty.": "མིང་སྟོང་པར་འཇོག་མི་རུང་།", + "Replaced {{count}} existing dictionary_other": "གཞི་ནས་ཡོད་པའི་ཚིག་མཛོད་ {{count}} བརྗེ་སྒྱུར་བྱས།", + "Cancel Edit": "བཟོ་བཅོས་ཕྱིར་འཐེན།", + "Edit Dictionary": "ཚིག་མཛོད་བཟོ་བཅོས།", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict གི་ཡིག་ཆས་ཚོགས་ཀྱིས་ .mdx ཡིག་ཆ་སྤྱོད། སྦྲེལ་མཐུན་ .mdd དང་ .css ཡིག་ཆ་ཡིན་ན་འདེམས་ཆོག", + "Dictionary name": "ཚིག་མཛོད་མིང་།", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "སྒྲ་འདི་འདིར་སྒྲོག་མི་ཐུབ — ཚིག་མཛོད་འདིས་རྩིས་མེད་པའི་རྣམ་པ་སྤྱོད། Opus, MP3, ཡང་ན་ WAV གི་སྒྲ་ལྡན་པ་ཞིག་ལ་འདེམས་སྡུར་གྱིས།" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index f04860c5..e0c7606d 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "Buch konnte nicht exportiert werden.", "Export Book": "Buch exportieren", "Whole word:": "Ganzes Wort:", - "Error": "Fehler", "Date Published": "Veröffentlichungsdatum", "Only for TTS:": "Nur für TTS:", "Uploaded": "Hochgeladen", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Stream konnte nicht gestartet werden", "No dictionaries enabled": "Keine Wörterbücher aktiviert", "Enable a dictionary in Settings → Language → Dictionaries.": "Aktiviere ein Wörterbuch unter Einstellungen → Sprache → Wörterbücher.", - "No definitions found": "Keine Definitionen gefunden", - "Search for {{word}} on the web.": "Suche {{word}} im Web.", - "Dictionary unsupported": "Wörterbuch nicht unterstützt", - "This dictionary format is not supported yet.": "Dieses Wörterbuchformat wird noch nicht unterstützt.", - "Unable to load the word.": "Wort konnte nicht geladen werden.", "Wiktionary": "Wiktionary", "Drag to reorder": "Zum Neuanordnen ziehen", "Built-in": "Integriert", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Wörterbuch importieren", "No dictionaries available.": "Keine Wörterbücher verfügbar.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-Bundles benötigen .ifo-, .idx- und .dict.dz-Dateien (.syn optional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict-Bundles verwenden .mdx-Dateien; begleitende .mdd-Dateien sind optional.", "Select all the bundle files together when importing.": "Wähle beim Import alle Bundle-Dateien zusammen aus.", "Manage Dictionaries": "Wörterbücher verwalten", "Select Dictionary Files": "Wörterbuchdateien auswählen", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Verwenden Sie %WORD%, wo das gesuchte Wort erscheinen soll.", "Open the search result in your browser:": "Öffne das Suchergebnis in deinem Browser:", "Open in {{name}}": "In {{name}} öffnen", - "Book Fingerprint": "Buch-Fingerabdruck" + "Book Fingerprint": "Buch-Fingerabdruck", + "Search the web": "Im Web suchen", + "App deeplink (readest://)": "App-Deeplink (readest://)", + "Universal web link (https://)": "Universeller Weblink (https://)", + "Name cannot be empty.": "Name darf nicht leer sein.", + "Replaced {{count}} existing dictionary_one": "{{count}} bestehendes Wörterbuch ersetzt", + "Replaced {{count}} existing dictionary_other": "{{count}} bestehende Wörterbücher ersetzt", + "Cancel Edit": "Bearbeiten abbrechen", + "Edit Dictionary": "Wörterbuch bearbeiten", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-Bundles verwenden .mdx-Dateien; begleitende .mdd- und .css-Dateien sind optional.", + "Dictionary name": "Wörterbuchname", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Diese Audio kann hier nicht abgespielt werden — das Wörterbuch verwendet ein veraltetes Format. Probieren Sie ein Wörterbuch mit Opus-, MP3- oder WAV-Audio." } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 1314d882..9ce04f9b 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "Αποτυχία εξαγωγής του βιβλίου.", "Export Book": "Εξαγωγή βιβλίου", "Whole word:": "Ολόκληρη λέξη:", - "Error": "Σφάλμα", "Date Published": "Ημερομηνία δημοσίευσης", "Only for TTS:": "Μόνο για TTS:", "Uploaded": "Μεταφορτώθηκε", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Αποτυχία έναρξης ροής", "No dictionaries enabled": "Δεν είναι ενεργοποιημένο κανένα λεξικό", "Enable a dictionary in Settings → Language → Dictionaries.": "Ενεργοποιήστε ένα λεξικό από Ρυθμίσεις → Γλώσσα → Λεξικά.", - "No definitions found": "Δεν βρέθηκαν ορισμοί", - "Search for {{word}} on the web.": "Αναζήτηση {{word}} στον ιστό.", - "Dictionary unsupported": "Το λεξικό δεν υποστηρίζεται", - "This dictionary format is not supported yet.": "Αυτή η μορφή λεξικού δεν υποστηρίζεται ακόμα.", - "Unable to load the word.": "Δεν ήταν δυνατή η φόρτωση της λέξης.", "Wiktionary": "Wiktionary", "Drag to reorder": "Σύρετε για επαναταξινόμηση", "Built-in": "Ενσωματωμένο", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Εισαγωγή λεξικού", "No dictionaries available.": "Δεν υπάρχουν διαθέσιμα λεξικά.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Τα πακέτα StarDict χρειάζονται αρχεία .ifo, .idx και .dict.dz (το .syn είναι προαιρετικό).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Τα πακέτα MDict χρησιμοποιούν αρχεία .mdx· τα συνοδευτικά .mdd είναι προαιρετικά.", "Select all the bundle files together when importing.": "Επιλέξτε όλα τα αρχεία του πακέτου μαζί κατά την εισαγωγή.", "Manage Dictionaries": "Διαχείριση λεξικών", "Select Dictionary Files": "Επιλογή αρχείων λεξικού", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Χρησιμοποιήστε %WORD% όπου πρέπει να εμφανίζεται η λέξη αναζήτησης.", "Open the search result in your browser:": "Ανοίξτε το αποτέλεσμα αναζήτησης στο πρόγραμμα περιήγησής σας:", "Open in {{name}}": "Άνοιγμα σε {{name}}", - "Book Fingerprint": "Δακτυλικό αποτύπωμα βιβλίου" + "Book Fingerprint": "Δακτυλικό αποτύπωμα βιβλίου", + "Search the web": "Αναζήτηση στον ιστό", + "App deeplink (readest://)": "Σύνδεσμος εφαρμογής (readest://)", + "Universal web link (https://)": "Γενικός σύνδεσμος ιστού (https://)", + "Name cannot be empty.": "Το όνομα δεν μπορεί να είναι κενό.", + "Replaced {{count}} existing dictionary_one": "Αντικαταστάθηκε {{count}} υπάρχον λεξικό", + "Replaced {{count}} existing dictionary_other": "Αντικαταστάθηκαν {{count}} υπάρχοντα λεξικά", + "Cancel Edit": "Ακύρωση επεξεργασίας", + "Edit Dictionary": "Επεξεργασία λεξικού", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Τα πακέτα MDict χρησιμοποιούν αρχεία .mdx· τα συνοδευτικά αρχεία .mdd και .css είναι προαιρετικά.", + "Dictionary name": "Όνομα λεξικού", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Αυτός ο ήχος δεν μπορεί να αναπαραχθεί εδώ — το λεξικό χρησιμοποιεί ξεπερασμένη μορφή. Δοκιμάστε ένα λεξικό με ήχο Opus, MP3 ή WAV." } diff --git a/apps/readest-app/public/locales/en/translation.json b/apps/readest-app/public/locales/en/translation.json index ebd1e5bb..f92dc562 100644 --- a/apps/readest-app/public/locales/en/translation.json +++ b/apps/readest-app/public/locales/en/translation.json @@ -40,6 +40,8 @@ "Failed to sync {{count}} OPDS catalog(s)_other": "Failed to sync {{count}} OPDS catalogs", "Imported {{count}} dictionary_one": "Imported {{count}} dictionary", "Imported {{count}} dictionary_other": "Imported {{count}} dictionaries", + "Replaced {{count}} existing dictionary_one": "Replaced {{count}} existing dictionary", + "Replaced {{count}} existing dictionary_other": "Replaced {{count}} existing dictionaries", "{{count}} books refreshed_one": "{{count}} book refreshed", "{{count}} books refreshed_other": "{{count}} books refreshed", "{{count}} failed_one": "{{count}} failed", diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 8be7940d..e3c09320 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -846,7 +846,6 @@ "Failed to export the book.": "Error al exportar el libro.", "Export Book": "Exportar libro", "Whole word:": "Palabra completa:", - "Error": "Error", "Date Published": "Fecha de publicación", "Only for TTS:": "Solo para TTS:", "Uploaded": "Subido", @@ -1228,11 +1227,6 @@ "Failed to start stream": "No se pudo iniciar el streaming", "No dictionaries enabled": "No hay diccionarios habilitados", "Enable a dictionary in Settings → Language → Dictionaries.": "Habilita un diccionario en Ajustes → Idioma → Diccionarios.", - "No definitions found": "No se encontraron definiciones", - "Search for {{word}} on the web.": "Buscar {{word}} en la web.", - "Dictionary unsupported": "Diccionario no compatible", - "This dictionary format is not supported yet.": "Este formato de diccionario aún no es compatible.", - "Unable to load the word.": "No se pudo cargar la palabra.", "Wiktionary": "Wiktionary", "Drag to reorder": "Arrastrar para reordenar", "Built-in": "Integrado", @@ -1251,7 +1245,6 @@ "Import Dictionary": "Importar diccionario", "No dictionaries available.": "No hay diccionarios disponibles.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Los paquetes StarDict requieren archivos .ifo, .idx y .dict.dz (.syn opcional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Los paquetes MDict usan archivos .mdx; los .mdd asociados son opcionales.", "Select all the bundle files together when importing.": "Selecciona todos los archivos del paquete juntos al importar.", "Manage Dictionaries": "Administrar diccionarios", "Select Dictionary Files": "Seleccionar archivos de diccionario", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "Use %WORD% donde debe aparecer la palabra buscada.", "Open the search result in your browser:": "Abre el resultado de búsqueda en tu navegador:", "Open in {{name}}": "Abrir en {{name}}", - "Book Fingerprint": "Huella del libro" + "Book Fingerprint": "Huella del libro", + "Search the web": "Buscar en la web", + "App deeplink (readest://)": "Enlace profundo de la app (readest://)", + "Universal web link (https://)": "Enlace web universal (https://)", + "Name cannot be empty.": "El nombre no puede estar vacío.", + "Replaced {{count}} existing dictionary_one": "Se reemplazó {{count}} diccionario existente", + "Replaced {{count}} existing dictionary_many": "Se reemplazaron {{count}} diccionarios existentes", + "Replaced {{count}} existing dictionary_other": "Se reemplazaron {{count}} diccionarios existentes", + "Cancel Edit": "Cancelar edición", + "Edit Dictionary": "Editar diccionario", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Los paquetes MDict usan archivos .mdx; los archivos .mdd y .css complementarios son opcionales.", + "Dictionary name": "Nombre del diccionario", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Este audio no se puede reproducir aquí — el diccionario usa un formato obsoleto. Prueba uno con audio Opus, MP3 o WAV." } diff --git a/apps/readest-app/public/locales/fa/translation.json b/apps/readest-app/public/locales/fa/translation.json index a8af43e3..2d71a677 100644 --- a/apps/readest-app/public/locales/fa/translation.json +++ b/apps/readest-app/public/locales/fa/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "صادر کردن کتاب ناموفق بود.", "Export Book": "صادر کردن کتاب", "Whole word:": "کلمه کامل:", - "Error": "خطا", "Date Published": "تاریخ انتشار", "Only for TTS:": "فقط برای TTS:", "Uploaded": "بارگذاری شد", @@ -1211,11 +1210,6 @@ "Failed to start stream": "شروع پخش ناموفق بود", "No dictionaries enabled": "هیچ فرهنگ‌لغتی فعال نیست", "Enable a dictionary in Settings → Language → Dictionaries.": "فرهنگ‌لغتی را از تنظیمات ← زبان ← فرهنگ‌لغت‌ها فعال کنید.", - "No definitions found": "هیچ معنی‌ای یافت نشد", - "Search for {{word}} on the web.": "جست‌وجوی {{word}} در وب.", - "Dictionary unsupported": "فرهنگ‌لغت پشتیبانی نمی‌شود", - "This dictionary format is not supported yet.": "این قالب فرهنگ‌لغت هنوز پشتیبانی نمی‌شود.", - "Unable to load the word.": "بارگذاری واژه ممکن نشد.", "Wiktionary": "ویکی‌واژه", "Drag to reorder": "برای تغییر ترتیب بکشید", "Built-in": "داخلی", @@ -1233,7 +1227,6 @@ "Import Dictionary": "وارد کردن فرهنگ‌لغت", "No dictionaries available.": "هیچ فرهنگ‌لغتی در دسترس نیست.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "بسته‌های StarDict به فایل‌های .ifo، .idx و .dict.dz نیاز دارند (.syn اختیاری).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "بسته‌های MDict از فایل‌های .mdx استفاده می‌کنند؛ فایل‌های همراه .mdd اختیاری‌اند.", "Select all the bundle files together when importing.": "هنگام وارد کردن، همه فایل‌های بسته را با هم انتخاب کنید.", "Manage Dictionaries": "مدیریت فرهنگ‌لغت‌ها", "Select Dictionary Files": "انتخاب فایل‌های فرهنگ‌لغت", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "از %WORD% در جایی که کلمه‌ی مورد جست‌وجو باید ظاهر شود، استفاده کنید.", "Open the search result in your browser:": "نتیجه‌ی جست‌وجو را در مرورگر باز کنید:", "Open in {{name}}": "بازکردن در {{name}}", - "Book Fingerprint": "اثر انگشت کتاب" + "Book Fingerprint": "اثر انگشت کتاب", + "Search the web": "جستجو در وب", + "App deeplink (readest://)": "پیوند درون‌برنامه‌ای (readest://)", + "Universal web link (https://)": "پیوند وب جهانی (https://)", + "Name cannot be empty.": "نام نمی‌تواند خالی باشد.", + "Replaced {{count}} existing dictionary_one": "{{count}} فرهنگ‌نامه موجود جایگزین شد", + "Replaced {{count}} existing dictionary_other": "{{count}} فرهنگ‌نامه موجود جایگزین شدند", + "Cancel Edit": "لغو ویرایش", + "Edit Dictionary": "ویرایش فرهنگ‌نامه", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "بسته‌های MDict از فایل‌های .mdx استفاده می‌کنند؛ فایل‌های همراه .mdd و .css اختیاری هستند.", + "Dictionary name": "نام فرهنگ‌نامه", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "این صدا اینجا قابل پخش نیست — فرهنگ‌نامه از قالبی قدیمی استفاده می‌کند. فرهنگ‌نامه‌ای با صدای Opus، MP3 یا WAV را امتحان کنید." } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 0e1aaefa..d8044d3d 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -846,7 +846,6 @@ "Failed to export the book.": "Échec de l'exportation du livre.", "Export Book": "Exporter le livre", "Whole word:": "Mot entier :", - "Error": "Erreur", "Date Published": "Date de publication", "Only for TTS:": "Uniquement pour TTS :", "Uploaded": "Téléversé", @@ -1228,11 +1227,6 @@ "Failed to start stream": "Échec du démarrage du flux", "No dictionaries enabled": "Aucun dictionnaire activé", "Enable a dictionary in Settings → Language → Dictionaries.": "Activez un dictionnaire dans Paramètres → Langue → Dictionnaires.", - "No definitions found": "Aucune définition trouvée", - "Search for {{word}} on the web.": "Rechercher {{word}} sur le web.", - "Dictionary unsupported": "Dictionnaire non pris en charge", - "This dictionary format is not supported yet.": "Ce format de dictionnaire n’est pas encore pris en charge.", - "Unable to load the word.": "Impossible de charger le mot.", "Wiktionary": "Wiktionnaire", "Drag to reorder": "Glisser pour réorganiser", "Built-in": "Intégré", @@ -1251,7 +1245,6 @@ "Import Dictionary": "Importer un dictionnaire", "No dictionaries available.": "Aucun dictionnaire disponible.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Les paquets StarDict nécessitent des fichiers .ifo, .idx et .dict.dz (.syn optionnel).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Les paquets MDict utilisent des fichiers .mdx ; les .mdd associés sont optionnels.", "Select all the bundle files together when importing.": "Sélectionnez tous les fichiers du paquet ensemble lors de l’import.", "Manage Dictionaries": "Gérer les dictionnaires", "Select Dictionary Files": "Sélectionner les fichiers du dictionnaire", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "Utilisez %WORD% à l'endroit où le mot recherché doit apparaître.", "Open the search result in your browser:": "Ouvrir le résultat de la recherche dans votre navigateur :", "Open in {{name}}": "Ouvrir dans {{name}}", - "Book Fingerprint": "Empreinte du livre" + "Book Fingerprint": "Empreinte du livre", + "Search the web": "Rechercher sur le web", + "App deeplink (readest://)": "Lien profond de l’application (readest://)", + "Universal web link (https://)": "Lien web universel (https://)", + "Name cannot be empty.": "Le nom ne peut pas être vide.", + "Replaced {{count}} existing dictionary_one": "{{count}} dictionnaire existant remplacé", + "Replaced {{count}} existing dictionary_many": "{{count}} dictionnaires existants remplacés", + "Replaced {{count}} existing dictionary_other": "{{count}} dictionnaires existants remplacés", + "Cancel Edit": "Annuler la modification", + "Edit Dictionary": "Modifier le dictionnaire", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Les bundles MDict utilisent des fichiers .mdx ; les fichiers .mdd et .css associés sont facultatifs.", + "Dictionary name": "Nom du dictionnaire", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Cet audio ne peut pas être lu ici — le dictionnaire utilise un format obsolète. Essayez-en un avec un audio Opus, MP3 ou WAV." } diff --git a/apps/readest-app/public/locales/he/translation.json b/apps/readest-app/public/locales/he/translation.json index 05bf5ce7..beab0a32 100644 --- a/apps/readest-app/public/locales/he/translation.json +++ b/apps/readest-app/public/locales/he/translation.json @@ -387,7 +387,6 @@ "System Language": "שפת המערכת", "No translation available.": "אין תרגום זמין.", "Translated by {{provider}}.": "תורגם על ידי {{provider}}.", - "Error": "שגיאה", "Remove Bookmark": "הסר סימנייה", "Add Bookmark": "הוסף סימנייה", "Books Content": "תוכן ספרים", @@ -1228,11 +1227,6 @@ "Failed to start stream": "הפעלת הזרם נכשלה", "No dictionaries enabled": "לא הופעלו מילונים", "Enable a dictionary in Settings → Language → Dictionaries.": "הפעילו מילון מההגדרות ← שפה ← מילונים.", - "No definitions found": "לא נמצאו הגדרות", - "Search for {{word}} on the web.": "חיפוש {{word}} באינטרנט.", - "Dictionary unsupported": "מילון לא נתמך", - "This dictionary format is not supported yet.": "תבנית המילון הזו אינה נתמכת עדיין.", - "Unable to load the word.": "לא ניתן לטעון את המילה.", "Wiktionary": "ויקימילון", "Drag to reorder": "גררו כדי לסדר מחדש", "Built-in": "מובנה", @@ -1251,7 +1245,6 @@ "Import Dictionary": "ייבא מילון", "No dictionaries available.": "אין מילונים זמינים.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "חבילות StarDict דורשות קבצי .ifo,‏ .idx ו-.dict.dz (.syn אופציונלי).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "חבילות MDict משתמשות בקבצי .mdx; קבצי .mdd נלווים הם אופציונליים.", "Select all the bundle files together when importing.": "בחרו את כל קבצי החבילה יחד בעת הייבוא.", "Manage Dictionaries": "ניהול מילונים", "Select Dictionary Files": "בחירת קבצי מילון", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "השתמש ב-%WORD% היכן שהמילה המבוקשת צריכה להופיע.", "Open the search result in your browser:": "פתח את תוצאת החיפוש בדפדפן שלך:", "Open in {{name}}": "פתח ב-{{name}}", - "Book Fingerprint": "טביעת אצבע של הספר" + "Book Fingerprint": "טביעת אצבע של הספר", + "Search the web": "חיפוש באינטרנט", + "App deeplink (readest://)": "קישור עמוק לאפליקציה (readest://)", + "Universal web link (https://)": "קישור אינטרנט אוניברסלי (https://)", + "Name cannot be empty.": "השם אינו יכול להיות ריק.", + "Replaced {{count}} existing dictionary_one": "הוחלף {{count}} מילון קיים", + "Replaced {{count}} existing dictionary_two": "הוחלפו {{count}} מילונים קיימים", + "Replaced {{count}} existing dictionary_other": "הוחלפו {{count}} מילונים קיימים", + "Cancel Edit": "בטל עריכה", + "Edit Dictionary": "ערוך מילון", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "חבילות MDict משתמשות בקובצי .mdx; קובצי .mdd ו‑.css נלווים הם אופציונליים.", + "Dictionary name": "שם המילון", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "לא ניתן להשמיע את השמע הזה כאן — המילון משתמש בפורמט מיושן. נסה מילון עם שמע Opus, MP3 או WAV." } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 0f196f33..e72107f7 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "पुस्तक निर्यात करने में विफल।", "Export Book": "पुस्तक निर्यात करें", "Whole word:": "पूरा शब्द:", - "Error": "त्रुटि", "Date Published": "प्रकाशन तिथि", "Only for TTS:": "केवल TTS के लिए:", "Uploaded": "अपलोड किया गया", @@ -1211,11 +1210,6 @@ "Failed to start stream": "स्ट्रीम प्रारंभ करने में विफल", "No dictionaries enabled": "कोई शब्दकोश सक्षम नहीं है", "Enable a dictionary in Settings → Language → Dictionaries.": "सेटिंग्स → भाषा → शब्दकोश में जाकर शब्दकोश सक्षम करें।", - "No definitions found": "कोई परिभाषा नहीं मिली", - "Search for {{word}} on the web.": "वेब पर {{word}} खोजें।", - "Dictionary unsupported": "शब्दकोश समर्थित नहीं है", - "This dictionary format is not supported yet.": "यह शब्दकोश प्रारूप अभी समर्थित नहीं है।", - "Unable to load the word.": "शब्द लोड नहीं किया जा सका।", "Wiktionary": "विक्षनरी", "Drag to reorder": "पुनः क्रमित करने के लिए खींचें", "Built-in": "अंतर्निर्मित", @@ -1233,7 +1227,6 @@ "Import Dictionary": "शब्दकोश आयात करें", "No dictionaries available.": "कोई शब्दकोश उपलब्ध नहीं है।", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict बंडल को .ifo, .idx और .dict.dz फ़ाइलें चाहिए (.syn वैकल्पिक)।", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict बंडल .mdx फ़ाइलों का उपयोग करते हैं; साथी .mdd फ़ाइलें वैकल्पिक हैं।", "Select all the bundle files together when importing.": "आयात करते समय बंडल की सभी फ़ाइलें एक साथ चुनें।", "Manage Dictionaries": "शब्दकोश प्रबंधित करें", "Select Dictionary Files": "शब्दकोश फ़ाइलें चुनें", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "%WORD% का उपयोग वहां करें जहां खोजा गया शब्द दिखाई देना चाहिए।", "Open the search result in your browser:": "अपने ब्राउज़र में खोज परिणाम खोलें:", "Open in {{name}}": "{{name}} में खोलें", - "Book Fingerprint": "पुस्तक फिंगरप्रिंट" + "Book Fingerprint": "पुस्तक फिंगरप्रिंट", + "Search the web": "वेब पर खोजें", + "App deeplink (readest://)": "ऐप डीप लिंक (readest://)", + "Universal web link (https://)": "सार्वभौमिक वेब लिंक (https://)", + "Name cannot be empty.": "नाम खाली नहीं हो सकता।", + "Replaced {{count}} existing dictionary_one": "{{count}} मौजूदा शब्दकोश बदला गया", + "Replaced {{count}} existing dictionary_other": "{{count}} मौजूदा शब्दकोश बदले गए", + "Cancel Edit": "संपादन रद्द करें", + "Edit Dictionary": "शब्दकोश संपादित करें", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict बंडल .mdx फ़ाइलों का उपयोग करते हैं; साथ की .mdd और .css फ़ाइलें वैकल्पिक हैं।", + "Dictionary name": "शब्दकोश का नाम", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "यह ऑडियो यहाँ नहीं चलाया जा सकता — शब्दकोश पुराने प्रारूप का उपयोग करता है। Opus, MP3 या WAV ऑडियो वाला कोई आज़माएँ।" } diff --git a/apps/readest-app/public/locales/hu/translation.json b/apps/readest-app/public/locales/hu/translation.json index c02a64f4..364dcd1d 100644 --- a/apps/readest-app/public/locales/hu/translation.json +++ b/apps/readest-app/public/locales/hu/translation.json @@ -418,7 +418,6 @@ "System Language": "Rendszernyelv", "No translation available.": "Nem érhető el fordítás.", "Translated by {{provider}}.": "Fordította: {{provider}}.", - "Error": "Hiba", "Remove Bookmark": "Könyvjelző eltávolítása", "Add Bookmark": "Könyvjelző hozzáadása", "Books Content": "Könyvek tartalma", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Nem sikerült elindítani a streamet", "No dictionaries enabled": "Nincs engedélyezett szótár", "Enable a dictionary in Settings → Language → Dictionaries.": "Engedélyezz egy szótárt a Beállítások → Nyelv → Szótárak menüben.", - "No definitions found": "Nem található meghatározás", - "Search for {{word}} on the web.": "{{word}} keresése a weben.", - "Dictionary unsupported": "A szótár nem támogatott", - "This dictionary format is not supported yet.": "Ez a szótárformátum még nem támogatott.", - "Unable to load the word.": "A szó nem tölthető be.", "Wiktionary": "Wikiszótár", "Drag to reorder": "Húzd az átrendezéshez", "Built-in": "Beépített", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Szótár importálása", "No dictionaries available.": "Nincsenek elérhető szótárak.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "A StarDict csomagokhoz .ifo, .idx és .dict.dz fájlok szükségesek (.syn opcionális).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Az MDict csomagok .mdx fájlokat használnak; a kísérő .mdd fájlok opcionálisak.", "Select all the bundle files together when importing.": "Importáláskor jelöld ki egyszerre a csomag összes fájlját.", "Manage Dictionaries": "Szótárak kezelése", "Select Dictionary Files": "Válassz szótárfájlokat", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Használja a %WORD%-t ott, ahol a keresett szónak meg kell jelennie.", "Open the search result in your browser:": "Nyissa meg a találatot a böngészőben:", "Open in {{name}}": "Megnyitás itt: {{name}}", - "Book Fingerprint": "Könyv ujjlenyomata" + "Book Fingerprint": "Könyv ujjlenyomata", + "Search the web": "Keresés a weben", + "App deeplink (readest://)": "App-mélylink (readest://)", + "Universal web link (https://)": "Univerzális weblink (https://)", + "Name cannot be empty.": "A név nem lehet üres.", + "Replaced {{count}} existing dictionary_one": "{{count}} meglévő szótár cserélve", + "Replaced {{count}} existing dictionary_other": "{{count}} meglévő szótár cserélve", + "Cancel Edit": "Szerkesztés mégse", + "Edit Dictionary": "Szótár szerkesztése", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Az MDict csomagok .mdx fájlokat használnak; a kísérő .mdd és .css fájlok opcionálisak.", + "Dictionary name": "Szótár neve", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Ez a hang itt nem játszható le — a szótár elavult formátumot használ. Próbálj olyat, amely Opus, MP3 vagy WAV hangot tartalmaz." } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 647a8f27..c620a29a 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "Gagal mengekspor buku.", "Export Book": "Ekspor Buku", "Whole word:": "Kata utuh:", - "Error": "Kesalahan", "Date Published": "Tanggal terbit", "Only for TTS:": "Hanya untuk TTS:", "Uploaded": "Diunggah", @@ -1194,11 +1193,6 @@ "Failed to start stream": "Gagal memulai stream", "No dictionaries enabled": "Tidak ada kamus yang diaktifkan", "Enable a dictionary in Settings → Language → Dictionaries.": "Aktifkan kamus di Pengaturan → Bahasa → Kamus.", - "No definitions found": "Tidak ada definisi yang ditemukan", - "Search for {{word}} on the web.": "Cari {{word}} di web.", - "Dictionary unsupported": "Kamus tidak didukung", - "This dictionary format is not supported yet.": "Format kamus ini belum didukung.", - "Unable to load the word.": "Tidak dapat memuat kata.", "Wiktionary": "Wiktionary", "Drag to reorder": "Seret untuk mengurutkan ulang", "Built-in": "Bawaan", @@ -1215,7 +1209,6 @@ "Import Dictionary": "Impor Kamus", "No dictionaries available.": "Tidak ada kamus yang tersedia.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Paket StarDict memerlukan file .ifo, .idx, dan .dict.dz (.syn opsional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Paket MDict menggunakan file .mdx; file .mdd pendamping bersifat opsional.", "Select all the bundle files together when importing.": "Pilih semua file paket sekaligus saat mengimpor.", "Manage Dictionaries": "Kelola Kamus", "Select Dictionary Files": "Pilih File Kamus", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "Gunakan %WORD% di tempat kata yang dicari harus muncul.", "Open the search result in your browser:": "Buka hasil pencarian di peramban Anda:", "Open in {{name}}": "Buka di {{name}}", - "Book Fingerprint": "Sidik jari buku" + "Book Fingerprint": "Sidik jari buku", + "Search the web": "Cari di web", + "App deeplink (readest://)": "Tautan dalam aplikasi (readest://)", + "Universal web link (https://)": "Tautan web universal (https://)", + "Name cannot be empty.": "Nama tidak boleh kosong.", + "Replaced {{count}} existing dictionary_other": "{{count}} kamus yang ada digantikan", + "Cancel Edit": "Batalkan Edit", + "Edit Dictionary": "Edit Kamus", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Paket MDict menggunakan berkas .mdx; berkas .mdd dan .css pendamping bersifat opsional.", + "Dictionary name": "Nama kamus", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Audio ini tidak dapat diputar di sini — kamus menggunakan format usang. Coba kamus dengan audio Opus, MP3, atau WAV." } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 8b5f715c..7acdda07 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -846,7 +846,6 @@ "Failed to export the book.": "Impossibile esportare il libro.", "Export Book": "Esporta libro", "Whole word:": "Parola intera:", - "Error": "Errore", "Date Published": "Data di pubblicazione", "Only for TTS:": "Solo per TTS:", "Uploaded": "Caricato", @@ -1228,11 +1227,6 @@ "Failed to start stream": "Avvio dello stream non riuscito", "No dictionaries enabled": "Nessun dizionario abilitato", "Enable a dictionary in Settings → Language → Dictionaries.": "Abilita un dizionario in Impostazioni → Lingua → Dizionari.", - "No definitions found": "Nessuna definizione trovata", - "Search for {{word}} on the web.": "Cerca {{word}} sul web.", - "Dictionary unsupported": "Dizionario non supportato", - "This dictionary format is not supported yet.": "Questo formato di dizionario non è ancora supportato.", - "Unable to load the word.": "Impossibile caricare la parola.", "Wiktionary": "Wikizionario", "Drag to reorder": "Trascina per riordinare", "Built-in": "Integrato", @@ -1251,7 +1245,6 @@ "Import Dictionary": "Importa dizionario", "No dictionaries available.": "Nessun dizionario disponibile.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "I pacchetti StarDict richiedono file .ifo, .idx e .dict.dz (.syn opzionale).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "I pacchetti MDict usano file .mdx; i .mdd associati sono opzionali.", "Select all the bundle files together when importing.": "Seleziona tutti i file del pacchetto insieme durante l’importazione.", "Manage Dictionaries": "Gestisci dizionari", "Select Dictionary Files": "Seleziona file del dizionario", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "Usa %WORD% dove dovrebbe apparire la parola cercata.", "Open the search result in your browser:": "Apri il risultato della ricerca nel tuo browser:", "Open in {{name}}": "Apri in {{name}}", - "Book Fingerprint": "Impronta del libro" + "Book Fingerprint": "Impronta del libro", + "Search the web": "Cerca nel web", + "App deeplink (readest://)": "Deeplink app (readest://)", + "Universal web link (https://)": "Link web universale (https://)", + "Name cannot be empty.": "Il nome non può essere vuoto.", + "Replaced {{count}} existing dictionary_one": "Sostituito {{count}} dizionario esistente", + "Replaced {{count}} existing dictionary_many": "Sostituiti {{count}} dizionari esistenti", + "Replaced {{count}} existing dictionary_other": "Sostituiti {{count}} dizionari esistenti", + "Cancel Edit": "Annulla modifica", + "Edit Dictionary": "Modifica dizionario", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "I pacchetti MDict usano file .mdx; i file .mdd e .css di accompagnamento sono facoltativi.", + "Dictionary name": "Nome del dizionario", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Questo audio non può essere riprodotto qui — il dizionario usa un formato obsoleto. Prova un dizionario con audio Opus, MP3 o WAV." } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 176f6fcc..b9a59a4f 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "書籍のエクスポートに失敗しました。", "Export Book": "書籍をエクスポート", "Whole word:": "単語全体:", - "Error": "エラー", "Date Published": "出版日", "Only for TTS:": "TTSのみ:", "Uploaded": "アップロード済み", @@ -1194,11 +1193,6 @@ "Failed to start stream": "ストリームの開始に失敗しました", "No dictionaries enabled": "有効な辞書がありません", "Enable a dictionary in Settings → Language → Dictionaries.": "設定 → 言語 → 辞書 で辞書を有効にしてください。", - "No definitions found": "定義が見つかりません", - "Search for {{word}} on the web.": "ウェブで {{word}} を検索。", - "Dictionary unsupported": "辞書は未対応です", - "This dictionary format is not supported yet.": "この辞書形式はまだサポートされていません。", - "Unable to load the word.": "単語を読み込めませんでした。", "Wiktionary": "ウィクショナリー", "Drag to reorder": "ドラッグで並べ替え", "Built-in": "組み込み", @@ -1215,7 +1209,6 @@ "Import Dictionary": "辞書をインポート", "No dictionaries available.": "利用可能な辞書はありません。", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict バンドルには .ifo、.idx、.dict.dz ファイルが必要です(.syn は任意)。", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict バンドルは .mdx ファイルを使用します。付随する .mdd ファイルは任意です。", "Select all the bundle files together when importing.": "インポート時はバンドルのファイルをまとめて選択してください。", "Manage Dictionaries": "辞書を管理", "Select Dictionary Files": "辞書ファイルを選択", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "調べる単語が表示される場所に %WORD% を使用してください。", "Open the search result in your browser:": "検索結果をブラウザで開く:", "Open in {{name}}": "{{name}} で開く", - "Book Fingerprint": "書籍の指紋" + "Book Fingerprint": "書籍の指紋", + "Search the web": "ウェブで検索", + "App deeplink (readest://)": "アプリディープリンク (readest://)", + "Universal web link (https://)": "ユニバーサルウェブリンク (https://)", + "Name cannot be empty.": "名前を空にすることはできません。", + "Replaced {{count}} existing dictionary_other": "既存の辞書 {{count}} 件を置き換えました", + "Cancel Edit": "編集をキャンセル", + "Edit Dictionary": "辞書を編集", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict バンドルは .mdx ファイルを使用します。付属の .mdd および .css ファイルは任意です。", + "Dictionary name": "辞書名", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "この音声はここで再生できません — 辞書が古い形式を使用しています。Opus、MP3、または WAV 音声を使用する辞書を試してください。" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index ec9fdd6e..fa859eb9 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "책 내보내기에 실패했습니다.", "Export Book": "책 내보내기", "Whole word:": "전체 단어:", - "Error": "오류", "Date Published": "출판일", "Only for TTS:": "TTS 전용:", "Uploaded": "업로드됨", @@ -1194,11 +1193,6 @@ "Failed to start stream": "스트림을 시작할 수 없습니다", "No dictionaries enabled": "활성화된 사전이 없습니다", "Enable a dictionary in Settings → Language → Dictionaries.": "설정 → 언어 → 사전 에서 사전을 활성화하세요.", - "No definitions found": "정의를 찾을 수 없습니다", - "Search for {{word}} on the web.": "웹에서 {{word}} 검색.", - "Dictionary unsupported": "지원되지 않는 사전", - "This dictionary format is not supported yet.": "이 사전 형식은 아직 지원되지 않습니다.", - "Unable to load the word.": "단어를 불러올 수 없습니다.", "Wiktionary": "위키낱말사전", "Drag to reorder": "드래그하여 순서 변경", "Built-in": "내장", @@ -1215,7 +1209,6 @@ "Import Dictionary": "사전 가져오기", "No dictionaries available.": "사용 가능한 사전이 없습니다.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 번들은 .ifo, .idx, .dict.dz 파일이 필요합니다(.syn은 선택).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict 번들은 .mdx 파일을 사용하며, 동반되는 .mdd 파일은 선택입니다.", "Select all the bundle files together when importing.": "가져올 때 번들의 모든 파일을 함께 선택하세요.", "Manage Dictionaries": "사전 관리", "Select Dictionary Files": "사전 파일 선택", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "검색어가 표시될 위치에 %WORD%를 사용하세요.", "Open the search result in your browser:": "브라우저에서 검색 결과 열기:", "Open in {{name}}": "{{name}}에서 열기", - "Book Fingerprint": "책 지문" + "Book Fingerprint": "책 지문", + "Search the web": "웹에서 검색", + "App deeplink (readest://)": "앱 딥링크 (readest://)", + "Universal web link (https://)": "범용 웹 링크 (https://)", + "Name cannot be empty.": "이름은 비워 둘 수 없습니다.", + "Replaced {{count}} existing dictionary_other": "기존 사전 {{count}}개를 교체했습니다", + "Cancel Edit": "편집 취소", + "Edit Dictionary": "사전 편집", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 번들은 .mdx 파일을 사용합니다. 동반된 .mdd 및 .css 파일은 선택 사항입니다.", + "Dictionary name": "사전 이름", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "여기서는 이 오디오를 재생할 수 없습니다 — 사전이 오래된 형식을 사용합니다. Opus, MP3 또는 WAV 오디오 사전을 사용해 보세요." } diff --git a/apps/readest-app/public/locales/ms/translation.json b/apps/readest-app/public/locales/ms/translation.json index 698fb6a1..2adc2f0f 100644 --- a/apps/readest-app/public/locales/ms/translation.json +++ b/apps/readest-app/public/locales/ms/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "Gagal mengeksport buku.", "Export Book": "Eksport Buku", "Whole word:": "Perkataan penuh:", - "Error": "Ralat", "Date Published": "Tarikh diterbitkan", "Only for TTS:": "Hanya untuk TTS:", "Uploaded": "Dimuat naik", @@ -1194,11 +1193,6 @@ "Failed to start stream": "Gagal memulakan strim", "No dictionaries enabled": "Tiada kamus diaktifkan", "Enable a dictionary in Settings → Language → Dictionaries.": "Aktifkan kamus di Tetapan → Bahasa → Kamus.", - "No definitions found": "Tiada definisi ditemukan", - "Search for {{word}} on the web.": "Cari {{word}} di web.", - "Dictionary unsupported": "Kamus tidak disokong", - "This dictionary format is not supported yet.": "Format kamus ini belum disokong.", - "Unable to load the word.": "Tidak dapat memuatkan perkataan.", "Wiktionary": "Wiktionary", "Drag to reorder": "Seret untuk susun semula", "Built-in": "Terbina dalam", @@ -1215,7 +1209,6 @@ "Import Dictionary": "Import Kamus", "No dictionaries available.": "Tiada kamus tersedia.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Bundle StarDict memerlukan fail .ifo, .idx dan .dict.dz (.syn pilihan).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Bundle MDict menggunakan fail .mdx; fail .mdd pengiring adalah pilihan.", "Select all the bundle files together when importing.": "Pilih semua fail bundle sekali gus semasa mengimport.", "Manage Dictionaries": "Urus Kamus", "Select Dictionary Files": "Pilih Fail Kamus", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "Gunakan %WORD% di mana perkataan yang dicari harus muncul.", "Open the search result in your browser:": "Buka hasil carian dalam pelayar anda:", "Open in {{name}}": "Buka dalam {{name}}", - "Book Fingerprint": "Cap jari buku" + "Book Fingerprint": "Cap jari buku", + "Search the web": "Cari di web", + "App deeplink (readest://)": "Pautan dalam apl (readest://)", + "Universal web link (https://)": "Pautan web universal (https://)", + "Name cannot be empty.": "Nama tidak boleh kosong.", + "Replaced {{count}} existing dictionary_other": "Menggantikan {{count}} kamus sedia ada", + "Cancel Edit": "Batal Sunting", + "Edit Dictionary": "Sunting Kamus", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Bungkusan MDict menggunakan fail .mdx; fail .mdd dan .css yang menyertainya adalah pilihan.", + "Dictionary name": "Nama kamus", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Audio ini tidak boleh dimainkan di sini — kamus menggunakan format lapuk. Cuba kamus dengan audio Opus, MP3 atau WAV." } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 37e9a803..76520d4e 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "Exporteren van het boek mislukt.", "Export Book": "Boek exporteren", "Whole word:": "Heel woord:", - "Error": "Fout", "Date Published": "Publicatiedatum", "Only for TTS:": "Alleen voor TTS:", "Uploaded": "Geüpload", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Kan stream niet starten", "No dictionaries enabled": "Geen woordenboeken ingeschakeld", "Enable a dictionary in Settings → Language → Dictionaries.": "Schakel een woordenboek in via Instellingen → Taal → Woordenboeken.", - "No definitions found": "Geen definities gevonden", - "Search for {{word}} on the web.": "Zoek {{word}} op het web.", - "Dictionary unsupported": "Woordenboek niet ondersteund", - "This dictionary format is not supported yet.": "Dit woordenboekformaat wordt nog niet ondersteund.", - "Unable to load the word.": "Kan het woord niet laden.", "Wiktionary": "Wiktionary", "Drag to reorder": "Sleep om opnieuw te ordenen", "Built-in": "Ingebouwd", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Woordenboek importeren", "No dictionaries available.": "Geen woordenboeken beschikbaar.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-bundels hebben .ifo-, .idx- en .dict.dz-bestanden nodig (.syn optioneel).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict-bundels gebruiken .mdx-bestanden; bijbehorende .mdd-bestanden zijn optioneel.", "Select all the bundle files together when importing.": "Selecteer bij het importeren alle bundelbestanden tegelijk.", "Manage Dictionaries": "Woordenboeken beheren", "Select Dictionary Files": "Woordenboekbestanden kiezen", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Gebruik %WORD% op de plek waar het opgezochte woord moet verschijnen.", "Open the search result in your browser:": "Open het zoekresultaat in je browser:", "Open in {{name}}": "Openen in {{name}}", - "Book Fingerprint": "Vingerafdruk van boek" + "Book Fingerprint": "Vingerafdruk van boek", + "Search the web": "Zoeken op het web", + "App deeplink (readest://)": "App-deeplink (readest://)", + "Universal web link (https://)": "Universele weblink (https://)", + "Name cannot be empty.": "Naam mag niet leeg zijn.", + "Replaced {{count}} existing dictionary_one": "{{count}} bestaand woordenboek vervangen", + "Replaced {{count}} existing dictionary_other": "{{count}} bestaande woordenboeken vervangen", + "Cancel Edit": "Bewerken annuleren", + "Edit Dictionary": "Woordenboek bewerken", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-bundels gebruiken .mdx-bestanden; bijbehorende .mdd- en .css-bestanden zijn optioneel.", + "Dictionary name": "Naam van woordenboek", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Deze audio kan hier niet worden afgespeeld — het woordenboek gebruikt een verouderd formaat. Probeer een woordenboek met Opus-, MP3- of WAV-audio." } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 090986c9..096ae623 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -856,7 +856,6 @@ "Failed to export the book.": "Nie udało się wyeksportować książki.", "Export Book": "Eksportuj książkę", "Whole word:": "Całe słowo:", - "Error": "Błąd", "Date Published": "Data wydania", "Only for TTS:": "Tylko dla TTS:", "Uploaded": "Przesłano", @@ -1245,11 +1244,6 @@ "Failed to start stream": "Nie udało się uruchomić strumienia", "No dictionaries enabled": "Brak włączonych słowników", "Enable a dictionary in Settings → Language → Dictionaries.": "Włącz słownik w Ustawienia → Język → Słowniki.", - "No definitions found": "Nie znaleziono definicji", - "Search for {{word}} on the web.": "Szukaj {{word}} w sieci.", - "Dictionary unsupported": "Słownik nieobsługiwany", - "This dictionary format is not supported yet.": "Ten format słownika nie jest jeszcze obsługiwany.", - "Unable to load the word.": "Nie można załadować słowa.", "Wiktionary": "Wikisłownik", "Drag to reorder": "Przeciągnij, aby zmienić kolejność", "Built-in": "Wbudowany", @@ -1269,7 +1263,6 @@ "Import Dictionary": "Importuj słownik", "No dictionaries available.": "Brak dostępnych słowników.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pakiety StarDict wymagają plików .ifo, .idx i .dict.dz (.syn opcjonalny).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Pakiety MDict używają plików .mdx; towarzyszące .mdd są opcjonalne.", "Select all the bundle files together when importing.": "Podczas importu wybierz wszystkie pliki pakietu jednocześnie.", "Manage Dictionaries": "Zarządzaj słownikami", "Select Dictionary Files": "Wybierz pliki słownika", @@ -1374,5 +1367,18 @@ "Use %WORD% where the looked-up word should appear.": "Użyj %WORD% w miejscu, w którym ma się pojawić wyszukiwane słowo.", "Open the search result in your browser:": "Otwórz wynik wyszukiwania w przeglądarce:", "Open in {{name}}": "Otwórz w {{name}}", - "Book Fingerprint": "Odcisk książki" + "Book Fingerprint": "Odcisk książki", + "Search the web": "Szukaj w sieci", + "App deeplink (readest://)": "Głęboki link aplikacji (readest://)", + "Universal web link (https://)": "Uniwersalny link sieciowy (https://)", + "Name cannot be empty.": "Nazwa nie może być pusta.", + "Replaced {{count}} existing dictionary_one": "Zastąpiono {{count}} istniejący słownik", + "Replaced {{count}} existing dictionary_few": "Zastąpiono {{count}} istniejące słowniki", + "Replaced {{count}} existing dictionary_many": "Zastąpiono {{count}} istniejących słowników", + "Replaced {{count}} existing dictionary_other": "Zastąpiono {{count}} istniejące słowniki", + "Cancel Edit": "Anuluj edycję", + "Edit Dictionary": "Edytuj słownik", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Pakiety MDict używają plików .mdx; towarzyszące pliki .mdd i .css są opcjonalne.", + "Dictionary name": "Nazwa słownika", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Tego dźwięku nie można odtworzyć tutaj — słownik używa przestarzałego formatu. Spróbuj słownika z dźwiękiem Opus, MP3 lub WAV." } diff --git a/apps/readest-app/public/locales/pt-BR/translation.json b/apps/readest-app/public/locales/pt-BR/translation.json index 74217d9c..eca3ac35 100644 --- a/apps/readest-app/public/locales/pt-BR/translation.json +++ b/apps/readest-app/public/locales/pt-BR/translation.json @@ -382,12 +382,6 @@ "No dictionaries enabled": "Nenhum dicionário ativado", "Enable a dictionary in Settings → Language → Dictionaries.": "Ative um dicionário em Configurações → Idioma → Dicionários.", "Manage Dictionaries": "Gerenciar dicionários", - "No definitions found": "Nenhuma definição encontrada", - "Search for {{word}} on the web.": "Pesquisar {{word}} na web.", - "Dictionary unsupported": "Dicionário não suportado", - "This dictionary format is not supported yet.": "Este formato de dicionário ainda não é suportado.", - "Error": "Erro", - "Unable to load the word.": "Não foi possível carregar a palavra.", "Exported from Readest": "Exportado do Readest", "Highlights & Annotations": "Destaques e anotações", "Note:": "Nota:", @@ -1112,7 +1106,6 @@ "No dictionaries available.": "Nenhum dicionário disponível.", "Tips": "Dicas", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pacotes StarDict precisam dos arquivos .ifo, .idx e .dict.dz (.syn opcional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Pacotes MDict usam arquivos .mdx; arquivos .mdd companheiros são opcionais.", "DICT bundles need a .index file and a .dict.dz file.": "Pacotes DICT precisam de um arquivo .index e um arquivo .dict.dz.", "Slob bundles need a .slob file.": "Pacotes Slob precisam de um arquivo .slob.", "Select all the bundle files together when importing.": "Selecione todos os arquivos do pacote juntos ao importar.", @@ -1351,5 +1344,17 @@ "Sunset": "Pôr do sol", "Reveal in Finder": "Mostrar no Finder", "Reveal in File Explorer": "Mostrar no Explorador de Arquivos", - "Reveal in Folder": "Mostrar na pasta" + "Reveal in Folder": "Mostrar na pasta", + "Search the web": "Pesquisar na web", + "App deeplink (readest://)": "Deeplink do aplicativo (readest://)", + "Universal web link (https://)": "Link web universal (https://)", + "Name cannot be empty.": "O nome não pode estar vazio.", + "Replaced {{count}} existing dictionary_one": "{{count}} dicionário existente substituído", + "Replaced {{count}} existing dictionary_many": "{{count}} dicionários existentes substituídos", + "Replaced {{count}} existing dictionary_other": "{{count}} dicionários existentes substituídos", + "Cancel Edit": "Cancelar edição", + "Edit Dictionary": "Editar dicionário", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Os pacotes MDict usam arquivos .mdx; os arquivos .mdd e .css que os acompanham são opcionais.", + "Dictionary name": "Nome do dicionário", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Este áudio não pode ser reproduzido aqui — o dicionário usa um formato obsoleto. Tente um dicionário com áudio Opus, MP3 ou WAV." } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 11d7cf38..81dabf5b 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -846,7 +846,6 @@ "Failed to export the book.": "Falha ao exportar o livro.", "Export Book": "Exportar livro", "Whole word:": "Palavra inteira:", - "Error": "Erro", "Date Published": "Data de publicação", "Only for TTS:": "Apenas para TTS:", "Uploaded": "Enviado", @@ -1228,11 +1227,6 @@ "Failed to start stream": "Falha ao iniciar o streaming", "No dictionaries enabled": "Nenhum dicionário ativado", "Enable a dictionary in Settings → Language → Dictionaries.": "Ative um dicionário em Configurações → Idioma → Dicionários.", - "No definitions found": "Nenhuma definição encontrada", - "Search for {{word}} on the web.": "Pesquisar {{word}} na web.", - "Dictionary unsupported": "Dicionário não suportado", - "This dictionary format is not supported yet.": "Este formato de dicionário ainda não é suportado.", - "Unable to load the word.": "Não foi possível carregar a palavra.", "Wiktionary": "Wikcionário", "Drag to reorder": "Arraste para reordenar", "Built-in": "Integrado", @@ -1251,7 +1245,6 @@ "Import Dictionary": "Importar dicionário", "No dictionaries available.": "Nenhum dicionário disponível.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pacotes StarDict precisam dos arquivos .ifo, .idx e .dict.dz (.syn opcional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Pacotes MDict usam arquivos .mdx; arquivos .mdd companheiros são opcionais.", "Select all the bundle files together when importing.": "Selecione todos os arquivos do pacote juntos ao importar.", "Manage Dictionaries": "Gerenciar dicionários", "Select Dictionary Files": "Selecionar arquivos do dicionário", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "Use %WORD% onde a palavra pesquisada deve aparecer.", "Open the search result in your browser:": "Abrir o resultado da pesquisa no seu navegador:", "Open in {{name}}": "Abrir em {{name}}", - "Book Fingerprint": "Impressão digital do livro" + "Book Fingerprint": "Impressão digital do livro", + "Search the web": "Pesquisar na web", + "App deeplink (readest://)": "Deeplink da aplicação (readest://)", + "Universal web link (https://)": "Ligação web universal (https://)", + "Name cannot be empty.": "O nome não pode estar vazio.", + "Replaced {{count}} existing dictionary_one": "{{count}} dicionário existente substituído", + "Replaced {{count}} existing dictionary_many": "{{count}} dicionários existentes substituídos", + "Replaced {{count}} existing dictionary_other": "{{count}} dicionários existentes substituídos", + "Cancel Edit": "Cancelar edição", + "Edit Dictionary": "Editar dicionário", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Os pacotes MDict usam ficheiros .mdx; os ficheiros .mdd e .css que os acompanham são opcionais.", + "Dictionary name": "Nome do dicionário", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Este áudio não pode ser reproduzido aqui — o dicionário usa um formato obsoleto. Experimenta um dicionário com áudio Opus, MP3 ou WAV." } diff --git a/apps/readest-app/public/locales/ro/translation.json b/apps/readest-app/public/locales/ro/translation.json index 8cb1c04c..753e599d 100644 --- a/apps/readest-app/public/locales/ro/translation.json +++ b/apps/readest-app/public/locales/ro/translation.json @@ -420,7 +420,6 @@ "System Language": "Limba sistemului", "No translation available.": "Nicio traducere disponibilă.", "Translated by {{provider}}.": "Tradus de {{provider}}.", - "Error": "Eroare", "Remove Bookmark": "Eliminați marcajul", "Add Bookmark": "Adăugați marcaj", "Books Content": "Conținutul cărților", @@ -1228,11 +1227,6 @@ "Failed to start stream": "Eroare la pornirea fluxului", "No dictionaries enabled": "Niciun dicționar activat", "Enable a dictionary in Settings → Language → Dictionaries.": "Activează un dicționar din Setări → Limbă → Dicționare.", - "No definitions found": "Nu s-au găsit definiții", - "Search for {{word}} on the web.": "Caută {{word}} pe web.", - "Dictionary unsupported": "Dicționarul nu este acceptat", - "This dictionary format is not supported yet.": "Acest format de dicționar nu este încă acceptat.", - "Unable to load the word.": "Nu s-a putut încărca cuvântul.", "Wiktionary": "Wikționar", "Drag to reorder": "Trage pentru a reordona", "Built-in": "Încorporat", @@ -1251,7 +1245,6 @@ "Import Dictionary": "Importă dicționar", "No dictionaries available.": "Niciun dicționar disponibil.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Pachetele StarDict au nevoie de fișierele .ifo, .idx și .dict.dz (.syn opțional).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Pachetele MDict folosesc fișiere .mdx; fișierele .mdd însoțitoare sunt opționale.", "Select all the bundle files together when importing.": "Selectează împreună toate fișierele pachetului la import.", "Manage Dictionaries": "Gestionează dicționarele", "Select Dictionary Files": "Selectează fișierele dicționarului", @@ -1351,5 +1344,17 @@ "Use %WORD% where the looked-up word should appear.": "Folosiți %WORD% acolo unde ar trebui să apară cuvântul căutat.", "Open the search result in your browser:": "Deschideți rezultatul căutării în browser:", "Open in {{name}}": "Deschide în {{name}}", - "Book Fingerprint": "Amprenta cărții" + "Book Fingerprint": "Amprenta cărții", + "Search the web": "Caută pe web", + "App deeplink (readest://)": "Deeplink al aplicației (readest://)", + "Universal web link (https://)": "Link web universal (https://)", + "Name cannot be empty.": "Numele nu poate fi gol.", + "Replaced {{count}} existing dictionary_one": "A fost înlocuit {{count}} dicționar existent", + "Replaced {{count}} existing dictionary_few": "Au fost înlocuite {{count}} dicționare existente", + "Replaced {{count}} existing dictionary_other": "Au fost înlocuite {{count}} de dicționare existente", + "Cancel Edit": "Anulează editarea", + "Edit Dictionary": "Editează dicționarul", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Pachetele MDict folosesc fișiere .mdx; fișierele .mdd și .css însoțitoare sunt opționale.", + "Dictionary name": "Numele dicționarului", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Acest audio nu poate fi redat aici — dicționarul folosește un format învechit. Încearcă unul cu audio Opus, MP3 sau WAV." } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index c0714e40..3c755280 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -856,7 +856,6 @@ "Failed to export the book.": "Не удалось экспортировать книгу.", "Export Book": "Экспорт книги", "Whole word:": "Слово целиком:", - "Error": "Ошибка", "Date Published": "Дата публикации", "Only for TTS:": "Только для TTS:", "Uploaded": "Загружено", @@ -1245,11 +1244,6 @@ "Failed to start stream": "Не удалось запустить поток", "No dictionaries enabled": "Нет включённых словарей", "Enable a dictionary in Settings → Language → Dictionaries.": "Включите словарь в Настройки → Язык → Словари.", - "No definitions found": "Определения не найдены", - "Search for {{word}} on the web.": "Искать {{word}} в интернете.", - "Dictionary unsupported": "Словарь не поддерживается", - "This dictionary format is not supported yet.": "Этот формат словаря пока не поддерживается.", - "Unable to load the word.": "Не удалось загрузить слово.", "Wiktionary": "Викисловарь", "Drag to reorder": "Перетащите для изменения порядка", "Built-in": "Встроенный", @@ -1269,7 +1263,6 @@ "Import Dictionary": "Импорт словаря", "No dictionaries available.": "Нет доступных словарей.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Пакеты StarDict требуют файлов .ifo, .idx и .dict.dz (.syn — опционально).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Пакеты MDict используют файлы .mdx; сопутствующие .mdd — опционально.", "Select all the bundle files together when importing.": "При импорте выбирайте все файлы пакета вместе.", "Manage Dictionaries": "Управление словарями", "Select Dictionary Files": "Выберите файлы словаря", @@ -1374,5 +1367,18 @@ "Use %WORD% where the looked-up word should appear.": "Используйте %WORD% там, где должно появиться искомое слово.", "Open the search result in your browser:": "Открыть результат поиска в браузере:", "Open in {{name}}": "Открыть в {{name}}", - "Book Fingerprint": "Отпечаток книги" + "Book Fingerprint": "Отпечаток книги", + "Search the web": "Поиск в интернете", + "App deeplink (readest://)": "Глубокая ссылка приложения (readest://)", + "Universal web link (https://)": "Универсальная веб-ссылка (https://)", + "Name cannot be empty.": "Имя не может быть пустым.", + "Replaced {{count}} existing dictionary_one": "Заменён {{count}} существующий словарь", + "Replaced {{count}} existing dictionary_few": "Заменено {{count}} существующих словаря", + "Replaced {{count}} existing dictionary_many": "Заменено {{count}} существующих словарей", + "Replaced {{count}} existing dictionary_other": "Заменено {{count}} существующих словарей", + "Cancel Edit": "Отменить редактирование", + "Edit Dictionary": "Редактировать словарь", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Пакеты MDict используют файлы .mdx; сопутствующие файлы .mdd и .css необязательны.", + "Dictionary name": "Название словаря", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Этот звук невозможно воспроизвести здесь — словарь использует устаревший формат. Попробуйте словарь с аудио Opus, MP3 или WAV." } diff --git a/apps/readest-app/public/locales/si/translation.json b/apps/readest-app/public/locales/si/translation.json index 4eec6f7d..52c2e918 100644 --- a/apps/readest-app/public/locales/si/translation.json +++ b/apps/readest-app/public/locales/si/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "පොත අපනයනය කිරීමට අසමත් විය.", "Export Book": "පොත අපනයනය කරන්න", "Whole word:": "සම්පූර්ණ වචනය:", - "Error": "දෝෂය", "Date Published": "ප්‍රකාශන දිනය", "Only for TTS:": "TTS සඳහා පමණක්:", "Uploaded": "උඩුගත කරන ලදී", @@ -1211,11 +1210,6 @@ "Failed to start stream": "ස්ට්‍රීම් ආරම්භ කිරීම අසාර්ථකයි", "No dictionaries enabled": "ශබ්දකෝෂ සක්‍රීය කර නැත", "Enable a dictionary in Settings → Language → Dictionaries.": "සැකසීම් → භාෂාව → ශබ්දකෝෂ වෙත ගොස් ශබ්දකෝෂයක් සක්‍රීය කරන්න.", - "No definitions found": "අර්ථදැක්වීම් හමු නොවීය", - "Search for {{word}} on the web.": "වෙබයේ {{word}} සොයන්න.", - "Dictionary unsupported": "ශබ්දකෝෂයට සහාය නොදක්වයි", - "This dictionary format is not supported yet.": "මෙම ශබ්දකෝෂ ආකෘතියට තවම සහාය නොදක්වයි.", - "Unable to load the word.": "වචනය පූරණය කළ නොහැකි විය.", "Wiktionary": "Wiktionary", "Drag to reorder": "නැවත සකස් කිරීමට අදින්න", "Built-in": "සාමාන්‍ය", @@ -1233,7 +1227,6 @@ "Import Dictionary": "ශබ්දකෝෂයක් ආයාත කරන්න", "No dictionaries available.": "ලබා ගත හැකි ශබ්දකෝෂ නැත.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict බණ්ඩලවලට .ifo, .idx සහ .dict.dz ගොනු අවශ්‍යය (.syn විකල්ප).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict බණ්ඩල .mdx ගොනු භාවිතා කරයි; සහායක .mdd ගොනු විකල්ප වේ.", "Select all the bundle files together when importing.": "ආයාත කරන විට බණ්ඩලේ සියලු ගොනු එකවර තෝරන්න.", "Manage Dictionaries": "ශබ්දකෝෂ කළමනාකරණය", "Select Dictionary Files": "ශබ්දකෝෂ ගොනු තෝරන්න", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "සොයන වචනය දිස්විය යුතු තැන %WORD% භාවිතා කරන්න.", "Open the search result in your browser:": "ඔබේ බ්‍රවුසරයේ සෙවුම් ප්‍රතිඵලය විවෘත කරන්න:", "Open in {{name}}": "{{name}} වල විවෘත කරන්න", - "Book Fingerprint": "පොතේ ඇඟිලි සලකුණ" + "Book Fingerprint": "පොතේ ඇඟිලි සලකුණ", + "Search the web": "වෙබයේ සොයන්න", + "App deeplink (readest://)": "යෙදුම් ගැඹුරු සබැඳිය (readest://)", + "Universal web link (https://)": "සර්වත්‍ර වෙබ් සබැඳිය (https://)", + "Name cannot be empty.": "නම හිස් විය නොහැක.", + "Replaced {{count}} existing dictionary_one": "පවතින ශබ්දකෝෂ {{count}}ක් ප්‍රතිස්ථාපනය කරන ලදී", + "Replaced {{count}} existing dictionary_other": "පවතින ශබ්දකෝෂ {{count}}ක් ප්‍රතිස්ථාපනය කරන ලදී", + "Cancel Edit": "සංස්කරණය අවලංගු කරන්න", + "Edit Dictionary": "ශබ්දකෝෂය සංස්කරණය කරන්න", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict පැකේජ .mdx ගොනු භාවිතා කරයි; සහායක .mdd සහ .css ගොනු විකල්පීය වේ.", + "Dictionary name": "ශබ්දකෝෂයේ නම", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "මෙම ශබ්දය මෙහි වාදනය කළ නොහැක — ශබ්දකෝෂය යල් පැන ගිය ආකෘතියක් භාවිතා කරයි. Opus, MP3 හෝ WAV ශබ්ද සහිත එකක් උත්සාහ කරන්න." } diff --git a/apps/readest-app/public/locales/sl/translation.json b/apps/readest-app/public/locales/sl/translation.json index 400cd90b..9d399f60 100644 --- a/apps/readest-app/public/locales/sl/translation.json +++ b/apps/readest-app/public/locales/sl/translation.json @@ -397,7 +397,6 @@ "System Language": "Sistemski jezik", "No translation available.": "Prevod ni na voljo.", "Translated by {{provider}}.": "Prevedeno s {{provider}}.", - "Error": "Napaka", "Remove Bookmark": "Odstrani zaznamek", "Add Bookmark": "Dodaj zaznamek", "Books Content": "Vsebina knjig", @@ -1245,11 +1244,6 @@ "Failed to start stream": "Pretoka ni bilo mogoče zagnati", "No dictionaries enabled": "Ni omogočenih slovarjev", "Enable a dictionary in Settings → Language → Dictionaries.": "Omogoči slovar v Nastavitve → Jezik → Slovarji.", - "No definitions found": "Ni najdenih razlag", - "Search for {{word}} on the web.": "Poišči {{word}} v spletu.", - "Dictionary unsupported": "Slovar ni podprt", - "This dictionary format is not supported yet.": "Ta oblika slovarja še ni podprta.", - "Unable to load the word.": "Besede ni mogoče naložiti.", "Wiktionary": "Wikislovar", "Drag to reorder": "Povleci za prerazporeditev", "Built-in": "Vgrajeno", @@ -1269,7 +1263,6 @@ "Import Dictionary": "Uvozi slovar", "No dictionaries available.": "Ni razpoložljivih slovarjev.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Svežnji StarDict potrebujejo datoteke .ifo, .idx in .dict.dz (.syn neobvezno).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Svežnji MDict uporabljajo datoteke .mdx; spremljajoče .mdd so neobvezne.", "Select all the bundle files together when importing.": "Pri uvozu izberi vse datoteke svežnja skupaj.", "Manage Dictionaries": "Upravljanje slovarjev", "Select Dictionary Files": "Izberi datoteke slovarja", @@ -1374,5 +1367,18 @@ "Use %WORD% where the looked-up word should appear.": "Uporabite %WORD% tam, kjer naj se pojavi iskana beseda.", "Open the search result in your browser:": "Odprite rezultat iskanja v brskalniku:", "Open in {{name}}": "Odpri v {{name}}", - "Book Fingerprint": "Prstni odtis knjige" + "Book Fingerprint": "Prstni odtis knjige", + "Search the web": "Iskanje po spletu", + "App deeplink (readest://)": "Globoka povezava aplikacije (readest://)", + "Universal web link (https://)": "Univerzalna spletna povezava (https://)", + "Name cannot be empty.": "Ime ne sme biti prazno.", + "Replaced {{count}} existing dictionary_one": "Zamenjan {{count}} obstoječi slovar", + "Replaced {{count}} existing dictionary_two": "Zamenjana {{count}} obstoječa slovarja", + "Replaced {{count}} existing dictionary_few": "Zamenjani {{count}} obstoječi slovarji", + "Replaced {{count}} existing dictionary_other": "Zamenjanih {{count}} obstoječih slovarjev", + "Cancel Edit": "Prekliči urejanje", + "Edit Dictionary": "Uredi slovar", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Paketi MDict uporabljajo datoteke .mdx; spremne datoteke .mdd in .css so neobvezne.", + "Dictionary name": "Ime slovarja", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Tega zvoka tukaj ni mogoče predvajati — slovar uporablja zastarelo obliko. Poskusite slovar z zvokom Opus, MP3 ali WAV." } diff --git a/apps/readest-app/public/locales/sv/translation.json b/apps/readest-app/public/locales/sv/translation.json index f9a394d6..e2f356e4 100644 --- a/apps/readest-app/public/locales/sv/translation.json +++ b/apps/readest-app/public/locales/sv/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "Det gick inte att exportera boken.", "Export Book": "Exportera bok", "Whole word:": "Hela ordet:", - "Error": "Fel", "Date Published": "Publiceringsdatum", "Only for TTS:": "Endast för TTS:", "Uploaded": "Uppladdad", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Det gick inte att starta strömmen", "No dictionaries enabled": "Inga ordböcker aktiverade", "Enable a dictionary in Settings → Language → Dictionaries.": "Aktivera en ordbok i Inställningar → Språk → Ordböcker.", - "No definitions found": "Inga definitioner hittades", - "Search for {{word}} on the web.": "Sök efter {{word}} på webben.", - "Dictionary unsupported": "Ordbok stöds inte", - "This dictionary format is not supported yet.": "Det här ordboksformatet stöds inte än.", - "Unable to load the word.": "Det gick inte att läsa in ordet.", "Wiktionary": "Wiktionary", "Drag to reorder": "Dra för att ändra ordning", "Built-in": "Inbyggt", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Importera ordbok", "No dictionaries available.": "Inga ordböcker tillgängliga.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict-paket kräver .ifo-, .idx- och .dict.dz-filer (.syn valfri).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict-paket använder .mdx-filer; tillhörande .mdd-filer är valfria.", "Select all the bundle files together when importing.": "Markera alla paketfiler tillsammans när du importerar.", "Manage Dictionaries": "Hantera ordböcker", "Select Dictionary Files": "Välj ordboksfiler", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Använd %WORD% där det uppslagna ordet ska visas.", "Open the search result in your browser:": "Öppna sökresultatet i din webbläsare:", "Open in {{name}}": "Öppna i {{name}}", - "Book Fingerprint": "Bokens fingeravtryck" + "Book Fingerprint": "Bokens fingeravtryck", + "Search the web": "Sök på webben", + "App deeplink (readest://)": "App-djuplänk (readest://)", + "Universal web link (https://)": "Universell webblänk (https://)", + "Name cannot be empty.": "Namnet får inte vara tomt.", + "Replaced {{count}} existing dictionary_one": "{{count}} befintlig ordbok ersatt", + "Replaced {{count}} existing dictionary_other": "{{count}} befintliga ordböcker ersatta", + "Cancel Edit": "Avbryt redigering", + "Edit Dictionary": "Redigera ordbok", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict-paket använder .mdx-filer; medföljande .mdd- och .css-filer är valfria.", + "Dictionary name": "Ordbokens namn", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Det här ljudet kan inte spelas upp här — ordboken använder ett föråldrat format. Prova en ordbok med Opus-, MP3- eller WAV-ljud." } diff --git a/apps/readest-app/public/locales/ta/translation.json b/apps/readest-app/public/locales/ta/translation.json index 1ec6c240..14dd59b6 100644 --- a/apps/readest-app/public/locales/ta/translation.json +++ b/apps/readest-app/public/locales/ta/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "புத்தகத்தை ஏற்றுமதி செய்ய இயலவில்லை.", "Export Book": "புத்தகத்தை ஏற்றுமதி செய்", "Whole word:": "முழு சொல்:", - "Error": "பிழை", "Date Published": "வெளியீட்டு தேதி", "Only for TTS:": "TTS க்கு மட்டும்:", "Uploaded": "பதிவேற்றப்பட்டது", @@ -1211,11 +1210,6 @@ "Failed to start stream": "ஸ்ட்ரீமைத் தொடங்க முடியவில்லை", "No dictionaries enabled": "எந்த அகராதியும் இயக்கப்படவில்லை", "Enable a dictionary in Settings → Language → Dictionaries.": "அமைப்புகள் → மொழி → அகராதிகள் என்பதில் ஒரு அகராதியை இயக்கவும்.", - "No definitions found": "வரையறைகள் எதுவும் கிடைக்கவில்லை", - "Search for {{word}} on the web.": "வலையில் {{word}} ஐத் தேடவும்.", - "Dictionary unsupported": "அகராதி ஆதரிக்கப்படவில்லை", - "This dictionary format is not supported yet.": "இந்த அகராதி வடிவம் இன்னும் ஆதரிக்கப்படவில்லை.", - "Unable to load the word.": "சொல்லை ஏற்ற முடியவில்லை.", "Wiktionary": "விக்சனரி", "Drag to reorder": "மறு வரிசைப்படுத்த இழுக்கவும்", "Built-in": "உள்ளமைந்த", @@ -1233,7 +1227,6 @@ "Import Dictionary": "அகராதியை இறக்குமதி செய்", "No dictionaries available.": "அகராதிகள் கிடைக்கவில்லை.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict தொகுப்புகளுக்கு .ifo, .idx, .dict.dz கோப்புகள் தேவை (.syn விருப்பம்).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict தொகுப்புகள் .mdx கோப்புகளைப் பயன்படுத்தும்; தொடர்புடைய .mdd கோப்புகள் விருப்பம்.", "Select all the bundle files together when importing.": "இறக்குமதி செய்யும்போது தொகுப்பின் அனைத்துக் கோப்புகளையும் ஒரே நேரத்தில் தேர்ந்தெடுக்கவும்.", "Manage Dictionaries": "அகராதிகளை நிர்வகி", "Select Dictionary Files": "அகராதிக் கோப்புகளைத் தேர்ந்தெடு", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "தேடப்பட்ட சொல் தோன்ற வேண்டிய இடத்தில் %WORD% ஐ பயன்படுத்தவும்.", "Open the search result in your browser:": "உங்கள் உலாவியில் தேடல் முடிவைத் திற:", "Open in {{name}}": "{{name}} இல் திற", - "Book Fingerprint": "புத்தக கைரேகை" + "Book Fingerprint": "புத்தக கைரேகை", + "Search the web": "வலையில் தேடுக", + "App deeplink (readest://)": "பயன்பாட்டு ஆழ் இணைப்பு (readest://)", + "Universal web link (https://)": "அனைத்துக்கும் பொதுவான வலை இணைப்பு (https://)", + "Name cannot be empty.": "பெயரை வெறுமையாக வைக்க இயலாது.", + "Replaced {{count}} existing dictionary_one": "ஏற்கனவே உள்ள {{count}} அகராதி மாற்றப்பட்டது", + "Replaced {{count}} existing dictionary_other": "ஏற்கனவே உள்ள {{count}} அகராதிகள் மாற்றப்பட்டன", + "Cancel Edit": "திருத்துதலை ரத்து செய்", + "Edit Dictionary": "அகராதியைத் திருத்து", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict தொகுப்புகள் .mdx கோப்புகளைப் பயன்படுத்துகின்றன; இணைந்த .mdd மற்றும் .css கோப்புகள் விருப்பமானவை.", + "Dictionary name": "அகராதியின் பெயர்", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "இந்த ஒலியை இங்கே இயக்க இயலவில்லை — அகராதி காலாவதியான வடிவத்தைப் பயன்படுத்துகிறது. Opus, MP3 அல்லது WAV ஒலி உள்ள ஒன்றை முயற்சிக்கவும்." } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index 1173fcce..08f78650 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "ส่งออกหนังสือล้มเหลว", "Export Book": "ส่งออกหนังสือ", "Whole word:": "คำทั้งคำ:", - "Error": "ข้อผิดพลาด", "Date Published": "วันที่เผยแพร่", "Only for TTS:": "สำหรับ TTS เท่านั้น:", "Uploaded": "อัปโหลดแล้ว", @@ -1194,11 +1193,6 @@ "Failed to start stream": "ไม่สามารถเริ่มสตรีมได้", "No dictionaries enabled": "ไม่มีพจนานุกรมที่เปิดใช้งาน", "Enable a dictionary in Settings → Language → Dictionaries.": "เปิดใช้พจนานุกรมที่ ตั้งค่า → ภาษา → พจนานุกรม", - "No definitions found": "ไม่พบคำจำกัดความ", - "Search for {{word}} on the web.": "ค้นหา {{word}} บนเว็บ", - "Dictionary unsupported": "ไม่รองรับพจนานุกรมนี้", - "This dictionary format is not supported yet.": "ยังไม่รองรับรูปแบบพจนานุกรมนี้", - "Unable to load the word.": "ไม่สามารถโหลดคำได้", "Wiktionary": "วิกิพจนานุกรม", "Drag to reorder": "ลากเพื่อจัดลำดับใหม่", "Built-in": "ในตัว", @@ -1215,7 +1209,6 @@ "Import Dictionary": "นำเข้าพจนานุกรม", "No dictionaries available.": "ไม่มีพจนานุกรม", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "บันเดิล StarDict ต้องมีไฟล์ .ifo, .idx และ .dict.dz (.syn ไม่บังคับ)", - "MDict bundles use .mdx files; companion .mdd files are optional.": "บันเดิล MDict ใช้ไฟล์ .mdx ส่วนไฟล์ .mdd ที่มาด้วยเป็นทางเลือก", "Select all the bundle files together when importing.": "เลือกไฟล์ทั้งหมดของบันเดิลพร้อมกันเมื่อทำการนำเข้า", "Manage Dictionaries": "จัดการพจนานุกรม", "Select Dictionary Files": "เลือกไฟล์พจนานุกรม", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "ใช้ %WORD% ในตำแหน่งที่คำค้นหาควรปรากฏ", "Open the search result in your browser:": "เปิดผลลัพธ์การค้นหาในเบราว์เซอร์ของคุณ:", "Open in {{name}}": "เปิดใน {{name}}", - "Book Fingerprint": "ลายนิ้วมือหนังสือ" + "Book Fingerprint": "ลายนิ้วมือหนังสือ", + "Search the web": "ค้นหาบนเว็บ", + "App deeplink (readest://)": "ดีปลิงก์ของแอป (readest://)", + "Universal web link (https://)": "ลิงก์เว็บสากล (https://)", + "Name cannot be empty.": "ชื่อต้องไม่ว่างเปล่า", + "Replaced {{count}} existing dictionary_other": "แทนที่พจนานุกรมเดิม {{count}} รายการแล้ว", + "Cancel Edit": "ยกเลิกการแก้ไข", + "Edit Dictionary": "แก้ไขพจนานุกรม", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "ชุด MDict ใช้ไฟล์ .mdx ส่วนไฟล์ .mdd และ .css ที่มาด้วยกันเป็นทางเลือก", + "Dictionary name": "ชื่อพจนานุกรม", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "ไม่สามารถเล่นเสียงนี้ที่นี่ได้ — พจนานุกรมใช้รูปแบบที่ล้าสมัย ลองใช้พจนานุกรมที่มีเสียง Opus, MP3 หรือ WAV" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 4404add1..9509e96a 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -836,7 +836,6 @@ "Failed to export the book.": "Kitap dışa aktarılamadı.", "Export Book": "Kitabı Dışa Aktar", "Whole word:": "Tam kelime:", - "Error": "Hata", "Date Published": "Yayın tarihi", "Only for TTS:": "Sadece TTS için:", "Uploaded": "Yüklendi", @@ -1211,11 +1210,6 @@ "Failed to start stream": "Akış başlatılamadı", "No dictionaries enabled": "Etkin sözlük yok", "Enable a dictionary in Settings → Language → Dictionaries.": "Ayarlar → Dil → Sözlükler kısmından bir sözlük etkinleştirin.", - "No definitions found": "Tanım bulunamadı", - "Search for {{word}} on the web.": "Webde {{word}} ara.", - "Dictionary unsupported": "Sözlük desteklenmiyor", - "This dictionary format is not supported yet.": "Bu sözlük biçimi henüz desteklenmiyor.", - "Unable to load the word.": "Sözcük yüklenemedi.", "Wiktionary": "Vikisözlük", "Drag to reorder": "Yeniden sıralamak için sürükleyin", "Built-in": "Yerleşik", @@ -1233,7 +1227,6 @@ "Import Dictionary": "Sözlük içe aktar", "No dictionaries available.": "Kullanılabilir sözlük yok.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict paketleri .ifo, .idx ve .dict.dz dosyalarını gerektirir (.syn isteğe bağlı).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict paketleri .mdx dosyalarını kullanır; eşlik eden .mdd dosyaları isteğe bağlıdır.", "Select all the bundle files together when importing.": "İçe aktarırken paketin tüm dosyalarını birlikte seçin.", "Manage Dictionaries": "Sözlükleri yönet", "Select Dictionary Files": "Sözlük dosyalarını seç", @@ -1328,5 +1321,16 @@ "Use %WORD% where the looked-up word should appear.": "Aranan kelimenin görünmesi gereken yerde %WORD% kullanın.", "Open the search result in your browser:": "Arama sonucunu tarayıcınızda açın:", "Open in {{name}}": "{{name}} ile aç", - "Book Fingerprint": "Kitap parmak izi" + "Book Fingerprint": "Kitap parmak izi", + "Search the web": "Web’de ara", + "App deeplink (readest://)": "Uygulama derin bağlantısı (readest://)", + "Universal web link (https://)": "Evrensel web bağlantısı (https://)", + "Name cannot be empty.": "Ad boş olamaz.", + "Replaced {{count}} existing dictionary_one": "{{count}} mevcut sözlük değiştirildi", + "Replaced {{count}} existing dictionary_other": "{{count}} mevcut sözlük değiştirildi", + "Cancel Edit": "Düzenlemeyi iptal et", + "Edit Dictionary": "Sözlüğü düzenle", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict paketleri .mdx dosyalarını kullanır; eşlik eden .mdd ve .css dosyaları isteğe bağlıdır.", + "Dictionary name": "Sözlük adı", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Bu ses burada oynatılamıyor — sözlük eski bir biçim kullanıyor. Opus, MP3 veya WAV sesi olan bir sözlük deneyin." } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 5135979d..ee464844 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -856,7 +856,6 @@ "Failed to export the book.": "Не вдалося експортувати книгу.", "Export Book": "Експортувати книгу", "Whole word:": "Ціле слово:", - "Error": "Помилка", "Date Published": "Дата публікації", "Only for TTS:": "Тільки для TTS:", "Uploaded": "Завантажено", @@ -1245,11 +1244,6 @@ "Failed to start stream": "Не вдалося запустити потік", "No dictionaries enabled": "Немає увімкнених словників", "Enable a dictionary in Settings → Language → Dictionaries.": "Увімкніть словник у Налаштування → Мова → Словники.", - "No definitions found": "Визначень не знайдено", - "Search for {{word}} on the web.": "Шукати {{word}} в Інтернеті.", - "Dictionary unsupported": "Словник не підтримується", - "This dictionary format is not supported yet.": "Цей формат словника ще не підтримується.", - "Unable to load the word.": "Не вдалося завантажити слово.", "Wiktionary": "Вікісловник", "Drag to reorder": "Перетягніть, щоб змінити порядок", "Built-in": "Вбудований", @@ -1269,7 +1263,6 @@ "Import Dictionary": "Імпорт словника", "No dictionaries available.": "Немає доступних словників.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Пакети StarDict потребують файлів .ifo, .idx і .dict.dz (.syn — необов’язково).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Пакети MDict використовують файли .mdx; супутні .mdd — необов’язково.", "Select all the bundle files together when importing.": "Під час імпорту вибирайте всі файли пакета разом.", "Manage Dictionaries": "Керування словниками", "Select Dictionary Files": "Виберіть файли словника", @@ -1374,5 +1367,18 @@ "Use %WORD% where the looked-up word should appear.": "Використовуйте %WORD% там, де має з'явитися шукане слово.", "Open the search result in your browser:": "Відкрийте результат пошуку в браузері:", "Open in {{name}}": "Відкрити в {{name}}", - "Book Fingerprint": "Відбиток книги" + "Book Fingerprint": "Відбиток книги", + "Search the web": "Пошук в інтернеті", + "App deeplink (readest://)": "Глибоке посилання застосунку (readest://)", + "Universal web link (https://)": "Універсальне веб-посилання (https://)", + "Name cannot be empty.": "Ім’я не може бути порожнім.", + "Replaced {{count}} existing dictionary_one": "Замінено {{count}} наявний словник", + "Replaced {{count}} existing dictionary_few": "Замінено {{count}} наявні словники", + "Replaced {{count}} existing dictionary_many": "Замінено {{count}} наявних словників", + "Replaced {{count}} existing dictionary_other": "Замінено {{count}} наявних словників", + "Cancel Edit": "Скасувати редагування", + "Edit Dictionary": "Редагувати словник", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Пакунки MDict використовують файли .mdx; супутні файли .mdd і .css є необов’язковими.", + "Dictionary name": "Назва словника", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Це аудіо не можна відтворити тут — словник використовує застарілий формат. Спробуйте словник з аудіо Opus, MP3 або WAV." } diff --git a/apps/readest-app/public/locales/uz/translation.json b/apps/readest-app/public/locales/uz/translation.json index da9c282f..a7805dc0 100644 --- a/apps/readest-app/public/locales/uz/translation.json +++ b/apps/readest-app/public/locales/uz/translation.json @@ -372,12 +372,6 @@ "No dictionaries enabled": "Lugʻatlar yoqilmagan", "Enable a dictionary in Settings → Language → Dictionaries.": "Sozlamalar → Til → Lugʻatlar boʻlimida lugʻatni yoqing.", "Manage Dictionaries": "Lugʻatlarni boshqarish", - "No definitions found": "Taʼriflar topilmadi", - "Search for {{word}} on the web.": "{{word}} ni internetda qidirish.", - "Dictionary unsupported": "Lugʻat qoʻllab-quvvatlanmaydi", - "This dictionary format is not supported yet.": "Ushbu lugʻat formati hali qoʻllab-quvvatlanmaydi.", - "Error": "Xato", - "Unable to load the word.": "Soʻzni yuklab boʻlmadi.", "Exported from Readest": "Readest-dan eksport qilindi", "Highlights & Annotations": "Belgilashlar va izohlar", "Note:": "Eslatma:", @@ -1091,7 +1085,6 @@ "No dictionaries available.": "Lugʻatlar mavjud emas.", "Tips": "Maslahatlar", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict toʻplamlari .ifo, .idx va .dict.dz fayllarni talab qiladi (.syn ixtiyoriy).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict toʻplamlari .mdx fayllaridan foydalanadi; hamrohi .mdd fayllar ixtiyoriy.", "DICT bundles need a .index file and a .dict.dz file.": "DICT toʻplamlari .index fayl va .dict.dz faylni talab qiladi.", "Slob bundles need a .slob file.": "Slob toʻplamlari .slob faylni talab qiladi.", "Select all the bundle files together when importing.": "Import qilishda toʻplamning barcha fayllarini birgalikda tanlang.", @@ -1328,5 +1321,16 @@ "Sunset": "Quyosh botishi", "Reveal in Finder": "Finder-da koʻrsatish", "Reveal in File Explorer": "File Explorer-da koʻrsatish", - "Reveal in Folder": "Jildida koʻrsatish" + "Reveal in Folder": "Jildida koʻrsatish", + "Search the web": "Internetda qidirish", + "App deeplink (readest://)": "Ilova chuqur havolasi (readest://)", + "Universal web link (https://)": "Universal veb-havola (https://)", + "Name cannot be empty.": "Nom bo‘sh bo‘lishi mumkin emas.", + "Replaced {{count}} existing dictionary_one": "Mavjud {{count}} ta lug‘at almashtirildi", + "Replaced {{count}} existing dictionary_other": "Mavjud {{count}} ta lug‘at almashtirildi", + "Cancel Edit": "Tahrirni bekor qilish", + "Edit Dictionary": "Lug‘atni tahrirlash", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict to‘plamlari .mdx fayllaridan foydalanadi; hamroh .mdd va .css fayllari ixtiyoriy.", + "Dictionary name": "Lug‘at nomi", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Bu audio bu yerda ijro etilmaydi — lug‘at eskirgan formatdan foydalanadi. Opus, MP3 yoki WAV audioli lug‘atni sinab ko‘ring." } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 1ab29baf..ecbd2031 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "Xuất sách thất bại.", "Export Book": "Xuất sách", "Whole word:": "Toàn bộ từ:", - "Error": "Lỗi", "Date Published": "Ngày xuất bản", "Only for TTS:": "Chỉ dành cho TTS:", "Uploaded": "Đã tải lên", @@ -1194,11 +1193,6 @@ "Failed to start stream": "Không thể bắt đầu stream", "No dictionaries enabled": "Chưa kích hoạt từ điển nào", "Enable a dictionary in Settings → Language → Dictionaries.": "Bật từ điển trong Cài đặt → Ngôn ngữ → Từ điển.", - "No definitions found": "Không tìm thấy định nghĩa", - "Search for {{word}} on the web.": "Tìm {{word}} trên web.", - "Dictionary unsupported": "Từ điển không được hỗ trợ", - "This dictionary format is not supported yet.": "Định dạng từ điển này chưa được hỗ trợ.", - "Unable to load the word.": "Không thể tải từ.", "Wiktionary": "Wiktionary", "Drag to reorder": "Kéo để sắp xếp lại", "Built-in": "Tích hợp", @@ -1215,7 +1209,6 @@ "Import Dictionary": "Nhập từ điển", "No dictionaries available.": "Không có từ điển.", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "Gói StarDict cần các tệp .ifo, .idx và .dict.dz (.syn tuỳ chọn).", - "MDict bundles use .mdx files; companion .mdd files are optional.": "Gói MDict dùng tệp .mdx; tệp .mdd đi kèm là tuỳ chọn.", "Select all the bundle files together when importing.": "Chọn tất cả các tệp của gói cùng lúc khi nhập.", "Manage Dictionaries": "Quản lý từ điển", "Select Dictionary Files": "Chọn tệp từ điển", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "Dùng %WORD% tại vị trí mà từ tra cứu sẽ xuất hiện.", "Open the search result in your browser:": "Mở kết quả tìm kiếm trong trình duyệt của bạn:", "Open in {{name}}": "Mở trong {{name}}", - "Book Fingerprint": "Dấu vân tay sách" + "Book Fingerprint": "Dấu vân tay sách", + "Search the web": "Tìm kiếm trên web", + "App deeplink (readest://)": "Liên kết sâu của ứng dụng (readest://)", + "Universal web link (https://)": "Liên kết web phổ quát (https://)", + "Name cannot be empty.": "Tên không được để trống.", + "Replaced {{count}} existing dictionary_other": "Đã thay thế {{count}} từ điển hiện có", + "Cancel Edit": "Hủy chỉnh sửa", + "Edit Dictionary": "Chỉnh sửa từ điển", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "Gói MDict sử dụng tệp .mdx; các tệp .mdd và .css đi kèm là tùy chọn.", + "Dictionary name": "Tên từ điển", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "Không thể phát âm thanh này tại đây — từ điển dùng định dạng đã lỗi thời. Hãy thử từ điển có âm thanh Opus, MP3 hoặc WAV." } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 0f8b2532..4c773489 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -828,7 +828,6 @@ "Export Book": "导出书籍", "Whole word:": "全词匹配:", "Only for TTS:": "仅用于TTS:", - "Error": "错误", "Date Published": "出版日期", "Uploaded": "已上传", "Downloaded": "已下载", @@ -1194,11 +1193,6 @@ "Failed to start stream": "启动流式传输失败", "No dictionaries enabled": "未启用任何词典", "Enable a dictionary in Settings → Language → Dictionaries.": "在 设置 → 语言 → 词典 中启用词典。", - "No definitions found": "未找到释义", - "Search for {{word}} on the web.": "在网页上搜索 {{word}}。", - "Dictionary unsupported": "词典不受支持", - "This dictionary format is not supported yet.": "尚不支持此词典格式。", - "Unable to load the word.": "无法加载该词。", "Wiktionary": "维基词典", "Drag to reorder": "拖动以重新排序", "Built-in": "内置", @@ -1215,7 +1209,6 @@ "Import Dictionary": "导入词典", "No dictionaries available.": "没有可用的词典。", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 词典包需要 .ifo、.idx 和 .dict.dz 文件(.syn 可选)。", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict 词典包使用 .mdx 文件;配套的 .mdd 文件为可选。", "Select all the bundle files together when importing.": "导入时请同时选择词典包内的所有文件。", "Manage Dictionaries": "管理词典", "Select Dictionary Files": "选择词典文件", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "在查询词应出现的位置使用 %WORD%。", "Open the search result in your browser:": "在浏览器中打开搜索结果:", "Open in {{name}}": "在 {{name}} 中打开", - "Book Fingerprint": "书籍指纹" + "Book Fingerprint": "书籍指纹", + "Search the web": "网络搜索", + "App deeplink (readest://)": "应用深度链接 (readest://)", + "Universal web link (https://)": "通用网页链接 (https://)", + "Name cannot be empty.": "名称不能为空。", + "Replaced {{count}} existing dictionary_other": "已替换 {{count}} 个现有词典", + "Cancel Edit": "取消编辑", + "Edit Dictionary": "编辑词典", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 包使用 .mdx 文件;附带的 .mdd 和 .css 文件可选。", + "Dictionary name": "词典名称", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "此处无法播放该音频 — 此词典使用过时格式。请尝试使用 Opus、MP3 或 WAV 音频的词典。" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 8cbed257..a4a83ef9 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -826,7 +826,6 @@ "Failed to export the book.": "書籍匯出失敗。", "Export Book": "匯出書籍", "Whole word:": "全詞匹配:", - "Error": "錯誤", "Date Published": "出版日期", "Only for TTS:": "僅用於TTS:", "Uploaded": "已上傳", @@ -1194,11 +1193,6 @@ "Failed to start stream": "無法啟動串流", "No dictionaries enabled": "未啟用任何詞典", "Enable a dictionary in Settings → Language → Dictionaries.": "在 設定 → 語言 → 詞典 中啟用詞典。", - "No definitions found": "未找到釋義", - "Search for {{word}} on the web.": "在網頁上搜尋 {{word}}。", - "Dictionary unsupported": "詞典不支援", - "This dictionary format is not supported yet.": "尚不支援此詞典格式。", - "Unable to load the word.": "無法載入此詞。", "Wiktionary": "維基詞典", "Drag to reorder": "拖曳以重新排序", "Built-in": "內建", @@ -1215,7 +1209,6 @@ "Import Dictionary": "匯入詞典", "No dictionaries available.": "沒有可用的詞典。", "StarDict bundles need .ifo, .idx, and .dict.dz files (.syn optional).": "StarDict 詞典套件需要 .ifo、.idx 和 .dict.dz 檔案(.syn 選用)。", - "MDict bundles use .mdx files; companion .mdd files are optional.": "MDict 詞典套件使用 .mdx 檔案;搭配的 .mdd 檔案為選用。", "Select all the bundle files together when importing.": "匯入時請同時選擇詞典套件內的所有檔案。", "Manage Dictionaries": "管理詞典", "Select Dictionary Files": "選擇詞典檔案", @@ -1305,5 +1298,15 @@ "Use %WORD% where the looked-up word should appear.": "在查詢字詞應出現的位置使用 %WORD%。", "Open the search result in your browser:": "在瀏覽器中開啟搜尋結果:", "Open in {{name}}": "在 {{name}} 中開啟", - "Book Fingerprint": "書籍指紋" + "Book Fingerprint": "書籍指紋", + "Search the web": "網路搜尋", + "App deeplink (readest://)": "應用程式深層連結 (readest://)", + "Universal web link (https://)": "通用網頁連結 (https://)", + "Name cannot be empty.": "名稱不能為空。", + "Replaced {{count}} existing dictionary_other": "已替換 {{count}} 個現有辭典", + "Cancel Edit": "取消編輯", + "Edit Dictionary": "編輯辭典", + "MDict bundles use .mdx files; companion .mdd and .css files are optional.": "MDict 套件使用 .mdx 檔案;附帶的 .mdd 與 .css 檔案為選用。", + "Dictionary name": "辭典名稱", + "This audio can't play here — the dictionary uses an outdated format. Try one with Opus, MP3, or WAV audio.": "無法在此播放此音訊 — 此辭典使用過時格式。請改用提供 Opus、MP3 或 WAV 音訊的辭典。" } diff --git a/apps/readest-app/src/__tests__/services/dictionaries/mdictProvider.test.ts b/apps/readest-app/src/__tests__/services/dictionaries/mdictProvider.test.ts index f90720aa..1abce1cb 100644 --- a/apps/readest-app/src/__tests__/services/dictionaries/mdictProvider.test.ts +++ b/apps/readest-app/src/__tests__/services/dictionaries/mdictProvider.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach } from 'vitest'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; import { createMdictProvider } from '@/services/dictionaries/providers/mdictProvider'; import type { ImportedDictionary } from '@/services/dictionaries/types'; @@ -54,6 +54,14 @@ const makeFs = () => ({ }, }); +// MDict cards render the body in a shadow root so each dictionary's CSS +// stays scoped. Helper for tests that need to peek inside. +const getMdictShadow = (container: HTMLElement): ShadowRoot => { + const host = container.lastElementChild as HTMLElement | null; + if (!host?.shadowRoot) throw new Error('expected mdict shadow host as last child of container'); + return host.shadowRoot; +}; + describe('mdictProvider', () => { it('opens an .mdx via Blob and looks up a real entry', async () => { const provider = createMdictProvider({ dict: buildDict(false), fs: makeFs() }); @@ -64,8 +72,12 @@ describe('mdictProvider', () => { }); expect(outcome.ok).toBe(true); if (outcome.ok) expect(outcome.headword).toBe(KNOWN_HEADWORD); - expect(container.querySelector('h1')?.textContent).toBe(KNOWN_HEADWORD); - expect(container.querySelector('div')?.innerHTML.length).toBeGreaterThan(0); + // The headword surfaces either as our auto-prepended light-DOM

+ // or — when the dict body already includes one — inside the shadow. + const lightH1 = container.querySelector('h1')?.textContent?.trim(); + const shadowText = getMdictShadow(container).textContent ?? ''; + expect(lightH1 === KNOWN_HEADWORD || shadowText.includes(KNOWN_HEADWORD)).toBe(true); + expect(shadowText.length).toBeGreaterThan(0); }); it('returns empty for an unknown headword', async () => { @@ -279,6 +291,637 @@ describe('mdictProvider', () => { expect(mdxBytesRead).toBeLessThan(realMdx.size * 0.5); }); + it('intercepts sound:// anchor clicks and plays via MDD lookup', async () => { + const jsmdict = await import('js-mdict'); + const origMDXCreate = jsmdict.MDX.create.bind(jsmdict.MDX); + const origMDDCreate = jsmdict.MDD.create.bind(jsmdict.MDD); + const locateMock = vi.fn(async (key: string) => ({ + keyText: key, + data: new Uint8Array([0xff, 0xfb, 0x90, 0x00]), + })); + const playSpy = vi + .spyOn(window.HTMLMediaElement.prototype, 'play') + .mockResolvedValue(undefined); + type FakeMDX = ReturnType extends Promise ? T : never; + type FakeMDD = ReturnType extends Promise ? T : never; + jsmdict.MDX.create = async () => + ({ + meta: { encrypt: 0 }, + header: {}, + lookup: async (word: string) => ({ + keyText: word, + definition: `${word} play`, + }), + }) as unknown as FakeMDX; + jsmdict.MDD.create = async () => + ({ + locateBytes: locateMock, + }) as unknown as FakeMDD; + + try { + const provider = createMdictProvider({ dict: buildDict(true), fs: makeFs() }); + const container = document.createElement('div'); + await provider.lookup('hello', { + signal: new AbortController().signal, + container, + }); + + const anchor = getMdictShadow(container).querySelector( + 'a[href^="sound://"]', + ) as HTMLAnchorElement | null; + expect(anchor).not.toBeNull(); + + anchor!.click(); + // Drain microtasks so the async click handler completes its lookup + + // URL.createObjectURL + audio.play() chain. + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(locateMock).toHaveBeenCalledWith('test01.mp3'); + expect(playSpy).toHaveBeenCalled(); + expect(anchor!.getAttribute('data-mdd-resolved')).toMatch(/^blob:/); + + // Second click reuses the cached blob URL — no extra MDD read. + locateMock.mockClear(); + playSpy.mockClear(); + anchor!.click(); + await new Promise((resolve) => setTimeout(resolve, 0)); + expect(locateMock).not.toHaveBeenCalled(); + expect(playSpy).toHaveBeenCalled(); + } finally { + jsmdict.MDX.create = origMDXCreate; + jsmdict.MDD.create = origMDDCreate; + playSpy.mockRestore(); + } + }); + + it('skips playback for deprecated sound://*.spx clicks and dispatches a deprecation toast', async () => { + const jsmdict = await import('js-mdict'); + const eventModule = await import('@/utils/event'); + const origMDXCreate = jsmdict.MDX.create.bind(jsmdict.MDX); + const origMDDCreate = jsmdict.MDD.create.bind(jsmdict.MDD); + const locateMock = vi.fn(); + const playSpy = vi + .spyOn(window.HTMLMediaElement.prototype, 'play') + .mockResolvedValue(undefined); + const dispatchSpy = vi.spyOn(eventModule.eventDispatcher, 'dispatch'); + type FakeMDX = ReturnType extends Promise ? T : never; + type FakeMDD = ReturnType extends Promise ? T : never; + jsmdict.MDX.create = async () => + ({ + meta: { encrypt: 0 }, + header: {}, + lookup: async (word: string) => ({ + keyText: word, + definition: `${word} play`, + }), + }) as unknown as FakeMDX; + jsmdict.MDD.create = async () => + ({ + locateBytes: locateMock, + }) as unknown as FakeMDD; + + try { + const provider = createMdictProvider({ dict: buildDict(true), fs: makeFs() }); + const container = document.createElement('div'); + await provider.lookup('hello', { + signal: new AbortController().signal, + container, + }); + + const anchor = getMdictShadow(container).querySelector( + 'a[href^="sound://"]', + ) as HTMLAnchorElement | null; + expect(anchor).not.toBeNull(); + + anchor!.click(); + await new Promise((resolve) => setTimeout(resolve, 0)); + + // The .spx click short-circuits before any MDD or Audio work. + expect(locateMock).not.toHaveBeenCalled(); + expect(playSpy).not.toHaveBeenCalled(); + // A deprecation warning toast is dispatched. + const toastCall = dispatchSpy.mock.calls.find(([event]) => event === 'toast'); + expect(toastCall).toBeDefined(); + const payload = toastCall![1] as { type: string; message: string }; + expect(payload.type).toBe('warning'); + expect(payload.message).toMatch(/outdated format/i); + } finally { + jsmdict.MDX.create = origMDXCreate; + jsmdict.MDD.create = origMDDCreate; + playSpy.mockRestore(); + dispatchSpy.mockRestore(); + } + }); + + it('forwards entry:// anchor clicks to ctx.onNavigate (URL-decoded)', async () => { + const jsmdict = await import('js-mdict'); + const origMDXCreate = jsmdict.MDX.create.bind(jsmdict.MDX); + type FakeMDX = ReturnType extends Promise ? T : never; + jsmdict.MDX.create = async () => + ({ + meta: { encrypt: 0 }, + header: {}, + lookup: async (word: string) => ({ + keyText: word, + definition: `see timid and hello world`, + }), + }) as unknown as FakeMDX; + + try { + const provider = createMdictProvider({ dict: buildDict(false), fs: makeFs() }); + const container = document.createElement('div'); + const onNavigate = vi.fn(); + await provider.lookup('timidly', { + signal: new AbortController().signal, + container, + onNavigate, + }); + + const shadow = getMdictShadow(container); + const entryAnchor = shadow.querySelector('a[href^="entry://"]') as HTMLAnchorElement | null; + const bwordAnchor = shadow.querySelector('a[href^="bword://"]') as HTMLAnchorElement | null; + expect(entryAnchor).not.toBeNull(); + expect(bwordAnchor).not.toBeNull(); + + entryAnchor!.click(); + expect(onNavigate).toHaveBeenLastCalledWith('timid'); + + bwordAnchor!.click(); + // bword:// alias resolves the same way, with URL-decoding applied. + expect(onNavigate).toHaveBeenLastCalledWith('hello world'); + } finally { + jsmdict.MDX.create = origMDXCreate; + } + }); + + it('inlines a stylesheet referenced via by reading bytes from MDD', async () => { + const jsmdict = await import('js-mdict'); + const origMDXCreate = jsmdict.MDX.create.bind(jsmdict.MDX); + const origMDDCreate = jsmdict.MDD.create.bind(jsmdict.MDD); + const cssText = '.hw{color:red}'; + type FakeMDX = ReturnType extends Promise ? T : never; + type FakeMDD = ReturnType extends Promise ? T : never; + jsmdict.MDX.create = async () => + ({ + meta: { encrypt: 0 }, + header: {}, + lookup: async (word: string) => ({ + keyText: word, + definition: `${word}`, + }), + }) as unknown as FakeMDX; + const locateMock = vi.fn(async (key: string) => { + if (key === 'mwa.css') { + return { keyText: key, data: new TextEncoder().encode(cssText) }; + } + return { keyText: key, data: null }; + }); + jsmdict.MDD.create = async () => + ({ + locateBytes: locateMock, + }) as unknown as FakeMDD; + + try { + const provider = createMdictProvider({ dict: buildDict(true), fs: makeFs() }); + const container = document.createElement('div'); + await provider.lookup('hello', { + signal: new AbortController().signal, + container, + }); + + const shadow = getMdictShadow(container); + // The original is removed; its CSS is inlined as a