diff --git a/.vscode/settings.json b/.vscode/settings.json index 90df72732..3e7279101 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -75,7 +75,7 @@ "editor.defaultFormatter": "biomejs.biome" }, "[json]": { - "editor.defaultFormatter": "biomejs.biome" + "editor.defaultFormatter": "vscode.json-language-features" }, "[css]": { "editor.defaultFormatter": "biomejs.biome" diff --git a/App.tsx b/App.tsx index 3737af62c..2b252b260 100644 --- a/App.tsx +++ b/App.tsx @@ -58,6 +58,7 @@ import { hasPassphraseSentinel, isIdbEncryptionReady, } from './services/storage/storageEncryptionService'; +import { initTauriDeepLink } from './services/tauriDeepLink'; import { registerTauriMenuHandler, unregisterTauriMenuHandler } from './services/tauriMenuService'; import { viewNavigationLabelKey } from './services/viewNavigationLabels'; import type { View } from './types'; @@ -490,6 +491,17 @@ const App: FC = ({ isNewUser }) => { return () => unregisterTauriMenuHandler(); }, [executeCommand]); + // QNBS-v3: Tauri deep link handler for native file associations (.storycraft, .scst) + useEffect(() => { + let cleanup: (() => void) | undefined; + void initTauriDeepLink(dispatch, t).then((fn) => { + cleanup = fn; + }); + return () => { + cleanup?.(); + }; + }, [dispatch, t]); + const renderView = () => { switch (currentView) { case 'dashboard': diff --git a/TODO.md b/TODO.md index f287a0582..6f16a2e52 100644 --- a/TODO.md +++ b/TODO.md @@ -17,6 +17,7 @@ Status: 🔄 in progress | ⬜ open | ✅ done - ✅ **P0-2** — Coverage C-7: 96 neue Tests geschrieben (Ziel 90 übertroffen). - LoRA: datasetBuilder (19) + evaluationService (16) - Voice: intentEngine (17) + feedbackService (23) + audioNavigator (21) +- ✅ **P0-4** — Native File Associations + Single-Instance: `.storycraft`/`.scst` extensions registered, deep link handler in `services/tauriDeepLink.ts`, Rust `RunEvent::Opened`/`RunEvent::SecondInstance` handlers in `lib.rs`. - 🔄 **P0-3** — Quality Gates stabil: lint ✅ · typecheck ✅ · i18n:check ✅ (2026-06-07). parity:check + bundle:budget + smoke:prod benötigen Build → CI-only auf Low-End. Warte auf nächsten CI-Run für Bestätigung. ### P1 — AI Resilience & Core Reliability diff --git a/docs/TAURI-CI.md b/docs/TAURI-CI.md index 37eacd5f5..bd639a363 100644 --- a/docs/TAURI-CI.md +++ b/docs/TAURI-CI.md @@ -119,6 +119,36 @@ Complete these steps once before pushing the first signed release tag: | Updater | `docs/TAURI-UPDATER.md` when publishing signed tags | | Local CI | Heavy builds optional — `infra/low-end-ci/` act + native `pnpm run ci:quick` | | Version UI | Settings shows app version; matches release tag after install | +| File Associations | `.storycraft` and `.scst` extensions registered; double-click opens project | +| Single-Instance | Second instance focuses main window + opens file via `RunEvent::SecondInstance` | + +## Native File Associations (v1.20) + +StoryCraft Studio registers `.storycraft` and `.scst` file extensions for native project opening. + +### Configuration + +- `tauri.conf.json` → `bundle.fileAssociations` registers both extensions with `role: "Editor"` +- `tauri.conf.json` → `app.deepLink.protocols` enables `storycraft://` protocol +- `src-tauri/src/lib.rs` → `RunEvent::Opened` and `RunEvent::SecondInstance` handlers +- `services/tauriDeepLink.ts` → Frontend event listener for `open-project-file` + +### Behavior + +1. **Double-click** a `.storycraft` or `.scst` file → App opens (or activates existing instance) and loads the project +2. **Drag-drop** file onto app icon → Same behavior as double-click +3. **Second instance** → Main window focused, file opened in existing instance +4. **Error handling** → Toast notification with error details if file cannot be loaded + +### Icon Preparation + +Create icons in `icons/` directory: +- `icons/storycraft-16x16.png` - File icon for Windows/Linux +- `icons/storycraft-32x32.png` - File icon for Windows/Linux +- `icons/storycraft-48x48.png` - File icon for Windows/Linux +- `icons/storycraft-256x256.png` - File icon for Windows/Linux + +macOS uses the existing `icons/icon.icns` for file associations. **Post-release (updater):** diff --git a/locales/ar/common.json b/locales/ar/common.json index 134a96953..b1c33aef2 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "خطأ داخلي في قاعدة البيانات. يرجى إعادة تحميل الصفحة.", "error.db.quotaExceeded": "تخزين المتصفّح ممتلئ. يرجى حذف المشاريع أو اللقطات القديمة.", "error.db.unknown": "خطأ غير معروف أثناء الوصول إلى قاعدة البيانات.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "خطأ في استيراد الملف", "error.mic.denied": "تم رفض الوصول إلى الميكروفون. يرجى منح الإذن في إعدادات متصفّحك.", "error.mic.generic": "خطأ في التعرّف على الكلام: {{error}}", diff --git a/locales/ar/portal.json b/locales/ar/portal.json index a7f43df47..fffec1959 100644 --- a/locales/ar/portal.json +++ b/locales/ar/portal.json @@ -1,6 +1,5 @@ { "portal.back": "رجوع", - "portal.language.searchPlaceholder": "البحث في اللغات...", "portal.demo.chapterContent": "تشبّث ضباب الصباح بالأرصفة بينما فردت ليرا خريطة المدينة القديمة. كانت دائرة باهتة تحدّد الركن الشمالي الغربي — البرج الذي لا يذكره أحد.\n\nطوت الورقة وتبعت الممر الضيق حتى ارتفعت أمامها الشبكة الحديدية. كان القفل دافئًا تحت الشمس؛ أما المعدن فظلّ باردًا.", "portal.demo.chapterTitle": "الفصل الأول — أمام البوابة", "portal.demo.logline": "عيّنة قصيرة لتجربة المخطط والمخطوطة ومساحة العمل.", @@ -18,6 +17,7 @@ "portal.features.worldbuilding.description": "Rich dossiers, atlases, AI portraits, and relationship maps.", "portal.features.worldbuilding.title": "Characters & Worlds", "portal.language.groupLabel": "لغة شاشة الترحيب", + "portal.language.searchPlaceholder": "البحث في اللغات...", "portal.new.ai.description": "قدّم فكرة بسيطة ودع الذكاء الاصطناعي يبني لك مخطط حبكة مفصّلًا.", "portal.new.ai.title": "التوليد بالذكاء الاصطناعي", "portal.new.blank.description": "لمن يعرف وجهته. ابدأ بفصل أول فارغ.", diff --git a/locales/de/common.json b/locales/de/common.json index 338a68707..46359a73a 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama nicht erreichbar ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama nicht erreichbar ({{url}}). Stellen Sie sicher, dass Ollama läuft: ollama serve", "error.snapshotError": "Sicherungsfehler", + "error.deepLink.title": "Fehler beim Öffnen der Projektdatei", + "error.deepLink.unknown": "Unbekannter Fehler", "export.epubExport": "EPUB 3.0 exportieren", "export.section": "Abschnitt {{index}}", "header.openMenu": "Menü öffnen", diff --git a/locales/el/characterInterviews.json b/locales/el/characterInterviews.json index 988a35da1..618c0ea65 100644 --- a/locales/el/characterInterviews.json +++ b/locales/el/characterInterviews.json @@ -1,39 +1,39 @@ { - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel" + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews" } diff --git a/locales/el/characters.json b/locales/el/characters.json index 40b864d9f..d1f4d9dee 100644 --- a/locales/el/characters.json +++ b/locales/el/characters.json @@ -1,73 +1,73 @@ { - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name" + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters" } diff --git a/locales/el/common.json b/locales/el/common.json index e892de579..b4881a64f 100644 --- a/locales/el/common.json +++ b/locales/el/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "Σφάλμα εσωτερικής βάσης δεδομένων. Επαναλάβετε τη φόρτωση της σελίδας.", "error.db.quotaExceeded": "Ο χώρος αποθήκευσης του προγράμματος περιήγησης είναι πλήρης. Διαγράψτε παλιά έργα ή στιγμιότυπα.", "error.db.unknown": "Άγνωστο σφάλμα κατά την πρόσβαση στη βάση δεδομένων.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "Σφάλμα εισαγωγής αρχείου", "error.mic.denied": "Δεν επιτρέπεται η πρόσβαση στο μικρόφωνο. Παρακαλούμε χορηγήστε άδεια στις ρυθμίσεις του προγράμματος περιήγησής σας.", "error.mic.generic": "Σφάλμα αναγνώρισης ομιλίας: {{σφάλμα}}", diff --git a/locales/el/dashboard.json b/locales/el/dashboard.json index 10aacec64..a18bdf953 100644 --- a/locales/el/dashboard.json +++ b/locales/el/dashboard.json @@ -1,109 +1,109 @@ { - "initialProject.title": "Η ιστορία μου χωρίς τίτλο", - "initialProject.logline": "Ένα ταξίδι χιλίων μιλίων ξεκινά με ένα μόνο βήμα...", - "initialProject.chapter1": "Κεφάλαιο 1", - "dashboard.greeting": "Καλώς ήρθατε πίσω στο", - "dashboard.noLogline": "Δεν υπάρχει σύνδεση ακόμα. Προσθέστε ένα στον επιθεωρητή χειρογράφων!", - "dashboard.continueWriting.title": "Συνεχίστε να γράφετε", - "dashboard.continueWriting.button": "Μετάβαση πίσω", - "dashboard.continueWriting.empty": "Ξεκινήστε την ιστορία σας στην προβολή χειρόγραφου.", - "dashboard.goals.title": "Στόχοι Έργου", - "dashboard.goals.wordCount": "Καταμέτρηση λέξεων", - "dashboard.goals.deadline": "Διορία", - "dashboard.goals.noDeadline": "Δεν έχει οριστεί προθεσμία", - "dashboard.goals.daysLeft": "Απομένουν {{count}} ημέρες", - "dashboard.goals.dayLeft": "1 ημέρα έμεινε", - "dashboard.goals.noDaysLeft": "Προθεσμία σήμερα", - "dashboard.goals.overdue": "Εκπρόθεσμος", - "dashboard.goals.setGoal": "Θέστε στόχο", - "dashboard.goals.editGoal": "Επεξεργασία στόχου", - "dashboard.goals.modal.title": "Θέστε Στόχους Έργου", - "dashboard.goals.modal.wordCountLabel": "Στόχος πλήθους λέξεων", - "dashboard.goals.modal.deadlineLabel": "Προθεσμία στόχου (Προαιρετικό)", - "dashboard.goals.modal.save": "Αποθήκευση στόχων", - "dashboard.goals.wordsRemaining": "{{count}} λέξεις απομένουν", - "dashboard.goals.pace.title": "Βήμα", - "dashboard.goals.pace.perDayUnit": "/ημέρα", - "dashboard.goals.pace.onTrack": "Σε τροχιά", - "dashboard.goals.pace.behind": "Πίσω από το ρυθμό", - "dashboard.goals.pace.done": "Ο στόχος επιτεύχθηκε", - "dashboard.goals.pace.noDeadline": "Ορίστε μια προθεσμία", - "dashboard.glance.title": "Με μια ματιά", - "dashboard.glance.recentCharacter": "Πρόσφατος χαρακτήρας", - "dashboard.glance.recentWorld": "Πρόσφατος κόσμος", - "dashboard.glance.noCharacters": "Δεν υπάρχουν ακόμη χαρακτήρες.", - "dashboard.glance.noWorlds": "Δεν υπάρχουν ακόμη κόσμοι.", - "dashboard.stats.title": "Στατιστικά έργου", - "dashboard.stats.characters": "Χαρακτήρες", - "dashboard.stats.worlds": "Κόσμοι", - "dashboard.stats.outlineSections": "Ενότητες περίγραμμα", - "dashboard.stats.totalWordCount": "Λόγια", - "dashboard.healthScore.title": "Υγεία έργου", - "dashboard.healthScore.body": "Ένας ελαφρύς συνδυασμός προόδου στόχου, βάθους εκμαγείου και κάλυψης οικοδόμησης κόσμου.", - "dashboard.healthScore.scoreLabel": "Σκορ", - "dashboard.healthScore.writing": "Πρόοδος γραφής", - "dashboard.healthScore.cast": "Βάθος χύτευσης", - "dashboard.healthScore.world": "οικοδόμηση κόσμου", - "dashboard.quickAccess.title": "Γρήγορες Ενέργειες", - "dashboard.quickAccess.manuscriptDesc": "Μεταβείτε στον επεξεργαστή χειρογράφων για να γράψετε και να οργανώσετε.", - "dashboard.quickAccess.writerDesc": "Χρησιμοποιήστε το AI Writing Studio για να ξεπεράσετε το μπλοκ του συγγραφέα.", - "dashboard.quickAccess.outlineDesc": "Δημιουργήστε μια νέα δομή γραφικής παράστασης με το περίγραμμα AI.", - "dashboard.quickAccess.charactersDesc": "Διαχειριστείτε το καστ των χαρακτήρων σας στους φακέλους.", - "dashboard.quickAccess.worldDesc": "Δημιουργήστε και εξερευνήστε τους κόσμους της ιστορίας σας.", - "dashboard.quickAccess.exportDesc": "Μορφοποιήστε και κατεβάστε το ολοκληρωμένο έργο σας.", - "dashboard.details.title": "Λεπτομέρειες ιστορίας", - "dashboard.details.projectTitle": "Τίτλος Έργου", - "dashboard.details.projectTitlePlaceholder": "Η φοβερή μου ιστορία", - "dashboard.details.logline": "Σύνδεση", - "dashboard.details.loglinePlaceholder": "Μια περίληψη μιας πρότασης της ιστορίας σας.", - "dashboard.details.aiLoglineButton": "Βοηθός σύνδεσης AI", - "dashboard.loglineModal.title": "Προτάσεις σύνδεσης AI", - "dashboard.loglineModal.loading": "Δημιουργία λαμπρών λογαριασμών σύνδεσης...", - "dashboard.onboarding.title": "Γρήγορες συμβουλές", - "dashboard.onboarding.tip1": "Χρησιμοποιήστε την πλαϊνή γραμμή για εναλλαγή μεταξύ Manuscript, Characters, Worlds και Export.", - "dashboard.onboarding.tip2": "Προσθέστε ένα κλειδί API στις Ρυθμίσεις για να ξεκλειδώσετε το cloud AI ή επιλέξτε Ollama για τοπικά μοντέλα.", - "dashboard.onboarding.tip3": "Η εργασία σας αποθηκεύεται αυτόματα σε αυτήν τη συσκευή — τα στιγμιότυπα είναι διαθέσιμα στον Έλεγχο έκδοσης.", - "dashboard.onboarding.dismiss": "Κατάλαβα", - "dashboard.onboarding.startTour": "Εκδρομή με ξεναγό", - "dashboard.authorInsights.title": "Insights για τη διοχέτευση του συγγραφέα", "dashboard.authorInsights.readability": "Αναγνωσιμότητα (Flesch-style, EN ευρετικό)", - "dashboard.authorInsights.readabilityNeedMore": "Γράψτε λίγο περισσότερο — η αναγνωσιμότητα χρειάζεται ~40+ λέξεις για μια σταθερή βαθμολογία.", "dashboard.authorInsights.readabilityFootnote": "Οι υψηλότερες βαθμολογίες συνήθως σημαίνουν ευκολότερη ανάγνωση. συντονιστείτε για το είδος σας σκόπιμα.", + "dashboard.authorInsights.readabilityNeedMore": "Γράψτε λίγο περισσότερο — η αναγνωσιμότητα χρειάζεται ~40+ λέξεις για μια σταθερή βαθμολογία.", "dashboard.authorInsights.timeline": "Έλεγχοι χρονοδιαγράμματος σκηνής", "dashboard.authorInsights.timelineClear": "Δεν υπάρχουν προειδοποιήσεις για το χρονοδιάγραμμα από τα μεταδεδομένα σκηνής.", "dashboard.authorInsights.timelineWarnBadge": "{{count}} προειδοποιήσεις — βελτιώστε τις ημερομηνίες/διάρκειες των σκηνών στον πίνακα σκηνής.", - "dashboard.backup.title": "Δημιουργία αντιγράφων ασφαλείας και επαναφορά", - "dashboard.backup.hint": "Εξάγετε το έργο σας, εισαγάγετε ένα αντίγραφο ασφαλείας ή ανοίξτε τις ρυθμίσεις πλήρους αντιγράφου ασφαλείας.", + "dashboard.authorInsights.title": "Insights για τη διοχέτευση του συγγραφέα", "dashboard.backup.exportJson": "Εξαγωγή JSON", + "dashboard.backup.hint": "Εξάγετε το έργο σας, εισαγάγετε ένα αντίγραφο ασφαλείας ή ανοίξτε τις ρυθμίσεις πλήρους αντιγράφου ασφαλείας.", "dashboard.backup.importJson": "Εισαγωγή JSON", - "dashboard.backup.openSettings": "Ρυθμίσεις δημιουργίας αντιγράφων ασφαλείας", "dashboard.backup.latestSnapshot": "Τελευταίο στιγμιότυπο: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Ρυθμίσεις δημιουργίας αντιγράφων ασφαλείας", + "dashboard.backup.title": "Δημιουργία αντιγράφων ασφαλείας και επαναφορά", "dashboard.backup.unnamedSnapshot": "Στιγμιότυπο χωρίς όνομα", + "dashboard.composition.avgPerScene": "Μέσος / σκηνή", + "dashboard.composition.empty": "Προσθέστε σκηνές στο Χειρόγραφο για να δείτε τη σύνθεσή του.", + "dashboard.composition.readingTime": "Ώρα ανάγνωσης", + "dashboard.composition.readingTimeValue": "{{count}} λεπτά", + "dashboard.composition.scenes": "Σκηνές", + "dashboard.composition.status.draft": "Προσχέδιο", + "dashboard.composition.status.final": "Τελικός", + "dashboard.composition.status.firstDraft": "Πρώτο σχέδιο", + "dashboard.composition.status.outline": "Περίγραμμα", + "dashboard.composition.status.revised": "Αναθεωρημένο", + "dashboard.composition.status.untracked": "Χωρίς παρακολούθηση", + "dashboard.composition.title": "Σύνθεση χειρογράφου", + "dashboard.continueWriting.button": "Μετάβαση πίσω", + "dashboard.continueWriting.empty": "Ξεκινήστε την ιστορία σας στην προβολή χειρόγραφου.", + "dashboard.continueWriting.title": "Συνεχίστε να γράφετε", + "dashboard.details.aiLoglineButton": "Βοηθός σύνδεσης AI", + "dashboard.details.logline": "Σύνδεση", + "dashboard.details.loglinePlaceholder": "Μια περίληψη μιας πρότασης της ιστορίας σας.", + "dashboard.details.projectTitle": "Τίτλος Έργου", + "dashboard.details.projectTitlePlaceholder": "Η φοβερή μου ιστορία", + "dashboard.details.title": "Λεπτομέρειες ιστορίας", + "dashboard.glance.noCharacters": "Δεν υπάρχουν ακόμη χαρακτήρες.", + "dashboard.glance.noWorlds": "Δεν υπάρχουν ακόμη κόσμοι.", + "dashboard.glance.recentCharacter": "Πρόσφατος χαρακτήρας", + "dashboard.glance.recentWorld": "Πρόσφατος κόσμος", + "dashboard.glance.title": "Με μια ματιά", + "dashboard.goals.dayLeft": "1 ημέρα έμεινε", + "dashboard.goals.daysLeft": "Απομένουν {{count}} ημέρες", + "dashboard.goals.deadline": "Διορία", + "dashboard.goals.editGoal": "Επεξεργασία στόχου", + "dashboard.goals.modal.deadlineLabel": "Προθεσμία στόχου (Προαιρετικό)", + "dashboard.goals.modal.save": "Αποθήκευση στόχων", + "dashboard.goals.modal.title": "Θέστε Στόχους Έργου", + "dashboard.goals.modal.wordCountLabel": "Στόχος πλήθους λέξεων", + "dashboard.goals.noDaysLeft": "Προθεσμία σήμερα", + "dashboard.goals.noDeadline": "Δεν έχει οριστεί προθεσμία", + "dashboard.goals.overdue": "Εκπρόθεσμος", + "dashboard.goals.pace.behind": "Πίσω από το ρυθμό", + "dashboard.goals.pace.done": "Ο στόχος επιτεύχθηκε", + "dashboard.goals.pace.noDeadline": "Ορίστε μια προθεσμία", + "dashboard.goals.pace.onTrack": "Σε τροχιά", + "dashboard.goals.pace.perDayUnit": "/ημέρα", + "dashboard.goals.pace.title": "Βήμα", + "dashboard.goals.setGoal": "Θέστε στόχο", + "dashboard.goals.title": "Στόχοι Έργου", + "dashboard.goals.wordCount": "Καταμέτρηση λέξεων", + "dashboard.goals.wordsRemaining": "{{count}} λέξεις απομένουν", + "dashboard.greeting": "Καλώς ήρθατε πίσω στο", "dashboard.header.ariaLabel": "Επισκόπηση έργου", - "dashboard.header.greetingMorning": "Καλημέρα", "dashboard.header.greetingAfternoon": "Καλημέρα", "dashboard.header.greetingEvening": "Καλησπέρα", + "dashboard.header.greetingMorning": "Καλημέρα", "dashboard.header.greetingNight": "Καίγοντας το μεταμεσονύκτιο λάδι", "dashboard.header.lastEdited": "Τελευταία επεξεργασία: {{title}}", - "dashboard.momentum.title": "Συγγραφική ορμή", + "dashboard.healthScore.body": "Ένας ελαφρύς συνδυασμός προόδου στόχου, βάθους εκμαγείου και κάλυψης οικοδόμησης κόσμου.", + "dashboard.healthScore.cast": "Βάθος χύτευσης", + "dashboard.healthScore.scoreLabel": "Σκορ", + "dashboard.healthScore.title": "Υγεία έργου", + "dashboard.healthScore.world": "οικοδόμηση κόσμου", + "dashboard.healthScore.writing": "Πρόοδος γραφής", + "dashboard.loglineModal.loading": "Δημιουργία λαμπρών λογαριασμών σύνδεσης...", + "dashboard.loglineModal.title": "Προτάσεις σύνδεσης AI", + "dashboard.momentum.activity": "Τελευταίες 14 ημέρες", "dashboard.momentum.dayStreak": "σερί ημέρας", + "dashboard.momentum.goalReached": "Ο στόχος επιτεύχθηκε", "dashboard.momentum.longest": "Καλύτερο: {{count}}", - "dashboard.momentum.today": "Σήμερα", - "dashboard.momentum.thisWeek": "Αυτή την εβδομάδα", - "dashboard.momentum.ofGoal": "{{τρέχον}} / {{στόχος}}", - "dashboard.momentum.activity": "Τελευταίες 14 ημέρες", "dashboard.momentum.noActivity": "Δεν έχει καταγραφεί ακόμα γραφή — ξεκινήστε μια συνεδρία για να δημιουργήσετε τη σειρά σας.", - "dashboard.momentum.goalReached": "Ο στόχος επιτεύχθηκε", - "dashboard.composition.title": "Σύνθεση χειρογράφου", - "dashboard.composition.scenes": "Σκηνές", - "dashboard.composition.avgPerScene": "Μέσος / σκηνή", - "dashboard.composition.readingTime": "Ώρα ανάγνωσης", - "dashboard.composition.readingTimeValue": "{{count}} λεπτά", - "dashboard.composition.empty": "Προσθέστε σκηνές στο Χειρόγραφο για να δείτε τη σύνθεσή του.", - "dashboard.composition.status.outline": "Περίγραμμα", - "dashboard.composition.status.draft": "Προσχέδιο", - "dashboard.composition.status.firstDraft": "Πρώτο σχέδιο", - "dashboard.composition.status.revised": "Αναθεωρημένο", - "dashboard.composition.status.final": "Τελικός", - "dashboard.composition.status.untracked": "Χωρίς παρακολούθηση" + "dashboard.momentum.ofGoal": "{{τρέχον}} / {{στόχος}}", + "dashboard.momentum.thisWeek": "Αυτή την εβδομάδα", + "dashboard.momentum.title": "Συγγραφική ορμή", + "dashboard.momentum.today": "Σήμερα", + "dashboard.noLogline": "Δεν υπάρχει σύνδεση ακόμα. Προσθέστε ένα στον επιθεωρητή χειρογράφων!", + "dashboard.onboarding.dismiss": "Κατάλαβα", + "dashboard.onboarding.startTour": "Εκδρομή με ξεναγό", + "dashboard.onboarding.tip1": "Χρησιμοποιήστε την πλαϊνή γραμμή για εναλλαγή μεταξύ Manuscript, Characters, Worlds και Export.", + "dashboard.onboarding.tip2": "Προσθέστε ένα κλειδί API στις Ρυθμίσεις για να ξεκλειδώσετε το cloud AI ή επιλέξτε Ollama για τοπικά μοντέλα.", + "dashboard.onboarding.tip3": "Η εργασία σας αποθηκεύεται αυτόματα σε αυτήν τη συσκευή — τα στιγμιότυπα είναι διαθέσιμα στον Έλεγχο έκδοσης.", + "dashboard.onboarding.title": "Γρήγορες συμβουλές", + "dashboard.quickAccess.charactersDesc": "Διαχειριστείτε το καστ των χαρακτήρων σας στους φακέλους.", + "dashboard.quickAccess.exportDesc": "Μορφοποιήστε και κατεβάστε το ολοκληρωμένο έργο σας.", + "dashboard.quickAccess.manuscriptDesc": "Μεταβείτε στον επεξεργαστή χειρογράφων για να γράψετε και να οργανώσετε.", + "dashboard.quickAccess.outlineDesc": "Δημιουργήστε μια νέα δομή γραφικής παράστασης με το περίγραμμα AI.", + "dashboard.quickAccess.title": "Γρήγορες Ενέργειες", + "dashboard.quickAccess.worldDesc": "Δημιουργήστε και εξερευνήστε τους κόσμους της ιστορίας σας.", + "dashboard.quickAccess.writerDesc": "Χρησιμοποιήστε το AI Writing Studio για να ξεπεράσετε το μπλοκ του συγγραφέα.", + "dashboard.stats.characters": "Χαρακτήρες", + "dashboard.stats.outlineSections": "Ενότητες περίγραμμα", + "dashboard.stats.title": "Στατιστικά έργου", + "dashboard.stats.totalWordCount": "Λόγια", + "dashboard.stats.worlds": "Κόσμοι", + "initialProject.chapter1": "Κεφάλαιο 1", + "initialProject.logline": "Ένα ταξίδι χιλίων μιλίων ξεκινά με ένα μόνο βήμα...", + "initialProject.title": "Η ιστορία μου χωρίς τίτλο" } diff --git a/locales/el/export.json b/locales/el/export.json index 7ef959105..507e3bcad 100644 --- a/locales/el/export.json +++ b/locales/el/export.json @@ -1,94 +1,94 @@ { - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", - "export.pasteSection.heading": "Google Docs / Notion" + "export.pasteSection.expand": "Paste text", + "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds" } diff --git a/locales/el/lora.json b/locales/el/lora.json index 0f5c5c2cd..b07c355eb 100644 --- a/locales/el/lora.json +++ b/locales/el/lora.json @@ -1,78 +1,78 @@ { - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/locales/el/manuscript.json b/locales/el/manuscript.json index cc32f3eb7..ed9d683ad 100644 --- a/locales/el/manuscript.json +++ b/locales/el/manuscript.json @@ -1,69 +1,69 @@ { - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", - "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss" + "manuscript.zenMode.label": "Zen Mode" } diff --git a/locales/el/mindmap.json b/locales/el/mindmap.json index 40eb96e9c..276648b42 100644 --- a/locales/el/mindmap.json +++ b/locales/el/mindmap.json @@ -1,48 +1,48 @@ { - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel" + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out" } diff --git a/locales/el/objects.json b/locales/el/objects.json index d2c36e1e5..0eda5751f 100644 --- a/locales/el/objects.json +++ b/locales/el/objects.json @@ -1,51 +1,51 @@ { - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", + "objects.save": "Save", + "objects.search": "Search objects…", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", "objects.typeLabel.artifact": "Artifact", "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", "objects.typeLabel.other": "Other", - "objects.save": "Save", - "objects.cancel": "Cancel", - "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", - "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects" + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", + "objects.ungrouped": "Ungrouped" } diff --git a/locales/el/outline.json b/locales/el/outline.json index dc32546da..cd10722db 100644 --- a/locales/el/outline.json +++ b/locales/el/outline.json @@ -1,46 +1,46 @@ { - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", - "outline.selectSection": "Select section '{{title}}'" + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", + "outline.selectSection": "Select section '{{title}}'", + "outline.title": "AI Story Outline Generator" } diff --git a/locales/el/portal.json b/locales/el/portal.json index f010bda39..1f662bb95 100644 --- a/locales/el/portal.json +++ b/locales/el/portal.json @@ -1,42 +1,42 @@ { - "portal.language.groupLabel": "Γλώσσα οθόνης καλωσορίσματος", - "portal.language.searchPlaceholder": "Αναζήτηση γλωσσών...", - "portal.welcome.title": "Καλώς ήρθατε στο StoryCraft Studio", - "portal.welcome.subtitle": "Ο δημιουργικός συνεργάτης σας με τεχνητή νοημοσύνη για τη γραφή.", - "portal.welcome.newProject": "Ξεκινήστε ένα Νέο Έργο", - "portal.welcome.openProject": "Άνοιγμα έργου", - "portal.welcome.continue": "Συνέχεια τελευταίας συνεδρίας", - "portal.welcome.tryDemo": "Φόρτωση έργου επίδειξης", - "portal.welcome.demoHint": "Νέος εδώ; Φορτώστε ένα σύντομο δείγμα ιστορίας με περίγραμμα και χειρόγραφο για να εξερευνήσετε την εφαρμογή.", - "portal.welcome.privacyBadge": "100% εκτός σύνδεσης πρώτα — η ιστορία σας παραμένει σε αυτήν τη συσκευή. Τα κλειδιά API είναι κρυπτογραφημένα σε κατάσταση ηρεμίας.", - "portal.new.demo.title": "Εξερευνήστε το έργο επίδειξης", - "portal.new.demo.description": "Προσυμπληρωμένο έργο με περίγραμμα και πρώτο κεφάλαιο — ιδανικό για εκμάθηση της διεπαφής χρήστη και των εργαλείων.", - "portal.new.title": "Πώς θα θέλατε να ξεκινήσετε;", - "portal.new.description": "Επιλέξτε ένα σημείο εκκίνησης που ταιριάζει καλύτερα στη δημιουργική σας διαδικασία.", - "portal.new.template.title": "Ξεκινήστε με ένα Πρότυπο", - "portal.new.template.description": "Χρησιμοποιήστε μια κλασική δομή αφήγησης, όπως η δομή τριών πράξεων, για να καθοδηγήσετε την ιστορία σας.", - "portal.new.ai.title": "Δημιουργία με AI", - "portal.new.ai.description": "Δώστε μια απλή ιδέα και αφήστε το AI μας να δημιουργήσει ένα λεπτομερές περίγραμμα πλοκής για εσάς.", - "portal.new.blank.title": "Ξεκινήστε με ένα κενό χειρόγραφο", - "portal.new.blank.description": "Για όσους ξέρουν πού πάνε. Ξεκινήστε με ένα κενό πρώτο κεφάλαιο.", - "portal.demo.title": "Επίδειξη: Ο σφραγισμένος πύργος", + "portal.back": "Πίσω", + "portal.demo.chapterContent": "Η πρωινή ομίχλη κόλλησε στις αποβάθρες καθώς η Lyra ξετύλιξε τον παλιό χάρτη της πόλης. Ένας αμυδρός κύκλος σημάδεψε τη βορειοδυτική γωνία - τον πύργο που κανείς δεν ανέφερε.\n\nΤράβηξε το χαρτί και ακολούθησε το στενό μονοπάτι μέχρι που το σιδερένιο πλέγμα σηκώθηκε μπροστά της. Το λουκέτο ήταν ζεστό στον ήλιο. το μέταλλο είναι ακόμα κρύο.", + "portal.demo.chapterTitle": "Κεφάλαιο 1 — Πριν από την Πύλη", "portal.demo.logline": "Ένα σύντομο δείγμα για να δοκιμάσετε το περίγραμμα, το χειρόγραφο και τον χώρο εργασίας.", - "portal.demo.outline1Title": "Ανοιγμα", "portal.demo.outline1Desc": "Η πόλη του ποταμού? ο πρωταγωνιστής ανακαλύπτει έναν απαγορευμένο πύργο.", - "portal.demo.outline2Title": "Σύγκρουση", + "portal.demo.outline1Title": "Ανοιγμα", "portal.demo.outline2Desc": "Η σφραγίδα σπάει. απόφαση με συνέπειες.", - "portal.demo.chapterTitle": "Κεφάλαιο 1 — Πριν από την Πύλη", - "portal.demo.chapterContent": "Η πρωινή ομίχλη κόλλησε στις αποβάθρες καθώς η Lyra ξετύλιξε τον παλιό χάρτη της πόλης. Ένας αμυδρός κύκλος σημάδεψε τη βορειοδυτική γωνία - τον πύργο που κανείς δεν ανέφερε.\n\nΤράβηξε το χαρτί και ακολούθησε το στενό μονοπάτι μέχρι που το σιδερένιο πλέγμα σηκώθηκε μπροστά της. Το λουκέτο ήταν ζεστό στον ήλιο. το μέταλλο είναι ακόμα κρύο.", - "portal.open.title": "Ανοίξτε ένα υπάρχον έργο", - "portal.open.description": "Φορτώστε ένα προηγουμένως αποθηκευμένο έργο από ένα αρχείο αντιγράφου ασφαλείας (.json) για να συνεχίσετε την εργασία σας.", - "portal.open.button": "Εισαγωγή αρχείου έργου", - "portal.back": "Πίσω", - "portal.features.ai.title": "AI Co-Pilot", + "portal.demo.outline2Title": "Σύγκρουση", + "portal.demo.title": "Επίδειξη: Ο σφραγισμένος πύργος", "portal.features.ai.description": "Σχεδίαση, καταιγισμός ιδεών και διάβαση μπλοκ με σύννεφο ή πλήρως τοπικά μοντέλα.", - "portal.features.plot.title": "Visual Plot Board", + "portal.features.ai.title": "AI Co-Pilot", + "portal.features.export.description": "Μεταγλώττιση σε DOCX, PDF, EPUB και Markdown — εντελώς εκτός σύνδεσης.", + "portal.features.export.title": "Pro Export", "portal.features.plot.description": "Σχεδιάστε τη δομή σε καμβά με καμπύλες τάσης και φύλλα κτυπήματος.", - "portal.features.worldbuilding.title": "Χαρακτήρες & κόσμοι", + "portal.features.plot.title": "Visual Plot Board", "portal.features.worldbuilding.description": "Πλούσιοι φάκελοι, άτλαντες, πορτρέτα τεχνητής νοημοσύνης και χάρτες σχέσεων.", - "portal.features.export.title": "Pro Export", - "portal.features.export.description": "Μεταγλώττιση σε DOCX, PDF, EPUB και Markdown — εντελώς εκτός σύνδεσης." + "portal.features.worldbuilding.title": "Χαρακτήρες & κόσμοι", + "portal.language.groupLabel": "Γλώσσα οθόνης καλωσορίσματος", + "portal.language.searchPlaceholder": "Αναζήτηση γλωσσών...", + "portal.new.ai.description": "Δώστε μια απλή ιδέα και αφήστε το AI μας να δημιουργήσει ένα λεπτομερές περίγραμμα πλοκής για εσάς.", + "portal.new.ai.title": "Δημιουργία με AI", + "portal.new.blank.description": "Για όσους ξέρουν πού πάνε. Ξεκινήστε με ένα κενό πρώτο κεφάλαιο.", + "portal.new.blank.title": "Ξεκινήστε με ένα κενό χειρόγραφο", + "portal.new.demo.description": "Προσυμπληρωμένο έργο με περίγραμμα και πρώτο κεφάλαιο — ιδανικό για εκμάθηση της διεπαφής χρήστη και των εργαλείων.", + "portal.new.demo.title": "Εξερευνήστε το έργο επίδειξης", + "portal.new.description": "Επιλέξτε ένα σημείο εκκίνησης που ταιριάζει καλύτερα στη δημιουργική σας διαδικασία.", + "portal.new.template.description": "Χρησιμοποιήστε μια κλασική δομή αφήγησης, όπως η δομή τριών πράξεων, για να καθοδηγήσετε την ιστορία σας.", + "portal.new.template.title": "Ξεκινήστε με ένα Πρότυπο", + "portal.new.title": "Πώς θα θέλατε να ξεκινήσετε;", + "portal.open.button": "Εισαγωγή αρχείου έργου", + "portal.open.description": "Φορτώστε ένα προηγουμένως αποθηκευμένο έργο από ένα αρχείο αντιγράφου ασφαλείας (.json) για να συνεχίσετε την εργασία σας.", + "portal.open.title": "Ανοίξτε ένα υπάρχον έργο", + "portal.welcome.continue": "Συνέχεια τελευταίας συνεδρίας", + "portal.welcome.demoHint": "Νέος εδώ; Φορτώστε ένα σύντομο δείγμα ιστορίας με περίγραμμα και χειρόγραφο για να εξερευνήσετε την εφαρμογή.", + "portal.welcome.newProject": "Ξεκινήστε ένα Νέο Έργο", + "portal.welcome.openProject": "Άνοιγμα έργου", + "portal.welcome.privacyBadge": "100% εκτός σύνδεσης πρώτα — η ιστορία σας παραμένει σε αυτήν τη συσκευή. Τα κλειδιά API είναι κρυπτογραφημένα σε κατάσταση ηρεμίας.", + "portal.welcome.subtitle": "Ο δημιουργικός συνεργάτης σας με τεχνητή νοημοσύνη για τη γραφή.", + "portal.welcome.title": "Καλώς ήρθατε στο StoryCraft Studio", + "portal.welcome.tryDemo": "Φόρτωση έργου επίδειξης" } diff --git a/locales/el/settings.json b/locales/el/settings.json index c6ddfbf0c..073f687f1 100644 --- a/locales/el/settings.json +++ b/locales/el/settings.json @@ -476,8 +476,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", diff --git a/locales/el/sidebar.json b/locales/el/sidebar.json index eb9b889ce..9f992dddb 100644 --- a/locales/el/sidebar.json +++ b/locales/el/sidebar.json @@ -1,25 +1,25 @@ { - "sidebar.mainAria": "Κύρια πλαϊνή μπάρα", - "sidebar.primaryNavAria": "Κύρια πλοήγηση", - "sidebar.secondaryNavAria": "Ρυθμίσεις και βοήθεια", - "sidebar.mobileNavigation": "Βασικές απόψεις", - "sidebar.overflowMenuAria": "Περισσότερες προβολές", - "sidebar.dashboard": "Ταμπλό", - "sidebar.manuscript": "Χειρόγραφο", - "sidebar.writer": "AI Writing Studio", - "sidebar.templates": "Πρότυπα", - "sidebar.outline": "Γεννήτρια περιγράμματος", - "sidebar.characters": "Χαρακτήρες", - "sidebar.world": "Παγκόσμιο Κτίριο", - "sidebar.sceneboard": "Σκηνικό Συμβούλιο", "sidebar.characterGraph": "Γράφημα χαρακτήρων", + "sidebar.characterInterviews": "Συνεντεύξεις χαρακτήρων", + "sidebar.characters": "Χαρακτήρες", "sidebar.consistencyChecker": "Έλεγχος συνέπειας", "sidebar.critic": "AI Critic", + "sidebar.dashboard": "Ταμπλό", "sidebar.export": "Εξαγωγή", - "sidebar.settings": "Ρυθμίσεις", "sidebar.help": "Βοήθεια", - "sidebar.objects": "Αντικείμενα ιστορίας", + "sidebar.lora": "Βελτιστοποίηση", + "sidebar.mainAria": "Κύρια πλαϊνή μπάρα", + "sidebar.manuscript": "Χειρόγραφο", "sidebar.mindmap": "Mind Maps", - "sidebar.characterInterviews": "Συνεντεύξεις χαρακτήρων", - "sidebar.lora": "Βελτιστοποίηση" + "sidebar.mobileNavigation": "Βασικές απόψεις", + "sidebar.objects": "Αντικείμενα ιστορίας", + "sidebar.outline": "Γεννήτρια περιγράμματος", + "sidebar.overflowMenuAria": "Περισσότερες προβολές", + "sidebar.primaryNavAria": "Κύρια πλοήγηση", + "sidebar.sceneboard": "Σκηνικό Συμβούλιο", + "sidebar.secondaryNavAria": "Ρυθμίσεις και βοήθεια", + "sidebar.settings": "Ρυθμίσεις", + "sidebar.templates": "Πρότυπα", + "sidebar.world": "Παγκόσμιο Κτίριο", + "sidebar.writer": "AI Writing Studio" } diff --git a/locales/el/tags.json b/locales/el/tags.json index 97118bba7..d18e499a8 100644 --- a/locales/el/tags.json +++ b/locales/el/tags.json @@ -1,20 +1,20 @@ { - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional" + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller" } diff --git a/locales/el/tour.json b/locales/el/tour.json index fc64815dd..f3d8a53f0 100644 --- a/locales/el/tour.json +++ b/locales/el/tour.json @@ -1,20 +1,20 @@ { - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour" + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings" } diff --git a/locales/el/worlds.json b/locales/el/worlds.json index 6844b4096..1843a6234 100644 --- a/locales/el/worlds.json +++ b/locales/el/worlds.json @@ -1,54 +1,54 @@ { - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name" + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds" } diff --git a/locales/el/writer.json b/locales/el/writer.json index a5d85f87d..c6e621e19 100644 --- a/locales/el/writer.json +++ b/locales/el/writer.json @@ -1,82 +1,82 @@ { - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", + "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", - "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)" } diff --git a/locales/en/common.json b/locales/en/common.json index ca8142e55..f2fada71e 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -57,6 +57,8 @@ "critic.noResults": "No analysis results yet.", "error.fileImportError": "File Import Error", "error.snapshotError": "Snapshot Error", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "palette.placeholder": "Type a command or search...", "palette.noResults": "No results found.", "palette.category.navigation": "Navigation", diff --git a/locales/es/common.json b/locales/es/common.json index a1cc1f33d..454dfa61a 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama no accesible ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama no accesible ({{url}}). Asegúrate de que Ollama está en ejecución: ollama serve", "error.snapshotError": "Error de instantánea", + "error.deepLink.title": "Error al abrir el archivo del proyecto", + "error.deepLink.unknown": "Error desconocido", "export.epubExport": "Exportar EPUB 3.0", "export.section": "Sección {{index}}", "header.openMenu": "Abrir menú", diff --git a/locales/fr/common.json b/locales/fr/common.json index fbbe26d14..faf08a691 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama inaccessible ({{url}}) : {{message}}", "error.ollama.unreachableHint": "Ollama inaccessible ({{url}}). Assurez-vous qu'Ollama tourne : ollama serve", "error.snapshotError": "Erreur d'instantané", + "error.deepLink.title": "Échec de l'ouverture du fichier projet", + "error.deepLink.unknown": "Erreur inconnue", "export.epubExport": "Exporter EPUB 3.0", "export.section": "Section {{index}}", "header.openMenu": "Ouvrir le menu", diff --git a/locales/he/common.json b/locales/he/common.json index e16cc92f5..35ed21f3a 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "שגיאה פנימית במסד הנתונים. אנא טענו מחדש את הדף.", "error.db.quotaExceeded": "אחסון הדפדפן מלא. אנא מחקו פרויקטים או תמונות מצב ישנים.", "error.db.unknown": "שגיאה לא ידועה בעת גישה למסד הנתונים.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "שגיאת ייבוא קובץ", "error.mic.denied": "הגישה למיקרופון נדחתה. אנא העניקו הרשאה בהגדרות הדפדפן שלכם.", "error.mic.generic": "שגיאת זיהוי דיבור: {{error}}", diff --git a/locales/he/portal.json b/locales/he/portal.json index ac17ff984..9cb9a3a3f 100644 --- a/locales/he/portal.json +++ b/locales/he/portal.json @@ -1,6 +1,5 @@ { "portal.back": "חזרה", - "portal.language.searchPlaceholder": "חיפוש שפות...", "portal.demo.chapterContent": "ערפל הבוקר נצמד לרציפים בעוד לירה פורשת את מפת העיר הישנה. עיגול דהוי סימן את הפינה הצפון‑מערבית — המגדל שאיש אינו מזכיר.\n\nהיא קיפלה את הנייר ופנתה אל השביל הצר, עד שסבך הברזל התרומם מולה. המנעול היה חמים בשמש; המתכת עוד קרה.", "portal.demo.chapterTitle": "פרק 1 — לפני השער", "portal.demo.logline": "דוגמה קצרה להתנסות במתווה, בכתב היד ובסביבת העבודה.", @@ -18,6 +17,7 @@ "portal.features.worldbuilding.description": "Rich dossiers, atlases, AI portraits, and relationship maps.", "portal.features.worldbuilding.title": "Characters & Worlds", "portal.language.groupLabel": "שפת מסך הפתיחה", + "portal.language.searchPlaceholder": "חיפוש שפות...", "portal.new.ai.description": "ספקו רעיון פשוט ותנו ל‑AI לבנות עבורכם מתווה עלילה מפורט.", "portal.new.ai.title": "יצירה באמצעות AI", "portal.new.blank.description": "למי שיודע לאן מועדות פניו. התחילו בפרק ראשון ריק.", diff --git a/locales/it/common.json b/locales/it/common.json index 9f1874e90..e117a2e08 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama non raggiungibile ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama non raggiungibile ({{url}}). Assicurati che Ollama sia in esecuzione: ollama serve", "error.snapshotError": "Errore snapshot", + "error.deepLink.title": "Impossibile aprire il file del progetto", + "error.deepLink.unknown": "Errore sconosciuto", "export.epubExport": "Esporta EPUB 3.0", "export.section": "Sezione {{index}}", "header.openMenu": "Apri menu", diff --git a/locales/ja/characterInterviews.json b/locales/ja/characterInterviews.json index 988a35da1..618c0ea65 100644 --- a/locales/ja/characterInterviews.json +++ b/locales/ja/characterInterviews.json @@ -1,39 +1,39 @@ { - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel" + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews" } diff --git a/locales/ja/characters.json b/locales/ja/characters.json index 40b864d9f..d1f4d9dee 100644 --- a/locales/ja/characters.json +++ b/locales/ja/characters.json @@ -1,73 +1,73 @@ { - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name" + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters" } diff --git a/locales/ja/common.json b/locales/ja/common.json index 74c2e56b4..2145c53be 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "内部データベースエラー。ページをリロードしてください。", "error.db.quotaExceeded": "ブラウザのストレージがいっぱいです。古いプロジェクトまたはスナップショットを削除してください。", "error.db.unknown": "データベースへのアクセス中に不明なエラーが発生しました。", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "ファイルインポートエラー", "error.mic.denied": "マイクへのアクセスが拒否されました。ブラウザの設定で許可を与えてください。", "error.mic.generic": "音声認識エラー: {{error}}", diff --git a/locales/ja/dashboard.json b/locales/ja/dashboard.json index 3d3592ba4..4a88341b0 100644 --- a/locales/ja/dashboard.json +++ b/locales/ja/dashboard.json @@ -1,109 +1,109 @@ { - "initialProject.title": "私の題名のない物語", - "initialProject.logline": "千里の道も一歩から始まる…", - "initialProject.chapter1": "第1章", - "dashboard.greeting": "おかえりなさい", - "dashboard.noLogline": "ログラインはまだありません。原稿検査官に 1 つ追加してください。", - "dashboard.continueWriting.title": "書き続ける", - "dashboard.continueWriting.button": "ジャンプバックイン", - "dashboard.continueWriting.empty": "原稿ビューでストーリーを開始します。", - "dashboard.goals.title": "プロジェクトの目標", - "dashboard.goals.wordCount": "単語数", - "dashboard.goals.deadline": "締め切り", - "dashboard.goals.noDeadline": "期限は設定されていません", - "dashboard.goals.daysLeft": "残り {{count}} 日", - "dashboard.goals.dayLeft": "残り1日", - "dashboard.goals.noDaysLeft": "本日締め切り", - "dashboard.goals.overdue": "期限を過ぎました", - "dashboard.goals.setGoal": "目標を設定する", - "dashboard.goals.editGoal": "目標の編集", - "dashboard.goals.modal.title": "プロジェクトの目標を設定する", - "dashboard.goals.modal.wordCountLabel": "目標単語数", - "dashboard.goals.modal.deadlineLabel": "目標期限 (オプション)", - "dashboard.goals.modal.save": "目標を保存する", - "dashboard.goals.wordsRemaining": "あと {{count}} 語", - "dashboard.goals.pace.title": "ペース", - "dashboard.goals.pace.perDayUnit": "/日", - "dashboard.goals.pace.onTrack": "順調に進んでいます", - "dashboard.goals.pace.behind": "ペースが遅れている", - "dashboard.goals.pace.done": "目標達成", - "dashboard.goals.pace.noDeadline": "期限を設定する", - "dashboard.glance.title": "一目でわかる", - "dashboard.glance.recentCharacter": "最近のキャラクター", - "dashboard.glance.recentWorld": "最近の世界", - "dashboard.glance.noCharacters": "まだ文字がありません。", - "dashboard.glance.noWorlds": "まだワールドがありません。", - "dashboard.stats.title": "プロジェクト統計", - "dashboard.stats.characters": "キャラクター", - "dashboard.stats.worlds": "世界", - "dashboard.stats.outlineSections": "概要セクション", - "dashboard.stats.totalWordCount": "言葉", - "dashboard.healthScore.title": "プロジェクトの健全性", - "dashboard.healthScore.body": "目標の進行状況、キャストの深さ、世界構築の範囲を軽量にブレンドしています。", - "dashboard.healthScore.scoreLabel": "スコア", - "dashboard.healthScore.writing": "執筆進捗状況", - "dashboard.healthScore.cast": "鋳造深さ", - "dashboard.healthScore.world": "世界構築", - "dashboard.quickAccess.title": "クイックアクション", - "dashboard.quickAccess.manuscriptDesc": "原稿エディタにアクセスして、書いたり整理したりできます。", - "dashboard.quickAccess.writerDesc": "AI Writing Studio を使用して、ライターのブロックを克服します。", - "dashboard.quickAccess.outlineDesc": "AI アウトライナーを使用して新しいプロット構造を生成します。", - "dashboard.quickAccess.charactersDesc": "関係書類でキャラクターのキャストを管理します。", - "dashboard.quickAccess.worldDesc": "あなたの物語の世界を構築して探索しましょう。", - "dashboard.quickAccess.exportDesc": "完成したプロジェクトをフォーマットしてダウンロードします。", - "dashboard.details.title": "ストーリーの詳細", - "dashboard.details.projectTitle": "プロジェクトタイトル", - "dashboard.details.projectTitlePlaceholder": "私の素晴らしいストーリー", - "dashboard.details.logline": "ログライン", - "dashboard.details.loglinePlaceholder": "あなたのストーリーを一文で要約したもの。", - "dashboard.details.aiLoglineButton": "AIログラインアシスタント", - "dashboard.loglineModal.title": "AI ログラインの提案", - "dashboard.loglineModal.loading": "素晴らしいログラインを生成しています...", - "dashboard.onboarding.title": "簡単なヒント", - "dashboard.onboarding.tip1": "サイドバーを使用して、原稿、キャラクター、ワールド、エクスポートを切り替えます。", - "dashboard.onboarding.tip2": "[設定] に API キーを追加してクラウド AI のロックを解除するか、ローカル モデル用に Ollama を選択します。", - "dashboard.onboarding.tip3": "作業内容はこのデバイスに自動的に保存されます。スナップショットはバージョン管理で利用できます。", - "dashboard.onboarding.dismiss": "わかった", - "dashboard.onboarding.startTour": "ガイド付きツアー", - "dashboard.authorInsights.title": "著者パイプラインの洞察", "dashboard.authorInsights.readability": "可読性 (Flesch スタイル、EN ヒューリスティック)", - "dashboard.authorInsights.readabilityNeedMore": "もう少し詳しく書いてください。安定したスコアを得るには、可読性を高めるには約 40 単語以上が必要です。", "dashboard.authorInsights.readabilityFootnote": "通常、スコアが高いほど読みやすいことを意味します。意図的にジャンルに合わせて調整してください。", + "dashboard.authorInsights.readabilityNeedMore": "もう少し詳しく書いてください。安定したスコアを得るには、可読性を高めるには約 40 単語以上が必要です。", "dashboard.authorInsights.timeline": "シーンのタイムラインチェック", "dashboard.authorInsights.timelineClear": "シーンのメタデータからのタイムライン警告はありません。", "dashboard.authorInsights.timelineWarnBadge": "{{count}} 件の警告 — シーン ボードでシーンの日付/期間を調整します。", - "dashboard.backup.title": "バックアップと復元", - "dashboard.backup.hint": "プロジェクトをエクスポートするか、バックアップをインポートするか、完全バックアップ設定を開きます。", + "dashboard.authorInsights.title": "著者パイプラインの洞察", "dashboard.backup.exportJson": "JSONのエクスポート", + "dashboard.backup.hint": "プロジェクトをエクスポートするか、バックアップをインポートするか、完全バックアップ設定を開きます。", "dashboard.backup.importJson": "JSONをインポートする", - "dashboard.backup.openSettings": "バックアップ設定", "dashboard.backup.latestSnapshot": "最新のスナップショット: {{name}} ({{date}})", + "dashboard.backup.openSettings": "バックアップ設定", + "dashboard.backup.title": "バックアップと復元", "dashboard.backup.unnamedSnapshot": "名前のないスナップショット", + "dashboard.composition.avgPerScene": "平均/シーン", + "dashboard.composition.empty": "原稿にシーンを追加して、その構成を確認します。", + "dashboard.composition.readingTime": "読書時間", + "dashboard.composition.readingTimeValue": "{{count}}分", + "dashboard.composition.scenes": "シーン", + "dashboard.composition.status.draft": "下書き", + "dashboard.composition.status.final": "ファイナル", + "dashboard.composition.status.firstDraft": "初稿", + "dashboard.composition.status.outline": "概要", + "dashboard.composition.status.revised": "改訂", + "dashboard.composition.status.untracked": "未追跡", + "dashboard.composition.title": "原稿構成", + "dashboard.continueWriting.button": "ジャンプバックイン", + "dashboard.continueWriting.empty": "原稿ビューでストーリーを開始します。", + "dashboard.continueWriting.title": "書き続ける", + "dashboard.details.aiLoglineButton": "AIログラインアシスタント", + "dashboard.details.logline": "ログライン", + "dashboard.details.loglinePlaceholder": "あなたのストーリーを一文で要約したもの。", + "dashboard.details.projectTitle": "プロジェクトタイトル", + "dashboard.details.projectTitlePlaceholder": "私の素晴らしいストーリー", + "dashboard.details.title": "ストーリーの詳細", + "dashboard.glance.noCharacters": "まだ文字がありません。", + "dashboard.glance.noWorlds": "まだワールドがありません。", + "dashboard.glance.recentCharacter": "最近のキャラクター", + "dashboard.glance.recentWorld": "最近の世界", + "dashboard.glance.title": "一目でわかる", + "dashboard.goals.dayLeft": "残り1日", + "dashboard.goals.daysLeft": "残り {{count}} 日", + "dashboard.goals.deadline": "締め切り", + "dashboard.goals.editGoal": "目標の編集", + "dashboard.goals.modal.deadlineLabel": "目標期限 (オプション)", + "dashboard.goals.modal.save": "目標を保存する", + "dashboard.goals.modal.title": "プロジェクトの目標を設定する", + "dashboard.goals.modal.wordCountLabel": "目標単語数", + "dashboard.goals.noDaysLeft": "本日締め切り", + "dashboard.goals.noDeadline": "期限は設定されていません", + "dashboard.goals.overdue": "期限を過ぎました", + "dashboard.goals.pace.behind": "ペースが遅れている", + "dashboard.goals.pace.done": "目標達成", + "dashboard.goals.pace.noDeadline": "期限を設定する", + "dashboard.goals.pace.onTrack": "順調に進んでいます", + "dashboard.goals.pace.perDayUnit": "/日", + "dashboard.goals.pace.title": "ペース", + "dashboard.goals.setGoal": "目標を設定する", + "dashboard.goals.title": "プロジェクトの目標", + "dashboard.goals.wordCount": "単語数", + "dashboard.goals.wordsRemaining": "あと {{count}} 語", + "dashboard.greeting": "おかえりなさい", "dashboard.header.ariaLabel": "プロジェクト概要", - "dashboard.header.greetingMorning": "おはよう", "dashboard.header.greetingAfternoon": "こんにちは", "dashboard.header.greetingEvening": "こんばんは", + "dashboard.header.greetingMorning": "おはよう", "dashboard.header.greetingNight": "真夜中の油を燃やす", "dashboard.header.lastEdited": "最終編集日: {{title}}", - "dashboard.momentum.title": "執筆の勢い", + "dashboard.healthScore.body": "目標の進行状況、キャストの深さ、世界構築の範囲を軽量にブレンドしています。", + "dashboard.healthScore.cast": "鋳造深さ", + "dashboard.healthScore.scoreLabel": "スコア", + "dashboard.healthScore.title": "プロジェクトの健全性", + "dashboard.healthScore.world": "世界構築", + "dashboard.healthScore.writing": "執筆進捗状況", + "dashboard.loglineModal.loading": "素晴らしいログラインを生成しています...", + "dashboard.loglineModal.title": "AI ログラインの提案", + "dashboard.momentum.activity": "過去 14 日間", "dashboard.momentum.dayStreak": "一日連続", + "dashboard.momentum.goalReached": "目標達成", "dashboard.momentum.longest": "ベスト: {{count}}", - "dashboard.momentum.today": "今日", - "dashboard.momentum.thisWeek": "今週", - "dashboard.momentum.ofGoal": "{{現在}} / {{目標}}", - "dashboard.momentum.activity": "過去 14 日間", "dashboard.momentum.noActivity": "書き込みはまだ記録されていません。セッションを開始して連続記録を築きましょう。", - "dashboard.momentum.goalReached": "目標達成", - "dashboard.composition.title": "原稿構成", - "dashboard.composition.scenes": "シーン", - "dashboard.composition.avgPerScene": "平均/シーン", - "dashboard.composition.readingTime": "読書時間", - "dashboard.composition.readingTimeValue": "{{count}}分", - "dashboard.composition.empty": "原稿にシーンを追加して、その構成を確認します。", - "dashboard.composition.status.outline": "概要", - "dashboard.composition.status.draft": "下書き", - "dashboard.composition.status.firstDraft": "初稿", - "dashboard.composition.status.revised": "改訂", - "dashboard.composition.status.final": "ファイナル", - "dashboard.composition.status.untracked": "未追跡" + "dashboard.momentum.ofGoal": "{{現在}} / {{目標}}", + "dashboard.momentum.thisWeek": "今週", + "dashboard.momentum.title": "執筆の勢い", + "dashboard.momentum.today": "今日", + "dashboard.noLogline": "ログラインはまだありません。原稿検査官に 1 つ追加してください。", + "dashboard.onboarding.dismiss": "わかった", + "dashboard.onboarding.startTour": "ガイド付きツアー", + "dashboard.onboarding.tip1": "サイドバーを使用して、原稿、キャラクター、ワールド、エクスポートを切り替えます。", + "dashboard.onboarding.tip2": "[設定] に API キーを追加してクラウド AI のロックを解除するか、ローカル モデル用に Ollama を選択します。", + "dashboard.onboarding.tip3": "作業内容はこのデバイスに自動的に保存されます。スナップショットはバージョン管理で利用できます。", + "dashboard.onboarding.title": "簡単なヒント", + "dashboard.quickAccess.charactersDesc": "関係書類でキャラクターのキャストを管理します。", + "dashboard.quickAccess.exportDesc": "完成したプロジェクトをフォーマットしてダウンロードします。", + "dashboard.quickAccess.manuscriptDesc": "原稿エディタにアクセスして、書いたり整理したりできます。", + "dashboard.quickAccess.outlineDesc": "AI アウトライナーを使用して新しいプロット構造を生成します。", + "dashboard.quickAccess.title": "クイックアクション", + "dashboard.quickAccess.worldDesc": "あなたの物語の世界を構築して探索しましょう。", + "dashboard.quickAccess.writerDesc": "AI Writing Studio を使用して、ライターのブロックを克服します。", + "dashboard.stats.characters": "キャラクター", + "dashboard.stats.outlineSections": "概要セクション", + "dashboard.stats.title": "プロジェクト統計", + "dashboard.stats.totalWordCount": "言葉", + "dashboard.stats.worlds": "世界", + "initialProject.chapter1": "第1章", + "initialProject.logline": "千里の道も一歩から始まる…", + "initialProject.title": "私の題名のない物語" } diff --git a/locales/ja/export.json b/locales/ja/export.json index 7ef959105..507e3bcad 100644 --- a/locales/ja/export.json +++ b/locales/ja/export.json @@ -1,94 +1,94 @@ { - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", - "export.pasteSection.heading": "Google Docs / Notion" + "export.pasteSection.expand": "Paste text", + "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds" } diff --git a/locales/ja/lora.json b/locales/ja/lora.json index 0f5c5c2cd..b07c355eb 100644 --- a/locales/ja/lora.json +++ b/locales/ja/lora.json @@ -1,78 +1,78 @@ { - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/locales/ja/manuscript.json b/locales/ja/manuscript.json index cc32f3eb7..ed9d683ad 100644 --- a/locales/ja/manuscript.json +++ b/locales/ja/manuscript.json @@ -1,69 +1,69 @@ { - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", - "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss" + "manuscript.zenMode.label": "Zen Mode" } diff --git a/locales/ja/mindmap.json b/locales/ja/mindmap.json index 40eb96e9c..276648b42 100644 --- a/locales/ja/mindmap.json +++ b/locales/ja/mindmap.json @@ -1,48 +1,48 @@ { - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel" + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out" } diff --git a/locales/ja/objects.json b/locales/ja/objects.json index d2c36e1e5..0eda5751f 100644 --- a/locales/ja/objects.json +++ b/locales/ja/objects.json @@ -1,51 +1,51 @@ { - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", + "objects.save": "Save", + "objects.search": "Search objects…", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", "objects.typeLabel.artifact": "Artifact", "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", "objects.typeLabel.other": "Other", - "objects.save": "Save", - "objects.cancel": "Cancel", - "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", - "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects" + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", + "objects.ungrouped": "Ungrouped" } diff --git a/locales/ja/outline.json b/locales/ja/outline.json index dc32546da..cd10722db 100644 --- a/locales/ja/outline.json +++ b/locales/ja/outline.json @@ -1,46 +1,46 @@ { - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", - "outline.selectSection": "Select section '{{title}}'" + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", + "outline.selectSection": "Select section '{{title}}'", + "outline.title": "AI Story Outline Generator" } diff --git a/locales/ja/portal.json b/locales/ja/portal.json index d6f32c15d..6c30d3e02 100644 --- a/locales/ja/portal.json +++ b/locales/ja/portal.json @@ -1,42 +1,42 @@ { - "portal.language.groupLabel": "ようこそ画面の言語", - "portal.language.searchPlaceholder": "言語を検索...", - "portal.welcome.title": "ストーリークラフト スタジオへようこそ", - "portal.welcome.subtitle": "AI を活用したライティングのためのクリエイティブ パートナー。", - "portal.welcome.newProject": "新しいプロジェクトを開始する", - "portal.welcome.openProject": "プロジェクトを開く", - "portal.welcome.continue": "最後のセッションを続行", - "portal.welcome.tryDemo": "デモプロジェクトをロードする", - "portal.welcome.demoHint": "ここは新しいですか?概要と原稿を含む短いサンプル ストーリーをロードして、アプリを探索します。", - "portal.welcome.privacyBadge": "100% オフラインファースト — ストーリーはこのデバイス上に残ります。 API キーは保存時に暗号化されます。", - "portal.new.demo.title": "デモプロジェクトを探索する", - "portal.new.demo.description": "概要と最初の章があらかじめ入力されたプロジェクト - UI とツールの学習に最適です。", - "portal.new.title": "どのように始めたいですか?", - "portal.new.description": "あなたの創造的なプロセスに最も適した開始点を選択してください。", - "portal.new.template.title": "テンプレートから始める", - "portal.new.template.description": "3 幕構造などの古典的な物語構造を使用して、ストーリーをガイドします。", - "portal.new.ai.title": "AIで生成", - "portal.new.ai.description": "シンプルなアイデアを提供すると、AI が詳細なプロットのアウトラインを作成します。", - "portal.new.blank.title": "白紙の原稿から始める", - "portal.new.blank.description": "どこへ行くのか分かっている人向け。空の最初の章から始めます。", - "portal.demo.title": "デモ: 封印の塔", + "portal.back": "戻る", + "portal.demo.chapterContent": "ライラが古い都市の地図を広げている間、朝霧が岸壁に張り付いていました。かすかな円が北西の角を示していました - 誰も言及しなかった塔です。\n\n彼女は紙をしまい込み、鉄の格子が目の前に現れるまで細い道を進みました。南京錠は太陽の下で暖かかった。金属はまだ冷たい。", + "portal.demo.chapterTitle": "第 1 章 — 門の前", "portal.demo.logline": "アウトライン、原稿、ワークスペースを試すための短いサンプルです。", - "portal.demo.outline1Title": "オープニング", "portal.demo.outline1Desc": "川沿いの町。主人公は禁断の塔を発見する。", - "portal.demo.outline2Title": "対立", + "portal.demo.outline1Title": "オープニング", "portal.demo.outline2Desc": "封印が解ける。結果を伴う決断。", - "portal.demo.chapterTitle": "第 1 章 — 門の前", - "portal.demo.chapterContent": "ライラが古い都市の地図を広げている間、朝霧が岸壁に張り付いていました。かすかな円が北西の角を示していました - 誰も言及しなかった塔です。\n\n彼女は紙をしまい込み、鉄の格子が目の前に現れるまで細い道を進みました。南京錠は太陽の下で暖かかった。金属はまだ冷たい。", - "portal.open.title": "既存のプロジェクトを開く", - "portal.open.description": "以前に保存したプロジェクトをバックアップ ファイル (.json) からロードして、作業を続行します。", - "portal.open.button": "プロジェクトファイルのインポート", - "portal.back": "戻る", - "portal.features.ai.title": "AI 副操縦士", + "portal.demo.outline2Title": "対立", + "portal.demo.title": "デモ: 封印の塔", "portal.features.ai.description": "クラウドまたは完全にローカルのモデルを使用して、草案を作成し、ブレインストーミングし、ブロックを突破します。", - "portal.features.plot.title": "ビジュアルプロットボード", + "portal.features.ai.title": "AI 副操縦士", + "portal.features.export.description": "完全にオフラインで DOCX、PDF、EPUB、Markdown にコンパイルします。", + "portal.features.export.title": "プロエクスポート", "portal.features.plot.description": "テンションカーブとビートシートを使用してキャンバス上で構造を計画します。", - "portal.features.worldbuilding.title": "キャラクターと世界", + "portal.features.plot.title": "ビジュアルプロットボード", "portal.features.worldbuilding.description": "豊富な書類、アトラス、AI ポートレート、関係マップ。", - "portal.features.export.title": "プロエクスポート", - "portal.features.export.description": "完全にオフラインで DOCX、PDF、EPUB、Markdown にコンパイルします。" + "portal.features.worldbuilding.title": "キャラクターと世界", + "portal.language.groupLabel": "ようこそ画面の言語", + "portal.language.searchPlaceholder": "言語を検索...", + "portal.new.ai.description": "シンプルなアイデアを提供すると、AI が詳細なプロットのアウトラインを作成します。", + "portal.new.ai.title": "AIで生成", + "portal.new.blank.description": "どこへ行くのか分かっている人向け。空の最初の章から始めます。", + "portal.new.blank.title": "白紙の原稿から始める", + "portal.new.demo.description": "概要と最初の章があらかじめ入力されたプロジェクト - UI とツールの学習に最適です。", + "portal.new.demo.title": "デモプロジェクトを探索する", + "portal.new.description": "あなたの創造的なプロセスに最も適した開始点を選択してください。", + "portal.new.template.description": "3 幕構造などの古典的な物語構造を使用して、ストーリーをガイドします。", + "portal.new.template.title": "テンプレートから始める", + "portal.new.title": "どのように始めたいですか?", + "portal.open.button": "プロジェクトファイルのインポート", + "portal.open.description": "以前に保存したプロジェクトをバックアップ ファイル (.json) からロードして、作業を続行します。", + "portal.open.title": "既存のプロジェクトを開く", + "portal.welcome.continue": "最後のセッションを続行", + "portal.welcome.demoHint": "ここは新しいですか?概要と原稿を含む短いサンプル ストーリーをロードして、アプリを探索します。", + "portal.welcome.newProject": "新しいプロジェクトを開始する", + "portal.welcome.openProject": "プロジェクトを開く", + "portal.welcome.privacyBadge": "100% オフラインファースト — ストーリーはこのデバイス上に残ります。 API キーは保存時に暗号化されます。", + "portal.welcome.subtitle": "AI を活用したライティングのためのクリエイティブ パートナー。", + "portal.welcome.title": "ストーリークラフト スタジオへようこそ", + "portal.welcome.tryDemo": "デモプロジェクトをロードする" } diff --git a/locales/ja/settings.json b/locales/ja/settings.json index c6ddfbf0c..073f687f1 100644 --- a/locales/ja/settings.json +++ b/locales/ja/settings.json @@ -476,8 +476,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", diff --git a/locales/ja/sidebar.json b/locales/ja/sidebar.json index 82adf3635..0d1d7ee3e 100644 --- a/locales/ja/sidebar.json +++ b/locales/ja/sidebar.json @@ -1,25 +1,25 @@ { - "sidebar.mainAria": "メインサイドバー", - "sidebar.primaryNavAria": "プライマリナビゲーション", - "sidebar.secondaryNavAria": "設定とヘルプ", - "sidebar.mobileNavigation": "主なビュー", - "sidebar.overflowMenuAria": "さらに見る", - "sidebar.dashboard": "ダッシュボード", - "sidebar.manuscript": "原稿", - "sidebar.writer": "AIライティングスタジオ", - "sidebar.templates": "テンプレート", - "sidebar.outline": "アウトラインジェネレーター", - "sidebar.characters": "キャラクター", - "sidebar.world": "世界の建物", - "sidebar.sceneboard": "シーンボード", "sidebar.characterGraph": "キャラクターグラフ", + "sidebar.characterInterviews": "キャラクターインタビュー", + "sidebar.characters": "キャラクター", "sidebar.consistencyChecker": "整合性チェッカー", "sidebar.critic": "AI評論家", + "sidebar.dashboard": "ダッシュボード", "sidebar.export": "輸出", - "sidebar.settings": "設定", "sidebar.help": "ヘルプ", - "sidebar.objects": "ストーリーオブジェクト", + "sidebar.lora": "微調整", + "sidebar.mainAria": "メインサイドバー", + "sidebar.manuscript": "原稿", "sidebar.mindmap": "マインドマップ", - "sidebar.characterInterviews": "キャラクターインタビュー", - "sidebar.lora": "微調整" + "sidebar.mobileNavigation": "主なビュー", + "sidebar.objects": "ストーリーオブジェクト", + "sidebar.outline": "アウトラインジェネレーター", + "sidebar.overflowMenuAria": "さらに見る", + "sidebar.primaryNavAria": "プライマリナビゲーション", + "sidebar.sceneboard": "シーンボード", + "sidebar.secondaryNavAria": "設定とヘルプ", + "sidebar.settings": "設定", + "sidebar.templates": "テンプレート", + "sidebar.world": "世界の建物", + "sidebar.writer": "AIライティングスタジオ" } diff --git a/locales/ja/tags.json b/locales/ja/tags.json index 97118bba7..d18e499a8 100644 --- a/locales/ja/tags.json +++ b/locales/ja/tags.json @@ -1,20 +1,20 @@ { - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional" + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller" } diff --git a/locales/ja/tour.json b/locales/ja/tour.json index fc64815dd..f3d8a53f0 100644 --- a/locales/ja/tour.json +++ b/locales/ja/tour.json @@ -1,20 +1,20 @@ { - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour" + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings" } diff --git a/locales/ja/worlds.json b/locales/ja/worlds.json index 6844b4096..1843a6234 100644 --- a/locales/ja/worlds.json +++ b/locales/ja/worlds.json @@ -1,54 +1,54 @@ { - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name" + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds" } diff --git a/locales/ja/writer.json b/locales/ja/writer.json index a5d85f87d..c6e621e19 100644 --- a/locales/ja/writer.json +++ b/locales/ja/writer.json @@ -1,82 +1,82 @@ { - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", + "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", - "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)" } diff --git a/locales/pt/characterInterviews.json b/locales/pt/characterInterviews.json index 988a35da1..618c0ea65 100644 --- a/locales/pt/characterInterviews.json +++ b/locales/pt/characterInterviews.json @@ -1,39 +1,39 @@ { - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel" + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews" } diff --git a/locales/pt/characters.json b/locales/pt/characters.json index 40b864d9f..d1f4d9dee 100644 --- a/locales/pt/characters.json +++ b/locales/pt/characters.json @@ -1,73 +1,73 @@ { - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name" + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters" } diff --git a/locales/pt/common.json b/locales/pt/common.json index ee4895a84..de19a96bd 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "Erro interno do banco de dados. Por favor, recarregue a página.", "error.db.quotaExceeded": "O armazenamento do navegador está cheio. Exclua projetos ou instantâneos antigos.", "error.db.unknown": "Erro desconhecido ao acessar o banco de dados.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "Erro de importação de arquivo", "error.mic.denied": "Acesso ao microfone negado. Por favor, conceda permissão nas configurações do seu navegador.", "error.mic.generic": "Erro de reconhecimento de fala: {{error}}", diff --git a/locales/pt/dashboard.json b/locales/pt/dashboard.json index c242b7705..6f53a8ea1 100644 --- a/locales/pt/dashboard.json +++ b/locales/pt/dashboard.json @@ -1,109 +1,109 @@ { - "initialProject.title": "Minha história sem título", - "initialProject.logline": "Uma jornada de mil milhas começa com um único passo...", - "initialProject.chapter1": "Capítulo 1", - "dashboard.greeting": "Bem-vindo de volta ao", - "dashboard.noLogline": "Ainda não há logline. Adicione um no inspetor de manuscritos!", - "dashboard.continueWriting.title": "Continuar escrevendo", - "dashboard.continueWriting.button": "Volte para dentro", - "dashboard.continueWriting.empty": "Comece sua história na visualização Manuscrito.", - "dashboard.goals.title": "Metas do Projeto", - "dashboard.goals.wordCount": "Contagem de palavras", - "dashboard.goals.deadline": "Prazo final", - "dashboard.goals.noDeadline": "Sem prazo definido", - "dashboard.goals.daysLeft": "{{count}} dias restantes", - "dashboard.goals.dayLeft": "Falta 1 dia", - "dashboard.goals.noDaysLeft": "Prazo hoje", - "dashboard.goals.overdue": "Atrasado", - "dashboard.goals.setGoal": "Definir meta", - "dashboard.goals.editGoal": "Editar meta", - "dashboard.goals.modal.title": "Definir metas do projeto", - "dashboard.goals.modal.wordCountLabel": "Contagem de palavras alvo", - "dashboard.goals.modal.deadlineLabel": "Prazo alvo (opcional)", - "dashboard.goals.modal.save": "Salvar metas", - "dashboard.goals.wordsRemaining": "{{count}} palavras restantes", - "dashboard.goals.pace.title": "Ritmo", - "dashboard.goals.pace.perDayUnit": "/dia", - "dashboard.goals.pace.onTrack": "No caminho certo", - "dashboard.goals.pace.behind": "Atrás do ritmo", - "dashboard.goals.pace.done": "Meta alcançada", - "dashboard.goals.pace.noDeadline": "Defina um prazo", - "dashboard.glance.title": "De relance", - "dashboard.glance.recentCharacter": "Personagem recente", - "dashboard.glance.recentWorld": "Mundo recente", - "dashboard.glance.noCharacters": "Nenhum personagem ainda.", - "dashboard.glance.noWorlds": "Ainda não há mundos.", - "dashboard.stats.title": "Estatísticas do projeto", - "dashboard.stats.characters": "Personagens", - "dashboard.stats.worlds": "Mundos", - "dashboard.stats.outlineSections": "Seções de esboço", - "dashboard.stats.totalWordCount": "Palavras", - "dashboard.healthScore.title": "Saúde do projeto", - "dashboard.healthScore.body": "Uma mistura leve de progresso de metas, profundidade de elenco e cobertura de construção de mundo.", - "dashboard.healthScore.scoreLabel": "Pontuação", - "dashboard.healthScore.writing": "Progresso da escrita", - "dashboard.healthScore.cast": "Profundidade do elenco", - "dashboard.healthScore.world": "Construção mundial", - "dashboard.quickAccess.title": "Ações rápidas", - "dashboard.quickAccess.manuscriptDesc": "Entre no editor de manuscritos para escrever e organizar.", - "dashboard.quickAccess.writerDesc": "Use o AI Writing Studio para superar o bloqueio de escritor.", - "dashboard.quickAccess.outlineDesc": "Gere uma nova estrutura de enredo com o AI Outliner.", - "dashboard.quickAccess.charactersDesc": "Gerencie seu elenco de personagens nos dossiês.", - "dashboard.quickAccess.worldDesc": "Construa e explore os mundos da sua história.", - "dashboard.quickAccess.exportDesc": "Formate e baixe seu projeto concluído.", - "dashboard.details.title": "Detalhes da história", - "dashboard.details.projectTitle": "Título do projeto", - "dashboard.details.projectTitlePlaceholder": "Minha incrível história", - "dashboard.details.logline": "Linha de registro", - "dashboard.details.loglinePlaceholder": "Um resumo de uma frase da sua história.", - "dashboard.details.aiLoglineButton": "Assistente de logline de IA", - "dashboard.loglineModal.title": "Sugestões de logline de IA", - "dashboard.loglineModal.loading": "Gerando loglines brilhantes...", - "dashboard.onboarding.title": "Dicas rápidas", - "dashboard.onboarding.tip1": "Use a barra lateral para alternar entre Manuscrito, Personagens, Mundos e Exportar.", - "dashboard.onboarding.tip2": "Adicione uma chave de API em Configurações para desbloquear a IA da nuvem ou escolha Ollama para modelos locais.", - "dashboard.onboarding.tip3": "Seu trabalho é salvo automaticamente neste dispositivo — os instantâneos estão disponíveis no Controle de versão.", - "dashboard.onboarding.dismiss": "Entendi", - "dashboard.onboarding.startTour": "Visita guiada", - "dashboard.authorInsights.title": "Insights do pipeline do autor", "dashboard.authorInsights.readability": "Legibilidade (estilo Flesch, heurística EN)", - "dashboard.authorInsights.readabilityNeedMore": "Escreva um pouco mais - a legibilidade precisa de mais de 40 palavras para uma pontuação estável.", "dashboard.authorInsights.readabilityFootnote": "Pontuações mais altas geralmente significam leitura mais fácil; sintonize seu gênero intencionalmente.", + "dashboard.authorInsights.readabilityNeedMore": "Escreva um pouco mais - a legibilidade precisa de mais de 40 palavras para uma pontuação estável.", "dashboard.authorInsights.timeline": "Verificações da linha do tempo da cena", "dashboard.authorInsights.timelineClear": "Nenhum aviso de linha do tempo nos metadados da cena.", "dashboard.authorInsights.timelineWarnBadge": "{{count}} avisos — refine as datas/durações das cenas no Scene Board.", - "dashboard.backup.title": "Backup e restauração", - "dashboard.backup.hint": "Exporte seu projeto, importe um backup ou abra as configurações de backup completo.", + "dashboard.authorInsights.title": "Insights do pipeline do autor", "dashboard.backup.exportJson": "Exportar JSON", + "dashboard.backup.hint": "Exporte seu projeto, importe um backup ou abra as configurações de backup completo.", "dashboard.backup.importJson": "Importar JSON", - "dashboard.backup.openSettings": "Configurações de backup", "dashboard.backup.latestSnapshot": "Instantâneo mais recente: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Configurações de backup", + "dashboard.backup.title": "Backup e restauração", "dashboard.backup.unnamedSnapshot": "Instantâneo sem nome", + "dashboard.composition.avgPerScene": "Média / cena", + "dashboard.composition.empty": "Adicione cenas no Manuscrito para ver sua composição.", + "dashboard.composition.readingTime": "Tempo de leitura", + "dashboard.composition.readingTimeValue": "{{contagem}} minutos", + "dashboard.composition.scenes": "Cenas", + "dashboard.composition.status.draft": "Rascunho", + "dashboard.composition.status.final": "Final", + "dashboard.composition.status.firstDraft": "Primeiro rascunho", + "dashboard.composition.status.outline": "Contorno", + "dashboard.composition.status.revised": "Revisado", + "dashboard.composition.status.untracked": "Não rastreado", + "dashboard.composition.title": "Composição do Manuscrito", + "dashboard.continueWriting.button": "Volte para dentro", + "dashboard.continueWriting.empty": "Comece sua história na visualização Manuscrito.", + "dashboard.continueWriting.title": "Continuar escrevendo", + "dashboard.details.aiLoglineButton": "Assistente de logline de IA", + "dashboard.details.logline": "Linha de registro", + "dashboard.details.loglinePlaceholder": "Um resumo de uma frase da sua história.", + "dashboard.details.projectTitle": "Título do projeto", + "dashboard.details.projectTitlePlaceholder": "Minha incrível história", + "dashboard.details.title": "Detalhes da história", + "dashboard.glance.noCharacters": "Nenhum personagem ainda.", + "dashboard.glance.noWorlds": "Ainda não há mundos.", + "dashboard.glance.recentCharacter": "Personagem recente", + "dashboard.glance.recentWorld": "Mundo recente", + "dashboard.glance.title": "De relance", + "dashboard.goals.dayLeft": "Falta 1 dia", + "dashboard.goals.daysLeft": "{{count}} dias restantes", + "dashboard.goals.deadline": "Prazo final", + "dashboard.goals.editGoal": "Editar meta", + "dashboard.goals.modal.deadlineLabel": "Prazo alvo (opcional)", + "dashboard.goals.modal.save": "Salvar metas", + "dashboard.goals.modal.title": "Definir metas do projeto", + "dashboard.goals.modal.wordCountLabel": "Contagem de palavras alvo", + "dashboard.goals.noDaysLeft": "Prazo hoje", + "dashboard.goals.noDeadline": "Sem prazo definido", + "dashboard.goals.overdue": "Atrasado", + "dashboard.goals.pace.behind": "Atrás do ritmo", + "dashboard.goals.pace.done": "Meta alcançada", + "dashboard.goals.pace.noDeadline": "Defina um prazo", + "dashboard.goals.pace.onTrack": "No caminho certo", + "dashboard.goals.pace.perDayUnit": "/dia", + "dashboard.goals.pace.title": "Ritmo", + "dashboard.goals.setGoal": "Definir meta", + "dashboard.goals.title": "Metas do Projeto", + "dashboard.goals.wordCount": "Contagem de palavras", + "dashboard.goals.wordsRemaining": "{{count}} palavras restantes", + "dashboard.greeting": "Bem-vindo de volta ao", "dashboard.header.ariaLabel": "Visão geral do projeto", - "dashboard.header.greetingMorning": "Bom dia", "dashboard.header.greetingAfternoon": "Boa tarde", "dashboard.header.greetingEvening": "Boa noite", + "dashboard.header.greetingMorning": "Bom dia", "dashboard.header.greetingNight": "Queimando o óleo da meia-noite", "dashboard.header.lastEdited": "Última edição: {{title}}", - "dashboard.momentum.title": "Momento de escrita", + "dashboard.healthScore.body": "Uma mistura leve de progresso de metas, profundidade de elenco e cobertura de construção de mundo.", + "dashboard.healthScore.cast": "Profundidade do elenco", + "dashboard.healthScore.scoreLabel": "Pontuação", + "dashboard.healthScore.title": "Saúde do projeto", + "dashboard.healthScore.world": "Construção mundial", + "dashboard.healthScore.writing": "Progresso da escrita", + "dashboard.loglineModal.loading": "Gerando loglines brilhantes...", + "dashboard.loglineModal.title": "Sugestões de logline de IA", + "dashboard.momentum.activity": "Últimos 14 dias", "dashboard.momentum.dayStreak": "sequência do dia", + "dashboard.momentum.goalReached": "Meta alcançada", "dashboard.momentum.longest": "Melhor: {{contagem}}", - "dashboard.momentum.today": "Hoje", - "dashboard.momentum.thisWeek": "Essa semana", - "dashboard.momentum.ofGoal": "{{atual}} / {{meta}}", - "dashboard.momentum.activity": "Últimos 14 dias", "dashboard.momentum.noActivity": "Nenhuma escrita registrada ainda – inicie uma sessão para construir sua seqüência.", - "dashboard.momentum.goalReached": "Meta alcançada", - "dashboard.composition.title": "Composição do Manuscrito", - "dashboard.composition.scenes": "Cenas", - "dashboard.composition.avgPerScene": "Média / cena", - "dashboard.composition.readingTime": "Tempo de leitura", - "dashboard.composition.readingTimeValue": "{{contagem}} minutos", - "dashboard.composition.empty": "Adicione cenas no Manuscrito para ver sua composição.", - "dashboard.composition.status.outline": "Contorno", - "dashboard.composition.status.draft": "Rascunho", - "dashboard.composition.status.firstDraft": "Primeiro rascunho", - "dashboard.composition.status.revised": "Revisado", - "dashboard.composition.status.final": "Final", - "dashboard.composition.status.untracked": "Não rastreado" + "dashboard.momentum.ofGoal": "{{atual}} / {{meta}}", + "dashboard.momentum.thisWeek": "Essa semana", + "dashboard.momentum.title": "Momento de escrita", + "dashboard.momentum.today": "Hoje", + "dashboard.noLogline": "Ainda não há logline. Adicione um no inspetor de manuscritos!", + "dashboard.onboarding.dismiss": "Entendi", + "dashboard.onboarding.startTour": "Visita guiada", + "dashboard.onboarding.tip1": "Use a barra lateral para alternar entre Manuscrito, Personagens, Mundos e Exportar.", + "dashboard.onboarding.tip2": "Adicione uma chave de API em Configurações para desbloquear a IA da nuvem ou escolha Ollama para modelos locais.", + "dashboard.onboarding.tip3": "Seu trabalho é salvo automaticamente neste dispositivo — os instantâneos estão disponíveis no Controle de versão.", + "dashboard.onboarding.title": "Dicas rápidas", + "dashboard.quickAccess.charactersDesc": "Gerencie seu elenco de personagens nos dossiês.", + "dashboard.quickAccess.exportDesc": "Formate e baixe seu projeto concluído.", + "dashboard.quickAccess.manuscriptDesc": "Entre no editor de manuscritos para escrever e organizar.", + "dashboard.quickAccess.outlineDesc": "Gere uma nova estrutura de enredo com o AI Outliner.", + "dashboard.quickAccess.title": "Ações rápidas", + "dashboard.quickAccess.worldDesc": "Construa e explore os mundos da sua história.", + "dashboard.quickAccess.writerDesc": "Use o AI Writing Studio para superar o bloqueio de escritor.", + "dashboard.stats.characters": "Personagens", + "dashboard.stats.outlineSections": "Seções de esboço", + "dashboard.stats.title": "Estatísticas do projeto", + "dashboard.stats.totalWordCount": "Palavras", + "dashboard.stats.worlds": "Mundos", + "initialProject.chapter1": "Capítulo 1", + "initialProject.logline": "Uma jornada de mil milhas começa com um único passo...", + "initialProject.title": "Minha história sem título" } diff --git a/locales/pt/export.json b/locales/pt/export.json index 7ef959105..507e3bcad 100644 --- a/locales/pt/export.json +++ b/locales/pt/export.json @@ -1,94 +1,94 @@ { - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", - "export.pasteSection.heading": "Google Docs / Notion" + "export.pasteSection.expand": "Paste text", + "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds" } diff --git a/locales/pt/lora.json b/locales/pt/lora.json index 0f5c5c2cd..b07c355eb 100644 --- a/locales/pt/lora.json +++ b/locales/pt/lora.json @@ -1,78 +1,78 @@ { - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/locales/pt/manuscript.json b/locales/pt/manuscript.json index cc32f3eb7..ed9d683ad 100644 --- a/locales/pt/manuscript.json +++ b/locales/pt/manuscript.json @@ -1,69 +1,69 @@ { - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", - "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss" + "manuscript.zenMode.label": "Zen Mode" } diff --git a/locales/pt/mindmap.json b/locales/pt/mindmap.json index 40eb96e9c..276648b42 100644 --- a/locales/pt/mindmap.json +++ b/locales/pt/mindmap.json @@ -1,48 +1,48 @@ { - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel" + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out" } diff --git a/locales/pt/objects.json b/locales/pt/objects.json index d2c36e1e5..0eda5751f 100644 --- a/locales/pt/objects.json +++ b/locales/pt/objects.json @@ -1,51 +1,51 @@ { - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", + "objects.save": "Save", + "objects.search": "Search objects…", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", "objects.typeLabel.artifact": "Artifact", "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", "objects.typeLabel.other": "Other", - "objects.save": "Save", - "objects.cancel": "Cancel", - "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", - "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects" + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", + "objects.ungrouped": "Ungrouped" } diff --git a/locales/pt/outline.json b/locales/pt/outline.json index dc32546da..cd10722db 100644 --- a/locales/pt/outline.json +++ b/locales/pt/outline.json @@ -1,46 +1,46 @@ { - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", - "outline.selectSection": "Select section '{{title}}'" + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", + "outline.selectSection": "Select section '{{title}}'", + "outline.title": "AI Story Outline Generator" } diff --git a/locales/pt/portal.json b/locales/pt/portal.json index 5f1c26426..105fd04d3 100644 --- a/locales/pt/portal.json +++ b/locales/pt/portal.json @@ -1,42 +1,42 @@ { - "portal.language.groupLabel": "Idioma da tela de boas-vindas", - "portal.language.searchPlaceholder": "Pesquisar idiomas...", - "portal.welcome.title": "Bem-vindo ao StoryCraft Studio", - "portal.welcome.subtitle": "Seu parceiro criativo para escrever com tecnologia de IA.", - "portal.welcome.newProject": "Comece um novo projeto", - "portal.welcome.openProject": "Abrir projeto", - "portal.welcome.continue": "Continuar última sessão", - "portal.welcome.tryDemo": "Carregar projeto de demonstração", - "portal.welcome.demoHint": "Novo aqui? Carregue um pequeno exemplo de história com esboço e manuscrito para explorar o aplicativo.", - "portal.welcome.privacyBadge": "100% offline – sua história permanece neste dispositivo; As chaves de API são criptografadas em repouso.", - "portal.new.demo.title": "Explore o projeto de demonstração", - "portal.new.demo.description": "Projeto pré-preenchido com esboço e primeiro capítulo — ideal para aprender a interface do usuário e as ferramentas.", - "portal.new.title": "Como você gostaria de começar?", - "portal.new.description": "Escolha um ponto de partida que melhor se adapte ao seu processo criativo.", - "portal.new.template.title": "Comece com um modelo", - "portal.new.template.description": "Use uma estrutura narrativa clássica como a Estrutura de Três Atos para guiar sua história.", - "portal.new.ai.title": "Gere com IA", - "portal.new.ai.description": "Forneça uma ideia simples e deixe nossa IA construir um esboço detalhado do enredo para você.", - "portal.new.blank.title": "Comece com um manuscrito em branco", - "portal.new.blank.description": "Para quem sabe para onde vai. Comece com um primeiro capítulo vazio.", - "portal.demo.title": "Demonstração: A Torre Selada", + "portal.back": "Voltar", + "portal.demo.chapterContent": "A névoa matinal cobria o cais enquanto Lyra desenrolava o antigo mapa da cidade. Um círculo tênue marcava o canto noroeste – a torre que ninguém mencionou.\n\nEla guardou o papel e seguiu pelo caminho estreito até que a grade de ferro se ergueu diante dela. O cadeado estava quente ao sol; o metal ainda frio.", + "portal.demo.chapterTitle": "Capítulo 1 - Antes do Portão", "portal.demo.logline": "Uma pequena amostra para testar o esboço, o manuscrito e o espaço de trabalho.", - "portal.demo.outline1Title": "Abertura", "portal.demo.outline1Desc": "A cidade ribeirinha; o protagonista descobre uma torre proibida.", - "portal.demo.outline2Title": "Conflito", + "portal.demo.outline1Title": "Abertura", "portal.demo.outline2Desc": "O selo quebra; uma decisão com consequências.", - "portal.demo.chapterTitle": "Capítulo 1 - Antes do Portão", - "portal.demo.chapterContent": "A névoa matinal cobria o cais enquanto Lyra desenrolava o antigo mapa da cidade. Um círculo tênue marcava o canto noroeste – a torre que ninguém mencionou.\n\nEla guardou o papel e seguiu pelo caminho estreito até que a grade de ferro se ergueu diante dela. O cadeado estava quente ao sol; o metal ainda frio.", - "portal.open.title": "Abra um projeto existente", - "portal.open.description": "Carregue um projeto salvo anteriormente de um arquivo de backup (.json) para continuar seu trabalho.", - "portal.open.button": "Importar arquivo de projeto", - "portal.back": "Voltar", - "portal.features.ai.title": "Copiloto de IA", + "portal.demo.outline2Title": "Conflito", + "portal.demo.title": "Demonstração: A Torre Selada", "portal.features.ai.description": "Elabore, faça brainstorming e supere blocos com modelos em nuvem ou totalmente locais.", - "portal.features.plot.title": "Quadro de plotagem visual", + "portal.features.ai.title": "Copiloto de IA", + "portal.features.export.description": "Compile em DOCX, PDF, EPUB e Markdown — totalmente offline.", + "portal.features.export.title": "Exportação profissional", "portal.features.plot.description": "Planeje a estrutura em uma tela com curvas de tensão e folhas de batida.", - "portal.features.worldbuilding.title": "Personagens e mundos", + "portal.features.plot.title": "Quadro de plotagem visual", "portal.features.worldbuilding.description": "Dossiês ricos, atlas, retratos de IA e mapas de relacionamento.", - "portal.features.export.title": "Exportação profissional", - "portal.features.export.description": "Compile em DOCX, PDF, EPUB e Markdown — totalmente offline." + "portal.features.worldbuilding.title": "Personagens e mundos", + "portal.language.groupLabel": "Idioma da tela de boas-vindas", + "portal.language.searchPlaceholder": "Pesquisar idiomas...", + "portal.new.ai.description": "Forneça uma ideia simples e deixe nossa IA construir um esboço detalhado do enredo para você.", + "portal.new.ai.title": "Gere com IA", + "portal.new.blank.description": "Para quem sabe para onde vai. Comece com um primeiro capítulo vazio.", + "portal.new.blank.title": "Comece com um manuscrito em branco", + "portal.new.demo.description": "Projeto pré-preenchido com esboço e primeiro capítulo — ideal para aprender a interface do usuário e as ferramentas.", + "portal.new.demo.title": "Explore o projeto de demonstração", + "portal.new.description": "Escolha um ponto de partida que melhor se adapte ao seu processo criativo.", + "portal.new.template.description": "Use uma estrutura narrativa clássica como a Estrutura de Três Atos para guiar sua história.", + "portal.new.template.title": "Comece com um modelo", + "portal.new.title": "Como você gostaria de começar?", + "portal.open.button": "Importar arquivo de projeto", + "portal.open.description": "Carregue um projeto salvo anteriormente de um arquivo de backup (.json) para continuar seu trabalho.", + "portal.open.title": "Abra um projeto existente", + "portal.welcome.continue": "Continuar última sessão", + "portal.welcome.demoHint": "Novo aqui? Carregue um pequeno exemplo de história com esboço e manuscrito para explorar o aplicativo.", + "portal.welcome.newProject": "Comece um novo projeto", + "portal.welcome.openProject": "Abrir projeto", + "portal.welcome.privacyBadge": "100% offline – sua história permanece neste dispositivo; As chaves de API são criptografadas em repouso.", + "portal.welcome.subtitle": "Seu parceiro criativo para escrever com tecnologia de IA.", + "portal.welcome.title": "Bem-vindo ao StoryCraft Studio", + "portal.welcome.tryDemo": "Carregar projeto de demonstração" } diff --git a/locales/pt/settings.json b/locales/pt/settings.json index c6ddfbf0c..073f687f1 100644 --- a/locales/pt/settings.json +++ b/locales/pt/settings.json @@ -476,8 +476,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", diff --git a/locales/pt/sidebar.json b/locales/pt/sidebar.json index a4441e7b4..9a8f43411 100644 --- a/locales/pt/sidebar.json +++ b/locales/pt/sidebar.json @@ -1,25 +1,25 @@ { - "sidebar.mainAria": "Barra lateral principal", - "sidebar.primaryNavAria": "Navegação primária", - "sidebar.secondaryNavAria": "Configurações e ajuda", - "sidebar.mobileNavigation": "Visualizações primárias", - "sidebar.overflowMenuAria": "Mais visualizações", - "sidebar.dashboard": "Painel", - "sidebar.manuscript": "Manuscrito", - "sidebar.writer": "Estúdio de redação de IA", - "sidebar.templates": "Modelos", - "sidebar.outline": "Gerador de contorno", - "sidebar.characters": "Personagens", - "sidebar.world": "Construção Mundial", - "sidebar.sceneboard": "Quadro de cena", "sidebar.characterGraph": "Gráfico de caracteres", + "sidebar.characterInterviews": "Entrevistas com personagens", + "sidebar.characters": "Personagens", "sidebar.consistencyChecker": "Verificador de consistência", "sidebar.critic": "Crítico de IA", + "sidebar.dashboard": "Painel", "sidebar.export": "Exportar", - "sidebar.settings": "Configurações", "sidebar.help": "Ajuda", - "sidebar.objects": "Objetos de história", + "sidebar.lora": "Afinação", + "sidebar.mainAria": "Barra lateral principal", + "sidebar.manuscript": "Manuscrito", "sidebar.mindmap": "Mapas Mentais", - "sidebar.characterInterviews": "Entrevistas com personagens", - "sidebar.lora": "Afinação" + "sidebar.mobileNavigation": "Visualizações primárias", + "sidebar.objects": "Objetos de história", + "sidebar.outline": "Gerador de contorno", + "sidebar.overflowMenuAria": "Mais visualizações", + "sidebar.primaryNavAria": "Navegação primária", + "sidebar.sceneboard": "Quadro de cena", + "sidebar.secondaryNavAria": "Configurações e ajuda", + "sidebar.settings": "Configurações", + "sidebar.templates": "Modelos", + "sidebar.world": "Construção Mundial", + "sidebar.writer": "Estúdio de redação de IA" } diff --git a/locales/pt/tags.json b/locales/pt/tags.json index 97118bba7..d18e499a8 100644 --- a/locales/pt/tags.json +++ b/locales/pt/tags.json @@ -1,20 +1,20 @@ { - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional" + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller" } diff --git a/locales/pt/tour.json b/locales/pt/tour.json index fc64815dd..f3d8a53f0 100644 --- a/locales/pt/tour.json +++ b/locales/pt/tour.json @@ -1,20 +1,20 @@ { - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour" + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings" } diff --git a/locales/pt/worlds.json b/locales/pt/worlds.json index 6844b4096..1843a6234 100644 --- a/locales/pt/worlds.json +++ b/locales/pt/worlds.json @@ -1,54 +1,54 @@ { - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name" + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds" } diff --git a/locales/pt/writer.json b/locales/pt/writer.json index a5d85f87d..c6e621e19 100644 --- a/locales/pt/writer.json +++ b/locales/pt/writer.json @@ -1,82 +1,82 @@ { - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", + "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", - "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)" } diff --git a/locales/zh/characterInterviews.json b/locales/zh/characterInterviews.json index 988a35da1..618c0ea65 100644 --- a/locales/zh/characterInterviews.json +++ b/locales/zh/characterInterviews.json @@ -1,39 +1,39 @@ { - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel" + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews" } diff --git a/locales/zh/characters.json b/locales/zh/characters.json index 40b864d9f..d1f4d9dee 100644 --- a/locales/zh/characters.json +++ b/locales/zh/characters.json @@ -1,73 +1,73 @@ { - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name" + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters" } diff --git a/locales/zh/common.json b/locales/zh/common.json index f53416eda..ef0222271 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -148,6 +148,8 @@ "error.db.invalidState": "内部数据库错误。请重新加载页面。", "error.db.quotaExceeded": "浏览器存储空间已满。请删除旧项目或快照。", "error.db.unknown": "访问数据库时出现未知错误。", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "文件导入错误", "error.mic.denied": "麦克风访问被拒绝。请在您的浏览器设置中授予权限。", "error.mic.generic": "语音识别错误:{{error}}", diff --git a/locales/zh/dashboard.json b/locales/zh/dashboard.json index 63505806b..6826b410b 100644 --- a/locales/zh/dashboard.json +++ b/locales/zh/dashboard.json @@ -1,109 +1,109 @@ { - "initialProject.title": "我的无题故事", - "initialProject.logline": "千里之行,始于足下……", - "initialProject.chapter1": "第一章", - "dashboard.greeting": "欢迎回到", - "dashboard.noLogline": "还没有日志。稿件检查器中添加一个!", - "dashboard.continueWriting.title": "继续写作", - "dashboard.continueWriting.button": "跳回", - "dashboard.continueWriting.empty": "在手稿视图中开始您的故事。", - "dashboard.goals.title": "项目目标", - "dashboard.goals.wordCount": "字数统计", - "dashboard.goals.deadline": "最后期限", - "dashboard.goals.noDeadline": "没有设定最后期限", - "dashboard.goals.daysLeft": "还剩 {{count}} 天", - "dashboard.goals.dayLeft": "还剩 1 天", - "dashboard.goals.noDaysLeft": "今天截止日期", - "dashboard.goals.overdue": "逾期", - "dashboard.goals.setGoal": "设定目标", - "dashboard.goals.editGoal": "编辑目标", - "dashboard.goals.modal.title": "设定项目目标", - "dashboard.goals.modal.wordCountLabel": "目标字数", - "dashboard.goals.modal.deadlineLabel": "目标截止日期(可选)", - "dashboard.goals.modal.save": "保存目标", - "dashboard.goals.wordsRemaining": "还剩 {{count}} 个字", - "dashboard.goals.pace.title": "步伐", - "dashboard.goals.pace.perDayUnit": "/天", - "dashboard.goals.pace.onTrack": "步入正轨", - "dashboard.goals.pace.behind": "落后的步伐", - "dashboard.goals.pace.done": "目标达成", - "dashboard.goals.pace.noDeadline": "设定截止日期", - "dashboard.glance.title": "概览", - "dashboard.glance.recentCharacter": "最近的角色", - "dashboard.glance.recentWorld": "最近的世界", - "dashboard.glance.noCharacters": "还没有角色。", - "dashboard.glance.noWorlds": "还没有世界。", - "dashboard.stats.title": "项目统计", - "dashboard.stats.characters": "人物", - "dashboard.stats.worlds": "世界赛", - "dashboard.stats.outlineSections": "大纲部分", - "dashboard.stats.totalWordCount": "字", - "dashboard.healthScore.title": "项目健康", - "dashboard.healthScore.body": "目标进度、投射深度和世界构建覆盖范围的轻量级混合。", - "dashboard.healthScore.scoreLabel": "分数", - "dashboard.healthScore.writing": "写作进度", - "dashboard.healthScore.cast": "铸造深度", - "dashboard.healthScore.world": "世界建筑", - "dashboard.quickAccess.title": "快速行动", - "dashboard.quickAccess.manuscriptDesc": "跳进稿件编辑器进行写作和组织。", - "dashboard.quickAccess.writerDesc": "使用 AI 写作工作室来克服写作障碍。", - "dashboard.quickAccess.outlineDesc": "使用 AI 大纲工具生成新的绘图结构。", - "dashboard.quickAccess.charactersDesc": "管理档案中的角色阵容。", - "dashboard.quickAccess.worldDesc": "构建并探索你的故事世界。", - "dashboard.quickAccess.exportDesc": "格式化并下载已完成的项目。", - "dashboard.details.title": "故事详情", - "dashboard.details.projectTitle": "项目名称", - "dashboard.details.projectTitlePlaceholder": "我的精彩故事", - "dashboard.details.logline": "故事梗概", - "dashboard.details.loglinePlaceholder": "用一句话概括你的故事。", - "dashboard.details.aiLoglineButton": "AI 剧情助理", - "dashboard.loglineModal.title": "AI 梗概建议", - "dashboard.loglineModal.loading": "生成精彩的故事情节...", - "dashboard.onboarding.title": "快速提示", - "dashboard.onboarding.tip1": "使用侧边栏在手稿、角色、世界和导出之间切换。", - "dashboard.onboarding.tip2": "在“设置”中添加 API 密钥以解锁云 AI,或为本地模型选择 Ollama。", - "dashboard.onboarding.tip3": "您的工作会自动保存到此设备 - 快照可在版本控制下使用。", - "dashboard.onboarding.dismiss": "知道了", - "dashboard.onboarding.startTour": "导赏团", - "dashboard.authorInsights.title": "作者管道见解", "dashboard.authorInsights.readability": "可读性(Flesch 风格,EN 启发式)", - "dashboard.authorInsights.readabilityNeedMore": "多写一点——可读性需要约 40 个以上的单词才能获得稳定的分数。", "dashboard.authorInsights.readabilityFootnote": "分数越高通常意味着阅读越容易;有意调整您的风格。", + "dashboard.authorInsights.readabilityNeedMore": "多写一点——可读性需要约 40 个以上的单词才能获得稳定的分数。", "dashboard.authorInsights.timeline": "场景时间线检查", "dashboard.authorInsights.timelineClear": "场景元数据没有时间线警告。", "dashboard.authorInsights.timelineWarnBadge": "{{count}} 条警告 — 在场景板上优化场景日期/持续时间。", - "dashboard.backup.title": "备份与恢复", - "dashboard.backup.hint": "导出项目、导入备份或打开完整备份设置。", + "dashboard.authorInsights.title": "作者管道见解", "dashboard.backup.exportJson": "导出 JSON", + "dashboard.backup.hint": "导出项目、导入备份或打开完整备份设置。", "dashboard.backup.importJson": "导入 JSON", - "dashboard.backup.openSettings": "备份设置", "dashboard.backup.latestSnapshot": "最新快照:{{name}}({{date}})", + "dashboard.backup.openSettings": "备份设置", + "dashboard.backup.title": "备份与恢复", "dashboard.backup.unnamedSnapshot": "未命名快照", + "dashboard.composition.avgPerScene": "平均/场景", + "dashboard.composition.empty": "在手稿中添加场景以查看其构成。", + "dashboard.composition.readingTime": "阅读时间", + "dashboard.composition.readingTimeValue": "{{count}} 分钟", + "dashboard.composition.scenes": "场景", + "dashboard.composition.status.draft": "草稿", + "dashboard.composition.status.final": "最终的", + "dashboard.composition.status.firstDraft": "初稿", + "dashboard.composition.status.outline": "大纲", + "dashboard.composition.status.revised": "修改", + "dashboard.composition.status.untracked": "未追踪", + "dashboard.composition.title": "稿件作文", + "dashboard.continueWriting.button": "跳回", + "dashboard.continueWriting.empty": "在手稿视图中开始您的故事。", + "dashboard.continueWriting.title": "继续写作", + "dashboard.details.aiLoglineButton": "AI 剧情助理", + "dashboard.details.logline": "故事梗概", + "dashboard.details.loglinePlaceholder": "用一句话概括你的故事。", + "dashboard.details.projectTitle": "项目名称", + "dashboard.details.projectTitlePlaceholder": "我的精彩故事", + "dashboard.details.title": "故事详情", + "dashboard.glance.noCharacters": "还没有角色。", + "dashboard.glance.noWorlds": "还没有世界。", + "dashboard.glance.recentCharacter": "最近的角色", + "dashboard.glance.recentWorld": "最近的世界", + "dashboard.glance.title": "概览", + "dashboard.goals.dayLeft": "还剩 1 天", + "dashboard.goals.daysLeft": "还剩 {{count}} 天", + "dashboard.goals.deadline": "最后期限", + "dashboard.goals.editGoal": "编辑目标", + "dashboard.goals.modal.deadlineLabel": "目标截止日期(可选)", + "dashboard.goals.modal.save": "保存目标", + "dashboard.goals.modal.title": "设定项目目标", + "dashboard.goals.modal.wordCountLabel": "目标字数", + "dashboard.goals.noDaysLeft": "今天截止日期", + "dashboard.goals.noDeadline": "没有设定最后期限", + "dashboard.goals.overdue": "逾期", + "dashboard.goals.pace.behind": "落后的步伐", + "dashboard.goals.pace.done": "目标达成", + "dashboard.goals.pace.noDeadline": "设定截止日期", + "dashboard.goals.pace.onTrack": "步入正轨", + "dashboard.goals.pace.perDayUnit": "/天", + "dashboard.goals.pace.title": "步伐", + "dashboard.goals.setGoal": "设定目标", + "dashboard.goals.title": "项目目标", + "dashboard.goals.wordCount": "字数统计", + "dashboard.goals.wordsRemaining": "还剩 {{count}} 个字", + "dashboard.greeting": "欢迎回到", "dashboard.header.ariaLabel": "项目概况", - "dashboard.header.greetingMorning": "早上好", "dashboard.header.greetingAfternoon": "下午好", "dashboard.header.greetingEvening": "晚上好", + "dashboard.header.greetingMorning": "早上好", "dashboard.header.greetingNight": "开夜车", "dashboard.header.lastEdited": "最后编辑:{{title}}", - "dashboard.momentum.title": "写作动力", + "dashboard.healthScore.body": "目标进度、投射深度和世界构建覆盖范围的轻量级混合。", + "dashboard.healthScore.cast": "铸造深度", + "dashboard.healthScore.scoreLabel": "分数", + "dashboard.healthScore.title": "项目健康", + "dashboard.healthScore.world": "世界建筑", + "dashboard.healthScore.writing": "写作进度", + "dashboard.loglineModal.loading": "生成精彩的故事情节...", + "dashboard.loglineModal.title": "AI 梗概建议", + "dashboard.momentum.activity": "过去 14 天", "dashboard.momentum.dayStreak": "连续日", + "dashboard.momentum.goalReached": "目标达成", "dashboard.momentum.longest": "最佳:{{count}}", - "dashboard.momentum.today": "今天", - "dashboard.momentum.thisWeek": "本星期", - "dashboard.momentum.ofGoal": "{{当前}} / {{目标}}", - "dashboard.momentum.activity": "过去 14 天", "dashboard.momentum.noActivity": "尚未记录任何写作记录 - 开始一个会话来建立您的连续记录。", - "dashboard.momentum.goalReached": "目标达成", - "dashboard.composition.title": "稿件作文", - "dashboard.composition.scenes": "场景", - "dashboard.composition.avgPerScene": "平均/场景", - "dashboard.composition.readingTime": "阅读时间", - "dashboard.composition.readingTimeValue": "{{count}} 分钟", - "dashboard.composition.empty": "在手稿中添加场景以查看其构成。", - "dashboard.composition.status.outline": "大纲", - "dashboard.composition.status.draft": "草稿", - "dashboard.composition.status.firstDraft": "初稿", - "dashboard.composition.status.revised": "修改", - "dashboard.composition.status.final": "最终的", - "dashboard.composition.status.untracked": "未追踪" + "dashboard.momentum.ofGoal": "{{当前}} / {{目标}}", + "dashboard.momentum.thisWeek": "本星期", + "dashboard.momentum.title": "写作动力", + "dashboard.momentum.today": "今天", + "dashboard.noLogline": "还没有日志。稿件检查器中添加一个!", + "dashboard.onboarding.dismiss": "知道了", + "dashboard.onboarding.startTour": "导赏团", + "dashboard.onboarding.tip1": "使用侧边栏在手稿、角色、世界和导出之间切换。", + "dashboard.onboarding.tip2": "在“设置”中添加 API 密钥以解锁云 AI,或为本地模型选择 Ollama。", + "dashboard.onboarding.tip3": "您的工作会自动保存到此设备 - 快照可在版本控制下使用。", + "dashboard.onboarding.title": "快速提示", + "dashboard.quickAccess.charactersDesc": "管理档案中的角色阵容。", + "dashboard.quickAccess.exportDesc": "格式化并下载已完成的项目。", + "dashboard.quickAccess.manuscriptDesc": "跳进稿件编辑器进行写作和组织。", + "dashboard.quickAccess.outlineDesc": "使用 AI 大纲工具生成新的绘图结构。", + "dashboard.quickAccess.title": "快速行动", + "dashboard.quickAccess.worldDesc": "构建并探索你的故事世界。", + "dashboard.quickAccess.writerDesc": "使用 AI 写作工作室来克服写作障碍。", + "dashboard.stats.characters": "人物", + "dashboard.stats.outlineSections": "大纲部分", + "dashboard.stats.title": "项目统计", + "dashboard.stats.totalWordCount": "字", + "dashboard.stats.worlds": "世界赛", + "initialProject.chapter1": "第一章", + "initialProject.logline": "千里之行,始于足下……", + "initialProject.title": "我的无题故事" } diff --git a/locales/zh/export.json b/locales/zh/export.json index 7ef959105..507e3bcad 100644 --- a/locales/zh/export.json +++ b/locales/zh/export.json @@ -1,94 +1,94 @@ { - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", - "export.pasteSection.heading": "Google Docs / Notion" + "export.pasteSection.expand": "Paste text", + "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds" } diff --git a/locales/zh/lora.json b/locales/zh/lora.json index 0f5c5c2cd..b07c355eb 100644 --- a/locales/zh/lora.json +++ b/locales/zh/lora.json @@ -1,78 +1,78 @@ { - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/locales/zh/manuscript.json b/locales/zh/manuscript.json index cc32f3eb7..ed9d683ad 100644 --- a/locales/zh/manuscript.json +++ b/locales/zh/manuscript.json @@ -1,69 +1,69 @@ { - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", - "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss" + "manuscript.zenMode.label": "Zen Mode" } diff --git a/locales/zh/mindmap.json b/locales/zh/mindmap.json index 40eb96e9c..276648b42 100644 --- a/locales/zh/mindmap.json +++ b/locales/zh/mindmap.json @@ -1,48 +1,48 @@ { - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel" + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out" } diff --git a/locales/zh/objects.json b/locales/zh/objects.json index d2c36e1e5..0eda5751f 100644 --- a/locales/zh/objects.json +++ b/locales/zh/objects.json @@ -1,51 +1,51 @@ { - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", + "objects.save": "Save", + "objects.search": "Search objects…", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", "objects.typeLabel.artifact": "Artifact", "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", "objects.typeLabel.other": "Other", - "objects.save": "Save", - "objects.cancel": "Cancel", - "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", - "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects" + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", + "objects.ungrouped": "Ungrouped" } diff --git a/locales/zh/outline.json b/locales/zh/outline.json index dc32546da..cd10722db 100644 --- a/locales/zh/outline.json +++ b/locales/zh/outline.json @@ -1,46 +1,46 @@ { - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", - "outline.selectSection": "Select section '{{title}}'" + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", + "outline.selectSection": "Select section '{{title}}'", + "outline.title": "AI Story Outline Generator" } diff --git a/locales/zh/portal.json b/locales/zh/portal.json index 1669e3b1d..c7887f1e9 100644 --- a/locales/zh/portal.json +++ b/locales/zh/portal.json @@ -1,42 +1,42 @@ { - "portal.language.groupLabel": "欢迎屏幕语言", - "portal.language.searchPlaceholder": "搜索语言...", - "portal.welcome.title": "欢迎来到 StoryCraft 工作室", - "portal.welcome.subtitle": "您的人工智能写作创意合作伙伴。", - "portal.welcome.newProject": "开始一个新项目", - "portal.welcome.openProject": "开放项目", - "portal.welcome.continue": "继续上一课", - "portal.welcome.tryDemo": "加载演示项目", - "portal.welcome.demoHint": "新来的?加载带有大纲和手稿的简短示例故事来探索该应用程序。", - "portal.welcome.privacyBadge": "100% 离线优先 — 您的故事保留在此设备上; API 密钥静态加密。", - "portal.new.demo.title": "探索演示项目", - "portal.new.demo.description": "预填充项目,包含大纲和​​第一章 - 非常适合学习 UI 和工具。", - "portal.new.title": "您想如何开始?", - "portal.new.description": "选择最适合您的创作过程的起点。", - "portal.new.template.title": "从模板开始", - "portal.new.template.description": "使用经典的叙事结构(例如三幕结构)来指导您的故事。", - "portal.new.ai.title": "用人工智能生成", - "portal.new.ai.description": "提供一个简单的想法,让我们的人工智能为您构建详细的情节轮廓。", - "portal.new.blank.title": "从空白手稿开始", - "portal.new.blank.description": "对于那些知道自己要去哪里的人。从空的第一章开始。", - "portal.demo.title": "演示:密封塔", + "portal.back": "后退", + "portal.demo.chapterContent": "当莱拉展开旧城地图时,晨雾笼罩在码头上。西北角有一个淡淡的圆圈标记——那座塔无人提及。\n\n她把纸收起来,沿着狭窄的小路走,直到铁格子在她面前升起。挂锁在阳光下显得温暖;金属仍然冰冷。", + "portal.demo.chapterTitle": "第一章 门前", "portal.demo.logline": "尝试大纲、手稿和工作区的简短示例。", - "portal.demo.outline1Title": "开幕", "portal.demo.outline1Desc": "河边小镇;主角发现了一座禁塔。", - "portal.demo.outline2Title": "冲突", + "portal.demo.outline1Title": "开幕", "portal.demo.outline2Desc": "封印破裂;具有后果的决定。", - "portal.demo.chapterTitle": "第一章 门前", - "portal.demo.chapterContent": "当莱拉展开旧城地图时,晨雾笼罩在码头上。西北角有一个淡淡的圆圈标记——那座塔无人提及。\n\n她把纸收起来,沿着狭窄的小路走,直到铁格子在她面前升起。挂锁在阳光下显得温暖;金属仍然冰冷。", - "portal.open.title": "打开现有项目", - "portal.open.description": "从备份文件 (.json) 加载以前保存的项目以继续您的工作。", - "portal.open.button": "导入项目文件", - "portal.back": "后退", - "portal.features.ai.title": "人工智能副驾驶", + "portal.demo.outline2Title": "冲突", + "portal.demo.title": "演示:密封塔", "portal.features.ai.description": "使用云或完全本地模型起草、集思广益并突破障碍。", - "portal.features.plot.title": "视觉绘图板", + "portal.features.ai.title": "人工智能副驾驶", + "portal.features.export.description": "完全离线编译为 DOCX、PDF、EPUB 和 Markdown。", + "portal.features.export.title": "专业出口", "portal.features.plot.description": "使用张力曲线和节拍表在画布上规划结构。", - "portal.features.worldbuilding.title": "人物与世界", + "portal.features.plot.title": "视觉绘图板", "portal.features.worldbuilding.description": "丰富的档案、图册、AI画像、关系图谱。", - "portal.features.export.title": "专业出口", - "portal.features.export.description": "完全离线编译为 DOCX、PDF、EPUB 和 Markdown。" + "portal.features.worldbuilding.title": "人物与世界", + "portal.language.groupLabel": "欢迎屏幕语言", + "portal.language.searchPlaceholder": "搜索语言...", + "portal.new.ai.description": "提供一个简单的想法,让我们的人工智能为您构建详细的情节轮廓。", + "portal.new.ai.title": "用人工智能生成", + "portal.new.blank.description": "对于那些知道自己要去哪里的人。从空的第一章开始。", + "portal.new.blank.title": "从空白手稿开始", + "portal.new.demo.description": "预填充项目,包含大纲和​​第一章 - 非常适合学习 UI 和工具。", + "portal.new.demo.title": "探索演示项目", + "portal.new.description": "选择最适合您的创作过程的起点。", + "portal.new.template.description": "使用经典的叙事结构(例如三幕结构)来指导您的故事。", + "portal.new.template.title": "从模板开始", + "portal.new.title": "您想如何开始?", + "portal.open.button": "导入项目文件", + "portal.open.description": "从备份文件 (.json) 加载以前保存的项目以继续您的工作。", + "portal.open.title": "打开现有项目", + "portal.welcome.continue": "继续上一课", + "portal.welcome.demoHint": "新来的?加载带有大纲和手稿的简短示例故事来探索该应用程序。", + "portal.welcome.newProject": "开始一个新项目", + "portal.welcome.openProject": "开放项目", + "portal.welcome.privacyBadge": "100% 离线优先 — 您的故事保留在此设备上; API 密钥静态加密。", + "portal.welcome.subtitle": "您的人工智能写作创意合作伙伴。", + "portal.welcome.title": "欢迎来到 StoryCraft 工作室", + "portal.welcome.tryDemo": "加载演示项目" } diff --git a/locales/zh/settings.json b/locales/zh/settings.json index c6ddfbf0c..073f687f1 100644 --- a/locales/zh/settings.json +++ b/locales/zh/settings.json @@ -476,8 +476,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", diff --git a/locales/zh/sidebar.json b/locales/zh/sidebar.json index 75877665a..20477e942 100644 --- a/locales/zh/sidebar.json +++ b/locales/zh/sidebar.json @@ -1,25 +1,25 @@ { - "sidebar.mainAria": "主侧边栏", - "sidebar.primaryNavAria": "主要导航", - "sidebar.secondaryNavAria": "设置和帮助", - "sidebar.mobileNavigation": "主要观点", - "sidebar.overflowMenuAria": "更多浏览次数", - "sidebar.dashboard": "仪表板", - "sidebar.manuscript": "手稿", - "sidebar.writer": "人工智能写作工作室", - "sidebar.templates": "模板", - "sidebar.outline": "轮廓生成器", - "sidebar.characters": "人物", - "sidebar.world": "世界大厦", - "sidebar.sceneboard": "场景板", "sidebar.characterGraph": "人物图", + "sidebar.characterInterviews": "人物访谈", + "sidebar.characters": "人物", "sidebar.consistencyChecker": "一致性检查器", "sidebar.critic": "人工智能评论家", + "sidebar.dashboard": "仪表板", "sidebar.export": "出口", - "sidebar.settings": "设置", "sidebar.help": "帮助", - "sidebar.objects": "故事对象", + "sidebar.lora": "微调", + "sidebar.mainAria": "主侧边栏", + "sidebar.manuscript": "手稿", "sidebar.mindmap": "思维导图", - "sidebar.characterInterviews": "人物访谈", - "sidebar.lora": "微调" + "sidebar.mobileNavigation": "主要观点", + "sidebar.objects": "故事对象", + "sidebar.outline": "轮廓生成器", + "sidebar.overflowMenuAria": "更多浏览次数", + "sidebar.primaryNavAria": "主要导航", + "sidebar.sceneboard": "场景板", + "sidebar.secondaryNavAria": "设置和帮助", + "sidebar.settings": "设置", + "sidebar.templates": "模板", + "sidebar.world": "世界大厦", + "sidebar.writer": "人工智能写作工作室" } diff --git a/locales/zh/tags.json b/locales/zh/tags.json index 97118bba7..d18e499a8 100644 --- a/locales/zh/tags.json +++ b/locales/zh/tags.json @@ -1,20 +1,20 @@ { - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional" + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller" } diff --git a/locales/zh/tour.json b/locales/zh/tour.json index fc64815dd..f3d8a53f0 100644 --- a/locales/zh/tour.json +++ b/locales/zh/tour.json @@ -1,20 +1,20 @@ { - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour" + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings" } diff --git a/locales/zh/worlds.json b/locales/zh/worlds.json index 6844b4096..1843a6234 100644 --- a/locales/zh/worlds.json +++ b/locales/zh/worlds.json @@ -1,54 +1,54 @@ { - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name" + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds" } diff --git a/locales/zh/writer.json b/locales/zh/writer.json index a5d85f87d..c6e621e19 100644 --- a/locales/zh/writer.json +++ b/locales/zh/writer.json @@ -1,82 +1,82 @@ { - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", + "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", - "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)" } diff --git a/public/locales/ar/bundle.json b/public/locales/ar/bundle.json index fa55d80fd..c3bc3058e 100644 --- a/public/locales/ar/bundle.json +++ b/public/locales/ar/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "خطأ داخلي في قاعدة البيانات. يرجى إعادة تحميل الصفحة.", "error.db.quotaExceeded": "تخزين المتصفّح ممتلئ. يرجى حذف المشاريع أو اللقطات القديمة.", "error.db.unknown": "خطأ غير معروف أثناء الوصول إلى قاعدة البيانات.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "خطأ في استيراد الملف", "error.mic.denied": "تم رفض الوصول إلى الميكروفون. يرجى منح الإذن في إعدادات متصفّحك.", "error.mic.generic": "خطأ في التعرّف على الكلام: {{error}}", @@ -550,7 +552,6 @@ "sidebar.world": "بناء العالم", "sidebar.writer": "استوديو الكتابة بالذكاء الاصطناعي", "portal.back": "رجوع", - "portal.language.searchPlaceholder": "البحث في اللغات...", "portal.demo.chapterContent": "تشبّث ضباب الصباح بالأرصفة بينما فردت ليرا خريطة المدينة القديمة. كانت دائرة باهتة تحدّد الركن الشمالي الغربي — البرج الذي لا يذكره أحد.\n\nطوت الورقة وتبعت الممر الضيق حتى ارتفعت أمامها الشبكة الحديدية. كان القفل دافئًا تحت الشمس؛ أما المعدن فظلّ باردًا.", "portal.demo.chapterTitle": "الفصل الأول — أمام البوابة", "portal.demo.logline": "عيّنة قصيرة لتجربة المخطط والمخطوطة ومساحة العمل.", @@ -568,6 +569,7 @@ "portal.features.worldbuilding.description": "Rich dossiers, atlases, AI portraits, and relationship maps.", "portal.features.worldbuilding.title": "Characters & Worlds", "portal.language.groupLabel": "لغة شاشة الترحيب", + "portal.language.searchPlaceholder": "البحث في اللغات...", "portal.new.ai.description": "قدّم فكرة بسيطة ودع الذكاء الاصطناعي يبني لك مخطط حبكة مفصّلًا.", "portal.new.ai.title": "التوليد بالذكاء الاصطناعي", "portal.new.blank.description": "لمن يعرف وجهته. ابدأ بفصل أول فارغ.", diff --git a/public/locales/de/bundle.json b/public/locales/de/bundle.json index 93cc2f565..f1c3e3ed4 100644 --- a/public/locales/de/bundle.json +++ b/public/locales/de/bundle.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama nicht erreichbar ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama nicht erreichbar ({{url}}). Stellen Sie sicher, dass Ollama läuft: ollama serve", "error.snapshotError": "Sicherungsfehler", + "error.deepLink.title": "Fehler beim Öffnen der Projektdatei", + "error.deepLink.unknown": "Unbekannter Fehler", "export.epubExport": "EPUB 3.0 exportieren", "export.section": "Abschnitt {{index}}", "header.openMenu": "Menü öffnen", diff --git a/public/locales/el/bundle.json b/public/locales/el/bundle.json index 69bbb106d..470b09cfc 100644 --- a/public/locales/el/bundle.json +++ b/public/locales/el/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "Σφάλμα εσωτερικής βάσης δεδομένων. Επαναλάβετε τη φόρτωση της σελίδας.", "error.db.quotaExceeded": "Ο χώρος αποθήκευσης του προγράμματος περιήγησης είναι πλήρης. Διαγράψτε παλιά έργα ή στιγμιότυπα.", "error.db.unknown": "Άγνωστο σφάλμα κατά την πρόσβαση στη βάση δεδομένων.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "Σφάλμα εισαγωγής αρχείου", "error.mic.denied": "Δεν επιτρέπεται η πρόσβαση στο μικρόφωνο. Παρακαλούμε χορηγήστε άδεια στις ρυθμίσεις του προγράμματος περιήγησής σας.", "error.mic.generic": "Σφάλμα αναγνώρισης ομιλίας: {{σφάλμα}}", @@ -508,340 +510,340 @@ "voice.stopListening": "Σταμάτα να ακούς", "worlds.emptyState.description": "Δημιουργήστε τα μέρη, τους κανόνες και τις ιστορίες στα οποία ζει η ιστορία σας. Ξεκινήστε με μια τοποθεσία.", "worlds.emptyState.title": "Ο κόσμος περιμένει", - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour", - "sidebar.mainAria": "Κύρια πλαϊνή μπάρα", - "sidebar.primaryNavAria": "Κύρια πλοήγηση", - "sidebar.secondaryNavAria": "Ρυθμίσεις και βοήθεια", - "sidebar.mobileNavigation": "Βασικές απόψεις", - "sidebar.overflowMenuAria": "Περισσότερες προβολές", - "sidebar.dashboard": "Ταμπλό", - "sidebar.manuscript": "Χειρόγραφο", - "sidebar.writer": "AI Writing Studio", - "sidebar.templates": "Πρότυπα", - "sidebar.outline": "Γεννήτρια περιγράμματος", - "sidebar.characters": "Χαρακτήρες", - "sidebar.world": "Παγκόσμιο Κτίριο", - "sidebar.sceneboard": "Σκηνικό Συμβούλιο", + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings", "sidebar.characterGraph": "Γράφημα χαρακτήρων", + "sidebar.characterInterviews": "Συνεντεύξεις χαρακτήρων", + "sidebar.characters": "Χαρακτήρες", "sidebar.consistencyChecker": "Έλεγχος συνέπειας", "sidebar.critic": "AI Critic", + "sidebar.dashboard": "Ταμπλό", "sidebar.export": "Εξαγωγή", - "sidebar.settings": "Ρυθμίσεις", "sidebar.help": "Βοήθεια", - "sidebar.objects": "Αντικείμενα ιστορίας", - "sidebar.mindmap": "Mind Maps", - "sidebar.characterInterviews": "Συνεντεύξεις χαρακτήρων", "sidebar.lora": "Βελτιστοποίηση", - "portal.language.groupLabel": "Γλώσσα οθόνης καλωσορίσματος", - "portal.language.searchPlaceholder": "Αναζήτηση γλωσσών...", - "portal.welcome.title": "Καλώς ήρθατε στο StoryCraft Studio", - "portal.welcome.subtitle": "Ο δημιουργικός συνεργάτης σας με τεχνητή νοημοσύνη για τη γραφή.", - "portal.welcome.newProject": "Ξεκινήστε ένα Νέο Έργο", - "portal.welcome.openProject": "Άνοιγμα έργου", - "portal.welcome.continue": "Συνέχεια τελευταίας συνεδρίας", - "portal.welcome.tryDemo": "Φόρτωση έργου επίδειξης", - "portal.welcome.demoHint": "Νέος εδώ; Φορτώστε ένα σύντομο δείγμα ιστορίας με περίγραμμα και χειρόγραφο για να εξερευνήσετε την εφαρμογή.", - "portal.welcome.privacyBadge": "100% εκτός σύνδεσης πρώτα — η ιστορία σας παραμένει σε αυτήν τη συσκευή. Τα κλειδιά API είναι κρυπτογραφημένα σε κατάσταση ηρεμίας.", - "portal.new.demo.title": "Εξερευνήστε το έργο επίδειξης", - "portal.new.demo.description": "Προσυμπληρωμένο έργο με περίγραμμα και πρώτο κεφάλαιο — ιδανικό για εκμάθηση της διεπαφής χρήστη και των εργαλείων.", - "portal.new.title": "Πώς θα θέλατε να ξεκινήσετε;", - "portal.new.description": "Επιλέξτε ένα σημείο εκκίνησης που ταιριάζει καλύτερα στη δημιουργική σας διαδικασία.", - "portal.new.template.title": "Ξεκινήστε με ένα Πρότυπο", - "portal.new.template.description": "Χρησιμοποιήστε μια κλασική δομή αφήγησης, όπως η δομή τριών πράξεων, για να καθοδηγήσετε την ιστορία σας.", - "portal.new.ai.title": "Δημιουργία με AI", - "portal.new.ai.description": "Δώστε μια απλή ιδέα και αφήστε το AI μας να δημιουργήσει ένα λεπτομερές περίγραμμα πλοκής για εσάς.", - "portal.new.blank.title": "Ξεκινήστε με ένα κενό χειρόγραφο", - "portal.new.blank.description": "Για όσους ξέρουν πού πάνε. Ξεκινήστε με ένα κενό πρώτο κεφάλαιο.", - "portal.demo.title": "Επίδειξη: Ο σφραγισμένος πύργος", + "sidebar.mainAria": "Κύρια πλαϊνή μπάρα", + "sidebar.manuscript": "Χειρόγραφο", + "sidebar.mindmap": "Mind Maps", + "sidebar.mobileNavigation": "Βασικές απόψεις", + "sidebar.objects": "Αντικείμενα ιστορίας", + "sidebar.outline": "Γεννήτρια περιγράμματος", + "sidebar.overflowMenuAria": "Περισσότερες προβολές", + "sidebar.primaryNavAria": "Κύρια πλοήγηση", + "sidebar.sceneboard": "Σκηνικό Συμβούλιο", + "sidebar.secondaryNavAria": "Ρυθμίσεις και βοήθεια", + "sidebar.settings": "Ρυθμίσεις", + "sidebar.templates": "Πρότυπα", + "sidebar.world": "Παγκόσμιο Κτίριο", + "sidebar.writer": "AI Writing Studio", + "portal.back": "Πίσω", + "portal.demo.chapterContent": "Η πρωινή ομίχλη κόλλησε στις αποβάθρες καθώς η Lyra ξετύλιξε τον παλιό χάρτη της πόλης. Ένας αμυδρός κύκλος σημάδεψε τη βορειοδυτική γωνία - τον πύργο που κανείς δεν ανέφερε.\n\nΤράβηξε το χαρτί και ακολούθησε το στενό μονοπάτι μέχρι που το σιδερένιο πλέγμα σηκώθηκε μπροστά της. Το λουκέτο ήταν ζεστό στον ήλιο. το μέταλλο είναι ακόμα κρύο.", + "portal.demo.chapterTitle": "Κεφάλαιο 1 — Πριν από την Πύλη", "portal.demo.logline": "Ένα σύντομο δείγμα για να δοκιμάσετε το περίγραμμα, το χειρόγραφο και τον χώρο εργασίας.", - "portal.demo.outline1Title": "Ανοιγμα", "portal.demo.outline1Desc": "Η πόλη του ποταμού? ο πρωταγωνιστής ανακαλύπτει έναν απαγορευμένο πύργο.", - "portal.demo.outline2Title": "Σύγκρουση", + "portal.demo.outline1Title": "Ανοιγμα", "portal.demo.outline2Desc": "Η σφραγίδα σπάει. απόφαση με συνέπειες.", - "portal.demo.chapterTitle": "Κεφάλαιο 1 — Πριν από την Πύλη", - "portal.demo.chapterContent": "Η πρωινή ομίχλη κόλλησε στις αποβάθρες καθώς η Lyra ξετύλιξε τον παλιό χάρτη της πόλης. Ένας αμυδρός κύκλος σημάδεψε τη βορειοδυτική γωνία - τον πύργο που κανείς δεν ανέφερε.\n\nΤράβηξε το χαρτί και ακολούθησε το στενό μονοπάτι μέχρι που το σιδερένιο πλέγμα σηκώθηκε μπροστά της. Το λουκέτο ήταν ζεστό στον ήλιο. το μέταλλο είναι ακόμα κρύο.", - "portal.open.title": "Ανοίξτε ένα υπάρχον έργο", - "portal.open.description": "Φορτώστε ένα προηγουμένως αποθηκευμένο έργο από ένα αρχείο αντιγράφου ασφαλείας (.json) για να συνεχίσετε την εργασία σας.", - "portal.open.button": "Εισαγωγή αρχείου έργου", - "portal.back": "Πίσω", - "portal.features.ai.title": "AI Co-Pilot", + "portal.demo.outline2Title": "Σύγκρουση", + "portal.demo.title": "Επίδειξη: Ο σφραγισμένος πύργος", "portal.features.ai.description": "Σχεδίαση, καταιγισμός ιδεών και διάβαση μπλοκ με σύννεφο ή πλήρως τοπικά μοντέλα.", - "portal.features.plot.title": "Visual Plot Board", + "portal.features.ai.title": "AI Co-Pilot", + "portal.features.export.description": "Μεταγλώττιση σε DOCX, PDF, EPUB και Markdown — εντελώς εκτός σύνδεσης.", + "portal.features.export.title": "Pro Export", "portal.features.plot.description": "Σχεδιάστε τη δομή σε καμβά με καμπύλες τάσης και φύλλα κτυπήματος.", - "portal.features.worldbuilding.title": "Χαρακτήρες & κόσμοι", + "portal.features.plot.title": "Visual Plot Board", "portal.features.worldbuilding.description": "Πλούσιοι φάκελοι, άτλαντες, πορτρέτα τεχνητής νοημοσύνης και χάρτες σχέσεων.", - "portal.features.export.title": "Pro Export", - "portal.features.export.description": "Μεταγλώττιση σε DOCX, PDF, EPUB και Markdown — εντελώς εκτός σύνδεσης.", - "initialProject.title": "Η ιστορία μου χωρίς τίτλο", - "initialProject.logline": "Ένα ταξίδι χιλίων μιλίων ξεκινά με ένα μόνο βήμα...", - "initialProject.chapter1": "Κεφάλαιο 1", - "dashboard.greeting": "Καλώς ήρθατε πίσω στο", - "dashboard.noLogline": "Δεν υπάρχει σύνδεση ακόμα. Προσθέστε ένα στον επιθεωρητή χειρογράφων!", - "dashboard.continueWriting.title": "Συνεχίστε να γράφετε", - "dashboard.continueWriting.button": "Μετάβαση πίσω", - "dashboard.continueWriting.empty": "Ξεκινήστε την ιστορία σας στην προβολή χειρόγραφου.", - "dashboard.goals.title": "Στόχοι Έργου", - "dashboard.goals.wordCount": "Καταμέτρηση λέξεων", - "dashboard.goals.deadline": "Διορία", - "dashboard.goals.noDeadline": "Δεν έχει οριστεί προθεσμία", - "dashboard.goals.daysLeft": "Απομένουν {{count}} ημέρες", - "dashboard.goals.dayLeft": "1 ημέρα έμεινε", - "dashboard.goals.noDaysLeft": "Προθεσμία σήμερα", - "dashboard.goals.overdue": "Εκπρόθεσμος", - "dashboard.goals.setGoal": "Θέστε στόχο", - "dashboard.goals.editGoal": "Επεξεργασία στόχου", - "dashboard.goals.modal.title": "Θέστε Στόχους Έργου", - "dashboard.goals.modal.wordCountLabel": "Στόχος πλήθους λέξεων", - "dashboard.goals.modal.deadlineLabel": "Προθεσμία στόχου (Προαιρετικό)", - "dashboard.goals.modal.save": "Αποθήκευση στόχων", - "dashboard.goals.wordsRemaining": "{{count}} λέξεις απομένουν", - "dashboard.goals.pace.title": "Βήμα", - "dashboard.goals.pace.perDayUnit": "/ημέρα", - "dashboard.goals.pace.onTrack": "Σε τροχιά", - "dashboard.goals.pace.behind": "Πίσω από το ρυθμό", - "dashboard.goals.pace.done": "Ο στόχος επιτεύχθηκε", - "dashboard.goals.pace.noDeadline": "Ορίστε μια προθεσμία", - "dashboard.glance.title": "Με μια ματιά", - "dashboard.glance.recentCharacter": "Πρόσφατος χαρακτήρας", - "dashboard.glance.recentWorld": "Πρόσφατος κόσμος", - "dashboard.glance.noCharacters": "Δεν υπάρχουν ακόμη χαρακτήρες.", - "dashboard.glance.noWorlds": "Δεν υπάρχουν ακόμη κόσμοι.", - "dashboard.stats.title": "Στατιστικά έργου", - "dashboard.stats.characters": "Χαρακτήρες", - "dashboard.stats.worlds": "Κόσμοι", - "dashboard.stats.outlineSections": "Ενότητες περίγραμμα", - "dashboard.stats.totalWordCount": "Λόγια", - "dashboard.healthScore.title": "Υγεία έργου", - "dashboard.healthScore.body": "Ένας ελαφρύς συνδυασμός προόδου στόχου, βάθους εκμαγείου και κάλυψης οικοδόμησης κόσμου.", - "dashboard.healthScore.scoreLabel": "Σκορ", - "dashboard.healthScore.writing": "Πρόοδος γραφής", - "dashboard.healthScore.cast": "Βάθος χύτευσης", - "dashboard.healthScore.world": "οικοδόμηση κόσμου", - "dashboard.quickAccess.title": "Γρήγορες Ενέργειες", - "dashboard.quickAccess.manuscriptDesc": "Μεταβείτε στον επεξεργαστή χειρογράφων για να γράψετε και να οργανώσετε.", - "dashboard.quickAccess.writerDesc": "Χρησιμοποιήστε το AI Writing Studio για να ξεπεράσετε το μπλοκ του συγγραφέα.", - "dashboard.quickAccess.outlineDesc": "Δημιουργήστε μια νέα δομή γραφικής παράστασης με το περίγραμμα AI.", - "dashboard.quickAccess.charactersDesc": "Διαχειριστείτε το καστ των χαρακτήρων σας στους φακέλους.", - "dashboard.quickAccess.worldDesc": "Δημιουργήστε και εξερευνήστε τους κόσμους της ιστορίας σας.", - "dashboard.quickAccess.exportDesc": "Μορφοποιήστε και κατεβάστε το ολοκληρωμένο έργο σας.", - "dashboard.details.title": "Λεπτομέρειες ιστορίας", - "dashboard.details.projectTitle": "Τίτλος Έργου", - "dashboard.details.projectTitlePlaceholder": "Η φοβερή μου ιστορία", - "dashboard.details.logline": "Σύνδεση", - "dashboard.details.loglinePlaceholder": "Μια περίληψη μιας πρότασης της ιστορίας σας.", - "dashboard.details.aiLoglineButton": "Βοηθός σύνδεσης AI", - "dashboard.loglineModal.title": "Προτάσεις σύνδεσης AI", - "dashboard.loglineModal.loading": "Δημιουργία λαμπρών λογαριασμών σύνδεσης...", - "dashboard.onboarding.title": "Γρήγορες συμβουλές", - "dashboard.onboarding.tip1": "Χρησιμοποιήστε την πλαϊνή γραμμή για εναλλαγή μεταξύ Manuscript, Characters, Worlds και Export.", - "dashboard.onboarding.tip2": "Προσθέστε ένα κλειδί API στις Ρυθμίσεις για να ξεκλειδώσετε το cloud AI ή επιλέξτε Ollama για τοπικά μοντέλα.", - "dashboard.onboarding.tip3": "Η εργασία σας αποθηκεύεται αυτόματα σε αυτήν τη συσκευή — τα στιγμιότυπα είναι διαθέσιμα στον Έλεγχο έκδοσης.", - "dashboard.onboarding.dismiss": "Κατάλαβα", - "dashboard.onboarding.startTour": "Εκδρομή με ξεναγό", - "dashboard.authorInsights.title": "Insights για τη διοχέτευση του συγγραφέα", + "portal.features.worldbuilding.title": "Χαρακτήρες & κόσμοι", + "portal.language.groupLabel": "Γλώσσα οθόνης καλωσορίσματος", + "portal.language.searchPlaceholder": "Αναζήτηση γλωσσών...", + "portal.new.ai.description": "Δώστε μια απλή ιδέα και αφήστε το AI μας να δημιουργήσει ένα λεπτομερές περίγραμμα πλοκής για εσάς.", + "portal.new.ai.title": "Δημιουργία με AI", + "portal.new.blank.description": "Για όσους ξέρουν πού πάνε. Ξεκινήστε με ένα κενό πρώτο κεφάλαιο.", + "portal.new.blank.title": "Ξεκινήστε με ένα κενό χειρόγραφο", + "portal.new.demo.description": "Προσυμπληρωμένο έργο με περίγραμμα και πρώτο κεφάλαιο — ιδανικό για εκμάθηση της διεπαφής χρήστη και των εργαλείων.", + "portal.new.demo.title": "Εξερευνήστε το έργο επίδειξης", + "portal.new.description": "Επιλέξτε ένα σημείο εκκίνησης που ταιριάζει καλύτερα στη δημιουργική σας διαδικασία.", + "portal.new.template.description": "Χρησιμοποιήστε μια κλασική δομή αφήγησης, όπως η δομή τριών πράξεων, για να καθοδηγήσετε την ιστορία σας.", + "portal.new.template.title": "Ξεκινήστε με ένα Πρότυπο", + "portal.new.title": "Πώς θα θέλατε να ξεκινήσετε;", + "portal.open.button": "Εισαγωγή αρχείου έργου", + "portal.open.description": "Φορτώστε ένα προηγουμένως αποθηκευμένο έργο από ένα αρχείο αντιγράφου ασφαλείας (.json) για να συνεχίσετε την εργασία σας.", + "portal.open.title": "Ανοίξτε ένα υπάρχον έργο", + "portal.welcome.continue": "Συνέχεια τελευταίας συνεδρίας", + "portal.welcome.demoHint": "Νέος εδώ; Φορτώστε ένα σύντομο δείγμα ιστορίας με περίγραμμα και χειρόγραφο για να εξερευνήσετε την εφαρμογή.", + "portal.welcome.newProject": "Ξεκινήστε ένα Νέο Έργο", + "portal.welcome.openProject": "Άνοιγμα έργου", + "portal.welcome.privacyBadge": "100% εκτός σύνδεσης πρώτα — η ιστορία σας παραμένει σε αυτήν τη συσκευή. Τα κλειδιά API είναι κρυπτογραφημένα σε κατάσταση ηρεμίας.", + "portal.welcome.subtitle": "Ο δημιουργικός συνεργάτης σας με τεχνητή νοημοσύνη για τη γραφή.", + "portal.welcome.title": "Καλώς ήρθατε στο StoryCraft Studio", + "portal.welcome.tryDemo": "Φόρτωση έργου επίδειξης", "dashboard.authorInsights.readability": "Αναγνωσιμότητα (Flesch-style, EN ευρετικό)", - "dashboard.authorInsights.readabilityNeedMore": "Γράψτε λίγο περισσότερο — η αναγνωσιμότητα χρειάζεται ~40+ λέξεις για μια σταθερή βαθμολογία.", "dashboard.authorInsights.readabilityFootnote": "Οι υψηλότερες βαθμολογίες συνήθως σημαίνουν ευκολότερη ανάγνωση. συντονιστείτε για το είδος σας σκόπιμα.", + "dashboard.authorInsights.readabilityNeedMore": "Γράψτε λίγο περισσότερο — η αναγνωσιμότητα χρειάζεται ~40+ λέξεις για μια σταθερή βαθμολογία.", "dashboard.authorInsights.timeline": "Έλεγχοι χρονοδιαγράμματος σκηνής", "dashboard.authorInsights.timelineClear": "Δεν υπάρχουν προειδοποιήσεις για το χρονοδιάγραμμα από τα μεταδεδομένα σκηνής.", "dashboard.authorInsights.timelineWarnBadge": "{{count}} προειδοποιήσεις — βελτιώστε τις ημερομηνίες/διάρκειες των σκηνών στον πίνακα σκηνής.", - "dashboard.backup.title": "Backup & restore", - "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", + "dashboard.authorInsights.title": "Insights για τη διοχέτευση του συγγραφέα", "dashboard.backup.exportJson": "Export JSON", + "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", "dashboard.backup.importJson": "Import JSON", - "dashboard.backup.openSettings": "Backup settings", "dashboard.backup.latestSnapshot": "Latest snapshot: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Backup settings", + "dashboard.backup.title": "Backup & restore", "dashboard.backup.unnamedSnapshot": "Unnamed snapshot", + "dashboard.composition.avgPerScene": "Μέσος / σκηνή", + "dashboard.composition.empty": "Προσθέστε σκηνές στο Χειρόγραφο για να δείτε τη σύνθεσή του.", + "dashboard.composition.readingTime": "Ώρα ανάγνωσης", + "dashboard.composition.readingTimeValue": "{{count}} λεπτά", + "dashboard.composition.scenes": "Σκηνές", + "dashboard.composition.status.draft": "Προσχέδιο", + "dashboard.composition.status.final": "Τελικός", + "dashboard.composition.status.firstDraft": "Πρώτο σχέδιο", + "dashboard.composition.status.outline": "Περίγραμμα", + "dashboard.composition.status.revised": "Αναθεωρημένο", + "dashboard.composition.status.untracked": "Χωρίς παρακολούθηση", + "dashboard.composition.title": "Σύνθεση χειρογράφου", + "dashboard.continueWriting.button": "Μετάβαση πίσω", + "dashboard.continueWriting.empty": "Ξεκινήστε την ιστορία σας στην προβολή χειρόγραφου.", + "dashboard.continueWriting.title": "Συνεχίστε να γράφετε", + "dashboard.details.aiLoglineButton": "Βοηθός σύνδεσης AI", + "dashboard.details.logline": "Σύνδεση", + "dashboard.details.loglinePlaceholder": "Μια περίληψη μιας πρότασης της ιστορίας σας.", + "dashboard.details.projectTitle": "Τίτλος Έργου", + "dashboard.details.projectTitlePlaceholder": "Η φοβερή μου ιστορία", + "dashboard.details.title": "Λεπτομέρειες ιστορίας", + "dashboard.glance.noCharacters": "Δεν υπάρχουν ακόμη χαρακτήρες.", + "dashboard.glance.noWorlds": "Δεν υπάρχουν ακόμη κόσμοι.", + "dashboard.glance.recentCharacter": "Πρόσφατος χαρακτήρας", + "dashboard.glance.recentWorld": "Πρόσφατος κόσμος", + "dashboard.glance.title": "Με μια ματιά", + "dashboard.goals.dayLeft": "1 ημέρα έμεινε", + "dashboard.goals.daysLeft": "Απομένουν {{count}} ημέρες", + "dashboard.goals.deadline": "Διορία", + "dashboard.goals.editGoal": "Επεξεργασία στόχου", + "dashboard.goals.modal.deadlineLabel": "Προθεσμία στόχου (Προαιρετικό)", + "dashboard.goals.modal.save": "Αποθήκευση στόχων", + "dashboard.goals.modal.title": "Θέστε Στόχους Έργου", + "dashboard.goals.modal.wordCountLabel": "Στόχος πλήθους λέξεων", + "dashboard.goals.noDaysLeft": "Προθεσμία σήμερα", + "dashboard.goals.noDeadline": "Δεν έχει οριστεί προθεσμία", + "dashboard.goals.overdue": "Εκπρόθεσμος", + "dashboard.goals.pace.behind": "Πίσω από το ρυθμό", + "dashboard.goals.pace.done": "Ο στόχος επιτεύχθηκε", + "dashboard.goals.pace.noDeadline": "Ορίστε μια προθεσμία", + "dashboard.goals.pace.onTrack": "Σε τροχιά", + "dashboard.goals.pace.perDayUnit": "/ημέρα", + "dashboard.goals.pace.title": "Βήμα", + "dashboard.goals.setGoal": "Θέστε στόχο", + "dashboard.goals.title": "Στόχοι Έργου", + "dashboard.goals.wordCount": "Καταμέτρηση λέξεων", + "dashboard.goals.wordsRemaining": "{{count}} λέξεις απομένουν", + "dashboard.greeting": "Καλώς ήρθατε πίσω στο", "dashboard.header.ariaLabel": "Επισκόπηση έργου", - "dashboard.header.greetingMorning": "Καλημέρα", "dashboard.header.greetingAfternoon": "Καλημέρα", "dashboard.header.greetingEvening": "Καλησπέρα", + "dashboard.header.greetingMorning": "Καλημέρα", "dashboard.header.greetingNight": "Καίγοντας το μεταμεσονύκτιο λάδι", "dashboard.header.lastEdited": "Τελευταία επεξεργασία: {{title}}", - "dashboard.momentum.title": "Συγγραφική ορμή", + "dashboard.healthScore.body": "Ένας ελαφρύς συνδυασμός προόδου στόχου, βάθους εκμαγείου και κάλυψης οικοδόμησης κόσμου.", + "dashboard.healthScore.cast": "Βάθος χύτευσης", + "dashboard.healthScore.scoreLabel": "Σκορ", + "dashboard.healthScore.title": "Υγεία έργου", + "dashboard.healthScore.world": "οικοδόμηση κόσμου", + "dashboard.healthScore.writing": "Πρόοδος γραφής", + "dashboard.loglineModal.loading": "Δημιουργία λαμπρών λογαριασμών σύνδεσης...", + "dashboard.loglineModal.title": "Προτάσεις σύνδεσης AI", + "dashboard.momentum.activity": "Τελευταίες 14 ημέρες", "dashboard.momentum.dayStreak": "σερί ημέρας", + "dashboard.momentum.goalReached": "Ο στόχος επιτεύχθηκε", "dashboard.momentum.longest": "Καλύτερο: {{count}}", - "dashboard.momentum.today": "Σήμερα", - "dashboard.momentum.thisWeek": "Αυτή την εβδομάδα", - "dashboard.momentum.ofGoal": "{{τρέχον}} / {{στόχος}}", - "dashboard.momentum.activity": "Τελευταίες 14 ημέρες", "dashboard.momentum.noActivity": "Δεν έχει καταγραφεί ακόμα γραφή — ξεκινήστε μια συνεδρία για να δημιουργήσετε τη σειρά σας.", - "dashboard.momentum.goalReached": "Ο στόχος επιτεύχθηκε", - "dashboard.composition.title": "Σύνθεση χειρογράφου", - "dashboard.composition.scenes": "Σκηνές", - "dashboard.composition.avgPerScene": "Μέσος / σκηνή", - "dashboard.composition.readingTime": "Ώρα ανάγνωσης", - "dashboard.composition.readingTimeValue": "{{count}} λεπτά", - "dashboard.composition.empty": "Προσθέστε σκηνές στο Χειρόγραφο για να δείτε τη σύνθεσή του.", - "dashboard.composition.status.outline": "Περίγραμμα", - "dashboard.composition.status.draft": "Προσχέδιο", - "dashboard.composition.status.firstDraft": "Πρώτο σχέδιο", - "dashboard.composition.status.revised": "Αναθεωρημένο", - "dashboard.composition.status.final": "Τελικός", - "dashboard.composition.status.untracked": "Χωρίς παρακολούθηση", - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", + "dashboard.momentum.ofGoal": "{{τρέχον}} / {{στόχος}}", + "dashboard.momentum.thisWeek": "Αυτή την εβδομάδα", + "dashboard.momentum.title": "Συγγραφική ορμή", + "dashboard.momentum.today": "Σήμερα", + "dashboard.noLogline": "Δεν υπάρχει σύνδεση ακόμα. Προσθέστε ένα στον επιθεωρητή χειρογράφων!", + "dashboard.onboarding.dismiss": "Κατάλαβα", + "dashboard.onboarding.startTour": "Εκδρομή με ξεναγό", + "dashboard.onboarding.tip1": "Χρησιμοποιήστε την πλαϊνή γραμμή για εναλλαγή μεταξύ Manuscript, Characters, Worlds και Export.", + "dashboard.onboarding.tip2": "Προσθέστε ένα κλειδί API στις Ρυθμίσεις για να ξεκλειδώσετε το cloud AI ή επιλέξτε Ollama για τοπικά μοντέλα.", + "dashboard.onboarding.tip3": "Η εργασία σας αποθηκεύεται αυτόματα σε αυτήν τη συσκευή — τα στιγμιότυπα είναι διαθέσιμα στον Έλεγχο έκδοσης.", + "dashboard.onboarding.title": "Γρήγορες συμβουλές", + "dashboard.quickAccess.charactersDesc": "Διαχειριστείτε το καστ των χαρακτήρων σας στους φακέλους.", + "dashboard.quickAccess.exportDesc": "Μορφοποιήστε και κατεβάστε το ολοκληρωμένο έργο σας.", + "dashboard.quickAccess.manuscriptDesc": "Μεταβείτε στον επεξεργαστή χειρογράφων για να γράψετε και να οργανώσετε.", + "dashboard.quickAccess.outlineDesc": "Δημιουργήστε μια νέα δομή γραφικής παράστασης με το περίγραμμα AI.", + "dashboard.quickAccess.title": "Γρήγορες Ενέργειες", + "dashboard.quickAccess.worldDesc": "Δημιουργήστε και εξερευνήστε τους κόσμους της ιστορίας σας.", + "dashboard.quickAccess.writerDesc": "Χρησιμοποιήστε το AI Writing Studio για να ξεπεράσετε το μπλοκ του συγγραφέα.", + "dashboard.stats.characters": "Χαρακτήρες", + "dashboard.stats.outlineSections": "Ενότητες περίγραμμα", + "dashboard.stats.title": "Στατιστικά έργου", + "dashboard.stats.totalWordCount": "Λόγια", + "dashboard.stats.worlds": "Κόσμοι", + "initialProject.chapter1": "Κεφάλαιο 1", + "initialProject.logline": "Ένα ταξίδι χιλίων μιλίων ξεκινά με ένα μόνο βήμα...", + "initialProject.title": "Η ιστορία μου χωρίς τίτλο", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss", - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", - "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", - "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", + "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", + "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)", "templates.adventure.arc": "Journey, obstacles, triumph.", "templates.adventure.description": "Danger, discovery, courage.", @@ -1049,283 +1051,283 @@ "templates.title": "Template Library", "templates.types.Genre": "Genre", "templates.types.Structure": "Structure", - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional", - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", "outline.selectSection": "Select section '{{title}}'", - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "outline.title": "AI Story Outline Generator", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name", - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name", - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.pasteSection.expand": "Paste text", "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds", "settings.about.description": "Your AI-powered creative partner for writing.", "settings.about.githubDescription": "View source code, report issues, and contribute.", "settings.about.githubLabel": "Open-source on GitHub", @@ -1793,8 +1795,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", @@ -2131,212 +2133,212 @@ "help.writing.templates.title": "Working with Templates", "help.writing.writer.content": "

AI Writing Studio Workflow

The AI Writing Studio is your dedicated space for AI-assisted drafting, editing, and brainstorming. The workflow is designed so AI assistance always flows through a scratchpad — you stay in control before anything touches your manuscript.

  1. Select a section: Use the section dropdown at the top of the Writer panel to pick which manuscript chapter you are working on. The editor scrolls to that section automatically.
  2. Pick a tool: Choose from Continue Writing, Improve Text, Change Tone, Generate Dialogue, Brainstorm, Summarize, or Critic. Each tool has a different purpose — hover any tool icon for a one-line description.
  3. Enable RAG context (optional): Toggle Use RAG context in the toolbar to have the AI draw on relevant passages from your manuscript before generating. This produces more consistent, story-aware output. The chunk badge shows how many passages were retrieved.
  4. Generate: Click the Generate button. Progress is shown in the scratchpad; streaming output appears token by token so you can stop early if the direction is wrong.
  5. Edit the scratchpad: The generated text lands in the editable scratchpad below the tools. Refine it directly — fix names, change phrasing, trim length — before accepting.
  6. Insert or Replace: Click Insert at cursor to add the scratchpad text after your current cursor position, or Replace selection to swap out the highlighted text you started with.

Hybrid fallback chains (Settings → Advanced AI → Hybrid fallback) retry additional providers automatically if the primary returns a rate-limit or network error.

", "help.writing.writer.title": "AI Writing Studio workflow", - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", - "objects.typeLabel.artifact": "Artifact", - "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", - "objects.typeLabel.other": "Other", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", "objects.save": "Save", - "objects.cancel": "Cancel", "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", + "objects.typeLabel.artifact": "Artifact", + "objects.typeLabel.document": "Document", + "objects.typeLabel.other": "Other", + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects", - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel", - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel", - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/public/locales/en/bundle.json b/public/locales/en/bundle.json index 6035a6a18..913dd37f0 100644 --- a/public/locales/en/bundle.json +++ b/public/locales/en/bundle.json @@ -57,6 +57,8 @@ "critic.noResults": "No analysis results yet.", "error.fileImportError": "File Import Error", "error.snapshotError": "Snapshot Error", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "palette.placeholder": "Type a command or search...", "palette.noResults": "No results found.", "palette.category.navigation": "Navigation", diff --git a/public/locales/es/bundle.json b/public/locales/es/bundle.json index 531867e3b..1c2c9e20a 100644 --- a/public/locales/es/bundle.json +++ b/public/locales/es/bundle.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama no accesible ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama no accesible ({{url}}). Asegúrate de que Ollama está en ejecución: ollama serve", "error.snapshotError": "Error de instantánea", + "error.deepLink.title": "Error al abrir el archivo del proyecto", + "error.deepLink.unknown": "Error desconocido", "export.epubExport": "Exportar EPUB 3.0", "export.section": "Sección {{index}}", "header.openMenu": "Abrir menú", diff --git a/public/locales/fr/bundle.json b/public/locales/fr/bundle.json index 97f60fb43..6594156cd 100644 --- a/public/locales/fr/bundle.json +++ b/public/locales/fr/bundle.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama inaccessible ({{url}}) : {{message}}", "error.ollama.unreachableHint": "Ollama inaccessible ({{url}}). Assurez-vous qu'Ollama tourne : ollama serve", "error.snapshotError": "Erreur d'instantané", + "error.deepLink.title": "Échec de l'ouverture du fichier projet", + "error.deepLink.unknown": "Erreur inconnue", "export.epubExport": "Exporter EPUB 3.0", "export.section": "Section {{index}}", "header.openMenu": "Ouvrir le menu", diff --git a/public/locales/he/bundle.json b/public/locales/he/bundle.json index bfa1da896..b70a7720d 100644 --- a/public/locales/he/bundle.json +++ b/public/locales/he/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "שגיאה פנימית במסד הנתונים. אנא טענו מחדש את הדף.", "error.db.quotaExceeded": "אחסון הדפדפן מלא. אנא מחקו פרויקטים או תמונות מצב ישנים.", "error.db.unknown": "שגיאה לא ידועה בעת גישה למסד הנתונים.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "שגיאת ייבוא קובץ", "error.mic.denied": "הגישה למיקרופון נדחתה. אנא העניקו הרשאה בהגדרות הדפדפן שלכם.", "error.mic.generic": "שגיאת זיהוי דיבור: {{error}}", @@ -550,7 +552,6 @@ "sidebar.world": "בניית עולם", "sidebar.writer": "סטודיו כתיבה עם AI", "portal.back": "חזרה", - "portal.language.searchPlaceholder": "חיפוש שפות...", "portal.demo.chapterContent": "ערפל הבוקר נצמד לרציפים בעוד לירה פורשת את מפת העיר הישנה. עיגול דהוי סימן את הפינה הצפון‑מערבית — המגדל שאיש אינו מזכיר.\n\nהיא קיפלה את הנייר ופנתה אל השביל הצר, עד שסבך הברזל התרומם מולה. המנעול היה חמים בשמש; המתכת עוד קרה.", "portal.demo.chapterTitle": "פרק 1 — לפני השער", "portal.demo.logline": "דוגמה קצרה להתנסות במתווה, בכתב היד ובסביבת העבודה.", @@ -568,6 +569,7 @@ "portal.features.worldbuilding.description": "Rich dossiers, atlases, AI portraits, and relationship maps.", "portal.features.worldbuilding.title": "Characters & Worlds", "portal.language.groupLabel": "שפת מסך הפתיחה", + "portal.language.searchPlaceholder": "חיפוש שפות...", "portal.new.ai.description": "ספקו רעיון פשוט ותנו ל‑AI לבנות עבורכם מתווה עלילה מפורט.", "portal.new.ai.title": "יצירה באמצעות AI", "portal.new.blank.description": "למי שיודע לאן מועדות פניו. התחילו בפרק ראשון ריק.", diff --git a/public/locales/it/bundle.json b/public/locales/it/bundle.json index 02faff0f4..9426159a6 100644 --- a/public/locales/it/bundle.json +++ b/public/locales/it/bundle.json @@ -158,6 +158,8 @@ "error.ollama.unreachable": "Ollama non raggiungibile ({{url}}): {{message}}", "error.ollama.unreachableHint": "Ollama non raggiungibile ({{url}}). Assicurati che Ollama sia in esecuzione: ollama serve", "error.snapshotError": "Errore snapshot", + "error.deepLink.title": "Impossibile aprire il file del progetto", + "error.deepLink.unknown": "Errore sconosciuto", "export.epubExport": "Esporta EPUB 3.0", "export.section": "Sezione {{index}}", "header.openMenu": "Apri menu", diff --git a/public/locales/ja/bundle.json b/public/locales/ja/bundle.json index 566ef8033..77486979d 100644 --- a/public/locales/ja/bundle.json +++ b/public/locales/ja/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "内部データベースエラー。ページをリロードしてください。", "error.db.quotaExceeded": "ブラウザのストレージがいっぱいです。古いプロジェクトまたはスナップショットを削除してください。", "error.db.unknown": "データベースへのアクセス中に不明なエラーが発生しました。", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "ファイルインポートエラー", "error.mic.denied": "マイクへのアクセスが拒否されました。ブラウザの設定で許可を与えてください。", "error.mic.generic": "音声認識エラー: {{error}}", @@ -508,340 +510,340 @@ "voice.stopListening": "聞くのをやめる", "worlds.emptyState.description": "あなたの物語が生きる場所、ルール、歴史を構築します。場所から始めます。", "worlds.emptyState.title": "世界が待っています", - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour", - "sidebar.mainAria": "メインサイドバー", - "sidebar.primaryNavAria": "プライマリナビゲーション", - "sidebar.secondaryNavAria": "設定とヘルプ", - "sidebar.mobileNavigation": "主なビュー", - "sidebar.overflowMenuAria": "さらに見る", - "sidebar.dashboard": "ダッシュボード", - "sidebar.manuscript": "原稿", - "sidebar.writer": "AIライティングスタジオ", - "sidebar.templates": "テンプレート", - "sidebar.outline": "アウトラインジェネレーター", - "sidebar.characters": "キャラクター", - "sidebar.world": "世界の建物", - "sidebar.sceneboard": "シーンボード", + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings", "sidebar.characterGraph": "キャラクターグラフ", + "sidebar.characterInterviews": "キャラクターインタビュー", + "sidebar.characters": "キャラクター", "sidebar.consistencyChecker": "整合性チェッカー", "sidebar.critic": "AI評論家", + "sidebar.dashboard": "ダッシュボード", "sidebar.export": "輸出", - "sidebar.settings": "設定", "sidebar.help": "ヘルプ", - "sidebar.objects": "ストーリーオブジェクト", - "sidebar.mindmap": "マインドマップ", - "sidebar.characterInterviews": "キャラクターインタビュー", "sidebar.lora": "微調整", - "portal.language.groupLabel": "ようこそ画面の言語", - "portal.language.searchPlaceholder": "言語を検索...", - "portal.welcome.title": "ストーリークラフト スタジオへようこそ", - "portal.welcome.subtitle": "AI を活用したライティングのためのクリエイティブ パートナー。", - "portal.welcome.newProject": "新しいプロジェクトを開始する", - "portal.welcome.openProject": "プロジェクトを開く", - "portal.welcome.continue": "最後のセッションを続行", - "portal.welcome.tryDemo": "デモプロジェクトをロードする", - "portal.welcome.demoHint": "ここは新しいですか?概要と原稿を含む短いサンプル ストーリーをロードして、アプリを探索します。", - "portal.welcome.privacyBadge": "100% オフラインファースト — ストーリーはこのデバイス上に残ります。 API キーは保存時に暗号化されます。", - "portal.new.demo.title": "デモプロジェクトを探索する", - "portal.new.demo.description": "概要と最初の章があらかじめ入力されたプロジェクト - UI とツールの学習に最適です。", - "portal.new.title": "どのように始めたいですか?", - "portal.new.description": "あなたの創造的なプロセスに最も適した開始点を選択してください。", - "portal.new.template.title": "テンプレートから始める", - "portal.new.template.description": "3 幕構造などの古典的な物語構造を使用して、ストーリーをガイドします。", - "portal.new.ai.title": "AIで生成", - "portal.new.ai.description": "シンプルなアイデアを提供すると、AI が詳細なプロットのアウトラインを作成します。", - "portal.new.blank.title": "白紙の原稿から始める", - "portal.new.blank.description": "どこへ行くのか分かっている人向け。空の最初の章から始めます。", - "portal.demo.title": "デモ: 封印の塔", + "sidebar.mainAria": "メインサイドバー", + "sidebar.manuscript": "原稿", + "sidebar.mindmap": "マインドマップ", + "sidebar.mobileNavigation": "主なビュー", + "sidebar.objects": "ストーリーオブジェクト", + "sidebar.outline": "アウトラインジェネレーター", + "sidebar.overflowMenuAria": "さらに見る", + "sidebar.primaryNavAria": "プライマリナビゲーション", + "sidebar.sceneboard": "シーンボード", + "sidebar.secondaryNavAria": "設定とヘルプ", + "sidebar.settings": "設定", + "sidebar.templates": "テンプレート", + "sidebar.world": "世界の建物", + "sidebar.writer": "AIライティングスタジオ", + "portal.back": "戻る", + "portal.demo.chapterContent": "ライラが古い都市の地図を広げている間、朝霧が岸壁に張り付いていました。かすかな円が北西の角を示していました - 誰も言及しなかった塔です。\n\n彼女は紙をしまい込み、鉄の格子が目の前に現れるまで細い道を進みました。南京錠は太陽の下で暖かかった。金属はまだ冷たい。", + "portal.demo.chapterTitle": "第 1 章 — 門の前", "portal.demo.logline": "アウトライン、原稿、ワークスペースを試すための短いサンプルです。", - "portal.demo.outline1Title": "オープニング", "portal.demo.outline1Desc": "川沿いの町。主人公は禁断の塔を発見する。", - "portal.demo.outline2Title": "対立", + "portal.demo.outline1Title": "オープニング", "portal.demo.outline2Desc": "封印が解ける。結果を伴う決断。", - "portal.demo.chapterTitle": "第 1 章 — 門の前", - "portal.demo.chapterContent": "ライラが古い都市の地図を広げている間、朝霧が岸壁に張り付いていました。かすかな円が北西の角を示していました - 誰も言及しなかった塔です。\n\n彼女は紙をしまい込み、鉄の格子が目の前に現れるまで細い道を進みました。南京錠は太陽の下で暖かかった。金属はまだ冷たい。", - "portal.open.title": "既存のプロジェクトを開く", - "portal.open.description": "以前に保存したプロジェクトをバックアップ ファイル (.json) からロードして、作業を続行します。", - "portal.open.button": "プロジェクトファイルのインポート", - "portal.back": "戻る", - "portal.features.ai.title": "AI 副操縦士", + "portal.demo.outline2Title": "対立", + "portal.demo.title": "デモ: 封印の塔", "portal.features.ai.description": "クラウドまたは完全にローカルのモデルを使用して、草案を作成し、ブレインストーミングし、ブロックを突破します。", - "portal.features.plot.title": "ビジュアルプロットボード", + "portal.features.ai.title": "AI 副操縦士", + "portal.features.export.description": "完全にオフラインで DOCX、PDF、EPUB、Markdown にコンパイルします。", + "portal.features.export.title": "プロエクスポート", "portal.features.plot.description": "テンションカーブとビートシートを使用してキャンバス上で構造を計画します。", - "portal.features.worldbuilding.title": "キャラクターと世界", + "portal.features.plot.title": "ビジュアルプロットボード", "portal.features.worldbuilding.description": "豊富な書類、アトラス、AI ポートレート、関係マップ。", - "portal.features.export.title": "プロエクスポート", - "portal.features.export.description": "完全にオフラインで DOCX、PDF、EPUB、Markdown にコンパイルします。", - "initialProject.title": "私の題名のない物語", - "initialProject.logline": "千里の道も一歩から始まる…", - "initialProject.chapter1": "第1章", - "dashboard.greeting": "おかえりなさい", - "dashboard.noLogline": "ログラインはまだありません。原稿検査官に 1 つ追加してください。", - "dashboard.continueWriting.title": "書き続ける", - "dashboard.continueWriting.button": "ジャンプバックイン", - "dashboard.continueWriting.empty": "原稿ビューでストーリーを開始します。", - "dashboard.goals.title": "プロジェクトの目標", - "dashboard.goals.wordCount": "単語数", - "dashboard.goals.deadline": "締め切り", - "dashboard.goals.noDeadline": "期限は設定されていません", - "dashboard.goals.daysLeft": "残り {{count}} 日", - "dashboard.goals.dayLeft": "残り1日", - "dashboard.goals.noDaysLeft": "本日締め切り", - "dashboard.goals.overdue": "期限を過ぎました", - "dashboard.goals.setGoal": "目標を設定する", - "dashboard.goals.editGoal": "目標の編集", - "dashboard.goals.modal.title": "プロジェクトの目標を設定する", - "dashboard.goals.modal.wordCountLabel": "目標単語数", - "dashboard.goals.modal.deadlineLabel": "目標期限 (オプション)", - "dashboard.goals.modal.save": "目標を保存する", - "dashboard.goals.wordsRemaining": "あと {{count}} 語", - "dashboard.goals.pace.title": "ペース", - "dashboard.goals.pace.perDayUnit": "/日", - "dashboard.goals.pace.onTrack": "順調に進んでいます", - "dashboard.goals.pace.behind": "ペースが遅れている", - "dashboard.goals.pace.done": "目標達成", - "dashboard.goals.pace.noDeadline": "期限を設定する", - "dashboard.glance.title": "一目でわかる", - "dashboard.glance.recentCharacter": "最近のキャラクター", - "dashboard.glance.recentWorld": "最近の世界", - "dashboard.glance.noCharacters": "まだ文字がありません。", - "dashboard.glance.noWorlds": "まだワールドがありません。", - "dashboard.stats.title": "プロジェクト統計", - "dashboard.stats.characters": "キャラクター", - "dashboard.stats.worlds": "世界", - "dashboard.stats.outlineSections": "概要セクション", - "dashboard.stats.totalWordCount": "言葉", - "dashboard.healthScore.title": "プロジェクトの健全性", - "dashboard.healthScore.body": "目標の進行状況、キャストの深さ、世界構築の範囲を軽量にブレンドしています。", - "dashboard.healthScore.scoreLabel": "スコア", - "dashboard.healthScore.writing": "執筆進捗状況", - "dashboard.healthScore.cast": "鋳造深さ", - "dashboard.healthScore.world": "世界構築", - "dashboard.quickAccess.title": "クイックアクション", - "dashboard.quickAccess.manuscriptDesc": "原稿エディタにアクセスして、書いたり整理したりできます。", - "dashboard.quickAccess.writerDesc": "AI Writing Studio を使用して、ライターのブロックを克服します。", - "dashboard.quickAccess.outlineDesc": "AI アウトライナーを使用して新しいプロット構造を生成します。", - "dashboard.quickAccess.charactersDesc": "関係書類でキャラクターのキャストを管理します。", - "dashboard.quickAccess.worldDesc": "あなたの物語の世界を構築して探索しましょう。", - "dashboard.quickAccess.exportDesc": "完成したプロジェクトをフォーマットしてダウンロードします。", - "dashboard.details.title": "ストーリーの詳細", - "dashboard.details.projectTitle": "プロジェクトタイトル", - "dashboard.details.projectTitlePlaceholder": "私の素晴らしいストーリー", - "dashboard.details.logline": "ログライン", - "dashboard.details.loglinePlaceholder": "あなたのストーリーを一文で要約したもの。", - "dashboard.details.aiLoglineButton": "AIログラインアシスタント", - "dashboard.loglineModal.title": "AI ログラインの提案", - "dashboard.loglineModal.loading": "素晴らしいログラインを生成しています...", - "dashboard.onboarding.title": "簡単なヒント", - "dashboard.onboarding.tip1": "サイドバーを使用して、原稿、キャラクター、ワールド、エクスポートを切り替えます。", - "dashboard.onboarding.tip2": "[設定] に API キーを追加してクラウド AI のロックを解除するか、ローカル モデル用に Ollama を選択します。", - "dashboard.onboarding.tip3": "作業内容はこのデバイスに自動的に保存されます。スナップショットはバージョン管理で利用できます。", - "dashboard.onboarding.dismiss": "わかった", - "dashboard.onboarding.startTour": "ガイド付きツアー", - "dashboard.authorInsights.title": "著者パイプラインの洞察", + "portal.features.worldbuilding.title": "キャラクターと世界", + "portal.language.groupLabel": "ようこそ画面の言語", + "portal.language.searchPlaceholder": "言語を検索...", + "portal.new.ai.description": "シンプルなアイデアを提供すると、AI が詳細なプロットのアウトラインを作成します。", + "portal.new.ai.title": "AIで生成", + "portal.new.blank.description": "どこへ行くのか分かっている人向け。空の最初の章から始めます。", + "portal.new.blank.title": "白紙の原稿から始める", + "portal.new.demo.description": "概要と最初の章があらかじめ入力されたプロジェクト - UI とツールの学習に最適です。", + "portal.new.demo.title": "デモプロジェクトを探索する", + "portal.new.description": "あなたの創造的なプロセスに最も適した開始点を選択してください。", + "portal.new.template.description": "3 幕構造などの古典的な物語構造を使用して、ストーリーをガイドします。", + "portal.new.template.title": "テンプレートから始める", + "portal.new.title": "どのように始めたいですか?", + "portal.open.button": "プロジェクトファイルのインポート", + "portal.open.description": "以前に保存したプロジェクトをバックアップ ファイル (.json) からロードして、作業を続行します。", + "portal.open.title": "既存のプロジェクトを開く", + "portal.welcome.continue": "最後のセッションを続行", + "portal.welcome.demoHint": "ここは新しいですか?概要と原稿を含む短いサンプル ストーリーをロードして、アプリを探索します。", + "portal.welcome.newProject": "新しいプロジェクトを開始する", + "portal.welcome.openProject": "プロジェクトを開く", + "portal.welcome.privacyBadge": "100% オフラインファースト — ストーリーはこのデバイス上に残ります。 API キーは保存時に暗号化されます。", + "portal.welcome.subtitle": "AI を活用したライティングのためのクリエイティブ パートナー。", + "portal.welcome.title": "ストーリークラフト スタジオへようこそ", + "portal.welcome.tryDemo": "デモプロジェクトをロードする", "dashboard.authorInsights.readability": "可読性 (Flesch スタイル、EN ヒューリスティック)", - "dashboard.authorInsights.readabilityNeedMore": "もう少し詳しく書いてください。安定したスコアを得るには、可読性を高めるには約 40 単語以上が必要です。", "dashboard.authorInsights.readabilityFootnote": "通常、スコアが高いほど読みやすいことを意味します。意図的にジャンルに合わせて調整してください。", + "dashboard.authorInsights.readabilityNeedMore": "もう少し詳しく書いてください。安定したスコアを得るには、可読性を高めるには約 40 単語以上が必要です。", "dashboard.authorInsights.timeline": "シーンのタイムラインチェック", "dashboard.authorInsights.timelineClear": "シーンのメタデータからのタイムライン警告はありません。", "dashboard.authorInsights.timelineWarnBadge": "{{count}} 件の警告 — シーン ボードでシーンの日付/期間を調整します。", - "dashboard.backup.title": "Backup & restore", - "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", + "dashboard.authorInsights.title": "著者パイプラインの洞察", "dashboard.backup.exportJson": "Export JSON", + "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", "dashboard.backup.importJson": "Import JSON", - "dashboard.backup.openSettings": "Backup settings", "dashboard.backup.latestSnapshot": "Latest snapshot: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Backup settings", + "dashboard.backup.title": "Backup & restore", "dashboard.backup.unnamedSnapshot": "Unnamed snapshot", + "dashboard.composition.avgPerScene": "平均/シーン", + "dashboard.composition.empty": "原稿にシーンを追加して、その構成を確認します。", + "dashboard.composition.readingTime": "読書時間", + "dashboard.composition.readingTimeValue": "{{count}}分", + "dashboard.composition.scenes": "シーン", + "dashboard.composition.status.draft": "下書き", + "dashboard.composition.status.final": "ファイナル", + "dashboard.composition.status.firstDraft": "初稿", + "dashboard.composition.status.outline": "概要", + "dashboard.composition.status.revised": "改訂", + "dashboard.composition.status.untracked": "未追跡", + "dashboard.composition.title": "原稿構成", + "dashboard.continueWriting.button": "ジャンプバックイン", + "dashboard.continueWriting.empty": "原稿ビューでストーリーを開始します。", + "dashboard.continueWriting.title": "書き続ける", + "dashboard.details.aiLoglineButton": "AIログラインアシスタント", + "dashboard.details.logline": "ログライン", + "dashboard.details.loglinePlaceholder": "あなたのストーリーを一文で要約したもの。", + "dashboard.details.projectTitle": "プロジェクトタイトル", + "dashboard.details.projectTitlePlaceholder": "私の素晴らしいストーリー", + "dashboard.details.title": "ストーリーの詳細", + "dashboard.glance.noCharacters": "まだ文字がありません。", + "dashboard.glance.noWorlds": "まだワールドがありません。", + "dashboard.glance.recentCharacter": "最近のキャラクター", + "dashboard.glance.recentWorld": "最近の世界", + "dashboard.glance.title": "一目でわかる", + "dashboard.goals.dayLeft": "残り1日", + "dashboard.goals.daysLeft": "残り {{count}} 日", + "dashboard.goals.deadline": "締め切り", + "dashboard.goals.editGoal": "目標の編集", + "dashboard.goals.modal.deadlineLabel": "目標期限 (オプション)", + "dashboard.goals.modal.save": "目標を保存する", + "dashboard.goals.modal.title": "プロジェクトの目標を設定する", + "dashboard.goals.modal.wordCountLabel": "目標単語数", + "dashboard.goals.noDaysLeft": "本日締め切り", + "dashboard.goals.noDeadline": "期限は設定されていません", + "dashboard.goals.overdue": "期限を過ぎました", + "dashboard.goals.pace.behind": "ペースが遅れている", + "dashboard.goals.pace.done": "目標達成", + "dashboard.goals.pace.noDeadline": "期限を設定する", + "dashboard.goals.pace.onTrack": "順調に進んでいます", + "dashboard.goals.pace.perDayUnit": "/日", + "dashboard.goals.pace.title": "ペース", + "dashboard.goals.setGoal": "目標を設定する", + "dashboard.goals.title": "プロジェクトの目標", + "dashboard.goals.wordCount": "単語数", + "dashboard.goals.wordsRemaining": "あと {{count}} 語", + "dashboard.greeting": "おかえりなさい", "dashboard.header.ariaLabel": "プロジェクト概要", - "dashboard.header.greetingMorning": "おはよう", "dashboard.header.greetingAfternoon": "こんにちは", "dashboard.header.greetingEvening": "こんばんは", + "dashboard.header.greetingMorning": "おはよう", "dashboard.header.greetingNight": "真夜中の油を燃やす", "dashboard.header.lastEdited": "最終編集日: {{title}}", - "dashboard.momentum.title": "執筆の勢い", + "dashboard.healthScore.body": "目標の進行状況、キャストの深さ、世界構築の範囲を軽量にブレンドしています。", + "dashboard.healthScore.cast": "鋳造深さ", + "dashboard.healthScore.scoreLabel": "スコア", + "dashboard.healthScore.title": "プロジェクトの健全性", + "dashboard.healthScore.world": "世界構築", + "dashboard.healthScore.writing": "執筆進捗状況", + "dashboard.loglineModal.loading": "素晴らしいログラインを生成しています...", + "dashboard.loglineModal.title": "AI ログラインの提案", + "dashboard.momentum.activity": "過去 14 日間", "dashboard.momentum.dayStreak": "一日連続", + "dashboard.momentum.goalReached": "目標達成", "dashboard.momentum.longest": "ベスト: {{count}}", - "dashboard.momentum.today": "今日", - "dashboard.momentum.thisWeek": "今週", - "dashboard.momentum.ofGoal": "{{現在}} / {{目標}}", - "dashboard.momentum.activity": "過去 14 日間", "dashboard.momentum.noActivity": "書き込みはまだ記録されていません。セッションを開始して連続記録を築きましょう。", - "dashboard.momentum.goalReached": "目標達成", - "dashboard.composition.title": "原稿構成", - "dashboard.composition.scenes": "シーン", - "dashboard.composition.avgPerScene": "平均/シーン", - "dashboard.composition.readingTime": "読書時間", - "dashboard.composition.readingTimeValue": "{{count}}分", - "dashboard.composition.empty": "原稿にシーンを追加して、その構成を確認します。", - "dashboard.composition.status.outline": "概要", - "dashboard.composition.status.draft": "下書き", - "dashboard.composition.status.firstDraft": "初稿", - "dashboard.composition.status.revised": "改訂", - "dashboard.composition.status.final": "ファイナル", - "dashboard.composition.status.untracked": "未追跡", - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", + "dashboard.momentum.ofGoal": "{{現在}} / {{目標}}", + "dashboard.momentum.thisWeek": "今週", + "dashboard.momentum.title": "執筆の勢い", + "dashboard.momentum.today": "今日", + "dashboard.noLogline": "ログラインはまだありません。原稿検査官に 1 つ追加してください。", + "dashboard.onboarding.dismiss": "わかった", + "dashboard.onboarding.startTour": "ガイド付きツアー", + "dashboard.onboarding.tip1": "サイドバーを使用して、原稿、キャラクター、ワールド、エクスポートを切り替えます。", + "dashboard.onboarding.tip2": "[設定] に API キーを追加してクラウド AI のロックを解除するか、ローカル モデル用に Ollama を選択します。", + "dashboard.onboarding.tip3": "作業内容はこのデバイスに自動的に保存されます。スナップショットはバージョン管理で利用できます。", + "dashboard.onboarding.title": "簡単なヒント", + "dashboard.quickAccess.charactersDesc": "関係書類でキャラクターのキャストを管理します。", + "dashboard.quickAccess.exportDesc": "完成したプロジェクトをフォーマットしてダウンロードします。", + "dashboard.quickAccess.manuscriptDesc": "原稿エディタにアクセスして、書いたり整理したりできます。", + "dashboard.quickAccess.outlineDesc": "AI アウトライナーを使用して新しいプロット構造を生成します。", + "dashboard.quickAccess.title": "クイックアクション", + "dashboard.quickAccess.worldDesc": "あなたの物語の世界を構築して探索しましょう。", + "dashboard.quickAccess.writerDesc": "AI Writing Studio を使用して、ライターのブロックを克服します。", + "dashboard.stats.characters": "キャラクター", + "dashboard.stats.outlineSections": "概要セクション", + "dashboard.stats.title": "プロジェクト統計", + "dashboard.stats.totalWordCount": "言葉", + "dashboard.stats.worlds": "世界", + "initialProject.chapter1": "第1章", + "initialProject.logline": "千里の道も一歩から始まる…", + "initialProject.title": "私の題名のない物語", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss", - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", - "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", - "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", + "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", + "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)", "templates.adventure.arc": "Journey, obstacles, triumph.", "templates.adventure.description": "Danger, discovery, courage.", @@ -1049,283 +1051,283 @@ "templates.title": "Template Library", "templates.types.Genre": "Genre", "templates.types.Structure": "Structure", - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional", - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", "outline.selectSection": "Select section '{{title}}'", - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "outline.title": "AI Story Outline Generator", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name", - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name", - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.pasteSection.expand": "Paste text", "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds", "settings.about.description": "Your AI-powered creative partner for writing.", "settings.about.githubDescription": "View source code, report issues, and contribute.", "settings.about.githubLabel": "Open-source on GitHub", @@ -1793,8 +1795,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", @@ -2131,212 +2133,212 @@ "help.writing.templates.title": "Working with Templates", "help.writing.writer.content": "

AI Writing Studio Workflow

The AI Writing Studio is your dedicated space for AI-assisted drafting, editing, and brainstorming. The workflow is designed so AI assistance always flows through a scratchpad — you stay in control before anything touches your manuscript.

  1. Select a section: Use the section dropdown at the top of the Writer panel to pick which manuscript chapter you are working on. The editor scrolls to that section automatically.
  2. Pick a tool: Choose from Continue Writing, Improve Text, Change Tone, Generate Dialogue, Brainstorm, Summarize, or Critic. Each tool has a different purpose — hover any tool icon for a one-line description.
  3. Enable RAG context (optional): Toggle Use RAG context in the toolbar to have the AI draw on relevant passages from your manuscript before generating. This produces more consistent, story-aware output. The chunk badge shows how many passages were retrieved.
  4. Generate: Click the Generate button. Progress is shown in the scratchpad; streaming output appears token by token so you can stop early if the direction is wrong.
  5. Edit the scratchpad: The generated text lands in the editable scratchpad below the tools. Refine it directly — fix names, change phrasing, trim length — before accepting.
  6. Insert or Replace: Click Insert at cursor to add the scratchpad text after your current cursor position, or Replace selection to swap out the highlighted text you started with.

Hybrid fallback chains (Settings → Advanced AI → Hybrid fallback) retry additional providers automatically if the primary returns a rate-limit or network error.

", "help.writing.writer.title": "AI Writing Studio workflow", - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", - "objects.typeLabel.artifact": "Artifact", - "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", - "objects.typeLabel.other": "Other", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", "objects.save": "Save", - "objects.cancel": "Cancel", "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", + "objects.typeLabel.artifact": "Artifact", + "objects.typeLabel.document": "Document", + "objects.typeLabel.other": "Other", + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects", - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel", - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel", - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/public/locales/pt/bundle.json b/public/locales/pt/bundle.json index 5ee9740b6..de049d514 100644 --- a/public/locales/pt/bundle.json +++ b/public/locales/pt/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "Erro interno do banco de dados. Por favor, recarregue a página.", "error.db.quotaExceeded": "O armazenamento do navegador está cheio. Exclua projetos ou instantâneos antigos.", "error.db.unknown": "Erro desconhecido ao acessar o banco de dados.", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "Erro de importação de arquivo", "error.mic.denied": "Acesso ao microfone negado. Por favor, conceda permissão nas configurações do seu navegador.", "error.mic.generic": "Erro de reconhecimento de fala: {{error}}", @@ -508,340 +510,340 @@ "voice.stopListening": "Pare de ouvir", "worlds.emptyState.description": "Construa os lugares, regras e histórias em que sua história vive. Comece com um local.", "worlds.emptyState.title": "O mundo espera", - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour", - "sidebar.mainAria": "Barra lateral principal", - "sidebar.primaryNavAria": "Navegação primária", - "sidebar.secondaryNavAria": "Configurações e ajuda", - "sidebar.mobileNavigation": "Visualizações primárias", - "sidebar.overflowMenuAria": "Mais visualizações", - "sidebar.dashboard": "Painel", - "sidebar.manuscript": "Manuscrito", - "sidebar.writer": "Estúdio de redação de IA", - "sidebar.templates": "Modelos", - "sidebar.outline": "Gerador de contorno", - "sidebar.characters": "Personagens", - "sidebar.world": "Construção Mundial", - "sidebar.sceneboard": "Quadro de cena", + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings", "sidebar.characterGraph": "Gráfico de caracteres", + "sidebar.characterInterviews": "Entrevistas com personagens", + "sidebar.characters": "Personagens", "sidebar.consistencyChecker": "Verificador de consistência", "sidebar.critic": "Crítico de IA", + "sidebar.dashboard": "Painel", "sidebar.export": "Exportar", - "sidebar.settings": "Configurações", "sidebar.help": "Ajuda", - "sidebar.objects": "Objetos de história", - "sidebar.mindmap": "Mapas Mentais", - "sidebar.characterInterviews": "Entrevistas com personagens", "sidebar.lora": "Afinação", - "portal.language.groupLabel": "Idioma da tela de boas-vindas", - "portal.language.searchPlaceholder": "Pesquisar idiomas...", - "portal.welcome.title": "Bem-vindo ao StoryCraft Studio", - "portal.welcome.subtitle": "Seu parceiro criativo para escrever com tecnologia de IA.", - "portal.welcome.newProject": "Comece um novo projeto", - "portal.welcome.openProject": "Abrir projeto", - "portal.welcome.continue": "Continuar última sessão", - "portal.welcome.tryDemo": "Carregar projeto de demonstração", - "portal.welcome.demoHint": "Novo aqui? Carregue um pequeno exemplo de história com esboço e manuscrito para explorar o aplicativo.", - "portal.welcome.privacyBadge": "100% offline – sua história permanece neste dispositivo; As chaves de API são criptografadas em repouso.", - "portal.new.demo.title": "Explore o projeto de demonstração", - "portal.new.demo.description": "Projeto pré-preenchido com esboço e primeiro capítulo — ideal para aprender a interface do usuário e as ferramentas.", - "portal.new.title": "Como você gostaria de começar?", - "portal.new.description": "Escolha um ponto de partida que melhor se adapte ao seu processo criativo.", - "portal.new.template.title": "Comece com um modelo", - "portal.new.template.description": "Use uma estrutura narrativa clássica como a Estrutura de Três Atos para guiar sua história.", - "portal.new.ai.title": "Gere com IA", - "portal.new.ai.description": "Forneça uma ideia simples e deixe nossa IA construir um esboço detalhado do enredo para você.", - "portal.new.blank.title": "Comece com um manuscrito em branco", - "portal.new.blank.description": "Para quem sabe para onde vai. Comece com um primeiro capítulo vazio.", - "portal.demo.title": "Demonstração: A Torre Selada", + "sidebar.mainAria": "Barra lateral principal", + "sidebar.manuscript": "Manuscrito", + "sidebar.mindmap": "Mapas Mentais", + "sidebar.mobileNavigation": "Visualizações primárias", + "sidebar.objects": "Objetos de história", + "sidebar.outline": "Gerador de contorno", + "sidebar.overflowMenuAria": "Mais visualizações", + "sidebar.primaryNavAria": "Navegação primária", + "sidebar.sceneboard": "Quadro de cena", + "sidebar.secondaryNavAria": "Configurações e ajuda", + "sidebar.settings": "Configurações", + "sidebar.templates": "Modelos", + "sidebar.world": "Construção Mundial", + "sidebar.writer": "Estúdio de redação de IA", + "portal.back": "Voltar", + "portal.demo.chapterContent": "A névoa matinal cobria o cais enquanto Lyra desenrolava o antigo mapa da cidade. Um círculo tênue marcava o canto noroeste – a torre que ninguém mencionou.\n\nEla guardou o papel e seguiu pelo caminho estreito até que a grade de ferro se ergueu diante dela. O cadeado estava quente ao sol; o metal ainda frio.", + "portal.demo.chapterTitle": "Capítulo 1 - Antes do Portão", "portal.demo.logline": "Uma pequena amostra para testar o esboço, o manuscrito e o espaço de trabalho.", - "portal.demo.outline1Title": "Abertura", "portal.demo.outline1Desc": "A cidade ribeirinha; o protagonista descobre uma torre proibida.", - "portal.demo.outline2Title": "Conflito", + "portal.demo.outline1Title": "Abertura", "portal.demo.outline2Desc": "O selo quebra; uma decisão com consequências.", - "portal.demo.chapterTitle": "Capítulo 1 - Antes do Portão", - "portal.demo.chapterContent": "A névoa matinal cobria o cais enquanto Lyra desenrolava o antigo mapa da cidade. Um círculo tênue marcava o canto noroeste – a torre que ninguém mencionou.\n\nEla guardou o papel e seguiu pelo caminho estreito até que a grade de ferro se ergueu diante dela. O cadeado estava quente ao sol; o metal ainda frio.", - "portal.open.title": "Abra um projeto existente", - "portal.open.description": "Carregue um projeto salvo anteriormente de um arquivo de backup (.json) para continuar seu trabalho.", - "portal.open.button": "Importar arquivo de projeto", - "portal.back": "Voltar", - "portal.features.ai.title": "Copiloto de IA", + "portal.demo.outline2Title": "Conflito", + "portal.demo.title": "Demonstração: A Torre Selada", "portal.features.ai.description": "Elabore, faça brainstorming e supere blocos com modelos em nuvem ou totalmente locais.", - "portal.features.plot.title": "Quadro de plotagem visual", + "portal.features.ai.title": "Copiloto de IA", + "portal.features.export.description": "Compile em DOCX, PDF, EPUB e Markdown — totalmente offline.", + "portal.features.export.title": "Exportação profissional", "portal.features.plot.description": "Planeje a estrutura em uma tela com curvas de tensão e folhas de batida.", - "portal.features.worldbuilding.title": "Personagens e mundos", + "portal.features.plot.title": "Quadro de plotagem visual", "portal.features.worldbuilding.description": "Dossiês ricos, atlas, retratos de IA e mapas de relacionamento.", - "portal.features.export.title": "Exportação profissional", - "portal.features.export.description": "Compile em DOCX, PDF, EPUB e Markdown — totalmente offline.", - "initialProject.title": "Minha história sem título", - "initialProject.logline": "Uma jornada de mil milhas começa com um único passo...", - "initialProject.chapter1": "Capítulo 1", - "dashboard.greeting": "Bem-vindo de volta ao", - "dashboard.noLogline": "Ainda não há logline. Adicione um no inspetor de manuscritos!", - "dashboard.continueWriting.title": "Continuar escrevendo", - "dashboard.continueWriting.button": "Volte para dentro", - "dashboard.continueWriting.empty": "Comece sua história na visualização Manuscrito.", - "dashboard.goals.title": "Metas do Projeto", - "dashboard.goals.wordCount": "Contagem de palavras", - "dashboard.goals.deadline": "Prazo final", - "dashboard.goals.noDeadline": "Sem prazo definido", - "dashboard.goals.daysLeft": "{{count}} dias restantes", - "dashboard.goals.dayLeft": "Falta 1 dia", - "dashboard.goals.noDaysLeft": "Prazo hoje", - "dashboard.goals.overdue": "Atrasado", - "dashboard.goals.setGoal": "Definir meta", - "dashboard.goals.editGoal": "Editar meta", - "dashboard.goals.modal.title": "Definir metas do projeto", - "dashboard.goals.modal.wordCountLabel": "Contagem de palavras alvo", - "dashboard.goals.modal.deadlineLabel": "Prazo alvo (opcional)", - "dashboard.goals.modal.save": "Salvar metas", - "dashboard.goals.wordsRemaining": "{{count}} palavras restantes", - "dashboard.goals.pace.title": "Ritmo", - "dashboard.goals.pace.perDayUnit": "/dia", - "dashboard.goals.pace.onTrack": "No caminho certo", - "dashboard.goals.pace.behind": "Atrás do ritmo", - "dashboard.goals.pace.done": "Meta alcançada", - "dashboard.goals.pace.noDeadline": "Defina um prazo", - "dashboard.glance.title": "De relance", - "dashboard.glance.recentCharacter": "Personagem recente", - "dashboard.glance.recentWorld": "Mundo recente", - "dashboard.glance.noCharacters": "Nenhum personagem ainda.", - "dashboard.glance.noWorlds": "Ainda não há mundos.", - "dashboard.stats.title": "Estatísticas do projeto", - "dashboard.stats.characters": "Personagens", - "dashboard.stats.worlds": "Mundos", - "dashboard.stats.outlineSections": "Seções de esboço", - "dashboard.stats.totalWordCount": "Palavras", - "dashboard.healthScore.title": "Saúde do projeto", - "dashboard.healthScore.body": "Uma mistura leve de progresso de metas, profundidade de elenco e cobertura de construção de mundo.", - "dashboard.healthScore.scoreLabel": "Pontuação", - "dashboard.healthScore.writing": "Progresso da escrita", - "dashboard.healthScore.cast": "Profundidade do elenco", - "dashboard.healthScore.world": "Construção mundial", - "dashboard.quickAccess.title": "Ações rápidas", - "dashboard.quickAccess.manuscriptDesc": "Entre no editor de manuscritos para escrever e organizar.", - "dashboard.quickAccess.writerDesc": "Use o AI Writing Studio para superar o bloqueio de escritor.", - "dashboard.quickAccess.outlineDesc": "Gere uma nova estrutura de enredo com o AI Outliner.", - "dashboard.quickAccess.charactersDesc": "Gerencie seu elenco de personagens nos dossiês.", - "dashboard.quickAccess.worldDesc": "Construa e explore os mundos da sua história.", - "dashboard.quickAccess.exportDesc": "Formate e baixe seu projeto concluído.", - "dashboard.details.title": "Detalhes da história", - "dashboard.details.projectTitle": "Título do projeto", - "dashboard.details.projectTitlePlaceholder": "Minha incrível história", - "dashboard.details.logline": "Linha de registro", - "dashboard.details.loglinePlaceholder": "Um resumo de uma frase da sua história.", - "dashboard.details.aiLoglineButton": "Assistente de logline de IA", - "dashboard.loglineModal.title": "Sugestões de logline de IA", - "dashboard.loglineModal.loading": "Gerando loglines brilhantes...", - "dashboard.onboarding.title": "Dicas rápidas", - "dashboard.onboarding.tip1": "Use a barra lateral para alternar entre Manuscrito, Personagens, Mundos e Exportar.", - "dashboard.onboarding.tip2": "Adicione uma chave de API em Configurações para desbloquear a IA da nuvem ou escolha Ollama para modelos locais.", - "dashboard.onboarding.tip3": "Seu trabalho é salvo automaticamente neste dispositivo — os instantâneos estão disponíveis no Controle de versão.", - "dashboard.onboarding.dismiss": "Entendi", - "dashboard.onboarding.startTour": "Visita guiada", - "dashboard.authorInsights.title": "Insights do pipeline do autor", + "portal.features.worldbuilding.title": "Personagens e mundos", + "portal.language.groupLabel": "Idioma da tela de boas-vindas", + "portal.language.searchPlaceholder": "Pesquisar idiomas...", + "portal.new.ai.description": "Forneça uma ideia simples e deixe nossa IA construir um esboço detalhado do enredo para você.", + "portal.new.ai.title": "Gere com IA", + "portal.new.blank.description": "Para quem sabe para onde vai. Comece com um primeiro capítulo vazio.", + "portal.new.blank.title": "Comece com um manuscrito em branco", + "portal.new.demo.description": "Projeto pré-preenchido com esboço e primeiro capítulo — ideal para aprender a interface do usuário e as ferramentas.", + "portal.new.demo.title": "Explore o projeto de demonstração", + "portal.new.description": "Escolha um ponto de partida que melhor se adapte ao seu processo criativo.", + "portal.new.template.description": "Use uma estrutura narrativa clássica como a Estrutura de Três Atos para guiar sua história.", + "portal.new.template.title": "Comece com um modelo", + "portal.new.title": "Como você gostaria de começar?", + "portal.open.button": "Importar arquivo de projeto", + "portal.open.description": "Carregue um projeto salvo anteriormente de um arquivo de backup (.json) para continuar seu trabalho.", + "portal.open.title": "Abra um projeto existente", + "portal.welcome.continue": "Continuar última sessão", + "portal.welcome.demoHint": "Novo aqui? Carregue um pequeno exemplo de história com esboço e manuscrito para explorar o aplicativo.", + "portal.welcome.newProject": "Comece um novo projeto", + "portal.welcome.openProject": "Abrir projeto", + "portal.welcome.privacyBadge": "100% offline – sua história permanece neste dispositivo; As chaves de API são criptografadas em repouso.", + "portal.welcome.subtitle": "Seu parceiro criativo para escrever com tecnologia de IA.", + "portal.welcome.title": "Bem-vindo ao StoryCraft Studio", + "portal.welcome.tryDemo": "Carregar projeto de demonstração", "dashboard.authorInsights.readability": "Legibilidade (estilo Flesch, heurística EN)", - "dashboard.authorInsights.readabilityNeedMore": "Escreva um pouco mais - a legibilidade precisa de mais de 40 palavras para uma pontuação estável.", "dashboard.authorInsights.readabilityFootnote": "Pontuações mais altas geralmente significam leitura mais fácil; sintonize seu gênero intencionalmente.", + "dashboard.authorInsights.readabilityNeedMore": "Escreva um pouco mais - a legibilidade precisa de mais de 40 palavras para uma pontuação estável.", "dashboard.authorInsights.timeline": "Verificações da linha do tempo da cena", "dashboard.authorInsights.timelineClear": "Nenhum aviso de linha do tempo nos metadados da cena.", "dashboard.authorInsights.timelineWarnBadge": "{{count}} avisos — refine as datas/durações das cenas no Scene Board.", - "dashboard.backup.title": "Backup & restore", - "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", + "dashboard.authorInsights.title": "Insights do pipeline do autor", "dashboard.backup.exportJson": "Export JSON", + "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", "dashboard.backup.importJson": "Import JSON", - "dashboard.backup.openSettings": "Backup settings", "dashboard.backup.latestSnapshot": "Latest snapshot: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Backup settings", + "dashboard.backup.title": "Backup & restore", "dashboard.backup.unnamedSnapshot": "Unnamed snapshot", + "dashboard.composition.avgPerScene": "Média / cena", + "dashboard.composition.empty": "Adicione cenas no Manuscrito para ver sua composição.", + "dashboard.composition.readingTime": "Tempo de leitura", + "dashboard.composition.readingTimeValue": "{{contagem}} minutos", + "dashboard.composition.scenes": "Cenas", + "dashboard.composition.status.draft": "Rascunho", + "dashboard.composition.status.final": "Final", + "dashboard.composition.status.firstDraft": "Primeiro rascunho", + "dashboard.composition.status.outline": "Contorno", + "dashboard.composition.status.revised": "Revisado", + "dashboard.composition.status.untracked": "Não rastreado", + "dashboard.composition.title": "Composição do Manuscrito", + "dashboard.continueWriting.button": "Volte para dentro", + "dashboard.continueWriting.empty": "Comece sua história na visualização Manuscrito.", + "dashboard.continueWriting.title": "Continuar escrevendo", + "dashboard.details.aiLoglineButton": "Assistente de logline de IA", + "dashboard.details.logline": "Linha de registro", + "dashboard.details.loglinePlaceholder": "Um resumo de uma frase da sua história.", + "dashboard.details.projectTitle": "Título do projeto", + "dashboard.details.projectTitlePlaceholder": "Minha incrível história", + "dashboard.details.title": "Detalhes da história", + "dashboard.glance.noCharacters": "Nenhum personagem ainda.", + "dashboard.glance.noWorlds": "Ainda não há mundos.", + "dashboard.glance.recentCharacter": "Personagem recente", + "dashboard.glance.recentWorld": "Mundo recente", + "dashboard.glance.title": "De relance", + "dashboard.goals.dayLeft": "Falta 1 dia", + "dashboard.goals.daysLeft": "{{count}} dias restantes", + "dashboard.goals.deadline": "Prazo final", + "dashboard.goals.editGoal": "Editar meta", + "dashboard.goals.modal.deadlineLabel": "Prazo alvo (opcional)", + "dashboard.goals.modal.save": "Salvar metas", + "dashboard.goals.modal.title": "Definir metas do projeto", + "dashboard.goals.modal.wordCountLabel": "Contagem de palavras alvo", + "dashboard.goals.noDaysLeft": "Prazo hoje", + "dashboard.goals.noDeadline": "Sem prazo definido", + "dashboard.goals.overdue": "Atrasado", + "dashboard.goals.pace.behind": "Atrás do ritmo", + "dashboard.goals.pace.done": "Meta alcançada", + "dashboard.goals.pace.noDeadline": "Defina um prazo", + "dashboard.goals.pace.onTrack": "No caminho certo", + "dashboard.goals.pace.perDayUnit": "/dia", + "dashboard.goals.pace.title": "Ritmo", + "dashboard.goals.setGoal": "Definir meta", + "dashboard.goals.title": "Metas do Projeto", + "dashboard.goals.wordCount": "Contagem de palavras", + "dashboard.goals.wordsRemaining": "{{count}} palavras restantes", + "dashboard.greeting": "Bem-vindo de volta ao", "dashboard.header.ariaLabel": "Visão geral do projeto", - "dashboard.header.greetingMorning": "Bom dia", "dashboard.header.greetingAfternoon": "Boa tarde", "dashboard.header.greetingEvening": "Boa noite", + "dashboard.header.greetingMorning": "Bom dia", "dashboard.header.greetingNight": "Queimando o óleo da meia-noite", "dashboard.header.lastEdited": "Última edição: {{title}}", - "dashboard.momentum.title": "Momento de escrita", + "dashboard.healthScore.body": "Uma mistura leve de progresso de metas, profundidade de elenco e cobertura de construção de mundo.", + "dashboard.healthScore.cast": "Profundidade do elenco", + "dashboard.healthScore.scoreLabel": "Pontuação", + "dashboard.healthScore.title": "Saúde do projeto", + "dashboard.healthScore.world": "Construção mundial", + "dashboard.healthScore.writing": "Progresso da escrita", + "dashboard.loglineModal.loading": "Gerando loglines brilhantes...", + "dashboard.loglineModal.title": "Sugestões de logline de IA", + "dashboard.momentum.activity": "Últimos 14 dias", "dashboard.momentum.dayStreak": "sequência do dia", + "dashboard.momentum.goalReached": "Meta alcançada", "dashboard.momentum.longest": "Melhor: {{contagem}}", - "dashboard.momentum.today": "Hoje", - "dashboard.momentum.thisWeek": "Essa semana", - "dashboard.momentum.ofGoal": "{{atual}} / {{meta}}", - "dashboard.momentum.activity": "Últimos 14 dias", "dashboard.momentum.noActivity": "Nenhuma escrita registrada ainda – inicie uma sessão para construir sua seqüência.", - "dashboard.momentum.goalReached": "Meta alcançada", - "dashboard.composition.title": "Composição do Manuscrito", - "dashboard.composition.scenes": "Cenas", - "dashboard.composition.avgPerScene": "Média / cena", - "dashboard.composition.readingTime": "Tempo de leitura", - "dashboard.composition.readingTimeValue": "{{contagem}} minutos", - "dashboard.composition.empty": "Adicione cenas no Manuscrito para ver sua composição.", - "dashboard.composition.status.outline": "Contorno", - "dashboard.composition.status.draft": "Rascunho", - "dashboard.composition.status.firstDraft": "Primeiro rascunho", - "dashboard.composition.status.revised": "Revisado", - "dashboard.composition.status.final": "Final", - "dashboard.composition.status.untracked": "Não rastreado", - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", + "dashboard.momentum.ofGoal": "{{atual}} / {{meta}}", + "dashboard.momentum.thisWeek": "Essa semana", + "dashboard.momentum.title": "Momento de escrita", + "dashboard.momentum.today": "Hoje", + "dashboard.noLogline": "Ainda não há logline. Adicione um no inspetor de manuscritos!", + "dashboard.onboarding.dismiss": "Entendi", + "dashboard.onboarding.startTour": "Visita guiada", + "dashboard.onboarding.tip1": "Use a barra lateral para alternar entre Manuscrito, Personagens, Mundos e Exportar.", + "dashboard.onboarding.tip2": "Adicione uma chave de API em Configurações para desbloquear a IA da nuvem ou escolha Ollama para modelos locais.", + "dashboard.onboarding.tip3": "Seu trabalho é salvo automaticamente neste dispositivo — os instantâneos estão disponíveis no Controle de versão.", + "dashboard.onboarding.title": "Dicas rápidas", + "dashboard.quickAccess.charactersDesc": "Gerencie seu elenco de personagens nos dossiês.", + "dashboard.quickAccess.exportDesc": "Formate e baixe seu projeto concluído.", + "dashboard.quickAccess.manuscriptDesc": "Entre no editor de manuscritos para escrever e organizar.", + "dashboard.quickAccess.outlineDesc": "Gere uma nova estrutura de enredo com o AI Outliner.", + "dashboard.quickAccess.title": "Ações rápidas", + "dashboard.quickAccess.worldDesc": "Construa e explore os mundos da sua história.", + "dashboard.quickAccess.writerDesc": "Use o AI Writing Studio para superar o bloqueio de escritor.", + "dashboard.stats.characters": "Personagens", + "dashboard.stats.outlineSections": "Seções de esboço", + "dashboard.stats.title": "Estatísticas do projeto", + "dashboard.stats.totalWordCount": "Palavras", + "dashboard.stats.worlds": "Mundos", + "initialProject.chapter1": "Capítulo 1", + "initialProject.logline": "Uma jornada de mil milhas começa com um único passo...", + "initialProject.title": "Minha história sem título", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss", - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", - "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", - "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", + "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", + "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)", "templates.adventure.arc": "Journey, obstacles, triumph.", "templates.adventure.description": "Danger, discovery, courage.", @@ -1049,283 +1051,283 @@ "templates.title": "Template Library", "templates.types.Genre": "Genre", "templates.types.Structure": "Structure", - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional", - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", "outline.selectSection": "Select section '{{title}}'", - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "outline.title": "AI Story Outline Generator", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name", - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name", - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.pasteSection.expand": "Paste text", "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds", "settings.about.description": "Your AI-powered creative partner for writing.", "settings.about.githubDescription": "View source code, report issues, and contribute.", "settings.about.githubLabel": "Open-source on GitHub", @@ -1793,8 +1795,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", @@ -2131,212 +2133,212 @@ "help.writing.templates.title": "Working with Templates", "help.writing.writer.content": "

AI Writing Studio Workflow

The AI Writing Studio is your dedicated space for AI-assisted drafting, editing, and brainstorming. The workflow is designed so AI assistance always flows through a scratchpad — you stay in control before anything touches your manuscript.

  1. Select a section: Use the section dropdown at the top of the Writer panel to pick which manuscript chapter you are working on. The editor scrolls to that section automatically.
  2. Pick a tool: Choose from Continue Writing, Improve Text, Change Tone, Generate Dialogue, Brainstorm, Summarize, or Critic. Each tool has a different purpose — hover any tool icon for a one-line description.
  3. Enable RAG context (optional): Toggle Use RAG context in the toolbar to have the AI draw on relevant passages from your manuscript before generating. This produces more consistent, story-aware output. The chunk badge shows how many passages were retrieved.
  4. Generate: Click the Generate button. Progress is shown in the scratchpad; streaming output appears token by token so you can stop early if the direction is wrong.
  5. Edit the scratchpad: The generated text lands in the editable scratchpad below the tools. Refine it directly — fix names, change phrasing, trim length — before accepting.
  6. Insert or Replace: Click Insert at cursor to add the scratchpad text after your current cursor position, or Replace selection to swap out the highlighted text you started with.

Hybrid fallback chains (Settings → Advanced AI → Hybrid fallback) retry additional providers automatically if the primary returns a rate-limit or network error.

", "help.writing.writer.title": "AI Writing Studio workflow", - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", - "objects.typeLabel.artifact": "Artifact", - "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", - "objects.typeLabel.other": "Other", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", "objects.save": "Save", - "objects.cancel": "Cancel", "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", + "objects.typeLabel.artifact": "Artifact", + "objects.typeLabel.document": "Document", + "objects.typeLabel.other": "Other", + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects", - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel", - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel", - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/public/locales/zh/bundle.json b/public/locales/zh/bundle.json index 72e1cd711..85afdef50 100644 --- a/public/locales/zh/bundle.json +++ b/public/locales/zh/bundle.json @@ -148,6 +148,8 @@ "error.db.invalidState": "内部数据库错误。请重新加载页面。", "error.db.quotaExceeded": "浏览器存储空间已满。请删除旧项目或快照。", "error.db.unknown": "访问数据库时出现未知错误。", + "error.deepLink.title": "Failed to open project file", + "error.deepLink.unknown": "Unknown error", "error.fileImportError": "文件导入错误", "error.mic.denied": "麦克风访问被拒绝。请在您的浏览器设置中授予权限。", "error.mic.generic": "语音识别错误:{{error}}", @@ -508,340 +510,340 @@ "voice.stopListening": "停止聆听", "worlds.emptyState.description": "构建你的故事所存在的地点、规则和历史。从一个地点开始。", "worlds.emptyState.title": "世界等待着", - "tour.intro.title": "Welcome aboard", + "tour.btn.done": "Done", + "tour.btn.next": "Next", + "tour.btn.prev": "Back", + "tour.help.startButton": "Start guided tour", "tour.intro.body": "A short tour of StoryCraft Studio: navigation, command palette, and settings.", + "tour.intro.title": "Welcome aboard", + "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", + "tour.nav.title": "Move around the app", "tour.navigationOnly.introBody": "Let’s focus on how you move around the app on desktop and mobile.", "tour.navigationOnly.outroBody": "You can replay navigation-only tours anytime from Help.", "tour.navigationOnly.startButton": "Navigation tour only", - "tour.nav.title": "Move around the app", - "tour.nav.body": "Use the sidebar on desktop or the bottom bar on your phone to open Dashboard, Manuscript, Characters, Export, and more.", - "tour.palette.title": "Command palette", - "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", - "tour.settings.title": "Settings", - "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", - "tour.outro.title": "You're set", "tour.outro.body": "Your work saves automatically on this device. Open Help anytime to run this tour again.", "tour.outro.helpCta": "Tip: open Help from the sidebar for articles, FAQs, and the AI guide — then use “Try it now” to jump straight into a view.", - "tour.btn.next": "Next", - "tour.btn.prev": "Back", - "tour.btn.done": "Done", - "tour.help.startButton": "Start guided tour", - "sidebar.mainAria": "主侧边栏", - "sidebar.primaryNavAria": "主要导航", - "sidebar.secondaryNavAria": "设置和帮助", - "sidebar.mobileNavigation": "主要观点", - "sidebar.overflowMenuAria": "更多浏览次数", - "sidebar.dashboard": "仪表板", - "sidebar.manuscript": "手稿", - "sidebar.writer": "人工智能写作工作室", - "sidebar.templates": "模板", - "sidebar.outline": "轮廓生成器", - "sidebar.characters": "人物", - "sidebar.world": "世界大厦", - "sidebar.sceneboard": "场景板", + "tour.outro.title": "You're set", + "tour.palette.body": "Press Ctrl+K (⌘K on Mac) to search commands, switch theme or language, and jump to any view.", + "tour.palette.title": "Command palette", + "tour.settings.body": "Configure API keys, AI provider (Gemini cloud or local Ollama), appearance, editor, backups, and exports.", + "tour.settings.title": "Settings", "sidebar.characterGraph": "人物图", + "sidebar.characterInterviews": "人物访谈", + "sidebar.characters": "人物", "sidebar.consistencyChecker": "一致性检查器", "sidebar.critic": "人工智能评论家", + "sidebar.dashboard": "仪表板", "sidebar.export": "出口", - "sidebar.settings": "设置", "sidebar.help": "帮助", - "sidebar.objects": "故事对象", - "sidebar.mindmap": "思维导图", - "sidebar.characterInterviews": "人物访谈", "sidebar.lora": "微调", - "portal.language.groupLabel": "欢迎屏幕语言", - "portal.language.searchPlaceholder": "搜索语言...", - "portal.welcome.title": "欢迎来到 StoryCraft 工作室", - "portal.welcome.subtitle": "您的人工智能写作创意合作伙伴。", - "portal.welcome.newProject": "开始一个新项目", - "portal.welcome.openProject": "开放项目", - "portal.welcome.continue": "继续上一课", - "portal.welcome.tryDemo": "加载演示项目", - "portal.welcome.demoHint": "新来的?加载带有大纲和手稿的简短示例故事来探索该应用程序。", - "portal.welcome.privacyBadge": "100% 离线优先 — 您的故事保留在此设备上; API 密钥静态加密。", - "portal.new.demo.title": "探索演示项目", - "portal.new.demo.description": "预填充项目,包含大纲和​​第一章 - 非常适合学习 UI 和工具。", - "portal.new.title": "您想如何开始?", - "portal.new.description": "选择最适合您的创作过程的起点。", - "portal.new.template.title": "从模板开始", - "portal.new.template.description": "使用经典的叙事结构(例如三幕结构)来指导您的故事。", - "portal.new.ai.title": "用人工智能生成", - "portal.new.ai.description": "提供一个简单的想法,让我们的人工智能为您构建详细的情节轮廓。", - "portal.new.blank.title": "从空白手稿开始", - "portal.new.blank.description": "对于那些知道自己要去哪里的人。从空的第一章开始。", - "portal.demo.title": "演示:密封塔", + "sidebar.mainAria": "主侧边栏", + "sidebar.manuscript": "手稿", + "sidebar.mindmap": "思维导图", + "sidebar.mobileNavigation": "主要观点", + "sidebar.objects": "故事对象", + "sidebar.outline": "轮廓生成器", + "sidebar.overflowMenuAria": "更多浏览次数", + "sidebar.primaryNavAria": "主要导航", + "sidebar.sceneboard": "场景板", + "sidebar.secondaryNavAria": "设置和帮助", + "sidebar.settings": "设置", + "sidebar.templates": "模板", + "sidebar.world": "世界大厦", + "sidebar.writer": "人工智能写作工作室", + "portal.back": "后退", + "portal.demo.chapterContent": "当莱拉展开旧城地图时,晨雾笼罩在码头上。西北角有一个淡淡的圆圈标记——那座塔无人提及。\n\n她把纸收起来,沿着狭窄的小路走,直到铁格子在她面前升起。挂锁在阳光下显得温暖;金属仍然冰冷。", + "portal.demo.chapterTitle": "第一章 门前", "portal.demo.logline": "尝试大纲、手稿和工作区的简短示例。", - "portal.demo.outline1Title": "开幕", "portal.demo.outline1Desc": "河边小镇;主角发现了一座禁塔。", - "portal.demo.outline2Title": "冲突", + "portal.demo.outline1Title": "开幕", "portal.demo.outline2Desc": "封印破裂;具有后果的决定。", - "portal.demo.chapterTitle": "第一章 门前", - "portal.demo.chapterContent": "当莱拉展开旧城地图时,晨雾笼罩在码头上。西北角有一个淡淡的圆圈标记——那座塔无人提及。\n\n她把纸收起来,沿着狭窄的小路走,直到铁格子在她面前升起。挂锁在阳光下显得温暖;金属仍然冰冷。", - "portal.open.title": "打开现有项目", - "portal.open.description": "从备份文件 (.json) 加载以前保存的项目以继续您的工作。", - "portal.open.button": "导入项目文件", - "portal.back": "后退", - "portal.features.ai.title": "人工智能副驾驶", + "portal.demo.outline2Title": "冲突", + "portal.demo.title": "演示:密封塔", "portal.features.ai.description": "使用云或完全本地模型起草、集思广益并突破障碍。", - "portal.features.plot.title": "视觉绘图板", + "portal.features.ai.title": "人工智能副驾驶", + "portal.features.export.description": "完全离线编译为 DOCX、PDF、EPUB 和 Markdown。", + "portal.features.export.title": "专业出口", "portal.features.plot.description": "使用张力曲线和节拍表在画布上规划结构。", - "portal.features.worldbuilding.title": "人物与世界", + "portal.features.plot.title": "视觉绘图板", "portal.features.worldbuilding.description": "丰富的档案、图册、AI画像、关系图谱。", - "portal.features.export.title": "专业出口", - "portal.features.export.description": "完全离线编译为 DOCX、PDF、EPUB 和 Markdown。", - "initialProject.title": "我的无题故事", - "initialProject.logline": "千里之行,始于足下……", - "initialProject.chapter1": "第一章", - "dashboard.greeting": "欢迎回到", - "dashboard.noLogline": "还没有日志。稿件检查器中添加一个!", - "dashboard.continueWriting.title": "继续写作", - "dashboard.continueWriting.button": "跳回", - "dashboard.continueWriting.empty": "在手稿视图中开始您的故事。", - "dashboard.goals.title": "项目目标", - "dashboard.goals.wordCount": "字数统计", - "dashboard.goals.deadline": "最后期限", - "dashboard.goals.noDeadline": "没有设定最后期限", - "dashboard.goals.daysLeft": "还剩 {{count}} 天", - "dashboard.goals.dayLeft": "还剩 1 天", - "dashboard.goals.noDaysLeft": "今天截止日期", - "dashboard.goals.overdue": "逾期", - "dashboard.goals.setGoal": "设定目标", - "dashboard.goals.editGoal": "编辑目标", - "dashboard.goals.modal.title": "设定项目目标", - "dashboard.goals.modal.wordCountLabel": "目标字数", - "dashboard.goals.modal.deadlineLabel": "目标截止日期(可选)", - "dashboard.goals.modal.save": "保存目标", - "dashboard.goals.wordsRemaining": "还剩 {{count}} 个字", - "dashboard.goals.pace.title": "步伐", - "dashboard.goals.pace.perDayUnit": "/天", - "dashboard.goals.pace.onTrack": "步入正轨", - "dashboard.goals.pace.behind": "落后的步伐", - "dashboard.goals.pace.done": "目标达成", - "dashboard.goals.pace.noDeadline": "设定截止日期", - "dashboard.glance.title": "概览", - "dashboard.glance.recentCharacter": "最近的角色", - "dashboard.glance.recentWorld": "最近的世界", - "dashboard.glance.noCharacters": "还没有角色。", - "dashboard.glance.noWorlds": "还没有世界。", - "dashboard.stats.title": "项目统计", - "dashboard.stats.characters": "人物", - "dashboard.stats.worlds": "世界赛", - "dashboard.stats.outlineSections": "大纲部分", - "dashboard.stats.totalWordCount": "字", - "dashboard.healthScore.title": "项目健康", - "dashboard.healthScore.body": "目标进度、投射深度和世界构建覆盖范围的轻量级混合。", - "dashboard.healthScore.scoreLabel": "分数", - "dashboard.healthScore.writing": "写作进度", - "dashboard.healthScore.cast": "铸造深度", - "dashboard.healthScore.world": "世界建筑", - "dashboard.quickAccess.title": "快速行动", - "dashboard.quickAccess.manuscriptDesc": "跳进稿件编辑器进行写作和组织。", - "dashboard.quickAccess.writerDesc": "使用 AI 写作工作室来克服写作障碍。", - "dashboard.quickAccess.outlineDesc": "使用 AI 大纲工具生成新的绘图结构。", - "dashboard.quickAccess.charactersDesc": "管理档案中的角色阵容。", - "dashboard.quickAccess.worldDesc": "构建并探索你的故事世界。", - "dashboard.quickAccess.exportDesc": "格式化并下载已完成的项目。", - "dashboard.details.title": "故事详情", - "dashboard.details.projectTitle": "项目名称", - "dashboard.details.projectTitlePlaceholder": "我的精彩故事", - "dashboard.details.logline": "故事梗概", - "dashboard.details.loglinePlaceholder": "用一句话概括你的故事。", - "dashboard.details.aiLoglineButton": "AI 剧情助理", - "dashboard.loglineModal.title": "AI 梗概建议", - "dashboard.loglineModal.loading": "生成精彩的故事情节...", - "dashboard.onboarding.title": "快速提示", - "dashboard.onboarding.tip1": "使用侧边栏在手稿、角色、世界和导出之间切换。", - "dashboard.onboarding.tip2": "在“设置”中添加 API 密钥以解锁云 AI,或为本地模型选择 Ollama。", - "dashboard.onboarding.tip3": "您的工作会自动保存到此设备 - 快照可在版本控制下使用。", - "dashboard.onboarding.dismiss": "知道了", - "dashboard.onboarding.startTour": "导赏团", - "dashboard.authorInsights.title": "作者管道见解", + "portal.features.worldbuilding.title": "人物与世界", + "portal.language.groupLabel": "欢迎屏幕语言", + "portal.language.searchPlaceholder": "搜索语言...", + "portal.new.ai.description": "提供一个简单的想法,让我们的人工智能为您构建详细的情节轮廓。", + "portal.new.ai.title": "用人工智能生成", + "portal.new.blank.description": "对于那些知道自己要去哪里的人。从空的第一章开始。", + "portal.new.blank.title": "从空白手稿开始", + "portal.new.demo.description": "预填充项目,包含大纲和​​第一章 - 非常适合学习 UI 和工具。", + "portal.new.demo.title": "探索演示项目", + "portal.new.description": "选择最适合您的创作过程的起点。", + "portal.new.template.description": "使用经典的叙事结构(例如三幕结构)来指导您的故事。", + "portal.new.template.title": "从模板开始", + "portal.new.title": "您想如何开始?", + "portal.open.button": "导入项目文件", + "portal.open.description": "从备份文件 (.json) 加载以前保存的项目以继续您的工作。", + "portal.open.title": "打开现有项目", + "portal.welcome.continue": "继续上一课", + "portal.welcome.demoHint": "新来的?加载带有大纲和手稿的简短示例故事来探索该应用程序。", + "portal.welcome.newProject": "开始一个新项目", + "portal.welcome.openProject": "开放项目", + "portal.welcome.privacyBadge": "100% 离线优先 — 您的故事保留在此设备上; API 密钥静态加密。", + "portal.welcome.subtitle": "您的人工智能写作创意合作伙伴。", + "portal.welcome.title": "欢迎来到 StoryCraft 工作室", + "portal.welcome.tryDemo": "加载演示项目", "dashboard.authorInsights.readability": "可读性(Flesch 风格,EN 启发式)", - "dashboard.authorInsights.readabilityNeedMore": "多写一点——可读性需要约 40 个以上的单词才能获得稳定的分数。", "dashboard.authorInsights.readabilityFootnote": "分数越高通常意味着阅读越容易;有意调整您的风格。", + "dashboard.authorInsights.readabilityNeedMore": "多写一点——可读性需要约 40 个以上的单词才能获得稳定的分数。", "dashboard.authorInsights.timeline": "场景时间线检查", "dashboard.authorInsights.timelineClear": "场景元数据没有时间线警告。", "dashboard.authorInsights.timelineWarnBadge": "{{count}} 条警告 — 在场景板上优化场景日期/持续时间。", - "dashboard.backup.title": "Backup & restore", - "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", + "dashboard.authorInsights.title": "作者管道见解", "dashboard.backup.exportJson": "Export JSON", + "dashboard.backup.hint": "Export your project, import a backup, or open full backup settings.", "dashboard.backup.importJson": "Import JSON", - "dashboard.backup.openSettings": "Backup settings", "dashboard.backup.latestSnapshot": "Latest snapshot: {{name}} ({{date}})", + "dashboard.backup.openSettings": "Backup settings", + "dashboard.backup.title": "Backup & restore", "dashboard.backup.unnamedSnapshot": "Unnamed snapshot", + "dashboard.composition.avgPerScene": "平均/场景", + "dashboard.composition.empty": "在手稿中添加场景以查看其构成。", + "dashboard.composition.readingTime": "阅读时间", + "dashboard.composition.readingTimeValue": "{{count}} 分钟", + "dashboard.composition.scenes": "场景", + "dashboard.composition.status.draft": "草稿", + "dashboard.composition.status.final": "最终的", + "dashboard.composition.status.firstDraft": "初稿", + "dashboard.composition.status.outline": "大纲", + "dashboard.composition.status.revised": "修改", + "dashboard.composition.status.untracked": "未追踪", + "dashboard.composition.title": "稿件作文", + "dashboard.continueWriting.button": "跳回", + "dashboard.continueWriting.empty": "在手稿视图中开始您的故事。", + "dashboard.continueWriting.title": "继续写作", + "dashboard.details.aiLoglineButton": "AI 剧情助理", + "dashboard.details.logline": "故事梗概", + "dashboard.details.loglinePlaceholder": "用一句话概括你的故事。", + "dashboard.details.projectTitle": "项目名称", + "dashboard.details.projectTitlePlaceholder": "我的精彩故事", + "dashboard.details.title": "故事详情", + "dashboard.glance.noCharacters": "还没有角色。", + "dashboard.glance.noWorlds": "还没有世界。", + "dashboard.glance.recentCharacter": "最近的角色", + "dashboard.glance.recentWorld": "最近的世界", + "dashboard.glance.title": "概览", + "dashboard.goals.dayLeft": "还剩 1 天", + "dashboard.goals.daysLeft": "还剩 {{count}} 天", + "dashboard.goals.deadline": "最后期限", + "dashboard.goals.editGoal": "编辑目标", + "dashboard.goals.modal.deadlineLabel": "目标截止日期(可选)", + "dashboard.goals.modal.save": "保存目标", + "dashboard.goals.modal.title": "设定项目目标", + "dashboard.goals.modal.wordCountLabel": "目标字数", + "dashboard.goals.noDaysLeft": "今天截止日期", + "dashboard.goals.noDeadline": "没有设定最后期限", + "dashboard.goals.overdue": "逾期", + "dashboard.goals.pace.behind": "落后的步伐", + "dashboard.goals.pace.done": "目标达成", + "dashboard.goals.pace.noDeadline": "设定截止日期", + "dashboard.goals.pace.onTrack": "步入正轨", + "dashboard.goals.pace.perDayUnit": "/天", + "dashboard.goals.pace.title": "步伐", + "dashboard.goals.setGoal": "设定目标", + "dashboard.goals.title": "项目目标", + "dashboard.goals.wordCount": "字数统计", + "dashboard.goals.wordsRemaining": "还剩 {{count}} 个字", + "dashboard.greeting": "欢迎回到", "dashboard.header.ariaLabel": "项目概况", - "dashboard.header.greetingMorning": "早上好", "dashboard.header.greetingAfternoon": "下午好", "dashboard.header.greetingEvening": "晚上好", + "dashboard.header.greetingMorning": "早上好", "dashboard.header.greetingNight": "开夜车", "dashboard.header.lastEdited": "最后编辑:{{title}}", - "dashboard.momentum.title": "写作动力", + "dashboard.healthScore.body": "目标进度、投射深度和世界构建覆盖范围的轻量级混合。", + "dashboard.healthScore.cast": "铸造深度", + "dashboard.healthScore.scoreLabel": "分数", + "dashboard.healthScore.title": "项目健康", + "dashboard.healthScore.world": "世界建筑", + "dashboard.healthScore.writing": "写作进度", + "dashboard.loglineModal.loading": "生成精彩的故事情节...", + "dashboard.loglineModal.title": "AI 梗概建议", + "dashboard.momentum.activity": "过去 14 天", "dashboard.momentum.dayStreak": "连续日", + "dashboard.momentum.goalReached": "目标达成", "dashboard.momentum.longest": "最佳:{{count}}", - "dashboard.momentum.today": "今天", - "dashboard.momentum.thisWeek": "本星期", - "dashboard.momentum.ofGoal": "{{当前}} / {{目标}}", - "dashboard.momentum.activity": "过去 14 天", "dashboard.momentum.noActivity": "尚未记录任何写作记录 - 开始一个会话来建立您的连续记录。", - "dashboard.momentum.goalReached": "目标达成", - "dashboard.composition.title": "稿件作文", - "dashboard.composition.scenes": "场景", - "dashboard.composition.avgPerScene": "平均/场景", - "dashboard.composition.readingTime": "阅读时间", - "dashboard.composition.readingTimeValue": "{{count}} 分钟", - "dashboard.composition.empty": "在手稿中添加场景以查看其构成。", - "dashboard.composition.status.outline": "大纲", - "dashboard.composition.status.draft": "草稿", - "dashboard.composition.status.firstDraft": "初稿", - "dashboard.composition.status.revised": "修改", - "dashboard.composition.status.final": "最终的", - "dashboard.composition.status.untracked": "未追踪", - "manuscript.navigator.title": "Navigator", - "manuscript.inspector.title": "Inspector", - "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", - "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", - "manuscript.select": "Select a section from the navigator to begin writing.", - "manuscript.contentPlaceholder": "Write content for {{title}}...", - "manuscript.mention.characters": "Characters", - "manuscript.mention.worlds": "Worlds", - "manuscript.mention.suggestions": "Suggestions", - "manuscript.inspector.statsTitle": "Section Stats", - "manuscript.inspector.charCount": "Character Count", - "manuscript.inspector.readTime": "Est. Reading Time", - "manuscript.inspector.readTimeValue": "~{{time}} min", + "dashboard.momentum.ofGoal": "{{当前}} / {{目标}}", + "dashboard.momentum.thisWeek": "本星期", + "dashboard.momentum.title": "写作动力", + "dashboard.momentum.today": "今天", + "dashboard.noLogline": "还没有日志。稿件检查器中添加一个!", + "dashboard.onboarding.dismiss": "知道了", + "dashboard.onboarding.startTour": "导赏团", + "dashboard.onboarding.tip1": "使用侧边栏在手稿、角色、世界和导出之间切换。", + "dashboard.onboarding.tip2": "在“设置”中添加 API 密钥以解锁云 AI,或为本地模型选择 Ollama。", + "dashboard.onboarding.tip3": "您的工作会自动保存到此设备 - 快照可在版本控制下使用。", + "dashboard.onboarding.title": "快速提示", + "dashboard.quickAccess.charactersDesc": "管理档案中的角色阵容。", + "dashboard.quickAccess.exportDesc": "格式化并下载已完成的项目。", + "dashboard.quickAccess.manuscriptDesc": "跳进稿件编辑器进行写作和组织。", + "dashboard.quickAccess.outlineDesc": "使用 AI 大纲工具生成新的绘图结构。", + "dashboard.quickAccess.title": "快速行动", + "dashboard.quickAccess.worldDesc": "构建并探索你的故事世界。", + "dashboard.quickAccess.writerDesc": "使用 AI 写作工作室来克服写作障碍。", + "dashboard.stats.characters": "人物", + "dashboard.stats.outlineSections": "大纲部分", + "dashboard.stats.title": "项目统计", + "dashboard.stats.totalWordCount": "字", + "dashboard.stats.worlds": "世界赛", + "initialProject.chapter1": "第一章", + "initialProject.logline": "千里之行,始于足下……", + "initialProject.title": "我的无题故事", "manuscript.addSection": "Add New Section", - "manuscript.untitledSection": "Untitled Section", - "manuscript.deleteSection": "Delete Section", - "manuscript.titlePlaceholder": "Section Title", - "manuscript.visualize.title": "Scene illustration", - "manuscript.visualize.button": "Visualize current scene", - "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", - "manuscript.visualize.successTitle": "Scene image ready", - "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", - "manuscript.binder.tab": "Binder", "manuscript.binder.addFolder": "Folder", + "manuscript.binder.addLink": "Add web link", "manuscript.binder.addNote": "Note", - "manuscript.binder.newFolder": "New folder", - "manuscript.binder.newNote": "New note", + "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", + "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.deleteNode": "Delete item", "manuscript.binder.empty": "No research items yet.", "manuscript.binder.emptyHint": "Add folders and notes to organize your research, references, and snippets.", - "manuscript.binder.noteTitle": "Note title", - "manuscript.binder.noteBody": "Note content", - "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", - "manuscript.binder.deleteNode": "Delete item", - "manuscript.binder.deleteFolder": "Delete folder and contents", + "manuscript.binder.importFailed": "Could not import file", "manuscript.binder.importFile": "Import file", - "manuscript.binder.addLink": "Add web link", - "manuscript.binder.linkUrl": "URL (https://…)", "manuscript.binder.linkTitleOptional": "Title (optional)", + "manuscript.binder.linkUrl": "URL (https://…)", + "manuscript.binder.newFolder": "New folder", "manuscript.binder.newLink": "Web link", + "manuscript.binder.newNote": "New note", + "manuscript.binder.noteBody": "Note content", + "manuscript.binder.notePlaceholder": "Research notes, references, snippets…", + "manuscript.binder.noteTitle": "Note title", "manuscript.binder.openInSplit": "Open beside manuscript", "manuscript.binder.previewLoading": "Loading preview…", "manuscript.binder.previewUnavailable": "Preview not available.", - "manuscript.binder.importFailed": "Could not import file", - "manuscript.binder.assetsLocalHint": "Files stay on this device (IndexedDB or Tauri project folder). Full project ZIP export can bundle these in a later release.", - "manuscript.researchSplit.title": "Research reference", + "manuscript.binder.tab": "Binder", + "manuscript.contentPlaceholder": "Write content for {{title}}...", + "manuscript.deleteSection": "Delete Section", + "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.inspector.aiWorkingStatus": "Artificial intelligence is working on your request.", + "manuscript.inspector.charCount": "Character Count", + "manuscript.inspector.readTime": "Est. Reading Time", + "manuscript.inspector.readTimeValue": "~{{time}} min", + "manuscript.inspector.regionAriaLabel": "Project details and AI assistant tools", + "manuscript.inspector.statsTitle": "Section Stats", + "manuscript.inspector.title": "Inspector", + "manuscript.leftPanel.mobileBinder": "Res", + "manuscript.leftPanel.mobileChapters": "TOC", + "manuscript.leftPanel.openDrawer": "Open sidebar", + "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", + "manuscript.mention.characters": "Characters", + "manuscript.mention.suggestions": "Suggestions", + "manuscript.mention.worlds": "Worlds", + "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", + "manuscript.navigator.largeManuscriptDismiss": "Dismiss", + "manuscript.navigator.title": "Navigator", "manuscript.researchSplit.close": "Close split", "manuscript.researchSplit.empty": "Nothing pinned.", "manuscript.researchSplit.linkHint": "Opens in a new browser tab for security.", - "manuscript.leftPanel.tabsAria": "Manuscript sidebar mode", - "manuscript.leftPanel.mobileChapters": "TOC", - "manuscript.leftPanel.mobileBinder": "Res", - "manuscript.leftPanel.openDrawer": "Open sidebar", - "manuscript.sectionHistory.title": "Section history", - "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", - "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.researchSplit.title": "Research reference", + "manuscript.resizer.left": "Adjust left panel", + "manuscript.resizer.right": "Adjust right panel", "manuscript.sectionHistory.empty": "No snapshots for this section yet.", "manuscript.sectionHistory.restore": "Restore", - "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.sectionHistory.saveSnapshot": "Save section snapshot", + "manuscript.sectionHistory.snapshotLabel": "{{title}} — checkpoint", + "manuscript.sectionHistory.title": "Section history", + "manuscript.select": "Select a section from the navigator to begin writing.", "manuscript.spellcheck.applyFix": "Apply Fix", - "manuscript.grammar.checkButton": "Check Grammar & Style", + "manuscript.spellcheck.didYouMean": "Did you mean?", + "manuscript.titlePlaceholder": "Section Title", + "manuscript.untitledSection": "Untitled Section", + "manuscript.visualize.button": "Visualize current scene", + "manuscript.visualize.hint": "Gemini (or your configured image-capable provider) generates one illustration from this section. Stored locally per section.", + "manuscript.visualize.successBody": "Preview below; full image saved in local storage.", + "manuscript.visualize.successTitle": "Scene image ready", + "manuscript.visualize.title": "Scene illustration", "manuscript.zenMode.enter": "Enter Zen Mode", "manuscript.zenMode.exit": "Exit Zen Mode", "manuscript.zenMode.label": "Zen Mode", - "manuscript.resizer.left": "Adjust left panel", - "manuscript.resizer.right": "Adjust right panel", - "manuscript.navigator.largeManuscript": "Large manuscript ({{count}} scenes) — virtual scrolling active.", - "manuscript.navigator.largeManuscriptDismiss": "Dismiss", - "writer.studio.title": "AI Writing Studio", - "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", - "writer.studio.context.title": "Manuscript Context", + "writer.chapter.label": "Chapter: {{title}}", + "writer.context.hide": "Hide context", + "writer.context.label": "Context", + "writer.context.show": "Show context", + "writer.flowMode.enterLabel": "Flow mode", + "writer.flowMode.exit": "Exit Flow Mode", + "writer.flowMode.exitLabel": "Exit flow", + "writer.flowMode.hint": "Write without interruption. Press Esc to return.", + "writer.flowMode.title": "Flow Mode", + "writer.focusMode.enter": "Focus mode (manuscript + AI only)", + "writer.focusMode.enterLabel": "Focus mode", + "writer.focusMode.exit": "Exit focus mode", + "writer.focusMode.exitLabel": "Exit focus", + "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", + "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", + "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", + "writer.stopGenerating": "Stop Generating", + "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", "writer.studio.context.sectionLabel": "Working Section", "writer.studio.context.selectSection": "Select a section to edit", - "writer.studio.context.contentPlaceholder": "Select or create a manuscript section to begin.", - "writer.studio.tools.title": "AI Tools", - "writer.studio.rag.useContext": "Pull from my story", - "writer.studio.rag.chunksBadge": "{{count}} story passages found", - "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", - "writer.studio.tools.continue.title": "Continue Writing", - "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", - "writer.studio.tools.improve.title": "Improve Text", - "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", - "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", - "writer.studio.tools.changeTone.title": "Change Tone", - "writer.studio.tools.dialogue.title": "Generate Dialogue", - "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", - "writer.studio.tools.dialogue.scenarioLabel": "Scenario", - "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", - "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", - "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", - "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", - "writer.studio.tools.synopsis.title": "Summarize Section", - "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", - "writer.studio.tools.grammarCheck.title": "Grammar & Style", - "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", - "writer.studio.controls.title": "Style Controls", - "writer.studio.controls.style": "Style", - "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.context.title": "Manuscript Context", + "writer.studio.controls.custom": "Custom...", + "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", "writer.studio.controls.default": "Default", - "writer.studio.controls.tones.cinematic": "More Cinematic", - "writer.studio.controls.tones.suspenseful": "More Suspenseful", - "writer.studio.controls.tones.humorous": "More Humorous", - "writer.studio.controls.tones.formal": "More Formal", - "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.selectTone": "Select a new tone", + "writer.studio.controls.style": "Style", "writer.studio.controls.styles.cinematic": "Cinematic", "writer.studio.controls.styles.concise": "Concise", "writer.studio.controls.styles.descriptive": "Descriptive", "writer.studio.controls.styles.minimalist": "Minimalist", - "writer.studio.result.title": "AI Scratchpad", - "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.controls.title": "Style Controls", + "writer.studio.controls.tones.cinematic": "More Cinematic", + "writer.studio.controls.tones.formal": "More Formal", + "writer.studio.controls.tones.humorous": "More Humorous", + "writer.studio.controls.tones.poetic": "More Poetic", + "writer.studio.controls.tones.suspenseful": "More Suspenseful", + "writer.studio.description": "Your AI co-author. Generate, improve, and brainstorm with full project context.", + "writer.studio.rag.chunksBadge": "{{count}} story passages found", + "writer.studio.rag.chunksHint": "Relevant excerpts from your manuscript — more passages means richer AI context", + "writer.studio.rag.useContext": "Pull from my story", "writer.studio.result.insert": "Insert", + "writer.studio.result.next": "Next", + "writer.studio.result.placeholder": "Generated text will appear here...", + "writer.studio.result.prev": "Prev", "writer.studio.result.replace": "Replace", "writer.studio.result.retry": "Retry", - "writer.studio.result.prev": "Prev", - "writer.studio.result.next": "Next", - "writer.studio.tools.critic.title": "AI Critic", - "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", - "writer.studio.tools.plotholes.title": "Plot-Hole Detector", - "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", - "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.result.title": "AI Scratchpad", + "writer.studio.title": "AI Writing Studio", + "writer.studio.tools.brainstorm.contextLabel": "Brainstorming Context (Optional)", + "writer.studio.tools.brainstorm.contextPlaceholder": "Provide a brief situation, or the AI will use the current manuscript section.", + "writer.studio.tools.brainstorm.title": "Brainstorm Ideas", + "writer.studio.tools.changeTone.title": "Change Tone", "writer.studio.tools.consistency.instruction": "Check the text against your character dossiers and world lore for continuity errors.", - "writer.tts.stop": "Stop reading", - "writer.tts.start": "Read aloud", - "writer.context.show": "Show context", - "writer.context.hide": "Hide context", - "writer.tools.show": "Show tools", + "writer.studio.tools.consistency.title": "Universe Consistency", + "writer.studio.tools.continue.instruction": "Place your cursor in the manuscript where you want the AI to start writing.", + "writer.studio.tools.continue.title": "Continue Writing", + "writer.studio.tools.critic.instruction": "Act as your professional literary critic and editor.", + "writer.studio.tools.critic.title": "AI Critic", + "writer.studio.tools.dialogue.charactersLabel": "Characters in Scene", + "writer.studio.tools.dialogue.scenarioLabel": "Scenario", + "writer.studio.tools.dialogue.scenarioPlaceholder": "e.g., Jax confronts the informant about the bad intel.", + "writer.studio.tools.dialogue.title": "Generate Dialogue", + "writer.studio.tools.grammarCheck.instruction": "Select text and click 'Grammar & Style' to check and improve errors and style (auto-detects English/German).", + "writer.studio.tools.grammarCheck.title": "Grammar & Style", + "writer.studio.tools.improve.instruction": "Selected text: {{selection}}", + "writer.studio.tools.improve.noSelection": "Select text in the manuscript to improve.", + "writer.studio.tools.improve.title": "Improve Text", + "writer.studio.tools.plotholes.instruction": "Find logical gaps or plot holes in the selected text.", + "writer.studio.tools.plotholes.title": "Plot-Hole Detector", + "writer.studio.tools.synopsis.instruction": "The AI will generate a summary of the currently selected manuscript section.", + "writer.studio.tools.synopsis.title": "Summarize Section", + "writer.studio.tools.title": "AI Tools", "writer.tools.hide": "Hide tools", - "writer.chapter.label": "Chapter: {{title}}", - "writer.context.label": "Context", "writer.tools.label": "Tools", - "writer.focusMode.exit": "Exit focus mode", - "writer.focusMode.enter": "Focus mode (manuscript + AI only)", - "writer.focusMode.exitLabel": "Exit focus", - "writer.focusMode.enterLabel": "Focus mode", - "writer.flowMode.title": "Flow Mode", - "writer.flowMode.hint": "Write without interruption. Press Esc to return.", - "writer.flowMode.exit": "Exit Flow Mode", - "writer.flowMode.exitLabel": "Exit flow", - "writer.flowMode.enterLabel": "Flow mode", - "writer.versionControl.label": "Versions", - "writer.imagePrompt.description": "Generates an optimized DALL·E 3 / Midjourney prompt from the current scene or text selection.", - "writer.imagePrompt.tip": "Tip: Select a specific text section for a focused scene prompt.", - "writer.imagePrompt.note": "The generated prompt works directly in DALL·E 3 and Midjourney.", - "writer.stopGenerating": "Stop Generating", "writer.tools.selectLabel": "Tool selection", - "writer.studio.controls.custom": "Custom...", - "writer.studio.controls.customTonePlaceholder": "e.g., Sarcastic, Melancholic, Fast-paced", + "writer.tools.show": "Show tools", + "writer.tts.start": "Read aloud", + "writer.tts.stop": "Stop reading", + "writer.versionControl.label": "Versions", "writer.versionControl.tooltip": "Version Control (Branches & Snapshots)", "templates.adventure.arc": "Journey, obstacles, triumph.", "templates.adventure.description": "Danger, discovery, courage.", @@ -1049,283 +1051,283 @@ "templates.title": "Template Library", "templates.types.Genre": "Genre", "templates.types.Structure": "Structure", - "tags.classic": "Classic", - "tags.plotDriven": "Plot-Driven", + "tags.adventure": "Adventure", "tags.beginnerFriendly": "Beginner-Friendly", "tags.characterDriven": "Character-Driven", - "tags.epic": "Epic", - "tags.screenwriting": "Screenwriting", + "tags.classic": "Classic", "tags.commercial": "Commercial", + "tags.emotional": "Emotional", + "tags.epic": "Epic", "tags.fastPaced": "Fast-Paced", - "tags.thriller": "Thriller", "tags.inMediaRes": "In Media Res", "tags.investigation": "Investigation", - "tags.suspense": "Suspense", - "tags.sciFi": "Sci-Fi", - "tags.adventure": "Adventure", - "tags.socialCommentary": "Social Commentary", + "tags.plotDriven": "Plot-Driven", "tags.rebellion": "Rebellion", "tags.romance": "Romance", - "tags.emotional": "Emotional", - "outline.title": "AI Story Outline Generator", - "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", - "outline.idea.title": "Your Idea", - "outline.idea.genreLabel": "Genre", - "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", - "outline.idea.promptLabel": "Story Idea / Prompt", - "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", - "outline.idea.generateButton": "Generate Outline", - "outline.advanced.title": "Advanced Options", + "tags.sciFi": "Sci-Fi", + "tags.screenwriting": "Screenwriting", + "tags.socialCommentary": "Social Commentary", + "tags.suspense": "Suspense", + "tags.thriller": "Thriller", + "outline.advanced.chaptersLabel": "Chapters", "outline.advanced.charactersLabel": "Key Characters (Optional)", "outline.advanced.charactersPlaceholder": "e.g., Jax, the cynical detective; Unit 734, the missing android", - "outline.advanced.settingLabel": "Setting (Optional)", - "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", - "outline.advanced.pacingLabel": "Pacing", "outline.advanced.pacingDefault": "Default", - "outline.advanced.pacingSlow": "Slow Burn", - "outline.advanced.pacingMedium": "Medium Paced", "outline.advanced.pacingFast": "Fast-Paced", - "outline.advanced.chaptersLabel": "Chapters", + "outline.advanced.pacingLabel": "Pacing", + "outline.advanced.pacingMedium": "Medium Paced", + "outline.advanced.pacingSlow": "Slow Burn", + "outline.advanced.settingLabel": "Setting (Optional)", + "outline.advanced.settingPlaceholder": "e.g., Neo-Veridia, a rain-soaked city of neon and chrome", + "outline.advanced.title": "Advanced Options", "outline.advanced.twistLabel": "Include a plot twist", - "outline.result.title": "Interactive Outline", - "outline.result.loading": "Generating your story outline...", - "outline.result.placeholder": "Your generated outline will appear here.", - "outline.result.applyButton": "Apply Outline to Manuscript", - "outline.result.newSectionTitle": "New Section", - "outline.result.dragHandleTooltip": "Drag to reorder", - "outline.result.twistTooltip": "AI-Generated Plot Twist", - "outline.result.regenerateTooltip": "Regenerate this section", - "outline.result.addTooltip": "Add section below", - "outline.result.deleteTooltip": "Delete section", - "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", - "outline.error.generationFailed": "Failed to generate content. Please try again.", - "outline.deleteConfirm": "Are you sure you want to delete this outline section?", - "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", "outline.applyOverwriteConfirm": "Your manuscript is not empty. Applying this outline will replace your current manuscript. Are you sure you want to continue?", - "outline.confirm.overwriteTitle": "Overwrite Outline?", - "outline.confirm.overwriteAction": "Overwrite", - "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.applyAction": "Replace", - "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.applyTitle": "Replace Manuscript?", "outline.confirm.deleteAction": "Delete", - "outline.moveUp": "Move section '{{title}}' up", + "outline.confirm.deleteTitle": "Delete Section?", + "outline.confirm.overwriteAction": "Overwrite", + "outline.confirm.overwriteTitle": "Overwrite Outline?", + "outline.deleteConfirm": "Are you sure you want to delete this outline section?", + "outline.description": "Describe your story idea and let AI create a structured, editable outline for you.", + "outline.error.generationFailed": "Failed to generate content. Please try again.", + "outline.idea.generateButton": "Generate Outline", + "outline.idea.genreLabel": "Genre", + "outline.idea.genrePlaceholder": "e.g., Sci-Fi, Fantasy, Mystery", + "outline.idea.promptLabel": "Story Idea / Prompt", + "outline.idea.promptPlaceholder": "e.g., A washed-up detective in a cyberpunk city takes one last case to find a missing android.", + "outline.idea.title": "Your Idea", "outline.moveDown": "Move section '{{title}}' down", + "outline.moveUp": "Move section '{{title}}' up", + "outline.overwriteConfirm": "You already have an outline. Generating a new one will replace it. Are you sure you want to continue?", + "outline.result.addTooltip": "Add section below", + "outline.result.applyButton": "Apply Outline to Manuscript", + "outline.result.body": "Fill out the form on the left and click Generate to see your story structure come to life here.", + "outline.result.deleteTooltip": "Delete section", + "outline.result.dragHandleTooltip": "Drag to reorder", + "outline.result.loading": "Generating your story outline...", + "outline.result.newSectionTitle": "New Section", + "outline.result.placeholder": "Your generated outline will appear here.", + "outline.result.regenerateTooltip": "Regenerate this section", + "outline.result.title": "Interactive Outline", + "outline.result.twistTooltip": "AI-Generated Plot Twist", "outline.selectSection": "Select section '{{title}}'", - "characters.title": "Character Dossiers", - "characters.description": "Build and manage your cast. Click a card to open their full dossier.", - "characters.addNewManually": "Add Manually", - "characters.addNewManuallyHint": "Create a new character from scratch.", - "characters.addNewWithAI": "Generate with AI", - "characters.addNewWithAIHint": "Describe a concept to generate a profile.", - "characters.newCharacterName": "New Character", - "characters.yourCharacters": "Your Characters", - "characters.noCharacters": "No characters created yet.", - "characters.edit.name": "Name", - "characters.edit.backstory": "Backstory", - "characters.edit.motivation": "Motivation", - "characters.edit.appearance": "Appearance", - "characters.edit.notes": "Notes", - "characters.edit.arc": "Character Arc", - "characters.edit.relationships": "Relationships", - "characters.selectCharacter": "Select a character to edit or add a new one.", - "characters.tabs.profile": "Profile", - "characters.tabs.arc": "Character Arc", - "characterGraph.title": "Character Relationship Graph", - "characterGraph.relationships": "Relationships", - "characterGraph.legend": "Legend", - "characterGraph.view.graph": "Graph view", - "characterGraph.view.table": "Table view", - "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "outline.title": "AI Story Outline Generator", "characterGraph.graphAriaLabel": "Interactive relationship graph between characters", + "characterGraph.legend": "Legend", + "characterGraph.relationships": "Relationships", "characterGraph.table.caption": "Relationships as an accessible table", + "characterGraph.table.empty": "No relationships yet.", + "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", "characterGraph.table.from": "From", + "characterGraph.table.strength": "Strength", "characterGraph.table.to": "To", "characterGraph.table.type": "Type", - "characterGraph.table.strength": "Strength", - "characterGraph.table.empty": "No relationships yet.", - "characterGraph.table.emptyHint": "Add relationships between characters in their detail panels to see them here.", - "characters.tabs.relationships": "Relationships", - "characters.tabs.notes": "Notes", - "characters.dossier.title": "Dossier: {{name}}", + "characterGraph.title": "Character Relationship Graph", + "characterGraph.view.graph": "Graph view", + "characterGraph.view.graphKeyboardHint": "Interactive canvas — not keyboard-navigable. Press G to switch to the accessible table view.", + "characterGraph.view.table": "Table view", + "characters.addNewManually": "Add Manually", + "characters.addNewManuallyHint": "Create a new character from scratch.", + "characters.addNewWithAI": "Generate with AI", + "characters.addNewWithAIHint": "Describe a concept to generate a profile.", + "characters.aiModal.button": "Generate Profile", + "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", + "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", + "characters.aiModal.title": "Generate Character with AI", + "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", + "characters.deleteLabel": "Delete {{name}}", + "characters.description": "Build and manage your cast. Click a card to open their full dossier.", + "characters.dossier.refineButton": "Refine with AI", "characters.dossier.refineLabel": "Refine Portrait", "characters.dossier.refinePlaceholder": "e.g., 'Add a scar', 'make hair red'", - "characters.dossier.refineButton": "Refine with AI", - "characters.edit.personality": "Personality Traits", + "characters.dossier.title": "Dossier: {{name}}", + "characters.edit.appearance": "Appearance", + "characters.edit.arc": "Character Arc", + "characters.edit.backstory": "Backstory", "characters.edit.flaws": "Flaws", "characters.edit.generateFullProfile": "Generate Full Profile with AI", - "characters.edit.regenerate": "Regenerate", - "characters.edit.portrait.title": "Character Portrait", + "characters.edit.motivation": "Motivation", + "characters.edit.name": "Name", + "characters.edit.notes": "Notes", + "characters.edit.personality": "Personality Traits", "characters.edit.portrait.generateButton": "Generate / Regenerate", "characters.edit.portrait.generating": "Generating...", - "characters.aiModal.title": "Generate Character with AI", - "characters.aiModal.description": "Provide a core concept and AI will create a detailed profile, including backstory, motivation, appearance, and more.", - "characters.aiModal.placeholder": "e.g., 'A grizzled space pirate with a secret heart of gold'", - "characters.aiModal.button": "Generate Profile", - "characters.loading.profile": "Generating detailed profile...", - "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", "characters.edit.portrait.styleLabel": "Art Style", - "characters.edit.portrait.styles.digitalPainting": "Digital Painting", - "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.anime": "Anime", "characters.edit.portrait.styles.cartoon": "Cartoon", - "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.styles.comicBook": "Comic Book", + "characters.edit.portrait.styles.digitalPainting": "Digital Painting", "characters.edit.portrait.styles.oilPainting": "Oil Painting", + "characters.edit.portrait.styles.photorealistic": "Photorealistic", "characters.edit.portrait.styles.sketch": "Sketch", - "characters.edit.portrait.styles.comicBook": "Comic Book", - "characters.deleteLabel": "Delete {{name}}", - "characters.deleteConfirm": "Are you sure you want to permanently delete this character? This action cannot be undone.", - "characters.uploadImage": "Upload Image", + "characters.edit.portrait.styles.watercolor": "Watercolor", + "characters.edit.portrait.title": "Character Portrait", + "characters.edit.regenerate": "Regenerate", + "characters.edit.relationships": "Relationships", "characters.editorTabsAriaLabel": "Character editor tabs", - "characters.stats.total": "Total", + "characters.error.portraitFailed": "Portrait generation failed. Try adding more detail to the appearance description.", + "characters.loading.profile": "Generating detailed profile...", + "characters.newCharacterName": "New Character", + "characters.noCharacters": "No characters created yet.", + "characters.searchAriaLabel": "Search characters by name", + "characters.searchPlaceholder": "Search characters…", + "characters.selectCharacter": "Select a character to edit or add a new one.", + "characters.stats.avgCompleteness": "Avg. complete", "characters.stats.developed": "Developed", + "characters.stats.total": "Total", "characters.stats.withPortrait": "With portrait", - "characters.stats.avgCompleteness": "Avg. complete", - "characters.searchPlaceholder": "Search characters…", - "characters.searchAriaLabel": "Search characters by name", - "worlds.title": "World Atlas", - "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", + "characters.tabs.arc": "Character Arc", + "characters.tabs.notes": "Notes", + "characters.tabs.profile": "Profile", + "characters.tabs.relationships": "Relationships", + "characters.title": "Character Dossiers", + "characters.uploadImage": "Upload Image", + "characters.yourCharacters": "Your Characters", "worlds.addNewManually": "Add Manually", "worlds.addNewManuallyHint": "Create a new world from scratch.", "worlds.addNewWithAI": "Generate with AI", "worlds.addNewWithAIHint": "Describe a concept to generate a world profile.", - "worlds.newWorldName": "New World", - "worlds.yourWorlds": "Your Worlds", - "worlds.noWorlds": "No worlds created yet.", - "worlds.edit.name": "Name", - "worlds.edit.description": "Core Description", - "worlds.edit.history": "History", - "worlds.edit.geography": "Geography", - "worlds.edit.magicSystem": "Magic / Technology System", - "worlds.edit.culture": "Culture", - "worlds.edit.notes": "Notes", - "worlds.edit.ambianceImage": "Ambiance Image", - "worlds.edit.generateImageButton": "Generate / Regenerate Image", - "worlds.edit.generatingImage": "Generating...", - "worlds.edit.generateFullProfile": "Generate Full Profile with AI", - "worlds.selectWorld": "Select a world to edit or add a new one.", - "worlds.tabs.overview": "Overview", - "worlds.tabs.details": "Details", - "worlds.tabs.timeline": "History & Timeline", - "worlds.tabs.locations": "Locations", - "worlds.tabs.notes": "Notes", - "worlds.atlas.title": "Atlas: {{name}}", + "worlds.aiModal.button": "Generate Profile", + "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", + "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", + "worlds.aiModal.title": "Generate World with AI", + "worlds.atlas.refineButton": "Refine with AI", "worlds.atlas.refineLabel": "Refine Ambiance Image", "worlds.atlas.refinePlaceholder": "e.g., 'Add a second moon', 'make it winter'", - "worlds.atlas.refineButton": "Refine with AI", + "worlds.atlas.title": "Atlas: {{name}}", + "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", + "worlds.deleteLabel": "Delete {{name}}", + "worlds.description": "Create and manage the settings of your story. Click a card to open the atlas.", "worlds.edit.addEvent": "Add Timeline Event", "worlds.edit.addLocation": "Add Location", + "worlds.edit.ambianceImage": "Ambiance Image", + "worlds.edit.culture": "Culture", + "worlds.edit.description": "Core Description", "worlds.edit.eraPlaceholder": "Era / Date", "worlds.edit.eventPlaceholder": "Event description...", - "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.generateFullProfile": "Generate Full Profile with AI", + "worlds.edit.generateImageButton": "Generate / Regenerate Image", + "worlds.edit.generatingImage": "Generating...", + "worlds.edit.geography": "Geography", + "worlds.edit.history": "History", "worlds.edit.locationDescPlaceholder": "Location description...", - "worlds.aiModal.title": "Generate World with AI", - "worlds.aiModal.description": "Provide a core concept and AI will create a detailed profile, including history, geography, culture, and more.", - "worlds.aiModal.placeholder": "e.g., 'A steampunk city powered by captured lightning'", - "worlds.aiModal.button": "Generate Profile", - "worlds.loading.profile": "Generating detailed world profile...", - "worlds.deleteConfirm": "Are you sure you want to delete this world? This action cannot be undone.", - "worlds.deleteLabel": "Delete {{name}}", - "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", - "worlds.uploadImage": "Upload Image", + "worlds.edit.locationNamePlaceholder": "Location Name", + "worlds.edit.magicSystem": "Magic / Technology System", + "worlds.edit.name": "Name", + "worlds.edit.notes": "Notes", "worlds.editorTabsAriaLabel": "World editor tabs", - "worlds.stats.total": "Total", + "worlds.error.imageFailed": "Ambiance image generation failed. Please try adding more detail to the world description or check your connection.", + "worlds.loading.profile": "Generating detailed world profile...", + "worlds.newWorldName": "New World", + "worlds.noWorlds": "No worlds created yet.", + "worlds.searchAriaLabel": "Search worlds by name", + "worlds.searchPlaceholder": "Search worlds…", + "worlds.selectWorld": "Select a world to edit or add a new one.", + "worlds.stats.avgCompleteness": "Avg. complete", "worlds.stats.developed": "Developed", "worlds.stats.locations": "Locations", - "worlds.stats.avgCompleteness": "Avg. complete", - "worlds.searchPlaceholder": "Search worlds…", - "worlds.searchAriaLabel": "Search worlds by name", - "export.title": "Export Publishing Suite", - "export.description": "Select content, choose a format, and download your project.", - "export.options.title": "Export Controls", - "export.options.downloadButton": "Download File", - "export.options.copied": "Copied!", - "export.preview.title": "Live Preview", - "export.preview.noContent": "Select content to see a preview.", - "export.loglineLabel": "Logline", - "export.charactersLabel": "Characters", + "worlds.stats.total": "Total", + "worlds.tabs.details": "Details", + "worlds.tabs.locations": "Locations", + "worlds.tabs.notes": "Notes", + "worlds.tabs.overview": "Overview", + "worlds.tabs.timeline": "History & Timeline", + "worlds.title": "World Atlas", + "worlds.uploadImage": "Upload Image", + "worlds.yourWorlds": "Your Worlds", + "export.ai.generateButton": "Generate Synopsis", + "export.ai.generating": "Generating...", + "export.ai.synopsis": "Generate AI Synopsis", + "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", + "export.ai.synopsisTitle": "Synopsis", + "export.ai.title": "AI Enhancements", "export.appearanceLabel": "Appearance", - "export.motivationLabel": "Motivation", "export.backstoryLabel": "Backstory", - "export.notesLabel": "Notes", - "export.worldsLabel": "Worlds", - "export.descriptionLabel": "Description", - "export.historyLabel": "History", - "export.geographyLabel": "Geography", - "export.magicSystemLabel": "Magic/Tech System", - "export.manuscriptLabel": "Manuscript", - "export.emptySection": "Empty section", + "export.charactersLabel": "Characters", + "export.compileProfile.acknowledgements": "Acknowledgements", + "export.compileProfile.dedication": "Dedication", + "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", + "export.compileProfile.imprint": "Imprint / colophon", + "export.compileProfile.title": "Front & back matter (Markdown)", + "export.compileProfile.titlePage": "Title page", + "export.compileWizard.back": "Back", + "export.compileWizard.flagOff": "Excluded", + "export.compileWizard.flagOn": "Included", + "export.compileWizard.next": "Next", + "export.compileWizard.openButton": "Compile wizard…", + "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", + "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", + "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", + "export.compileWizard.reviewCharsWorlds": "Characters / worlds", + "export.compileWizard.reviewFormat": "Format", + "export.compileWizard.reviewManuscript": "Manuscript", + "export.compileWizard.reviewTitle": "Title & logline", + "export.compileWizard.runExport": "Export now", + "export.compileWizard.stepPreset": "Choose a preset", + "export.compileWizard.stepReview": "Review & export", + "export.compileWizard.title": "Compile wizard", + "export.content.characters": "Characters", + "export.content.manuscript": "Manuscript", "export.content.title": "Content Selection", "export.content.titleAndLogline": "Project Title & Logline", - "export.content.characters": "Characters", "export.content.worlds": "Worlds", - "export.content.manuscript": "Manuscript", - "export.ai.title": "AI Enhancements", - "export.ai.synopsis": "Generate AI Synopsis", - "export.ai.synopsisTitle": "Synopsis", - "export.ai.generating": "Generating...", - "export.ai.generateButton": "Generate Synopsis", - "export.ai.synopsisPlaceholder": "The AI generated synopsis will appear here. You can edit it before exporting.", - "export.format.title": "Formatting", + "export.description": "Select content, choose a format, and download your project.", + "export.descriptionLabel": "Description", + "export.emptySection": "Empty section", + "export.error.epubFailed": "EPUB export failed: ", + "export.error.exportFailed": "Export failed", + "export.export": "Export", + "export.exportFailed": "Export failed", + "export.exportFormat": "Export Format", + "export.exportModalTitle": "Export Project", + "export.exportProject": "Export Project", + "export.exportSuccess": "Project exported successfully", + "export.format.docx": "Word Document (.docx)", + "export.format.double": "Double", + "export.format.font": "Font", + "export.format.fontSize": "Font Size", "export.format.format": "Format", + "export.format.lineSpacing": "Line Spacing", "export.format.md": "Markdown (.md)", - "export.format.txt": "Plain Text (.txt)", + "export.format.normTxt": "Norm pages (.txt, DE 60×30)", "export.format.pdf": "PDF (.pdf)", "export.format.pdfOptions": "PDF Options", - "export.format.font": "Font", - "export.format.fontSize": "Font Size", - "export.format.lineSpacing": "Line Spacing", - "export.format.double": "Double", "export.format.single": "Single", + "export.format.title": "Formatting", "export.format.titlePage": "Include Title Page", - "export.format.normTxt": "Norm pages (.txt, DE 60×30)", - "export.compileProfile.title": "Front & back matter (Markdown)", - "export.compileProfile.titlePage": "Title page", - "export.compileProfile.dedication": "Dedication", - "export.compileProfile.imprint": "Imprint / colophon", - "export.compileProfile.acknowledgements": "Acknowledgements", - "export.compileProfile.hint": "Used in Markdown export and EPUB 3 compile; manuscript text is unchanged.", - "export.toggleSection": "Toggle visibility for {{title}}", - "export.importProject": "Import Project", - "export.exportProject": "Export Project", - "export.importModalTitle": "Import Project", - "export.exportModalTitle": "Export Project", - "export.importFormat": "Import Format", - "export.exportFormat": "Export Format", + "export.format.txt": "Plain Text (.txt)", + "export.geographyLabel": "Geography", + "export.historyLabel": "History", "export.import": "Import", - "export.export": "Export", - "export.importSuccess": "Project imported successfully", - "export.exportSuccess": "Project exported successfully", "export.importFailed": "Import failed", - "export.exportFailed": "Export failed", + "export.importFormat": "Import Format", + "export.importModalTitle": "Import Project", + "export.importProject": "Import Project", + "export.importSuccess": "Project imported successfully", + "export.loglineLabel": "Logline", + "export.magicSystemLabel": "Magic/Tech System", + "export.manuscriptLabel": "Manuscript", + "export.motivationLabel": "Motivation", + "export.notesLabel": "Notes", + "export.options.copied": "Copied!", + "export.options.downloadButton": "Download File", + "export.options.title": "Export Controls", "export.pasteSection.collapse": "Collapse", - "export.pasteSection.expand": "Paste text", - "export.pasteSection.titlePlaceholder": "Chapter title (optional)", - "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", - "export.pasteSection.importAsChapter": "Import as chapter", - "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.copied": "Markdown copied — paste into Notion or Google Docs", + "export.pasteSection.copyAsMarkdown": "Copy as Markdown for Notion / Google Docs", "export.pasteSection.defaultTitle": "Pasted content", - "export.format.docx": "Word Document (.docx)", - "export.error.epubFailed": "EPUB export failed: ", - "export.error.exportFailed": "Export failed", - "export.compileWizard.openButton": "Compile wizard…", - "export.compileWizard.title": "Compile wizard", - "export.compileWizard.stepPreset": "Choose a preset", - "export.compileWizard.stepReview": "Review & export", - "export.compileWizard.next": "Next", - "export.compileWizard.back": "Back", - "export.compileWizard.runExport": "Export now", - "export.compileWizard.reviewFormat": "Format", - "export.compileWizard.reviewTitle": "Title & logline", - "export.compileWizard.reviewManuscript": "Manuscript", - "export.compileWizard.reviewCharsWorlds": "Characters / worlds", - "export.compileWizard.flagOn": "Included", - "export.compileWizard.flagOff": "Excluded", - "export.compileWizard.presets.novelPdf": "Novel manuscript (PDF)", - "export.compileWizard.presets.fullMd": "Full project archive (Markdown)", - "export.compileWizard.presets.ebookEpub": "eBook chapters (EPUB)", - "export.compileWizard.presets.normTxt": "Norm manuscript (.txt)", + "export.pasteSection.expand": "Paste text", "export.pasteSection.heading": "Google Docs / Notion", + "export.pasteSection.importAsChapter": "Import as chapter", + "export.pasteSection.textPlaceholder": "Paste text from Google Docs or Notion here (Ctrl+V)...", + "export.pasteSection.titlePlaceholder": "Chapter title (optional)", + "export.preview.noContent": "Select content to see a preview.", + "export.preview.title": "Live Preview", + "export.title": "Export Publishing Suite", + "export.toggleSection": "Toggle visibility for {{title}}", + "export.worldsLabel": "Worlds", "settings.about.description": "Your AI-powered creative partner for writing.", "settings.about.githubDescription": "View source code, report issues, and contribute.", "settings.about.githubLabel": "Open-source on GitHub", @@ -1793,8 +1795,8 @@ "settings.language.hebrew": "Hebrew (beta)", "settings.language.italian": "Italian", "settings.language.japanese": "Japanese (beta)", - "settings.language.spanish": "Spanish", "settings.language.portuguese": "Portuguese (beta)", + "settings.language.spanish": "Spanish", "settings.language.title": "Language & Region", "settings.loraAdapters.deleteBtn": "Delete", "settings.loraAdapters.description": "Load LoRA fine-tuning adapters for local WebLLM models. Adapters are stored in your browser and never sent to the cloud.", @@ -2131,212 +2133,212 @@ "help.writing.templates.title": "Working with Templates", "help.writing.writer.content": "

AI Writing Studio Workflow

The AI Writing Studio is your dedicated space for AI-assisted drafting, editing, and brainstorming. The workflow is designed so AI assistance always flows through a scratchpad — you stay in control before anything touches your manuscript.

  1. Select a section: Use the section dropdown at the top of the Writer panel to pick which manuscript chapter you are working on. The editor scrolls to that section automatically.
  2. Pick a tool: Choose from Continue Writing, Improve Text, Change Tone, Generate Dialogue, Brainstorm, Summarize, or Critic. Each tool has a different purpose — hover any tool icon for a one-line description.
  3. Enable RAG context (optional): Toggle Use RAG context in the toolbar to have the AI draw on relevant passages from your manuscript before generating. This produces more consistent, story-aware output. The chunk badge shows how many passages were retrieved.
  4. Generate: Click the Generate button. Progress is shown in the scratchpad; streaming output appears token by token so you can stop early if the direction is wrong.
  5. Edit the scratchpad: The generated text lands in the editable scratchpad below the tools. Refine it directly — fix names, change phrasing, trim length — before accepting.
  6. Insert or Replace: Click Insert at cursor to add the scratchpad text after your current cursor position, or Replace selection to swap out the highlighted text you started with.

Hybrid fallback chains (Settings → Advanced AI → Hybrid fallback) retry additional providers automatically if the primary returns a rate-limit or network error.

", "help.writing.writer.title": "AI Writing Studio workflow", - "objects.title": "Story Objects", - "objects.subtitle": "Manage props, artifacts, and inventory", - "objects.emptyState": "No objects yet. Add your first prop or artifact.", - "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", - "objects.addObject": "Add Object", "objects.addGroup": "Add Group", - "objects.editObject": "Edit Object", - "objects.editGroup": "Edit Group", - "objects.deleteObject": "Delete Object", + "objects.addObject": "Add Object", + "objects.allGroups": "All Groups", + "objects.assignToGroup": "Assign to Group", + "objects.cancel": "Cancel", "objects.deleteGroup": "Delete Group", - "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.deleteGroupConfirm": "Delete this group? Objects will be ungrouped.", - "objects.tabObjects": "Objects", - "objects.tabGroups": "Groups", - "objects.name": "Name", - "objects.namePlaceholder": "Object name…", + "objects.deleteObject": "Delete Object", + "objects.deleteObjectConfirm": "Delete this object? This cannot be undone.", "objects.description": "Description", "objects.descriptionPlaceholder": "What is this object?", - "objects.type": "Type", - "objects.significance": "Significance", - "objects.significancePlaceholder": "Why does this object matter to the story?", - "objects.notes": "Notes", - "objects.notesPlaceholder": "Additional notes…", - "objects.groupName": "Group Name", - "objects.groupNamePlaceholder": "Group name…", + "objects.editGroup": "Edit Group", + "objects.editObject": "Edit Object", + "objects.emptyGroupsState": "No groups yet. Create a group to organize objects.", + "objects.emptyState": "No objects yet. Add your first prop or artifact.", + "objects.filterByGroup": "Filter by group", + "objects.groupColor": "Color", "objects.groupDescription": "Group Description", "objects.groupDescriptionPlaceholder": "What do these objects have in common?", - "objects.groupColor": "Color", - "objects.assignToGroup": "Assign to Group", - "objects.removeFromGroup": "Remove from Group", + "objects.groupName": "Group Name", + "objects.groupNamePlaceholder": "Group name…", "objects.linkedCharacters": "Linked Characters", "objects.linkedScenes": "Linked Scenes", + "objects.name": "Name", + "objects.namePlaceholder": "Object name…", "objects.noCharacters": "No characters linked", "objects.noScenes": "No scenes linked", - "objects.typeLabel.prop": "Prop", - "objects.typeLabel.weapon": "Weapon", - "objects.typeLabel.vehicle": "Vehicle", - "objects.typeLabel.artifact": "Artifact", - "objects.typeLabel.document": "Document", - "objects.typeLabel.place-item": "Place Item", - "objects.typeLabel.other": "Other", + "objects.notes": "Notes", + "objects.notesPlaceholder": "Additional notes…", + "objects.objectCount": "{count} object", + "objects.objectCountPlural": "{count} objects", + "objects.removeFromGroup": "Remove from Group", "objects.save": "Save", - "objects.cancel": "Cancel", "objects.search": "Search objects…", - "objects.filterByGroup": "Filter by group", - "objects.allGroups": "All Groups", + "objects.significance": "Significance", + "objects.significancePlaceholder": "Why does this object matter to the story?", + "objects.subtitle": "Manage props, artifacts, and inventory", + "objects.tabGroups": "Groups", + "objects.tabObjects": "Objects", + "objects.title": "Story Objects", + "objects.type": "Type", + "objects.typeLabel.artifact": "Artifact", + "objects.typeLabel.document": "Document", + "objects.typeLabel.other": "Other", + "objects.typeLabel.place-item": "Place Item", + "objects.typeLabel.prop": "Prop", + "objects.typeLabel.vehicle": "Vehicle", + "objects.typeLabel.weapon": "Weapon", "objects.ungrouped": "Ungrouped", - "objects.objectCount": "{count} object", - "objects.objectCountPlural": "{count} objects", - "mindmap.title": "Mind Maps", - "mindmap.subtitle": "Visualize story connections and ideas", - "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.addEdge": "Add Edge", "mindmap.addMap": "New Map", - "mindmap.editMap": "Edit Map", + "mindmap.addNode": "Add Node", + "mindmap.cancel": "Cancel", + "mindmap.deleteEdge": "Delete Edge", "mindmap.deleteMap": "Delete Map", "mindmap.deleteMapConfirm": "Delete this mind map? This cannot be undone.", - "mindmap.mapName": "Map Name", - "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.deleteNode": "Delete Node", + "mindmap.edgeDirection": "Direction", + "mindmap.edgeDirectionBi": "Two-way", + "mindmap.edgeDirectionUni": "One-way", + "mindmap.edgeLabel": "Edge Label", + "mindmap.edgeStyle": "Style", + "mindmap.edgeStyleDotted": "Dotted", + "mindmap.edgeStyleSolid": "Solid", + "mindmap.editMap": "Edit Map", + "mindmap.editNode": "Edit Node", + "mindmap.emptyState": "No mind maps yet. Create your first map.", + "mindmap.linkedEntity": "Linked Entity", + "mindmap.linkedEntityType": "Entity Type", + "mindmap.linkedEntityTypePlaceholder": "Select entity type…", "mindmap.mapDescription": "Description", "mindmap.mapDescriptionPlaceholder": "What is this map about?", - "mindmap.addNode": "Add Node", - "mindmap.editNode": "Edit Node", - "mindmap.deleteNode": "Delete Node", + "mindmap.mapName": "Map Name", + "mindmap.mapNamePlaceholder": "Map name…", + "mindmap.nodeColor": "Color", + "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.nodeLabel": "Label", "mindmap.nodeLabelPlaceholder": "Node label…", - "mindmap.nodeType": "Type", - "mindmap.nodeTypeFree": "Free", - "mindmap.nodeTypeLinked": "Linked", + "mindmap.nodeNotes": "Notes", + "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", "mindmap.nodeShape": "Shape", "mindmap.nodeShapeCircle": "Circle", - "mindmap.nodeShapeRectangle": "Rectangle", "mindmap.nodeShapeDiamond": "Diamond", "mindmap.nodeShapeEllipse": "Ellipse", "mindmap.nodeShapeHexagon": "Hexagon", - "mindmap.nodeColor": "Color", - "mindmap.nodeNotes": "Notes", - "mindmap.nodeNotesPlaceholder": "Additional notes about this node…", - "mindmap.linkedEntity": "Linked Entity", - "mindmap.linkedEntityType": "Entity Type", - "mindmap.linkedEntityTypePlaceholder": "Select entity type…", - "mindmap.addEdge": "Add Edge", - "mindmap.deleteEdge": "Delete Edge", - "mindmap.edgeLabel": "Edge Label", - "mindmap.edgeStyle": "Style", - "mindmap.edgeStyleSolid": "Solid", - "mindmap.edgeStyleDotted": "Dotted", - "mindmap.edgeDirection": "Direction", - "mindmap.edgeDirectionUni": "One-way", - "mindmap.edgeDirectionBi": "Two-way", - "mindmap.zoomIn": "Zoom in", - "mindmap.zoomOut": "Zoom out", + "mindmap.nodeShapeRectangle": "Rectangle", + "mindmap.nodeType": "Type", + "mindmap.nodeTypeFree": "Free", + "mindmap.nodeTypeLinked": "Linked", "mindmap.resetViewport": "Reset view", - "mindmap.nodeCountWarning": "This map has over 500 nodes. Performance may be affected.", "mindmap.save": "Save", - "mindmap.cancel": "Cancel", - "characterInterviews.title": "Character Interviews", - "characterInterviews.subtitle": "Interview your characters in character voice", - "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", - "characterInterviews.selectCharacter": "Select Character", - "characterInterviews.selectCharacterPlaceholder": "Choose a character…", - "characterInterviews.selectArchetype": "Select Archetype", - "characterInterviews.archetypeLabel": "Archetype", + "mindmap.subtitle": "Visualize story connections and ideas", + "mindmap.title": "Mind Maps", + "mindmap.zoomIn": "Zoom in", + "mindmap.zoomOut": "Zoom out", + "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeDescription": "The archetype determines the interview template and character voice.", - "characterInterviews.startInterview": "Start Interview", - "characterInterviews.newInterview": "New Interview", - "characterInterviews.deleteInterview": "Delete Interview", - "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", - "characterInterviews.interviewTitle": "Interview Title", - "characterInterviews.interviewTitlePlaceholder": "Optional title…", - "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", - "characterInterviews.sendQuestion": "Send", - "characterInterviews.questionPlaceholder": "Ask a question…", - "characterInterviews.suggestedQuestions": "Suggested Questions", - "characterInterviews.customQuestion": "Custom Question", - "characterInterviews.thinking": "Thinking…", - "characterInterviews.stopGeneration": "Stop", + "characterInterviews.archetypeHerald": "Herald", "characterInterviews.archetypeHero": "Hero", + "characterInterviews.archetypeLabel": "Archetype", "characterInterviews.archetypeMentor": "Mentor", - "characterInterviews.archetypeVillain": "Villain", "characterInterviews.archetypeShadow": "Shadow", - "characterInterviews.archetypeTrickster": "Trickster", "characterInterviews.archetypeShapeshifter": "Shapeshifter", - "characterInterviews.archetypeHerald": "Herald", - "characterInterviews.archetypeAlly": "Ally", "characterInterviews.archetypeThresholdGuardian": "Threshold Guardian", - "characterInterviews.messageRoleUser": "Interviewer", - "characterInterviews.messageRoleAi": "Character", + "characterInterviews.archetypeTrickster": "Trickster", + "characterInterviews.archetypeVillain": "Villain", + "characterInterviews.cancel": "Cancel", "characterInterviews.copyResponse": "Copy response", - "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.customQuestion": "Custom Question", + "characterInterviews.deleteInterview": "Delete Interview", + "characterInterviews.deleteInterviewConfirm": "Delete this interview? This cannot be undone.", + "characterInterviews.emptyState": "No interviews yet. Select a character to begin.", + "characterInterviews.interviewTitle": "Interview Title", + "characterInterviews.interviewTitlePlaceholder": "Optional title…", "characterInterviews.interviewsForCharacter": "Interviews for {{name}}", + "characterInterviews.messageRoleAi": "Character", + "characterInterviews.messageRoleUser": "Interviewer", + "characterInterviews.newInterview": "New Interview", + "characterInterviews.noAiKey": "No AI key configured. Add a Gemini API key in Settings to use interviews.", + "characterInterviews.noCharacters": "No characters found. Add characters in the Characters view first.", + "characterInterviews.questionPlaceholder": "Ask a question…", "characterInterviews.save": "Save", - "characterInterviews.cancel": "Cancel", - "lora.title": "LoRA Fine-Tuning", - "lora.onboarding.title": "Train Your Writing Style", - "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", - "lora.onboarding.privacyPromise": "100% Private & Offline", - "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", - "lora.onboarding.systemCheck": "System Requirements", - "lora.onboarding.checking": "Checking your environment…", - "lora.onboarding.installed": "installed", - "lora.onboarding.notFound": "not found", - "lora.onboarding.installCmd": "pip install unsloth trl peft", - "lora.onboarding.cpuFallback": "CPU fallback (slower)", - "lora.onboarding.getStarted": "Get Started", - "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", - "lora.library.title": "Adapter Library", - "lora.library.empty": "No adapters yet. Train your first style model to get started.", - "lora.wizard.title": "Training Wizard", - "lora.wizard.trainNew": "Train New Adapter", - "lora.wizard.startFirstTraining": "Train Your First Adapter", - "lora.wizard.abort": "Stop Training", - "lora.wizard.steps.label": "Training steps", - "lora.wizard.steps.model": "Model", - "lora.wizard.steps.dataset": "Dataset", - "lora.wizard.steps.params": "Parameters", - "lora.wizard.steps.train": "Train", - "lora.wizard.steps.deploy": "Deploy", - "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", - "lora.wizard.model.selectModel": "Select base model", - "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", - "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", - "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", - "lora.wizard.training.ready": "Click Next to begin training with your selected settings.", - "lora.wizard.deploy.title": "Training Complete!", - "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", - "lora.wizard.deploy.activated": "{{name}} is now active.", - "lora.presets.writerStyleLight.label": "Writer Style Light", - "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", - "lora.presets.deepNarrative.label": "Deep Narrative", - "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", - "lora.presets.dialogueMaster.label": "Dialogue Master", - "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", - "lora.presets.fullStyleClone.label": "Full Style Clone", - "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", - "lora.adapter.active": "Active", + "characterInterviews.selectArchetype": "Select Archetype", + "characterInterviews.selectCharacter": "Select Character", + "characterInterviews.selectCharacterPlaceholder": "Choose a character…", + "characterInterviews.sendQuestion": "Send", + "characterInterviews.startInterview": "Start Interview", + "characterInterviews.stopGeneration": "Stop", + "characterInterviews.subtitle": "Interview your characters in character voice", + "characterInterviews.suggestedQuestions": "Suggested Questions", + "characterInterviews.thinking": "Thinking…", + "characterInterviews.title": "Character Interviews", "lora.adapter.activate": "Activate", + "lora.adapter.active": "Active", "lora.adapter.deactivate": "Deactivate", - "lora.adapter.merge": "Merge", - "lora.adapter.export": "Export", "lora.adapter.delete": "Delete", + "lora.adapter.export": "Export", + "lora.adapter.merge": "Merge", "lora.adapter.version": "Version", - "lora.evaluation.title": "Style Evaluation", - "lora.evaluation.score": "Style Consistency Score", - "lora.evaluation.compare": "Side-by-Side Comparison", - "lora.evaluation.run": "Run Evaluation", - "lora.evaluation.evaluating": "Evaluating…", - "lora.evaluation.baseline": "Baseline", - "lora.evaluation.improvement": "Improvement", - "lora.evaluation.base": "Base Model", - "lora.evaluation.adapted": "Style-Adapted", - "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", - "lora.dataset.title": "Dataset Builder", - "lora.dataset.extract": "Extract from Manuscript", - "lora.dataset.extracting": "Extracting…", + "lora.dataset.accepted": "Accepted", + "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", + "lora.dataset.entries": "Dataset entries", "lora.dataset.export": "Export", - "lora.dataset.synthetic": "synthetic", + "lora.dataset.extract": "Extract from Manuscript", "lora.dataset.extracted": "extracted", - "lora.dataset.empty": "No dataset yet. Extract scenes from your manuscript to create training data.", - "lora.dataset.total": "Total", - "lora.dataset.accepted": "Accepted", + "lora.dataset.extracting": "Extracting…", "lora.dataset.flagged": "Flagged", - "lora.dataset.rejected": "Rejected", "lora.dataset.notEnough": "You need at least 50 accepted entries before training. Try generating synthetic pairs.", - "lora.dataset.entries": "Dataset entries", - "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", + "lora.dataset.rejected": "Rejected", + "lora.dataset.synthetic": "synthetic", + "lora.dataset.title": "Dataset Builder", + "lora.dataset.total": "Total", + "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model.", "lora.errors.insufficientVram": "Insufficient VRAM for this preset. This preset requires {{required}} GB.", + "lora.errors.pythonNotFound": "Python 3 not found. Install Python ≥ 3.10 and add it to your PATH.", "lora.errors.trainingFailed": "Training failed: {{message}}", - "lora.errors.cloudBlocked": "Cloud-hosted models cannot be used for training. Select a local model." + "lora.evaluation.adapted": "Style-Adapted", + "lora.evaluation.base": "Base Model", + "lora.evaluation.baseline": "Baseline", + "lora.evaluation.compare": "Side-by-Side Comparison", + "lora.evaluation.evaluating": "Evaluating…", + "lora.evaluation.improvement": "Improvement", + "lora.evaluation.noActiveAdapter": "Activate an adapter to run evaluation.", + "lora.evaluation.run": "Run Evaluation", + "lora.evaluation.score": "Style Consistency Score", + "lora.evaluation.title": "Style Evaluation", + "lora.library.empty": "No adapters yet. Train your first style model to get started.", + "lora.library.title": "Adapter Library", + "lora.onboarding.checking": "Checking your environment…", + "lora.onboarding.cpuFallback": "CPU fallback (slower)", + "lora.onboarding.description": "Create a personalized AI model trained on your manuscripts. Your data never leaves your device.", + "lora.onboarding.envError": "Environment check failed. Please ensure Python and required packages are installed.", + "lora.onboarding.getStarted": "Get Started", + "lora.onboarding.installCmd": "pip install unsloth trl peft", + "lora.onboarding.installed": "installed", + "lora.onboarding.notFound": "not found", + "lora.onboarding.privacyDetail": "All training happens locally. Your manuscript is never sent to any cloud service.", + "lora.onboarding.privacyPromise": "100% Private & Offline", + "lora.onboarding.systemCheck": "System Requirements", + "lora.onboarding.title": "Train Your Writing Style", + "lora.presets.deepNarrative.desc": "Full narrative style — ~60 min, 12 GB VRAM", + "lora.presets.deepNarrative.label": "Deep Narrative", + "lora.presets.dialogueMaster.desc": "Dialogue-optimised — ~45 min, 8 GB VRAM", + "lora.presets.dialogueMaster.label": "Dialogue Master", + "lora.presets.fullStyleClone.desc": "Maximum fidelity — ~90 min, 16 GB VRAM", + "lora.presets.fullStyleClone.label": "Full Style Clone", + "lora.presets.writerStyleLight.desc": "Quick accent transfer — ~30 min, 8 GB VRAM", + "lora.presets.writerStyleLight.label": "Writer Style Light", + "lora.title": "LoRA Fine-Tuning", + "lora.wizard.abort": "Stop Training", + "lora.wizard.dataset.instruction": "Extract your manuscript scenes as training data. You need at least 50 quality entries before training.", + "lora.wizard.deploy.activated": "{{name}} is now active.", + "lora.wizard.deploy.description": "Your adapter is ready. Activate it to use in ProForge or the AI writing studio.", + "lora.wizard.deploy.title": "Training Complete!", + "lora.wizard.model.description": "Choose a base model. Larger models produce better style transfer but require more VRAM and time.", + "lora.wizard.model.selectModel": "Select base model", + "lora.wizard.params.description": "Choose a preset optimized for your use case. DoRA and rslora outperform classic LoRA for style transfer.", + "lora.wizard.startFirstTraining": "Train Your First Adapter", + "lora.wizard.steps.dataset": "Dataset", + "lora.wizard.steps.deploy": "Deploy", + "lora.wizard.steps.label": "Training steps", + "lora.wizard.steps.model": "Model", + "lora.wizard.steps.params": "Parameters", + "lora.wizard.steps.train": "Train", + "lora.wizard.title": "Training Wizard", + "lora.wizard.trainNew": "Train New Adapter", + "lora.wizard.training.inProgress": "Training in progress… This may take 30–90 minutes.", + "lora.wizard.training.ready": "Click Next to begin training with your selected settings." } diff --git a/services/tauriDeepLink.ts b/services/tauriDeepLink.ts new file mode 100644 index 000000000..88eaa56d4 --- /dev/null +++ b/services/tauriDeepLink.ts @@ -0,0 +1,144 @@ +/** + * Tauri Deep Link Service — handles native file associations and single-instance behavior. + * QNBS-v3: Listens for `deep-link://new-url` events emitted from the deep-link plugin + * when a .storycraft or .scst file is double-clicked or dragged onto the app icon. + * Integrates with the existing importProjectThunk flow for seamless project loading. + */ + +import type { AppDispatch } from '../app/store'; +import { importProjectThunk } from '../features/project/thunks/projectManagementThunks'; +import { statusActions } from '../features/status/statusSlice'; +import type { I18nTranslate } from './commands/commandTypes'; +import { createLogger } from './logger'; +import { isTauriRuntime } from './tauriRuntime'; + +const log = createLogger('tauriDeepLink'); + +let unlisten: (() => void) | null = null; + +/** + * Initialize the deep link handler for Tauri file associations. + * Call this once during app startup (e.g., in App.tsx useEffect). + * + * @param dispatch - Redux dispatch function for importing projects + * @param t - Translation function for localized error messages + * @returns Cleanup function to remove the event listener + */ +export async function initTauriDeepLink( + dispatch: AppDispatch, + t: I18nTranslate, +): Promise<() => void> { + if (!isTauriRuntime()) { + return () => {}; + } + + try { + const { listen } = await import('@tauri-apps/api/event'); + // Listen for deep-link://new-url event (emitted by tauri-plugin-deep-link) + unlisten = await listen('deep-link://new-url', async (event) => { + // Handle both array and string payloads + const urls = Array.isArray(event.payload) ? event.payload : [event.payload]; + + // Process all URLs in the payload (user may have selected multiple files) + for (const url of urls) { + if (!url) { + log.warn('Received empty URL in deep-link event'); + continue; + } + + log.info('Received deep-link event', { url }); + + // Parse the URL to get the file path (storycraft://path/to/file.storycraft) + // The deep-link plugin handles custom schemes, but for file associations we need + // to handle the case where the file path is passed as a CLI argument + try { + // For file associations on Windows/Linux, the deep-link plugin parses CLI args + // and emits the URL. We need to convert storycraft:// URLs back to file paths + // or handle direct file paths if passed. + let filePath = url; + + // Check if it's a storycraft:// URL and extract the path + if (url.startsWith('storycraft://') || url.startsWith('storycraft:')) { + // On Windows, the URL might be storycraft:///C:/path/to/file.storycraft + // On Linux, it might be storycraft:///home/user/file.storycraft + // QNBS-v3: Strip storycraft:// prefix and normalize Windows drive-letter paths + filePath = url.replace(/^storycraft:\/\/?/, ''); + // Windows paths like /C:/... need the leading slash removed + if (/^[A-Za-z]:/.test(filePath)) { + filePath = filePath.replace(/^\/+/, ''); + } else { + filePath = filePath.replace(/^\/+/, '/'); + } + } + + // Read file via Tauri FS plugin + const { readTextFile, exists } = await import('@tauri-apps/plugin-fs'); + + if (!(await exists(filePath))) { + throw new Error('File not found'); + } + + const content = await readTextFile(filePath); + const fileName = filePath.split(/[/\\]/).pop() || 'project.json'; + + // Create a File object for the existing import flow + const file = new File([content], fileName, { + type: 'application/json', + }); + + // Dispatch import thunk + const resultAction = await dispatch(importProjectThunk(file)); + + if (importProjectThunk.fulfilled.match(resultAction)) { + // Navigate to manuscript view after successful import + window.location.hash = '#/manuscript'; + } else { + // Show error notification + dispatch( + statusActions.addNotification({ + type: 'error', + title: t('error.deepLink.title'), + description: resultAction.error?.message ?? t('error.deepLink.unknown'), + }), + ); + } + } catch (error) { + log.error('Failed to open project file via deep link', { error, url }); + dispatch( + statusActions.addNotification({ + type: 'error', + title: t('error.deepLink.title'), + description: error instanceof Error ? error.message : String(error), + }), + ); + } + } + }); + + log.info('Tauri deep link handler initialized'); + } catch (error) { + log.warn('Failed to initialize Tauri deep link handler', { error }); + } + + return () => { + unlisten?.(); + unlisten = null; + }; +} + +/** + * Check if a file path is a StoryCraft project file. + */ +export function isStoryCraftProjectFile(filePath: string): boolean { + const ext = filePath.split('.').pop()?.toLowerCase(); + return ext === 'storycraft' || ext === 'scst' || filePath.endsWith('.json'); +} + +/** + * Get the project ID from a file path (for logging/debugging). + */ +export function getProjectIdFromPath(filePath: string): string { + const lastSegment = filePath.split(/[/\\]/).pop(); + if (!lastSegment) return 'unknown'; + return lastSegment.replace(/\.(storycraft|scst|json)$/, '') || 'unknown'; +} diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 954ca1588..e93a81f19 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -90,6 +90,137 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "atk" version = "0.18.2" @@ -197,6 +328,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "borsh" version = "1.6.1" @@ -501,6 +645,35 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + [[package]] name = "cookie" version = "0.18.1" @@ -857,6 +1030,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "document-features" version = "0.2.12" @@ -993,6 +1175,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + [[package]] name = "enum-as-inner" version = "0.6.1" @@ -1005,6 +1193,27 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "env_filter" version = "0.1.4" @@ -1042,6 +1251,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.4.1" @@ -1194,6 +1424,19 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.32" @@ -1810,6 +2053,12 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -1957,7 +2206,7 @@ dependencies = [ "tokio", "tower-service", "tracing", - "windows-registry", + "windows-registry 0.6.1", ] [[package]] @@ -2916,6 +3165,26 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-multimap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +dependencies = [ + "dlv-list", + "hashbrown 0.14.5", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_pipe" version = "1.2.3" @@ -2965,6 +3234,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -3065,6 +3340,17 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.33" @@ -3110,6 +3396,20 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "potential_utf" version = "0.1.5" @@ -3711,6 +4011,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rust-ini" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rust_decimal" version = "1.42.0" @@ -4326,7 +4636,7 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "storycraft-studio" -version = "1.19.0" +version = "1.20.0" dependencies = [ "base64 0.22.1", "candle-core", @@ -4336,11 +4646,13 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-deep-link", "tauri-plugin-dialog", "tauri-plugin-fs", "tauri-plugin-http", "tauri-plugin-log", "tauri-plugin-shell", + "tauri-plugin-single-instance", "tauri-plugin-updater", "tauri-plugin-window-state", "tokio", @@ -4700,6 +5012,27 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-deep-link" +version = "2.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ee75bc5627f77bfdf40c913255ebc258117b10ebe2b2239a1a1cf40b0b58aa" +dependencies = [ + "dunce", + "plist", + "rust-ini", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "tracing", + "url", + "windows-registry 0.5.3", + "windows-result 0.3.4", +] + [[package]] name = "tauri-plugin-dialog" version = "2.7.1" @@ -4809,6 +5142,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "tauri-plugin-single-instance" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8f29386f5e9fdc699182388a33ee80a56de436d91b67459e86afef426282af" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-plugin-deep-link", + "thiserror 2.0.18", + "tracing", + "windows-sys 0.60.2", + "zbus", +] + [[package]] name = "tauri-plugin-updater" version = "2.10.1" @@ -5053,6 +5402,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinystr" version = "0.8.3" @@ -5364,6 +5722,17 @@ version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + [[package]] name = "ug" version = "0.1.0" @@ -5967,6 +6336,17 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-registry" version = "0.6.1" @@ -6528,6 +6908,67 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.3", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +dependencies = [ + "serde", + "winnow 1.0.3", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.8.50" @@ -6640,3 +7081,43 @@ name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.3", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 1.0.3", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f1d8649dc..c09f5b048 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -30,6 +30,8 @@ tauri-plugin-dialog = "2" tauri-plugin-shell = "2" tauri-plugin-updater = "2" tauri-plugin-window-state = "2" +tauri-plugin-deep-link = "2" +tauri-plugin-single-instance = { version = "2", features = ["deep-link"] } tokio = { version = "1", features = ["sync", "time", "process", "rt-multi-thread"] } candle-core = { version = "0.8", optional = true } candle-nn = { version = "0.8", optional = true } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 0242a4706..3b0044a8a 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -39,6 +39,10 @@ fn install_app_menu(_app: &tauri::App) -> tauri::Result<()> { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() + // QNBS-v3: Single-instance plugin with deep-link feature handles file associations + // The plugin automatically handles CLI args and emits "deep-link://new-url" event + .plugin(tauri_plugin_single_instance::Builder::new().build()) + .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_fs::init()) .plugin(tauri_plugin_http::init()) .plugin(tauri_plugin_dialog::init()) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 22e74b27a..fab53dfa3 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -19,7 +19,8 @@ "minHeight": 600, "center": true, "resizable": true, - "fullscreen": false + "fullscreen": false, + "dragDropEnabled": true } ], "security": { @@ -42,6 +43,22 @@ "icons/icon.icns", "icons/icon.ico" ], + "fileAssociations": [ + { + "ext": ["storycraft"], + "name": "StoryCraft Project", + "description": "StoryCraft Studio creative writing project", + "mimeType": "application/x-storycraft-project", + "role": "Editor" + }, + { + "ext": ["scst"], + "name": "StoryCraft Project", + "description": "StoryCraft Studio creative writing project (short extension)", + "mimeType": "application/x-storycraft-project", + "role": "Editor" + } + ], "macOS": { "minimumSystemVersion": "11.0", "entitlements": "Entitlements.plist" @@ -64,6 +81,11 @@ "windows": { "installMode": "passive" } + }, + "deep-link": { + "desktop": { + "schemes": ["storycraft"] + } } } } diff --git a/tests/unit/services/tauriDeepLink.test.ts b/tests/unit/services/tauriDeepLink.test.ts new file mode 100644 index 000000000..e14e83a66 --- /dev/null +++ b/tests/unit/services/tauriDeepLink.test.ts @@ -0,0 +1,55 @@ +/** + * Tests for services/tauriDeepLink.ts + * QNBS-v3: Tauri deep link service for native file associations. + */ + +import { describe, expect, it } from 'vitest'; +import { getProjectIdFromPath, isStoryCraftProjectFile } from '../../../services/tauriDeepLink'; + +describe('tauriDeepLink', () => { + describe('isStoryCraftProjectFile', () => { + it('returns true for .storycraft extension', () => { + expect(isStoryCraftProjectFile('/path/to/project.storycraft')).toBe(true); + }); + + it('returns true for .scst extension', () => { + expect(isStoryCraftProjectFile('/path/to/project.scst')).toBe(true); + }); + + it('returns true for .json extension', () => { + expect(isStoryCraftProjectFile('/path/to/project.json')).toBe(true); + }); + + it('returns false for other extensions', () => { + expect(isStoryCraftProjectFile('/path/to/document.txt')).toBe(false); + expect(isStoryCraftProjectFile('/path/to/image.png')).toBe(false); + }); + + it('handles mixed case extensions', () => { + expect(isStoryCraftProjectFile('/path/to/project.STORYCRAFT')).toBe(true); + expect(isStoryCraftProjectFile('/path/to/project.Scst')).toBe(true); + }); + }); + + describe('getProjectIdFromPath', () => { + it('extracts project ID from path', () => { + expect(getProjectIdFromPath('/path/to/my-novel.storycraft')).toBe('my-novel'); + }); + + it('extracts project ID from .scst extension', () => { + expect(getProjectIdFromPath('/path/to/my-novel.scst')).toBe('my-novel'); + }); + + it('extracts project ID from .json extension', () => { + expect(getProjectIdFromPath('/path/to/my-novel.json')).toBe('my-novel'); + }); + + it('returns unknown for empty path', () => { + expect(getProjectIdFromPath('')).toBe('unknown'); + }); + + it('handles path without extension', () => { + expect(getProjectIdFromPath('/path/to/project')).toBe('project'); + }); + }); +});