diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 651fe380..b0d5e554 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -1945,5 +1945,68 @@ "Find:": "بحث:", "Enable rule": "تفعيل القاعدة", "Disable rule": "تعطيل القاعدة", - "Progress Read": "تقدم القراءة" + "Progress Read": "تقدم القراءة", + "Auto-import new books from this folder": "استيراد الكتب الجديدة تلقائيًا من هذا المجلد", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "عند إضافة كتب جديدة إلى هذا المجلد، يتم استيرادها تلقائيًا في المرة التالية التي يُفتح فيها Readest أو يعود إلى المقدمة.", + "Reading aloud": "جارٍ القراءة بصوت عالٍ", + "Open Book": "فتح الكتاب", + "Stop reading aloud": "إيقاف القراءة بصوت عالٍ", + "Enter at least two words": "أدخل كلمتين على الأقل", + "Search failed": "فشل البحث", + "Search with regex": "البحث بالتعابير النمطية", + "Words to find near each other": "كلمات يُبحث عنها بالقرب من بعضها", + "Contains": "يحتوي على", + "Whole Words": "كلمات كاملة", + "Regular Expression": "تعبير نمطي", + "Nearby Words": "كلمات متقاربة", + "Within N words": "ضمن N كلمات", + "Not for regex": "غير متاح للتعابير النمطية", + "No results found": "لم يتم العثور على نتائج", + "{{count}} results_zero": "لا توجد نتائج", + "{{count}} results_one": "نتيجة واحدة", + "{{count}} results_two": "نتيجتان", + "{{count}} results_few": "{{count}} نتائج", + "{{count}} results_many": "{{count}} نتيجةً", + "{{count}} results_other": "{{count}} نتيجة", + "Failed to seek": "فشل الانتقال", + "Chapter progress": "تقدم الفصل", + "{{elapsed}} of {{total}}": "{{elapsed}} من {{total}}", + "Decrease Contrast": "تقليل التباين", + "Reset Contrast": "إعادة تعيين التباين", + "Increase Contrast": "زيادة التباين", + "Google Drive session expired. Reconnect in Settings.": "انتهت صلاحية جلسة Google Drive. أعد الاتصال من الإعدادات.", + "Cloud sync session expired. Reconnect in Settings.": "انتهت صلاحية جلسة المزامنة السحابية. أعد الاتصال من الإعدادات.", + "Push": "دفع", + "Slide": "انزلاق", + "Page Curl": "طي الصفحة", + "Animation Style": "نمط الرسوم المتحركة", + "Appearance": "المظهر", + "Sets the text size of dictionary results, independent of the reading view.": "يحدد حجم نص نتائج القاموس بشكل مستقل عن عرض القراءة.", + "Authentication failed. Reconnect in Settings.": "فشلت المصادقة. أعد الاتصال من الإعدادات.", + "Full Sync": "مزامنة كاملة", + "Re-check every book instead of only changed ones.": "إعادة فحص كل كتاب بدلاً من الكتب المتغيرة فقط.", + "Waiting for sign-in…": "في انتظار تسجيل الدخول…", + "Reconnect": "إعادة الاتصال", + "Connected as {{account}}": "متصل باسم {{account}}", + ". Make Google Drive the active cloud provider.": ". اجعل Google Drive مزود السحابة النشط.", + "Use Google Drive": "استخدام Google Drive", + "Sign-in opens in your browser.": "يتم فتح تسجيل الدخول في متصفحك.", + "Readest only accesses the files it creates in your Drive.": "لا يصل Readest إلا إلى الملفات التي ينشئها في Drive الخاص بك.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "زامن مكتبتك وتقدم القراءة والتمييزات مع خادم WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "زامن مكتبتك وتقدم القراءة والتمييزات مع Google Drive الخاص بك.", + "Configured": "تم الإعداد", + "Third-party Cloud Sync": "مزامنة سحابية من جهة خارجية", + "Use WebDAV": "استخدام WebDAV", + "Cloud Sync": "المزامنة السحابية", + "Available on Plus, Pro, or Lifetime": "متاح في Plus أو Pro أو Lifetime", + "Extra Large": "كبير جدًا", + "Hint size": "حجم التلميح", + "Gloss text size above the word": "حجم نص التلميح الظاهر فوق الكلمة", + "Hint color": "لون التلميح", + "Adjust Text Selection": "ضبط تحديد النص", + "Your books will appear here": "ستظهر كتبك هنا", + "Reading aloud continues in the background": "تستمر القراءة بصوت عالٍ في الخلفية", + "Stopped reading aloud": "تم إيقاف القراءة بصوت عالٍ", + "Read aloud stopped": "توقفت القراءة بصوت عالٍ" } diff --git a/apps/readest-app/public/locales/bn/translation.json b/apps/readest-app/public/locales/bn/translation.json index dccb515a..f78b30f9 100644 --- a/apps/readest-app/public/locales/bn/translation.json +++ b/apps/readest-app/public/locales/bn/translation.json @@ -1813,5 +1813,64 @@ "Find:": "খুঁজুন:", "Enable rule": "নিয়ম সক্রিয় করুন", "Disable rule": "নিয়ম নিষ্ক্রিয় করুন", - "Progress Read": "পড়ার অগ্রগতি" + "Progress Read": "পড়ার অগ্রগতি", + "Auto-import new books from this folder": "এই ফোল্ডার থেকে নতুন বই স্বয়ংক্রিয়ভাবে আমদানি করুন", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "এই ফোল্ডারে নতুন বই যোগ করা হলে, পরের বার Readest খুললে বা সামনে ফিরে এলে সেগুলি স্বয়ংক্রিয়ভাবে আমদানি করা হবে।", + "Reading aloud": "উচ্চস্বরে পড়া হচ্ছে", + "Open Book": "বই খুলুন", + "Stop reading aloud": "উচ্চস্বরে পড়া বন্ধ করুন", + "Enter at least two words": "কমপক্ষে দুটি শব্দ লিখুন", + "Search failed": "অনুসন্ধান ব্যর্থ হয়েছে", + "Search with regex": "রেগুলার এক্সপ্রেশন দিয়ে খুঁজুন", + "Words to find near each other": "একে অপরের কাছাকাছি খোঁজার শব্দ", + "Contains": "অন্তর্ভুক্ত", + "Whole Words": "পূর্ণ শব্দ", + "Regular Expression": "রেগুলার এক্সপ্রেশন", + "Nearby Words": "কাছাকাছি শব্দ", + "Within N words": "N শব্দের মধ্যে", + "Not for regex": "রেগুলার এক্সপ্রেশনের জন্য নয়", + "No results found": "কোনো ফলাফল পাওয়া যায়নি", + "{{count}} results_one": "{{count}}টি ফলাফল", + "{{count}} results_other": "{{count}}টি ফলাফল", + "Failed to seek": "নির্দিষ্ট অবস্থানে যাওয়া যায়নি", + "Chapter progress": "অধ্যায়ের অগ্রগতি", + "{{elapsed}} of {{total}}": "{{total}} এর মধ্যে {{elapsed}}", + "Decrease Contrast": "কন্ট্রাস্ট কমান", + "Reset Contrast": "কন্ট্রাস্ট রিসেট করুন", + "Increase Contrast": "কন্ট্রাস্ট বাড়ান", + "Google Drive session expired. Reconnect in Settings.": "Google Drive সেশনের মেয়াদ শেষ হয়ে গেছে। সেটিংসে পুনরায় সংযোগ করুন।", + "Cloud sync session expired. Reconnect in Settings.": "ক্লাউড সিঙ্ক সেশনের মেয়াদ শেষ হয়ে গেছে। সেটিংসে পুনরায় সংযোগ করুন।", + "Push": "পুশ", + "Slide": "স্লাইড", + "Page Curl": "পেজ কার্ল", + "Animation Style": "অ্যানিমেশন শৈলী", + "Appearance": "চেহারা", + "Sets the text size of dictionary results, independent of the reading view.": "পড়ার ভিউ থেকে স্বাধীনভাবে অভিধানের ফলাফলের টেক্সটের আকার নির্ধারণ করে।", + "Authentication failed. Reconnect in Settings.": "প্রমাণীকরণ ব্যর্থ হয়েছে। সেটিংসে পুনরায় সংযোগ করুন।", + "Full Sync": "সম্পূর্ণ সিঙ্ক", + "Re-check every book instead of only changed ones.": "শুধু পরিবর্তিত বই নয়, প্রতিটি বই পুনরায় পরীক্ষা করুন।", + "Waiting for sign-in…": "সাইন ইনের জন্য অপেক্ষা করা হচ্ছে…", + "Reconnect": "পুনরায় সংযোগ করুন", + "Connected as {{account}}": "{{account}} হিসেবে সংযুক্ত", + ". Make Google Drive the active cloud provider.": "। Google Drive-কে সক্রিয় ক্লাউড প্রদানকারী করুন।", + "Use Google Drive": "Google Drive ব্যবহার করুন", + "Sign-in opens in your browser.": "সাইন ইন আপনার ব্রাউজারে খুলবে।", + "Readest only accesses the files it creates in your Drive.": "Readest শুধুমাত্র আপনার Drive-এ নিজে তৈরি করা ফাইলগুলিতেই প্রবেশ করে।", + "Sync your library, reading progress, and highlights with a WebDAV server.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি একটি WebDAV সার্ভারের সাথে সিঙ্ক করুন।", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "আপনার লাইব্রেরি, পড়ার অগ্রগতি এবং হাইলাইটগুলি আপনার Google Drive-এর সাথে সিঙ্ক করুন।", + "Configured": "কনফিগার করা হয়েছে", + "Third-party Cloud Sync": "তৃতীয় পক্ষের ক্লাউড সিঙ্ক", + "Use WebDAV": "WebDAV ব্যবহার করুন", + "Cloud Sync": "ক্লাউড সিঙ্ক", + "Available on Plus, Pro, or Lifetime": "Plus, Pro বা Lifetime-এ উপলব্ধ", + "Extra Large": "অতিরিক্ত বড়", + "Hint size": "ইঙ্গিতের আকার", + "Gloss text size above the word": "শব্দের উপরে ইঙ্গিত টেক্সটের আকার", + "Hint color": "ইঙ্গিতের রং", + "Adjust Text Selection": "টেক্সট নির্বাচন সামঞ্জস্য করুন", + "Your books will appear here": "আপনার বইগুলি এখানে দেখা যাবে", + "Reading aloud continues in the background": "উচ্চস্বরে পড়া ব্যাকগ্রাউন্ডে চলতে থাকবে", + "Stopped reading aloud": "উচ্চস্বরে পড়া বন্ধ করা হয়েছে", + "Read aloud stopped": "উচ্চস্বরে পড়া বন্ধ হয়েছে" } diff --git a/apps/readest-app/public/locales/bo/translation.json b/apps/readest-app/public/locales/bo/translation.json index a4d22ffe..d9b86c13 100644 --- a/apps/readest-app/public/locales/bo/translation.json +++ b/apps/readest-app/public/locales/bo/translation.json @@ -1774,5 +1774,69 @@ "Find:": "འཚོལ་བཤེར།:", "Enable rule": "སྲིད་སྒྲིག་སྤྱོད་པ།", "Disable rule": "སྲིད་སྒྲིག་སྒོ་བརྒྱབ།", - "Progress Read": "ཀློག་པའི་ཡར་འཕེལ།" + "Progress Read": "ཀློག་པའི་ཡར་འཕེལ།", + "Auto-import new books from this folder": "ཡིག་སྣོད་འདིའི་ནང་གི་དཔེ་དེབ་གསར་པ་རང་འགུལ་ནང་འདྲེན་བྱེད།", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "ཡིག་སྣོད་འདིའི་ནང་དཔེ་དེབ་གསར་པ་ཁ་སྣོན་བྱས་ཚེ། ཐེངས་རྗེས་མར་ Readest ཁ་ཕྱེ་བའམ་མདུན་ངོས་སུ་ཕྱིར་ལོག་སྐབས་རང་འགུལ་གྱིས་ནང་འདྲེན་བྱེད།", + "Reading aloud": "སྒྲ་ཀློག་བྱེད་བཞིན་པ།", + "Open Book": "དཔེ་དེབ་ཁ་ཕྱེ་བ།", + "Stop reading aloud": "སྒྲ་ཀློག་མཚམས་འཇོག", + "Enter at least two words": "ཉུང་མཐར་ཚིག་གཉིས་ནང་འཇུག་བྱེད་རོགས།", + "Search failed": "འཚོལ་བཤེར་མ་ཐུབ།", + "Search with regex": "Regex བེད་སྤྱད་ནས་འཚོལ་བཤེར་བྱེད།", + "Words to find near each other": "ཕན་ཚུན་ཉེ་སར་འཚོལ་བྱའི་ཚིག་རྣམས།", + "Contains": "འདུས་པ།", + "Whole Words": "ཚིག་བྱང་ཆ་ཚང་།", + "Regular Expression": "Regex", + "Nearby Words": "ཉེ་འཁོར་གྱི་ཚིག", + "Within N words": "ཚིག N ནང་ཚུན།", + "Not for regex": "Regex ལ་མི་སྤྱོད།", + "No results found": "འབྲས་བུ་མ་རྙེད།", + "{{count}} results_other": "འབྲས་བུ་ {{count}}།", + "Failed to seek": "མཆོང་སྐྱོད་བྱེད་མ་ཐུབ།", + "Chapter progress": "ལེའུའི་འཕེལ་རིམ།", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "བསྡུར་ཚད་ཆུང་དུ་གཏོང་།", + "Reset Contrast": "བསྡུར་ཚད་བསྐྱར་སྒྲིག", + "Increase Contrast": "བསྡུར་ཚད་ཆེ་རུ་གཏོང་།", + "Google Drive session expired. Reconnect in Settings.": "Google Drive ནང་བསྐྱོད་ཀྱི་དུས་ཡུན་རྫོགས་ཟིན། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།", + "Cloud sync session expired. Reconnect in Settings.": "སྤྲིན་མཉམ་སྒྲིག་གི་ནང་བསྐྱོད་དུས་ཡུན་རྫོགས་ཟིན། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།", + "Push": "འདེད་པ།", + "Slide": "བཤུད་པ།", + "Page Curl": "ཤོག་ལྷེ་སྒྲིལ་བ།", + "Animation Style": "འགུལ་རིས་ཀྱི་རྣམ་པ།", + "Appearance": "ཕྱི་རྣམ།", + "Sets the text size of dictionary results, independent of the reading view.": "ཚིག་མཛོད་ཀྱི་འབྲས་བུའི་ཡི་གེའི་ཆེ་ཆུང་སྒྲིག་པ་དང་། ཀློག་པའི་ངོས་དང་འབྲེལ་བ་མེད།", + "Authentication failed. Reconnect in Settings.": "ངོ་སྤྲོད་མ་ཐུབ། སྒྲིག་སྟངས་ནང་ནས་ཡང་བསྐྱར་འབྲེལ་མཐུད་གནང་།", + "Full Sync": "ཡོངས་རྫོགས་མཉམ་སྒྲིག", + "Re-check every book instead of only changed ones.": "འགྱུར་བ་བྱུང་བའི་དཔེ་དེབ་ཁོ་ན་མིན་པར་དཔེ་དེབ་ཡོངས་ལ་བསྐྱར་ཞིབ་བྱེད།", + "Waiting for sign-in…": "ནང་བསྐྱོད་ལ་སྒུག་བཞིན་པ།…", + "Reconnect": "ཡང་བསྐྱར་འབྲེལ་མཐུད།", + "Connected as {{account}}": "{{account}} ཐོག་ནས་འབྲེལ་མཐུད་ཟིན།", + ". Make Google Drive the active cloud provider.": "། Google Drive དེ་སྤྱོད་བཞིན་པའི་སྤྲིན་ཞབས་ཞུ་མཁོ་སྤྲོད་པར་སྒྲིག་པ།", + "Use Google Drive": "Google Drive བེད་སྤྱོད།", + "Sign-in opens in your browser.": "ནང་བསྐྱོད་ཁྱེད་ཀྱི་བརྡར་ཞིབ་ཆས་ནང་ཁ་ཕྱེ་ངེས།", + "Readest only accesses the files it creates in your Drive.": "Readest ཀྱིས་ཁྱེད་ཀྱི་ Drive ནང་རང་ཉིད་ཀྱིས་བཟོས་པའི་ཡིག་ཆ་ཁོ་ནར་ལྟ་སྤྱོད་བྱེད།", + "Filter": "འཚག་འདེམས།", + "Sort by": "རིམ་སྒྲིག་བྱེད་སྟངས།", + "Date modified": "བཟོ་བཅོས་ཚེས་གྲངས།", + "Date created": "གསར་བཟོའི་ཚེས་གྲངས།", + "Sort ascending": "འཕར་རིམ་གྱིས་རིམ་སྒྲིག", + "Sort descending": "འཕྲི་རིམ་གྱིས་རིམ་སྒྲིག", + "Sync your library, reading progress, and highlights with a WebDAV server.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ WebDAV ཞབས་ཞུ་འཕྲུལ་ཆས་དང་མཉམ་སྒྲིག་བྱེད།", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "ཁྱེད་ཀྱི་དཔེ་མཛོད་དང་། ཀློག་པའི་ཡར་འཕེལ། གཙོ་གནད་བཅས་ཁྱེད་ཀྱི་ Google Drive དང་མཉམ་སྒྲིག་བྱེད།", + "Configured": "བཀོད་སྒྲིག་ཟིན།", + "Third-party Cloud Sync": "ཕྱོགས་གསུམ་པའི་སྤྲིན་མཉམ་སྒྲིག", + "Use WebDAV": "WebDAV བེད་སྤྱོད།", + "Cloud Sync": "སྤྲིན་མཉམ་སྒྲིག", + "Available on Plus, Pro, or Lifetime": "Plus, Pro, Lifetime འཆར་གཞི་ལ་ཐོབ་ཐུབ།", + "Extra Large": "ཧ་ཅང་ཆེ་བ།", + "Hint size": "བརྡ་སྟོན་གྱི་ཆེ་ཆུང་།", + "Gloss text size above the word": "ཚིག་གི་སྟེང་གི་བརྡ་སྟོན་ཡི་གེའི་ཆེ་ཆུང་།", + "Hint color": "བརྡ་སྟོན་གྱི་ཚོན་མདོག", + "Adjust Text Selection": "ཡི་གེ་འདེམས་པ་སྙོམ་སྒྲིག", + "Your books will appear here": "ཁྱེད་ཀྱི་དཔེ་དེབ་འདིར་མངོན་ངེས།", + "Reading aloud continues in the background": "སྒྲ་ཀློག་རྒྱབ་ལྗོངས་སུ་མུ་མཐུད་འགྲོ་བཞིན་ཡོད།", + "Stopped reading aloud": "སྒྲ་ཀློག་མཚམས་བཞག་ཟིན།", + "Read aloud stopped": "སྒྲ་ཀློག་མཚམས་ཆད་ཟིན།" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 2781be34..65b8c4e1 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Suchen:", "Enable rule": "Regel aktivieren", "Disable rule": "Regel deaktivieren", - "Progress Read": "Lesefortschritt" + "Progress Read": "Lesefortschritt", + "Auto-import new books from this folder": "Neue Bücher aus diesem Ordner automatisch importieren", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Wenn neue Bücher zu diesem Ordner hinzugefügt werden, werden sie automatisch importiert, sobald Readest das nächste Mal geöffnet oder in den Vordergrund geholt wird.", + "Reading aloud": "Vorlesen läuft", + "Open Book": "Buch öffnen", + "Stop reading aloud": "Vorlesen stoppen", + "Enter at least two words": "Mindestens zwei Wörter eingeben", + "Search failed": "Suche fehlgeschlagen", + "Search with regex": "Mit Regex suchen", + "Words to find near each other": "Wörter, die nahe beieinander stehen sollen", + "Contains": "Enthält", + "Whole Words": "Ganze Wörter", + "Regular Expression": "Regulärer Ausdruck", + "Nearby Words": "Benachbarte Wörter", + "Within N words": "Innerhalb von N Wörtern", + "Not for regex": "Nicht für Regex", + "No results found": "Keine Ergebnisse gefunden", + "{{count}} results_one": "{{count}} Ergebnis", + "{{count}} results_other": "{{count}} Ergebnisse", + "Failed to seek": "Spulen fehlgeschlagen", + "Chapter progress": "Kapitelfortschritt", + "{{elapsed}} of {{total}}": "{{elapsed}} von {{total}}", + "Decrease Contrast": "Kontrast verringern", + "Reset Contrast": "Kontrast zurücksetzen", + "Increase Contrast": "Kontrast erhöhen", + "Google Drive session expired. Reconnect in Settings.": "Google Drive-Sitzung abgelaufen. In den Einstellungen erneut verbinden.", + "Cloud sync session expired. Reconnect in Settings.": "Cloud-Sync-Sitzung abgelaufen. In den Einstellungen erneut verbinden.", + "Push": "Schieben", + "Slide": "Gleiten", + "Page Curl": "Umblättern", + "Animation Style": "Animationsstil", + "Appearance": "Erscheinungsbild", + "Sets the text size of dictionary results, independent of the reading view.": "Legt die Textgröße der Wörterbuchergebnisse fest, unabhängig von der Leseansicht.", + "Authentication failed. Reconnect in Settings.": "Authentifizierung fehlgeschlagen. In den Einstellungen erneut verbinden.", + "Full Sync": "Vollständige Synchronisierung", + "Re-check every book instead of only changed ones.": "Alle Bücher erneut prüfen statt nur geänderte.", + "Waiting for sign-in…": "Warten auf Anmeldung…", + "Reconnect": "Erneut verbinden", + "Connected as {{account}}": "Verbunden als {{account}}", + ". Make Google Drive the active cloud provider.": ". Google Drive als aktiven Cloud-Anbieter festlegen.", + "Use Google Drive": "Google Drive verwenden", + "Sign-in opens in your browser.": "Die Anmeldung wird in Ihrem Browser geöffnet.", + "Readest only accesses the files it creates in your Drive.": "Readest greift nur auf die Dateien zu, die es in Ihrem Drive erstellt.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit einem WebDAV-Server.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Synchronisieren Sie Ihre Bibliothek, Ihren Lesefortschritt und Ihre Markierungen mit Ihrem Google Drive.", + "Configured": "Konfiguriert", + "Third-party Cloud Sync": "Cloud-Synchronisierung von Drittanbietern", + "Use WebDAV": "WebDAV verwenden", + "Cloud Sync": "Cloud-Synchronisierung", + "Available on Plus, Pro, or Lifetime": "Verfügbar mit Plus, Pro oder Lifetime", + "Extra Large": "Extra groß", + "Hint size": "Hinweisgröße", + "Gloss text size above the word": "Textgröße des Hinweises über dem Wort", + "Hint color": "Hinweisfarbe", + "Adjust Text Selection": "Textauswahl anpassen", + "Your books will appear here": "Ihre Bücher erscheinen hier", + "Reading aloud continues in the background": "Das Vorlesen wird im Hintergrund fortgesetzt", + "Stopped reading aloud": "Vorlesen gestoppt", + "Read aloud stopped": "Vorlesen wurde gestoppt" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 16bbc68d..2e294c57 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Εύρεση:", "Enable rule": "Ενεργοποίηση κανόνα", "Disable rule": "Απενεργοποίηση κανόνα", - "Progress Read": "Πρόοδος ανάγνωσης" + "Progress Read": "Πρόοδος ανάγνωσης", + "Auto-import new books from this folder": "Αυτόματη εισαγωγή νέων βιβλίων από αυτόν τον φάκελο", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Όταν προστίθενται νέα βιβλία σε αυτόν τον φάκελο, θα εισάγονται αυτόματα την επόμενη φορά που το Readest θα ανοίξει ή θα επανέλθει στο προσκήνιο.", + "Reading aloud": "Ανάγνωση σε εξέλιξη", + "Open Book": "Άνοιγμα βιβλίου", + "Stop reading aloud": "Διακοπή ανάγνωσης", + "Enter at least two words": "Εισαγάγετε τουλάχιστον δύο λέξεις", + "Search failed": "Η αναζήτηση απέτυχε", + "Search with regex": "Αναζήτηση με regex", + "Words to find near each other": "Λέξεις που πρέπει να βρίσκονται κοντά η μία στην άλλη", + "Contains": "Περιέχει", + "Whole Words": "Ολόκληρες λέξεις", + "Regular Expression": "Κανονική έκφραση", + "Nearby Words": "Κοντινές λέξεις", + "Within N words": "Εντός N λέξεων", + "Not for regex": "Όχι για regex", + "No results found": "Δεν βρέθηκαν αποτελέσματα", + "{{count}} results_one": "{{count}} αποτέλεσμα", + "{{count}} results_other": "{{count}} αποτελέσματα", + "Failed to seek": "Αποτυχία μετάβασης", + "Chapter progress": "Πρόοδος κεφαλαίου", + "{{elapsed}} of {{total}}": "{{elapsed}} από {{total}}", + "Decrease Contrast": "Μείωση αντίθεσης", + "Reset Contrast": "Επαναφορά αντίθεσης", + "Increase Contrast": "Αύξηση αντίθεσης", + "Google Drive session expired. Reconnect in Settings.": "Η συνεδρία Google Drive έληξε. Επανασυνδεθείτε στις Ρυθμίσεις.", + "Cloud sync session expired. Reconnect in Settings.": "Η συνεδρία συγχρονισμού cloud έληξε. Επανασυνδεθείτε στις Ρυθμίσεις.", + "Push": "Ώθηση", + "Slide": "Ολίσθηση", + "Page Curl": "Γύρισμα σελίδας", + "Animation Style": "Στυλ κίνησης", + "Appearance": "Εμφάνιση", + "Sets the text size of dictionary results, independent of the reading view.": "Ορίζει το μέγεθος κειμένου των αποτελεσμάτων λεξικού, ανεξάρτητα από την προβολή ανάγνωσης.", + "Authentication failed. Reconnect in Settings.": "Ο έλεγχος ταυτότητας απέτυχε. Επανασυνδεθείτε στις Ρυθμίσεις.", + "Full Sync": "Πλήρης συγχρονισμός", + "Re-check every book instead of only changed ones.": "Επανέλεγχος όλων των βιβλίων αντί μόνο όσων άλλαξαν.", + "Waiting for sign-in…": "Αναμονή για σύνδεση…", + "Reconnect": "Επανασύνδεση", + "Connected as {{account}}": "Έχετε συνδεθεί ως {{account}}", + ". Make Google Drive the active cloud provider.": ". Ορίστε το Google Drive ως ενεργό πάροχο cloud.", + "Use Google Drive": "Χρήση Google Drive", + "Sign-in opens in your browser.": "Η σύνδεση ανοίγει στο πρόγραμμα περιήγησής σας.", + "Readest only accesses the files it creates in your Drive.": "Το Readest έχει πρόσβαση μόνο στα αρχεία που δημιουργεί στο Drive σας.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με έναν διακομιστή WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Συγχρονίστε τη βιβλιοθήκη, την πρόοδο ανάγνωσης και τις επισημάνσεις σας με το Google Drive σας.", + "Configured": "Ρυθμισμένο", + "Third-party Cloud Sync": "Συγχρονισμός cloud τρίτων", + "Use WebDAV": "Χρήση WebDAV", + "Cloud Sync": "Συγχρονισμός cloud", + "Available on Plus, Pro, or Lifetime": "Διαθέσιμο με Plus, Pro ή Lifetime", + "Extra Large": "Πολύ μεγάλο", + "Hint size": "Μέγεθος υπόδειξης", + "Gloss text size above the word": "Μέγεθος κειμένου της υπόδειξης πάνω από τη λέξη", + "Hint color": "Χρώμα υπόδειξης", + "Adjust Text Selection": "Προσαρμογή επιλογής κειμένου", + "Your books will appear here": "Τα βιβλία σας θα εμφανιστούν εδώ", + "Reading aloud continues in the background": "Η ανάγνωση συνεχίζεται στο παρασκήνιο", + "Stopped reading aloud": "Η ανάγνωση σταμάτησε", + "Read aloud stopped": "Η ανάγνωση διακόπηκε" } diff --git a/apps/readest-app/public/locales/en/translation.json b/apps/readest-app/public/locales/en/translation.json index 47dedeba..cac18728 100644 --- a/apps/readest-app/public/locales/en/translation.json +++ b/apps/readest-app/public/locales/en/translation.json @@ -70,5 +70,7 @@ "Imported {{count}} annotations_other": "Imported {{count}} annotations", "Recently read": "Recently read", "Show recently read": "Show recently read", - "Your books will appear here": "Your books will appear here" + "Your books will appear here": "Your books will appear here", + "{{count}} results_one": "{{count}} result", + "{{count}} results_other": "{{count}} results" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index ebaf4fbb..20bc74ce 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Buscar:", "Enable rule": "Activar regla", "Disable rule": "Desactivar regla", - "Progress Read": "Progreso de Lectura" + "Progress Read": "Progreso de Lectura", + "Auto-import new books from this folder": "Importar automáticamente los libros nuevos de esta carpeta", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Cuando se añadan libros nuevos a esta carpeta, se importarán automáticamente la próxima vez que Readest se abra o vuelva a primer plano.", + "Reading aloud": "Leyendo en voz alta", + "Open Book": "Abrir libro", + "Stop reading aloud": "Detener la lectura en voz alta", + "Enter at least two words": "Introduce al menos dos palabras", + "Search failed": "Búsqueda fallida", + "Search with regex": "Buscar con regex", + "Words to find near each other": "Palabras que deben aparecer cerca unas de otras", + "Contains": "Contiene", + "Whole Words": "Palabras completas", + "Regular Expression": "Expresión regular", + "Nearby Words": "Palabras cercanas", + "Within N words": "A menos de N palabras", + "Not for regex": "No disponible con regex", + "No results found": "No se encontraron resultados", + "{{count}} results_one": "{{count}} resultado", + "{{count}} results_many": "{{count}} de resultados", + "{{count}} results_other": "{{count}} resultados", + "Failed to seek": "No se pudo cambiar la posición", + "Chapter progress": "Progreso del capítulo", + "{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}", + "Decrease Contrast": "Disminuir contraste", + "Reset Contrast": "Restablecer contraste", + "Increase Contrast": "Aumentar contraste", + "Google Drive session expired. Reconnect in Settings.": "La sesión de Google Drive ha caducado. Vuelve a conectar en Ajustes.", + "Cloud sync session expired. Reconnect in Settings.": "La sesión de sincronización en la nube ha caducado. Vuelve a conectar en Ajustes.", + "Push": "Empuje", + "Slide": "Deslizamiento", + "Page Curl": "Curvatura de página", + "Animation Style": "Estilo de animación", + "Appearance": "Apariencia", + "Sets the text size of dictionary results, independent of the reading view.": "Establece el tamaño del texto de los resultados del diccionario, independiente de la vista de lectura.", + "Authentication failed. Reconnect in Settings.": "Autenticación fallida. Vuelve a conectar en Ajustes.", + "Full Sync": "Sincronización total", + "Re-check every book instead of only changed ones.": "Vuelve a comprobar todos los libros, no solo los modificados.", + "Waiting for sign-in…": "Esperando el inicio de sesión…", + "Reconnect": "Volver a conectar", + "Connected as {{account}}": "Conectado como {{account}}", + ". Make Google Drive the active cloud provider.": ". Haz que Google Drive sea el proveedor de nube activo.", + "Use Google Drive": "Usar Google Drive", + "Sign-in opens in your browser.": "El inicio de sesión se abre en tu navegador.", + "Readest only accesses the files it creates in your Drive.": "Readest solo accede a los archivos que crea en tu Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con un servidor WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sincroniza tu biblioteca, progreso de lectura y resaltados con tu Google Drive.", + "Configured": "Configurado", + "Third-party Cloud Sync": "Sincronización en la nube de terceros", + "Use WebDAV": "Usar WebDAV", + "Cloud Sync": "Sincronización en la nube", + "Available on Plus, Pro, or Lifetime": "Disponible con Plus, Pro o De por vida", + "Extra Large": "Extra grande", + "Hint size": "Tamaño de la pista", + "Gloss text size above the word": "Tamaño del texto de la pista sobre la palabra", + "Hint color": "Color de la pista", + "Adjust Text Selection": "Ajustar selección de texto", + "Your books will appear here": "Tus libros aparecerán aquí", + "Reading aloud continues in the background": "La lectura en voz alta continúa en segundo plano", + "Stopped reading aloud": "Lectura en voz alta detenida", + "Read aloud stopped": "Lectura en voz alta detenida" } diff --git a/apps/readest-app/public/locales/fa/translation.json b/apps/readest-app/public/locales/fa/translation.json index 4fea22b0..ab2492a7 100644 --- a/apps/readest-app/public/locales/fa/translation.json +++ b/apps/readest-app/public/locales/fa/translation.json @@ -1813,5 +1813,64 @@ "Find:": "جستجو:", "Enable rule": "فعال کردن قانون", "Disable rule": "غیرفعال کردن قانون", - "Progress Read": "وضعیت مطالعه" + "Progress Read": "وضعیت مطالعه", + "Auto-import new books from this folder": "وارد کردن خودکار کتاب‌های جدید از این پوشه", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "وقتی کتاب‌های جدیدی به این پوشه اضافه شوند، دفعه بعدی که Readest باز شود یا به پیش‌زمینه بازگردد، به‌طور خودکار وارد می‌شوند.", + "Reading aloud": "در حال خواندن با صدای بلند", + "Open Book": "باز کردن کتاب", + "Stop reading aloud": "توقف خواندن با صدای بلند", + "Enter at least two words": "حداقل دو کلمه وارد کنید", + "Search failed": "جستجو ناموفق بود", + "Search with regex": "جستجو با عبارت باقاعده", + "Words to find near each other": "کلماتی که باید نزدیک هم پیدا شوند", + "Contains": "شامل", + "Whole Words": "کل کلمات", + "Regular Expression": "عبارت باقاعده", + "Nearby Words": "کلمات نزدیک", + "Within N words": "در محدوده N کلمه", + "Not for regex": "برای عبارت باقاعده در دسترس نیست", + "No results found": "نتیجه‌ای یافت نشد", + "{{count}} results_one": "{{count}} نتیجه", + "{{count}} results_other": "{{count}} نتیجه", + "Failed to seek": "جابه‌جایی ناموفق بود", + "Chapter progress": "پیشرفت فصل", + "{{elapsed}} of {{total}}": "{{elapsed}} از {{total}}", + "Decrease Contrast": "کاهش کنتراست", + "Reset Contrast": "بازنشانی کنتراست", + "Increase Contrast": "افزایش کنتراست", + "Google Drive session expired. Reconnect in Settings.": "نشست Google Drive منقضی شده است. در تنظیمات دوباره متصل شوید.", + "Cloud sync session expired. Reconnect in Settings.": "نشست همگام‌سازی ابری منقضی شده است. در تنظیمات دوباره متصل شوید.", + "Push": "هل دادن", + "Slide": "لغزش", + "Page Curl": "پیچش صفحه", + "Animation Style": "سبک انیمیشن", + "Appearance": "ظاهر", + "Sets the text size of dictionary results, independent of the reading view.": "اندازه متن نتایج فرهنگ لغت را مستقل از نمای مطالعه تنظیم می‌کند.", + "Authentication failed. Reconnect in Settings.": "احراز هویت ناموفق بود. در تنظیمات دوباره متصل شوید.", + "Full Sync": "همگام‌سازی کامل", + "Re-check every book instead of only changed ones.": "بررسی دوباره همه کتاب‌ها به‌جای فقط کتاب‌های تغییرکرده.", + "Waiting for sign-in…": "در انتظار ورود…", + "Reconnect": "اتصال دوباره", + "Connected as {{account}}": "متصل به‌عنوان {{account}}", + ". Make Google Drive the active cloud provider.": ". Google Drive را ارائه‌دهنده فعال ابری قرار دهید.", + "Use Google Drive": "استفاده از Google Drive", + "Sign-in opens in your browser.": "ورود در مرورگر شما باز می‌شود.", + "Readest only accesses the files it creates in your Drive.": "Readest فقط به فایل‌هایی دسترسی دارد که خودش در Drive شما ایجاد می‌کند.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "کتابخانه، وضعیت مطالعه و هایلایت‌های خود را با یک سرور WebDAV همگام‌سازی کنید.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "کتابخانه، وضعیت مطالعه و هایلایت‌های خود را با Google Drive خود همگام‌سازی کنید.", + "Configured": "پیکربندی شده", + "Third-party Cloud Sync": "همگام‌سازی ابری شخص ثالث", + "Use WebDAV": "استفاده از WebDAV", + "Cloud Sync": "همگام‌سازی ابری", + "Available on Plus, Pro, or Lifetime": "در Plus، Pro یا Lifetime در دسترس است", + "Extra Large": "خیلی بزرگ", + "Hint size": "اندازه توضیح", + "Gloss text size above the word": "اندازه متن توضیح بالای کلمه", + "Hint color": "رنگ توضیح", + "Adjust Text Selection": "تنظیم انتخاب متن", + "Your books will appear here": "کتاب‌های شما اینجا نمایش داده می‌شوند", + "Reading aloud continues in the background": "خواندن با صدای بلند در پس‌زمینه ادامه می‌یابد", + "Stopped reading aloud": "خواندن با صدای بلند متوقف شد", + "Read aloud stopped": "خواندن با صدای بلند متوقف شده است" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 99f6200e..8349b37e 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Rechercher :", "Enable rule": "Activer la règle", "Disable rule": "Désactiver la règle", - "Progress Read": "Progression de lecture" + "Progress Read": "Progression de lecture", + "Auto-import new books from this folder": "Importer automatiquement les nouveaux livres de ce dossier", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Lorsque de nouveaux livres sont ajoutés à ce dossier, ils sont importés automatiquement à la prochaine ouverture de Readest ou à son retour au premier plan.", + "Reading aloud": "Lecture à haute voix", + "Open Book": "Ouvrir le livre", + "Stop reading aloud": "Arrêter la lecture à haute voix", + "Enter at least two words": "Saisissez au moins deux mots", + "Search failed": "Échec de la recherche", + "Search with regex": "Rechercher avec une regex", + "Words to find near each other": "Mots à trouver à proximité les uns des autres", + "Contains": "Contient", + "Whole Words": "Mots entiers", + "Regular Expression": "Expression régulière", + "Nearby Words": "Mots proches", + "Within N words": "À moins de N mots", + "Not for regex": "Indisponible avec les regex", + "No results found": "Aucun résultat trouvé", + "{{count}} results_one": "{{count}} résultat", + "{{count}} results_many": "{{count}} de résultats", + "{{count}} results_other": "{{count}} résultats", + "Failed to seek": "Échec du positionnement", + "Chapter progress": "Progression du chapitre", + "{{elapsed}} of {{total}}": "{{elapsed}} sur {{total}}", + "Decrease Contrast": "Diminuer le contraste", + "Reset Contrast": "Réinitialiser le contraste", + "Increase Contrast": "Augmenter le contraste", + "Google Drive session expired. Reconnect in Settings.": "Session Google Drive expirée. Reconnectez-vous dans les Réglages.", + "Cloud sync session expired. Reconnect in Settings.": "Session de synchronisation cloud expirée. Reconnectez-vous dans les Réglages.", + "Push": "Poussée", + "Slide": "Glissement", + "Page Curl": "Courbure de page", + "Animation Style": "Style d'animation", + "Appearance": "Apparence", + "Sets the text size of dictionary results, independent of the reading view.": "Définit la taille du texte des résultats du dictionnaire, indépendamment de la vue de lecture.", + "Authentication failed. Reconnect in Settings.": "Échec de l'authentification. Reconnectez-vous dans les Réglages.", + "Full Sync": "Synchronisation complète", + "Re-check every book instead of only changed ones.": "Revérifie tous les livres, pas seulement ceux modifiés.", + "Waiting for sign-in…": "En attente de connexion…", + "Reconnect": "Se reconnecter", + "Connected as {{account}}": "Connecté en tant que {{account}}", + ". Make Google Drive the active cloud provider.": ". Faites de Google Drive le fournisseur cloud actif.", + "Use Google Drive": "Utiliser Google Drive", + "Sign-in opens in your browser.": "La connexion s'ouvre dans votre navigateur.", + "Readest only accesses the files it creates in your Drive.": "Readest accède uniquement aux fichiers qu'il crée dans votre Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec un serveur WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Synchronisez votre bibliothèque, votre progression de lecture et vos surlignages avec votre Google Drive.", + "Configured": "Configuré", + "Third-party Cloud Sync": "Synchronisation cloud tierce", + "Use WebDAV": "Utiliser WebDAV", + "Cloud Sync": "Synchronisation cloud", + "Available on Plus, Pro, or Lifetime": "Disponible avec Plus, Pro ou À vie", + "Extra Large": "Très grand", + "Hint size": "Taille de l'indice", + "Gloss text size above the word": "Taille du texte de l'indice au-dessus du mot", + "Hint color": "Couleur de l'indice", + "Adjust Text Selection": "Ajuster la sélection de texte", + "Your books will appear here": "Vos livres apparaîtront ici", + "Reading aloud continues in the background": "La lecture à haute voix continue en arrière-plan", + "Stopped reading aloud": "Lecture à haute voix arrêtée", + "Read aloud stopped": "Lecture à haute voix arrêtée" } diff --git a/apps/readest-app/public/locales/he/translation.json b/apps/readest-app/public/locales/he/translation.json index 9ac63a17..20c0507f 100644 --- a/apps/readest-app/public/locales/he/translation.json +++ b/apps/readest-app/public/locales/he/translation.json @@ -1846,5 +1846,65 @@ "Find:": "חיפוש:", "Enable rule": "הפעל כלל", "Disable rule": "השבת כלל", - "Progress Read": "התקדמות קריאה" + "Progress Read": "התקדמות קריאה", + "Auto-import new books from this folder": "ייבוא אוטומטי של ספרים חדשים מתיקייה זו", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "כאשר ספרים חדשים מתווספים לתיקייה זו, הם ייובאו אוטומטית בפעם הבאה ש-Readest ייפתח או יחזור לחזית.", + "Reading aloud": "מקריא בקול", + "Open Book": "פתח ספר", + "Stop reading aloud": "הפסק הקראה בקול", + "Enter at least two words": "הזן לפחות שתי מילים", + "Search failed": "החיפוש נכשל", + "Search with regex": "חיפוש עם ביטוי רגולרי", + "Words to find near each other": "מילים לחיפוש בסמיכות זו לזו", + "Contains": "מכיל", + "Whole Words": "מילים שלמות", + "Regular Expression": "ביטוי רגולרי", + "Nearby Words": "מילים סמוכות", + "Within N words": "בטווח של N מילים", + "Not for regex": "לא זמין לביטוי רגולרי", + "No results found": "לא נמצאו תוצאות", + "{{count}} results_one": "תוצאה אחת", + "{{count}} results_two": "{{count}} תוצאות", + "{{count}} results_other": "{{count}} תוצאות", + "Failed to seek": "הדילוג נכשל", + "Chapter progress": "התקדמות הפרק", + "{{elapsed}} of {{total}}": "{{elapsed}} מתוך {{total}}", + "Decrease Contrast": "הפחת ניגודיות", + "Reset Contrast": "אפס ניגודיות", + "Increase Contrast": "הגבר ניגודיות", + "Google Drive session expired. Reconnect in Settings.": "פג תוקף החיבור ל-Google Drive. התחבר מחדש בהגדרות.", + "Cloud sync session expired. Reconnect in Settings.": "פג תוקף החיבור לסנכרון הענן. התחבר מחדש בהגדרות.", + "Push": "דחיפה", + "Slide": "החלקה", + "Page Curl": "קיפול דף", + "Animation Style": "סגנון אנימציה", + "Appearance": "מראה", + "Sets the text size of dictionary results, independent of the reading view.": "קובע את גודל הטקסט של תוצאות המילון, ללא תלות בתצוגת הקריאה.", + "Authentication failed. Reconnect in Settings.": "האימות נכשל. התחבר מחדש בהגדרות.", + "Full Sync": "סנכרון מלא", + "Re-check every book instead of only changed ones.": "בדיקה מחדש של כל ספר במקום רק אלה שהשתנו.", + "Waiting for sign-in…": "ממתין להתחברות…", + "Reconnect": "התחבר מחדש", + "Connected as {{account}}": "מחובר כ-{{account}}", + ". Make Google Drive the active cloud provider.": ". הפוך את Google Drive לספק הענן הפעיל.", + "Use Google Drive": "השתמש ב-Google Drive", + "Sign-in opens in your browser.": "ההתחברות נפתחת בדפדפן שלך.", + "Readest only accesses the files it creates in your Drive.": "Readest ניגש רק לקבצים שהוא יוצר ב-Drive שלך.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם שרת WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "סנכרן את הספרייה, התקדמות הקריאה וההדגשות שלך עם Google Drive שלך.", + "Configured": "מוגדר", + "Third-party Cloud Sync": "סנכרון ענן של צד שלישי", + "Use WebDAV": "השתמש ב-WebDAV", + "Cloud Sync": "סנכרון ענן", + "Available on Plus, Pro, or Lifetime": "זמין ב-Plus, Pro או Lifetime", + "Extra Large": "גדול במיוחד", + "Hint size": "גודל הרמז", + "Gloss text size above the word": "גודל טקסט הרמז שמעל המילה", + "Hint color": "צבע הרמז", + "Adjust Text Selection": "התאמת בחירת טקסט", + "Your books will appear here": "הספרים שלך יופיעו כאן", + "Reading aloud continues in the background": "ההקראה בקול ממשיכה ברקע", + "Stopped reading aloud": "ההקראה בקול הופסקה", + "Read aloud stopped": "ההקראה הופסקה" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 35422acb..e0db46a5 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -1813,5 +1813,64 @@ "Find:": "खोजें:", "Enable rule": "नियम सक्षम करें", "Disable rule": "नियम अक्षम करें", - "Progress Read": "पढ़ने की प्रगति" + "Progress Read": "पढ़ने की प्रगति", + "Auto-import new books from this folder": "इस फ़ोल्डर से नई पुस्तकें स्वतः आयात करें", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "जब इस फ़ोल्डर में नई पुस्तकें जोड़ी जाती हैं, तो अगली बार Readest खुलने या अग्रभूमि में लौटने पर वे स्वचालित रूप से आयात हो जाएँगी।", + "Reading aloud": "उच्च स्वर में पढ़ा जा रहा है", + "Open Book": "पुस्तक खोलें", + "Stop reading aloud": "उच्च स्वर में पढ़ना रोकें", + "Enter at least two words": "कम से कम दो शब्द दर्ज करें", + "Search failed": "खोज विफल रही", + "Search with regex": "रेगुलर एक्सप्रेशन से खोजें", + "Words to find near each other": "एक-दूसरे के पास खोजे जाने वाले शब्द", + "Contains": "शामिल है", + "Whole Words": "पूरे शब्द", + "Regular Expression": "रेगुलर एक्सप्रेशन", + "Nearby Words": "आस-पास के शब्द", + "Within N words": "N शब्दों के भीतर", + "Not for regex": "रेगुलर एक्सप्रेशन के लिए नहीं", + "No results found": "कोई परिणाम नहीं मिला", + "{{count}} results_one": "{{count}} परिणाम", + "{{count}} results_other": "{{count}} परिणाम", + "Failed to seek": "सीक करने में विफल", + "Chapter progress": "अध्याय की प्रगति", + "{{elapsed}} of {{total}}": "{{total}} में से {{elapsed}}", + "Decrease Contrast": "विरोधाभास कम करें", + "Reset Contrast": "विरोधाभास रीसेट करें", + "Increase Contrast": "विरोधाभास बढ़ाएं", + "Google Drive session expired. Reconnect in Settings.": "Google Drive सत्र समाप्त हो गया। सेटिंग्स में फिर से कनेक्ट करें।", + "Cloud sync session expired. Reconnect in Settings.": "क्लाउड सिंक सत्र समाप्त हो गया। सेटिंग्स में फिर से कनेक्ट करें।", + "Push": "पुश", + "Slide": "स्लाइड", + "Page Curl": "पेज कर्ल", + "Animation Style": "एनीमेशन शैली", + "Appearance": "दिखावट", + "Sets the text size of dictionary results, independent of the reading view.": "पठन दृश्य से स्वतंत्र रूप से शब्दकोश परिणामों के टेक्स्ट का आकार सेट करता है।", + "Authentication failed. Reconnect in Settings.": "प्रमाणीकरण विफल रहा। सेटिंग्स में फिर से कनेक्ट करें।", + "Full Sync": "पूर्ण सिंक", + "Re-check every book instead of only changed ones.": "केवल बदली गई पुस्तकों के बजाय हर पुस्तक की फिर से जाँच करें।", + "Waiting for sign-in…": "साइन-इन की प्रतीक्षा में…", + "Reconnect": "फिर से कनेक्ट करें", + "Connected as {{account}}": "{{account}} के रूप में कनेक्टेड", + ". Make Google Drive the active cloud provider.": "। Google Drive को सक्रिय क्लाउड प्रदाता बनाएं।", + "Use Google Drive": "Google Drive का उपयोग करें", + "Sign-in opens in your browser.": "साइन-इन आपके ब्राउज़र में खुलता है।", + "Readest only accesses the files it creates in your Drive.": "Readest केवल उन्हीं फ़ाइलों तक पहुँचता है जिन्हें वह आपकी Drive में बनाता है।", + "Sync your library, reading progress, and highlights with a WebDAV server.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को WebDAV सर्वर से सिंक करें।", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "अपनी लाइब्रेरी, पढ़ने की प्रगति और हाइलाइट्स को अपनी Google Drive से सिंक करें।", + "Configured": "कॉन्फ़िगर किया गया", + "Third-party Cloud Sync": "तृतीय-पक्ष क्लाउड सिंक", + "Use WebDAV": "WebDAV का उपयोग करें", + "Cloud Sync": "क्लाउड सिंक", + "Available on Plus, Pro, or Lifetime": "Plus, Pro या Lifetime में उपलब्ध", + "Extra Large": "बहुत बड़ा", + "Hint size": "संकेत का आकार", + "Gloss text size above the word": "शब्द के ऊपर दिखने वाले संकेत टेक्स्ट का आकार", + "Hint color": "संकेत का रंग", + "Adjust Text Selection": "टेक्स्ट चयन समायोजित करें", + "Your books will appear here": "आपकी पुस्तकें यहाँ दिखाई देंगी", + "Reading aloud continues in the background": "उच्च स्वर में पढ़ना पृष्ठभूमि में जारी रहता है", + "Stopped reading aloud": "उच्च स्वर में पढ़ना रोक दिया गया", + "Read aloud stopped": "उच्च स्वर में पढ़ना रुक गया" } diff --git a/apps/readest-app/public/locales/hu/translation.json b/apps/readest-app/public/locales/hu/translation.json index a4f68edb..650ee6e2 100644 --- a/apps/readest-app/public/locales/hu/translation.json +++ b/apps/readest-app/public/locales/hu/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Keresés:", "Enable rule": "Szabály engedélyezése", "Disable rule": "Szabály letiltása", - "Progress Read": "Olvasási haladás" + "Progress Read": "Olvasási haladás", + "Auto-import new books from this folder": "Új könyvek automatikus importálása ebből a mappából", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Amikor új könyvek kerülnek ebbe a mappába, a Readest automatikusan importálja őket a következő megnyitáskor vagy előtérbe kerüléskor.", + "Reading aloud": "Felolvasás folyamatban", + "Open Book": "Könyv megnyitása", + "Stop reading aloud": "Felolvasás leállítása", + "Enter at least two words": "Adjon meg legalább két szót", + "Search failed": "A keresés sikertelen", + "Search with regex": "Keresés regexszel", + "Words to find near each other": "Egymáshoz közel keresendő szavak", + "Contains": "Tartalmazza", + "Whole Words": "Teljes szavak", + "Regular Expression": "Reguláris kifejezés", + "Nearby Words": "Közeli szavak", + "Within N words": "N szón belül", + "Not for regex": "Regexnél nem használható", + "No results found": "Nincs találat", + "{{count}} results_one": "{{count}} találat", + "{{count}} results_other": "{{count}} találat", + "Failed to seek": "Az ugrás sikertelen", + "Chapter progress": "Fejezet haladás", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "Kontraszt csökkentése", + "Reset Contrast": "Kontraszt visszaállítása", + "Increase Contrast": "Kontraszt növelése", + "Google Drive session expired. Reconnect in Settings.": "A Google Drive-munkamenet lejárt. Csatlakozzon újra a Beállításokban.", + "Cloud sync session expired. Reconnect in Settings.": "A felhőszinkronizálási munkamenet lejárt. Csatlakozzon újra a Beállításokban.", + "Push": "Tolás", + "Slide": "Csúsztatás", + "Page Curl": "Lapozás", + "Animation Style": "Animáció stílusa", + "Appearance": "Megjelenés", + "Sets the text size of dictionary results, independent of the reading view.": "A szótári találatok szövegméretét állítja be, az olvasási nézettől függetlenül.", + "Authentication failed. Reconnect in Settings.": "A hitelesítés sikertelen. Csatlakozzon újra a Beállításokban.", + "Full Sync": "Teljes szinkronizálás", + "Re-check every book instead of only changed ones.": "Minden könyv újraellenőrzése, nem csak a módosultaké.", + "Waiting for sign-in…": "Várakozás a bejelentkezésre…", + "Reconnect": "Újracsatlakozás", + "Connected as {{account}}": "Csatlakozva mint {{account}}", + ". Make Google Drive the active cloud provider.": ". Tegye a Google Drive-ot az aktív felhőszolgáltatóvá.", + "Use Google Drive": "Google Drive használata", + "Sign-in opens in your browser.": "A bejelentkezés a böngészőben nyílik meg.", + "Readest only accesses the files it creates in your Drive.": "A Readest csak azokhoz a fájlokhoz fér hozzá, amelyeket ő hozott létre a Drive-jában.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit egy WebDAV-szerverrel.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Szinkronizálja könyvtárát, olvasási haladását és kiemeléseit a Google Drive-jával.", + "Configured": "Beállítva", + "Third-party Cloud Sync": "Külső felhőszinkronizálás", + "Use WebDAV": "WebDAV használata", + "Cloud Sync": "Felhőszinkronizálás", + "Available on Plus, Pro, or Lifetime": "Elérhető Plus, Pro vagy Lifetime csomaggal", + "Extra Large": "Extra nagy", + "Hint size": "Felirat mérete", + "Gloss text size above the word": "A szó feletti felirat szövegmérete", + "Hint color": "Felirat színe", + "Adjust Text Selection": "Szövegkijelölés módosítása", + "Your books will appear here": "Itt jelennek meg a könyvei", + "Reading aloud continues in the background": "A felolvasás a háttérben folytatódik", + "Stopped reading aloud": "A felolvasás leállt", + "Read aloud stopped": "Felolvasás leállítva" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index dcf41cb6..116552c6 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -1780,5 +1780,63 @@ "Find:": "Cari:", "Enable rule": "Aktifkan aturan", "Disable rule": "Nonaktifkan aturan", - "Progress Read": "Progres Membaca" + "Progress Read": "Progres Membaca", + "Auto-import new books from this folder": "Impor otomatis buku baru dari folder ini", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Saat buku baru ditambahkan ke folder ini, buku akan diimpor secara otomatis saat berikutnya Readest dibuka atau kembali ke latar depan.", + "Reading aloud": "Sedang membacakan", + "Open Book": "Buka Buku", + "Stop reading aloud": "Hentikan pembacaan", + "Enter at least two words": "Masukkan setidaknya dua kata", + "Search failed": "Pencarian gagal", + "Search with regex": "Cari dengan ekspresi reguler", + "Words to find near each other": "Kata-kata yang akan dicari berdekatan", + "Contains": "Mengandung", + "Whole Words": "Kata Utuh", + "Regular Expression": "Ekspresi Reguler", + "Nearby Words": "Kata Berdekatan", + "Within N words": "Dalam jarak N kata", + "Not for regex": "Tidak berlaku untuk ekspresi reguler", + "No results found": "Tidak ada hasil ditemukan", + "{{count}} results_other": "{{count}} hasil", + "Failed to seek": "Gagal menggeser posisi", + "Chapter progress": "Kemajuan bab", + "{{elapsed}} of {{total}}": "{{elapsed}} dari {{total}}", + "Decrease Contrast": "Kurangi Kontras", + "Reset Contrast": "Atur Ulang Kontras", + "Increase Contrast": "Tingkatkan Kontras", + "Google Drive session expired. Reconnect in Settings.": "Sesi Google Drive kedaluwarsa. Hubungkan ulang di Pengaturan.", + "Cloud sync session expired. Reconnect in Settings.": "Sesi sinkronisasi cloud kedaluwarsa. Hubungkan ulang di Pengaturan.", + "Push": "Dorong", + "Slide": "Geser", + "Page Curl": "Lengkung Halaman", + "Animation Style": "Gaya Animasi", + "Appearance": "Tampilan", + "Sets the text size of dictionary results, independent of the reading view.": "Mengatur ukuran teks hasil kamus, tidak bergantung pada tampilan baca.", + "Authentication failed. Reconnect in Settings.": "Autentikasi gagal. Hubungkan ulang di Pengaturan.", + "Full Sync": "Sinkronisasi Penuh", + "Re-check every book instead of only changed ones.": "Periksa ulang semua buku, bukan hanya yang berubah.", + "Waiting for sign-in…": "Menunggu proses masuk…", + "Reconnect": "Hubungkan Ulang", + "Connected as {{account}}": "Terhubung sebagai {{account}}", + ". Make Google Drive the active cloud provider.": ". Jadikan Google Drive penyedia cloud yang aktif.", + "Use Google Drive": "Gunakan Google Drive", + "Sign-in opens in your browser.": "Proses masuk akan terbuka di browser Anda.", + "Readest only accesses the files it creates in your Drive.": "Readest hanya mengakses file yang dibuatnya di Drive Anda.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan server WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sinkronkan perpustakaan, progres membaca, dan sorotan Anda dengan Google Drive Anda.", + "Configured": "Terkonfigurasi", + "Third-party Cloud Sync": "Sinkronisasi Cloud Pihak Ketiga", + "Use WebDAV": "Gunakan WebDAV", + "Cloud Sync": "Sinkronisasi Cloud", + "Available on Plus, Pro, or Lifetime": "Tersedia di paket Plus, Pro, atau Seumur Hidup", + "Extra Large": "Sangat Besar", + "Hint size": "Ukuran petunjuk", + "Gloss text size above the word": "Ukuran teks keterangan di atas kata", + "Hint color": "Warna petunjuk", + "Adjust Text Selection": "Sesuaikan Pilihan Teks", + "Your books will appear here": "Buku Anda akan muncul di sini", + "Reading aloud continues in the background": "Pembacaan berlanjut di latar belakang", + "Stopped reading aloud": "Pembacaan dihentikan", + "Read aloud stopped": "Pembacaan telah berhenti" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 50b1bcc7..1e0e1c95 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Trova:", "Enable rule": "Attiva regola", "Disable rule": "Disattiva regola", - "Progress Read": "Progresso di lettura" + "Progress Read": "Progresso di lettura", + "Auto-import new books from this folder": "Importa automaticamente i nuovi libri da questa cartella", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando vengono aggiunti nuovi libri a questa cartella, verranno importati automaticamente alla prossima apertura di Readest o al suo ritorno in primo piano.", + "Reading aloud": "Lettura ad alta voce", + "Open Book": "Apri libro", + "Stop reading aloud": "Interrompi la lettura ad alta voce", + "Enter at least two words": "Inserisci almeno due parole", + "Search failed": "Ricerca non riuscita", + "Search with regex": "Cerca con regex", + "Words to find near each other": "Parole da trovare vicine tra loro", + "Contains": "Contiene", + "Whole Words": "Parole intere", + "Regular Expression": "Espressione regolare", + "Nearby Words": "Parole vicine", + "Within N words": "Entro N parole", + "Not for regex": "Non disponibile con regex", + "No results found": "Nessun risultato trovato", + "{{count}} results_one": "{{count}} risultato", + "{{count}} results_many": "{{count}} di risultati", + "{{count}} results_other": "{{count}} risultati", + "Failed to seek": "Impossibile cambiare posizione", + "Chapter progress": "Progresso capitolo", + "{{elapsed}} of {{total}}": "{{elapsed}} di {{total}}", + "Decrease Contrast": "Diminuisci contrasto", + "Reset Contrast": "Reimposta contrasto", + "Increase Contrast": "Aumenta contrasto", + "Google Drive session expired. Reconnect in Settings.": "Sessione Google Drive scaduta. Riconnetti dalle Impostazioni.", + "Cloud sync session expired. Reconnect in Settings.": "Sessione di sincronizzazione cloud scaduta. Riconnetti dalle Impostazioni.", + "Push": "Spinta", + "Slide": "Scivolamento", + "Page Curl": "Curvatura pagina", + "Animation Style": "Stile animazione", + "Appearance": "Aspetto", + "Sets the text size of dictionary results, independent of the reading view.": "Imposta la dimensione del testo dei risultati del dizionario, indipendente dalla vista di lettura.", + "Authentication failed. Reconnect in Settings.": "Autenticazione non riuscita. Riconnetti dalle Impostazioni.", + "Full Sync": "Sincronizzazione completa", + "Re-check every book instead of only changed ones.": "Ricontrolla tutti i libri, non solo quelli modificati.", + "Waiting for sign-in…": "In attesa dell'accesso…", + "Reconnect": "Riconnetti", + "Connected as {{account}}": "Collegato come {{account}}", + ". Make Google Drive the active cloud provider.": ". Imposta Google Drive come provider cloud attivo.", + "Use Google Drive": "Usa Google Drive", + "Sign-in opens in your browser.": "L'accesso si apre nel browser.", + "Readest only accesses the files it creates in your Drive.": "Readest accede solo ai file che crea nel tuo Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con un server WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sincronizza la tua biblioteca, il progresso di lettura e le evidenziazioni con il tuo Google Drive.", + "Configured": "Configurato", + "Third-party Cloud Sync": "Sincronizzazione cloud di terze parti", + "Use WebDAV": "Usa WebDAV", + "Cloud Sync": "Sincronizzazione cloud", + "Available on Plus, Pro, or Lifetime": "Disponibile con Plus, Pro o a Vita", + "Extra Large": "Molto grande", + "Hint size": "Dimensione del suggerimento", + "Gloss text size above the word": "Dimensione del testo del suggerimento sopra la parola", + "Hint color": "Colore del suggerimento", + "Adjust Text Selection": "Regola la selezione del testo", + "Your books will appear here": "I tuoi libri appariranno qui", + "Reading aloud continues in the background": "La lettura ad alta voce continua in background", + "Stopped reading aloud": "Lettura ad alta voce interrotta", + "Read aloud stopped": "Lettura ad alta voce interrotta" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 1a00cc16..ebcf32c0 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -1780,5 +1780,63 @@ "Find:": "検索:", "Enable rule": "ルールを有効化", "Disable rule": "ルールを無効化", - "Progress Read": "読書進捗" + "Progress Read": "読書進捗", + "Auto-import new books from this folder": "このフォルダから新しい本を自動インポート", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "このフォルダに新しい本が追加されると、次回 Readest を開いたときやフォアグラウンドに戻ったときに自動的にインポートします。", + "Reading aloud": "読み上げ中", + "Open Book": "本を開く", + "Stop reading aloud": "読み上げを停止", + "Enter at least two words": "単語を 2 つ以上入力してください", + "Search failed": "検索に失敗しました", + "Search with regex": "正規表現で検索", + "Words to find near each other": "互いに近くにある単語", + "Contains": "含む", + "Whole Words": "単語全体", + "Regular Expression": "正規表現", + "Nearby Words": "近接単語", + "Within N words": "N 語以内", + "Not for regex": "正規表現では無効", + "No results found": "結果が見つかりませんでした", + "{{count}} results_other": "{{count}} 件の結果", + "Failed to seek": "シークに失敗しました", + "Chapter progress": "章の進捗", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "コントラストを下げる", + "Reset Contrast": "コントラストをリセット", + "Increase Contrast": "コントラストを上げる", + "Google Drive session expired. Reconnect in Settings.": "Google Drive のセッションが期限切れです。設定で再接続してください。", + "Cloud sync session expired. Reconnect in Settings.": "クラウド同期のセッションが期限切れです。設定で再接続してください。", + "Push": "プッシュ", + "Slide": "スライド", + "Page Curl": "ページカール", + "Animation Style": "アニメーションスタイル", + "Appearance": "外観", + "Sets the text size of dictionary results, independent of the reading view.": "辞書の検索結果の文字サイズを、読書画面とは独立して設定します。", + "Authentication failed. Reconnect in Settings.": "認証に失敗しました。設定で再接続してください。", + "Full Sync": "完全同期", + "Re-check every book instead of only changed ones.": "変更のあった本だけでなく、すべての本を再チェックします。", + "Waiting for sign-in…": "サインインを待っています…", + "Reconnect": "再接続", + "Connected as {{account}}": "{{account}} として接続済み", + ". Make Google Drive the active cloud provider.": "。Google Drive を使用するクラウドプロバイダーに設定します。", + "Use Google Drive": "Google Drive を使用", + "Sign-in opens in your browser.": "サインインはブラウザで開きます。", + "Readest only accesses the files it creates in your Drive.": "Readest がアクセスするのは、Drive 内に自身が作成したファイルのみです。", + "Sync your library, reading progress, and highlights with a WebDAV server.": "ライブラリ、読書進捗、ハイライトを WebDAV サーバーと同期します。", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "ライブラリ、読書進捗、ハイライトを Google Drive と同期します。", + "Configured": "設定済み", + "Third-party Cloud Sync": "サードパーティのクラウド同期", + "Use WebDAV": "WebDAV を使用", + "Cloud Sync": "クラウド同期", + "Available on Plus, Pro, or Lifetime": "Plus、Pro、Lifetime プランで利用可能", + "Extra Large": "特大", + "Hint size": "ヒントのサイズ", + "Gloss text size above the word": "単語の上に表示される注釈の文字サイズ", + "Hint color": "ヒントの色", + "Adjust Text Selection": "テキスト選択を調整", + "Your books will appear here": "ここに本が表示されます", + "Reading aloud continues in the background": "読み上げはバックグラウンドで継続します", + "Stopped reading aloud": "読み上げを停止しました", + "Read aloud stopped": "読み上げが停止しました" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index d0cc54ad..8944529c 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -1780,5 +1780,63 @@ "Find:": "찾기:", "Enable rule": "규칙 활성화", "Disable rule": "규칙 비활성화", - "Progress Read": "읽기 진행 상황" + "Progress Read": "읽기 진행 상황", + "Auto-import new books from this folder": "이 폴더에서 새 책 자동 가져오기", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "이 폴더에 새 책이 추가되면 다음에 Readest를 열거나 포그라운드로 돌아올 때 자동으로 가져옵니다.", + "Reading aloud": "음성 읽기 중", + "Open Book": "책 열기", + "Stop reading aloud": "음성 읽기 중지", + "Enter at least two words": "단어를 두 개 이상 입력하세요", + "Search failed": "검색에 실패했습니다", + "Search with regex": "정규식으로 검색", + "Words to find near each other": "서로 가까이에서 찾을 단어", + "Contains": "포함", + "Whole Words": "전체 단어", + "Regular Expression": "정규 표현식", + "Nearby Words": "인접 단어", + "Within N words": "N 단어 이내", + "Not for regex": "정규식에는 적용되지 않음", + "No results found": "결과를 찾을 수 없습니다", + "{{count}} results_other": "{{count}}개의 결과", + "Failed to seek": "탐색에 실패했습니다", + "Chapter progress": "챕터 진행률", + "{{elapsed}} of {{total}}": "{{total}} 중 {{elapsed}}", + "Decrease Contrast": "대비 낮추기", + "Reset Contrast": "대비 재설정", + "Increase Contrast": "대비 높이기", + "Google Drive session expired. Reconnect in Settings.": "Google Drive 세션이 만료되었습니다. 설정에서 다시 연결하세요.", + "Cloud sync session expired. Reconnect in Settings.": "클라우드 동기화 세션이 만료되었습니다. 설정에서 다시 연결하세요.", + "Push": "밀기", + "Slide": "슬라이드", + "Page Curl": "책장 넘김", + "Animation Style": "애니메이션 스타일", + "Appearance": "모양", + "Sets the text size of dictionary results, independent of the reading view.": "읽기 화면과 별개로 사전 결과의 텍스트 크기를 설정합니다.", + "Authentication failed. Reconnect in Settings.": "인증에 실패했습니다. 설정에서 다시 연결하세요.", + "Full Sync": "전체 동기화", + "Re-check every book instead of only changed ones.": "변경된 책만이 아니라 모든 책을 다시 확인합니다.", + "Waiting for sign-in…": "로그인을 기다리는 중…", + "Reconnect": "다시 연결", + "Connected as {{account}}": "{{account}}(으)로 연결됨", + ". Make Google Drive the active cloud provider.": ". Google Drive를 사용할 클라우드 제공업체로 설정합니다.", + "Use Google Drive": "Google Drive 사용", + "Sign-in opens in your browser.": "로그인은 브라우저에서 열립니다.", + "Readest only accesses the files it creates in your Drive.": "Readest는 Drive에서 직접 만든 파일에만 접근합니다.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "라이브러리, 읽기 진행 상황, 하이라이트를 WebDAV 서버와 동기화합니다.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "라이브러리, 읽기 진행 상황, 하이라이트를 Google Drive와 동기화합니다.", + "Configured": "설정됨", + "Third-party Cloud Sync": "타사 클라우드 동기화", + "Use WebDAV": "WebDAV 사용", + "Cloud Sync": "클라우드 동기화", + "Available on Plus, Pro, or Lifetime": "Plus, Pro, Lifetime 요금제에서 사용 가능", + "Extra Large": "매우 큼", + "Hint size": "힌트 크기", + "Gloss text size above the word": "단어 위에 표시되는 주석 텍스트 크기", + "Hint color": "힌트 색상", + "Adjust Text Selection": "텍스트 선택 조정", + "Your books will appear here": "책이 여기에 표시됩니다", + "Reading aloud continues in the background": "백그라운드에서 음성 읽기가 계속됩니다", + "Stopped reading aloud": "음성 읽기를 중지했습니다", + "Read aloud stopped": "음성 읽기가 중지되었습니다" } diff --git a/apps/readest-app/public/locales/ms/translation.json b/apps/readest-app/public/locales/ms/translation.json index 43150876..572f244c 100644 --- a/apps/readest-app/public/locales/ms/translation.json +++ b/apps/readest-app/public/locales/ms/translation.json @@ -1780,5 +1780,63 @@ "Find:": "Cari:", "Enable rule": "Dayakan peraturan", "Disable rule": "Nyahdayakan peraturan", - "Progress Read": "Kemajuan Membaca" + "Progress Read": "Kemajuan Membaca", + "Auto-import new books from this folder": "Auto-import buku baharu dari folder ini", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Apabila buku baharu ditambahkan ke folder ini, buku tersebut akan diimport secara automatik pada kali berikutnya Readest dibuka atau kembali ke latar depan.", + "Reading aloud": "Sedang membaca dengan kuat", + "Open Book": "Buka Buku", + "Stop reading aloud": "Hentikan bacaan kuat", + "Enter at least two words": "Masukkan sekurang-kurangnya dua perkataan", + "Search failed": "Carian gagal", + "Search with regex": "Cari dengan regex", + "Words to find near each other": "Perkataan yang dicari berdekatan antara satu sama lain", + "Contains": "Mengandungi", + "Whole Words": "Seluruh Perkataan", + "Regular Expression": "Ungkapan Biasa", + "Nearby Words": "Perkataan Berdekatan", + "Within N words": "Dalam lingkungan N perkataan", + "Not for regex": "Tidak untuk regex", + "No results found": "Tiada hasil dijumpai", + "{{count}} results_other": "{{count}} hasil", + "Failed to seek": "Gagal mengubah kedudukan main", + "Chapter progress": "Kemajuan bab", + "{{elapsed}} of {{total}}": "{{elapsed}} daripada {{total}}", + "Decrease Contrast": "Kurangkan Kontras", + "Reset Contrast": "Tetapkan Semula Kontras", + "Increase Contrast": "Tingkatkan Kontras", + "Google Drive session expired. Reconnect in Settings.": "Sesi Google Drive telah tamat tempoh. Sambung semula di Tetapan.", + "Cloud sync session expired. Reconnect in Settings.": "Sesi segerak awan telah tamat tempoh. Sambung semula di Tetapan.", + "Push": "Tolak", + "Slide": "Luncur", + "Page Curl": "Lengkung Halaman", + "Animation Style": "Gaya Animasi", + "Appearance": "Penampilan", + "Sets the text size of dictionary results, independent of the reading view.": "Menetapkan saiz teks hasil kamus, tidak bergantung pada paparan bacaan.", + "Authentication failed. Reconnect in Settings.": "Pengesahan gagal. Sambung semula di Tetapan.", + "Full Sync": "Segerak Penuh", + "Re-check every book instead of only changed ones.": "Semak semula setiap buku dan bukan hanya yang berubah.", + "Waiting for sign-in…": "Menunggu log masuk…", + "Reconnect": "Sambung Semula", + "Connected as {{account}}": "Disambungkan sebagai {{account}}", + ". Make Google Drive the active cloud provider.": ". Jadikan Google Drive sebagai penyedia awan yang aktif.", + "Use Google Drive": "Guna Google Drive", + "Sign-in opens in your browser.": "Log masuk akan dibuka dalam pelayar anda.", + "Readest only accesses the files it creates in your Drive.": "Readest hanya mengakses fail yang diciptanya dalam Drive anda.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan pelayan WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Segerakkan perpustakaan, kemajuan bacaan dan penonjolan anda dengan Google Drive anda.", + "Configured": "Telah dikonfigurasi", + "Third-party Cloud Sync": "Segerak Awan Pihak Ketiga", + "Use WebDAV": "Guna WebDAV", + "Cloud Sync": "Segerak Awan", + "Available on Plus, Pro, or Lifetime": "Tersedia pada pelan Plus, Pro atau Seumur Hidup", + "Extra Large": "Sangat Besar", + "Hint size": "Saiz petunjuk", + "Gloss text size above the word": "Saiz teks keterangan di atas perkataan", + "Hint color": "Warna petunjuk", + "Adjust Text Selection": "Laraskan Pilihan Teks", + "Your books will appear here": "Buku anda akan dipaparkan di sini", + "Reading aloud continues in the background": "Bacaan kuat diteruskan di latar belakang", + "Stopped reading aloud": "Berhenti membaca dengan kuat", + "Read aloud stopped": "Bacaan kuat dihentikan" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 60f5566b..464564a2 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Zoeken:", "Enable rule": "Regel inschakelen", "Disable rule": "Regel uitschakelen", - "Progress Read": "Leesvoortgang" + "Progress Read": "Leesvoortgang", + "Auto-import new books from this folder": "Nieuwe boeken uit deze map automatisch importeren", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Wanneer nieuwe boeken aan deze map worden toegevoegd, worden ze automatisch geïmporteerd zodra Readest de volgende keer wordt geopend of weer op de voorgrond komt.", + "Reading aloud": "Bezig met voorlezen", + "Open Book": "Boek openen", + "Stop reading aloud": "Voorlezen stoppen", + "Enter at least two words": "Voer minstens twee woorden in", + "Search failed": "Zoeken mislukt", + "Search with regex": "Zoeken met regex", + "Words to find near each other": "Woorden die dicht bij elkaar moeten staan", + "Contains": "Bevat", + "Whole Words": "Hele woorden", + "Regular Expression": "Reguliere expressie", + "Nearby Words": "Nabije woorden", + "Within N words": "Binnen N woorden", + "Not for regex": "Niet voor regex", + "No results found": "Geen resultaten gevonden", + "{{count}} results_one": "{{count}} resultaat", + "{{count}} results_other": "{{count}} resultaten", + "Failed to seek": "Doorspoelen mislukt", + "Chapter progress": "Hoofdstukvoortgang", + "{{elapsed}} of {{total}}": "{{elapsed}} van {{total}}", + "Decrease Contrast": "Contrast verlagen", + "Reset Contrast": "Contrast resetten", + "Increase Contrast": "Contrast verhogen", + "Google Drive session expired. Reconnect in Settings.": "Google Drive-sessie verlopen. Verbind opnieuw via Instellingen.", + "Cloud sync session expired. Reconnect in Settings.": "Cloudsynchronisatie-sessie verlopen. Verbind opnieuw via Instellingen.", + "Push": "Duwen", + "Slide": "Schuiven", + "Page Curl": "Omslaan", + "Animation Style": "Animatiestijl", + "Appearance": "Uiterlijk", + "Sets the text size of dictionary results, independent of the reading view.": "Stelt de tekstgrootte van woordenboekresultaten in, onafhankelijk van de leesweergave.", + "Authentication failed. Reconnect in Settings.": "Verificatie mislukt. Verbind opnieuw via Instellingen.", + "Full Sync": "Volledige synchronisatie", + "Re-check every book instead of only changed ones.": "Controleer elk boek opnieuw in plaats van alleen gewijzigde boeken.", + "Waiting for sign-in…": "Wachten op inloggen…", + "Reconnect": "Opnieuw verbinden", + "Connected as {{account}}": "Verbonden als {{account}}", + ". Make Google Drive the active cloud provider.": ". Maak Google Drive de actieve cloudprovider.", + "Use Google Drive": "Google Drive gebruiken", + "Sign-in opens in your browser.": "Inloggen opent in je browser.", + "Readest only accesses the files it creates in your Drive.": "Readest heeft alleen toegang tot de bestanden die het zelf in je Drive aanmaakt.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met een WebDAV-server.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Synchroniseer je bibliotheek, leesvoortgang en markeringen met je Google Drive.", + "Configured": "Geconfigureerd", + "Third-party Cloud Sync": "Cloudsynchronisatie van derden", + "Use WebDAV": "WebDAV gebruiken", + "Cloud Sync": "Cloudsynchronisatie", + "Available on Plus, Pro, or Lifetime": "Beschikbaar met Plus, Pro of Lifetime", + "Extra Large": "Extra groot", + "Hint size": "Hintgrootte", + "Gloss text size above the word": "Tekstgrootte van de hint boven het woord", + "Hint color": "Hintkleur", + "Adjust Text Selection": "Tekstselectie aanpassen", + "Your books will appear here": "Je boeken verschijnen hier", + "Reading aloud continues in the background": "Voorlezen gaat door op de achtergrond", + "Stopped reading aloud": "Voorlezen gestopt", + "Read aloud stopped": "Voorlezen is gestopt" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 607e9ba0..d4432a99 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -1879,5 +1879,66 @@ "Find:": "Znajdź:", "Enable rule": "Włącz regułę", "Disable rule": "Wyłącz regułę", - "Progress Read": "Postęp czytania" + "Progress Read": "Postęp czytania", + "Auto-import new books from this folder": "Automatycznie importuj nowe książki z tego folderu", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Gdy do tego folderu zostaną dodane nowe książki, zostaną one automatycznie zaimportowane przy następnym uruchomieniu Readest lub powrocie aplikacji na pierwszy plan.", + "Reading aloud": "Czytanie na głos", + "Open Book": "Otwórz książkę", + "Stop reading aloud": "Zatrzymaj czytanie na głos", + "Enter at least two words": "Wpisz co najmniej dwa słowa", + "Search failed": "Wyszukiwanie nie powiodło się", + "Search with regex": "Szukaj z użyciem wyrażenia regularnego", + "Words to find near each other": "Słowa do znalezienia blisko siebie", + "Contains": "Zawiera", + "Whole Words": "Całe słowa", + "Regular Expression": "Wyrażenie regularne", + "Nearby Words": "Słowa w pobliżu", + "Within N words": "W obrębie N słów", + "Not for regex": "Nie dotyczy wyrażeń regularnych", + "No results found": "Nie znaleziono wyników", + "{{count}} results_one": "{{count}} wynik", + "{{count}} results_few": "{{count}} wyniki", + "{{count}} results_many": "{{count}} wyników", + "{{count}} results_other": "{{count}} wyniku", + "Failed to seek": "Nie udało się przewinąć", + "Chapter progress": "Postęp rozdziału", + "{{elapsed}} of {{total}}": "{{elapsed}} z {{total}}", + "Decrease Contrast": "Zmniejsz kontrast", + "Reset Contrast": "Zresetuj kontrast", + "Increase Contrast": "Zwiększ kontrast", + "Google Drive session expired. Reconnect in Settings.": "Sesja Google Drive wygasła. Połącz ponownie w Ustawieniach.", + "Cloud sync session expired. Reconnect in Settings.": "Sesja synchronizacji w chmurze wygasła. Połącz ponownie w Ustawieniach.", + "Push": "Przesunięcie", + "Slide": "Nasunięcie", + "Page Curl": "Zawijanie strony", + "Animation Style": "Styl animacji", + "Appearance": "Wygląd", + "Sets the text size of dictionary results, independent of the reading view.": "Ustawia rozmiar tekstu wyników słownika, niezależnie od widoku czytania.", + "Authentication failed. Reconnect in Settings.": "Uwierzytelnianie nie powiodło się. Połącz ponownie w Ustawieniach.", + "Full Sync": "Pełna synchronizacja", + "Re-check every book instead of only changed ones.": "Sprawdzaj ponownie wszystkie książki, a nie tylko zmienione.", + "Waiting for sign-in…": "Oczekiwanie na zalogowanie…", + "Reconnect": "Połącz ponownie", + "Connected as {{account}}": "Połączono jako {{account}}", + ". Make Google Drive the active cloud provider.": ". Ustaw Google Drive jako aktywnego dostawcę chmury.", + "Use Google Drive": "Użyj Google Drive", + "Sign-in opens in your browser.": "Logowanie otworzy się w przeglądarce.", + "Readest only accesses the files it creates in your Drive.": "Readest ma dostęp tylko do plików, które sam tworzy na Twoim Dysku Google.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia z serwerem WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Synchronizuj bibliotekę, postęp czytania i zaznaczenia ze swoim Google Drive.", + "Configured": "Skonfigurowano", + "Third-party Cloud Sync": "Zewnętrzna synchronizacja w chmurze", + "Use WebDAV": "Użyj WebDAV", + "Cloud Sync": "Synchronizacja w chmurze", + "Available on Plus, Pro, or Lifetime": "Dostępne w planach Plus, Pro lub Lifetime", + "Extra Large": "Bardzo duży", + "Hint size": "Rozmiar podpowiedzi", + "Gloss text size above the word": "Rozmiar tekstu podpowiedzi nad słowem", + "Hint color": "Kolor podpowiedzi", + "Adjust Text Selection": "Dostosuj zaznaczenie tekstu", + "Your books will appear here": "Tutaj pojawią się Twoje książki", + "Reading aloud continues in the background": "Czytanie na głos jest kontynuowane w tle", + "Stopped reading aloud": "Zatrzymano czytanie na głos", + "Read aloud stopped": "Czytanie na głos zatrzymane" } diff --git a/apps/readest-app/public/locales/pt-BR/translation.json b/apps/readest-app/public/locales/pt-BR/translation.json index ab0ffd9f..2a6f01c0 100644 --- a/apps/readest-app/public/locales/pt-BR/translation.json +++ b/apps/readest-app/public/locales/pt-BR/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Localizar:", "Enable rule": "Ativar regra", "Disable rule": "Desativar regra", - "Progress Read": "Progresso de leitura" + "Progress Read": "Progresso de leitura", + "Auto-import new books from this folder": "Importar automaticamente os livros novos desta pasta", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando novos livros forem adicionados a esta pasta, eles serão importados automaticamente na próxima vez que o Readest abrir ou voltar ao primeiro plano.", + "Reading aloud": "Lendo em voz alta", + "Open Book": "Abrir livro", + "Stop reading aloud": "Parar a leitura em voz alta", + "Enter at least two words": "Digite pelo menos duas palavras", + "Search failed": "A pesquisa falhou", + "Search with regex": "Pesquisar com regex", + "Words to find near each other": "Palavras a serem encontradas próximas umas das outras", + "Contains": "Contém", + "Whole Words": "Palavras inteiras", + "Regular Expression": "Expressão regular", + "Nearby Words": "Palavras próximas", + "Within N words": "A menos de N palavras", + "Not for regex": "Não disponível com regex", + "No results found": "Nenhum resultado encontrado", + "{{count}} results_one": "{{count}} resultado", + "{{count}} results_many": "{{count}} de resultados", + "{{count}} results_other": "{{count}} resultados", + "Failed to seek": "Falha ao mudar de posição", + "Chapter progress": "Progresso do capítulo", + "{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}", + "Decrease Contrast": "Diminuir contraste", + "Reset Contrast": "Redefinir contraste", + "Increase Contrast": "Aumentar contraste", + "Google Drive session expired. Reconnect in Settings.": "A sessão do Google Drive expirou. Reconecte em Configurações.", + "Cloud sync session expired. Reconnect in Settings.": "A sessão de sincronização na nuvem expirou. Reconecte em Configurações.", + "Push": "Empurrar", + "Slide": "Deslizar", + "Page Curl": "Curvatura de página", + "Animation Style": "Estilo de animação", + "Appearance": "Aparência", + "Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da visualização de leitura.", + "Authentication failed. Reconnect in Settings.": "A autenticação falhou. Reconecte em Configurações.", + "Full Sync": "Sincronização completa", + "Re-check every book instead of only changed ones.": "Verifica novamente todos os livros, não apenas os alterados.", + "Waiting for sign-in…": "Aguardando login…", + "Reconnect": "Reconectar", + "Connected as {{account}}": "Conectado como {{account}}", + ". Make Google Drive the active cloud provider.": ". Torne o Google Drive o provedor de nuvem ativo.", + "Use Google Drive": "Usar o Google Drive", + "Sign-in opens in your browser.": "O login abre no seu navegador.", + "Readest only accesses the files it creates in your Drive.": "O Readest só acessa os arquivos que cria no seu Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronize sua biblioteca, progresso de leitura e destaques com um servidor WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sincronize sua biblioteca, progresso de leitura e destaques com o seu Google Drive.", + "Configured": "Configurado", + "Third-party Cloud Sync": "Sincronização na nuvem de terceiros", + "Use WebDAV": "Usar WebDAV", + "Cloud Sync": "Sincronização na nuvem", + "Available on Plus, Pro, or Lifetime": "Disponível com Plus, Pro ou Vitalício", + "Extra Large": "Extra grande", + "Hint size": "Tamanho da dica", + "Gloss text size above the word": "Tamanho do texto da dica sobre a palavra", + "Hint color": "Cor da dica", + "Adjust Text Selection": "Ajustar seleção de texto", + "Your books will appear here": "Seus livros aparecerão aqui", + "Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano", + "Stopped reading aloud": "Leitura em voz alta interrompida", + "Read aloud stopped": "Leitura em voz alta interrompida" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 416be33b..1da70c65 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Localizar:", "Enable rule": "Ativar regra", "Disable rule": "Desativar regra", - "Progress Read": "Progresso de Leitura" + "Progress Read": "Progresso de Leitura", + "Auto-import new books from this folder": "Importar automaticamente os livros novos desta pasta", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Quando forem adicionados livros novos a esta pasta, serão importados automaticamente na próxima vez que o Readest abrir ou voltar ao primeiro plano.", + "Reading aloud": "A ler em voz alta", + "Open Book": "Abrir Livro", + "Stop reading aloud": "Parar a leitura em voz alta", + "Enter at least two words": "Introduza pelo menos duas palavras", + "Search failed": "A pesquisa falhou", + "Search with regex": "Pesquisar com regex", + "Words to find near each other": "Palavras a encontrar próximas umas das outras", + "Contains": "Contém", + "Whole Words": "Palavras Inteiras", + "Regular Expression": "Expressão Regular", + "Nearby Words": "Palavras Próximas", + "Within N words": "A menos de N palavras", + "Not for regex": "Não disponível com regex", + "No results found": "Nenhum resultado encontrado", + "{{count}} results_one": "{{count}} resultado", + "{{count}} results_many": "{{count}} de resultados", + "{{count}} results_other": "{{count}} resultados", + "Failed to seek": "Falha ao mudar de posição", + "Chapter progress": "Progresso do capítulo", + "{{elapsed}} of {{total}}": "{{elapsed}} de {{total}}", + "Decrease Contrast": "Diminuir Contraste", + "Reset Contrast": "Redefinir Contraste", + "Increase Contrast": "Aumentar Contraste", + "Google Drive session expired. Reconnect in Settings.": "A sessão do Google Drive expirou. Ligue novamente em Definições.", + "Cloud sync session expired. Reconnect in Settings.": "A sessão de sincronização na nuvem expirou. Ligue novamente em Definições.", + "Push": "Empurrar", + "Slide": "Deslizar", + "Page Curl": "Curvatura da Página", + "Animation Style": "Estilo de Animação", + "Appearance": "Aparência", + "Sets the text size of dictionary results, independent of the reading view.": "Define o tamanho do texto dos resultados do dicionário, independente da vista de leitura.", + "Authentication failed. Reconnect in Settings.": "A autenticação falhou. Ligue novamente em Definições.", + "Full Sync": "Sincronização Completa", + "Re-check every book instead of only changed ones.": "Volta a verificar todos os livros, não apenas os alterados.", + "Waiting for sign-in…": "A aguardar o início de sessão…", + "Reconnect": "Ligar novamente", + "Connected as {{account}}": "Ligado como {{account}}", + ". Make Google Drive the active cloud provider.": ". Torne o Google Drive o fornecedor de nuvem ativo.", + "Use Google Drive": "Usar o Google Drive", + "Sign-in opens in your browser.": "O início de sessão abre no seu navegador.", + "Readest only accesses the files it creates in your Drive.": "O Readest só acede aos ficheiros que cria no seu Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com um servidor WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sincronize a sua biblioteca, o progresso de leitura e os destaques com o seu Google Drive.", + "Configured": "Configurado", + "Third-party Cloud Sync": "Sincronização na Nuvem de Terceiros", + "Use WebDAV": "Usar WebDAV", + "Cloud Sync": "Sincronização na Nuvem", + "Available on Plus, Pro, or Lifetime": "Disponível com Plus, Pro ou Vitalício", + "Extra Large": "Extra Grande", + "Hint size": "Tamanho da dica", + "Gloss text size above the word": "Tamanho do texto da dica sobre a palavra", + "Hint color": "Cor da dica", + "Adjust Text Selection": "Ajustar Seleção de Texto", + "Your books will appear here": "Os seus livros aparecerão aqui", + "Reading aloud continues in the background": "A leitura em voz alta continua em segundo plano", + "Stopped reading aloud": "Leitura em voz alta interrompida", + "Read aloud stopped": "Leitura em voz alta interrompida" } diff --git a/apps/readest-app/public/locales/ro/translation.json b/apps/readest-app/public/locales/ro/translation.json index a543abb8..3e85e980 100644 --- a/apps/readest-app/public/locales/ro/translation.json +++ b/apps/readest-app/public/locales/ro/translation.json @@ -1846,5 +1846,65 @@ "Find:": "Găsește:", "Enable rule": "Activează regula", "Disable rule": "Dezactivează regula", - "Progress Read": "Progresul citirii" + "Progress Read": "Progresul citirii", + "Auto-import new books from this folder": "Importă automat cărțile noi din acest folder", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Când se adaugă cărți noi în acest folder, acestea vor fi importate automat data viitoare când Readest se deschide sau revine în prim-plan.", + "Reading aloud": "Se citește cu voce tare", + "Open Book": "Deschide cartea", + "Stop reading aloud": "Oprește citirea cu voce tare", + "Enter at least two words": "Introduceți cel puțin două cuvinte", + "Search failed": "Căutarea a eșuat", + "Search with regex": "Căutați cu regex", + "Words to find near each other": "Cuvinte care apar aproape unele de altele", + "Contains": "Conține", + "Whole Words": "Cuvinte întregi", + "Regular Expression": "Expresie regulată", + "Nearby Words": "Cuvinte apropiate", + "Within N words": "La cel mult N cuvinte", + "Not for regex": "Indisponibil pentru regex", + "No results found": "Nu s-au găsit rezultate", + "{{count}} results_one": "{{count}} rezultat", + "{{count}} results_few": "{{count}} rezultate", + "{{count}} results_other": "{{count}} de rezultate", + "Failed to seek": "Derularea a eșuat", + "Chapter progress": "Progresul capitolului", + "{{elapsed}} of {{total}}": "{{elapsed}} din {{total}}", + "Decrease Contrast": "Micșorează contrastul", + "Reset Contrast": "Resetează contrastul", + "Increase Contrast": "Mărește contrastul", + "Google Drive session expired. Reconnect in Settings.": "Sesiunea Google Drive a expirat. Reconectează-te în Setări.", + "Cloud sync session expired. Reconnect in Settings.": "Sesiunea de sincronizare în cloud a expirat. Reconectează-te în Setări.", + "Push": "Împingere", + "Slide": "Glisare", + "Page Curl": "Răsfoire de pagină", + "Animation Style": "Stil de animație", + "Appearance": "Aspect", + "Sets the text size of dictionary results, independent of the reading view.": "Setează dimensiunea textului rezultatelor din dicționar, independent de vizualizarea de lectură.", + "Authentication failed. Reconnect in Settings.": "Autentificarea a eșuat. Reconectează-te în Setări.", + "Full Sync": "Sincronizare integrală", + "Re-check every book instead of only changed ones.": "Verifică din nou toate cărțile, nu doar pe cele modificate.", + "Waiting for sign-in…": "Se așteaptă conectarea…", + "Reconnect": "Reconectare", + "Connected as {{account}}": "Conectat ca {{account}}", + ". Make Google Drive the active cloud provider.": ". Setează Google Drive ca furnizor de cloud activ.", + "Use Google Drive": "Folosește Google Drive", + "Sign-in opens in your browser.": "Conectarea se deschide în browser.", + "Readest only accesses the files it creates in your Drive.": "Readest accesează doar fișierele pe care le creează în Drive-ul tău.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu un server WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sincronizează-ți biblioteca, progresul citirii și evidențierile cu Google Drive-ul tău.", + "Configured": "Configurat", + "Third-party Cloud Sync": "Sincronizare în cloud prin terți", + "Use WebDAV": "Folosește WebDAV", + "Cloud Sync": "Sincronizare în cloud", + "Available on Plus, Pro, or Lifetime": "Disponibil cu Plus, Pro sau Pe viață", + "Extra Large": "Foarte mare", + "Hint size": "Dimensiunea indiciului", + "Gloss text size above the word": "Dimensiunea textului afișat deasupra cuvântului", + "Hint color": "Culoarea indiciului", + "Adjust Text Selection": "Ajustează selecția de text", + "Your books will appear here": "Cărțile tale vor apărea aici", + "Reading aloud continues in the background": "Citirea cu voce tare continuă în fundal", + "Stopped reading aloud": "Citirea cu voce tare a fost oprită", + "Read aloud stopped": "Citirea cu voce tare a fost oprită" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 0087b9fe..441c9e26 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -1879,5 +1879,66 @@ "Find:": "Найти:", "Enable rule": "Включить правило", "Disable rule": "Отключить правило", - "Progress Read": "Прогресс чтения" + "Progress Read": "Прогресс чтения", + "Auto-import new books from this folder": "Автоматический импорт новых книг из этой папки", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Когда в эту папку добавляются новые книги, они будут автоматически импортированы при следующем запуске Readest или его возвращении на передний план.", + "Reading aloud": "Чтение вслух", + "Open Book": "Открыть книгу", + "Stop reading aloud": "Остановить чтение вслух", + "Enter at least two words": "Введите не менее двух слов", + "Search failed": "Не удалось выполнить поиск", + "Search with regex": "Поиск по регулярному выражению", + "Words to find near each other": "Слова, которые нужно найти рядом", + "Contains": "Содержит", + "Whole Words": "Целые слова", + "Regular Expression": "Регулярное выражение", + "Nearby Words": "Слова рядом", + "Within N words": "В пределах N слов", + "Not for regex": "Не для регулярных выражений", + "No results found": "Ничего не найдено", + "{{count}} results_one": "{{count}} результат", + "{{count}} results_few": "{{count}} результата", + "{{count}} results_many": "{{count}} результатов", + "{{count}} results_other": "{{count}} результата", + "Failed to seek": "Не удалось перемотать", + "Chapter progress": "Прогресс главы", + "{{elapsed}} of {{total}}": "{{elapsed}} из {{total}}", + "Decrease Contrast": "Уменьшить контраст", + "Reset Contrast": "Сбросить контраст", + "Increase Contrast": "Увеличить контраст", + "Google Drive session expired. Reconnect in Settings.": "Сессия Google Drive истекла. Переподключитесь в настройках.", + "Cloud sync session expired. Reconnect in Settings.": "Сессия облачной синхронизации истекла. Переподключитесь в настройках.", + "Push": "Сдвиг", + "Slide": "Скольжение", + "Page Curl": "Загиб страницы", + "Animation Style": "Стиль анимации", + "Appearance": "Внешний вид", + "Sets the text size of dictionary results, independent of the reading view.": "Задаёт размер текста результатов словаря независимо от области чтения.", + "Authentication failed. Reconnect in Settings.": "Ошибка аутентификации. Переподключитесь в настройках.", + "Full Sync": "Полная синхронизация", + "Re-check every book instead of only changed ones.": "Проверять все книги, а не только изменённые.", + "Waiting for sign-in…": "Ожидание входа…", + "Reconnect": "Переподключиться", + "Connected as {{account}}": "Подключено как {{account}}", + ". Make Google Drive the active cloud provider.": ". Сделать Google Drive активным облачным провайдером.", + "Use Google Drive": "Использовать Google Drive", + "Sign-in opens in your browser.": "Вход откроется в вашем браузере.", + "Readest only accesses the files it creates in your Drive.": "Readest получает доступ только к тем файлам, которые сам создаёт на вашем Google Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с сервером WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Синхронизируйте свою библиотеку, прогресс чтения и выделения с вашим Google Drive.", + "Configured": "Настроено", + "Third-party Cloud Sync": "Сторонняя облачная синхронизация", + "Use WebDAV": "Использовать WebDAV", + "Cloud Sync": "Облачная синхронизация", + "Available on Plus, Pro, or Lifetime": "Доступно в тарифах Plus, Pro или Lifetime", + "Extra Large": "Очень большой", + "Hint size": "Размер подсказки", + "Gloss text size above the word": "Размер текста подсказки над словом", + "Hint color": "Цвет подсказки", + "Adjust Text Selection": "Настройка выделения текста", + "Your books will appear here": "Здесь появятся ваши книги", + "Reading aloud continues in the background": "Чтение вслух продолжается в фоновом режиме", + "Stopped reading aloud": "Чтение вслух остановлено", + "Read aloud stopped": "Озвучивание остановлено" } diff --git a/apps/readest-app/public/locales/si/translation.json b/apps/readest-app/public/locales/si/translation.json index 245dc4c2..b5f00a6a 100644 --- a/apps/readest-app/public/locales/si/translation.json +++ b/apps/readest-app/public/locales/si/translation.json @@ -1813,5 +1813,64 @@ "Find:": "සොයන්න:", "Enable rule": "නියමය සක්‍රීය කරන්න", "Disable rule": "නියමය අක්‍රීය කරන්න", - "Progress Read": "කියවීමේ ප්‍රගතිය" + "Progress Read": "කියවීමේ ප්‍රගතිය", + "Auto-import new books from this folder": "මෙම ෆෝල්ඩරයෙන් නව පොත් ස්වයංක්‍රීයව ආයාත කරන්න", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "මෙම ෆෝල්ඩරයට නව පොත් එකතු වූ විට, ඊළඟ වතාවේ Readest විවෘත වන විට හෝ ඉදිරිපසට නැවත පැමිණෙන විට ඒවා ස්වයංක්‍රීයව ආයාත කෙරේ.", + "Reading aloud": "පවසා කියවමින්", + "Open Book": "පොත විවෘත කරන්න", + "Stop reading aloud": "පවසා කියවීම නවත්වන්න", + "Enter at least two words": "අවම වශයෙන් වචන දෙකක් ඇතුළත් කරන්න", + "Search failed": "සෙවීම අසාර්ථක විය", + "Search with regex": "regex සමඟ සොයන්න", + "Words to find near each other": "එකිනෙකට ආසන්නව සෙවීමට වචන", + "Contains": "අඩංගු වේ", + "Whole Words": "සම්පූර්ණ වචන", + "Regular Expression": "Regular Expression", + "Nearby Words": "ආසන්න වචන", + "Within N words": "වචන N ක් තුළ", + "Not for regex": "regex සඳහා නොවේ", + "No results found": "ප්‍රතිඵල හමු නොවීය", + "{{count}} results_one": "ප්‍රතිඵල {{count}}ක්", + "{{count}} results_other": "ප්‍රතිඵල {{count}}ක්", + "Failed to seek": "ස්ථානය වෙනස් කිරීමට නොහැකි විය", + "Chapter progress": "පරිච්ඡේද ප්‍රගතිය", + "{{elapsed}} of {{total}}": "{{total}} න් {{elapsed}}", + "Decrease Contrast": "පරස්පරය අඩු කරන්න", + "Reset Contrast": "පරස්පරය යළි සකසන්න", + "Increase Contrast": "පරස්පරය වැඩි කරන්න", + "Google Drive session expired. Reconnect in Settings.": "Google Drive සැසිය කල් ඉකුත් වී ඇත. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.", + "Cloud sync session expired. Reconnect in Settings.": "Cloud සමමුහුර්ත සැසිය කල් ඉකුත් වී ඇත. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.", + "Push": "තල්ලුව", + "Slide": "ලිස්සීම", + "Page Curl": "පිටු නැමීම", + "Animation Style": "සජීවිකරණ විලාසය", + "Appearance": "පෙනුම", + "Sets the text size of dictionary results, independent of the reading view.": "කියවීමේ දසුනෙන් ස්වාධීනව ශබ්දකෝෂ ප්‍රතිඵලවල අකුරු ප්‍රමාණය සකසයි.", + "Authentication failed. Reconnect in Settings.": "සත්‍යාපනය අසාර්ථක විය. සැකසුම් තුළ නැවත සම්බන්ධ වන්න.", + "Full Sync": "සම්පූර්ණ සමමුහුර්තය", + "Re-check every book instead of only changed ones.": "වෙනස් වූ පොත් පමණක් නොව සෑම පොතක්ම නැවත පරීක්ෂා කරන්න.", + "Waiting for sign-in…": "ඇතුල් වීම සඳහා රැඳී සිටිමින්…", + "Reconnect": "නැවත සම්බන්ධ වන්න", + "Connected as {{account}}": "{{account}} ලෙස සම්බන්ධ වී ඇත", + ". Make Google Drive the active cloud provider.": ". Google Drive සක්‍රිය cloud සපයන්නා ලෙස සකසන්න.", + "Use Google Drive": "Google Drive භාවිතා කරන්න", + "Sign-in opens in your browser.": "ඇතුල් වීම ඔබේ බ්‍රව්සරයේ විවෘත වේ.", + "Readest only accesses the files it creates in your Drive.": "Readest ප්‍රවේශ වන්නේ ඔබේ Drive හි එය සාදන ගොනුවලට පමණි.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "ඔබේ පුස්තකාලය, කියවීමේ ප්‍රගතිය සහ ඉස්මතු කිරීම් WebDAV සේවාදායකයක් සමඟ සමමුහුර්ත කරන්න.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "ඔබේ පුස්තකාලය, කියවීමේ ප්‍රගතිය සහ ඉස්මතු කිරීම් ඔබේ Google Drive සමඟ සමමුහුර්ත කරන්න.", + "Configured": "වින්‍යාස කර ඇත", + "Third-party Cloud Sync": "තෙවන පාර්ශ්ව cloud සමමුහුර්තය", + "Use WebDAV": "WebDAV භාවිතා කරන්න", + "Cloud Sync": "Cloud සමමුහුර්තය", + "Available on Plus, Pro, or Lifetime": "Plus, Pro හෝ Lifetime හි ලබා ගත හැක", + "Extra Large": "ඉතා විශාල", + "Hint size": "ඉඟි ප්‍රමාණය", + "Gloss text size above the word": "වචනයට ඉහළින් ඇති ඉඟි අකුරු ප්‍රමාණය", + "Hint color": "ඉඟි වර්ණය", + "Adjust Text Selection": "පෙළ තේරීම ගලපන්න", + "Your books will appear here": "ඔබේ පොත් මෙහි දිස්වනු ඇත", + "Reading aloud continues in the background": "පවසා කියවීම පසුබිමේ දිගටම සිදු වේ", + "Stopped reading aloud": "පවසා කියවීම නවත්වන ලදී", + "Read aloud stopped": "පවසා කියවීම නතර විය" } diff --git a/apps/readest-app/public/locales/sl/translation.json b/apps/readest-app/public/locales/sl/translation.json index 431e5367..aef0bc58 100644 --- a/apps/readest-app/public/locales/sl/translation.json +++ b/apps/readest-app/public/locales/sl/translation.json @@ -1879,5 +1879,66 @@ "Find:": "Najdi:", "Enable rule": "Omogoči pravilo", "Disable rule": "Onemogoči pravilo", - "Progress Read": "Napredek branja" + "Progress Read": "Napredek branja", + "Auto-import new books from this folder": "Samodejni uvoz novih knjig iz te mape", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Ko so v to mapo dodane nove knjige, bodo samodejno uvožene, ko se Readest naslednjič odpre ali vrne v ospredje.", + "Reading aloud": "Branje na glas", + "Open Book": "Odpri knjigo", + "Stop reading aloud": "Ustavi branje na glas", + "Enter at least two words": "Vnesite vsaj dve besedi", + "Search failed": "Iskanje ni uspelo", + "Search with regex": "Iskanje z regularnim izrazom", + "Words to find near each other": "Besede, ki naj bodo blizu skupaj", + "Contains": "Vsebuje", + "Whole Words": "Cele besede", + "Regular Expression": "Regularni izraz", + "Nearby Words": "Bližnje besede", + "Within N words": "Znotraj N besed", + "Not for regex": "Ne velja za regularne izraze", + "No results found": "Ni najdenih rezultatov", + "{{count}} results_one": "{{count}} rezultat", + "{{count}} results_two": "{{count}} rezultata", + "{{count}} results_few": "{{count}} rezultati", + "{{count}} results_other": "{{count}} rezultatov", + "Failed to seek": "Premik ni uspel", + "Chapter progress": "Napredek poglavja", + "{{elapsed}} of {{total}}": "{{elapsed}} od {{total}}", + "Decrease Contrast": "Zmanjšaj kontrast", + "Reset Contrast": "Ponastavi kontrast", + "Increase Contrast": "Povečaj kontrast", + "Google Drive session expired. Reconnect in Settings.": "Seja Google Drive je potekla. Znova se povežite v Nastavitvah.", + "Cloud sync session expired. Reconnect in Settings.": "Seja sinhronizacije v oblaku je potekla. Znova se povežite v Nastavitvah.", + "Push": "Potisk", + "Slide": "Drsenje", + "Page Curl": "Zvijanje strani", + "Animation Style": "Slog animacije", + "Appearance": "Videz", + "Sets the text size of dictionary results, independent of the reading view.": "Nastavi velikost besedila rezultatov slovarja, neodvisno od pogleda branja.", + "Authentication failed. Reconnect in Settings.": "Preverjanje pristnosti ni uspelo. Znova se povežite v Nastavitvah.", + "Full Sync": "Polna sinhronizacija", + "Re-check every book instead of only changed ones.": "Znova preveri vse knjige, ne le spremenjenih.", + "Waiting for sign-in…": "Čakanje na prijavo…", + "Reconnect": "Znova poveži", + "Connected as {{account}}": "Povezano kot {{account}}", + ". Make Google Drive the active cloud provider.": ". Nastavite Google Drive kot aktivnega ponudnika oblaka.", + "Use Google Drive": "Uporabi Google Drive", + "Sign-in opens in your browser.": "Prijava se odpre v vašem brskalniku.", + "Readest only accesses the files it creates in your Drive.": "Readest dostopa le do datotek, ki jih sam ustvari v vašem Google Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Sinhronizirajte knjižnico, napredek branja in označbe s strežnikom WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Sinhronizirajte knjižnico, napredek branja in označbe s svojim Google Drive.", + "Configured": "Nastavljeno", + "Third-party Cloud Sync": "Zunanja sinhronizacija v oblaku", + "Use WebDAV": "Uporabi WebDAV", + "Cloud Sync": "Sinhronizacija v oblaku", + "Available on Plus, Pro, or Lifetime": "Na voljo v paketih Plus, Pro ali Lifetime", + "Extra Large": "Zelo veliko", + "Hint size": "Velikost namiga", + "Gloss text size above the word": "Velikost besedila namiga nad besedo", + "Hint color": "Barva namiga", + "Adjust Text Selection": "Prilagodi izbiro besedila", + "Your books will appear here": "Tukaj se bodo prikazale vaše knjige", + "Reading aloud continues in the background": "Branje na glas se nadaljuje v ozadju", + "Stopped reading aloud": "Branje na glas ustavljeno", + "Read aloud stopped": "Branje na glas se je ustavilo" } diff --git a/apps/readest-app/public/locales/sv/translation.json b/apps/readest-app/public/locales/sv/translation.json index 06b26d21..ea82929b 100644 --- a/apps/readest-app/public/locales/sv/translation.json +++ b/apps/readest-app/public/locales/sv/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Sök:", "Enable rule": "Aktivera regel", "Disable rule": "Inaktivera regel", - "Progress Read": "Läsframsteg" + "Progress Read": "Läsframsteg", + "Auto-import new books from this folder": "Importera nya böcker från den här mappen automatiskt", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "När nya böcker läggs till i den här mappen importeras de automatiskt nästa gång Readest öppnas eller återgår till förgrunden.", + "Reading aloud": "Läser upp", + "Open Book": "Öppna bok", + "Stop reading aloud": "Sluta läsa upp", + "Enter at least two words": "Ange minst två ord", + "Search failed": "Sökningen misslyckades", + "Search with regex": "Sök med regex", + "Words to find near each other": "Ord som ska hittas nära varandra", + "Contains": "Innehåller", + "Whole Words": "Hela ord", + "Regular Expression": "Reguljärt uttryck", + "Nearby Words": "Närliggande ord", + "Within N words": "Inom N ord", + "Not for regex": "Inte för regex", + "No results found": "Inga resultat hittades", + "{{count}} results_one": "{{count}} resultat", + "{{count}} results_other": "{{count}} resultat", + "Failed to seek": "Kunde inte spola", + "Chapter progress": "Kapitelframsteg", + "{{elapsed}} of {{total}}": "{{elapsed}} av {{total}}", + "Decrease Contrast": "Minska kontrast", + "Reset Contrast": "Återställ kontrast", + "Increase Contrast": "Öka kontrast", + "Google Drive session expired. Reconnect in Settings.": "Google Drive-sessionen har gått ut. Anslut igen i Inställningar.", + "Cloud sync session expired. Reconnect in Settings.": "Molnsynksessionen har gått ut. Anslut igen i Inställningar.", + "Push": "Skjut", + "Slide": "Glid", + "Page Curl": "Bläddring", + "Animation Style": "Animationsstil", + "Appearance": "Utseende", + "Sets the text size of dictionary results, independent of the reading view.": "Ställer in textstorleken för ordboksresultat, oberoende av läsvyn.", + "Authentication failed. Reconnect in Settings.": "Autentiseringen misslyckades. Anslut igen i Inställningar.", + "Full Sync": "Fullständig synk", + "Re-check every book instead of only changed ones.": "Kontrollera alla böcker igen i stället för bara ändrade.", + "Waiting for sign-in…": "Väntar på inloggning…", + "Reconnect": "Anslut igen", + "Connected as {{account}}": "Ansluten som {{account}}", + ". Make Google Drive the active cloud provider.": ". Gör Google Drive till aktiv molnleverantör.", + "Use Google Drive": "Använd Google Drive", + "Sign-in opens in your browser.": "Inloggningen öppnas i din webbläsare.", + "Readest only accesses the files it creates in your Drive.": "Readest kommer bara åt de filer som appen skapar i din Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Synka ditt bibliotek, dina läsframsteg och markeringar med en WebDAV-server.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Synka ditt bibliotek, dina läsframsteg och markeringar med din Google Drive.", + "Configured": "Konfigurerad", + "Third-party Cloud Sync": "Tredjeparts molnsynk", + "Use WebDAV": "Använd WebDAV", + "Cloud Sync": "Molnsynk", + "Available on Plus, Pro, or Lifetime": "Tillgänglig med Plus, Pro eller Lifetime", + "Extra Large": "Extra stor", + "Hint size": "Hintstorlek", + "Gloss text size above the word": "Textstorlek för hinten ovanför ordet", + "Hint color": "Hintfärg", + "Adjust Text Selection": "Justera textmarkering", + "Your books will appear here": "Dina böcker visas här", + "Reading aloud continues in the background": "Uppläsningen fortsätter i bakgrunden", + "Stopped reading aloud": "Uppläsningen stoppades", + "Read aloud stopped": "Uppläsning stoppad" } diff --git a/apps/readest-app/public/locales/ta/translation.json b/apps/readest-app/public/locales/ta/translation.json index 53937138..176f5ec7 100644 --- a/apps/readest-app/public/locales/ta/translation.json +++ b/apps/readest-app/public/locales/ta/translation.json @@ -1813,5 +1813,64 @@ "Find:": "தேடு:", "Enable rule": "விதியை இயக்கு", "Disable rule": "விதியை முடக்கு", - "Progress Read": "வாசிப்பு முன்னேற்றம்" + "Progress Read": "வாசிப்பு முன்னேற்றம்", + "Auto-import new books from this folder": "இந்த கோப்புறையிலிருந்து புதிய புத்தகங்களை தானாக இறக்குமதி செய்யவும்", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "இந்த கோப்புறையில் புதிய புத்தகங்கள் சேர்க்கப்படும்போது, அடுத்த முறை Readest திறக்கும்போது அல்லது முன்னணிக்குத் திரும்பும்போது அவை தானாக இறக்குமதி செய்யப்படும்.", + "Reading aloud": "உரை வாசிக்கப்படுகிறது", + "Open Book": "புத்தகத்தைத் திற", + "Stop reading aloud": "உரை வாசிப்பை நிறுத்து", + "Enter at least two words": "குறைந்தது இரண்டு வார்த்தைகளை உள்ளிடவும்", + "Search failed": "தேடல் தோல்வியடைந்தது", + "Search with regex": "regex மூலம் தேடவும்", + "Words to find near each other": "ஒன்றுக்கொன்று அருகில் தேட வேண்டிய வார்த்தைகள்", + "Contains": "உள்ளடக்கியது", + "Whole Words": "முழு வார்த்தைகள்", + "Regular Expression": "Regular Expression", + "Nearby Words": "அருகிலுள்ள வார்த்தைகள்", + "Within N words": "N வார்த்தைகளுக்குள்", + "Not for regex": "regex க்கு பொருந்தாது", + "No results found": "முடிவுகள் எதுவும் கிடைக்கவில்லை", + "{{count}} results_one": "{{count}} முடிவு", + "{{count}} results_other": "{{count}} முடிவுகள்", + "Failed to seek": "நகர்த்த முடியவில்லை", + "Chapter progress": "அத்தியாய முன்னேற்றம்", + "{{elapsed}} of {{total}}": "{{total}} இல் {{elapsed}}", + "Decrease Contrast": "மாறுபாட்டைக் குறை", + "Reset Contrast": "மாறுபாட்டை மீட்டமை", + "Increase Contrast": "மாறுபாட்டை அதிகரி", + "Google Drive session expired. Reconnect in Settings.": "Google Drive அமர்வு காலாவதியானது. அமைப்புகளில் மீண்டும் இணைக்கவும்.", + "Cloud sync session expired. Reconnect in Settings.": "Cloud ஒத்திசைவு அமர்வு காலாவதியானது. அமைப்புகளில் மீண்டும் இணைக்கவும்.", + "Push": "தள்ளல்", + "Slide": "சறுக்கல்", + "Page Curl": "பக்கச் சுருட்டல்", + "Animation Style": "அனிமேஷன் பாணி", + "Appearance": "தோற்றம்", + "Sets the text size of dictionary results, independent of the reading view.": "வாசிப்புக் காட்சியைச் சாராமல், அகராதி முடிவுகளின் உரை அளவை அமைக்கிறது.", + "Authentication failed. Reconnect in Settings.": "அங்கீகாரம் தோல்வியடைந்தது. அமைப்புகளில் மீண்டும் இணைக்கவும்.", + "Full Sync": "முழு ஒத்திசைவு", + "Re-check every book instead of only changed ones.": "மாற்றப்பட்ட புத்தகங்களை மட்டும் அல்லாமல் ஒவ்வொரு புத்தகத்தையும் மீண்டும் சரிபார்க்கவும்.", + "Waiting for sign-in…": "உள்நுழைவுக்காகக் காத்திருக்கிறது…", + "Reconnect": "மீண்டும் இணைக்கவும்", + "Connected as {{account}}": "{{account}} ஆக இணைக்கப்பட்டுள்ளது", + ". Make Google Drive the active cloud provider.": ". Google Drive ஐ செயலில் உள்ள cloud வழங்குநராக அமைக்கவும்.", + "Use Google Drive": "Google Drive ஐப் பயன்படுத்தவும்", + "Sign-in opens in your browser.": "உள்நுழைவு உங்கள் உலாவியில் திறக்கும்.", + "Readest only accesses the files it creates in your Drive.": "Readest உங்கள் Drive இல் தானே உருவாக்கும் கோப்புகளை மட்டுமே அணுகும்.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை ஒரு WebDAV சேவையகத்துடன் ஒத்திசைக்கவும்.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "உங்கள் நூலகம், வாசிப்பு முன்னேற்றம் மற்றும் சிறப்பம்சங்களை உங்கள் Google Drive உடன் ஒத்திசைக்கவும்.", + "Configured": "கட்டமைக்கப்பட்டது", + "Third-party Cloud Sync": "மூன்றாம் தரப்பு cloud ஒத்திசைவு", + "Use WebDAV": "WebDAV ஐப் பயன்படுத்தவும்", + "Cloud Sync": "Cloud ஒத்திசைவு", + "Available on Plus, Pro, or Lifetime": "Plus, Pro அல்லது Lifetime இல் கிடைக்கும்", + "Extra Large": "மிகப் பெரிய", + "Hint size": "குறிப்பு அளவு", + "Gloss text size above the word": "வார்த்தைக்கு மேலே உள்ள குறிப்பு உரையின் அளவு", + "Hint color": "குறிப்பு நிறம்", + "Adjust Text Selection": "உரை தேர்வை சரிசெய்யவும்", + "Your books will appear here": "உங்கள் புத்தகங்கள் இங்கே தோன்றும்", + "Reading aloud continues in the background": "உரை வாசிப்பு பின்னணியில் தொடர்கிறது", + "Stopped reading aloud": "உரை வாசிப்பு நிறுத்தப்பட்டது", + "Read aloud stopped": "உரை வாசிப்பு நின்றது" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index fcbfc1e4..46bb4c08 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -1780,5 +1780,63 @@ "Find:": "ค้นหา:", "Enable rule": "เปิดใช้กฎ", "Disable rule": "ปิดใช้กฎ", - "Progress Read": "ความคืบหน้าในการอ่าน" + "Progress Read": "ความคืบหน้าในการอ่าน", + "Auto-import new books from this folder": "นำเข้าหนังสือใหม่จากโฟลเดอร์นี้โดยอัตโนมัติ", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "เมื่อมีหนังสือใหม่ถูกเพิ่มลงในโฟลเดอร์นี้ ระบบจะนำเข้าให้โดยอัตโนมัติเมื่อ Readest เปิดขึ้นหรือกลับมาทำงานในครั้งถัดไป", + "Reading aloud": "กำลังอ่านออกเสียง", + "Open Book": "เปิดหนังสือ", + "Stop reading aloud": "หยุดอ่านออกเสียง", + "Enter at least two words": "ป้อนอย่างน้อยสองคำ", + "Search failed": "การค้นหาล้มเหลว", + "Search with regex": "ค้นหาด้วยนิพจน์ปกติ", + "Words to find near each other": "คำที่ต้องการค้นหาให้อยู่ใกล้กัน", + "Contains": "ประกอบด้วย", + "Whole Words": "ทั้งคำ", + "Regular Expression": "นิพจน์ปกติ", + "Nearby Words": "คำที่อยู่ใกล้กัน", + "Within N words": "ภายใน N คำ", + "Not for regex": "ไม่ใช้กับนิพจน์ปกติ", + "No results found": "ไม่พบผลลัพธ์", + "{{count}} results_other": "ผลลัพธ์ {{count}} รายการ", + "Failed to seek": "ไม่สามารถเลื่อนตำแหน่งเล่นได้", + "Chapter progress": "ความคืบหน้าของบท", + "{{elapsed}} of {{total}}": "{{elapsed}} จาก {{total}}", + "Decrease Contrast": "ลดความคมชัด", + "Reset Contrast": "รีเซ็ตความคมชัด", + "Increase Contrast": "เพิ่มความคมชัด", + "Google Drive session expired. Reconnect in Settings.": "เซสชัน Google Drive หมดอายุ เชื่อมต่อใหม่ในการตั้งค่า", + "Cloud sync session expired. Reconnect in Settings.": "เซสชันซิงค์คลาวด์หมดอายุ เชื่อมต่อใหม่ในการตั้งค่า", + "Push": "ดัน", + "Slide": "สไลด์", + "Page Curl": "ม้วนกระดาษ", + "Animation Style": "รูปแบบภาพเคลื่อนไหว", + "Appearance": "รูปลักษณ์", + "Sets the text size of dictionary results, independent of the reading view.": "กำหนดขนาดตัวอักษรของผลลัพธ์พจนานุกรม โดยไม่ขึ้นกับมุมมองการอ่าน", + "Authentication failed. Reconnect in Settings.": "การยืนยันตัวตนล้มเหลว เชื่อมต่อใหม่ในการตั้งค่า", + "Full Sync": "ซิงค์แบบเต็ม", + "Re-check every book instead of only changed ones.": "ตรวจสอบหนังสือทุกเล่มอีกครั้งแทนที่จะตรวจเฉพาะเล่มที่เปลี่ยนแปลง", + "Waiting for sign-in…": "กำลังรอการเข้าสู่ระบบ…", + "Reconnect": "เชื่อมต่อใหม่", + "Connected as {{account}}": "เชื่อมต่อในชื่อ {{account}}", + ". Make Google Drive the active cloud provider.": ". ตั้งให้ Google Drive เป็นผู้ให้บริการคลาวด์ที่ใช้งานอยู่", + "Use Google Drive": "ใช้ Google Drive", + "Sign-in opens in your browser.": "การเข้าสู่ระบบจะเปิดในเบราว์เซอร์ของคุณ", + "Readest only accesses the files it creates in your Drive.": "Readest จะเข้าถึงเฉพาะไฟล์ที่สร้างขึ้นเองใน Drive ของคุณเท่านั้น", + "Sync your library, reading progress, and highlights with a WebDAV server.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับเซิร์ฟเวอร์ WebDAV", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "ซิงค์คลังหนังสือ ความคืบหน้าการอ่าน และไฮไลต์ของคุณกับ Google Drive ของคุณ", + "Configured": "กำหนดค่าแล้ว", + "Third-party Cloud Sync": "ซิงค์คลาวด์ของบุคคลที่สาม", + "Use WebDAV": "ใช้ WebDAV", + "Cloud Sync": "ซิงค์คลาวด์", + "Available on Plus, Pro, or Lifetime": "ใช้ได้ในแผน Plus, Pro หรือตลอดชีพ", + "Extra Large": "ใหญ่พิเศษ", + "Hint size": "ขนาดคำใบ้", + "Gloss text size above the word": "ขนาดข้อความคำใบ้ที่แสดงเหนือคำศัพท์", + "Hint color": "สีคำใบ้", + "Adjust Text Selection": "ปรับการเลือกข้อความ", + "Your books will appear here": "หนังสือของคุณจะแสดงที่นี่", + "Reading aloud continues in the background": "การอ่านออกเสียงดำเนินต่อในเบื้องหลัง", + "Stopped reading aloud": "หยุดอ่านออกเสียงแล้ว", + "Read aloud stopped": "การอ่านออกเสียงหยุดแล้ว" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 5cdf7e73..7ac9fdd4 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Bul:", "Enable rule": "Kuralı etkinleştir", "Disable rule": "Kuralı devre dışı bırak", - "Progress Read": "Okuma İlerlemesi" + "Progress Read": "Okuma İlerlemesi", + "Auto-import new books from this folder": "Bu klasördeki yeni kitapları otomatik olarak içe aktar", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Bu klasöre yeni kitaplar eklendiğinde, Readest bir sonraki açılışında veya ön plana döndüğünde bunları otomatik olarak içe aktarır.", + "Reading aloud": "Sesli okuma", + "Open Book": "Kitabı Aç", + "Stop reading aloud": "Sesli okumayı durdur", + "Enter at least two words": "En az iki kelime girin", + "Search failed": "Arama başarısız oldu", + "Search with regex": "Regex ile ara", + "Words to find near each other": "Birbirine yakın aranacak kelimeler", + "Contains": "İçerir", + "Whole Words": "Tam Kelimeler", + "Regular Expression": "Düzenli İfade", + "Nearby Words": "Yakın Kelimeler", + "Within N words": "N kelime içinde", + "Not for regex": "Regex için geçerli değil", + "No results found": "Sonuç bulunamadı", + "{{count}} results_one": "{{count}} sonuç", + "{{count}} results_other": "{{count}} sonuç", + "Failed to seek": "Atlama başarısız oldu", + "Chapter progress": "Bölüm ilerlemesi", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "Kontrastı Azalt", + "Reset Contrast": "Kontrastı Sıfırla", + "Increase Contrast": "Kontrastı Artır", + "Google Drive session expired. Reconnect in Settings.": "Google Drive oturumu sona erdi. Ayarlar'dan yeniden bağlanın.", + "Cloud sync session expired. Reconnect in Settings.": "Bulut senkronizasyonu oturumu sona erdi. Ayarlar'dan yeniden bağlanın.", + "Push": "İtme", + "Slide": "Kaydırma", + "Page Curl": "Sayfa Kıvırma", + "Animation Style": "Animasyon Stili", + "Appearance": "Görünüm", + "Sets the text size of dictionary results, independent of the reading view.": "Sözlük sonuçlarının metin boyutunu okuma görünümünden bağımsız olarak ayarlar.", + "Authentication failed. Reconnect in Settings.": "Kimlik doğrulama başarısız oldu. Ayarlar'dan yeniden bağlanın.", + "Full Sync": "Tam Senkronizasyon", + "Re-check every book instead of only changed ones.": "Yalnızca değişen kitapları değil, tüm kitapları yeniden kontrol eder.", + "Waiting for sign-in…": "Giriş bekleniyor…", + "Reconnect": "Yeniden Bağlan", + "Connected as {{account}}": "{{account}} olarak bağlanıldı", + ". Make Google Drive the active cloud provider.": ". Google Drive'ı etkin bulut sağlayıcısı yapın.", + "Use Google Drive": "Google Drive Kullan", + "Sign-in opens in your browser.": "Giriş tarayıcınızda açılır.", + "Readest only accesses the files it creates in your Drive.": "Readest yalnızca Drive'ınızda kendi oluşturduğu dosyalara erişir.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı bir WebDAV sunucusuyla senkronize edin.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Kütüphanenizi, okuma ilerlemenizi ve vurgularınızı Google Drive'ınızla senkronize edin.", + "Configured": "Yapılandırıldı", + "Third-party Cloud Sync": "Üçüncü Taraf Bulut Senkronizasyonu", + "Use WebDAV": "WebDAV Kullan", + "Cloud Sync": "Bulut Senkronizasyonu", + "Available on Plus, Pro, or Lifetime": "Plus, Pro veya Lifetime planlarında kullanılabilir", + "Extra Large": "Çok Büyük", + "Hint size": "İpucu boyutu", + "Gloss text size above the word": "Kelimenin üzerindeki açıklama metninin boyutu", + "Hint color": "İpucu rengi", + "Adjust Text Selection": "Metin Seçimini Ayarla", + "Your books will appear here": "Kitaplarınız burada görünecek", + "Reading aloud continues in the background": "Sesli okuma arka planda devam ediyor", + "Stopped reading aloud": "Sesli okuma durduruldu", + "Read aloud stopped": "Sesli okuma durdu" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 332e4523..1ed1c74e 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -1879,5 +1879,66 @@ "Find:": "Знайти:", "Enable rule": "Увімкнути правило", "Disable rule": "Вимкнути правило", - "Progress Read": "Проґрес читання" + "Progress Read": "Проґрес читання", + "Auto-import new books from this folder": "Автоматично імпортувати нові книги з цієї папки", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Коли до цієї папки додаються нові книги, вони будуть автоматично імпортовані під час наступного запуску Readest або його повернення на передній план.", + "Reading aloud": "Читання вголос", + "Open Book": "Відкрити книгу", + "Stop reading aloud": "Зупинити читання вголос", + "Enter at least two words": "Введіть щонайменше два слова", + "Search failed": "Не вдалося виконати пошук", + "Search with regex": "Пошук за регулярним виразом", + "Words to find near each other": "Слова, які потрібно знайти поруч", + "Contains": "Містить", + "Whole Words": "Цілі слова", + "Regular Expression": "Регулярний вираз", + "Nearby Words": "Слова поруч", + "Within N words": "У межах N слів", + "Not for regex": "Не для регулярних виразів", + "No results found": "Нічого не знайдено", + "{{count}} results_one": "{{count}} результат", + "{{count}} results_few": "{{count}} результати", + "{{count}} results_many": "{{count}} результатів", + "{{count}} results_other": "{{count}} результата", + "Failed to seek": "Не вдалося перемотати", + "Chapter progress": "Проґрес розділу", + "{{elapsed}} of {{total}}": "{{elapsed}} з {{total}}", + "Decrease Contrast": "Зменшити контраст", + "Reset Contrast": "Скинути контраст", + "Increase Contrast": "Збільшити контраст", + "Google Drive session expired. Reconnect in Settings.": "Сеанс Google Drive завершився. Повторно під'єднайтеся в налаштуваннях.", + "Cloud sync session expired. Reconnect in Settings.": "Сеанс хмарної синхронізації завершився. Повторно під'єднайтеся в налаштуваннях.", + "Push": "Зсув", + "Slide": "Ковзання", + "Page Curl": "Загин сторінки", + "Animation Style": "Стиль анімації", + "Appearance": "Зовнішній вигляд", + "Sets the text size of dictionary results, independent of the reading view.": "Визначає розмір тексту результатів словника незалежно від області читання.", + "Authentication failed. Reconnect in Settings.": "Помилка автентифікації. Повторно під'єднайтеся в налаштуваннях.", + "Full Sync": "Повна синхронізація", + "Re-check every book instead of only changed ones.": "Перевіряти всі книги, а не лише змінені.", + "Waiting for sign-in…": "Очікування входу…", + "Reconnect": "Під'єднатися повторно", + "Connected as {{account}}": "Під'єднано як {{account}}", + ". Make Google Drive the active cloud provider.": ". Зробити Google Drive активним хмарним провайдером.", + "Use Google Drive": "Використовувати Google Drive", + "Sign-in opens in your browser.": "Вхід відкриється у вашому браузері.", + "Readest only accesses the files it creates in your Drive.": "Readest має доступ лише до файлів, які сам створює у вашому Google Drive.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення із сервером WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Синхронізуйте свою бібліотеку, проґрес читання та виділення з вашим Google Drive.", + "Configured": "Налаштовано", + "Third-party Cloud Sync": "Стороння хмарна синхронізація", + "Use WebDAV": "Використовувати WebDAV", + "Cloud Sync": "Хмарна синхронізація", + "Available on Plus, Pro, or Lifetime": "Доступно в планах Plus, Pro або Lifetime", + "Extra Large": "Дуже великий", + "Hint size": "Розмір підказки", + "Gloss text size above the word": "Розмір тексту підказки над словом", + "Hint color": "Колір підказки", + "Adjust Text Selection": "Коригування виділення тексту", + "Your books will appear here": "Тут з'являться ваші книги", + "Reading aloud continues in the background": "Читання вголос триває у фоновому режимі", + "Stopped reading aloud": "Читання вголос зупинено", + "Read aloud stopped": "Озвучування зупинено" } diff --git a/apps/readest-app/public/locales/uz/translation.json b/apps/readest-app/public/locales/uz/translation.json index b0a39fe5..88e2d537 100644 --- a/apps/readest-app/public/locales/uz/translation.json +++ b/apps/readest-app/public/locales/uz/translation.json @@ -1813,5 +1813,64 @@ "Find:": "Topish:", "Enable rule": "Qoidani yoqish", "Disable rule": "Qoidani o‘chirish", - "Progress Read": "Oʻqish jarayoni" + "Progress Read": "Oʻqish jarayoni", + "Auto-import new books from this folder": "Bu papkadan yangi kitoblarni avtomatik import qilish", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Bu papkaga yangi kitoblar qoʻshilganda, Readest keyingi safar ochilganda yoki qayta faollashganda ular avtomatik import qilinadi.", + "Reading aloud": "Ovoz chiqarib oʻqilmoqda", + "Open Book": "Kitobni ochish", + "Stop reading aloud": "Ovoz chiqarib oʻqishni toʻxtatish", + "Enter at least two words": "Kamida ikkita soʻz kiriting", + "Search failed": "Qidirib boʻlmadi", + "Search with regex": "Regex bilan qidirish", + "Words to find near each other": "Bir-biriga yaqin qidiriladigan soʻzlar", + "Contains": "Oʻz ichiga oladi", + "Whole Words": "Butun soʻzlar", + "Regular Expression": "Regulyar ifoda", + "Nearby Words": "Yaqin soʻzlar", + "Within N words": "N soʻz ichida", + "Not for regex": "Regex uchun emas", + "No results found": "Natijalar topilmadi", + "{{count}} results_one": "{{count}} ta natija", + "{{count}} results_other": "{{count}} ta natija", + "Failed to seek": "Kerakli joyga oʻtib boʻlmadi", + "Chapter progress": "Bob jarayoni", + "{{elapsed}} of {{total}}": "{{total}} dan {{elapsed}}", + "Decrease Contrast": "Kontrastni kamaytirish", + "Reset Contrast": "Kontrastni tiklash", + "Increase Contrast": "Kontrastni oshirish", + "Google Drive session expired. Reconnect in Settings.": "Google Drive seansi muddati tugadi. Sozlamalardan qayta ulaning.", + "Cloud sync session expired. Reconnect in Settings.": "Bulutli sinxronlash seansi muddati tugadi. Sozlamalardan qayta ulaning.", + "Push": "Itarish", + "Slide": "Sirpanish", + "Page Curl": "Varaqlash", + "Animation Style": "Animatsiya uslubi", + "Appearance": "Koʻrinish", + "Sets the text size of dictionary results, independent of the reading view.": "Lugʻat natijalari matn oʻlchamini oʻqish koʻrinishidan mustaqil belgilaydi.", + "Authentication failed. Reconnect in Settings.": "Autentifikatsiya muvaffaqiyatsiz. Sozlamalardan qayta ulaning.", + "Full Sync": "Toʻliq sinxronlash", + "Re-check every book instead of only changed ones.": "Faqat oʻzgargan kitoblar emas, barcha kitoblarni qayta tekshirish.", + "Waiting for sign-in…": "Kirish kutilmoqda…", + "Reconnect": "Qayta ulanish", + "Connected as {{account}}": "{{account}} sifatida ulangan", + ". Make Google Drive the active cloud provider.": ". Google Drive-ni faol bulut provayderi qiling.", + "Use Google Drive": "Google Drive-dan foydalanish", + "Sign-in opens in your browser.": "Kirish brauzeringizda ochiladi.", + "Readest only accesses the files it creates in your Drive.": "Readest Drive-ingizda faqat oʻzi yaratgan fayllarga kiradi.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni WebDAV serveri bilan sinxronlang.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Kutubxonangiz, oʻqish jarayoni va belgilashlaringizni Google Drive bilan sinxronlang.", + "Configured": "Sozlangan", + "Third-party Cloud Sync": "Uchinchi tomon bulutli sinxronlash", + "Use WebDAV": "WebDAV-dan foydalanish", + "Cloud Sync": "Bulutli sinxronlash", + "Available on Plus, Pro, or Lifetime": "Plus, Pro yoki Umrbod rejalarida mavjud", + "Extra Large": "Juda katta", + "Hint size": "Izoh oʻlchami", + "Gloss text size above the word": "Soʻz ustida koʻrsatiladigan izoh matni oʻlchami", + "Hint color": "Izoh rangi", + "Adjust Text Selection": "Matn tanlovini sozlash", + "Your books will appear here": "Kitoblaringiz shu yerda paydo boʻladi", + "Reading aloud continues in the background": "Ovoz chiqarib oʻqish fonda davom etadi", + "Stopped reading aloud": "Ovoz chiqarib oʻqish toʻxtatildi", + "Read aloud stopped": "Ovoz chiqarib oʻqish toʻxtadi" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 9e18a780..f176a219 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -1780,5 +1780,63 @@ "Find:": "Tìm:", "Enable rule": "Bật quy tắc", "Disable rule": "Tắt quy tắc", - "Progress Read": "Tiến độ đọc" + "Progress Read": "Tiến độ đọc", + "Auto-import new books from this folder": "Tự động nhập sách mới từ thư mục này", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "Khi có sách mới được thêm vào thư mục này, chúng sẽ được nhập tự động vào lần tiếp theo Readest được mở hoặc quay lại nền trước.", + "Reading aloud": "Đang đọc to", + "Open Book": "Mở sách", + "Stop reading aloud": "Dừng đọc to", + "Enter at least two words": "Nhập ít nhất hai từ", + "Search failed": "Tìm kiếm thất bại", + "Search with regex": "Tìm kiếm bằng biểu thức chính quy", + "Words to find near each other": "Các từ cần tìm ở gần nhau", + "Contains": "Chứa", + "Whole Words": "Toàn bộ từ", + "Regular Expression": "Biểu thức chính quy", + "Nearby Words": "Từ gần nhau", + "Within N words": "Trong phạm vi N từ", + "Not for regex": "Không áp dụng cho biểu thức chính quy", + "No results found": "Không tìm thấy kết quả", + "{{count}} results_other": "{{count}} kết quả", + "Failed to seek": "Không thể tua", + "Chapter progress": "Tiến độ chương", + "{{elapsed}} of {{total}}": "{{elapsed}} trên {{total}}", + "Decrease Contrast": "Giảm tương phản", + "Reset Contrast": "Đặt lại tương phản", + "Increase Contrast": "Tăng tương phản", + "Google Drive session expired. Reconnect in Settings.": "Phiên Google Drive đã hết hạn. Kết nối lại trong Cài đặt.", + "Cloud sync session expired. Reconnect in Settings.": "Phiên đồng bộ đám mây đã hết hạn. Kết nối lại trong Cài đặt.", + "Push": "Đẩy", + "Slide": "Trượt", + "Page Curl": "Lật giấy", + "Animation Style": "Kiểu hiệu ứng động", + "Appearance": "Giao diện", + "Sets the text size of dictionary results, independent of the reading view.": "Đặt cỡ chữ của kết quả từ điển, không phụ thuộc vào chế độ xem đọc.", + "Authentication failed. Reconnect in Settings.": "Xác thực thất bại. Kết nối lại trong Cài đặt.", + "Full Sync": "Đồng bộ đầy đủ", + "Re-check every book instead of only changed ones.": "Kiểm tra lại mọi cuốn sách thay vì chỉ những cuốn đã thay đổi.", + "Waiting for sign-in…": "Đang chờ đăng nhập…", + "Reconnect": "Kết nối lại", + "Connected as {{account}}": "Đã kết nối với tư cách {{account}}", + ". Make Google Drive the active cloud provider.": ". Đặt Google Drive làm nhà cung cấp đám mây đang hoạt động.", + "Use Google Drive": "Dùng Google Drive", + "Sign-in opens in your browser.": "Đăng nhập sẽ mở trong trình duyệt của bạn.", + "Readest only accesses the files it creates in your Drive.": "Readest chỉ truy cập các tệp do chính nó tạo trong Drive của bạn.", + "Sync your library, reading progress, and highlights with a WebDAV server.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với máy chủ WebDAV.", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "Đồng bộ thư viện, tiến trình đọc và điểm nổi bật của bạn với Google Drive của bạn.", + "Configured": "Đã cấu hình", + "Third-party Cloud Sync": "Đồng bộ đám mây bên thứ ba", + "Use WebDAV": "Dùng WebDAV", + "Cloud Sync": "Đồng bộ đám mây", + "Available on Plus, Pro, or Lifetime": "Khả dụng với gói Plus, Pro hoặc Trọn đời", + "Extra Large": "Rất lớn", + "Hint size": "Cỡ gợi ý", + "Gloss text size above the word": "Cỡ chữ của chú giải phía trên từ", + "Hint color": "Màu gợi ý", + "Adjust Text Selection": "Điều chỉnh vùng chọn văn bản", + "Your books will appear here": "Sách của bạn sẽ xuất hiện ở đây", + "Reading aloud continues in the background": "Đọc to tiếp tục chạy trong nền", + "Stopped reading aloud": "Đã dừng đọc to", + "Read aloud stopped": "Đọc to đã dừng" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 46d76be9..4efaaff9 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -1780,5 +1780,63 @@ "Find:": "查找:", "Enable rule": "启用规则", "Disable rule": "禁用规则", - "Progress Read": "阅读进度" + "Progress Read": "阅读进度", + "Auto-import new books from this folder": "自动导入此文件夹中的新书", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "当此文件夹中添加了新书时,下次打开 Readest 或返回前台时将自动导入。", + "Reading aloud": "正在朗读", + "Open Book": "打开书籍", + "Stop reading aloud": "停止朗读", + "Enter at least two words": "请至少输入两个单词", + "Search failed": "搜索失败", + "Search with regex": "使用正则表达式搜索", + "Words to find near each other": "要就近查找的单词", + "Contains": "包含", + "Whole Words": "整个单词", + "Regular Expression": "正则表达式", + "Nearby Words": "邻近单词", + "Within N words": "N 个单词以内", + "Not for regex": "不适用于正则表达式", + "No results found": "未找到结果", + "{{count}} results_other": "{{count}} 个结果", + "Failed to seek": "跳转失败", + "Chapter progress": "章节进度", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "降低对比度", + "Reset Contrast": "重置对比度", + "Increase Contrast": "提高对比度", + "Google Drive session expired. Reconnect in Settings.": "Google Drive 会话已过期。请在设置中重新连接。", + "Cloud sync session expired. Reconnect in Settings.": "云同步会话已过期。请在设置中重新连接。", + "Push": "平移", + "Slide": "覆盖", + "Page Curl": "仿真", + "Animation Style": "动画样式", + "Appearance": "外观", + "Sets the text size of dictionary results, independent of the reading view.": "设置词典结果的文字大小,与阅读界面相互独立。", + "Authentication failed. Reconnect in Settings.": "认证失败。请在设置中重新连接。", + "Full Sync": "完全同步", + "Re-check every book instead of only changed ones.": "重新检查所有书籍,而不仅是有变动的书籍。", + "Waiting for sign-in…": "等待登录…", + "Reconnect": "重新连接", + "Connected as {{account}}": "已以 {{account}} 身份连接", + ". Make Google Drive the active cloud provider.": "。将 Google Drive 设为当前使用的云服务提供商。", + "Use Google Drive": "使用 Google Drive", + "Sign-in opens in your browser.": "登录将在浏览器中打开。", + "Readest only accesses the files it creates in your Drive.": "Readest 只会访问它在您的 Drive 中创建的文件。", + "Sync your library, reading progress, and highlights with a WebDAV server.": "将您的书库、阅读进度和高亮与 WebDAV 服务器同步。", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "将您的书库、阅读进度和高亮与您的 Google Drive 同步。", + "Configured": "已配置", + "Third-party Cloud Sync": "第三方云同步", + "Use WebDAV": "使用 WebDAV", + "Cloud Sync": "云同步", + "Available on Plus, Pro, or Lifetime": "Plus、Pro 或 Lifetime 套餐可用", + "Extra Large": "特大", + "Hint size": "提示大小", + "Gloss text size above the word": "单词上方注释文字的大小", + "Hint color": "提示颜色", + "Adjust Text Selection": "调整文本选择", + "Your books will appear here": "您的书籍将显示在这里", + "Reading aloud continues in the background": "语音朗读在后台继续", + "Stopped reading aloud": "已停止语音朗读", + "Read aloud stopped": "语音朗读已停止" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index c660321f..1893cbe9 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -1780,5 +1780,63 @@ "Find:": "尋找:", "Enable rule": "啟用規則", "Disable rule": "停用規則", - "Progress Read": "閱讀進度" + "Progress Read": "閱讀進度", + "Auto-import new books from this folder": "自動匯入此資料夾中的新書", + "When new books are added to this folder, import them automatically the next time Readest opens or returns to the foreground.": "當此資料夾中加入新書時,下次開啟 Readest 或回到前景時將自動匯入。", + "Reading aloud": "朗讀中", + "Open Book": "打開書籍", + "Stop reading aloud": "停止朗讀", + "Enter at least two words": "請至少輸入兩個單詞", + "Search failed": "搜尋失敗", + "Search with regex": "使用正規表示式搜尋", + "Words to find near each other": "要就近尋找的單詞", + "Contains": "包含", + "Whole Words": "整個單詞", + "Regular Expression": "正規表示式", + "Nearby Words": "鄰近單詞", + "Within N words": "N 個單詞以內", + "Not for regex": "不適用於正規表示式", + "No results found": "未找到結果", + "{{count}} results_other": "{{count}} 個結果", + "Failed to seek": "跳轉失敗", + "Chapter progress": "章節進度", + "{{elapsed}} of {{total}}": "{{elapsed}} / {{total}}", + "Decrease Contrast": "降低對比度", + "Reset Contrast": "重設對比度", + "Increase Contrast": "提高對比度", + "Google Drive session expired. Reconnect in Settings.": "Google Drive 工作階段已過期。請在設定中重新連線。", + "Cloud sync session expired. Reconnect in Settings.": "雲同步工作階段已過期。請在設定中重新連線。", + "Push": "平移", + "Slide": "覆蓋", + "Page Curl": "擬真", + "Animation Style": "動畫樣式", + "Appearance": "外觀", + "Sets the text size of dictionary results, independent of the reading view.": "設定詞典結果的文字大小,與閱讀介面相互獨立。", + "Authentication failed. Reconnect in Settings.": "驗證失敗。請在設定中重新連線。", + "Full Sync": "完全同步", + "Re-check every book instead of only changed ones.": "重新檢查所有書籍,而不僅是有變動的書籍。", + "Waiting for sign-in…": "等待登入…", + "Reconnect": "重新連線", + "Connected as {{account}}": "已以 {{account}} 身分連線", + ". Make Google Drive the active cloud provider.": "。將 Google Drive 設為目前使用的雲端服務供應商。", + "Use Google Drive": "使用 Google Drive", + "Sign-in opens in your browser.": "登入將在瀏覽器中開啟。", + "Readest only accesses the files it creates in your Drive.": "Readest 只會存取它在您的 Drive 中建立的檔案。", + "Sync your library, reading progress, and highlights with a WebDAV server.": "將您的書庫、閱讀進度和高亮與 WebDAV 伺服器同步。", + "Google Drive": "Google Drive", + "Sync your library, reading progress, and highlights with your Google Drive.": "將您的書庫、閱讀進度和高亮與您的 Google Drive 同步。", + "Configured": "已設定", + "Third-party Cloud Sync": "第三方雲同步", + "Use WebDAV": "使用 WebDAV", + "Cloud Sync": "雲同步", + "Available on Plus, Pro, or Lifetime": "Plus、Pro 或 Lifetime 方案可用", + "Extra Large": "特大", + "Hint size": "提示大小", + "Gloss text size above the word": "單詞上方註釋文字的大小", + "Hint color": "提示顏色", + "Adjust Text Selection": "調整文字選取", + "Your books will appear here": "您的書籍將顯示在這裡", + "Reading aloud continues in the background": "朗讀將在背景繼續", + "Stopped reading aloud": "已停止朗讀", + "Read aloud stopped": "朗讀已停止" } diff --git a/apps/readest-app/src/__tests__/reader/utils/autoscroller.test.ts b/apps/readest-app/src/__tests__/reader/utils/autoscroller.test.ts new file mode 100644 index 00000000..24b05578 --- /dev/null +++ b/apps/readest-app/src/__tests__/reader/utils/autoscroller.test.ts @@ -0,0 +1,145 @@ +import { describe, test, expect, vi } from 'vitest'; +import { + Autoscroller, + AUTOSCROLL_DEAD_ZONE_PX, + AUTOSCROLL_SPEED_PER_PX, + AUTOSCROLL_MAX_VELOCITY, +} from '@/app/reader/utils/autoscroller'; + +// Middle-click autoscroll core (#4951). The controller is pure logic driven by +// an injected rAF/clock so the speed model and the press/release state machine +// can be tested deterministically. +const createHarness = () => { + let frameCb: FrameRequestCallback | null = null; + let time = 0; + const deltas: number[] = []; + const onStop = vi.fn(); + const scroller = new Autoscroller({ + scrollBy: (delta) => deltas.push(delta), + onStop, + raf: (cb) => { + frameCb = cb; + return 1; + }, + caf: () => { + frameCb = null; + }, + now: () => time, + }); + // Advance the clock and fire the pending animation frame (which re-arms itself). + const step = (ms: number) => { + time += ms; + const cb = frameCb; + frameCb = null; + cb?.(time); + }; + const scrolledTotal = () => deltas.reduce((a, b) => a + b, 0); + const hasPendingFrame = () => frameCb !== null; + return { scroller, deltas, onStop, step, scrolledTotal, hasPendingFrame }; +}; + +describe('Autoscroller speed model', () => { + test('is inactive until started', () => { + const { scroller, hasPendingFrame } = createHarness(); + expect(scroller.active).toBe(false); + expect(hasPendingFrame()).toBe(false); + scroller.start(100, 100, 'y'); + expect(scroller.active).toBe(true); + expect(hasPendingFrame()).toBe(true); + }); + + test('does not scroll while the pointer stays within the dead zone', () => { + const { scroller, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX - 2); + step(100); + step(100); + expect(scrolledTotal()).toBe(0); + }); + + test('scrolls proportionally to the distance beyond the dead zone', () => { + const { scroller, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + // 50px beyond the dead zone -> 50 * SPEED px/s; 100ms -> a tenth of that. + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX + 50); + step(100); + expect(scrolledTotal()).toBe((50 * AUTOSCROLL_SPEED_PER_PX) / 10); + }); + + test('scrolls backwards when the pointer is before the anchor', () => { + const { scroller, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + scroller.move(100, 100 - AUTOSCROLL_DEAD_ZONE_PX - 50); + step(100); + expect(scrolledTotal()).toBe(-(50 * AUTOSCROLL_SPEED_PER_PX) / 10); + }); + + test('uses the x displacement on the horizontal axis and ignores y', () => { + const { scroller, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'x'); + scroller.move(100 + AUTOSCROLL_DEAD_ZONE_PX + 50, 500); + step(100); + expect(scrolledTotal()).toBe((50 * AUTOSCROLL_SPEED_PER_PX) / 10); + }); + + test('caps the scroll velocity', () => { + const { scroller, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX + 100000); + step(100); + expect(scrolledTotal()).toBe(AUTOSCROLL_MAX_VELOCITY / 10); + }); + + test('emits whole pixels and carries the fractional remainder', () => { + const { scroller, deltas, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + // 2px beyond the dead zone -> 2 * SPEED px/s (20px/s by default): a 10ms + // frame yields 0.2px, below one pixel, so nothing may be emitted per frame. + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX + 2); + for (let i = 0; i < 10; i++) step(10); + expect(scrolledTotal()).toBe((2 * AUTOSCROLL_SPEED_PER_PX) / 10); + expect(deltas.every((d) => Number.isInteger(d))).toBe(true); + }); +}); + +describe('Autoscroller press/release state machine', () => { + test('release after dragging beyond the dead zone stops scrolling', () => { + const { scroller, onStop, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX + 50); + step(100); + const scrolledWhileHeld = scrolledTotal(); + expect(scrolledWhileHeld).toBeGreaterThan(0); + scroller.release(); + expect(scroller.active).toBe(false); + expect(onStop).toHaveBeenCalledTimes(1); + step(100); + expect(scrolledTotal()).toBe(scrolledWhileHeld); + }); + + test('a quick release near the anchor enters sticky mode', () => { + const { scroller, onStop, step, scrolledTotal } = createHarness(); + scroller.start(100, 100, 'y'); + scroller.move(100, 105); + scroller.release(); + expect(scroller.active).toBe(true); + expect(onStop).not.toHaveBeenCalled(); + scroller.move(100, 100 + AUTOSCROLL_DEAD_ZONE_PX + 50); + step(100); + expect(scrolledTotal()).toBeGreaterThan(0); + scroller.stop(); + expect(scroller.active).toBe(false); + expect(onStop).toHaveBeenCalledTimes(1); + }); + + test('stop is idempotent and cancels the frame loop', () => { + const { scroller, onStop, hasPendingFrame } = createHarness(); + scroller.stop(); + expect(onStop).not.toHaveBeenCalled(); + scroller.start(100, 100, 'y'); + scroller.stop(); + scroller.stop(); + expect(onStop).toHaveBeenCalledTimes(1); + expect(hasPendingFrame()).toBe(false); + }); +}); diff --git a/apps/readest-app/src/app/reader/components/AutoscrollIndicator.tsx b/apps/readest-app/src/app/reader/components/AutoscrollIndicator.tsx new file mode 100644 index 00000000..03837b1d --- /dev/null +++ b/apps/readest-app/src/app/reader/components/AutoscrollIndicator.tsx @@ -0,0 +1,35 @@ +import clsx from 'clsx'; +import React from 'react'; +import { AutoscrollAnchor } from '../hooks/useMiddleClickAutoscroll'; + +// The anchor marker shown while middle-click autoscroll is engaged: a circle +// with arrows along the scroll axis, akin to the browsers' autoscroll bullet. +const AutoscrollIndicator: React.FC<{ anchor: AutoscrollAnchor }> = ({ anchor }) => ( + +); + +export default AutoscrollIndicator; diff --git a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx index c26ee7e8..f09c305c 100644 --- a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx +++ b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx @@ -51,6 +51,8 @@ import { handleKeyup, handleMousedown, handleMouseup, + handleMousemove, + handleAuxclick, handleClick, handleWheel, handleTouchStart, @@ -76,7 +78,9 @@ import { isMetered } from '@/utils/network'; import { eventDispatcher } from '@/utils/event'; import { isFontType } from '@/utils/font'; import { getScrollGapAttr } from '@/utils/webtoon'; +import { useMiddleClickAutoscroll } from '../hooks/useMiddleClickAutoscroll'; import { ParagraphControl } from './paragraph'; +import AutoscrollIndicator from './AutoscrollIndicator'; import Spinner from '@/components/Spinner'; import KOSyncConflictResolver from './KOSyncResolver'; import ImageViewer from './ImageViewer'; @@ -399,6 +403,8 @@ const FoliateViewer: React.FC<{ detail.doc.addEventListener('keyup', handleKeyup.bind(null, bookKey)); detail.doc.addEventListener('mousedown', handleMousedown.bind(null, bookKey)); detail.doc.addEventListener('mouseup', handleMouseup.bind(null, bookKey)); + detail.doc.addEventListener('mousemove', handleMousemove.bind(null, bookKey)); + detail.doc.addEventListener('auxclick', handleAuxclick.bind(null, bookKey)); detail.doc.addEventListener( 'click', handleClick.bind(null, bookKey, doubleClickDisabled, !!bookData?.isFixedLayout), @@ -509,6 +515,7 @@ const FoliateViewer: React.FC<{ const { handlePageFlip } = usePagination(bookKey, viewRef, containerRef); const mouseHandlers = useMouseEvent(bookKey, handlePageFlip); const touchHandlers = useTouchEvent(bookKey); + const autoscrollAnchor = useMiddleClickAutoscroll(bookKey, viewRef, containerRef); const [selectedImage, setSelectedImage] = useState(null); const [selectedTableHtml, setSelectedTableHtml] = useState(null); @@ -952,6 +959,7 @@ const FoliateViewer: React.FC<{ {...mouseHandlers} {...touchHandlers} /> + {autoscrollAnchor && } {((!docLoaded.current && loading) || viewState?.loading) && ( diff --git a/apps/readest-app/src/app/reader/hooks/useMiddleClickAutoscroll.ts b/apps/readest-app/src/app/reader/hooks/useMiddleClickAutoscroll.ts new file mode 100644 index 00000000..f7003458 --- /dev/null +++ b/apps/readest-app/src/app/reader/hooks/useMiddleClickAutoscroll.ts @@ -0,0 +1,158 @@ +import { useEffect, useRef, useState } from 'react'; +import { useEnv } from '@/context/EnvContext'; +import { FoliateView } from '@/types/view'; +import { useReaderStore } from '@/store/readerStore'; +import { eventDispatcher } from '@/utils/event'; +import { Autoscroller, AutoscrollAxis } from '../utils/autoscroller'; +import { setAutoscrollArmed, setAutoscrollTracking } from '../utils/iframeEventHandlers'; + +export interface AutoscrollAnchor { + left: number; + top: number; + axis: AutoscrollAxis; +} + +// Middle-click autoscroll (#4951): desktop-only, scrolled mode. A middle-button +// press in the book iframe plants an anchor; pointer distance from it drives the +// scroll velocity (see Autoscroller). Movement is tracked in screen coordinates +// so iframe/window coordinate spaces and transforms don't matter; the returned +// anchor is in reading-container coordinates for the indicator overlay. +export const useMiddleClickAutoscroll = ( + bookKey: string, + viewRef: React.RefObject, + containerRef: React.RefObject, +) => { + const { appService } = useEnv(); + const { getViewSettings } = useReaderStore(); + const viewSettings = getViewSettings(bookKey); + const [anchor, setAnchor] = useState(null); + + const armed = !!appService?.isDesktopApp && !!viewSettings?.scrolled; + const armedRef = useRef(armed); + armedRef.current = armed; + + // Undoes the per-session wiring (window listeners, cursors); set on start. + const sessionCleanupRef = useRef<(() => void) | null>(null); + // A left click that ends a sticky session must only end it, not also turn the + // page; single clicks arrive well after the mousedown, hence a time window. + const swallowClicksBeforeRef = useRef(0); + + const scrollerRef = useRef(null); + if (!scrollerRef.current) { + scrollerRef.current = new Autoscroller({ + scrollBy: (delta) => { + const renderer = viewRef.current?.renderer; + if (renderer) renderer.containerPosition += delta; + }, + onStop: () => { + setAnchor(null); + setAutoscrollTracking(false); + sessionCleanupRef.current?.(); + sessionCleanupRef.current = null; + }, + }); + } + + const startSession = (windowX: number, windowY: number, screenX: number, screenY: number) => { + const scroller = scrollerRef.current!; + const renderer = viewRef.current?.renderer; + const container = containerRef.current; + if (!renderer?.scrolled || !container) return; + // Vertical-writing books scroll along the horizontal axis in scrolled mode. + const axis: AutoscrollAxis = renderer.scrollProp === 'scrollLeft' ? 'x' : 'y'; + scroller.start(screenX, screenY, axis); + + const cursor = axis === 'x' ? 'ew-resize' : 'ns-resize'; + const docs = renderer.getContents().map(({ doc }) => doc); + docs.forEach((doc) => (doc.documentElement.style.cursor = cursor)); + container.style.cursor = cursor; + + const onMousemove = (event: MouseEvent) => scroller.move(event.screenX, event.screenY); + const onMousedown = () => scroller.stop(); + const onMouseup = (event: MouseEvent) => { + if (event.button === 1) scroller.release(); + }; + const onWheel = () => scroller.stop(); + const onKeydown = (event: KeyboardEvent) => { + if (event.key === 'Escape') scroller.stop(); + }; + const onBlur = () => scroller.stop(); + window.addEventListener('mousemove', onMousemove, true); + window.addEventListener('mousedown', onMousedown, true); + window.addEventListener('mouseup', onMouseup, true); + window.addEventListener('wheel', onWheel, true); + window.addEventListener('keydown', onKeydown, true); + window.addEventListener('blur', onBlur); + sessionCleanupRef.current = () => { + docs.forEach((doc) => (doc.documentElement.style.cursor = '')); + container.style.cursor = ''; + window.removeEventListener('mousemove', onMousemove, true); + window.removeEventListener('mousedown', onMousedown, true); + window.removeEventListener('mouseup', onMouseup, true); + window.removeEventListener('wheel', onWheel, true); + window.removeEventListener('keydown', onKeydown, true); + window.removeEventListener('blur', onBlur); + }; + setAutoscrollTracking(true); + + const containerRect = container.getBoundingClientRect(); + setAnchor({ left: windowX - containerRect.left, top: windowY - containerRect.top, axis }); + }; + + useEffect(() => { + const scroller = scrollerRef.current!; + const onMessage = (msg: MessageEvent) => { + const data = msg.data; + if (!data?.type) return; + switch (data.type) { + case 'iframe-mousedown': + if (scroller.active) { + // Any press ends the session; a left press would otherwise also + // click through to a page turn, so swallow its click. + if (data.button === 0) swallowClicksBeforeRef.current = Date.now() + 500; + scroller.stop(); + } else if (data.bookKey === bookKey && data.button === 1 && armedRef.current) { + startSession( + data.windowX ?? data.clientX, + data.windowY ?? data.clientY, + data.screenX, + data.screenY, + ); + } + break; + case 'iframe-mouseup': + if (data.button === 1) scroller.release(); + break; + case 'iframe-mousemove': + scroller.move(data.screenX, data.screenY); + break; + case 'iframe-wheel': + scroller.stop(); + break; + case 'iframe-keydown': + if (data.key === 'Escape') scroller.stop(); + break; + } + }; + const onSingleClick = () => Date.now() < swallowClicksBeforeRef.current; + window.addEventListener('message', onMessage); + eventDispatcher.onSync('iframe-single-click', onSingleClick); + return () => { + window.removeEventListener('message', onMessage); + eventDispatcher.offSync('iframe-single-click', onSingleClick); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [bookKey]); + + useEffect(() => { + setAutoscrollArmed(bookKey, armed); + if (!armed) scrollerRef.current?.stop(); + return () => setAutoscrollArmed(bookKey, false); + }, [bookKey, armed]); + + useEffect(() => { + return () => scrollerRef.current?.stop(); + }, []); + + return anchor; +}; diff --git a/apps/readest-app/src/app/reader/utils/autoscroller.ts b/apps/readest-app/src/app/reader/utils/autoscroller.ts new file mode 100644 index 00000000..f67770c8 --- /dev/null +++ b/apps/readest-app/src/app/reader/utils/autoscroller.ts @@ -0,0 +1,110 @@ +// Middle-click autoscroll core (#4951). Browser-style: pressing the middle +// button plants an anchor; the pointer's distance from the anchor sets the +// scroll velocity. Releasing after a drag stops; a quick release near the +// anchor enters sticky mode, which keeps scrolling until an explicit stop. +// Pure logic — the caller feeds pointer positions (screen coordinates) and +// receives per-frame scroll deltas, so it can be tested with an injected +// rAF/clock and reused for any scrollable target. + +export type AutoscrollAxis = 'x' | 'y'; + +// Pointer travel around the anchor that produces no scroll, so the anchor +// isn't impossibly twitchy to rest on. +export const AUTOSCROLL_DEAD_ZONE_PX = 12; +// Scroll velocity in px/s gained per pixel of pointer offset beyond the dead zone. +export const AUTOSCROLL_SPEED_PER_PX = 10; +// Velocity ceiling in px/s. +export const AUTOSCROLL_MAX_VELOCITY = 4000; + +interface AutoscrollerOptions { + scrollBy: (delta: number) => void; + onStop?: () => void; + raf?: (cb: FrameRequestCallback) => number; + caf?: (id: number) => void; + now?: () => number; +} + +export class Autoscroller { + #opts: AutoscrollerOptions; + #active = false; + #held = false; + #movedBeyondDeadZone = false; + #axis: AutoscrollAxis = 'y'; + #anchor = 0; + #pointer = 0; + #lastTime = 0; + // Sub-pixel remainder carried between frames so slow speeds still move even + // if the scroll target rounds positions to whole pixels. + #residual = 0; + #frameId: number | null = null; + + constructor(opts: AutoscrollerOptions) { + this.#opts = opts; + } + + get active() { + return this.#active; + } + + start(x: number, y: number, axis: AutoscrollAxis) { + this.stop(); + this.#active = true; + this.#held = true; + this.#movedBeyondDeadZone = false; + this.#axis = axis; + this.#anchor = axis === 'x' ? x : y; + this.#pointer = this.#anchor; + this.#lastTime = (this.#opts.now ?? performance.now.bind(performance))(); + this.#residual = 0; + this.#requestFrame(); + } + + move(x: number, y: number) { + if (!this.#active) return; + this.#pointer = this.#axis === 'x' ? x : y; + if (Math.abs(this.#pointer - this.#anchor) > AUTOSCROLL_DEAD_ZONE_PX) { + this.#movedBeyondDeadZone = true; + } + } + + // Middle button released: a press that dragged beyond the dead zone was a + // hold-to-scroll gesture and ends here; a quick click near the anchor sticks. + release() { + if (!this.#active || !this.#held) return; + this.#held = false; + if (this.#movedBeyondDeadZone) this.stop(); + } + + stop() { + if (!this.#active) return; + this.#active = false; + if (this.#frameId !== null) { + (this.#opts.caf ?? cancelAnimationFrame)(this.#frameId); + this.#frameId = null; + } + this.#opts.onStop?.(); + } + + #requestFrame() { + this.#frameId = (this.#opts.raf ?? requestAnimationFrame)((time) => this.#tick(time)); + } + + #tick(time: number) { + this.#frameId = null; + if (!this.#active) return; + const dt = Math.max(0, time - this.#lastTime); + this.#lastTime = time; + const offset = this.#pointer - this.#anchor; + const beyond = Math.abs(offset) - AUTOSCROLL_DEAD_ZONE_PX; + if (beyond > 0) { + const velocity = Math.min(beyond * AUTOSCROLL_SPEED_PER_PX, AUTOSCROLL_MAX_VELOCITY); + this.#residual += Math.sign(offset) * velocity * (dt / 1000); + const whole = Math.trunc(this.#residual); + if (whole !== 0) { + this.#residual -= whole; + this.#opts.scrollBy(whole); + } + } + this.#requestFrame(); + } +} diff --git a/apps/readest-app/src/app/reader/utils/iframeEventHandlers.ts b/apps/readest-app/src/app/reader/utils/iframeEventHandlers.ts index 613f06d7..8d875472 100644 --- a/apps/readest-app/src/app/reader/utils/iframeEventHandlers.ts +++ b/apps/readest-app/src/app/reader/utils/iframeEventHandlers.ts @@ -6,6 +6,42 @@ let lastClickTime = 0; let longHoldTimeout: ReturnType | null = null; let isMouseDown = false; +// Middle-click autoscroll (#4951). Books where the feature is armed (desktop +// app, scrolled mode, setting on) get the middle button's defaults suppressed, +// so the WebView's own autoscroll (WebView2) can't scroll alongside ours and a +// middle-clicked link doesn't open. These handlers run in the main realm, so +// the hook toggles this state directly. +const autoscrollArmedBooks = new Set(); +// Whether an autoscroll session is running; gates mousemove forwarding so the +// stream costs nothing while idle. +let autoscrollTracking = false; + +export const setAutoscrollArmed = (bookKey: string, armed: boolean) => { + if (armed) autoscrollArmedBooks.add(bookKey); + else autoscrollArmedBooks.delete(bookKey); +}; + +export const setAutoscrollTracking = (tracking: boolean) => { + autoscrollTracking = tracking; +}; + +// The event's position in main-window viewport coordinates: iframe client +// coordinates offset by the frame's on-screen rect. The rect already includes +// any zoom transform on the frame's ancestors, so client sizes are rescaled. +const getWindowPoint = (event: MouseEvent) => { + const win = event.view; + const frame = win?.frameElement; + if (!win || !frame) return { windowX: event.clientX, windowY: event.clientY }; + const rect = frame.getBoundingClientRect(); + const { clientWidth, clientHeight } = win.document.documentElement; + const scaleX = clientWidth ? rect.width / clientWidth : 1; + const scaleY = clientHeight ? rect.height / clientHeight : 1; + return { + windowX: rect.left + event.clientX * scaleX, + windowY: rect.top + event.clientY * scaleY, + }; +}; + let keyboardState = { key: '', code: '', @@ -94,6 +130,10 @@ export const handleMousedown = (bookKey: string, event: MouseEvent) => { longHoldTimeout = null; }, LONG_HOLD_THRESHOLD); + if (event.button === 1 && autoscrollArmedBooks.has(bookKey)) { + event.preventDefault(); + } + window.postMessage( { type: 'iframe-mousedown', @@ -105,12 +145,35 @@ export const handleMousedown = (bookKey: string, event: MouseEvent) => { clientY: event.clientY, offsetX: event.offsetX, offsetY: event.offsetY, + // Anchor point for the autoscroll indicator, which renders in the parent. + ...(event.button === 1 ? getWindowPoint(event) : null), ...getKeyStatus(event), }, '*', ); }; +export const handleAuxclick = (bookKey: string, event: MouseEvent) => { + // Swallow the middle button's auxclick while autoscroll is armed so a + // middle-clicked link doesn't also navigate or open elsewhere. + if (event.button === 1 && autoscrollArmedBooks.has(bookKey)) { + event.preventDefault(); + } +}; + +export const handleMousemove = (bookKey: string, event: MouseEvent) => { + if (!autoscrollTracking) return; + window.postMessage( + { + type: 'iframe-mousemove', + bookKey, + screenX: event.screenX, + screenY: event.screenY, + }, + '*', + ); +}; + export const handleMouseup = (bookKey: string, event: MouseEvent) => { isMouseDown = false; // we will handle mouse back and forward buttons ourselves diff --git a/apps/readest-app/src/types/view.ts b/apps/readest-app/src/types/view.ts index 61883f87..c0d5c36d 100644 --- a/apps/readest-app/src/types/view.ts +++ b/apps/readest-app/src/types/view.ts @@ -20,6 +20,7 @@ export interface Renderer extends HTMLElement { atStart: boolean; atEnd: boolean; containerPosition: number; + scrollProp: 'scrollLeft' | 'scrollTop'; sideProp: 'width' | 'height'; pageColors?: { background: string;