From b549d2c2613e4862530d09326ef381905fe6a8fd Mon Sep 17 00:00:00 2001 From: Harald Schilly Date: Wed, 8 Oct 2025 19:21:03 +0200 Subject: [PATCH] frontend/projects: introduce color and style projects list + tabs --- src/packages/frontend/i18n/common.ts | 3 +- src/packages/frontend/i18n/trans/ar_EG.json | 5 +- src/packages/frontend/i18n/trans/de_DE.json | 7 +- src/packages/frontend/i18n/trans/es_ES.json | 7 +- src/packages/frontend/i18n/trans/es_PV.json | 7 +- src/packages/frontend/i18n/trans/fr_FR.json | 7 +- src/packages/frontend/i18n/trans/he_IL.json | 5 +- src/packages/frontend/i18n/trans/hi_IN.json | 5 +- src/packages/frontend/i18n/trans/hu_HU.json | 7 +- src/packages/frontend/i18n/trans/it_IT.json | 7 +- src/packages/frontend/i18n/trans/ja_JP.json | 5 +- src/packages/frontend/i18n/trans/ko_KR.json | 5 +- src/packages/frontend/i18n/trans/nl_NL.json | 7 +- src/packages/frontend/i18n/trans/pl_PL.json | 7 +- src/packages/frontend/i18n/trans/pt_BR.json | 7 +- src/packages/frontend/i18n/trans/pt_PT.json | 7 +- src/packages/frontend/i18n/trans/ru_RU.json | 7 +- src/packages/frontend/i18n/trans/tr_TR.json | 7 +- src/packages/frontend/i18n/trans/zh_CN.json | 5 +- .../frontend/project/history/log-entry.tsx | 44 ++++- src/packages/frontend/project/history/log.tsx | 1 + .../frontend/project/settings/about-box.tsx | 151 ++++++++++++++++-- .../settings/compute-image-selector.tsx | 6 +- src/packages/frontend/project_store.ts | 2 +- src/packages/frontend/projects/actions.ts | 26 +++ .../frontend/projects/project-row.tsx | 34 +++- .../frontend/projects/projects-nav.tsx | 60 +++++-- src/packages/frontend/projects/util.ts | 22 +++ src/packages/util/db-schema/projects.ts | 8 + 29 files changed, 405 insertions(+), 66 deletions(-) diff --git a/src/packages/frontend/i18n/common.ts b/src/packages/frontend/i18n/common.ts index a9355fc2f6d..d0934186308 100644 --- a/src/packages/frontend/i18n/common.ts +++ b/src/packages/frontend/i18n/common.ts @@ -555,7 +555,8 @@ export const labels = defineMessages({ }, select: { id: "labels.select", - defaultMessage: "select", + defaultMessage: "Select", + description: "Short label on a button in a dialog, to confirm a 'selection'." }, select_a_kernel: { id: "labels.select_a_kernel", diff --git a/src/packages/frontend/i18n/trans/ar_EG.json b/src/packages/frontend/i18n/trans/ar_EG.json index 4d97c3de33e..4abace5fa16 100644 --- a/src/packages/frontend/i18n/trans/ar_EG.json +++ b/src/packages/frontend/i18n/trans/ar_EG.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "المزامنة التلقائية من المصدر إلى PDF: تحريك المؤشر يحرك ملف PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "المزامنة التلقائية من PDF إلى المصدر: تحريك التمرير في PDF يحرك المؤشر", "editor.latex.pdf_controls.sync_button.tooltip": "مزامنة عكسية لمرة واحدة إلى محرر المصدر", - "editor.latex.pdf_controls.sync_help.content": "

الوضع اليدوي:

الوضع التلقائي:

تستخدم هذه الوظيفة SyncTeX للتنسيق بين مصدر LaTeX ومخرجات PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

الوضع اليدوي:

الوضع التلقائي:

تستخدم هذه الوظيفة SyncTeX للتنسيق بين مصدر LaTeX وإخراج PDF.

", "editor.latex.pdf_controls.sync_help.title": "مساعدة مزامنة LaTeX", "editor.latex.pdf_embed.title": "PDF - أصلي", "editor.latex.pdf_embed.title.short": "PDF (native)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "جدول المحتويات", "editor.table_of_contents.short": "المحتويات", "editor.terminal.cmd.help.title": "عرض الوثائق لاستخدام محطة لينكس في CoCalc", + "editor.toggle_pdf_dark_mode.label": "تبديل وضع PDF الداكن", + "editor.toggle_pdf_dark_mode.title": "إيقاف الوضع الداكن لملف PDF لرؤية الملف الأصلي", "file_actions.compress.name": "ضغط", "file_actions.copy.name": "نسخ", "file_actions.create.name": "إنشاء", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "الحصص و{upgrades}", "project.page.project-licenses.intro": "التراخيص والترقيات حسب الاستخدام تغير الحصص والميزات المتاحة للمشروع", "project.servers.project-servers.description": "يمكنك تشغيل خوادم دفتر ملاحظات مختلفة داخل هذا المشروع بنقرة واحدة. تعمل في نفس البيئة، وتصل إلى نفس الملفات، وتتوقف عندما يتوقف المشروع. يمكنك أيضًا تشغيل خوادمك الخاصة.", + "project.settings.about-box.color.label": "اللون (اختياري)", "project.settings.about-box.description.label": "الوصف (ماركداون)", "project.settings.about-box.image.label": "صورة (اختياري)", "project.settings.about-box.name.label": "الاسم (اختياري)", diff --git a/src/packages/frontend/i18n/trans/de_DE.json b/src/packages/frontend/i18n/trans/de_DE.json index b6111059c09..e8935f7aaab 100644 --- a/src/packages/frontend/i18n/trans/de_DE.json +++ b/src/packages/frontend/i18n/trans/de_DE.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Automatische Synchronisierung vom Quelltext zum PDF: Cursorbewegungen scrollen das PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Automatische Synchronisierung von PDF zur Quelle: PDF-Scrollen bewegt den Cursor", "editor.latex.pdf_controls.sync_button.tooltip": "Einmalige inverse Synchronisation mit dem Quell-Editor", - "editor.latex.pdf_controls.sync_help.content": "

Manueller Modus:

Automatischer Modus:

Diese Funktionalität verwendet SyncTeX, um zwischen LaTeX-Quelle und PDF-Ausgabe zu koordinieren.

", + "editor.latex.pdf_controls.sync_help.content": "

Manueller Modus:

Automatischer Modus:

Diese Funktionalität verwendet SyncTeX, um zwischen LaTeX-Quelle und PDF-Ausgabe zu koordinieren.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX-Synchronisierungshilfe", "editor.latex.pdf_embed.title": "PDF - Native", "editor.latex.pdf_embed.title.short": "PDF (nativ)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Inhaltsverzeichnis", "editor.table_of_contents.short": "Inhalt", "editor.terminal.cmd.help.title": "Öffne die Dokumentation für die Nutzung des Linux-Terminals in CoCalc.", + "editor.toggle_pdf_dark_mode.label": "PDF-Dunkelmodus umschalten", + "editor.toggle_pdf_dark_mode.title": "Schalten Sie den Dunkelmodus der PDF aus, um die Originaldatei zu sehen", "file_actions.compress.name": "Komprimieren", "file_actions.copy.name": "Kopieren", "file_actions.create.name": "Erstellen", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Änderungen speichern", "labels.save_title": "Speichern Sie diese Datei auf die Festplatte", "labels.search": "Suche", - "labels.select": "auswählen", + "labels.select": "Auswählen", "labels.select_a_kernel": "Wählen Sie einen Kernel", "labels.settings": "Einstellungen", "labels.shared": "geteilt", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quoten und {upgrades}", "project.page.project-licenses.intro": "Lizenzen und Pay-as-you-go-Upgrades ändern die Quoten und Funktionen, die einem Projekt zur Verfügung stehen.", "project.servers.project-servers.description": "Sie können verschiedene Notebook-Server in diesem Projekt mit einem Klick starten. Sie laufen in derselben Umgebung, haben Zugriff auf dieselben Dateien und stoppen, wenn das Projekt stoppt. Sie können auch Ihren eigenen Server starten.", + "project.settings.about-box.color.label": "Farbe (optional)", "project.settings.about-box.description.label": "Beschreibung (Markdown)", "project.settings.about-box.image.label": "Bild (optional)", "project.settings.about-box.name.label": "Name (optional)", diff --git a/src/packages/frontend/i18n/trans/es_ES.json b/src/packages/frontend/i18n/trans/es_ES.json index d0c012113cd..cde18e611a5 100644 --- a/src/packages/frontend/i18n/trans/es_ES.json +++ b/src/packages/frontend/i18n/trans/es_ES.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Auto-sincronización de fuente a PDF: el cursor mueve el desplazamiento del PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Sincronización automática de PDF a fuente: el desplazamiento del PDF mueve el cursor", "editor.latex.pdf_controls.sync_button.tooltip": "Sincronización inversa única con el editor de origen", - "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Esta funcionalidad utiliza SyncTeX para coordinar entre la fuente LaTeX y la salida PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Esta funcionalidad utiliza SyncTeX para coordinar entre la fuente LaTeX y la salida PDF.

", "editor.latex.pdf_controls.sync_help.title": "Ayuda de sincronización de LaTeX", "editor.latex.pdf_embed.title": "PDF - Nativo", "editor.latex.pdf_embed.title.short": "PDF (nativo)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Tabla de Contenidos", "editor.table_of_contents.short": "Contenido", "editor.terminal.cmd.help.title": "Mostrar documentación para usar el Terminal de Linux en CoCalc", + "editor.toggle_pdf_dark_mode.label": "Alternar modo oscuro de PDF", + "editor.toggle_pdf_dark_mode.title": "Desactivar el modo oscuro del PDF para ver el archivo original", "file_actions.compress.name": "Comprimir", "file_actions.copy.name": "Copiar", "file_actions.create.name": "Crear", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Guardar cambios", "labels.save_title": "Guardar este archivo en el disco", "labels.search": "Buscar", - "labels.select": "seleccionar", + "labels.select": "Seleccionar", "labels.select_a_kernel": "Seleccione un kernel", "labels.settings": "Configuración", "labels.shared": "compartido", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Cuotas y {upgrades}", "project.page.project-licenses.intro": "Las licencias y las actualizaciones de pago por uso cambian las cuotas y características disponibles para un proyecto", "project.servers.project-servers.description": "Puedes ejecutar varios servidores de cuadernos dentro de este proyecto con un solo clic. Se ejecutan en el mismo entorno, tienen acceso a los mismos archivos y se detienen cuando el proyecto se detiene. También puedes ejecutar tus propios servidores.", + "project.settings.about-box.color.label": "Color (opcional)", "project.settings.about-box.description.label": "Descripción (markdown)", "project.settings.about-box.image.label": "Imagen (opcional)", "project.settings.about-box.name.label": "Nombre (opcional)", diff --git a/src/packages/frontend/i18n/trans/es_PV.json b/src/packages/frontend/i18n/trans/es_PV.json index d1596da796c..0a3b9b7533d 100644 --- a/src/packages/frontend/i18n/trans/es_PV.json +++ b/src/packages/frontend/i18n/trans/es_PV.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Iturburutik PDFra auto-sinkronizazioa: kurtsorea mugitzean PDFa korritzen da", "editor.latex.pdf_controls.inverse_sync.tooltip": "Auto-sinkronizazioa PDFtik iturburura: PDFa korritzeak kurtsorea mugitzen du", "editor.latex.pdf_controls.sync_button.tooltip": "Aldibaterako alderantzizko sinkronizazioa iturburu editorearekin", - "editor.latex.pdf_controls.sync_help.content": "

Eskuzko modua:

Modu automatikoa:

Funtzionalitate honek SyncTeX erabiltzen du LaTeX iturburuaren eta PDF irteeraren artean koordinatzeko.

", + "editor.latex.pdf_controls.sync_help.content": "

Eskuzko Modua:

Modu Automatikoa:

Funtzionalitate honek SyncTeX erabiltzen du LaTeX iturburuaren eta PDF irteeraren artean koordinatzeko.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX Sinkronizazio Laguntza", "editor.latex.pdf_embed.title": "PDF - Natifoa", "editor.latex.pdf_embed.title.short": "PDF (natiboa)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Edukiaren Taula", "editor.table_of_contents.short": "Edukia", "editor.terminal.cmd.help.title": "Erakutsi dokumentazioa Linux Terminala CoCalc-en erabiltzeko.", + "editor.toggle_pdf_dark_mode.label": "Aldatu PDF Modu Ilunera", + "editor.toggle_pdf_dark_mode.title": "PDFaren ilunpeko modua desaktibatu, jatorrizko fitxategia ikusteko", "file_actions.compress.name": "Konprimitu", "file_actions.copy.name": "Kopiatu", "file_actions.create.name": "Sortu", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Aldaketak gorde", "labels.save_title": "Gorde fitxategi hau diskoan", "labels.search": "Bilatu", - "labels.select": "hautatu", + "labels.select": "Hautatu", "labels.select_a_kernel": "Hautatu Kernel bat", "labels.settings": "Ezarpenak", "labels.shared": "partekatua", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Kuotak eta {upgrades}", "project.page.project-licenses.intro": "Lizentziek eta ordaindu ahala hobekuntzek proiektu bati eskuragarri dauden kuotak eta ezaugarriak aldatzen dituzte.", "project.servers.project-servers.description": "Proiektu honetan klik bakarrarekin hainbat koaderno-zerbitzari exekutatu ditzakezu. Ingurune berean exekutatzen dira, fitxategi berberetarako sarbidea dute eta proiektua gelditzen denean gelditzen dira. Zure zerbitzari propioak ere exekutatu ditzakezu.", + "project.settings.about-box.color.label": "Kolorea (aukerakoa)", "project.settings.about-box.description.label": "Deskribapena (markdown)", "project.settings.about-box.image.label": "Irudi (aukerakoa)", "project.settings.about-box.name.label": "Izena (aukerakoa)", diff --git a/src/packages/frontend/i18n/trans/fr_FR.json b/src/packages/frontend/i18n/trans/fr_FR.json index fef7197a2fa..986e4882204 100644 --- a/src/packages/frontend/i18n/trans/fr_FR.json +++ b/src/packages/frontend/i18n/trans/fr_FR.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Synchronisation automatique de la source au PDF : le défilement du curseur déplace le PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Synchronisation automatique du PDF vers la source : le défilement du PDF déplace le curseur", "editor.latex.pdf_controls.sync_button.tooltip": "Synchronisation inverse unique vers l'éditeur source", - "editor.latex.pdf_controls.sync_help.content": "

Mode manuel :

Mode automatique :

Cette fonctionnalité utilise SyncTeX pour coordonner entre la source LaTeX et la sortie PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Mode Manuel :

Mode Automatique :

Cette fonctionnalité utilise SyncTeX pour coordonner entre le source LaTeX et la sortie PDF.

", "editor.latex.pdf_controls.sync_help.title": "Aide à la synchronisation LaTeX", "editor.latex.pdf_embed.title": "PDF - Natif", "editor.latex.pdf_embed.title.short": "PDF (natif)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Table des matières", "editor.table_of_contents.short": "Contenu", "editor.terminal.cmd.help.title": "Afficher la documentation pour utiliser le terminal Linux dans CoCalc.", + "editor.toggle_pdf_dark_mode.label": "Basculer le mode sombre PDF", + "editor.toggle_pdf_dark_mode.title": "Désactiver le mode sombre du PDF pour voir le fichier original", "file_actions.compress.name": "Compresser", "file_actions.copy.name": "Copier", "file_actions.create.name": "Créer", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Enregistrer les modifications", "labels.save_title": "Enregistrer ce fichier sur le disque", "labels.search": "Recherche", - "labels.select": "sélectionner", + "labels.select": "Sélectionner", "labels.select_a_kernel": "Sélectionner un noyau", "labels.settings": "Paramètres", "labels.shared": "partagé", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quotas et {upgrades}", "project.page.project-licenses.intro": "Les licences et les mises à niveau à la carte modifient les quotas et les fonctionnalités disponibles pour un projet.", "project.servers.project-servers.description": "Vous pouvez exécuter divers serveurs de notebooks à l'intérieur de ce projet en un clic. Ils fonctionnent dans le même environnement, ont accès aux mêmes fichiers et s'arrêtent lorsque le projet s'arrête. Vous pouvez également exécuter vos propres serveurs.", + "project.settings.about-box.color.label": "Couleur (facultatif)", "project.settings.about-box.description.label": "Description (markdown)", "project.settings.about-box.image.label": "Image (optionnel)", "project.settings.about-box.name.label": "Nom (facultatif)", diff --git a/src/packages/frontend/i18n/trans/he_IL.json b/src/packages/frontend/i18n/trans/he_IL.json index ff3c51e3482..61b9964ff9c 100644 --- a/src/packages/frontend/i18n/trans/he_IL.json +++ b/src/packages/frontend/i18n/trans/he_IL.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "סנכרון אוטומטי ממקור ל-PDF: הזזת הסמן מגלגלת את ה-PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "סנכרון אוטומטי מ-PDF למקור: גלילת ה-PDF מזיזה את הסמן", "editor.latex.pdf_controls.sync_button.tooltip": "סנכרון הפוך חד-פעמי לעורך המקור", - "editor.latex.pdf_controls.sync_help.content": "

מצב ידני:

מצב אוטומטי:

פונקציונליות זו משתמשת ב-SyncTeX כדי לתאם בין מקור LaTeX לפלט PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

מצב ידני:

מצב אוטומטי:

פונקציונליות זו משתמשת ב-SyncTeX כדי לתאם בין מקור LaTeX לפלט PDF.

", "editor.latex.pdf_controls.sync_help.title": "עזרה לסנכרון LaTeX", "editor.latex.pdf_embed.title": "PDF - ילידי", "editor.latex.pdf_embed.title.short": "PDF (מקורי)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "תוכן העניינים", "editor.table_of_contents.short": "תוכן", "editor.terminal.cmd.help.title": "הצג תיעוד לשימוש בטרמינל לינוקס ב-CoCalc", + "editor.toggle_pdf_dark_mode.label": "החלף מצב כהה עבור PDF", + "editor.toggle_pdf_dark_mode.title": "כבה את מצב החושך של ה-PDF, כדי לראות את הקובץ המקורי", "file_actions.compress.name": "דחוס", "file_actions.copy.name": "העתק", "file_actions.create.name": "צור", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "מכסה ושדרוגים", "project.page.project-licenses.intro": "רישיונות ושדרוגים לפי שימוש משנים את המכסות והתכונות הזמינות לפרויקט", "project.servers.project-servers.description": "ניתן להפעיל שרתי מחברות שונים בתוך הפרויקט הזה בלחיצה אחת. הם פועלים באותה סביבה, יש להם גישה לאותם קבצים, והם נעצרים כאשר הפרויקט נעצר. ניתן גם להפעיל שרתים משלכם.", + "project.settings.about-box.color.label": "צבע (לא חובה)", "project.settings.about-box.description.label": "תיאור (markdown)", "project.settings.about-box.image.label": "תמונה (אופציונלי)", "project.settings.about-box.name.label": "שם (לא חובה)", diff --git a/src/packages/frontend/i18n/trans/hi_IN.json b/src/packages/frontend/i18n/trans/hi_IN.json index 07f370dc0e7..9f4641812db 100644 --- a/src/packages/frontend/i18n/trans/hi_IN.json +++ b/src/packages/frontend/i18n/trans/hi_IN.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "स्रोत से PDF के लिए ऑटो-सिंक: कर्सर चलाएं PDF को स्क्रॉल करें", "editor.latex.pdf_controls.inverse_sync.tooltip": "पीडीएफ से स्रोत तक ऑटो-सिंक: पीडीएफ स्क्रॉलिंग कर्सर को स्थानांतरित करती है", "editor.latex.pdf_controls.sync_button.tooltip": "स्रोत संपादक के लिए एक बार का उल्टा समन्वयन", - "editor.latex.pdf_controls.sync_help.content": "

मैन्युअल मोड:

स्वचालित मोड:

यह कार्यक्षमता LaTeX स्रोत और PDF आउटपुट के बीच समन्वय के लिए SyncTeX का उपयोग करती है।

", + "editor.latex.pdf_controls.sync_help.content": "

मैनुअल मोड:

स्वचालित मोड:

यह कार्यक्षमता LaTeX स्रोत और PDF आउटपुट के बीच समन्वय के लिए SyncTeX का उपयोग करती है।

", "editor.latex.pdf_controls.sync_help.title": "LaTeX सिंक सहायता", "editor.latex.pdf_embed.title": "PDF - नेटिव", "editor.latex.pdf_embed.title.short": "पीडीएफ (मूल)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "सामग्री सूची", "editor.table_of_contents.short": "सामग्री", "editor.terminal.cmd.help.title": "CoCalc में Linux टर्मिनल का उपयोग करने के लिए दस्तावेज़ दिखाएं.", + "editor.toggle_pdf_dark_mode.label": "पीडीएफ डार्क मोड टॉगल करें", + "editor.toggle_pdf_dark_mode.title": "पीडीएफ के डार्क मोड को बंद करें, मूल फ़ाइल देखने के लिए", "file_actions.compress.name": "संपीड़ित करें", "file_actions.copy.name": "कॉपी", "file_actions.create.name": "बनाएँ", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "कोटा और {upgrades}", "project.page.project-licenses.intro": "लाइसेंस और पे-एज़-यू-गो अपग्रेड्स प्रोजेक्ट के लिए उपलब्ध कोटा और फीचर्स को बदलते हैं", "project.servers.project-servers.description": "आप इस प्रोजेक्ट के अंदर विभिन्न नोटबुक सर्वर एक क्लिक में चला सकते हैं। वे एक ही वातावरण में चलते हैं, एक ही फाइलों तक पहुँचते हैं, और प्रोजेक्ट के बंद होने पर बंद हो जाते हैं। आप अपने खुद के सर्वर भी चला सकते हैं।", + "project.settings.about-box.color.label": "रंग (वैकल्पिक)", "project.settings.about-box.description.label": "विवरण (मार्कडाउन)", "project.settings.about-box.image.label": "चित्र (वैकल्पिक)", "project.settings.about-box.name.label": "नाम (वैकल्पिक)", diff --git a/src/packages/frontend/i18n/trans/hu_HU.json b/src/packages/frontend/i18n/trans/hu_HU.json index 1cdddfad1c4..e575364fed0 100644 --- a/src/packages/frontend/i18n/trans/hu_HU.json +++ b/src/packages/frontend/i18n/trans/hu_HU.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Automatikus szinkronizálás forrásból PDF-be: a kurzor mozgatása görgeti a PDF-et", "editor.latex.pdf_controls.inverse_sync.tooltip": "Automatikus szinkronizálás PDF-ről forrásra: a PDF görgetése mozgatja a kurzort", "editor.latex.pdf_controls.sync_button.tooltip": "Egyszeri fordított szinkronizálás a forrásszerkesztőbe", - "editor.latex.pdf_controls.sync_help.content": "

Kézi mód:

Automatikus mód:

Ez a funkció a SyncTeX-et használja a LaTeX forrás és a PDF kimenet közötti koordinációhoz.

", + "editor.latex.pdf_controls.sync_help.content": "

Kézi mód:

Automatikus mód:

Ez a funkció a SyncTeX-et használja a LaTeX forrás és a PDF kimenet közötti koordinációhoz.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX szinkronizálási súgó", "editor.latex.pdf_embed.title": "PDF - Natív", "editor.latex.pdf_embed.title.short": "PDF (natív)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Tartalomjegyzék", "editor.table_of_contents.short": "Tartalom", "editor.terminal.cmd.help.title": "Dokumentáció megjelenítése a Linux terminál használatához a CoCalc-ban.", + "editor.toggle_pdf_dark_mode.label": "PDF sötét mód váltása", + "editor.toggle_pdf_dark_mode.title": "Kapcsolja ki a PDF sötét módját, hogy lássa az eredeti fájlt", "file_actions.compress.name": "Tömörít", "file_actions.copy.name": "Másolás", "file_actions.create.name": "Létrehozás", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Változások mentése", "labels.save_title": "Mentse el ezt a fájlt a lemezre", "labels.search": "Keresés", - "labels.select": "választ", + "labels.select": "Kiválasztás", "labels.select_a_kernel": "Válasszon egy kernelt", "labels.settings": "Beállítások", "labels.shared": "megosztott", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Kvóták és {upgrades}", "project.page.project-licenses.intro": "A licencek és a fizetés alapú frissítések megváltoztatják a projekthez elérhető kvótákat és funkciókat.", "project.servers.project-servers.description": "Egyetlen kattintással különböző notebook szervereket futtathatsz ebben a projektben. Ugyanabban a környezetben futnak, hozzáférnek ugyanazokhoz a fájlokhoz, és leállnak, amikor a projekt leáll. Saját szervereket is futtathatsz.", + "project.settings.about-box.color.label": "Szín (opcionális)", "project.settings.about-box.description.label": "Leírás (markdown)", "project.settings.about-box.image.label": "Kép (nem kötelező)", "project.settings.about-box.name.label": "Név (opcionális)", diff --git a/src/packages/frontend/i18n/trans/it_IT.json b/src/packages/frontend/i18n/trans/it_IT.json index c9737e19686..aac42ca27b0 100644 --- a/src/packages/frontend/i18n/trans/it_IT.json +++ b/src/packages/frontend/i18n/trans/it_IT.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Sincronizzazione automatica da sorgente a PDF: il cursore scorre il PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Sincronizzazione automatica da PDF a sorgente: lo scorrimento del PDF sposta il cursore", "editor.latex.pdf_controls.sync_button.tooltip": "Sincronizzazione inversa una tantum all'editor di origine", - "editor.latex.pdf_controls.sync_help.content": "

Modalità Manuale:

Modalità Automatica:

Questa funzionalità utilizza SyncTeX per coordinare tra il sorgente LaTeX e l'output PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Modalità manuale:

Modalità automatica:

Questa funzionalità utilizza SyncTeX per coordinare tra il sorgente LaTeX e l'output PDF.

", "editor.latex.pdf_controls.sync_help.title": "Aiuto Sincronizzazione LaTeX", "editor.latex.pdf_embed.title": "PDF - Nativo", "editor.latex.pdf_embed.title.short": "PDF (nativo)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Indice", "editor.table_of_contents.short": "Contenuti", "editor.terminal.cmd.help.title": "Mostra la documentazione per l'utilizzo del Terminale Linux in CoCalc.", + "editor.toggle_pdf_dark_mode.label": "Attiva/disattiva modalità scura PDF", + "editor.toggle_pdf_dark_mode.title": "Disattiva la modalità scura del PDF per vedere il file originale", "file_actions.compress.name": "Comprimi", "file_actions.copy.name": "Copia", "file_actions.create.name": "Crea", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Salva modifiche", "labels.save_title": "Salva questo file su disco", "labels.search": "Cerca", - "labels.select": "seleziona", + "labels.select": "Seleziona", "labels.select_a_kernel": "Seleziona un kernel", "labels.settings": "Impostazioni", "labels.shared": "condiviso", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quote e {upgrades}", "project.page.project-licenses.intro": "Le licenze e gli aggiornamenti pay as you go cambiano le quote e le funzionalità disponibili per un progetto.", "project.servers.project-servers.description": "Puoi eseguire vari server notebook all'interno di questo progetto con un solo clic. Funzionano nello stesso ambiente, hanno accesso agli stessi file e si fermano quando il progetto si ferma. Puoi anche eseguire i tuoi server.", + "project.settings.about-box.color.label": "Colore (facoltativo)", "project.settings.about-box.description.label": "Descrizione (markdown)", "project.settings.about-box.image.label": "Immagine (opzionale)", "project.settings.about-box.name.label": "Nome (opzionale)", diff --git a/src/packages/frontend/i18n/trans/ja_JP.json b/src/packages/frontend/i18n/trans/ja_JP.json index 334106d5929..9a920be0fe8 100644 --- a/src/packages/frontend/i18n/trans/ja_JP.json +++ b/src/packages/frontend/i18n/trans/ja_JP.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "ソースからPDFへの自動同期: カーソルが移動するとPDFがスクロールします", "editor.latex.pdf_controls.inverse_sync.tooltip": "PDFからソースへの自動同期: PDFのスクロールでカーソルが移動します", "editor.latex.pdf_controls.sync_button.tooltip": "ソースエディタへの一度限りの逆同期", - "editor.latex.pdf_controls.sync_help.content": "

手動モード:

自動モード:

この機能はSyncTeXを使用してLaTeXソースとPDF出力を連携させます。

", + "editor.latex.pdf_controls.sync_help.content": "

手動モード:

自動モード:

この機能は、LaTeXソースとPDF出力の間を調整するためにSyncTeXを使用します。

", "editor.latex.pdf_controls.sync_help.title": "LaTeX同期ヘルプ", "editor.latex.pdf_embed.title": "PDF - ネイティブ", "editor.latex.pdf_embed.title.short": "PDF(ネイティブ)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "目次", "editor.table_of_contents.short": "目次", "editor.terminal.cmd.help.title": "CoCalcでLinuxターミナルを使用するためのドキュメントを表示。", + "editor.toggle_pdf_dark_mode.label": "PDFダークモードを切り替え", + "editor.toggle_pdf_dark_mode.title": "PDFのダークモードをオフにして、元のファイルを表示", "file_actions.compress.name": "圧縮", "file_actions.copy.name": "コピー", "file_actions.create.name": "作成", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "クォータと{upgrades}", "project.page.project-licenses.intro": "ライセンスおよび従量制アップグレードは、プロジェクトに利用可能なクォータと機能を変更します", "project.servers.project-servers.description": "このプロジェクト内で様々なノートブックサーバーをワンクリックで実行できます。それらは同じ環境で動作し、同じファイルにアクセスし、プロジェクトが停止すると停止します。また、自分のサーバーを実行することもできます。", + "project.settings.about-box.color.label": "色(オプション)", "project.settings.about-box.description.label": "説明 (markdown)", "project.settings.about-box.image.label": "画像(オプション)", "project.settings.about-box.name.label": "名前(任意)", diff --git a/src/packages/frontend/i18n/trans/ko_KR.json b/src/packages/frontend/i18n/trans/ko_KR.json index b0b3ff3d4d5..66d0c4a98e0 100644 --- a/src/packages/frontend/i18n/trans/ko_KR.json +++ b/src/packages/frontend/i18n/trans/ko_KR.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "소스에서 PDF로 자동 동기화: 커서 이동 시 PDF 스크롤", "editor.latex.pdf_controls.inverse_sync.tooltip": "PDF에서 소스로 자동 동기화: PDF 스크롤이 커서를 이동시킵니다", "editor.latex.pdf_controls.sync_button.tooltip": "소스 편집기로 일회성 역동기화", - "editor.latex.pdf_controls.sync_help.content": "

수동 모드:

자동 모드:

이 기능은 LaTeX 소스와 PDF 출력 간의 조정을 위해 SyncTeX를 사용합니다.

", + "editor.latex.pdf_controls.sync_help.content": "

수동 모드:

자동 모드:

이 기능은 LaTeX 소스와 PDF 출력 간의 조정을 위해 SyncTeX를 사용합니다.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX 동기화 도움말", "editor.latex.pdf_embed.title": "PDF - 본래", "editor.latex.pdf_embed.title.short": "PDF (네이티브)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "목차", "editor.table_of_contents.short": "목차", "editor.terminal.cmd.help.title": "CoCalc에서 Linux 터미널 사용 설명서 보기", + "editor.toggle_pdf_dark_mode.label": "PDF 다크 모드 전환", + "editor.toggle_pdf_dark_mode.title": "PDF의 다크 모드를 끄고 원본 파일을 확인하세요", "file_actions.compress.name": "압축", "file_actions.copy.name": "복사", "file_actions.create.name": "생성", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "할당량 및 {upgrades}", "project.page.project-licenses.intro": "라이선스와 사용량에 따른 업그레이드는 프로젝트에 이용 가능한 할당량과 기능을 변경합니다.", "project.servers.project-servers.description": "이 프로젝트 안에서 다양한 노트북 서버를 한 번의 클릭으로 실행할 수 있습니다. 서버는 같은 환경에서 실행되며, 같은 파일에 접근하고 프로젝트가 중지되면 서버도 중지됩니다. 또한 자신의 서버를 실행할 수도 있습니다.", + "project.settings.about-box.color.label": "색상 (선택 사항)", "project.settings.about-box.description.label": "설명 (마크다운)", "project.settings.about-box.image.label": "이미지 (선택 사항)", "project.settings.about-box.name.label": "이름 (선택 사항)", diff --git a/src/packages/frontend/i18n/trans/nl_NL.json b/src/packages/frontend/i18n/trans/nl_NL.json index 07e5b6b4767..734020ed0af 100644 --- a/src/packages/frontend/i18n/trans/nl_NL.json +++ b/src/packages/frontend/i18n/trans/nl_NL.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Auto-sync van bron naar PDF: cursor beweegt scrollt de PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Automatisch synchroniseren van PDF naar bron: PDF scrollen verplaatst de cursor", "editor.latex.pdf_controls.sync_button.tooltip": "Eenmalige inverse synchronisatie naar de broneditor", - "editor.latex.pdf_controls.sync_help.content": "

Handmatige modus:

Automatische modus:

Deze functionaliteit gebruikt SyncTeX om te coördineren tussen LaTeX-bron en PDF-uitvoer.

", + "editor.latex.pdf_controls.sync_help.content": "

Handmatige Modus:

Automatische Modus:

Deze functionaliteit gebruikt SyncTeX om te coördineren tussen LaTeX-bron en PDF-uitvoer.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX Sync Hulp", "editor.latex.pdf_embed.title": "PDF - Native", "editor.latex.pdf_embed.title.short": "PDF (native)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Inhoudsopgave", "editor.table_of_contents.short": "Inhoud", "editor.terminal.cmd.help.title": "Toon documentatie voor het gebruik van de Linux Terminal in CoCalc.", + "editor.toggle_pdf_dark_mode.label": "Schakel PDF Donkere Modus in", + "editor.toggle_pdf_dark_mode.title": "Donkere modus van PDF uitschakelen om het originele bestand te zien", "file_actions.compress.name": "Comprimeer", "file_actions.copy.name": "Kopiëren", "file_actions.create.name": "Creëer", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Wijzigingen opslaan", "labels.save_title": "Sla dit bestand op op schijf", "labels.search": "Zoeken", - "labels.select": "selecteer", + "labels.select": "Selecteer", "labels.select_a_kernel": "Selecteer een kernel", "labels.settings": "Instellingen", "labels.shared": "gedeeld", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quota's en {upgrades}", "project.page.project-licenses.intro": "Licenties en upgrades op basis van betalen per gebruik veranderen de quota en functies die beschikbaar zijn voor een project.", "project.servers.project-servers.description": "Je kunt verschillende notebook-servers binnen dit project met één klik uitvoeren. Ze draaien in dezelfde omgeving, hebben toegang tot dezelfde bestanden, en stoppen wanneer het project stopt. Je kunt ook je eigen servers draaien.", + "project.settings.about-box.color.label": "Kleur (optioneel)", "project.settings.about-box.description.label": "Beschrijving (markdown)", "project.settings.about-box.image.label": "Afbeelding (optioneel)", "project.settings.about-box.name.label": "Naam (optioneel)", diff --git a/src/packages/frontend/i18n/trans/pl_PL.json b/src/packages/frontend/i18n/trans/pl_PL.json index 0fcc6645ac3..843207db693 100644 --- a/src/packages/frontend/i18n/trans/pl_PL.json +++ b/src/packages/frontend/i18n/trans/pl_PL.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Automatyczna synchronizacja ze źródła do PDF: kursor przesuwa przewijanie PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Auto-sync z PDF do źródła: przewijanie PDF przesuwa kursor", "editor.latex.pdf_controls.sync_button.tooltip": "Jednorazowa synchronizacja wsteczna do edytora źródłowego", - "editor.latex.pdf_controls.sync_help.content": "

Tryb ręczny:

Tryb automatyczny:

Ta funkcjonalność wykorzystuje SyncTeX do koordynacji między źródłem LaTeX a wyjściem PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Tryb ręczny:

Tryb automatyczny:

Ta funkcjonalność wykorzystuje SyncTeX do koordynacji między źródłem LaTeX a wyjściem PDF.

", "editor.latex.pdf_controls.sync_help.title": "Pomoc synchronizacji LaTeX", "editor.latex.pdf_embed.title": "PDF - Rodzimy", "editor.latex.pdf_embed.title.short": "PDF (rodzimy)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Spis treści", "editor.table_of_contents.short": "Spis treści", "editor.terminal.cmd.help.title": "Pokaż dokumentację dotyczącą używania terminala Linux w CoCalc", + "editor.toggle_pdf_dark_mode.label": "Przełącz Tryb Ciemny PDF", + "editor.toggle_pdf_dark_mode.title": "Wyłącz tryb ciemny PDF, aby zobaczyć oryginalny plik", "file_actions.compress.name": "Kompresuj", "file_actions.copy.name": "Kopiuj", "file_actions.create.name": "Utwórz", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Zapisz zmiany", "labels.save_title": "Zapisz ten plik na dysku", "labels.search": "Szukaj", - "labels.select": "wybierz", + "labels.select": "Wybierz", "labels.select_a_kernel": "Wybierz jądro", "labels.settings": "Ustawienia", "labels.shared": "udostępnione", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Limity i {upgrades}", "project.page.project-licenses.intro": "Licencje i ulepszenia pay as you go zmieniają limity i funkcje dostępne dla projektu.", "project.servers.project-servers.description": "Możesz uruchomić różne serwery notebooków w tym projekcie jednym kliknięciem. Działają w tym samym środowisku, mają dostęp do tych samych plików i zatrzymują się, gdy projekt się zatrzymuje. Możesz także uruchomić własne serwery.", + "project.settings.about-box.color.label": "Kolor (opcjonalnie)", "project.settings.about-box.description.label": "Opis (markdown)", "project.settings.about-box.image.label": "Obraz (opcjonalnie)", "project.settings.about-box.name.label": "Nazwa (opcjonalnie)", diff --git a/src/packages/frontend/i18n/trans/pt_BR.json b/src/packages/frontend/i18n/trans/pt_BR.json index 681223b7e34..eb0538187d2 100644 --- a/src/packages/frontend/i18n/trans/pt_BR.json +++ b/src/packages/frontend/i18n/trans/pt_BR.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Sincronização automática da fonte para PDF: movimentos do cursor rolam o PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Sincronização automática do PDF para a fonte: rolar o PDF move o cursor", "editor.latex.pdf_controls.sync_button.tooltip": "Sincronização inversa única para o editor de origem", - "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Essa funcionalidade usa SyncTeX para coordenar entre a origem LaTeX e a saída PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Esta funcionalidade utiliza SyncTeX para coordenar entre a fonte LaTeX e o resultado em PDF.

", "editor.latex.pdf_controls.sync_help.title": "Ajuda de Sincronização LaTeX", "editor.latex.pdf_embed.title": "PDF - Nativo", "editor.latex.pdf_embed.title.short": "PDF (nativo)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Índice", "editor.table_of_contents.short": "Conteúdo", "editor.terminal.cmd.help.title": "Mostrar documentação para usar o Terminal Linux no CoCalc.", + "editor.toggle_pdf_dark_mode.label": "Alternar Modo Escuro do PDF", + "editor.toggle_pdf_dark_mode.title": "Desativar o modo escuro do PDF para ver o arquivo original", "file_actions.compress.name": "Comprimir", "file_actions.copy.name": "Copiar", "file_actions.create.name": "Criar", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Salvar alterações", "labels.save_title": "Salve este arquivo no disco", "labels.search": "Buscar", - "labels.select": "selecionar", + "labels.select": "Selecionar", "labels.select_a_kernel": "Selecione um Kernel", "labels.settings": "Configurações", "labels.shared": "compartilhado", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quotas e {upgrades}", "project.page.project-licenses.intro": "Licenças e upgrades pay as you go alteram as cotas e recursos disponíveis para um projeto.", "project.servers.project-servers.description": "Você pode executar vários servidores de notebook dentro deste projeto com um clique. Eles rodam no mesmo ambiente, têm acesso aos mesmos arquivos e param quando o projeto para. Você também pode executar seus próprios servidores.", + "project.settings.about-box.color.label": "Cor (opcional)", "project.settings.about-box.description.label": "Descrição (markdown)", "project.settings.about-box.image.label": "Imagem (opcional)", "project.settings.about-box.name.label": "Nome (opcional)", diff --git a/src/packages/frontend/i18n/trans/pt_PT.json b/src/packages/frontend/i18n/trans/pt_PT.json index 07a15d7cbd2..2c510a86a8e 100644 --- a/src/packages/frontend/i18n/trans/pt_PT.json +++ b/src/packages/frontend/i18n/trans/pt_PT.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Sincronização automática da origem para o PDF: mover o cursor faz rolar o PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Sincronização automática do PDF para a fonte: deslocar o PDF move o cursor", "editor.latex.pdf_controls.sync_button.tooltip": "Sincronização inversa única para o editor de origem", - "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Esta funcionalidade usa SyncTeX para coordenar entre a origem LaTeX e a saída PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Modo Manual:

Modo Automático:

Esta funcionalidade utiliza SyncTeX para coordenar entre a fonte LaTeX e a saída PDF.

", "editor.latex.pdf_controls.sync_help.title": "Ajuda de Sincronização LaTeX", "editor.latex.pdf_embed.title": "PDF - Nativo", "editor.latex.pdf_embed.title.short": "PDF (nativo)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Índice", "editor.table_of_contents.short": "Conteúdos", "editor.terminal.cmd.help.title": "Mostrar documentação para usar o Terminal Linux no CoCalc", + "editor.toggle_pdf_dark_mode.label": "Alternar Modo Escuro do PDF", + "editor.toggle_pdf_dark_mode.title": "Desativar o modo escuro do PDF, para ver o ficheiro original", "file_actions.compress.name": "Comprimir", "file_actions.copy.name": "Copiar", "file_actions.create.name": "Criar", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Guardar alterações", "labels.save_title": "Guardar este ficheiro no disco", "labels.search": "Pesquisar", - "labels.select": "selecionar", + "labels.select": "Selecionar", "labels.select_a_kernel": "Selecionar um kernel", "labels.settings": "Configurações", "labels.shared": "partilhado", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Quotas e {upgrades}", "project.page.project-licenses.intro": "Licenças e atualizações pagas conforme o uso alteram as quotas e funcionalidades disponíveis para um projeto.", "project.servers.project-servers.description": "Pode executar vários servidores de cadernos dentro deste projeto com um clique. Eles funcionam no mesmo ambiente, têm acesso aos mesmos ficheiros e param quando o projeto para. Também pode executar os seus próprios servidores.", + "project.settings.about-box.color.label": "Cor (opcional)", "project.settings.about-box.description.label": "Descrição (markdown)", "project.settings.about-box.image.label": "Imagem (opcional)", "project.settings.about-box.name.label": "Nome (opcional)", diff --git a/src/packages/frontend/i18n/trans/ru_RU.json b/src/packages/frontend/i18n/trans/ru_RU.json index 4e8cca91e34..816381a8dda 100644 --- a/src/packages/frontend/i18n/trans/ru_RU.json +++ b/src/packages/frontend/i18n/trans/ru_RU.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Автосинхронизация из источника в PDF: перемещение курсора прокручивает PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "Автосинхронизация из PDF в исходник: прокрутка PDF перемещает курсор", "editor.latex.pdf_controls.sync_button.tooltip": "Одноразовая обратная синхронизация с исходным редактором", - "editor.latex.pdf_controls.sync_help.content": "

Ручной режим:

Автоматический режим:

Эта функция использует SyncTeX для координации между исходным кодом LaTeX и выводом PDF.

", + "editor.latex.pdf_controls.sync_help.content": "

Ручной режим:

Автоматический режим:

Эта функциональность использует SyncTeX для координации между исходным кодом LaTeX и PDF-выводом.

", "editor.latex.pdf_controls.sync_help.title": "Справка по синхронизации LaTeX", "editor.latex.pdf_embed.title": "PDF - Оригинал", "editor.latex.pdf_embed.title.short": "PDF (родной)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "Оглавление", "editor.table_of_contents.short": "Содержание", "editor.terminal.cmd.help.title": "Показать документацию по использованию терминала Linux в CoCalc", + "editor.toggle_pdf_dark_mode.label": "Переключить тёмный режим PDF", + "editor.toggle_pdf_dark_mode.title": "Выключите темный режим PDF, чтобы увидеть оригинальный файл", "file_actions.compress.name": "Сжать", "file_actions.copy.name": "Копировать", "file_actions.create.name": "Создать", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Сохранить изменения", "labels.save_title": "Сохранить этот файл на диск", "labels.search": "Поиск", - "labels.select": "выбрать", + "labels.select": "Выбрать", "labels.select_a_kernel": "Выберите ядро", "labels.settings": "Настройки", "labels.shared": "общий", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Квоты и {upgrades}", "project.page.project-licenses.intro": "Лицензии и улучшения по мере использования изменяют квоты и функции, доступные для проекта.", "project.servers.project-servers.description": "Вы можете запустить различные серверы блокнотов внутри этого проекта одним кликом. Они работают в той же среде, имеют доступ к тем же файлам и останавливаются, когда проект останавливается. Вы также можете запустить свои собственные серверы.", + "project.settings.about-box.color.label": "Цвет (необязательно)", "project.settings.about-box.description.label": "Описание (markdown)", "project.settings.about-box.image.label": "Изображение (необязательно)", "project.settings.about-box.name.label": "Имя (необязательно)", diff --git a/src/packages/frontend/i18n/trans/tr_TR.json b/src/packages/frontend/i18n/trans/tr_TR.json index 6e90758db08..40a5ac0994b 100644 --- a/src/packages/frontend/i18n/trans/tr_TR.json +++ b/src/packages/frontend/i18n/trans/tr_TR.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "Kaynaktan PDF'ye otomatik senkronizasyon: imleç hareketleri PDF'yi kaydırır", "editor.latex.pdf_controls.inverse_sync.tooltip": "PDF'den kaynağa otomatik senkronizasyon: PDF kaydırma imleci hareket ettirir", "editor.latex.pdf_controls.sync_button.tooltip": "Kaynak düzenleyiciye tek seferlik ters senkronizasyon", - "editor.latex.pdf_controls.sync_help.content": "

Manuel Mod:

Otomatik Mod:

Bu işlevsellik, LaTeX kaynağı ile PDF çıktısı arasında eşgüdüm sağlamak için SyncTeX kullanır.

", + "editor.latex.pdf_controls.sync_help.content": "

Manuel Mod:

Otomatik Mod:

Bu işlevsellik, LaTeX kaynağı ve PDF çıktısı arasında koordinasyon sağlamak için SyncTeX kullanır.

", "editor.latex.pdf_controls.sync_help.title": "LaTeX Senkronizasyon Yardımı", "editor.latex.pdf_embed.title": "PDF - Yerel", "editor.latex.pdf_embed.title.short": "PDF (yerel)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "İçindekiler", "editor.table_of_contents.short": "İçindekiler", "editor.terminal.cmd.help.title": "CoCalc'ta Linux Terminalini kullanma belgelerini göster.", + "editor.toggle_pdf_dark_mode.label": "PDF Koyu Modu Değiştir", + "editor.toggle_pdf_dark_mode.title": "PDF'nin karanlık modunu kapat, orijinal dosyayı görmek için", "file_actions.compress.name": "Sıkıştır", "file_actions.copy.name": "Kopyala", "file_actions.create.name": "Oluştur", @@ -1077,7 +1079,7 @@ "labels.save_changes": "Değişiklikleri kaydet", "labels.save_title": "Bu dosyayı diske kaydet", "labels.search": "Ara", - "labels.select": "seç", + "labels.select": "Seç", "labels.select_a_kernel": "Bir çekirdek seç", "labels.settings": "Ayarlar", "labels.shared": "paylaşılan", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "Kotalar ve {upgrades}", "project.page.project-licenses.intro": "Lisanslar ve kullanıldıkça öde yükseltmeleri, bir projeye sunulan kotaları ve özellikleri değiştirir.", "project.servers.project-servers.description": "Bu proje içinde tek tıkla çeşitli defter sunucularını çalıştırabilirsiniz. Aynı ortamda çalışırlar, aynı dosyalara erişirler ve proje durduğunda dururlar. Ayrıca kendi sunucularınızı çalıştırabilirsiniz.", + "project.settings.about-box.color.label": "Renk (isteğe bağlı)", "project.settings.about-box.description.label": "Açıklama (markdown)", "project.settings.about-box.image.label": "Görsel (isteğe bağlı)", "project.settings.about-box.name.label": "İsim (isteğe bağlı)", diff --git a/src/packages/frontend/i18n/trans/zh_CN.json b/src/packages/frontend/i18n/trans/zh_CN.json index 58624606e69..640eeccd487 100644 --- a/src/packages/frontend/i18n/trans/zh_CN.json +++ b/src/packages/frontend/i18n/trans/zh_CN.json @@ -595,7 +595,7 @@ "editor.latex.pdf_controls.forward_sync.tooltip": "从源自动同步到PDF:光标移动滚动PDF", "editor.latex.pdf_controls.inverse_sync.tooltip": "从PDF自动同步到源:PDF滚动移动光标", "editor.latex.pdf_controls.sync_button.tooltip": "一次性反向同步到源编辑器", - "editor.latex.pdf_controls.sync_help.content": "

手动模式:

自动模式:

此功能使用 SyncTeX 在 LaTeX 源代码和 PDF 输出之间进行协调。

", + "editor.latex.pdf_controls.sync_help.content": "

手动模式:

自动模式:

此功能使用 SyncTeX 协调 LaTeX 源文件和 PDF 输出。

", "editor.latex.pdf_controls.sync_help.title": "LaTeX同步帮助", "editor.latex.pdf_embed.title": "PDF - 原生", "editor.latex.pdf_embed.title.short": "PDF(原生)", @@ -608,6 +608,8 @@ "editor.table_of_contents.name": "目录", "editor.table_of_contents.short": "内容", "editor.terminal.cmd.help.title": "显示在 CoCalc 中使用 Linux 终端的文档", + "editor.toggle_pdf_dark_mode.label": "切换 PDF 暗模式", + "editor.toggle_pdf_dark_mode.title": "关闭PDF的暗模式,以查看原始文件", "file_actions.compress.name": "压缩", "file_actions.copy.name": "复制", "file_actions.create.name": "创建", @@ -1335,6 +1337,7 @@ "project.page.project-licenses.header": "配额和{upgrades}", "project.page.project-licenses.intro": "许可证和按需付费升级更改项目的配额和可用功能", "project.servers.project-servers.description": "您可以通过一次点击在此项目内运行各种笔记本服务器。它们在相同的环境中运行,访问相同的文件,并在项目停止时停止。您也可以运行您自己的服务器。", + "project.settings.about-box.color.label": "颜色(可选)", "project.settings.about-box.description.label": "描述 (markdown)", "project.settings.about-box.image.label": "图像(可选)", "project.settings.about-box.name.label": "姓名(可选)", diff --git a/src/packages/frontend/project/history/log-entry.tsx b/src/packages/frontend/project/history/log-entry.tsx index cff0dcb6b9e..e1136d7898a 100644 --- a/src/packages/frontend/project/history/log-entry.tsx +++ b/src/packages/frontend/project/history/log-entry.tsx @@ -5,6 +5,7 @@ import { Space, Tooltip } from "antd"; import React from "react"; import { Avatar } from "@cocalc/frontend/account/avatar/avatar"; +import { avatar_fontcolor } from "@cocalc/frontend/account/avatar/font-color"; import { Col, Grid, Row } from "@cocalc/frontend/antd-bootstrap"; import { CSS, @@ -227,7 +228,9 @@ export const LogEntry: React.FC = React.memo( ); } - function render_start_project(event: ProjectControlEvent): React.JSX.Element { + function render_start_project( + event: ProjectControlEvent, + ): React.JSX.Element { return ( = React.memo( for (const key in obj) { i += 1; const value = obj[key]; - if (key == "image") { + if (key === "image") { result.push( set project image to{" "} @@ -516,6 +519,35 @@ export const LogEntry: React.FC = React.memo( ); continue; } + if (key === "color") { + const textColor = value ? avatar_fontcolor(value) : "black"; + result.push( + + set{" "} + + color + {" "} + to{" "} + + {value || "(none)"} + + , + ); + continue; + } let content = `${key} to ${value}`; if (i < obj.length) { content += "and"; @@ -725,7 +757,9 @@ export const LogEntry: React.FC = React.memo( ); } - function render_invite_nonuser(event: CollaboratorEvent): React.JSX.Element { + function render_invite_nonuser( + event: CollaboratorEvent, + ): React.JSX.Element { return ( = React.memo( ); } - function render_remove_collaborator(event: CollaboratorEvent): React.JSX.Element { + function render_remove_collaborator( + event: CollaboratorEvent, + ): React.JSX.Element { return ( {" "} diff --git a/src/packages/frontend/project/history/log.tsx b/src/packages/frontend/project/history/log.tsx index 6a5bf77a7b8..ff66d915b50 100644 --- a/src/packages/frontend/project/history/log.tsx +++ b/src/packages/frontend/project/history/log.tsx @@ -7,6 +7,7 @@ import { Button } from "antd"; import { List } from "immutable"; import { FormattedMessage } from "react-intl"; import { Virtuoso, VirtuosoHandle } from "react-virtuoso"; + import useVirtuosoScrollHook from "@cocalc/frontend/components/virtuoso-scroll-hook"; import { React, diff --git a/src/packages/frontend/project/settings/about-box.tsx b/src/packages/frontend/project/settings/about-box.tsx index 258f15cf24b..172ee66c817 100644 --- a/src/packages/frontend/project/settings/about-box.tsx +++ b/src/packages/frontend/project/settings/about-box.tsx @@ -4,9 +4,10 @@ */ import ShowError from "@cocalc/frontend/components/error"; -import { Alert, Col, Row, Typography } from "antd"; +import { Alert, Button, Col, Modal, Row, Typography } from "antd"; import React, { useState } from "react"; import { useIntl } from "react-intl"; + import { redux, useAsyncEffect, @@ -20,6 +21,8 @@ import { TextInput, TimeAgo, } from "@cocalc/frontend/components"; +import { avatar_fontcolor } from "@cocalc/frontend/account/avatar/font-color"; +import { ColorPicker } from "@cocalc/frontend/colorpicker"; import { COLORS } from "@cocalc/util/theme"; import { labels } from "@cocalc/frontend/i18n"; import { ProjectTitle } from "@cocalc/frontend/projects/project-title"; @@ -59,6 +62,12 @@ export const AboutBox: React.FC = (props: Readonly) => { const hasReadonlyFields = ["student", "shared"].includes(courseProjectType); const [error, setError] = useState(""); const [avatarImage, setAvatarImage] = useState(undefined); + const [color, setColor] = useState( + project_map?.getIn([project_id, "color"]) as string | undefined, + ); + const [showColorModal, setShowColorModal] = useState(false); + const [nextColor, setNextColor] = useState(color); + const { isProjectBookmarked, setProjectBookmarked } = useBookmarkedProjects(); useAsyncEffect(async () => { @@ -174,16 +183,30 @@ export const AboutBox: React.FC = (props: Readonly) => { vertical={isFlyout} style={{ marginBottom: "15px" }} > -
+
setProjectBookmarked(project_id, !isProjectBookmarked(project_id))} + onClick={() => + setProjectBookmarked( + project_id, + !isProjectBookmarked(project_id), + ) + } /> {isProjectBookmarked(project_id) ? "Enabled" : "Disabled"} @@ -192,7 +215,8 @@ export const AboutBox: React.FC = (props: Readonly) => { {intl.formatMessage({ id: "project.settings.about-box.starred.help", - defaultMessage: "Starred projects can be filtered by clicking the starred filter button in your projects list.", + defaultMessage: + "Starred projects can be filtered by clicking the starred filter button in your projects list.", description: "Help text explaining how project starring works", })} @@ -206,17 +230,120 @@ export const AboutBox: React.FC = (props: Readonly) => { })} vertical={isFlyout} > - { +
+ { + try { + await actions.setProjectImage(project_id, data); + setAvatarImage(data.full); + } catch (err) { + setError(`Error saving project image: ${err}`); + } + }} + /> + {avatarImage && ( + + )} +
+ + +
+ + {color && ( + + )} +
+ { try { - await actions.setProjectImage(project_id, data); - setAvatarImage(data.full); + await actions.setProjectColor(project_id, nextColor ?? ""); + setColor(nextColor); + setShowColorModal(false); } catch (err) { - setError(`Error saving project image: ${err}`); + setError(`Error saving project color: ${err}`); } }} - /> + onCancel={() => { + setShowColorModal(false); + setNextColor(color); + }} + > + { + setNextColor(value); + }} + /> +
{created && ( (current_image); @@ -407,7 +407,7 @@ export function ComputeImageSelector({ >
{`${capitalize(intl.formatMessage(labels.select))}:`}
+ >{`${intl.formatMessage(labels.select)}:`}
{render_selector()}
diff --git a/src/packages/frontend/project_store.ts b/src/packages/frontend/project_store.ts index d64c7b529e7..20b1890eca8 100644 --- a/src/packages/frontend/project_store.ts +++ b/src/packages/frontend/project_store.ts @@ -100,7 +100,7 @@ export interface ProjectStoreState { active_file_sort: TypedMap<{ column_name: string; is_descending: boolean }>; page_number: number; starred_files?: immutable.List; // paths to starred files (synced from conat) - file_action?: string; // undefineds is meaningfully none here + file_action?: string; // undefined is meaningfully none here file_search?: string; show_hidden?: boolean; show_masked?: boolean; diff --git a/src/packages/frontend/projects/actions.ts b/src/packages/frontend/projects/actions.ts index 0ebdac38096..57932fa54f2 100644 --- a/src/packages/frontend/projects/actions.ts +++ b/src/packages/frontend/projects/actions.ts @@ -222,6 +222,32 @@ export class ProjectsActions extends Actions { } }; + setProjectColor = async ( + project_id: string, + color: string, + ): Promise => { + if (!(await this.have_project(project_id))) { + console.warn( + `Can't set project color -- you are not a collaborator on project '${project_id}'.`, + ); + return; + } + const before = store.getIn(["project_map", project_id, "color"]); + if (before === color) return; + try { + // set in the Table + await this.projects_table_set({ project_id, color }); + // create entry in the project's log + await this.redux.getProjectActions(project_id).async_log({ + event: "set", + color, + }); + } catch (err) { + this.projects_table_set({ project_id, color: before }); + throw err; + } + }; + // creates and stores image as a blob in the database. // stores sha1 of that blog in projects map and also returns // the sha1. diff --git a/src/packages/frontend/projects/project-row.tsx b/src/packages/frontend/projects/project-row.tsx index f2f0210ca59..895dc4ad191 100644 --- a/src/packages/frontend/projects/project-row.tsx +++ b/src/packages/frontend/projects/project-row.tsx @@ -7,8 +7,12 @@ Render a single project entry, which goes in the list of projects */ +import { Avatar } from "antd"; +import { CSSProperties, useEffect } from "react"; + import { Col, Row, Well } from "@cocalc/frontend/antd-bootstrap"; import { + CSS, React, redux, useActions, @@ -34,10 +38,9 @@ import track from "@cocalc/frontend/user-tracking"; import { DEFAULT_COMPUTE_IMAGE } from "@cocalc/util/db-schema"; import { KUCALC_COCALC_COM } from "@cocalc/util/db-schema/site-defaults"; import { COLORS } from "@cocalc/util/theme"; -import { Avatar } from "antd"; -import { CSSProperties, useEffect } from "react"; import { ProjectUsers } from "./project-users"; import { useBookmarkedProjects } from "./use-bookmarked-projects"; +import { blendBackgroundColor } from "./util"; const image_name_style: React.CSSProperties = { fontSize: "12px", @@ -210,11 +213,25 @@ export const ProjectRow: React.FC = ({ project_id, index }: Props) => { e.stopPropagation(); } - const project_row_styles: React.CSSProperties = { - backgroundColor: (index ?? 0) % 2 ? "#eee" : "white", + const color = project.get("color"); + const borderStyle = color ? `4px solid ${color}` : undefined; + + // Calculate background color with faint hint of project color + const isEvenRow = (index ?? 0) % 2 === 1; + const baseColor = isEvenRow ? COLORS.GRAY_LL : "white"; // even color same as background in projects-nav.ts ProjectsNav::renderTabBar0 + const backgroundColor = blendBackgroundColor(color, baseColor, isEvenRow); + + const project_row_styles: CSS = { + backgroundColor, marginBottom: 0, cursor: "pointer", wordWrap: "break-word", + ...(borderStyle + ? { + borderLeft: borderStyle, + borderRight: borderStyle, + } + : undefined), }; if (project == null) { @@ -224,7 +241,14 @@ export const ProjectRow: React.FC = ({ project_id, index }: Props) => { return ( - + {!is_anonymous && render_star()} { if (openProjects == null) return []; @@ -280,13 +284,49 @@ export function ProjectsNav(props: ProjectsNavProps) { } function renderTabBar0(tabBarProps, DefaultTabBar) { - return renderTabBar(tabBarProps, DefaultTabBar, { - [activeTopTab]: { - border: "2px solid #d3d3d3", - borderRadius: "8px", - }, - "": { border: "2px solid transparent", borderRadius: "8px" }, - }); + return ( + + {(node) => { + const project_id = node.key; + const isActive = project_id === activeTopTab; + const projectColor = project_map?.getIn([project_id, "color"]) as + | string + | undefined; + + const wrapperStyle: CSS = { + border: isActive + ? `2px solid ${projectColor ? projectColor : "#d3d3d3"}` + : `2px solid ${projectColor ? projectColor : "transparent"}`, + borderRadius: "8px", + }; + + // Add background color if project has a color + if (projectColor) { + // Active tab: lighter/brighter (less color), inactive: darker (more color) + wrapperStyle.backgroundColor = blendBackgroundColor( + projectColor, + isActive ? "white" : COLORS.GRAY_LL, + !isActive, + ); + } + + // Clone the node with additional style props to override Ant Design's background + const styledNode = cloneElement(node, { + style: { + ...node.props.style, + backgroundColor: wrapperStyle.backgroundColor, + }, + }); + + // this is similar to the renderTabBar in sortable-tabs.tsx, but with the above, also styles the background + return ( + + {styledNode} + + ); + }} + + ); } return ( diff --git a/src/packages/frontend/projects/util.ts b/src/packages/frontend/projects/util.ts index 2a22dec68ad..06c0f0115de 100644 --- a/src/packages/frontend/projects/util.ts +++ b/src/packages/frontend/projects/util.ts @@ -194,3 +194,25 @@ function project_is_in_filter( !!project.getIn(["users", account_id, "hide"]) == hidden ); } + +/** + * Blend a base color with a user-selected color to create a subtle hint. + * + * @param custom - The color (hex string or undefined) a user selected for the object + * @param base - The base background color to blend with (i.e. the background, default color) + * @param brighter - Adjust the opacity, e.g. for even/odd rows + */ +export function blendBackgroundColor( + custom: string | undefined, + base: string, + brighter: boolean = false, +): string { + if (!custom) { + return base; + } + + const opacity = brighter ? 0.09 : 0.05; + + // Uses CSS color-mix() to blend the colors + return `color-mix(in srgb, ${custom} ${opacity * 100}%, ${base})`; +} diff --git a/src/packages/util/db-schema/projects.ts b/src/packages/util/db-schema/projects.ts index 088b9a655eb..4115143b371 100644 --- a/src/packages/util/db-schema/projects.ts +++ b/src/packages/util/db-schema/projects.ts @@ -90,6 +90,7 @@ Table({ avatar_image_tiny: null, // do NOT add avatar_image_full here or it will get included in changefeeds, which we don't want. // instead it gets its own virtual table. + color: null, pay_as_you_go_quotas: null, }, }, @@ -113,6 +114,7 @@ Table({ sandbox: true, avatar_image_tiny: true, avatar_image_full: true, + color: true, }, required_fields: { project_id: true, @@ -333,6 +335,12 @@ Table({ desc: "A visual image associated with the project. Could be 150kb. NOT include as part of changefeed of projects, since potentially big (e.g., 200kb x 1000 projects = 200MB!).", render: { type: "image" }, }, + color: { + title: "Color", + type: "string", + desc: "Optional color associated with the project, used for visual identification (e.g., border color in project list).", + render: { type: "text" }, + }, pay_as_you_go_quotas: { type: "map", desc: "Pay as you go quotas that users set so that when they run this project, it gets upgraded to at least what is specified here, and user gets billed later for what is used. Any changes to this table could result in money being spent, so should only be done via the api. This is a map from the account_id of the user that set the quota to the value of the quota spec (which is purchase-quotas.ProjectQuota).",