diff --git a/apps/web/messages/af.json b/apps/web/messages/af.json index 404053fe..64f9d9ce 100644 --- a/apps/web/messages/af.json +++ b/apps/web/messages/af.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Kies 'n nota of skep 'n nuwe een om te begin.", - "titlePlaceholder": "Sonder titel" + "titlePlaceholder": "Sonder titel", + "saving": "Stoor tans…", + "ready": "Gereed", + "saved": "Gestoor {time}", + "stats": "{words} woorde · {read} min lees", + "template": "Sjabloon", + "applyTemplate": "Pas sjabloon toe", + "exportMdLabel": ".md", + "exportMd": "Voer uit as Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Voer uit as HTML", + "focusMode": "Fokusmodus", + "exitFocusMode": "Verlaat fokusmodus", + "save": "Stoor", + "addTag": "Voeg etiket by…", + "removeTag": "Verwyder etiket {tag}", + "loading": "Laai tans…", + "searchHint": "om te soek", + "focusHint": "fokusmodus", + "notePath": "Notapad" }, "context": { "authRequiredError": "Gebruiker nie geverifieer nie", - "defaultTitle": "Sonder titel" + "defaultTitle": "Sonder titel", + "cloudSyncImageError": "Skakel Wolksinkronisasie aan om notaprente te stoor. Teksnotas bly plaaslik." } }, "PasswordManager": { diff --git a/apps/web/messages/ar.json b/apps/web/messages/ar.json index 4fe066b8..409c69a1 100644 --- a/apps/web/messages/ar.json +++ b/apps/web/messages/ar.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "اختر ملاحظة أو أنشئ ملاحظة جديدة للبدء.", - "titlePlaceholder": "بدون عنوان" + "titlePlaceholder": "بدون عنوان", + "saving": "جارٍ الحفظ…", + "ready": "جاهز", + "saved": "تم الحفظ {time}", + "stats": "{words} كلمة · {read} دقيقة قراءة", + "template": "قالب", + "applyTemplate": "تطبيق القالب", + "exportMdLabel": ".md", + "exportMd": "تصدير كـ Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "تصدير كـ HTML", + "focusMode": "وضع التركيز", + "exitFocusMode": "إنهاء وضع التركيز", + "save": "حفظ", + "addTag": "إضافة وسم…", + "removeTag": "إزالة الوسم {tag}", + "loading": "جارٍ التحميل…", + "searchHint": "للبحث", + "focusHint": "وضع التركيز", + "notePath": "مسار الملاحظة" }, "context": { "authRequiredError": "المستخدم غير مصادق", - "defaultTitle": "بدون عنوان" + "defaultTitle": "بدون عنوان", + "cloudSyncImageError": "فعّل المزامنة السحابية لتخزين صور الملاحظات. تبقى الملاحظات النصية محلية." } }, "PasswordManager": { diff --git a/apps/web/messages/ca.json b/apps/web/messages/ca.json index 6395b095..a92b6a0b 100644 --- a/apps/web/messages/ca.json +++ b/apps/web/messages/ca.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Selecciona una nota o crea'n una de nova per començar.", - "titlePlaceholder": "Sense títol" + "titlePlaceholder": "Sense títol", + "saving": "Desant…", + "ready": "A punt", + "saved": "Desat {time}", + "stats": "{words} paraules · {read} min de lectura", + "template": "Plantilla", + "applyTemplate": "Aplica la plantilla", + "exportMdLabel": ".md", + "exportMd": "Exporta com a Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exporta com a HTML", + "focusMode": "Mode concentració", + "exitFocusMode": "Surt del mode concentració", + "save": "Desa", + "addTag": "Afegeix etiqueta…", + "removeTag": "Elimina l'etiqueta {tag}", + "loading": "Carregant…", + "searchHint": "per cercar", + "focusHint": "mode concentració", + "notePath": "Camí de la nota" }, "context": { "authRequiredError": "Usuari no autenticat", - "defaultTitle": "Sense títol" + "defaultTitle": "Sense títol", + "cloudSyncImageError": "Activa la sincronització al núvol per desar imatges de les notes. Les notes de text es queden localment." } }, "PasswordManager": { diff --git a/apps/web/messages/cs.json b/apps/web/messages/cs.json index 3080645c..2dc2b553 100644 --- a/apps/web/messages/cs.json +++ b/apps/web/messages/cs.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Vyberte poznámku nebo vytvořte novou.", - "titlePlaceholder": "Bez názvu" + "titlePlaceholder": "Bez názvu", + "saving": "Ukládání…", + "ready": "Připraveno", + "saved": "Uloženo {time}", + "stats": "{words} slov · {read} min čtení", + "template": "Šablona", + "applyTemplate": "Použít šablonu", + "exportMdLabel": ".md", + "exportMd": "Exportovat jako Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exportovat jako HTML", + "focusMode": "Režim soustředění", + "exitFocusMode": "Ukončit režim soustředění", + "save": "Uložit", + "addTag": "Přidat štítek…", + "removeTag": "Odebrat štítek {tag}", + "loading": "Načítání…", + "searchHint": "pro vyhledávání", + "focusHint": "režim soustředění", + "notePath": "Cesta poznámky" }, "context": { "authRequiredError": "Uživatel není přihlášen", - "defaultTitle": "Bez názvu" + "defaultTitle": "Bez názvu", + "cloudSyncImageError": "Zapněte cloudovou synchronizaci pro ukládání obrázků poznámek. Textové poznámky zůstávají místní." } }, "PasswordManager": { diff --git a/apps/web/messages/da.json b/apps/web/messages/da.json index 6cd654ef..7ddfa0fd 100644 --- a/apps/web/messages/da.json +++ b/apps/web/messages/da.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Vælg en note, eller opret en ny for at komme i gang.", - "titlePlaceholder": "Uden titel" + "titlePlaceholder": "Uden titel", + "saving": "Gemmer…", + "ready": "Klar", + "saved": "Gemt {time}", + "stats": "{words} ord · {read} min læsning", + "template": "Skabelon", + "applyTemplate": "Anvend skabelon", + "exportMdLabel": ".md", + "exportMd": "Eksportér som Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Eksportér som HTML", + "focusMode": "Fokustilstand", + "exitFocusMode": "Afslut fokustilstand", + "save": "Gem", + "addTag": "Tilføj tag…", + "removeTag": "Fjern tag {tag}", + "loading": "Indlæser…", + "searchHint": "for at søge", + "focusHint": "fokustilstand", + "notePath": "Notesti" }, "context": { "authRequiredError": "Brugeren er ikke godkendt", - "defaultTitle": "Uden titel" + "defaultTitle": "Uden titel", + "cloudSyncImageError": "Slå cloudsynkronisering til for at gemme notebilleder. Tekstnoter forbliver lokale." } }, "PasswordManager": { diff --git a/apps/web/messages/de.json b/apps/web/messages/de.json index 6caa3be1..72ef4168 100644 --- a/apps/web/messages/de.json +++ b/apps/web/messages/de.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Wählen Sie eine Notiz oder legen Sie eine neue an.", - "titlePlaceholder": "Ohne Titel" + "titlePlaceholder": "Ohne Titel", + "saving": "Wird gespeichert…", + "ready": "Bereit", + "saved": "Gespeichert {time}", + "stats": "{words} Wörter · {read} Min. Lesezeit", + "template": "Vorlage", + "applyTemplate": "Vorlage anwenden", + "exportMdLabel": ".md", + "exportMd": "Als Markdown exportieren", + "exportHtmlLabel": ".html", + "exportHtml": "Als HTML exportieren", + "focusMode": "Fokusmodus", + "exitFocusMode": "Fokusmodus beenden", + "save": "Speichern", + "addTag": "Tag hinzufügen…", + "removeTag": "Tag {tag} entfernen", + "loading": "Wird geladen…", + "searchHint": "zum Suchen", + "focusHint": "Fokusmodus", + "notePath": "Notizpfad" }, "context": { "authRequiredError": "Benutzer nicht angemeldet", - "defaultTitle": "Ohne Titel" + "defaultTitle": "Ohne Titel", + "cloudSyncImageError": "Aktiviere die Cloud-Synchronisierung, um Notizbilder zu speichern. Textnotizen bleiben lokal." } }, "PasswordManager": { diff --git a/apps/web/messages/el.json b/apps/web/messages/el.json index 535906f6..912b71b2 100644 --- a/apps/web/messages/el.json +++ b/apps/web/messages/el.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Επιλέξτε μια σημείωση ή δημιουργήστε μια νέα για να ξεκινήσετε.", - "titlePlaceholder": "Χωρίς τίτλο" + "titlePlaceholder": "Χωρίς τίτλο", + "saving": "Αποθήκευση…", + "ready": "Έτοιμο", + "saved": "Αποθηκεύτηκε {time}", + "stats": "{words} λέξεις · {read} λεπτά ανάγνωσης", + "template": "Πρότυπο", + "applyTemplate": "Εφαρμογή προτύπου", + "exportMdLabel": ".md", + "exportMd": "Εξαγωγή ως Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Εξαγωγή ως HTML", + "focusMode": "Λειτουργία εστίασης", + "exitFocusMode": "Έξοδος από λειτουργία εστίασης", + "save": "Αποθήκευση", + "addTag": "Προσθήκη ετικέτας…", + "removeTag": "Αφαίρεση ετικέτας {tag}", + "loading": "Φόρτωση…", + "searchHint": "για αναζήτηση", + "focusHint": "λειτουργία εστίασης", + "notePath": "Διαδρομή σημείωσης" }, "context": { "authRequiredError": "Ο χρήστης δεν έχει επικυρωθεί", - "defaultTitle": "Χωρίς τίτλο" + "defaultTitle": "Χωρίς τίτλο", + "cloudSyncImageError": "Ενεργοποιήστε τον συγχρονισμό cloud για αποθήκευση εικόνων σημειώσεων. Οι σημειώσεις κειμένου παραμένουν τοπικές." } }, "PasswordManager": { diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index b75d7296..bce7291c 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -1863,8 +1863,17 @@ "code": "Generate code", "save": "Save request", "importCurl": "Import cURL", + "importCollection": "Import collection (Postman / HAR)", "environments": "Environments", - "shortcuts": "Keyboard shortcuts" + "cookies": "Cookies", + "perfRun": "Performance run", + "fuzzRun": "Fuzz run", + "publicMocks": "Public mocks", + "plugins": "Plugins", + "metrics": "Metrics", + "recorder": "Capture & replay", + "shortcuts": "Keyboard shortcuts", + "extensionImported": "Imported {method} {url} from extension" } }, "RichEditor": { diff --git a/apps/web/messages/es.json b/apps/web/messages/es.json index fd0c8625..7e87ba18 100644 --- a/apps/web/messages/es.json +++ b/apps/web/messages/es.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Selecciona una nota o crea una nueva para comenzar.", - "titlePlaceholder": "Sin título" + "titlePlaceholder": "Sin título", + "saving": "Guardando…", + "ready": "Listo", + "saved": "Guardado {time}", + "stats": "{words} palabras · {read} min de lectura", + "template": "Plantilla", + "applyTemplate": "Aplicar plantilla", + "exportMdLabel": ".md", + "exportMd": "Exportar como Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exportar como HTML", + "focusMode": "Modo concentración", + "exitFocusMode": "Salir del modo concentración", + "save": "Guardar", + "addTag": "Añadir etiqueta…", + "removeTag": "Eliminar etiqueta {tag}", + "loading": "Cargando…", + "searchHint": "para buscar", + "focusHint": "modo concentración", + "notePath": "Ruta de la nota" }, "context": { "authRequiredError": "Usuario no autenticado", - "defaultTitle": "Sin título" + "defaultTitle": "Sin título", + "cloudSyncImageError": "Activa la sincronización en la nube para guardar imágenes de notas. Las notas de texto permanecen locales." } }, "PasswordManager": { diff --git a/apps/web/messages/fa.json b/apps/web/messages/fa.json index e68f40e2..75a90fe8 100644 --- a/apps/web/messages/fa.json +++ b/apps/web/messages/fa.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "برای شروع یادداشتی را انتخاب کنید یا یادداشت جدیدی ایجاد کنید.", - "titlePlaceholder": "بدون عنوان" + "titlePlaceholder": "بدون عنوان", + "saving": "در حال ذخیره…", + "ready": "آماده", + "saved": "ذخیره شد {time}", + "stats": "{words} کلمه · {read} دقیقه مطالعه", + "template": "قالب", + "applyTemplate": "اعمال قالب", + "exportMdLabel": ".md", + "exportMd": "خروجی به‌صورت Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "خروجی به‌صورت HTML", + "focusMode": "حالت تمرکز", + "exitFocusMode": "خروج از حالت تمرکز", + "save": "ذخیره", + "addTag": "افزودن برچسب…", + "removeTag": "حذف برچسب {tag}", + "loading": "در حال بارگذاری…", + "searchHint": "برای جستجو", + "focusHint": "حالت تمرکز", + "notePath": "مسیر یادداشت" }, "context": { "authRequiredError": "کاربر احراز هویت نشده است", - "defaultTitle": "بدون عنوان" + "defaultTitle": "بدون عنوان", + "cloudSyncImageError": "برای ذخیره تصاویر یادداشت، همگام‌سازی ابری را روشن کنید. یادداشت‌های متنی محلی می‌مانند." } }, "PasswordManager": { diff --git a/apps/web/messages/fr.json b/apps/web/messages/fr.json index f7c9f1c8..71cc46cd 100644 --- a/apps/web/messages/fr.json +++ b/apps/web/messages/fr.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Sélectionnez une note ou créez-en une pour commencer.", - "titlePlaceholder": "Sans titre" + "titlePlaceholder": "Sans titre", + "saving": "Enregistrement…", + "ready": "Prêt", + "saved": "Enregistré {time}", + "stats": "{words} mots · {read} min de lecture", + "template": "Modèle", + "applyTemplate": "Appliquer le modèle", + "exportMdLabel": ".md", + "exportMd": "Exporter en Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exporter en HTML", + "focusMode": "Mode concentration", + "exitFocusMode": "Quitter le mode concentration", + "save": "Enregistrer", + "addTag": "Ajouter une étiquette…", + "removeTag": "Supprimer l'étiquette {tag}", + "loading": "Chargement…", + "searchHint": "pour rechercher", + "focusHint": "mode concentration", + "notePath": "Chemin de la note" }, "context": { "authRequiredError": "Utilisateur non authentifié", - "defaultTitle": "Sans titre" + "defaultTitle": "Sans titre", + "cloudSyncImageError": "Activez la synchronisation cloud pour stocker les images des notes. Les notes texte restent locales." } }, "PasswordManager": { diff --git a/apps/web/messages/id.json b/apps/web/messages/id.json index 685ce44f..27ba4a1d 100644 --- a/apps/web/messages/id.json +++ b/apps/web/messages/id.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Pilih catatan atau buat catatan baru untuk memulai.", - "titlePlaceholder": "Tanpa judul" + "titlePlaceholder": "Tanpa judul", + "saving": "Menyimpan…", + "ready": "Siap", + "saved": "Tersimpan {time}", + "stats": "{words} kata · {read} mnt baca", + "template": "Templat", + "applyTemplate": "Terapkan templat", + "exportMdLabel": ".md", + "exportMd": "Ekspor sebagai Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Ekspor sebagai HTML", + "focusMode": "Mode fokus", + "exitFocusMode": "Keluar dari mode fokus", + "save": "Simpan", + "addTag": "Tambah tag…", + "removeTag": "Hapus tag {tag}", + "loading": "Memuat…", + "searchHint": "untuk mencari", + "focusHint": "mode fokus", + "notePath": "Jalur catatan" }, "context": { "authRequiredError": "Pengguna tidak diautentikasi", - "defaultTitle": "Tanpa judul" + "defaultTitle": "Tanpa judul", + "cloudSyncImageError": "Aktifkan Sinkronisasi Cloud untuk menyimpan gambar catatan. Catatan teks tetap lokal." } }, "PasswordManager": { diff --git a/apps/web/messages/it.json b/apps/web/messages/it.json index c94ecb52..dc923dfc 100644 --- a/apps/web/messages/it.json +++ b/apps/web/messages/it.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Seleziona una nota o creane una nuova per iniziare.", - "titlePlaceholder": "Senza titolo" + "titlePlaceholder": "Senza titolo", + "saving": "Salvataggio…", + "ready": "Pronto", + "saved": "Salvato {time}", + "stats": "{words} parole · {read} min di lettura", + "template": "Modello", + "applyTemplate": "Applica modello", + "exportMdLabel": ".md", + "exportMd": "Esporta come Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Esporta come HTML", + "focusMode": "Modalità concentrazione", + "exitFocusMode": "Esci dalla modalità concentrazione", + "save": "Salva", + "addTag": "Aggiungi tag…", + "removeTag": "Rimuovi tag {tag}", + "loading": "Caricamento…", + "searchHint": "per cercare", + "focusHint": "modalità concentrazione", + "notePath": "Percorso della nota" }, "context": { "authRequiredError": "Utente non autenticato", - "defaultTitle": "Senza titolo" + "defaultTitle": "Senza titolo", + "cloudSyncImageError": "Attiva la sincronizzazione cloud per salvare le immagini delle note. Le note di testo restano locali." } }, "PasswordManager": { diff --git a/apps/web/messages/ja.json b/apps/web/messages/ja.json index ba449841..ed767a47 100644 --- a/apps/web/messages/ja.json +++ b/apps/web/messages/ja.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "ノートを選択するか、新しいノートを作成してください。", - "titlePlaceholder": "無題" + "titlePlaceholder": "無題", + "saving": "保存中…", + "ready": "準備完了", + "saved": "{time} に保存", + "stats": "{words} 語 · 読了 {read} 分", + "template": "テンプレート", + "applyTemplate": "テンプレートを適用", + "exportMdLabel": ".md", + "exportMd": "Markdown としてエクスポート", + "exportHtmlLabel": ".html", + "exportHtml": "HTML としてエクスポート", + "focusMode": "集中モード", + "exitFocusMode": "集中モードを終了", + "save": "保存", + "addTag": "タグを追加…", + "removeTag": "タグ {tag} を削除", + "loading": "読み込み中…", + "searchHint": "で検索", + "focusHint": "集中モード", + "notePath": "ノートのパス" }, "context": { "authRequiredError": "ユーザーが認証されていません", - "defaultTitle": "無題" + "defaultTitle": "無題", + "cloudSyncImageError": "ノート画像を保存するにはクラウド同期をオンにしてください。テキストノートはローカルに保存されます。" } }, "PasswordManager": { diff --git a/apps/web/messages/ko.json b/apps/web/messages/ko.json index 537728d6..8eef3fb7 100644 --- a/apps/web/messages/ko.json +++ b/apps/web/messages/ko.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "메모를 선택하거나 새로 만들어 시작하세요.", - "titlePlaceholder": "제목 없음" + "titlePlaceholder": "제목 없음", + "saving": "저장 중…", + "ready": "준비됨", + "saved": "{time}에 저장됨", + "stats": "{words}단어 · 읽기 {read}분", + "template": "템플릿", + "applyTemplate": "템플릿 적용", + "exportMdLabel": ".md", + "exportMd": "Markdown으로 내보내기", + "exportHtmlLabel": ".html", + "exportHtml": "HTML로 내보내기", + "focusMode": "집중 모드", + "exitFocusMode": "집중 모드 종료", + "save": "저장", + "addTag": "태그 추가…", + "removeTag": "태그 {tag} 제거", + "loading": "불러오는 중…", + "searchHint": "검색하려면", + "focusHint": "집중 모드", + "notePath": "노트 경로" }, "context": { "authRequiredError": "사용자가 인증되지 않았습니다", - "defaultTitle": "제목 없음" + "defaultTitle": "제목 없음", + "cloudSyncImageError": "노트 이미지를 저장하려면 클라우드 동기화를 켜세요. 텍스트 노트는 로컬에 유지됩니다." } }, "PasswordManager": { diff --git a/apps/web/messages/ms.json b/apps/web/messages/ms.json index 837a4b32..ff115d0b 100644 --- a/apps/web/messages/ms.json +++ b/apps/web/messages/ms.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Pilih nota atau cipta yang baharu untuk bermula.", - "titlePlaceholder": "Tanpa Tajuk" + "titlePlaceholder": "Tanpa Tajuk", + "saving": "Menyimpan…", + "ready": "Sedia", + "saved": "Disimpan {time}", + "stats": "{words} perkataan · {read} min bacaan", + "template": "Templat", + "applyTemplate": "Guna templat", + "exportMdLabel": ".md", + "exportMd": "Eksport sebagai Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Eksport sebagai HTML", + "focusMode": "Mod fokus", + "exitFocusMode": "Keluar mod fokus", + "save": "Simpan", + "addTag": "Tambah tag…", + "removeTag": "Buang tag {tag}", + "loading": "Memuatkan…", + "searchHint": "untuk mencari", + "focusHint": "mod fokus", + "notePath": "Laluan nota" }, "context": { "authRequiredError": "Pengguna tidak disahkan", - "defaultTitle": "Tanpa Tajuk" + "defaultTitle": "Tanpa Tajuk", + "cloudSyncImageError": "Hidupkan Penyegerakan Awan untuk menyimpan imej nota. Nota teks kekal setempat." } }, "PasswordManager": { diff --git a/apps/web/messages/nb.json b/apps/web/messages/nb.json index a23e3c69..736722fa 100644 --- a/apps/web/messages/nb.json +++ b/apps/web/messages/nb.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Velg et notat eller opprett et nytt for å komme i gang.", - "titlePlaceholder": "Uten tittel" + "titlePlaceholder": "Uten tittel", + "saving": "Lagrer…", + "ready": "Klar", + "saved": "Lagret {time}", + "stats": "{words} ord · {read} min lesing", + "template": "Mal", + "applyTemplate": "Bruk mal", + "exportMdLabel": ".md", + "exportMd": "Eksporter som Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Eksporter som HTML", + "focusMode": "Fokusmodus", + "exitFocusMode": "Avslutt fokusmodus", + "save": "Lagre", + "addTag": "Legg til etikett…", + "removeTag": "Fjern etikett {tag}", + "loading": "Laster…", + "searchHint": "for å søke", + "focusHint": "fokusmodus", + "notePath": "Notatsti" }, "context": { "authRequiredError": "Bruker ikke autentisert", - "defaultTitle": "Uten tittel" + "defaultTitle": "Uten tittel", + "cloudSyncImageError": "Slå på skysynkronisering for å lagre notatbilder. Tekstnotater forblir lokale." } }, "PasswordManager": { diff --git a/apps/web/messages/nl.json b/apps/web/messages/nl.json index a99f1b76..23dfa617 100644 --- a/apps/web/messages/nl.json +++ b/apps/web/messages/nl.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Selecteer een notitie of maak een nieuwe aan om te beginnen.", - "titlePlaceholder": "Naamloos" + "titlePlaceholder": "Naamloos", + "saving": "Opslaan…", + "ready": "Gereed", + "saved": "Opgeslagen {time}", + "stats": "{words} woorden · {read} min lezen", + "template": "Sjabloon", + "applyTemplate": "Sjabloon toepassen", + "exportMdLabel": ".md", + "exportMd": "Exporteren als Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exporteren als HTML", + "focusMode": "Focusmodus", + "exitFocusMode": "Focusmodus verlaten", + "save": "Opslaan", + "addTag": "Tag toevoegen…", + "removeTag": "Tag {tag} verwijderen", + "loading": "Laden…", + "searchHint": "om te zoeken", + "focusHint": "focusmodus", + "notePath": "Notitiepad" }, "context": { "authRequiredError": "Gebruiker niet geauthenticeerd", - "defaultTitle": "Naamloos" + "defaultTitle": "Naamloos", + "cloudSyncImageError": "Schakel cloudsynchronisatie in om notitieafbeeldingen op te slaan. Tekstnotities blijven lokaal." } }, "PasswordManager": { diff --git a/apps/web/messages/pl.json b/apps/web/messages/pl.json index 30418abf..2eb8eccb 100644 --- a/apps/web/messages/pl.json +++ b/apps/web/messages/pl.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Select a note or create a new one to get started.", - "titlePlaceholder": "Untitled" + "titlePlaceholder": "Untitled", + "saving": "Zapisywanie…", + "ready": "Gotowe", + "saved": "Zapisano {time}", + "stats": "{words} słów · {read} min czytania", + "template": "Szablon", + "applyTemplate": "Zastosuj szablon", + "exportMdLabel": ".md", + "exportMd": "Eksportuj jako Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Eksportuj jako HTML", + "focusMode": "Tryb skupienia", + "exitFocusMode": "Wyjdź z trybu skupienia", + "save": "Zapisz", + "addTag": "Dodaj tag…", + "removeTag": "Usuń tag {tag}", + "loading": "Ładowanie…", + "searchHint": "aby wyszukać", + "focusHint": "tryb skupienia", + "notePath": "Ścieżka notatki" }, "context": { "authRequiredError": "User not authenticated", - "defaultTitle": "Untitled" + "defaultTitle": "Untitled", + "cloudSyncImageError": "Włącz synchronizację w chmurze, aby przechowywać obrazy notatek. Notatki tekstowe pozostają lokalne." } }, "PasswordManager": { diff --git a/apps/web/messages/pt-BR.json b/apps/web/messages/pt-BR.json index a5171541..06ffa8f9 100644 --- a/apps/web/messages/pt-BR.json +++ b/apps/web/messages/pt-BR.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Selecione uma nota ou crie uma nova para começar.", - "titlePlaceholder": "Sem Título" + "titlePlaceholder": "Sem Título", + "saving": "Salvando…", + "ready": "Pronto", + "saved": "Salvo {time}", + "stats": "{words} palavras · {read} min de leitura", + "template": "Modelo", + "applyTemplate": "Aplicar modelo", + "exportMdLabel": ".md", + "exportMd": "Exportar como Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exportar como HTML", + "focusMode": "Modo foco", + "exitFocusMode": "Sair do modo foco", + "save": "Salvar", + "addTag": "Adicionar tag…", + "removeTag": "Remover tag {tag}", + "loading": "Carregando…", + "searchHint": "para pesquisar", + "focusHint": "modo foco", + "notePath": "Caminho da nota" }, "context": { "authRequiredError": "Usuário não autenticado", - "defaultTitle": "Sem Título" + "defaultTitle": "Sem Título", + "cloudSyncImageError": "Ative a Sincronização na Nuvem para armazenar imagens das notas. As notas de texto permanecem locais." } }, "PasswordManager": { diff --git a/apps/web/messages/pt.json b/apps/web/messages/pt.json index 52daa566..7dd7eae2 100644 --- a/apps/web/messages/pt.json +++ b/apps/web/messages/pt.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Seleciona uma nota ou cria uma nova para começar.", - "titlePlaceholder": "Sem Título" + "titlePlaceholder": "Sem Título", + "saving": "A guardar…", + "ready": "Pronto", + "saved": "Guardado {time}", + "stats": "{words} palavras · {read} min de leitura", + "template": "Modelo", + "applyTemplate": "Aplicar modelo", + "exportMdLabel": ".md", + "exportMd": "Exportar como Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exportar como HTML", + "focusMode": "Modo de foco", + "exitFocusMode": "Sair do modo de foco", + "save": "Guardar", + "addTag": "Adicionar etiqueta…", + "removeTag": "Remover etiqueta {tag}", + "loading": "A carregar…", + "searchHint": "para pesquisar", + "focusHint": "modo de foco", + "notePath": "Caminho da nota" }, "context": { "authRequiredError": "Utilizador não autenticado", - "defaultTitle": "Sem Título" + "defaultTitle": "Sem Título", + "cloudSyncImageError": "Ative a Sincronização na Nuvem para armazenar imagens das notas. As notas de texto permanecem locais." } }, "PasswordManager": { diff --git a/apps/web/messages/ru.json b/apps/web/messages/ru.json index fdc7c6ef..a7c027bc 100644 --- a/apps/web/messages/ru.json +++ b/apps/web/messages/ru.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Выберите заметку или создайте новую, чтобы начать.", - "titlePlaceholder": "Без названия" + "titlePlaceholder": "Без названия", + "saving": "Сохранение…", + "ready": "Готово", + "saved": "Сохранено {time}", + "stats": "{words} слов · {read} мин чтения", + "template": "Шаблон", + "applyTemplate": "Применить шаблон", + "exportMdLabel": ".md", + "exportMd": "Экспорт в Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Экспорт в HTML", + "focusMode": "Режим фокуса", + "exitFocusMode": "Выйти из режима фокуса", + "save": "Сохранить", + "addTag": "Добавить тег…", + "removeTag": "Удалить тег {tag}", + "loading": "Загрузка…", + "searchHint": "для поиска", + "focusHint": "режим фокуса", + "notePath": "Путь заметки" }, "context": { "authRequiredError": "Пользователь не авторизован", - "defaultTitle": "Без названия" + "defaultTitle": "Без названия", + "cloudSyncImageError": "Включите облачную синхронизацию, чтобы сохранять изображения заметок. Текстовые заметки остаются локальными." } }, "PasswordManager": { diff --git a/apps/web/messages/sv.json b/apps/web/messages/sv.json index dc78bc92..001c0010 100644 --- a/apps/web/messages/sv.json +++ b/apps/web/messages/sv.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Välj en anteckning eller skapa en ny för att komma igång.", - "titlePlaceholder": "Namnlös" + "titlePlaceholder": "Namnlös", + "saving": "Sparar…", + "ready": "Klar", + "saved": "Sparad {time}", + "stats": "{words} ord · {read} min läsning", + "template": "Mall", + "applyTemplate": "Använd mall", + "exportMdLabel": ".md", + "exportMd": "Exportera som Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Exportera som HTML", + "focusMode": "Fokusläge", + "exitFocusMode": "Avsluta fokusläge", + "save": "Spara", + "addTag": "Lägg till tagg…", + "removeTag": "Ta bort tagg {tag}", + "loading": "Laddar…", + "searchHint": "för att söka", + "focusHint": "fokusläge", + "notePath": "Anteckningssökväg" }, "context": { "authRequiredError": "Användaren är inte autentiserad", - "defaultTitle": "Namnlös" + "defaultTitle": "Namnlös", + "cloudSyncImageError": "Aktivera molnsynkronisering för att lagra anteckningsbilder. Textanteckningar förblir lokala." } }, "PasswordManager": { diff --git a/apps/web/messages/tr.json b/apps/web/messages/tr.json index 5a1b1c27..bc59af9f 100644 --- a/apps/web/messages/tr.json +++ b/apps/web/messages/tr.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Başlamak için bir not seçin veya yeni bir not oluşturun.", - "titlePlaceholder": "Başlıksız" + "titlePlaceholder": "Başlıksız", + "saving": "Kaydediliyor…", + "ready": "Hazır", + "saved": "{time} kaydedildi", + "stats": "{words} kelime · {read} dk okuma", + "template": "Şablon", + "applyTemplate": "Şablonu uygula", + "exportMdLabel": ".md", + "exportMd": "Markdown olarak dışa aktar", + "exportHtmlLabel": ".html", + "exportHtml": "HTML olarak dışa aktar", + "focusMode": "Odak modu", + "exitFocusMode": "Odak modundan çık", + "save": "Kaydet", + "addTag": "Etiket ekle…", + "removeTag": "{tag} etiketini kaldır", + "loading": "Yükleniyor…", + "searchHint": "aramak için", + "focusHint": "odak modu", + "notePath": "Not yolu" }, "context": { "authRequiredError": "Kullanıcı kimliği doğrulanmadı", - "defaultTitle": "Başlıksız" + "defaultTitle": "Başlıksız", + "cloudSyncImageError": "Not görsellerini depolamak için Bulut Eşitlemeyi açın. Metin notları yerel kalır." } }, "PasswordManager": { diff --git a/apps/web/messages/uk.json b/apps/web/messages/uk.json index e7333e7e..13ebe4a1 100644 --- a/apps/web/messages/uk.json +++ b/apps/web/messages/uk.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Оберіть нотатку або створіть нову, щоб почати.", - "titlePlaceholder": "Без назви" + "titlePlaceholder": "Без назви", + "saving": "Збереження…", + "ready": "Готово", + "saved": "Збережено {time}", + "stats": "{words} слів · {read} хв читання", + "template": "Шаблон", + "applyTemplate": "Застосувати шаблон", + "exportMdLabel": ".md", + "exportMd": "Експортувати як Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Експортувати як HTML", + "focusMode": "Режим фокусування", + "exitFocusMode": "Вийти з режиму фокусування", + "save": "Зберегти", + "addTag": "Додати тег…", + "removeTag": "Видалити тег {tag}", + "loading": "Завантаження…", + "searchHint": "для пошуку", + "focusHint": "режим фокусування", + "notePath": "Шлях нотатки" }, "context": { "authRequiredError": "Користувач не автентифікований", - "defaultTitle": "Без назви" + "defaultTitle": "Без назви", + "cloudSyncImageError": "Увімкніть хмарну синхронізацію, щоб зберігати зображення нотаток. Текстові нотатки залишаються локальними." } }, "PasswordManager": { diff --git a/apps/web/messages/vi.json b/apps/web/messages/vi.json index bfea25a5..dff80a21 100644 --- a/apps/web/messages/vi.json +++ b/apps/web/messages/vi.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "Chọn ghi chú hoặc tạo mới để bắt đầu.", - "titlePlaceholder": "Không tiêu đề" + "titlePlaceholder": "Không tiêu đề", + "saving": "Đang lưu…", + "ready": "Sẵn sàng", + "saved": "Đã lưu {time}", + "stats": "{words} từ · {read} phút đọc", + "template": "Mẫu", + "applyTemplate": "Áp dụng mẫu", + "exportMdLabel": ".md", + "exportMd": "Xuất dưới dạng Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "Xuất dưới dạng HTML", + "focusMode": "Chế độ tập trung", + "exitFocusMode": "Thoát chế độ tập trung", + "save": "Lưu", + "addTag": "Thêm thẻ…", + "removeTag": "Xóa thẻ {tag}", + "loading": "Đang tải…", + "searchHint": "để tìm kiếm", + "focusHint": "chế độ tập trung", + "notePath": "Đường dẫn ghi chú" }, "context": { "authRequiredError": "Người dùng chưa xác thực", - "defaultTitle": "Không tiêu đề" + "defaultTitle": "Không tiêu đề", + "cloudSyncImageError": "Bật Đồng bộ Đám mây để lưu trữ hình ảnh ghi chú. Ghi chú văn bản vẫn ở cục bộ." } }, "PasswordManager": { diff --git a/apps/web/messages/zh.json b/apps/web/messages/zh.json index db0036ec..006c3780 100644 --- a/apps/web/messages/zh.json +++ b/apps/web/messages/zh.json @@ -914,11 +914,31 @@ }, "editor": { "emptyState": "选择一篇笔记或新建一篇以开始。", - "titlePlaceholder": "无标题" + "titlePlaceholder": "无标题", + "saving": "保存中…", + "ready": "就绪", + "saved": "已于 {time} 保存", + "stats": "{words} 字 · {read} 分钟阅读", + "template": "模板", + "applyTemplate": "应用模板", + "exportMdLabel": ".md", + "exportMd": "导出为 Markdown", + "exportHtmlLabel": ".html", + "exportHtml": "导出为 HTML", + "focusMode": "专注模式", + "exitFocusMode": "退出专注模式", + "save": "保存", + "addTag": "添加标签…", + "removeTag": "移除标签 {tag}", + "loading": "加载中…", + "searchHint": "以搜索", + "focusHint": "专注模式", + "notePath": "笔记路径" }, "context": { "authRequiredError": "用户未登录", - "defaultTitle": "无标题" + "defaultTitle": "无标题", + "cloudSyncImageError": "开启云同步以存储笔记图片。文本笔记保留在本地。" } }, "PasswordManager": { diff --git a/apps/web/src/components/api-client/__tests__/generate-code.test.ts b/apps/web/src/components/api-client/__tests__/generate-code.test.ts new file mode 100644 index 00000000..dfd8d484 --- /dev/null +++ b/apps/web/src/components/api-client/__tests__/generate-code.test.ts @@ -0,0 +1,30 @@ +import { generateCode } from "../generate-code" +import type { ApiRequestState } from "../types" + +function gqlRequest(graphqlVariables?: string): ApiRequestState { + return { + method: "POST", + url: "https://api.example.com/graphql", + headers: [], + params: [], + auth: { type: "none" }, + body: { type: "graphql", content: "query { me { id } }", graphqlVariables }, + } as unknown as ApiRequestState +} + +describe("generateCode graphql body", () => { + it("serialises query + variables as JSON with application/json", () => { + const curl = generateCode(gqlRequest('{"id": 1}'), "curl") + expect(curl).toContain('"query":"query { me { id } }"') + expect(curl).toContain('"variables":{"id":1}') + expect(curl).toContain("Content-Type: application/json") + }) + + it("emits query-only payload when variables missing or invalid", () => { + for (const vars of [undefined, "not json"]) { + const curl = generateCode(gqlRequest(vars), "curl") + expect(curl).toContain('{"query":"query { me { id } }"}') + expect(curl).not.toContain('"variables"') + } + }) +}) diff --git a/apps/web/src/components/api-client/p2p-sync-dialog.tsx b/apps/web/src/components/api-client/p2p-sync-dialog.tsx deleted file mode 100644 index 5f839066..00000000 --- a/apps/web/src/components/api-client/p2p-sync-dialog.tsx +++ /dev/null @@ -1,138 +0,0 @@ -"use client" - -import * as React from "react" -import { - Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, -} from "@/components/ui/dialog" -import { Button } from "@/components/ui/button" -import { Textarea } from "@/components/ui/textarea" -import { Label } from "@/components/ui/label" -import { createOffer, acceptOffer, applyAnswer, type PeerSyncHandle } from "@/lib/p2p/peer-sync" -import { useCollectionsState, useCollectionsActions } from "./context/collections-context" -import type { Collection } from "./types" -import { toast } from "sonner" - -interface P2pSyncDialogProps { - open: boolean - onOpenChange: (open: boolean) => void -} - -export function P2pSyncDialog({ open, onOpenChange }: P2pSyncDialogProps) { - const { collections } = useCollectionsState() - const { importCollection } = useCollectionsActions() - const [mode, setMode] = React.useState<"offer" | "accept">("offer") - const [offerSdp, setOfferSdp] = React.useState("") - const [answerSdp, setAnswerSdp] = React.useState("") - const [handleRef, setHandleRef] = React.useState(null) - const [status, setStatus] = React.useState("idle") - - React.useEffect(() => () => handleRef?.close(), [handleRef]) - - const startAsOfferer = async () => { - setStatus("creating offer…") - const { handle, offer } = await createOffer({ - onOpen: () => { - setStatus("connected — sending collections") - try { handle.send({ kind: "collections", payload: collections }) } - catch (e) { toast.error((e as Error).message) } - }, - onMessage: async (msg) => { - const data = msg as { kind?: string; payload?: Collection[] } - if (data?.kind === "collections" && Array.isArray(data.payload)) { - let imported = 0 - for (const c of data.payload) { - const out = await importCollection(c) - if (out) imported++ - } - toast.success(`Imported ${imported} peer collections`) - } - }, - onClose: () => setStatus("disconnected"), - }) - setHandleRef(handle) - setOfferSdp(offer) - setStatus("share the offer SDP with peer; paste their answer below") - } - - const acceptAsReceiver = async () => { - if (!offerSdp.trim()) return - setStatus("accepting offer…") - const { handle, answer } = await acceptOffer(offerSdp, { - onOpen: () => { - setStatus("connected — sending collections") - try { handle.send({ kind: "collections", payload: collections }) } - catch (e) { toast.error((e as Error).message) } - }, - onMessage: async (msg) => { - const data = msg as { kind?: string; payload?: Collection[] } - if (data?.kind === "collections" && Array.isArray(data.payload)) { - let imported = 0 - for (const c of data.payload) { - const out = await importCollection(c) - if (out) imported++ - } - toast.success(`Imported ${imported} peer collections`) - } - }, - onClose: () => setStatus("disconnected"), - }) - setHandleRef(handle) - setAnswerSdp(answer) - setStatus("share the answer SDP back to the offerer") - } - - const applyPeerAnswer = async () => { - if (!handleRef || !answerSdp.trim()) return - await applyAnswer(handleRef, answerSdp) - setStatus("waiting for channel to open…") - } - - return ( - - - - Peer sync (WebRTC) - - Direct E2E-encrypted swap of collections between two clients. Out-of-band signalling — - copy/paste the SDP blobs over any side channel. - - -
- - - {status} -
- {mode === "offer" ? ( -
- - {offerSdp && ( - <> - -