feat: add keyboard shortcuts help dialog (#3653)

Add a keyboard shortcuts help dialog toggled with '?' that displays all
shortcuts grouped by section with platform-appropriate key rendering.

Restructure DEFAULT_SHORTCUTS to include i18n descriptions and section
metadata. Translate 37 new keys across 29 locales.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Huang Xin
2026-03-27 14:59:38 +08:00
committed by GitHub
parent 5f897f648f
commit 3d4d1482aa
38 changed files with 1879 additions and 124 deletions
@@ -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": "حفظ الملاحظة"
}
@@ -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": "নোট সংরক্ষণ করুন"
}
@@ -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": "ཟིན་བྲིས་ཉར་བ།"
}
@@ -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"
}
@@ -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": "Αποθήκευση σημείωσης"
}
@@ -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"
}
@@ -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": "ذخیره یادداشت"
}
@@ -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"
}
@@ -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": "שמור הערה"
}
@@ -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": "नोट सहेजें"
}
@@ -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"
}
@@ -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"
}
@@ -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": "メモを保存"
}
@@ -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": "메모 저장"
}
@@ -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"
}
@@ -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"
}
@@ -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ę"
}
@@ -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"
}
@@ -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": "Сохранить заметку"
}
@@ -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": "සටහන සුරකින්න"
}
@@ -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"
}
@@ -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"
}
@@ -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": "குறிப்பைச் சேமிக்கவும்"
}
@@ -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": "บันทึกโน้ต"
}
@@ -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"
}
@@ -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": "Зберегти нотатку"
}
@@ -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ú"
}
@@ -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": "保存笔记"
}
@@ -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": "儲存筆記"
}
@@ -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);
});
});
@@ -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+,',
]);
});
});
@@ -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
</ModalPortal>
)}
<AboutWindow />
<KeyboardShortcutsHelp />
<UpdaterWindow />
<MigrateDataWindow />
<BackupWindow onPullLibrary={pullLibrary} />
@@ -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 }) => {
<Suspense fallback={<div className='full-height'></div>}>
<ReaderContent ids={ids} settings={settings} />
<AboutWindow />
<KeyboardShortcutsHelp />
<UpdaterWindow />
<KOSyncSettingsWindow />
<ReadwiseSettingsWindow />
@@ -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],
);
@@ -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]) => (
<div key={section.section} className='mb-4'>
<h3 className='text-base-content/70 mb-2 text-xs font-semibold uppercase tracking-wide'>
{_(section.section)}
</h3>
<div className='divide-base-200 divide-y'>
{section.items.map((item) => (
<div key={item.description} className='flex items-center justify-between gap-4 py-1.5'>
<span className='text-base-content text-sm'>{_(item.description)}</span>
<div className='flex shrink-0 gap-1'>
{item.keys.map((key) => (
<kbd
key={key}
className='border-base-300 bg-base-200 text-base-content inline-flex h-[22px] min-w-[22px] items-center justify-center rounded border px-1.5 text-xs shadow-sm'
style={{ fontFamily: 'monospace' }}
>
{formatKeyForDisplay(key, isMac)}
</kbd>
))}
</div>
</div>
))}
</div>
</div>
),
[_, 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 (
<Dialog
id='shortcuts_help'
isOpen={isOpen}
title={_('Keyboard Shortcuts')}
onClose={handleClose}
boxClassName='sm:!w-[560px] md:!w-[780px] sm:!max-w-[90vw] sm:h-auto sm:!max-h-[80vh]'
>
{isOpen && (
<div className='shortcuts-content pb-6 sm:pb-2'>
<div className='md:grid md:grid-cols-2 md:gap-6'>
<div>{leftColumn.map(renderSection)}</div>
<div>{rightColumn.map(renderSection)}</div>
</div>
<div className='border-base-200 mt-2 border-t pt-3 text-center'>
<Link
href='https://github.com/readest/readest/wiki/Keyboard-Shortcuts-Reference-Guide'
className='text-primary text-sm underline'
>
{_('View all keyboard shortcuts')}
</Link>
</div>
</div>
)}
</Dialog>
);
};
+324 -56
View File
@@ -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<string, ShortcutDisplayItem>();
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<string, string[]> = {};
for (const [key, entry] of Object.entries(shortcuts)) {
keysOnly[key] = entry.keys;
}
localStorage.setItem('customShortcuts', JSON.stringify(keysOnly));
};
+2 -2
View File
@@ -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),
)
) {
@@ -0,0 +1,88 @@
const MODIFIER_MAP_MAC: Record<string, string> = {
ctrl: '⌘',
cmd: '⌘',
alt: '⌥',
opt: '⌥',
shift: '⇧',
meta: '⌘',
};
const MODIFIER_MAP_OTHER: Record<string, string> = {
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<string, string> = {
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<string>): 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;
};