diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 416f00b1..3bdaac13 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -183,7 +183,6 @@ "RTL Direction": "الاتجاه من اليمين إلى اليسار", "Maximum Column Height": "الارتفاع الأقصى للعمود", "Maximum Column Width": "العرض الأقصى للعمود", - "Continuous Scroll": "التمرير المستمر", "Fullscreen": "ملء الشاشة", "No supported files found. Supported formats: {{formats}}": "لم يتم العثور على ملفات مدعومة. الصيغ المدعومة: {{formats}}", "Drop to Import Books": "قم بالسحب والإسقاط لاستيراد الكتب", @@ -1154,5 +1153,42 @@ "{{count}} books refreshed_many": "تم تحديث {{count}} كتابًا", "{{count}} books refreshed_other": "تم تحديث {{count}} كتاب", "Failed to refresh metadata": "فشل تحديث البيانات الوصفية", - "Refresh Metadata": "تحديث البيانات الوصفية" + "Refresh Metadata": "تحديث البيانات الوصفية", + "Keyboard Shortcuts": "اختصارات لوحة المفاتيح", + "View all keyboard shortcuts": "عرض جميع اختصارات لوحة المفاتيح", + "Switch Sidebar Tab": "تبديل علامة تبويب الشريط الجانبي", + "Toggle Notebook": "إظهار/إخفاء دفتر الملاحظات", + "Search in Book": "البحث في الكتاب", + "Toggle Scroll Mode": "تبديل وضع التمرير", + "Toggle Select Mode": "تبديل وضع التحديد", + "Toggle Bookmark": "تبديل الإشارة المرجعية", + "Toggle Text to Speech": "تبديل تحويل النص إلى كلام", + "Play / Pause TTS": "تشغيل / إيقاف القراءة الصوتية", + "Toggle Paragraph Mode": "تبديل وضع الفقرة", + "Highlight Selection": "تمييز التحديد", + "Underline Selection": "وضع خط تحت التحديد", + "Annotate Selection": "إضافة تعليق على التحديد", + "Search Selection": "البحث عن التحديد", + "Copy Selection": "نسخ التحديد", + "Translate Selection": "ترجمة التحديد", + "Dictionary Lookup": "البحث في القاموس", + "Wikipedia Lookup": "البحث في ويكيبيديا", + "Read Aloud Selection": "قراءة التحديد بصوت عالٍ", + "Proofread Selection": "تدقيق التحديد", + "Open Settings": "فتح الإعدادات", + "Open Command Palette": "فتح لوحة الأوامر", + "Show Keyboard Shortcuts": "عرض اختصارات لوحة المفاتيح", + "Open Books": "فتح الكتب", + "Toggle Fullscreen": "تبديل ملء الشاشة", + "Close Window": "إغلاق النافذة", + "Quit App": "إنهاء التطبيق", + "Go Left / Previous Page": "الانتقال لليسار / الصفحة السابقة", + "Go Right / Next Page": "الانتقال لليمين / الصفحة التالية", + "Go Up": "الانتقال لأعلى", + "Go Down": "الانتقال لأسفل", + "Previous Chapter": "الفصل السابق", + "Next Chapter": "الفصل التالي", + "Scroll Half Page Down": "تمرير نصف صفحة لأسفل", + "Scroll Half Page Up": "تمرير نصف صفحة لأعلى", + "Save Note": "حفظ الملاحظة" } diff --git a/apps/readest-app/public/locales/bn/translation.json b/apps/readest-app/public/locales/bn/translation.json index 148faf84..808705c9 100644 --- a/apps/readest-app/public/locales/bn/translation.json +++ b/apps/readest-app/public/locales/bn/translation.json @@ -199,7 +199,6 @@ "Auto": "অটো", "Scroll": "স্ক্রল", "Scrolled Mode": "স্ক্রল মোড", - "Continuous Scroll": "ক্রমাগত স্ক্রল", "Overlap Pixels": "ওভারল্যাপ পিক্সেল", "Disable Double Click": "ডাবল ক্লিক নিষ্ক্রিয়", "Volume Keys for Page Flip": "পৃষ্ঠা উল্টানোর জন্য ভলিউম কী", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}}টি বইয়ের মেটাডেটা রিফ্রেশ হয়েছে", "{{count}} books refreshed_other": "{{count}}টি বইয়ের মেটাডেটা রিফ্রেশ হয়েছে", "Failed to refresh metadata": "মেটাডেটা রিফ্রেশ ব্যর্থ", - "Refresh Metadata": "মেটাডেটা রিফ্রেশ" + "Refresh Metadata": "মেটাডেটা রিফ্রেশ", + "Keyboard Shortcuts": "কীবোর্ড শর্টকাট", + "View all keyboard shortcuts": "সমস্ত কীবোর্ড শর্টকাট দেখুন", + "Switch Sidebar Tab": "সাইডবার ট্যাব পরিবর্তন করুন", + "Toggle Notebook": "নোটবুক দেখান/লুকান", + "Search in Book": "বইয়ে অনুসন্ধান করুন", + "Toggle Scroll Mode": "স্ক্রল মোড টগল করুন", + "Toggle Select Mode": "নির্বাচন মোড টগল করুন", + "Toggle Bookmark": "বুকমার্ক টগল করুন", + "Toggle Text to Speech": "টেক্সট টু স্পিচ টগল করুন", + "Play / Pause TTS": "TTS চালান / বিরতি দিন", + "Toggle Paragraph Mode": "অনুচ্ছেদ মোড টগল করুন", + "Highlight Selection": "নির্বাচিত অংশ হাইলাইট করুন", + "Underline Selection": "নির্বাচিত অংশে আন্ডারলাইন করুন", + "Annotate Selection": "নির্বাচিত অংশে টীকা যোগ করুন", + "Search Selection": "নির্বাচিত অংশ অনুসন্ধান করুন", + "Copy Selection": "নির্বাচিত অংশ কপি করুন", + "Translate Selection": "নির্বাচিত অংশ অনুবাদ করুন", + "Dictionary Lookup": "অভিধানে খুঁজুন", + "Wikipedia Lookup": "উইকিপিডিয়ায় খুঁজুন", + "Read Aloud Selection": "নির্বাচিত অংশ জোরে পড়ুন", + "Proofread Selection": "নির্বাচিত অংশ প্রুফরিড করুন", + "Open Settings": "সেটিংস খুলুন", + "Open Command Palette": "কমান্ড প্যালেট খুলুন", + "Show Keyboard Shortcuts": "কীবোর্ড শর্টকাট দেখান", + "Open Books": "বই খুলুন", + "Toggle Fullscreen": "পূর্ণ পর্দা টগল করুন", + "Close Window": "উইন্ডো বন্ধ করুন", + "Quit App": "অ্যাপ থেকে প্রস্থান করুন", + "Go Left / Previous Page": "বামে যান / আগের পৃষ্ঠা", + "Go Right / Next Page": "ডানে যান / পরের পৃষ্ঠা", + "Go Up": "উপরে যান", + "Go Down": "নিচে যান", + "Previous Chapter": "আগের অধ্যায়", + "Next Chapter": "পরের অধ্যায়", + "Scroll Half Page Down": "অর্ধেক পৃষ্ঠা নিচে স্ক্রল করুন", + "Scroll Half Page Up": "অর্ধেক পৃষ্ঠা উপরে স্ক্রল করুন", + "Save Note": "নোট সংরক্ষণ করুন" } diff --git a/apps/readest-app/public/locales/bo/translation.json b/apps/readest-app/public/locales/bo/translation.json index f952ae15..35b3a3e2 100644 --- a/apps/readest-app/public/locales/bo/translation.json +++ b/apps/readest-app/public/locales/bo/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "གཡས་ནས་གཡོན་དུ།", "Maximum Column Height": "གྲལ་ཐིག་མཐོ་ཤོས།", "Maximum Column Width": "གྲལ་ཐིག་རྒྱ་ཆེ་ཤོས།", - "Continuous Scroll": "རྒྱུན་མཐུད་འཁོར་རྒྱུག", "Fullscreen": "བརྡ་ཁྱབ་ངོས་ཆ་ཚང་།", "No supported files found. Supported formats: {{formats}}": "རྒྱབ་སྐྱོར་བྱེད་པའི་ཡིག་ཆ་མ་རྙེད། རྒྱབ་སྐྱོར་བྱེད་པའི་རྣམ་པ། {{formats}}", "Drop to Import Books": "འདྲུད་འཇོག་བྱས་ནས་དཔེ་དེབ་ནང་འདྲེན།", @@ -1089,5 +1088,42 @@ "Loading library...": "དཔེ་མཛོད་འཇུག་བཞིན་པ...", "{{count}} books refreshed_other": "تم تحديث {{count}} كتب", "Failed to refresh metadata": "མེ་ཊ་ཌེ་ཊ་གསར་བསྒྱུར་བྱེད་མ་ཐུབ", - "Refresh Metadata": "མེ་ཊ་ཌེ་ཊ་གསར་བསྒྱུར" + "Refresh Metadata": "མེ་ཊ་ཌེ་ཊ་གསར་བསྒྱུར", + "Keyboard Shortcuts": "མཐེབ་གཞོང་མྱུར་ལམ།", + "View all keyboard shortcuts": "མཐེབ་གཞོང་མྱུར་ལམ་ཚང་མ་ལྟ་བ།", + "Switch Sidebar Tab": "ཟུར་འབར་གྱི་ཤོག་བྱང་བརྗེ་བ།", + "Toggle Notebook": "ཟིན་དེབ་སྟོན་པ།/སྦས་པ།", + "Search in Book": "དཔེ་དེབ་ནང་འཚོལ་བ།", + "Toggle Scroll Mode": "འཁྱོག་སྒུལ་རྣམ་པ་བརྗེ་བ།", + "Toggle Select Mode": "འདེམས་རྣམ་པ་བརྗེ་བ།", + "Toggle Bookmark": "ཤོག་རྟགས་བརྗེ་བ།", + "Toggle Text to Speech": "ཡི་གེ་སྒྲ་ལ་བརྗེ་བ།", + "Play / Pause TTS": "སྒྲ་ཀློག་འགོ་འཛུགས / མཚམས་འཇོག", + "Toggle Paragraph Mode": "དུམ་བུ་རྣམ་པ་བརྗེ་བ།", + "Highlight Selection": "བདམས་པ་གསལ་བཀོད།", + "Underline Selection": "བདམས་པའི་འོག་ཐིག", + "Annotate Selection": "བདམས་པར་མཆན་འགོད།", + "Search Selection": "བདམས་པ་འཚོལ་བ།", + "Copy Selection": "བདམས་པ་བཤུ་བ།", + "Translate Selection": "བདམས་པ་ཡིག་སྒྱུར།", + "Dictionary Lookup": "ཚིག་མཛོད་ནང་འཚོལ་བ།", + "Wikipedia Lookup": "ཝེ་ཁེ་པི་ཌི་ཡར་འཚོལ་བ།", + "Read Aloud Selection": "བདམས་པ་སྒྲ་ཆེན་པོས་ཀློག", + "Proofread Selection": "བདམས་པ་ཞུ་དག", + "Open Settings": "སྒྲིག་འགོད་ཁ་ཕྱེ་བ།", + "Open Command Palette": "བཀའ་བརྡའི་པང་ཁ་ཕྱེ་བ།", + "Show Keyboard Shortcuts": "མཐེབ་གཞོང་མྱུར་ལམ་སྟོན་པ།", + "Open Books": "དཔེ་དེབ་ཁ་ཕྱེ་བ།", + "Toggle Fullscreen": "ཡོངས་ཁྱབ་བརྗེ་བ།", + "Close Window": "སྒེའུ་ཁུང་ཁ་རྒྱག", + "Quit App": "ཉེར་སྤྱོད་ཁ་རྒྱག", + "Go Left / Previous Page": "གཡོན་དུ / སྔོན་མའི་ཤོག་ངོས།", + "Go Right / Next Page": "གཡས་སུ / རྗེས་མའི་ཤོག་ངོས།", + "Go Up": "གོང་དུ།", + "Go Down": "འོག་ཏུ།", + "Previous Chapter": "སྔོན་མའི་ལེའུ།", + "Next Chapter": "རྗེས་མའི་ལེའུ།", + "Scroll Half Page Down": "ཤོག་ངོས་ཕྱེད་ཀ་འོག་ཏུ།", + "Scroll Half Page Up": "ཤོག་ངོས་ཕྱེད་ཀ་གོང་དུ།", + "Save Note": "ཟིན་བྲིས་ཉར་བ།" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 6faddf71..5a4ce170 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -183,7 +183,6 @@ "RTL Direction": "RTL-Richtung", "Maximum Column Height": "Maximale Spaltenhöhe", "Maximum Column Width": "Maximale Spaltenbreite", - "Continuous Scroll": "Kontinuierliches Scrollen", "Fullscreen": "Vollbild", "No supported files found. Supported formats: {{formats}}": "Keine unterstützten Dateien gefunden. Unterstützte Formate: {{formats}}", "Drop to Import Books": "Zum Importieren von Büchern ablegen", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} Buch aktualisiert", "{{count}} books refreshed_other": "{{count}} Bücher aktualisiert", "Failed to refresh metadata": "Metadaten-Aktualisierung fehlgeschlagen", - "Refresh Metadata": "Metadaten aktualisieren" + "Refresh Metadata": "Metadaten aktualisieren", + "Keyboard Shortcuts": "Tastaturkürzel", + "View all keyboard shortcuts": "Alle Tastaturkürzel anzeigen", + "Switch Sidebar Tab": "Seitenleisten-Tab wechseln", + "Toggle Notebook": "Notizbuch ein-/ausblenden", + "Search in Book": "Im Buch suchen", + "Toggle Scroll Mode": "Scrollmodus umschalten", + "Toggle Select Mode": "Auswahlmodus umschalten", + "Toggle Bookmark": "Lesezeichen umschalten", + "Toggle Text to Speech": "Sprachausgabe umschalten", + "Play / Pause TTS": "Sprachausgabe abspielen / pausieren", + "Toggle Paragraph Mode": "Absatzmodus umschalten", + "Highlight Selection": "Auswahl hervorheben", + "Underline Selection": "Auswahl unterstreichen", + "Annotate Selection": "Auswahl kommentieren", + "Search Selection": "Auswahl suchen", + "Copy Selection": "Auswahl kopieren", + "Translate Selection": "Auswahl übersetzen", + "Dictionary Lookup": "Im Wörterbuch nachschlagen", + "Wikipedia Lookup": "In Wikipedia nachschlagen", + "Read Aloud Selection": "Auswahl vorlesen", + "Proofread Selection": "Auswahl korrekturlesen", + "Open Settings": "Einstellungen öffnen", + "Open Command Palette": "Befehlspalette öffnen", + "Show Keyboard Shortcuts": "Tastaturkürzel anzeigen", + "Open Books": "Bücher öffnen", + "Toggle Fullscreen": "Vollbild umschalten", + "Close Window": "Fenster schließen", + "Quit App": "App beenden", + "Go Left / Previous Page": "Nach links / Vorherige Seite", + "Go Right / Next Page": "Nach rechts / Nächste Seite", + "Go Up": "Nach oben", + "Go Down": "Nach unten", + "Previous Chapter": "Vorheriges Kapitel", + "Next Chapter": "Nächstes Kapitel", + "Scroll Half Page Down": "Halbe Seite nach unten scrollen", + "Scroll Half Page Up": "Halbe Seite nach oben scrollen", + "Save Note": "Notiz speichern" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index da4edb28..f425f5da 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Κατεύθυνση RTL", "Maximum Column Height": "Μέγιστο ύψος στήλης", "Maximum Column Width": "Μέγιστο πλάτος στήλης", - "Continuous Scroll": "Συνεχής κύλιση", "Fullscreen": "Πλήρης οθόνη", "No supported files found. Supported formats: {{formats}}": "Δεν βρέθηκαν υποστηριζόμενα αρχεία. Υποστηριζόμενες μορφές: {{formats}}", "Drop to Import Books": "Ρίξτε για εισαγωγή βιβλίων", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} βιβλίο ανανεώθηκε", "{{count}} books refreshed_other": "{{count}} βιβλία ανανεώθηκαν", "Failed to refresh metadata": "Αποτυχία ανανέωσης μεταδεδομένων", - "Refresh Metadata": "Ανανέωση μεταδεδομένων" + "Refresh Metadata": "Ανανέωση μεταδεδομένων", + "Keyboard Shortcuts": "Συντομεύσεις πληκτρολογίου", + "View all keyboard shortcuts": "Προβολή όλων των συντομεύσεων", + "Switch Sidebar Tab": "Εναλλαγή καρτέλας πλαϊνής γραμμής", + "Toggle Notebook": "Εμφάνιση/Απόκρυψη σημειωματάριου", + "Search in Book": "Αναζήτηση στο βιβλίο", + "Toggle Scroll Mode": "Εναλλαγή λειτουργίας κύλισης", + "Toggle Select Mode": "Εναλλαγή λειτουργίας επιλογής", + "Toggle Bookmark": "Εναλλαγή σελιδοδείκτη", + "Toggle Text to Speech": "Εναλλαγή κειμένου σε ομιλία", + "Play / Pause TTS": "Αναπαραγωγή / Παύση TTS", + "Toggle Paragraph Mode": "Εναλλαγή λειτουργίας παραγράφου", + "Highlight Selection": "Επισήμανση επιλογής", + "Underline Selection": "Υπογράμμιση επιλογής", + "Annotate Selection": "Σχολιασμός επιλογής", + "Search Selection": "Αναζήτηση επιλογής", + "Copy Selection": "Αντιγραφή επιλογής", + "Translate Selection": "Μετάφραση επιλογής", + "Dictionary Lookup": "Αναζήτηση στο λεξικό", + "Wikipedia Lookup": "Αναζήτηση στη Wikipedia", + "Read Aloud Selection": "Ανάγνωση επιλογής", + "Proofread Selection": "Διόρθωση επιλογής", + "Open Settings": "Άνοιγμα ρυθμίσεων", + "Open Command Palette": "Άνοιγμα παλέτας εντολών", + "Show Keyboard Shortcuts": "Εμφάνιση συντομεύσεων", + "Open Books": "Άνοιγμα βιβλίων", + "Toggle Fullscreen": "Εναλλαγή πλήρους οθόνης", + "Close Window": "Κλείσιμο παραθύρου", + "Quit App": "Έξοδος εφαρμογής", + "Go Left / Previous Page": "Αριστερά / Προηγούμενη σελίδα", + "Go Right / Next Page": "Δεξιά / Επόμενη σελίδα", + "Go Up": "Πάνω", + "Go Down": "Κάτω", + "Previous Chapter": "Προηγούμενο κεφάλαιο", + "Next Chapter": "Επόμενο κεφάλαιο", + "Scroll Half Page Down": "Κύλιση μισής σελίδας κάτω", + "Scroll Half Page Up": "Κύλιση μισής σελίδας πάνω", + "Save Note": "Αποθήκευση σημείωσης" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 1fb04eac..4a6aef8e 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -211,7 +211,6 @@ "RTL Direction": "Dirección RTL", "Maximum Column Height": "Altura máxima de columna", "Maximum Column Width": "Ancho máximo de columna", - "Continuous Scroll": "Desplazamiento continuo", "Fullscreen": "Pantalla completa", "No supported files found. Supported formats: {{formats}}": "No se encontraron archivos compatibles. Formatos compatibles: {{formats}}", "Drop to Import Books": "Soltar para importar libros", @@ -1115,5 +1114,42 @@ "{{count}} books refreshed_many": "{{count}} libros actualizados", "{{count}} books refreshed_other": "{{count}} libros actualizados", "Failed to refresh metadata": "Error al actualizar metadatos", - "Refresh Metadata": "Actualizar metadatos" + "Refresh Metadata": "Actualizar metadatos", + "Keyboard Shortcuts": "Atajos de teclado", + "View all keyboard shortcuts": "Ver todos los atajos de teclado", + "Switch Sidebar Tab": "Cambiar pestaña de la barra lateral", + "Toggle Notebook": "Mostrar/ocultar cuaderno", + "Search in Book": "Buscar en el libro", + "Toggle Scroll Mode": "Alternar modo desplazamiento", + "Toggle Select Mode": "Alternar modo selección", + "Toggle Bookmark": "Alternar marcador", + "Toggle Text to Speech": "Alternar texto a voz", + "Play / Pause TTS": "Reproducir / Pausar TTS", + "Toggle Paragraph Mode": "Alternar modo párrafo", + "Highlight Selection": "Resaltar selección", + "Underline Selection": "Subrayar selección", + "Annotate Selection": "Anotar selección", + "Search Selection": "Buscar selección", + "Copy Selection": "Copiar selección", + "Translate Selection": "Traducir selección", + "Dictionary Lookup": "Buscar en diccionario", + "Wikipedia Lookup": "Buscar en Wikipedia", + "Read Aloud Selection": "Leer selección en voz alta", + "Proofread Selection": "Corregir selección", + "Open Settings": "Abrir ajustes", + "Open Command Palette": "Abrir paleta de comandos", + "Show Keyboard Shortcuts": "Mostrar atajos de teclado", + "Open Books": "Abrir libros", + "Toggle Fullscreen": "Alternar pantalla completa", + "Close Window": "Cerrar ventana", + "Quit App": "Salir de la aplicación", + "Go Left / Previous Page": "Ir a la izquierda / Página anterior", + "Go Right / Next Page": "Ir a la derecha / Página siguiente", + "Go Up": "Ir arriba", + "Go Down": "Ir abajo", + "Previous Chapter": "Capítulo anterior", + "Next Chapter": "Capítulo siguiente", + "Scroll Half Page Down": "Desplazar media página abajo", + "Scroll Half Page Up": "Desplazar media página arriba", + "Save Note": "Guardar nota" } diff --git a/apps/readest-app/public/locales/fa/translation.json b/apps/readest-app/public/locales/fa/translation.json index ce58be67..02d55d71 100644 --- a/apps/readest-app/public/locales/fa/translation.json +++ b/apps/readest-app/public/locales/fa/translation.json @@ -183,7 +183,6 @@ "RTL Direction": "جهت راست‌به‌چپ", "Maximum Column Height": "حداکثر ارتفاع ستون", "Maximum Column Width": "حداکثر عرض ستون", - "Continuous Scroll": "پیمایش مداوم", "Fullscreen": "تمام‌صفحه", "No supported files found. Supported formats: {{formats}}": "فایل پشتیبانی‌شده‌ای یافت نشد. فرمت‌های قابل پشتیبانی: {{formats}}", "Drop to Import Books": "برای وارد کردن کتاب‌ها، فایل را رها کنید", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} کتاب به‌روزرسانی شد", "{{count}} books refreshed_other": "{{count}} کتاب به‌روزرسانی شد", "Failed to refresh metadata": "به‌روزرسانی فراداده ناموفق", - "Refresh Metadata": "به‌روزرسانی فراداده" + "Refresh Metadata": "به‌روزرسانی فراداده", + "Keyboard Shortcuts": "میانبرهای صفحه‌کلید", + "View all keyboard shortcuts": "مشاهده همه میانبرهای صفحه‌کلید", + "Switch Sidebar Tab": "تغییر زبانه نوار کناری", + "Toggle Notebook": "نمایش/پنهان کردن دفترچه یادداشت", + "Search in Book": "جستجو در کتاب", + "Toggle Scroll Mode": "تغییر حالت پیمایش", + "Toggle Select Mode": "تغییر حالت انتخاب", + "Toggle Bookmark": "تغییر نشانک", + "Toggle Text to Speech": "تغییر متن به گفتار", + "Play / Pause TTS": "پخش / توقف TTS", + "Toggle Paragraph Mode": "تغییر حالت پاراگراف", + "Highlight Selection": "برجسته‌سازی انتخاب", + "Underline Selection": "زیرخط انتخاب", + "Annotate Selection": "افزودن یادداشت به انتخاب", + "Search Selection": "جستجوی انتخاب", + "Copy Selection": "کپی انتخاب", + "Translate Selection": "ترجمه انتخاب", + "Dictionary Lookup": "جستجو در فرهنگ لغت", + "Wikipedia Lookup": "جستجو در ویکی‌پدیا", + "Read Aloud Selection": "خواندن بلند انتخاب", + "Proofread Selection": "بازبینی انتخاب", + "Open Settings": "باز کردن تنظیمات", + "Open Command Palette": "باز کردن پالت فرمان", + "Show Keyboard Shortcuts": "نمایش میانبرهای صفحه‌کلید", + "Open Books": "باز کردن کتاب‌ها", + "Toggle Fullscreen": "تغییر تمام‌صفحه", + "Close Window": "بستن پنجره", + "Quit App": "خروج از برنامه", + "Go Left / Previous Page": "رفتن به چپ / صفحه قبلی", + "Go Right / Next Page": "رفتن به راست / صفحه بعدی", + "Go Up": "رفتن به بالا", + "Go Down": "رفتن به پایین", + "Previous Chapter": "فصل قبلی", + "Next Chapter": "فصل بعدی", + "Scroll Half Page Down": "پیمایش نیم صفحه پایین", + "Scroll Half Page Up": "پیمایش نیم صفحه بالا", + "Save Note": "ذخیره یادداشت" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index bb0de22e..b58d22ab 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -183,7 +183,6 @@ "RTL Direction": "Direction RTL", "Maximum Column Height": "Hauteur maximale de colonne", "Maximum Column Width": "Largeur maximale de colonne", - "Continuous Scroll": "Défilement continu", "Fullscreen": "Plein écran", "No supported files found. Supported formats: {{formats}}": "Aucun fichier pris en charge trouvé. Formats pris en charge : {{formats}}", "Drop to Import Books": "Déposez pour importer des livres", @@ -1115,5 +1114,42 @@ "{{count}} books refreshed_many": "{{count}} livres rafraîchis", "{{count}} books refreshed_other": "{{count}} livres rafraîchis", "Failed to refresh metadata": "Échec du rafraîchissement des métadonnées", - "Refresh Metadata": "Rafraîchir les métadonnées" + "Refresh Metadata": "Rafraîchir les métadonnées", + "Keyboard Shortcuts": "Raccourcis clavier", + "View all keyboard shortcuts": "Voir tous les raccourcis clavier", + "Switch Sidebar Tab": "Changer l'onglet de la barre latérale", + "Toggle Notebook": "Afficher/masquer le carnet", + "Search in Book": "Rechercher dans le livre", + "Toggle Scroll Mode": "Basculer le mode défilement", + "Toggle Select Mode": "Basculer le mode sélection", + "Toggle Bookmark": "Basculer le signet", + "Toggle Text to Speech": "Basculer la synthèse vocale", + "Play / Pause TTS": "Lecture / Pause TTS", + "Toggle Paragraph Mode": "Basculer le mode paragraphe", + "Highlight Selection": "Surligner la sélection", + "Underline Selection": "Souligner la sélection", + "Annotate Selection": "Annoter la sélection", + "Search Selection": "Rechercher la sélection", + "Copy Selection": "Copier la sélection", + "Translate Selection": "Traduire la sélection", + "Dictionary Lookup": "Recherche dans le dictionnaire", + "Wikipedia Lookup": "Recherche sur Wikipédia", + "Read Aloud Selection": "Lire la sélection à voix haute", + "Proofread Selection": "Relire la sélection", + "Open Settings": "Ouvrir les paramètres", + "Open Command Palette": "Ouvrir la palette de commandes", + "Show Keyboard Shortcuts": "Afficher les raccourcis clavier", + "Open Books": "Ouvrir les livres", + "Toggle Fullscreen": "Basculer en plein écran", + "Close Window": "Fermer la fenêtre", + "Quit App": "Quitter l'application", + "Go Left / Previous Page": "Aller à gauche / Page précédente", + "Go Right / Next Page": "Aller à droite / Page suivante", + "Go Up": "Aller en haut", + "Go Down": "Aller en bas", + "Previous Chapter": "Chapitre précédent", + "Next Chapter": "Chapitre suivant", + "Scroll Half Page Down": "Défiler d'une demi-page vers le bas", + "Scroll Half Page Up": "Défiler d'une demi-page vers le haut", + "Save Note": "Enregistrer la note" } diff --git a/apps/readest-app/public/locales/he/translation.json b/apps/readest-app/public/locales/he/translation.json index 08ac2277..e1b2ebc0 100644 --- a/apps/readest-app/public/locales/he/translation.json +++ b/apps/readest-app/public/locales/he/translation.json @@ -853,7 +853,6 @@ "Override Book Color": "דרוס צבע ספר", "None": "ללא", "Scroll": "גלילה", - "Continuous Scroll": "גלילה רציפה", "Overlap Pixels": "פיקסלים לחפיפה", "Pagination": "עימוד (Pagination)", "Tap to Paginate": "הקש לעימוד", @@ -1115,5 +1114,42 @@ "{{count}} books refreshed_two": "{{count}} ספרים רועננו", "{{count}} books refreshed_other": "{{count}} ספרים רועננו", "Failed to refresh metadata": "רענון המטא-נתונים נכשל", - "Refresh Metadata": "רענון מטא-נתונים" + "Refresh Metadata": "רענון מטא-נתונים", + "Keyboard Shortcuts": "קיצורי מקלדת", + "View all keyboard shortcuts": "הצג את כל קיצורי המקלדת", + "Switch Sidebar Tab": "החלף לשונית סרגל צד", + "Toggle Notebook": "הצג/הסתר מחברת", + "Search in Book": "חפש בספר", + "Toggle Scroll Mode": "החלף מצב גלילה", + "Toggle Select Mode": "החלף מצב בחירה", + "Toggle Bookmark": "החלף סימנייה", + "Toggle Text to Speech": "החלף טקסט לדיבור", + "Play / Pause TTS": "נגן / השהה TTS", + "Toggle Paragraph Mode": "החלף מצב פסקה", + "Highlight Selection": "הדגש בחירה", + "Underline Selection": "קו תחתון לבחירה", + "Annotate Selection": "הוסף הערה לבחירה", + "Search Selection": "חפש בחירה", + "Copy Selection": "העתק בחירה", + "Translate Selection": "תרגם בחירה", + "Dictionary Lookup": "חיפוש במילון", + "Wikipedia Lookup": "חיפוש בוויקיפדיה", + "Read Aloud Selection": "קרא בקול את הבחירה", + "Proofread Selection": "הגה בחירה", + "Open Settings": "פתח הגדרות", + "Open Command Palette": "פתח לוח פקודות", + "Show Keyboard Shortcuts": "הצג קיצורי מקלדת", + "Open Books": "פתח ספרים", + "Toggle Fullscreen": "החלף מסך מלא", + "Close Window": "סגור חלון", + "Quit App": "צא מהאפליקציה", + "Go Left / Previous Page": "שמאלה / עמוד קודם", + "Go Right / Next Page": "ימינה / עמוד הבא", + "Go Up": "למעלה", + "Go Down": "למטה", + "Previous Chapter": "פרק קודם", + "Next Chapter": "פרק הבא", + "Scroll Half Page Down": "גלול חצי עמוד למטה", + "Scroll Half Page Up": "גלול חצי עמוד למעלה", + "Save Note": "שמור הערה" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 323d52a3..fc477e2c 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "RTL दिशा", "Maximum Column Height": "कॉलम की अधिकतम ऊँचाई", "Maximum Column Width": "कॉलम की अधिकतम चौड़ाई", - "Continuous Scroll": "निरंतर स्क्रॉल", "Fullscreen": "पूर्णस्क्रीन", "No supported files found. Supported formats: {{formats}}": "कोई समर्थित फ़ाइलें नहीं मिलीं। समर्थित प्रारूप: {{formats}}", "Drop to Import Books": "पुस्तकें आयात करने के लिए छोड़ें", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} पुस्तक रिफ्रेश हुई", "{{count}} books refreshed_other": "{{count}} पुस्तकें रिफ्रेश हुईं", "Failed to refresh metadata": "मेटाडेटा रिफ्रेश विफल", - "Refresh Metadata": "मेटाडेटा रिफ्रेश करें" + "Refresh Metadata": "मेटाडेटा रिफ्रेश करें", + "Keyboard Shortcuts": "कीबोर्ड शॉर्टकट", + "View all keyboard shortcuts": "सभी कीबोर्ड शॉर्टकट देखें", + "Switch Sidebar Tab": "साइडबार टैब बदलें", + "Toggle Notebook": "नोटबुक दिखाएँ/छुपाएँ", + "Search in Book": "पुस्तक में खोजें", + "Toggle Scroll Mode": "स्क्रॉल मोड टॉगल करें", + "Toggle Select Mode": "चयन मोड टॉगल करें", + "Toggle Bookmark": "बुकमार्क टॉगल करें", + "Toggle Text to Speech": "टेक्स्ट टू स्पीच टॉगल करें", + "Play / Pause TTS": "TTS चलाएँ / रोकें", + "Toggle Paragraph Mode": "अनुच्छेद मोड टॉगल करें", + "Highlight Selection": "चयन हाइलाइट करें", + "Underline Selection": "चयन अंडरलाइन करें", + "Annotate Selection": "चयन पर टिप्पणी करें", + "Search Selection": "चयन खोजें", + "Copy Selection": "चयन कॉपी करें", + "Translate Selection": "चयन का अनुवाद करें", + "Dictionary Lookup": "शब्दकोश में खोजें", + "Wikipedia Lookup": "विकिपीडिया पर खोजें", + "Read Aloud Selection": "चयन को ज़ोर से पढ़ें", + "Proofread Selection": "चयन की प्रूफरीडिंग करें", + "Open Settings": "सेटिंग्स खोलें", + "Open Command Palette": "कमांड पैलेट खोलें", + "Show Keyboard Shortcuts": "कीबोर्ड शॉर्टकट दिखाएँ", + "Open Books": "पुस्तकें खोलें", + "Toggle Fullscreen": "पूर्ण स्क्रीन टॉगल करें", + "Close Window": "विंडो बंद करें", + "Quit App": "ऐप से बाहर निकलें", + "Go Left / Previous Page": "बाएँ जाएँ / पिछला पृष्ठ", + "Go Right / Next Page": "दाएँ जाएँ / अगला पृष्ठ", + "Go Up": "ऊपर जाएँ", + "Go Down": "नीचे जाएँ", + "Previous Chapter": "पिछला अध्याय", + "Next Chapter": "अगला अध्याय", + "Scroll Half Page Down": "आधा पृष्ठ नीचे स्क्रॉल करें", + "Scroll Half Page Up": "आधा पृष्ठ ऊपर स्क्रॉल करें", + "Save Note": "नोट सहेजें" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 0222aa16..085c6cec 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Arah RTL", "Maximum Column Height": "Tinggi Kolom Maksimum", "Maximum Column Width": "Lebar Kolom Maksimum", - "Continuous Scroll": "Gulir Terus", "Fullscreen": "Layar Penuh", "No supported files found. Supported formats: {{formats}}": "Tidak ada file yang didukung ditemukan. Format yang didukung: {{formats}}", "Drop to Import Books": "Jatuhkan untuk Mengimpor Buku", @@ -1089,5 +1088,42 @@ "Loading library...": "Memuat perpustakaan...", "{{count}} books refreshed_other": "{{count}} buku diperbarui", "Failed to refresh metadata": "Gagal memperbarui metadata", - "Refresh Metadata": "Perbarui Metadata" + "Refresh Metadata": "Perbarui Metadata", + "Keyboard Shortcuts": "Pintasan Keyboard", + "View all keyboard shortcuts": "Lihat semua pintasan keyboard", + "Switch Sidebar Tab": "Ganti tab bilah sisi", + "Toggle Notebook": "Tampilkan/sembunyikan buku catatan", + "Search in Book": "Cari di buku", + "Toggle Scroll Mode": "Alihkan mode gulir", + "Toggle Select Mode": "Alihkan mode pilih", + "Toggle Bookmark": "Alihkan penanda", + "Toggle Text to Speech": "Alihkan teks ke suara", + "Play / Pause TTS": "Putar / Jeda TTS", + "Toggle Paragraph Mode": "Alihkan mode paragraf", + "Highlight Selection": "Sorot pilihan", + "Underline Selection": "Garis bawahi pilihan", + "Annotate Selection": "Beri anotasi pilihan", + "Search Selection": "Cari pilihan", + "Copy Selection": "Salin pilihan", + "Translate Selection": "Terjemahkan pilihan", + "Dictionary Lookup": "Cari di kamus", + "Wikipedia Lookup": "Cari di Wikipedia", + "Read Aloud Selection": "Bacakan pilihan", + "Proofread Selection": "Periksa ejaan pilihan", + "Open Settings": "Buka pengaturan", + "Open Command Palette": "Buka palet perintah", + "Show Keyboard Shortcuts": "Tampilkan pintasan keyboard", + "Open Books": "Buka buku", + "Toggle Fullscreen": "Alihkan layar penuh", + "Close Window": "Tutup jendela", + "Quit App": "Keluar dari aplikasi", + "Go Left / Previous Page": "Ke kiri / Halaman sebelumnya", + "Go Right / Next Page": "Ke kanan / Halaman berikutnya", + "Go Up": "Ke atas", + "Go Down": "Ke bawah", + "Previous Chapter": "Bab sebelumnya", + "Next Chapter": "Bab berikutnya", + "Scroll Half Page Down": "Gulir setengah halaman ke bawah", + "Scroll Half Page Up": "Gulir setengah halaman ke atas", + "Save Note": "Simpan catatan" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 6cf1dad1..04e8e217 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Direzione RTL", "Maximum Column Height": "Altezza massima colonna", "Maximum Column Width": "Larghezza massima colonna", - "Continuous Scroll": "Scorrimento continuo", "Fullscreen": "Schermo intero", "No supported files found. Supported formats: {{formats}}": "Nessun file supportato trovato. Formati supportati: {{formats}}", "Drop to Import Books": "Rilascia per importare libri", @@ -1115,5 +1114,42 @@ "{{count}} books refreshed_many": "{{count}} libri aggiornati", "{{count}} books refreshed_other": "{{count}} libri aggiornati", "Failed to refresh metadata": "Aggiornamento metadati fallito", - "Refresh Metadata": "Aggiorna metadati" + "Refresh Metadata": "Aggiorna metadati", + "Keyboard Shortcuts": "Scorciatoie da tastiera", + "View all keyboard shortcuts": "Visualizza tutte le scorciatoie", + "Switch Sidebar Tab": "Cambia scheda barra laterale", + "Toggle Notebook": "Mostra/nascondi blocco note", + "Search in Book": "Cerca nel libro", + "Toggle Scroll Mode": "Attiva/disattiva scorrimento", + "Toggle Select Mode": "Attiva/disattiva selezione", + "Toggle Bookmark": "Attiva/disattiva segnalibro", + "Toggle Text to Speech": "Attiva/disattiva sintesi vocale", + "Play / Pause TTS": "Riproduci / Pausa TTS", + "Toggle Paragraph Mode": "Attiva/disattiva modo paragrafo", + "Highlight Selection": "Evidenzia selezione", + "Underline Selection": "Sottolinea selezione", + "Annotate Selection": "Annota selezione", + "Search Selection": "Cerca selezione", + "Copy Selection": "Copia selezione", + "Translate Selection": "Traduci selezione", + "Dictionary Lookup": "Cerca nel dizionario", + "Wikipedia Lookup": "Cerca su Wikipedia", + "Read Aloud Selection": "Leggi la selezione ad alta voce", + "Proofread Selection": "Correggi selezione", + "Open Settings": "Apri impostazioni", + "Open Command Palette": "Apri tavolozza comandi", + "Show Keyboard Shortcuts": "Mostra scorciatoie da tastiera", + "Open Books": "Apri libri", + "Toggle Fullscreen": "Attiva/disattiva schermo intero", + "Close Window": "Chiudi finestra", + "Quit App": "Esci dall'app", + "Go Left / Previous Page": "Vai a sinistra / Pagina precedente", + "Go Right / Next Page": "Vai a destra / Pagina successiva", + "Go Up": "Vai su", + "Go Down": "Vai giù", + "Previous Chapter": "Capitolo precedente", + "Next Chapter": "Capitolo successivo", + "Scroll Half Page Down": "Scorri mezza pagina in basso", + "Scroll Half Page Up": "Scorri mezza pagina in alto", + "Save Note": "Salva nota" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index b2e570eb..628333de 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "RTL方向", "Maximum Column Height": "最大列高", "Maximum Column Width": "最大列幅", - "Continuous Scroll": "連続スクロール", "Fullscreen": "全画面", "No supported files found. Supported formats: {{formats}}": "サポートされているファイルが見つかりません。サポートされている形式:{{formats}}", "Drop to Import Books": "書籍をインポートするにはドロップ", @@ -1089,5 +1088,42 @@ "Loading library...": "ライブラリを読み込み中...", "{{count}} books refreshed_other": "{{count}}冊のメタデータを更新しました", "Failed to refresh metadata": "メタデータの更新に失敗しました", - "Refresh Metadata": "メタデータを更新" + "Refresh Metadata": "メタデータを更新", + "Keyboard Shortcuts": "キーボードショートカット", + "View all keyboard shortcuts": "すべてのキーボードショートカットを表示", + "Switch Sidebar Tab": "サイドバータブを切り替え", + "Toggle Notebook": "ノートブックの表示/非表示", + "Search in Book": "本の中を検索", + "Toggle Scroll Mode": "スクロールモードの切り替え", + "Toggle Select Mode": "選択モードの切り替え", + "Toggle Bookmark": "ブックマークの切り替え", + "Toggle Text to Speech": "音声読み上げの切り替え", + "Play / Pause TTS": "読み上げ再生 / 一時停止", + "Toggle Paragraph Mode": "段落モードの切り替え", + "Highlight Selection": "選択範囲をハイライト", + "Underline Selection": "選択範囲に下線", + "Annotate Selection": "選択範囲に注釈", + "Search Selection": "選択範囲を検索", + "Copy Selection": "選択範囲をコピー", + "Translate Selection": "選択範囲を翻訳", + "Dictionary Lookup": "辞書で調べる", + "Wikipedia Lookup": "Wikipediaで調べる", + "Read Aloud Selection": "選択範囲を読み上げ", + "Proofread Selection": "選択範囲を校正", + "Open Settings": "設定を開く", + "Open Command Palette": "コマンドパレットを開く", + "Show Keyboard Shortcuts": "キーボードショートカットを表示", + "Open Books": "本を開く", + "Toggle Fullscreen": "フルスクリーンの切り替え", + "Close Window": "ウィンドウを閉じる", + "Quit App": "アプリを終了", + "Go Left / Previous Page": "左へ / 前のページ", + "Go Right / Next Page": "右へ / 次のページ", + "Go Up": "上へ", + "Go Down": "下へ", + "Previous Chapter": "前の章", + "Next Chapter": "次の章", + "Scroll Half Page Down": "半ページ下にスクロール", + "Scroll Half Page Up": "半ページ上にスクロール", + "Save Note": "メモを保存" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 2b63eb39..9e8a45cb 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "RTL 방향", "Maximum Column Height": "최대 열 높이", "Maximum Column Width": "최대 열 너비", - "Continuous Scroll": "연속 스크롤", "Fullscreen": "전체 화면", "No supported files found. Supported formats: {{formats}}": "지원되는 파일이 없습니다. 지원되는 형식: {{formats}}", "Drop to Import Books": "책 가져오기 위해 드롭", @@ -1089,5 +1088,42 @@ "Loading library...": "라이브러리 로딩 중...", "{{count}} books refreshed_other": "{{count}}권 새로고침됨", "Failed to refresh metadata": "메타데이터 새로고침 실패", - "Refresh Metadata": "메타데이터 새로고침" + "Refresh Metadata": "메타데이터 새로고침", + "Keyboard Shortcuts": "키보드 단축키", + "View all keyboard shortcuts": "모든 키보드 단축키 보기", + "Switch Sidebar Tab": "사이드바 탭 전환", + "Toggle Notebook": "노트북 표시/숨기기", + "Search in Book": "책에서 검색", + "Toggle Scroll Mode": "스크롤 모드 전환", + "Toggle Select Mode": "선택 모드 전환", + "Toggle Bookmark": "북마크 전환", + "Toggle Text to Speech": "텍스트 음성 변환 전환", + "Play / Pause TTS": "TTS 재생 / 일시정지", + "Toggle Paragraph Mode": "문단 모드 전환", + "Highlight Selection": "선택 영역 강조", + "Underline Selection": "선택 영역 밑줄", + "Annotate Selection": "선택 영역 주석", + "Search Selection": "선택 영역 검색", + "Copy Selection": "선택 영역 복사", + "Translate Selection": "선택 영역 번역", + "Dictionary Lookup": "사전 검색", + "Wikipedia Lookup": "위키백과 검색", + "Read Aloud Selection": "선택 영역 소리 내어 읽기", + "Proofread Selection": "선택 영역 교정", + "Open Settings": "설정 열기", + "Open Command Palette": "명령 팔레트 열기", + "Show Keyboard Shortcuts": "키보드 단축키 표시", + "Open Books": "책 열기", + "Toggle Fullscreen": "전체 화면 전환", + "Close Window": "창 닫기", + "Quit App": "앱 종료", + "Go Left / Previous Page": "왼쪽으로 / 이전 페이지", + "Go Right / Next Page": "오른쪽으로 / 다음 페이지", + "Go Up": "위로", + "Go Down": "아래로", + "Previous Chapter": "이전 장", + "Next Chapter": "다음 장", + "Scroll Half Page Down": "반 페이지 아래로 스크롤", + "Scroll Half Page Up": "반 페이지 위로 스크롤", + "Save Note": "메모 저장" } diff --git a/apps/readest-app/public/locales/ms/translation.json b/apps/readest-app/public/locales/ms/translation.json index d161cd91..b1389bcf 100644 --- a/apps/readest-app/public/locales/ms/translation.json +++ b/apps/readest-app/public/locales/ms/translation.json @@ -500,7 +500,6 @@ "Quick Colors": "Warna Pantas", "Override Book Color": "Ganti Warna Buku", "Scroll": "Tatal", - "Continuous Scroll": "Tatal Berterusan", "Overlap Pixels": "Piksel Bertindih", "Pagination": "Penomboran Halaman", "Tap to Paginate": "Ketik untuk Nomborkan Halaman", @@ -1089,5 +1088,42 @@ "Loading library...": "Memuatkan perpustakaan...", "{{count}} books refreshed_other": "{{count}} buku dimuat semula", "Failed to refresh metadata": "Gagal memuat semula metadata", - "Refresh Metadata": "Muat Semula Metadata" + "Refresh Metadata": "Muat Semula Metadata", + "Keyboard Shortcuts": "Pintasan Papan Kekunci", + "View all keyboard shortcuts": "Lihat semua pintasan papan kekunci", + "Switch Sidebar Tab": "Tukar tab bar sisi", + "Toggle Notebook": "Tunjuk/sembunyikan buku nota", + "Search in Book": "Cari dalam buku", + "Toggle Scroll Mode": "Togol mod tatal", + "Toggle Select Mode": "Togol mod pilih", + "Toggle Bookmark": "Togol penanda buku", + "Toggle Text to Speech": "Togol teks ke pertuturan", + "Play / Pause TTS": "Main / Jeda TTS", + "Toggle Paragraph Mode": "Togol mod perenggan", + "Highlight Selection": "Serlahkan pilihan", + "Underline Selection": "Garis bawah pilihan", + "Annotate Selection": "Anotasi pilihan", + "Search Selection": "Cari pilihan", + "Copy Selection": "Salin pilihan", + "Translate Selection": "Terjemah pilihan", + "Dictionary Lookup": "Cari dalam kamus", + "Wikipedia Lookup": "Cari di Wikipedia", + "Read Aloud Selection": "Baca kuat pilihan", + "Proofread Selection": "Semak pilihan", + "Open Settings": "Buka tetapan", + "Open Command Palette": "Buka palet arahan", + "Show Keyboard Shortcuts": "Tunjukkan pintasan papan kekunci", + "Open Books": "Buka buku", + "Toggle Fullscreen": "Togol skrin penuh", + "Close Window": "Tutup tetingkap", + "Quit App": "Keluar dari aplikasi", + "Go Left / Previous Page": "Ke kiri / Halaman sebelumnya", + "Go Right / Next Page": "Ke kanan / Halaman seterusnya", + "Go Up": "Ke atas", + "Go Down": "Ke bawah", + "Previous Chapter": "Bab sebelumnya", + "Next Chapter": "Bab seterusnya", + "Scroll Half Page Down": "Tatal separuh halaman ke bawah", + "Scroll Half Page Up": "Tatal separuh halaman ke atas", + "Save Note": "Simpan nota" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 0695a8e9..f055cf7a 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -179,7 +179,6 @@ "Portrait": "Portret", "Landscape": "Landschap", "Behavior": "Gedrag", - "Continuous Scroll": "Doorlopend scrollen", "Volume Keys for Page Flip": "Volumetoetsen voor pagina omslaan", "Apply": "Toepassen", "Font": "Lettertype", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} boek vernieuwd", "{{count}} books refreshed_other": "{{count}} boeken vernieuwd", "Failed to refresh metadata": "Metadata vernieuwen mislukt", - "Refresh Metadata": "Metadata vernieuwen" + "Refresh Metadata": "Metadata vernieuwen", + "Keyboard Shortcuts": "Sneltoetsen", + "View all keyboard shortcuts": "Alle sneltoetsen bekijken", + "Switch Sidebar Tab": "Zijbalktabblad wisselen", + "Toggle Notebook": "Notitieboek tonen/verbergen", + "Search in Book": "Zoeken in boek", + "Toggle Scroll Mode": "Scrollmodus wisselen", + "Toggle Select Mode": "Selectiemodus wisselen", + "Toggle Bookmark": "Bladwijzer wisselen", + "Toggle Text to Speech": "Tekst-naar-spraak wisselen", + "Play / Pause TTS": "TTS afspelen / pauzeren", + "Toggle Paragraph Mode": "Alineamodus wisselen", + "Highlight Selection": "Selectie markeren", + "Underline Selection": "Selectie onderstrepen", + "Annotate Selection": "Selectie annoteren", + "Search Selection": "Selectie zoeken", + "Copy Selection": "Selectie kopiëren", + "Translate Selection": "Selectie vertalen", + "Dictionary Lookup": "Opzoeken in woordenboek", + "Wikipedia Lookup": "Opzoeken op Wikipedia", + "Read Aloud Selection": "Selectie voorlezen", + "Proofread Selection": "Selectie proeflezen", + "Open Settings": "Instellingen openen", + "Open Command Palette": "Opdrachtenpalet openen", + "Show Keyboard Shortcuts": "Sneltoetsen tonen", + "Open Books": "Boeken openen", + "Toggle Fullscreen": "Volledig scherm wisselen", + "Close Window": "Venster sluiten", + "Quit App": "App afsluiten", + "Go Left / Previous Page": "Naar links / Vorige pagina", + "Go Right / Next Page": "Naar rechts / Volgende pagina", + "Go Up": "Omhoog", + "Go Down": "Omlaag", + "Previous Chapter": "Vorig hoofdstuk", + "Next Chapter": "Volgend hoofdstuk", + "Scroll Half Page Down": "Halve pagina naar beneden scrollen", + "Scroll Half Page Up": "Halve pagina naar boven scrollen", + "Save Note": "Notitie opslaan" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index db09e9bb..6a42b3a5 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Kierunek RTL", "Maximum Column Height": "Maksymalna wysokość kolumny", "Maximum Column Width": "Maksymalna szerokość kolumny", - "Continuous Scroll": "Przewijanie ciągłe", "Fullscreen": "Pełny ekran", "No supported files found. Supported formats: {{formats}}": "Nie znaleziono obsługiwanych plików. Obsługiwane formaty: {{formats}}", "Drop to Import Books": "Upuść, aby zaimportować książki", @@ -1128,5 +1127,42 @@ "{{count}} books refreshed_many": "Odświeżono {{count}} książek", "{{count}} books refreshed_other": "Odświeżono {{count}} książek", "Failed to refresh metadata": "Nie udało się odświeżyć metadanych", - "Refresh Metadata": "Odśwież metadane" + "Refresh Metadata": "Odśwież metadane", + "Keyboard Shortcuts": "Skróty klawiszowe", + "View all keyboard shortcuts": "Zobacz wszystkie skróty klawiszowe", + "Switch Sidebar Tab": "Przełącz kartę paska bocznego", + "Toggle Notebook": "Pokaż/ukryj notatnik", + "Search in Book": "Szukaj w książce", + "Toggle Scroll Mode": "Przełącz tryb przewijania", + "Toggle Select Mode": "Przełącz tryb zaznaczania", + "Toggle Bookmark": "Przełącz zakładkę", + "Toggle Text to Speech": "Przełącz tekst na mowę", + "Play / Pause TTS": "Odtwórz / Wstrzymaj TTS", + "Toggle Paragraph Mode": "Przełącz tryb akapitu", + "Highlight Selection": "Podświetl zaznaczenie", + "Underline Selection": "Podkreśl zaznaczenie", + "Annotate Selection": "Dodaj adnotację do zaznaczenia", + "Search Selection": "Wyszukaj zaznaczenie", + "Copy Selection": "Kopiuj zaznaczenie", + "Translate Selection": "Przetłumacz zaznaczenie", + "Dictionary Lookup": "Wyszukaj w słowniku", + "Wikipedia Lookup": "Wyszukaj w Wikipedii", + "Read Aloud Selection": "Odczytaj zaznaczenie na głos", + "Proofread Selection": "Sprawdź zaznaczenie", + "Open Settings": "Otwórz ustawienia", + "Open Command Palette": "Otwórz paletę poleceń", + "Show Keyboard Shortcuts": "Pokaż skróty klawiszowe", + "Open Books": "Otwórz książki", + "Toggle Fullscreen": "Przełącz pełny ekran", + "Close Window": "Zamknij okno", + "Quit App": "Zamknij aplikację", + "Go Left / Previous Page": "W lewo / Poprzednia strona", + "Go Right / Next Page": "W prawo / Następna strona", + "Go Up": "W górę", + "Go Down": "W dół", + "Previous Chapter": "Poprzedni rozdział", + "Next Chapter": "Następny rozdział", + "Scroll Half Page Down": "Przewiń o pół strony w dół", + "Scroll Half Page Up": "Przewiń o pół strony w górę", + "Save Note": "Zapisz notatkę" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index d92b6a06..6d774b9b 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Direção RTL", "Maximum Column Height": "Altura Máxima da Coluna", "Maximum Column Width": "Largura Máxima da Coluna", - "Continuous Scroll": "Rolagem Contínua", "Fullscreen": "Tela Cheia", "No supported files found. Supported formats: {{formats}}": "Nenhum arquivo suportado encontrado. Formatos suportados: {{formats}}", "Drop to Import Books": "Arraste para Importar Livros", @@ -1115,5 +1114,42 @@ "{{count}} books refreshed_many": "{{count}} livros atualizados", "{{count}} books refreshed_other": "{{count}} livros atualizados", "Failed to refresh metadata": "Falha ao atualizar metadados", - "Refresh Metadata": "Atualizar metadados" + "Refresh Metadata": "Atualizar metadados", + "Keyboard Shortcuts": "Atalhos de teclado", + "View all keyboard shortcuts": "Ver todos os atalhos de teclado", + "Switch Sidebar Tab": "Alternar aba da barra lateral", + "Toggle Notebook": "Mostrar/ocultar caderno", + "Search in Book": "Pesquisar no livro", + "Toggle Scroll Mode": "Alternar modo rolagem", + "Toggle Select Mode": "Alternar modo seleção", + "Toggle Bookmark": "Alternar marcador", + "Toggle Text to Speech": "Alternar texto para fala", + "Play / Pause TTS": "Reproduzir / Pausar TTS", + "Toggle Paragraph Mode": "Alternar modo parágrafo", + "Highlight Selection": "Destacar seleção", + "Underline Selection": "Sublinhar seleção", + "Annotate Selection": "Anotar seleção", + "Search Selection": "Pesquisar seleção", + "Copy Selection": "Copiar seleção", + "Translate Selection": "Traduzir seleção", + "Dictionary Lookup": "Pesquisar no dicionário", + "Wikipedia Lookup": "Pesquisar na Wikipédia", + "Read Aloud Selection": "Ler seleção em voz alta", + "Proofread Selection": "Revisar seleção", + "Open Settings": "Abrir configurações", + "Open Command Palette": "Abrir paleta de comandos", + "Show Keyboard Shortcuts": "Mostrar atalhos de teclado", + "Open Books": "Abrir livros", + "Toggle Fullscreen": "Alternar tela cheia", + "Close Window": "Fechar janela", + "Quit App": "Sair do aplicativo", + "Go Left / Previous Page": "Ir para a esquerda / Página anterior", + "Go Right / Next Page": "Ir para a direita / Próxima página", + "Go Up": "Ir para cima", + "Go Down": "Ir para baixo", + "Previous Chapter": "Capítulo anterior", + "Next Chapter": "Próximo capítulo", + "Scroll Half Page Down": "Rolar meia página para baixo", + "Scroll Half Page Up": "Rolar meia página para cima", + "Save Note": "Salvar nota" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 4650ebb8..bfd28648 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Направление RTL", "Maximum Column Height": "Максимальная высота колонки", "Maximum Column Width": "Максимальная ширина колонки", - "Continuous Scroll": "Непрерывная прокрутка", "Fullscreen": "Полноэкранный режим", "No supported files found. Supported formats: {{formats}}": "Поддерживаемые файлы не найдены. Поддерживаемые форматы: {{formats}}", "Drop to Import Books": "Перетащите сюда книги для импорта", @@ -1128,5 +1127,42 @@ "{{count}} books refreshed_many": "Обновлено {{count}} книг", "{{count}} books refreshed_other": "Обновлено {{count}} книг", "Failed to refresh metadata": "Не удалось обновить метаданные", - "Refresh Metadata": "Обновить метаданные" + "Refresh Metadata": "Обновить метаданные", + "Keyboard Shortcuts": "Сочетания клавиш", + "View all keyboard shortcuts": "Показать все сочетания клавиш", + "Switch Sidebar Tab": "Переключить вкладку боковой панели", + "Toggle Notebook": "Показать/скрыть записную книжку", + "Search in Book": "Поиск в книге", + "Toggle Scroll Mode": "Переключить режим прокрутки", + "Toggle Select Mode": "Переключить режим выделения", + "Toggle Bookmark": "Переключить закладку", + "Toggle Text to Speech": "Переключить озвучивание текста", + "Play / Pause TTS": "Воспроизвести / Пауза TTS", + "Toggle Paragraph Mode": "Переключить режим абзаца", + "Highlight Selection": "Выделить выбранное", + "Underline Selection": "Подчеркнуть выбранное", + "Annotate Selection": "Добавить примечание к выбранному", + "Search Selection": "Искать выбранное", + "Copy Selection": "Копировать выбранное", + "Translate Selection": "Перевести выбранное", + "Dictionary Lookup": "Поиск в словаре", + "Wikipedia Lookup": "Поиск в Википедии", + "Read Aloud Selection": "Прочитать выбранное вслух", + "Proofread Selection": "Проверить выбранное", + "Open Settings": "Открыть настройки", + "Open Command Palette": "Открыть палитру команд", + "Show Keyboard Shortcuts": "Показать сочетания клавиш", + "Open Books": "Открыть книги", + "Toggle Fullscreen": "Переключить полноэкранный режим", + "Close Window": "Закрыть окно", + "Quit App": "Выйти из приложения", + "Go Left / Previous Page": "Влево / Предыдущая страница", + "Go Right / Next Page": "Вправо / Следующая страница", + "Go Up": "Вверх", + "Go Down": "Вниз", + "Previous Chapter": "Предыдущая глава", + "Next Chapter": "Следующая глава", + "Scroll Half Page Down": "Прокрутить на полстраницы вниз", + "Scroll Half Page Up": "Прокрутить на полстраницы вверх", + "Save Note": "Сохранить заметку" } diff --git a/apps/readest-app/public/locales/si/translation.json b/apps/readest-app/public/locales/si/translation.json index c76721b9..29145849 100644 --- a/apps/readest-app/public/locales/si/translation.json +++ b/apps/readest-app/public/locales/si/translation.json @@ -199,7 +199,6 @@ "Auto": "ස්වයංක්‍රීය", "Scroll": "අනුචලනය", "Scrolled Mode": "අනුචලන ආකාරය", - "Continuous Scroll": "අඛණ්ඩ අනුචලනය", "Overlap Pixels": "අතිච්ඡාදන පික්සල්", "Disable Double Click": "ද්විත්ව ක්ලික් අබල කරන්න", "Volume Keys for Page Flip": "පිටු පෙරැළීම සඳහා ශබ්ද යතුර", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "පොත් {{count}}ක් යාවත්කාලීන විය", "{{count}} books refreshed_other": "පොත් {{count}}ක් යාවත්කාලීන විය", "Failed to refresh metadata": "පාරදත්ත යාවත්කාලීන කිරීම අසාර්ථකයි", - "Refresh Metadata": "පාරදත්ත යාවත්කාලීන කරන්න" + "Refresh Metadata": "පාරදත්ත යාවත්කාලීන කරන්න", + "Keyboard Shortcuts": "යතුරුපුවරු කෙටිමං", + "View all keyboard shortcuts": "සියලුම යතුරුපුවරු කෙටිමං බලන්න", + "Switch Sidebar Tab": "පැති තීරු ටැබය මාරු කරන්න", + "Toggle Notebook": "සටහන් පොත පෙන්වන්න/සඟවන්න", + "Search in Book": "පොතේ සොයන්න", + "Toggle Scroll Mode": "අනුචලන ප්‍රකාරය මාරු කරන්න", + "Toggle Select Mode": "තේරීම් ප්‍රකාරය මාරු කරන්න", + "Toggle Bookmark": "පිටු සලකුණ මාරු කරන්න", + "Toggle Text to Speech": "පෙළ-කථනය මාරු කරන්න", + "Play / Pause TTS": "TTS ධාවනය / විරාමය", + "Toggle Paragraph Mode": "ඡේද ප්‍රකාරය මාරු කරන්න", + "Highlight Selection": "තේරීම උද්දීපනය කරන්න", + "Underline Selection": "තේරීමට යටින් ඉරක් අදින්න", + "Annotate Selection": "තේරීමට සටහනක් එක් කරන්න", + "Search Selection": "තේරීම සොයන්න", + "Copy Selection": "තේරීම පිටපත් කරන්න", + "Translate Selection": "තේරීම පරිවර්තනය කරන්න", + "Dictionary Lookup": "ශබ්දකෝෂයේ සොයන්න", + "Wikipedia Lookup": "විකිපීඩියාවේ සොයන්න", + "Read Aloud Selection": "තේරීම ශබ්ද නගා කියවන්න", + "Proofread Selection": "තේරීම සෝදුපත් කරන්න", + "Open Settings": "සැකසුම් විවෘත කරන්න", + "Open Command Palette": "විධාන පැලට් එක විවෘත කරන්න", + "Show Keyboard Shortcuts": "යතුරුපුවරු කෙටිමං පෙන්වන්න", + "Open Books": "පොත් විවෘත කරන්න", + "Toggle Fullscreen": "පූර්ණ තිරය මාරු කරන්න", + "Close Window": "කවුළුව වසන්න", + "Quit App": "යෙදුමෙන් පිටවන්න", + "Go Left / Previous Page": "වමට / පෙර පිටුව", + "Go Right / Next Page": "දකුණට / ඊළඟ පිටුව", + "Go Up": "ඉහළට", + "Go Down": "පහළට", + "Previous Chapter": "පෙර පරිච්ඡේදය", + "Next Chapter": "ඊළඟ පරිච්ඡේදය", + "Scroll Half Page Down": "අඩ පිටුවක් පහළට අනුචලනය", + "Scroll Half Page Up": "අඩ පිටුවක් ඉහළට අනුචලනය", + "Save Note": "සටහන සුරකින්න" } diff --git a/apps/readest-app/public/locales/sl/translation.json b/apps/readest-app/public/locales/sl/translation.json index 64eb1d30..f4774a4e 100644 --- a/apps/readest-app/public/locales/sl/translation.json +++ b/apps/readest-app/public/locales/sl/translation.json @@ -896,7 +896,6 @@ "Override Book Color": "Prezri barvo knjige", "None": "Brez", "Scroll": "Pomikanje", - "Continuous Scroll": "Neprekinjeno pomikanje", "Overlap Pixels": "Prekrivanje pikslov", "Pagination": "Paginacija", "Tap to Paginate": "Tapnite za paginacijo", @@ -1128,5 +1127,42 @@ "{{count}} books refreshed_few": "Osvežene {{count}} knjige", "{{count}} books refreshed_other": "Osveženih {{count}} knjig", "Failed to refresh metadata": "Osveževanje metapodatkov ni uspelo", - "Refresh Metadata": "Osveži metapodatke" + "Refresh Metadata": "Osveži metapodatke", + "Keyboard Shortcuts": "Bližnjice na tipkovnici", + "View all keyboard shortcuts": "Prikaži vse bližnjice na tipkovnici", + "Switch Sidebar Tab": "Preklopi zavihek stranske vrstice", + "Toggle Notebook": "Prikaži/skrij beležnico", + "Search in Book": "Išči v knjigi", + "Toggle Scroll Mode": "Preklopi način drsenja", + "Toggle Select Mode": "Preklopi način izbire", + "Toggle Bookmark": "Preklopi zaznamek", + "Toggle Text to Speech": "Preklopi besedilo v govor", + "Play / Pause TTS": "Predvajaj / Zaustavi TTS", + "Toggle Paragraph Mode": "Preklopi način odstavka", + "Highlight Selection": "Označi izbiro", + "Underline Selection": "Podčrtaj izbiro", + "Annotate Selection": "Dodaj opombo k izbiri", + "Search Selection": "Išči izbiro", + "Copy Selection": "Kopiraj izbiro", + "Translate Selection": "Prevedi izbiro", + "Dictionary Lookup": "Iskanje v slovarju", + "Wikipedia Lookup": "Iskanje na Wikipediji", + "Read Aloud Selection": "Preberi izbiro na glas", + "Proofread Selection": "Lektoriraj izbiro", + "Open Settings": "Odpri nastavitve", + "Open Command Palette": "Odpri ukazno paleto", + "Show Keyboard Shortcuts": "Prikaži bližnjice na tipkovnici", + "Open Books": "Odpri knjige", + "Toggle Fullscreen": "Preklopi celoten zaslon", + "Close Window": "Zapri okno", + "Quit App": "Zapri aplikacijo", + "Go Left / Previous Page": "Levo / Prejšnja stran", + "Go Right / Next Page": "Desno / Naslednja stran", + "Go Up": "Navzgor", + "Go Down": "Navzdol", + "Previous Chapter": "Prejšnje poglavje", + "Next Chapter": "Naslednje poglavje", + "Scroll Half Page Down": "Drsi pol strani navzdol", + "Scroll Half Page Up": "Drsi pol strani navzgor", + "Save Note": "Shrani opombo" } diff --git a/apps/readest-app/public/locales/sv/translation.json b/apps/readest-app/public/locales/sv/translation.json index f04e3b63..a4724d32 100644 --- a/apps/readest-app/public/locales/sv/translation.json +++ b/apps/readest-app/public/locales/sv/translation.json @@ -446,7 +446,6 @@ "Enable Highlighting": "Aktivera markering", "Code Language": "Kodspråk", "Scroll": "Rullning", - "Continuous Scroll": "Kontinuerlig rullning", "Overlap Pixels": "Överlappande pixlar", "Disable Double Click": "Inaktivera dubbelklick", "Volume Keys for Page Flip": "Volymknappar för sidbyte", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} bok uppdaterad", "{{count}} books refreshed_other": "{{count}} böcker uppdaterade", "Failed to refresh metadata": "Kunde inte uppdatera metadata", - "Refresh Metadata": "Uppdatera metadata" + "Refresh Metadata": "Uppdatera metadata", + "Keyboard Shortcuts": "Tangentbordsgenvägar", + "View all keyboard shortcuts": "Visa alla tangentbordsgenvägar", + "Switch Sidebar Tab": "Byt flik i sidofältet", + "Toggle Notebook": "Visa/dölj anteckningsbok", + "Search in Book": "Sök i boken", + "Toggle Scroll Mode": "Växla rullningsläge", + "Toggle Select Mode": "Växla markeringsläge", + "Toggle Bookmark": "Växla bokmärke", + "Toggle Text to Speech": "Växla text-till-tal", + "Play / Pause TTS": "Spela upp / Pausa TTS", + "Toggle Paragraph Mode": "Växla styckeläge", + "Highlight Selection": "Markera urval", + "Underline Selection": "Stryka under urval", + "Annotate Selection": "Kommentera urval", + "Search Selection": "Sök urval", + "Copy Selection": "Kopiera urval", + "Translate Selection": "Översätt urval", + "Dictionary Lookup": "Slå upp i ordbok", + "Wikipedia Lookup": "Slå upp på Wikipedia", + "Read Aloud Selection": "Läs upp urval", + "Proofread Selection": "Korrekturläs urval", + "Open Settings": "Öppna inställningar", + "Open Command Palette": "Öppna kommandopaletten", + "Show Keyboard Shortcuts": "Visa tangentbordsgenvägar", + "Open Books": "Öppna böcker", + "Toggle Fullscreen": "Växla helskärm", + "Close Window": "Stäng fönster", + "Quit App": "Avsluta appen", + "Go Left / Previous Page": "Vänster / Föregående sida", + "Go Right / Next Page": "Höger / Nästa sida", + "Go Up": "Uppåt", + "Go Down": "Nedåt", + "Previous Chapter": "Föregående kapitel", + "Next Chapter": "Nästa kapitel", + "Scroll Half Page Down": "Rulla en halv sida nedåt", + "Scroll Half Page Up": "Rulla en halv sida uppåt", + "Save Note": "Spara anteckning" } diff --git a/apps/readest-app/public/locales/ta/translation.json b/apps/readest-app/public/locales/ta/translation.json index 61b05fb9..e4b0f92f 100644 --- a/apps/readest-app/public/locales/ta/translation.json +++ b/apps/readest-app/public/locales/ta/translation.json @@ -199,7 +199,6 @@ "Auto": "தானியங்கி", "Scroll": "உருட்டவும்", "Scrolled Mode": "உருட்டல் பயன்முறை", - "Continuous Scroll": "தொடர்ச்சியான உருட்டல்", "Overlap Pixels": "ஒன்றுடன் ஒன்று பிக்சல்கள்", "Disable Double Click": "இரட்டை கிளிக்கை முடக்கவும்", "Volume Keys for Page Flip": "பக்கம் புரட்டுவதற்கு ஒலி விசைகள்", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} புத்தகம் புதுப்பிக்கப்பட்டது", "{{count}} books refreshed_other": "{{count}} புத்தகங்கள் புதுப்பிக்கப்பட்டன", "Failed to refresh metadata": "மெட்டாடேட்டா புதுப்பிப்பு தோல்வி", - "Refresh Metadata": "மெட்டாடேட்டா புதுப்பிக்கவும்" + "Refresh Metadata": "மெட்டாடேட்டா புதுப்பிக்கவும்", + "Keyboard Shortcuts": "விசைப்பலகை குறுக்குவழிகள்", + "View all keyboard shortcuts": "அனைத்து விசைப்பலகை குறுக்குவழிகளையும் காண்க", + "Switch Sidebar Tab": "பக்கப்பட்டி தாவலை மாற்றுக", + "Toggle Notebook": "குறிப்பேட்டைக் காட்டு/மறை", + "Search in Book": "புத்தகத்தில் தேடுக", + "Toggle Scroll Mode": "உருள் பயன்முறையை மாற்றுக", + "Toggle Select Mode": "தேர்வு பயன்முறையை மாற்றுக", + "Toggle Bookmark": "புக்மார்க்கை மாற்றுக", + "Toggle Text to Speech": "உரையிலிருந்து பேச்சுக்கு மாற்றுக", + "Play / Pause TTS": "TTS இயக்கு / இடைநிறுத்து", + "Toggle Paragraph Mode": "பத்தி பயன்முறையை மாற்றுக", + "Highlight Selection": "தேர்வை சிறப்பிக்கவும்", + "Underline Selection": "தேர்வுக்கு அடிக்கோடிடுக", + "Annotate Selection": "தேர்வுக்கு குறிப்பு சேர்க்கவும்", + "Search Selection": "தேர்வைத் தேடுக", + "Copy Selection": "தேர்வை நகலெடுக்கவும்", + "Translate Selection": "தேர்வை மொழிபெயர்க்கவும்", + "Dictionary Lookup": "அகராதியில் தேடுக", + "Wikipedia Lookup": "விக்கிப்பீடியாவில் தேடுக", + "Read Aloud Selection": "தேர்வை சத்தமாக படிக்கவும்", + "Proofread Selection": "தேர்வை சரிபார்க்கவும்", + "Open Settings": "அமைப்புகளைத் திறக்கவும்", + "Open Command Palette": "கட்டளை தட்டை திறக்கவும்", + "Show Keyboard Shortcuts": "விசைப்பலகை குறுக்குவழிகளைக் காட்டுக", + "Open Books": "புத்தகங்களைத் திறக்கவும்", + "Toggle Fullscreen": "முழுத்திரையை மாற்றுக", + "Close Window": "சாளரத்தை மூடுக", + "Quit App": "பயன்பாட்டிலிருந்து வெளியேறுக", + "Go Left / Previous Page": "இடது / முந்தைய பக்கம்", + "Go Right / Next Page": "வலது / அடுத்த பக்கம்", + "Go Up": "மேலே", + "Go Down": "கீழே", + "Previous Chapter": "முந்தைய அத்தியாயம்", + "Next Chapter": "அடுத்த அத்தியாயம்", + "Scroll Half Page Down": "அரை பக்கம் கீழே உருட்டுக", + "Scroll Half Page Up": "அரை பக்கம் மேலே உருட்டுக", + "Save Note": "குறிப்பைச் சேமிக்கவும்" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index 58ec3c44..646013f4 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -164,7 +164,6 @@ "Code Language": "ภาษาโค้ด", "Scroll": "เลื่อน", "Scrolled Mode": "โหมดเลื่อน", - "Continuous Scroll": "เลื่อนต่อเนื่อง", "Overlap Pixels": "พิกเซลซ้อน", "Volume Keys for Page Flip": "ปุ่มเสียงเพื่อพลิกหน้า", "Animation": "ภาพเคลื่อนไหว", @@ -1089,5 +1088,42 @@ "Loading library...": "กำลังโหลดห้องสมุด...", "{{count}} books refreshed_other": "รีเฟรชแล้ว {{count}} เล่ม", "Failed to refresh metadata": "รีเฟรชข้อมูลเมตาล้มเหลว", - "Refresh Metadata": "รีเฟรชข้อมูลเมตา" + "Refresh Metadata": "รีเฟรชข้อมูลเมตา", + "Keyboard Shortcuts": "แป้นพิมพ์ลัด", + "View all keyboard shortcuts": "ดูแป้นพิมพ์ลัดทั้งหมด", + "Switch Sidebar Tab": "สลับแท็บแถบด้านข้าง", + "Toggle Notebook": "แสดง/ซ่อนสมุดบันทึก", + "Search in Book": "ค้นหาในหนังสือ", + "Toggle Scroll Mode": "สลับโหมดเลื่อน", + "Toggle Select Mode": "สลับโหมดเลือก", + "Toggle Bookmark": "สลับที่คั่นหนังสือ", + "Toggle Text to Speech": "สลับข้อความเป็นเสียง", + "Play / Pause TTS": "เล่น / หยุดชั่วคราว TTS", + "Toggle Paragraph Mode": "สลับโหมดย่อหน้า", + "Highlight Selection": "ไฮไลต์ข้อความที่เลือก", + "Underline Selection": "ขีดเส้นใต้ข้อความที่เลือก", + "Annotate Selection": "เพิ่มหมายเหตุให้ข้อความที่เลือก", + "Search Selection": "ค้นหาข้อความที่เลือก", + "Copy Selection": "คัดลอกข้อความที่เลือก", + "Translate Selection": "แปลข้อความที่เลือก", + "Dictionary Lookup": "ค้นหาในพจนานุกรม", + "Wikipedia Lookup": "ค้นหาใน Wikipedia", + "Read Aloud Selection": "อ่านออกเสียงข้อความที่เลือก", + "Proofread Selection": "ตรวจทานข้อความที่เลือก", + "Open Settings": "เปิดการตั้งค่า", + "Open Command Palette": "เปิดแถบคำสั่ง", + "Show Keyboard Shortcuts": "แสดงแป้นพิมพ์ลัด", + "Open Books": "เปิดหนังสือ", + "Toggle Fullscreen": "สลับเต็มหน้าจอ", + "Close Window": "ปิดหน้าต่าง", + "Quit App": "ออกจากแอป", + "Go Left / Previous Page": "ไปซ้าย / หน้าก่อนหน้า", + "Go Right / Next Page": "ไปขวา / หน้าถัดไป", + "Go Up": "ขึ้น", + "Go Down": "ลง", + "Previous Chapter": "บทก่อนหน้า", + "Next Chapter": "บทถัดไป", + "Scroll Half Page Down": "เลื่อนลงครึ่งหน้า", + "Scroll Half Page Up": "เลื่อนขึ้นครึ่งหน้า", + "Save Note": "บันทึกโน้ต" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index f030f0cd..2ceaba15 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "RTL Yönü", "Maximum Column Height": "Maksimum Sütun Yüksekliği", "Maximum Column Width": "Maksimum Sütun Genişliği", - "Continuous Scroll": "Sürekli Kaydırma", "Fullscreen": "Tam Ekran", "No supported files found. Supported formats: {{formats}}": "Desteklenen dosya bulunamadı. Desteklenen formatlar: {{formats}}", "Drop to Import Books": "Kitapları İçe Aktarmak İçin Bırak", @@ -1102,5 +1101,42 @@ "{{count}} books refreshed_one": "{{count}} kitap yenilendi", "{{count}} books refreshed_other": "{{count}} kitap yenilendi", "Failed to refresh metadata": "Meta veri yenileme başarısız", - "Refresh Metadata": "Meta Verileri Yenile" + "Refresh Metadata": "Meta Verileri Yenile", + "Keyboard Shortcuts": "Klavye Kısayolları", + "View all keyboard shortcuts": "Tüm klavye kısayollarını görüntüle", + "Switch Sidebar Tab": "Kenar çubuğu sekmesini değiştir", + "Toggle Notebook": "Not defterini göster/gizle", + "Search in Book": "Kitapta ara", + "Toggle Scroll Mode": "Kaydırma modunu değiştir", + "Toggle Select Mode": "Seçim modunu değiştir", + "Toggle Bookmark": "Yer imini değiştir", + "Toggle Text to Speech": "Metinden konuşmayı değiştir", + "Play / Pause TTS": "TTS Oynat / Duraklat", + "Toggle Paragraph Mode": "Paragraf modunu değiştir", + "Highlight Selection": "Seçimi vurgula", + "Underline Selection": "Seçimin altını çiz", + "Annotate Selection": "Seçime not ekle", + "Search Selection": "Seçimi ara", + "Copy Selection": "Seçimi kopyala", + "Translate Selection": "Seçimi çevir", + "Dictionary Lookup": "Sözlükte ara", + "Wikipedia Lookup": "Wikipedia'da ara", + "Read Aloud Selection": "Seçimi sesli oku", + "Proofread Selection": "Seçimi düzelt", + "Open Settings": "Ayarları aç", + "Open Command Palette": "Komut paletini aç", + "Show Keyboard Shortcuts": "Klavye kısayollarını göster", + "Open Books": "Kitapları aç", + "Toggle Fullscreen": "Tam ekranı değiştir", + "Close Window": "Pencereyi kapat", + "Quit App": "Uygulamadan çık", + "Go Left / Previous Page": "Sola git / Önceki sayfa", + "Go Right / Next Page": "Sağa git / Sonraki sayfa", + "Go Up": "Yukarı", + "Go Down": "Aşağı", + "Previous Chapter": "Önceki bölüm", + "Next Chapter": "Sonraki bölüm", + "Scroll Half Page Down": "Yarım sayfa aşağı kaydır", + "Scroll Half Page Up": "Yarım sayfa yukarı kaydır", + "Save Note": "Notu kaydet" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 6e0cda65..3792a1f7 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Напрямок RTL", "Maximum Column Height": "Максимальна висота колонки", "Maximum Column Width": "Максимальна ширина колонки", - "Continuous Scroll": "Постійна прокрутка", "Fullscreen": "Повноекранний", "No supported files found. Supported formats: {{formats}}": "Не знайдено підтримуваних файлів. Підтримувані формати: {{formats}}", "Drop to Import Books": "Перетягніть для імпорту книг", @@ -1128,5 +1127,42 @@ "{{count}} books refreshed_many": "Оновлено {{count}} книг", "{{count}} books refreshed_other": "Оновлено {{count}} книг", "Failed to refresh metadata": "Не вдалося оновити метадані", - "Refresh Metadata": "Оновити метадані" + "Refresh Metadata": "Оновити метадані", + "Keyboard Shortcuts": "Комбінації клавіш", + "View all keyboard shortcuts": "Переглянути всі комбінації клавіш", + "Switch Sidebar Tab": "Перемкнути вкладку бічної панелі", + "Toggle Notebook": "Показати/сховати блокнот", + "Search in Book": "Пошук у книзі", + "Toggle Scroll Mode": "Перемкнути режим прокрутки", + "Toggle Select Mode": "Перемкнути режим виділення", + "Toggle Bookmark": "Перемкнути закладку", + "Toggle Text to Speech": "Перемкнути озвучення тексту", + "Play / Pause TTS": "Відтворити / Пауза TTS", + "Toggle Paragraph Mode": "Перемкнути режим абзацу", + "Highlight Selection": "Виділити вибране", + "Underline Selection": "Підкреслити вибране", + "Annotate Selection": "Додати примітку до вибраного", + "Search Selection": "Шукати вибране", + "Copy Selection": "Копіювати вибране", + "Translate Selection": "Перекласти вибране", + "Dictionary Lookup": "Пошук у словнику", + "Wikipedia Lookup": "Пошук у Вікіпедії", + "Read Aloud Selection": "Прочитати вибране вголос", + "Proofread Selection": "Перевірити вибране", + "Open Settings": "Відкрити налаштування", + "Open Command Palette": "Відкрити палітру команд", + "Show Keyboard Shortcuts": "Показати комбінації клавіш", + "Open Books": "Відкрити книги", + "Toggle Fullscreen": "Перемкнути повноекранний режим", + "Close Window": "Закрити вікно", + "Quit App": "Вийти з програми", + "Go Left / Previous Page": "Вліво / Попередня сторінка", + "Go Right / Next Page": "Вправо / Наступна сторінка", + "Go Up": "Вгору", + "Go Down": "Вниз", + "Previous Chapter": "Попередній розділ", + "Next Chapter": "Наступний розділ", + "Scroll Half Page Down": "Прокрутити на півсторінки вниз", + "Scroll Half Page Up": "Прокрутити на півсторінки вгору", + "Save Note": "Зберегти нотатку" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 0282e4f0..88d325b9 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "Hướng RTL", "Maximum Column Height": "Chiều cao cột tối đa", "Maximum Column Width": "Chiều rộng cột tối đa", - "Continuous Scroll": "Cuộn liên tục", "Fullscreen": "Toàn màn hình", "No supported files found. Supported formats: {{formats}}": "Không tìm thấy tệp được hỗ trợ. Định dạng được hỗ trợ: {{formats}}", "Drop to Import Books": "Kéo và thả để nhập sách", @@ -1089,5 +1088,42 @@ "Loading library...": "Đang tải thư viện...", "{{count}} books refreshed_other": "Đã làm mới {{count}} sách", "Failed to refresh metadata": "Không thể làm mới siêu dữ liệu", - "Refresh Metadata": "Làm mới siêu dữ liệu" + "Refresh Metadata": "Làm mới siêu dữ liệu", + "Keyboard Shortcuts": "Phím tắt", + "View all keyboard shortcuts": "Xem tất cả phím tắt", + "Switch Sidebar Tab": "Chuyển tab thanh bên", + "Toggle Notebook": "Hiện/ẩn sổ ghi chú", + "Search in Book": "Tìm kiếm trong sách", + "Toggle Scroll Mode": "Chuyển chế độ cuộn", + "Toggle Select Mode": "Chuyển chế độ chọn", + "Toggle Bookmark": "Bật/tắt đánh dấu", + "Toggle Text to Speech": "Bật/tắt đọc văn bản", + "Play / Pause TTS": "Phát / Tạm dừng TTS", + "Toggle Paragraph Mode": "Chuyển chế độ đoạn văn", + "Highlight Selection": "Tô sáng vùng chọn", + "Underline Selection": "Gạch chân vùng chọn", + "Annotate Selection": "Thêm ghi chú cho vùng chọn", + "Search Selection": "Tìm kiếm vùng chọn", + "Copy Selection": "Sao chép vùng chọn", + "Translate Selection": "Dịch vùng chọn", + "Dictionary Lookup": "Tra từ điển", + "Wikipedia Lookup": "Tra cứu Wikipedia", + "Read Aloud Selection": "Đọc to vùng chọn", + "Proofread Selection": "Kiểm tra vùng chọn", + "Open Settings": "Mở cài đặt", + "Open Command Palette": "Mở bảng lệnh", + "Show Keyboard Shortcuts": "Hiển thị phím tắt", + "Open Books": "Mở sách", + "Toggle Fullscreen": "Chuyển toàn màn hình", + "Close Window": "Đóng cửa sổ", + "Quit App": "Thoát ứng dụng", + "Go Left / Previous Page": "Sang trái / Trang trước", + "Go Right / Next Page": "Sang phải / Trang tiếp", + "Go Up": "Lên trên", + "Go Down": "Xuống dưới", + "Previous Chapter": "Chương trước", + "Next Chapter": "Chương tiếp", + "Scroll Half Page Down": "Cuộn xuống nửa trang", + "Scroll Half Page Up": "Cuộn lên nửa trang", + "Save Note": "Lưu ghi chú" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index edc1e7df..b03bb340 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -185,7 +185,6 @@ "RTL Direction": "从右向左", "Maximum Column Height": "最大列高", "Maximum Column Width": "最大列宽", - "Continuous Scroll": "连续滚动", "Fullscreen": "全屏显示", "No supported files found. Supported formats: {{formats}}": "未找到支持的文件。支持的格式:{{formats}}", "Drop to Import Books": "拖放导入书籍", @@ -1089,5 +1088,42 @@ "Loading library...": "正在加载书库...", "{{count}} books refreshed_other": "已刷新 {{count}} 本书", "Failed to refresh metadata": "刷新元数据失败", - "Refresh Metadata": "刷新元数据" + "Refresh Metadata": "刷新元数据", + "Keyboard Shortcuts": "键盘快捷键", + "View all keyboard shortcuts": "查看所有键盘快捷键", + "Switch Sidebar Tab": "切换侧边栏标签", + "Toggle Notebook": "显示/隐藏笔记本", + "Search in Book": "在书中搜索", + "Toggle Scroll Mode": "切换滚动模式", + "Toggle Select Mode": "切换选择模式", + "Toggle Bookmark": "切换书签", + "Toggle Text to Speech": "切换文字转语音", + "Play / Pause TTS": "播放 / 暂停朗读", + "Toggle Paragraph Mode": "切换段落模式", + "Highlight Selection": "高亮选中内容", + "Underline Selection": "为选中内容添加下划线", + "Annotate Selection": "为选中内容添加注释", + "Search Selection": "搜索选中内容", + "Copy Selection": "复制选中内容", + "Translate Selection": "翻译选中内容", + "Dictionary Lookup": "词典查询", + "Wikipedia Lookup": "维基百科查询", + "Read Aloud Selection": "朗读选中内容", + "Proofread Selection": "校对选中内容", + "Open Settings": "打开设置", + "Open Command Palette": "打开命令面板", + "Show Keyboard Shortcuts": "显示键盘快捷键", + "Open Books": "打开书库", + "Toggle Fullscreen": "切换全屏", + "Close Window": "关闭窗口", + "Quit App": "退出应用", + "Go Left / Previous Page": "向左 / 上一页", + "Go Right / Next Page": "向右 / 下一页", + "Go Up": "向上", + "Go Down": "向下", + "Previous Chapter": "上一章", + "Next Chapter": "下一章", + "Scroll Half Page Down": "向下滚动半页", + "Scroll Half Page Up": "向上滚动半页", + "Save Note": "保存笔记" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index e061fcfd..70d3547a 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -184,7 +184,6 @@ "RTL Direction": "從右向左", "Maximum Column Height": "最大列高", "Maximum Column Width": "最大列寬", - "Continuous Scroll": "連續滾動", "Fullscreen": "全螢幕", "No supported files found. Supported formats: {{formats}}": "未找到支援的檔案。支援的格式:{{formats}}", "Drop to Import Books": "拖放導入書籍", @@ -1089,5 +1088,42 @@ "Loading library...": "正在載入書庫...", "{{count}} books refreshed_other": "已重新整理 {{count}} 本書", "Failed to refresh metadata": "重新整理中繼資料失敗", - "Refresh Metadata": "重新整理中繼資料" + "Refresh Metadata": "重新整理中繼資料", + "Keyboard Shortcuts": "鍵盤快捷鍵", + "View all keyboard shortcuts": "查看所有鍵盤快捷鍵", + "Switch Sidebar Tab": "切換側邊欄標籤", + "Toggle Notebook": "顯示/隱藏筆記本", + "Search in Book": "在書中搜尋", + "Toggle Scroll Mode": "切換捲動模式", + "Toggle Select Mode": "切換選取模式", + "Toggle Bookmark": "切換書籤", + "Toggle Text to Speech": "切換文字轉語音", + "Play / Pause TTS": "播放 / 暫停朗讀", + "Toggle Paragraph Mode": "切換段落模式", + "Highlight Selection": "醒目標示選取內容", + "Underline Selection": "為選取內容加底線", + "Annotate Selection": "為選取內容加註釋", + "Search Selection": "搜尋選取內容", + "Copy Selection": "複製選取內容", + "Translate Selection": "翻譯選取內容", + "Dictionary Lookup": "字典查詢", + "Wikipedia Lookup": "維基百科查詢", + "Read Aloud Selection": "朗讀選取內容", + "Proofread Selection": "校對選取內容", + "Open Settings": "開啟設定", + "Open Command Palette": "開啟指令面板", + "Show Keyboard Shortcuts": "顯示鍵盤快捷鍵", + "Open Books": "開啟書庫", + "Toggle Fullscreen": "切換全螢幕", + "Close Window": "關閉視窗", + "Quit App": "結束應用程式", + "Go Left / Previous Page": "向左 / 上一頁", + "Go Right / Next Page": "向右 / 下一頁", + "Go Up": "向上", + "Go Down": "向下", + "Previous Chapter": "上一章", + "Next Chapter": "下一章", + "Scroll Half Page Down": "向下捲動半頁", + "Scroll Half Page Up": "向上捲動半頁", + "Save Note": "儲存筆記" } diff --git a/apps/readest-app/src/__tests__/helpers/shortcuts.test.ts b/apps/readest-app/src/__tests__/helpers/shortcuts.test.ts index ed6e48d4..d7c917f8 100644 --- a/apps/readest-app/src/__tests__/helpers/shortcuts.test.ts +++ b/apps/readest-app/src/__tests__/helpers/shortcuts.test.ts @@ -1,41 +1,120 @@ import { describe, it, expect } from 'vitest'; -// Use dynamic import to avoid module resolution issues in test +const getModule = async () => { + return await import('../../helpers/shortcuts'); +}; + const getDefaults = async () => { - const mod = await import('../../helpers/shortcuts'); + const mod = await getModule(); return mod.loadShortcuts(); }; +describe('Shortcut entry structure', () => { + it('each shortcut entry has keys, description, and section', async () => { + const shortcuts = await getDefaults(); + for (const [name, entry] of Object.entries(shortcuts)) { + expect(entry, `${name} should have keys array`).toHaveProperty('keys'); + expect(Array.isArray(entry.keys), `${name}.keys should be an array`).toBe(true); + expect(entry, `${name} should have description`).toHaveProperty('description'); + expect(typeof entry.description, `${name}.description should be a string`).toBe('string'); + expect(entry, `${name} should have section`).toHaveProperty('section'); + } + }); +}); + describe('TTS play/pause shortcut', () => { it('should have onTTSPlayPause shortcut with space', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onTTSPlayPause).toEqual([' ']); + expect(shortcuts.onTTSPlayPause.keys).toEqual([' ']); }); it('should also have space in onGoRight as fallback', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onGoRight).toContain(' '); + expect(shortcuts.onGoRight.keys).toContain(' '); }); }); describe('TTS navigation shortcuts', () => { it('should have onTTSGoNextSentence shortcut with ctrl+] and cmd+]', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onTTSGoNextSentence).toEqual(['ctrl+]', 'cmd+]']); + expect(shortcuts.onTTSGoNextSentence.keys).toEqual(['ctrl+]', 'cmd+]']); }); it('should have onTTSGoPreviousSentence shortcut with ctrl+[ and cmd+[', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onTTSGoPreviousSentence).toEqual(['ctrl+[', 'cmd+[']); + expect(shortcuts.onTTSGoPreviousSentence.keys).toEqual(['ctrl+[', 'cmd+[']); }); it('should have onTTSGoNextParagraph shortcut with ctrl+shift+} and cmd+shift+}', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onTTSGoNextParagraph).toEqual(['ctrl+shift+}', 'cmd+shift+}']); + expect(shortcuts.onTTSGoNextParagraph.keys).toEqual(['ctrl+shift+}', 'cmd+shift+}']); }); it('should have onTTSGoPreviousParagraph shortcut with ctrl+shift+{ and cmd+shift+{', async () => { const shortcuts = await getDefaults(); - expect(shortcuts.onTTSGoPreviousParagraph).toEqual(['ctrl+shift+{', 'cmd+shift+{']); + expect(shortcuts.onTTSGoPreviousParagraph.keys).toEqual(['ctrl+shift+{', 'cmd+shift+{']); + }); +}); + +describe('getShortcutsForDisplay', () => { + it('returns sections in the correct order', async () => { + const mod = await getModule(); + const result = mod.getShortcutsForDisplay(true); + const sectionNames = result.map((s) => s.section); + expect(sectionNames).toEqual([ + 'General', + 'Navigation', + 'Text to Speech', + 'Selection', + 'Zoom', + 'Window', + ]); + }); + + it('excludes entries with empty section', async () => { + const mod = await getModule(); + const result = mod.getShortcutsForDisplay(true); + const allDescriptions = result.flatMap((s) => s.items.map((i) => i.description)); + // onEscape and onSaveNote have empty section, should be excluded + const shortcuts = mod.loadShortcuts(); + const hiddenEntries = Object.values(shortcuts).filter((e) => e.section === ''); + for (const hidden of hiddenEntries) { + expect(allDescriptions).not.toContain(hidden.description); + } + }); + + it('each item has a description and non-empty keys', async () => { + const mod = await getModule(); + const result = mod.getShortcutsForDisplay(false); + for (const section of result) { + for (const item of section.items) { + expect(item.description.length).toBeGreaterThan(0); + expect(item.keys.length).toBeGreaterThan(0); + } + } + }); + + it('on Mac, returns cmd-prefixed keys for onShowSearchBar', async () => { + const mod = await getModule(); + const result = mod.getShortcutsForDisplay(true); + const general = result.find((s) => s.section === 'General'); + const searchItem = general?.items.find((i) => + i.keys.some((k) => k.includes('cmd') || k.includes('f')), + ); + expect(searchItem).toBeDefined(); + expect(searchItem!.keys.some((k) => k.includes('cmd'))).toBe(true); + expect(searchItem!.keys.some((k) => k.includes('ctrl'))).toBe(false); + }); + + it('on non-Mac, returns ctrl-prefixed keys for onShowSearchBar', async () => { + const mod = await getModule(); + const result = mod.getShortcutsForDisplay(false); + const general = result.find((s) => s.section === 'General'); + const searchItem = general?.items.find((i) => + i.keys.some((k) => k.includes('ctrl') || k.includes('f')), + ); + expect(searchItem).toBeDefined(); + expect(searchItem!.keys.some((k) => k.includes('ctrl'))).toBe(true); + expect(searchItem!.keys.some((k) => k.includes('cmd'))).toBe(false); }); }); diff --git a/apps/readest-app/src/__tests__/utils/shortcutKeys.test.ts b/apps/readest-app/src/__tests__/utils/shortcutKeys.test.ts new file mode 100644 index 00000000..21bc1ed0 --- /dev/null +++ b/apps/readest-app/src/__tests__/utils/shortcutKeys.test.ts @@ -0,0 +1,129 @@ +import { describe, it, expect } from 'vitest'; +import { formatKeyForDisplay, filterPlatformKeys } from '../../utils/shortcutKeys'; + +describe('formatKeyForDisplay', () => { + describe('Mac platform', () => { + it('maps ctrl to ⌘', () => { + expect(formatKeyForDisplay('ctrl+f', true)).toBe('⌘F'); + }); + + it('maps cmd to ⌘', () => { + expect(formatKeyForDisplay('cmd+f', true)).toBe('⌘F'); + }); + + it('maps alt/opt to ⌥', () => { + expect(formatKeyForDisplay('alt+ArrowLeft', true)).toBe('⌥←'); + expect(formatKeyForDisplay('opt+ArrowLeft', true)).toBe('⌥←'); + }); + + it('maps shift to ⇧', () => { + expect(formatKeyForDisplay('shift+j', true)).toBe('⇧J'); + }); + + it('concatenates without separator on Mac', () => { + expect(formatKeyForDisplay('cmd+shift+p', true)).toBe('⌘⇧P'); + }); + }); + + describe('non-Mac platform', () => { + it('maps ctrl to Ctrl', () => { + expect(formatKeyForDisplay('ctrl+f', false)).toBe('Ctrl+F'); + }); + + it('maps alt to Alt', () => { + expect(formatKeyForDisplay('alt+ArrowLeft', false)).toBe('Alt+←'); + }); + + it('maps shift to Shift', () => { + expect(formatKeyForDisplay('shift+j', false)).toBe('Shift+J'); + }); + + it('joins with + on non-Mac', () => { + expect(formatKeyForDisplay('ctrl+shift+p', false)).toBe('Ctrl+Shift+P'); + }); + }); + + describe('special keys', () => { + it('maps arrow keys to symbols', () => { + expect(formatKeyForDisplay('ArrowLeft', false)).toBe('←'); + expect(formatKeyForDisplay('ArrowRight', false)).toBe('→'); + expect(formatKeyForDisplay('ArrowUp', false)).toBe('↑'); + expect(formatKeyForDisplay('ArrowDown', false)).toBe('↓'); + }); + + it('maps space to Space', () => { + expect(formatKeyForDisplay(' ', false)).toBe('Space'); + }); + + it('maps Escape to Esc', () => { + expect(formatKeyForDisplay('Escape', false)).toBe('Esc'); + }); + + it('maps PageDown and PageUp', () => { + expect(formatKeyForDisplay('PageDown', false)).toBe('PgDn'); + expect(formatKeyForDisplay('PageUp', false)).toBe('PgUp'); + }); + + it('preserves F-keys', () => { + expect(formatKeyForDisplay('F11', false)).toBe('F11'); + }); + + it('preserves Tab and Enter', () => { + expect(formatKeyForDisplay('Tab', false)).toBe('Tab'); + expect(formatKeyForDisplay('Enter', false)).toBe('Enter'); + }); + }); + + describe('single character keys', () => { + it('capitalizes single letter keys', () => { + expect(formatKeyForDisplay('s', false)).toBe('S'); + expect(formatKeyForDisplay('s', true)).toBe('S'); + }); + + it('preserves special characters', () => { + expect(formatKeyForDisplay(']', false)).toBe(']'); + expect(formatKeyForDisplay('[', false)).toBe('['); + }); + }); +}); + +describe('filterPlatformKeys', () => { + it('on Mac, prefers cmd/opt keys over ctrl/alt', () => { + expect(filterPlatformKeys(['ctrl+f', 'cmd+f'], true)).toEqual(['cmd+f']); + }); + + it('on non-Mac, prefers ctrl/alt keys over cmd/opt', () => { + expect(filterPlatformKeys(['ctrl+f', 'cmd+f'], false)).toEqual(['ctrl+f']); + }); + + it('includes platform-agnostic keys on both platforms', () => { + expect(filterPlatformKeys(['s'], true)).toEqual(['s']); + expect(filterPlatformKeys(['s'], false)).toEqual(['s']); + }); + + it('on Mac, prefers opt over alt', () => { + expect(filterPlatformKeys(['opt+ArrowLeft', 'alt+ArrowLeft'], true)).toEqual(['opt+ArrowLeft']); + }); + + it('on non-Mac, prefers alt over opt', () => { + expect(filterPlatformKeys(['opt+ArrowLeft', 'alt+ArrowLeft'], false)).toEqual([ + 'alt+ArrowLeft', + ]); + }); + + it('returns all keys when none are platform-specific', () => { + expect(filterPlatformKeys(['ArrowLeft', 'h', 'shift+ '], true)).toEqual([ + 'ArrowLeft', + 'h', + 'shift+ ', + ]); + }); + + it('mixes platform-specific and agnostic keys', () => { + expect(filterPlatformKeys(['shift+f', 'ctrl+,', 'cmd+,'], true)).toEqual(['shift+f', 'cmd+,']); + expect(filterPlatformKeys(['shift+f', 'ctrl+,', 'cmd+,'], false)).toEqual([ + 'shift+f', + 'ctrl+,', + ]); + }); +}); diff --git a/apps/readest-app/src/app/library/page.tsx b/apps/readest-app/src/app/library/page.tsx index 6d5eceb1..7bcadd5f 100644 --- a/apps/readest-app/src/app/library/page.tsx +++ b/apps/readest-app/src/app/library/page.tsx @@ -54,6 +54,7 @@ import { import { LibraryGroupByType } from '@/types/settings'; import { BookMetadata } from '@/libs/document'; import { AboutWindow } from '@/components/AboutWindow'; +import { KeyboardShortcutsHelp } from '@/components/KeyboardShortcutsHelp'; import { BookDetailModal } from '@/components/metadata'; import { UpdaterWindow } from '@/components/UpdaterWindow'; import { CatalogDialog } from './components/OPDSDialog'; @@ -968,6 +969,7 @@ const LibraryPageContent = ({ searchParams }: { searchParams: ReadonlyURLSearchP )} + diff --git a/apps/readest-app/src/app/reader/components/Reader.tsx b/apps/readest-app/src/app/reader/components/Reader.tsx index c6ba2fad..abe27f21 100644 --- a/apps/readest-app/src/app/reader/components/Reader.tsx +++ b/apps/readest-app/src/app/reader/components/Reader.tsx @@ -22,6 +22,7 @@ import { mountAdditionalFonts } from '@/styles/fonts'; import { isTauriAppPlatform } from '@/services/environment'; import { getSysFontsList, setSystemUIVisibility } from '@/utils/bridge'; import { AboutWindow } from '@/components/AboutWindow'; +import { KeyboardShortcutsHelp } from '@/components/KeyboardShortcutsHelp'; import { UpdaterWindow } from '@/components/UpdaterWindow'; import { KOSyncSettingsWindow } from './KOSyncSettings'; import { ReadwiseSettingsWindow } from './ReadwiseSettings'; @@ -168,6 +169,7 @@ const Reader: React.FC<{ ids?: string }> = ({ ids }) => { }> + diff --git a/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts b/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts index 004756a8..c8d74ee4 100644 --- a/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts +++ b/apps/readest-app/src/app/reader/hooks/useBookShortcuts.ts @@ -8,6 +8,7 @@ import { useBookDataStore } from '@/store/bookDataStore'; import { useCommandPalette } from '@/components/command-palette'; import { tauriHandleClose, tauriHandleToggleFullScreen, tauriQuitApp } from '@/utils/window'; import { eventDispatcher } from '@/utils/event'; +import { setShortcutsDialogVisible } from '@/components/KeyboardShortcutsHelp'; import { MAX_ZOOM_LEVEL, MIN_ZOOM_LEVEL, ZOOM_STEP } from '@/services/constants'; import { viewPagination } from './usePagination'; import { getStyles } from '@/utils/style'; @@ -334,6 +335,7 @@ const useBookShortcuts = ({ sideBarBookKey, bookKeys }: UseBookShortcutsProps) = onZoomOut: zoomOut, onResetZoom: resetZoom, onOpenCommandPalette: openCommandPalette, + onOpenShortcutsHelp: () => setShortcutsDialogVisible(true), }, [sideBarBookKey, bookKeys], ); diff --git a/apps/readest-app/src/components/KeyboardShortcutsHelp.tsx b/apps/readest-app/src/components/KeyboardShortcutsHelp.tsx new file mode 100644 index 00000000..ae5fd402 --- /dev/null +++ b/apps/readest-app/src/components/KeyboardShortcutsHelp.tsx @@ -0,0 +1,141 @@ +import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import { useTranslation } from '@/hooks/useTranslation'; +import { isMacPlatform } from '@/services/environment'; +import { getShortcutsForDisplay } from '@/helpers/shortcuts'; +import { formatKeyForDisplay } from '@/utils/shortcutKeys'; +import Dialog from './Dialog'; +import Link from './Link'; + +export const setShortcutsDialogVisible = (visible: boolean) => { + const dialog = document.getElementById('shortcuts_help'); + if (dialog) { + const event = new CustomEvent('setDialogVisibility', { + detail: { visible }, + }); + dialog.dispatchEvent(event); + } +}; + +export const KeyboardShortcutsHelp = () => { + const _ = useTranslation(); + const [isOpen, setIsOpen] = useState(false); + const isMac = isMacPlatform(); + + const sections = useMemo(() => getShortcutsForDisplay(isMac), [isMac]); + + // Split sections into two balanced columns by item count + const [leftColumn, rightColumn] = useMemo(() => { + const totalItems = sections.reduce((sum, s) => sum + s.items.length + 1, 0); // +1 for header + const left: typeof sections = []; + const right: typeof sections = []; + let leftCount = 0; + for (const section of sections) { + const sectionWeight = section.items.length + 1; + if (leftCount <= totalItems / 2) { + left.push(section); + leftCount += sectionWeight; + } else { + right.push(section); + } + } + return [left, right]; + }, [sections]); + + const renderSection = useCallback( + (section: (typeof sections)[number]) => ( +
+

+ {_(section.section)} +

+
+ {section.items.map((item) => ( +
+ {_(item.description)} +
+ {item.keys.map((key) => ( + + {formatKeyForDisplay(key, isMac)} + + ))} +
+
+ ))} +
+
+ ), + [_, isMac], + ); + + useEffect(() => { + const handleCustomEvent = (event: CustomEvent) => { + setIsOpen(event.detail.visible); + }; + + const el = document.getElementById('shortcuts_help'); + if (el) { + el.addEventListener('setDialogVisibility', handleCustomEvent as EventListener); + } + + return () => { + if (el) { + el.removeEventListener('setDialogVisibility', handleCustomEvent as EventListener); + } + }; + }, []); + + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key !== '?') return; + + const activeElement = document.activeElement as HTMLElement; + const isInteractive = + activeElement.tagName === 'INPUT' || + activeElement.tagName === 'TEXTAREA' || + activeElement.isContentEditable; + if (isInteractive) return; + + event.preventDefault(); + setIsOpen((prev) => !prev); + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, []); + + const handleClose = () => { + setIsOpen(false); + // Move focus away from the dialog so the '?' key listener works immediately + (document.activeElement as HTMLElement)?.blur(); + }; + + return ( + + {isOpen && ( +
+
+
{leftColumn.map(renderSection)}
+
{rightColumn.map(renderSection)}
+
+
+ + {_('View all keyboard shortcuts')} + +
+
+ )} +
+ ); +}; diff --git a/apps/readest-app/src/helpers/shortcuts.ts b/apps/readest-app/src/helpers/shortcuts.ts index 12e408da..b2e61c6d 100644 --- a/apps/readest-app/src/helpers/shortcuts.ts +++ b/apps/readest-app/src/helpers/shortcuts.ts @@ -1,71 +1,339 @@ +import { stubTranslation as _ } from '@/utils/misc'; +import { filterPlatformKeys } from '@/utils/shortcutKeys'; + +export type ShortcutEntry = { + keys: string[]; + description: string; + section: string; +}; + const DEFAULT_SHORTCUTS = { - onSwitchSideBar: ['ctrl+Tab', 'opt+Tab', 'alt+Tab'], - onToggleSideBar: ['s'], - onToggleNotebook: ['n'], - onShowSearchBar: ['ctrl+f', 'cmd+f'], - onToggleScrollMode: ['shift+j'], - onToggleSelectMode: ['shift+s'], - onToggleBookmark: ['ctrl+d', 'cmd+d'], - onToggleTTS: ['t'], - onTTSPlayPause: [' '], - onTTSGoNextSentence: ['ctrl+]', 'cmd+]'], - onTTSGoPreviousSentence: ['ctrl+[', 'cmd+['], - onTTSGoNextParagraph: ['ctrl+shift+}', 'cmd+shift+}'], - onTTSGoPreviousParagraph: ['ctrl+shift+{', 'cmd+shift+{'], - onToggleParagraphMode: ['shift+p'], - onHighlightSelection: ['ctrl+h', 'cmd+h'], - onUnderlineSelection: ['ctrl+u', 'cmd+u'], - onAnnotateSelection: ['ctrl+n', 'cmd+n'], - onSearchSelection: ['ctrl+f', 'cmd+f'], - onCopySelection: ['ctrl+c', 'cmd+c'], - onTranslateSelection: ['ctrl+t', 'cmd+t'], - onDictionarySelection: ['ctrl+d', 'cmd+d'], - onWikipediaSelection: ['ctrl+w', 'cmd+w'], - onReadAloudSelection: ['ctrl+r', 'cmd+r'], - onProofreadSelection: ['ctrl+p', 'cmd+p'], - onOpenFontLayoutSettings: ['shift+f', 'ctrl+,', 'cmd+,'], - onOpenCommandPalette: ['ctrl+shift+p', 'cmd+shift+p'], - onOpenBooks: ['ctrl+o'], - onReloadPage: ['shift+r'], - onToggleFullscreen: ['F11'], - onCloseWindow: ['ctrl+w', 'cmd+w'], - onQuitApp: ['ctrl+q', 'cmd+q'], - onGoLeft: ['ArrowLeft', 'h', 'shift+ '], - onGoRight: ['ArrowRight', 'l', ' '], - onGoUp: ['ArrowUp', 'k'], - onGoDown: ['ArrowDown', 'j'], - onGoNext: ['shift+j', 'shift+ArrowRight', 'shift+ArrowDown', 'PageDown'], - onGoPrev: ['shift+k', 'shift+ArrowLeft', 'shift+ArrowUp', 'PageUp'], - onGoLeftSection: ['opt+ArrowLeft', 'alt+ArrowLeft'], - onGoRightSection: ['opt+ArrowRight', 'alt+ArrowRight'], - onGoPrevSection: ['opt+ArrowUp', 'alt+ArrowUp'], - onGoNextSection: ['opt+ArrowDown', 'alt+ArrowDown'], - onGoHalfPageDown: ['shift+ArrowDown', 'd'], - onGoHalfPageUp: ['shift+ArrowUp', 'u'], - onGoBack: ['shift+ArrowLeft', 'shift+h', 'alt+ArrowLeft'], - onGoForward: ['shift+ArrowRight', 'shift+l', 'alt+ArrowRight'], - onZoomIn: ['ctrl+=', 'cmd+=', 'shift+='], - onZoomOut: ['ctrl+-', 'cmd+-', 'shift+-'], - onResetZoom: ['ctrl+0', 'cmd+0'], - onSaveNote: ['ctrl+Enter'], - onEscape: ['Escape'], + onSwitchSideBar: { + keys: ['ctrl+Tab', 'opt+Tab', 'alt+Tab'], + description: _('Switch Sidebar Tab'), + section: 'General', + }, + onToggleSideBar: { + keys: ['s'], + description: _('Toggle Sidebar'), + section: 'General', + }, + onToggleNotebook: { + keys: ['n'], + description: _('Toggle Notebook'), + section: 'General', + }, + onShowSearchBar: { + keys: ['ctrl+f', 'cmd+f'], + description: _('Search in Book'), + section: 'General', + }, + onToggleScrollMode: { + keys: ['shift+j'], + description: _('Toggle Scroll Mode'), + section: 'General', + }, + onToggleSelectMode: { + keys: ['shift+s'], + description: _('Toggle Select Mode'), + section: 'General', + }, + onToggleBookmark: { + keys: ['ctrl+d', 'cmd+d'], + description: _('Toggle Bookmark'), + section: 'General', + }, + onToggleTTS: { + keys: ['t'], + description: _('Toggle Text to Speech'), + section: 'Text to Speech', + }, + onTTSPlayPause: { + keys: [' '], + description: _('Play / Pause TTS'), + section: '', + }, + onTTSGoNextSentence: { + keys: ['ctrl+]', 'cmd+]'], + description: _('Next Sentence'), + section: 'Text to Speech', + }, + onTTSGoPreviousSentence: { + keys: ['ctrl+[', 'cmd+['], + description: _('Previous Sentence'), + section: 'Text to Speech', + }, + onTTSGoNextParagraph: { + keys: ['ctrl+shift+}', 'cmd+shift+}'], + description: _('Next Paragraph'), + section: 'Text to Speech', + }, + onTTSGoPreviousParagraph: { + keys: ['ctrl+shift+{', 'cmd+shift+{'], + description: _('Previous Paragraph'), + section: 'Text to Speech', + }, + onToggleParagraphMode: { + keys: ['shift+p'], + description: _('Toggle Paragraph Mode'), + section: 'General', + }, + onHighlightSelection: { + keys: ['ctrl+h', 'cmd+h'], + description: _('Highlight Selection'), + section: 'Selection', + }, + onUnderlineSelection: { + keys: ['ctrl+u', 'cmd+u'], + description: _('Underline Selection'), + section: 'Selection', + }, + onAnnotateSelection: { + keys: ['ctrl+n', 'cmd+n'], + description: _('Annotate Selection'), + section: 'Selection', + }, + onSearchSelection: { + keys: ['ctrl+f', 'cmd+f'], + description: _('Search Selection'), + section: 'Selection', + }, + onCopySelection: { + keys: ['ctrl+c', 'cmd+c'], + description: _('Copy Selection'), + section: 'Selection', + }, + onTranslateSelection: { + keys: ['ctrl+t', 'cmd+t'], + description: _('Translate Selection'), + section: 'Selection', + }, + onDictionarySelection: { + keys: ['ctrl+d', 'cmd+d'], + description: _('Dictionary Lookup'), + section: 'Selection', + }, + onWikipediaSelection: { + keys: ['ctrl+w', 'cmd+w'], + description: _('Wikipedia Lookup'), + section: 'Selection', + }, + onReadAloudSelection: { + keys: ['ctrl+r', 'cmd+r'], + description: _('Read Aloud Selection'), + section: 'Selection', + }, + onProofreadSelection: { + keys: ['ctrl+p', 'cmd+p'], + description: _('Proofread Selection'), + section: 'Selection', + }, + onOpenFontLayoutSettings: { + keys: ['shift+f', 'ctrl+,', 'cmd+,'], + description: _('Open Settings'), + section: 'General', + }, + onOpenCommandPalette: { + keys: ['ctrl+shift+p', 'cmd+shift+p'], + description: _('Open Command Palette'), + section: 'General', + }, + onOpenShortcutsHelp: { + keys: ['shift+?'], + description: _('Show Keyboard Shortcuts'), + section: 'General', + }, + onOpenBooks: { + keys: ['ctrl+o'], + description: _('Open Books'), + section: 'General', + }, + onReloadPage: { + keys: ['shift+r'], + description: _('Reload Page'), + section: 'General', + }, + onToggleFullscreen: { + keys: ['F11'], + description: _('Toggle Fullscreen'), + section: 'Window', + }, + onCloseWindow: { + keys: ['ctrl+w', 'cmd+w'], + description: _('Close Window'), + section: 'Window', + }, + onQuitApp: { + keys: ['ctrl+q', 'cmd+q'], + description: _('Quit App'), + section: 'Window', + }, + onGoLeft: { + keys: ['ArrowLeft', 'h', 'shift+ '], + description: _('Go Left / Previous Page'), + section: 'Navigation', + }, + onGoRight: { + keys: ['ArrowRight', 'l', ' '], + description: _('Go Right / Next Page'), + section: 'Navigation', + }, + onGoUp: { + keys: ['ArrowUp', 'k'], + description: _('Go Up'), + section: 'Navigation', + }, + onGoDown: { + keys: ['ArrowDown', 'j'], + description: _('Go Down'), + section: 'Navigation', + }, + onGoNext: { + keys: ['shift+j', 'shift+ArrowRight', 'shift+ArrowDown', 'PageDown'], + description: _('Next Page'), + section: 'Navigation', + }, + onGoPrev: { + keys: ['shift+k', 'shift+ArrowLeft', 'shift+ArrowUp', 'PageUp'], + description: _('Previous Page'), + section: 'Navigation', + }, + onGoLeftSection: { + keys: ['opt+ArrowLeft', 'alt+ArrowLeft'], + description: _('Previous Chapter'), + section: 'Navigation', + }, + onGoRightSection: { + keys: ['opt+ArrowRight', 'alt+ArrowRight'], + description: _('Next Chapter'), + section: 'Navigation', + }, + onGoPrevSection: { + keys: ['opt+ArrowUp', 'alt+ArrowUp'], + description: _('Previous Chapter'), + section: 'Navigation', + }, + onGoNextSection: { + keys: ['opt+ArrowDown', 'alt+ArrowDown'], + description: _('Next Chapter'), + section: 'Navigation', + }, + onGoHalfPageDown: { + keys: ['shift+ArrowDown', 'd'], + description: _('Scroll Half Page Down'), + section: 'Navigation', + }, + onGoHalfPageUp: { + keys: ['shift+ArrowUp', 'u'], + description: _('Scroll Half Page Up'), + section: 'Navigation', + }, + onGoBack: { + keys: ['shift+ArrowLeft', 'shift+h', 'alt+ArrowLeft'], + description: _('Go Back'), + section: 'Navigation', + }, + onGoForward: { + keys: ['shift+ArrowRight', 'shift+l', 'alt+ArrowRight'], + description: _('Go Forward'), + section: 'Navigation', + }, + onZoomIn: { + keys: ['ctrl+=', 'cmd+=', 'shift+='], + description: _('Zoom In'), + section: 'Zoom', + }, + onZoomOut: { + keys: ['ctrl+-', 'cmd+-', 'shift+-'], + description: _('Zoom Out'), + section: 'Zoom', + }, + onResetZoom: { + keys: ['ctrl+0', 'cmd+0'], + description: _('Reset Zoom'), + section: 'Zoom', + }, + onSaveNote: { + keys: ['ctrl+Enter'], + description: _('Save Note'), + section: '', + }, + onEscape: { + keys: ['Escape'], + description: _('Close'), + section: '', + }, }; export type ShortcutConfig = { - [K in keyof typeof DEFAULT_SHORTCUTS]: string[]; + [K in keyof typeof DEFAULT_SHORTCUTS]: ShortcutEntry; +}; + +export const SHORTCUT_SECTIONS = [ + 'General', + 'Navigation', + 'Text to Speech', + 'Selection', + 'Zoom', + 'Window', +] as const; + +type ShortcutDisplayItem = { + description: string; + keys: string[]; +}; + +type ShortcutDisplaySection = { + section: string; + items: ShortcutDisplayItem[]; +}; + +export const getShortcutsForDisplay = (isMac: boolean): ShortcutDisplaySection[] => { + const shortcuts = loadShortcuts(); + return SHORTCUT_SECTIONS.map((section) => { + const itemMap = new Map(); + for (const entry of Object.values(shortcuts)) { + if (entry.section !== section) continue; + const keys = filterPlatformKeys(entry.keys, isMac); + const existing = itemMap.get(entry.description); + if (existing) { + // Merge keys for entries with the same description + for (const key of keys) { + if (!existing.keys.includes(key)) { + existing.keys.push(key); + } + } + } else { + itemMap.set(entry.description, { description: entry.description, keys }); + } + } + return { section, items: Array.from(itemMap.values()) }; + }); }; // Load shortcuts from localStorage or fallback to defaults export const loadShortcuts = (): ShortcutConfig => { if (typeof localStorage === 'undefined') return DEFAULT_SHORTCUTS; const customShortcuts = JSON.parse(localStorage.getItem('customShortcuts') || '{}'); - return { - ...DEFAULT_SHORTCUTS, - ...customShortcuts, - }; + const result = { ...DEFAULT_SHORTCUTS }; + for (const [key, value] of Object.entries(customShortcuts)) { + const shortcutKey = key as keyof ShortcutConfig; + if (shortcutKey in result) { + // Custom overrides only replace keys, preserving description and section + if (Array.isArray(value)) { + result[shortcutKey] = { ...result[shortcutKey], keys: value }; + } + } + } + return result; }; // Save custom shortcuts to localStorage export const saveShortcuts = (shortcuts: ShortcutConfig) => { - localStorage.setItem('customShortcuts', JSON.stringify(shortcuts)); + // Only persist the keys arrays to localStorage + const keysOnly: Record = {}; + for (const [key, entry] of Object.entries(shortcuts)) { + keysOnly[key] = entry.keys; + } + localStorage.setItem('customShortcuts', JSON.stringify(keysOnly)); }; diff --git a/apps/readest-app/src/hooks/useShortcuts.ts b/apps/readest-app/src/hooks/useShortcuts.ts index d35ab5f0..69c0fd0a 100644 --- a/apps/readest-app/src/hooks/useShortcuts.ts +++ b/apps/readest-app/src/hooks/useShortcuts.ts @@ -61,11 +61,11 @@ const useShortcuts = (actions: KeyActionHandlers, dependencies: React.Dependency const handler = actionHandler as | ((event?: KeyboardEvent | MessageEvent) => void | boolean) | undefined; - const shortcutList = shortcuts[shortcutKey as keyof ShortcutConfig]; + const shortcutEntry = shortcuts[shortcutKey as keyof ShortcutConfig]; // console.log('Checking action:', shortcutKey); if ( handler && - shortcutList?.some((shortcut) => + shortcutEntry?.keys?.some((shortcut) => isShortcutMatch(shortcut, key, ctrlKey, altKey, metaKey, shiftKey), ) ) { diff --git a/apps/readest-app/src/utils/shortcutKeys.ts b/apps/readest-app/src/utils/shortcutKeys.ts new file mode 100644 index 00000000..0d31c7b1 --- /dev/null +++ b/apps/readest-app/src/utils/shortcutKeys.ts @@ -0,0 +1,88 @@ +const MODIFIER_MAP_MAC: Record = { + ctrl: '⌘', + cmd: '⌘', + alt: '⌥', + opt: '⌥', + shift: '⇧', + meta: '⌘', +}; + +const MODIFIER_MAP_OTHER: Record = { + ctrl: 'Ctrl', + cmd: 'Ctrl', + alt: 'Alt', + opt: 'Alt', + shift: 'Shift', + meta: 'Win', +}; + +const MODIFIERS = new Set(['ctrl', 'cmd', 'alt', 'opt', 'shift', 'meta']); + +const SPECIAL_KEYS: Record = { + arrowleft: '←', + arrowright: '→', + arrowup: '↑', + arrowdown: '↓', + escape: 'Esc', + pagedown: 'PgDn', + pageup: 'PgUp', + ' ': 'Space', + tab: 'Tab', + enter: 'Enter', +}; + +export const formatKeyForDisplay = (key: string, isMac: boolean): string => { + const parts = key.split('+'); + const modMap = isMac ? MODIFIER_MAP_MAC : MODIFIER_MAP_OTHER; + + const modifiers: string[] = []; + let baseKey = ''; + + for (const part of parts) { + const lower = part.toLowerCase(); + if (MODIFIERS.has(lower)) { + modifiers.push(modMap[lower]!); + } else { + baseKey = part; + } + } + + // Map special keys or capitalize single characters + const lowerBase = baseKey.toLowerCase(); + let displayKey: string; + if (SPECIAL_KEYS[lowerBase]) { + displayKey = SPECIAL_KEYS[lowerBase]!; + } else if (baseKey.length === 1 && baseKey >= 'a' && baseKey <= 'z') { + displayKey = baseKey.toUpperCase(); + } else { + displayKey = baseKey; + } + + if (isMac) { + return [...modifiers, displayKey].join(''); + } + return [...modifiers, displayKey].join('+'); +}; + +const MAC_MODIFIERS = new Set(['cmd', 'opt']); +const OTHER_MODIFIERS = new Set(['ctrl', 'alt']); + +const hasModifier = (key: string, modifiers: Set): boolean => { + const parts = key.split('+'); + return parts.some((p) => modifiers.has(p.toLowerCase())); +}; + +export const filterPlatformKeys = (keys: string[], isMac: boolean): string[] => { + const preferred = isMac ? MAC_MODIFIERS : OTHER_MODIFIERS; + const excluded = isMac ? OTHER_MODIFIERS : MAC_MODIFIERS; + + const platformKeys = keys.filter((k) => hasModifier(k, preferred)); + const agnosticKeys = keys.filter((k) => !hasModifier(k, preferred) && !hasModifier(k, excluded)); + + if (platformKeys.length > 0 || agnosticKeys.length > 0) { + return [...agnosticKeys, ...platformKeys]; + } + + // Fallback: return all keys if none match + return keys; +};