{
  "common": {
    "you": "You",
    "confirm": "Confirm",
    "cancel": "Cancel",
    "loading": "Loading...",
    "errorPrefix": "Error: ",
    "loadingClassroom": "Loading classroom...",
    "retry": "Retry",
    "close": "Close"
  },
  "home": {
    "slogan": "Generative Learning in Multi-Agent Interactive Classroom",
    "greetingWithName": "Hi, {{name}}"
  },
  "toolbar": {
    "pdfParser": "Parser",
    "pdfUpload": "Upload PDF",
    "removePdf": "Remove file",
    "documentExtractor": "Extractor",
    "courseMaterialUpload": "Upload course material",
    "courseMaterialsSelected": "{{n}} materials selected",
    "courseMaterialMergeOrder": "Materials are merged in the order shown below.",
    "removeCourseMaterial": "Remove file",
    "webSearchOn": "Enabled",
    "webSearchOff": "Click to enable",
    "webSearchDesc": "Search the web for up-to-date information before generation",
    "webSearchProvider": "Search engine",
    "webSearchNoProvider": "Configure search API key in Settings",
    "selectProvider": "Select provider",
    "configureProvider": "Set up model",
    "configureProviderHint": "Configure at least one model provider to generate courses",
    "enterClassroom": "Enter Classroom",
    "advancedSettings": "Advanced Settings",
    "thinking": "Thinking",
    "thinkingBudget": "Budget",
    "default": "Default",
    "on": "On",
    "off": "Off",
    "auto": "Auto",
    "dynamic": "Dynamic",
    "ttsTitle": "Text-to-Speech",
    "ttsHint": "Choose a voice for the AI teacher",
    "ttsPreview": "Preview",
    "ttsPreviewing": "Playing...",
    "interactiveModeHint": "Enable interactive-first mode for more hands-on content",
    "interactiveModeLabel": "Interactive Mode"
  },
  "export": {
    "pptx": "Export PPTX",
    "resourcePack": "Export Resource Pack",
    "resourcePackDesc": "PPTX + interactive pages",
    "exporting": "Exporting...",
    "exportSuccess": "Export successful",
    "exportFailed": "Export failed",
    "classroomZip": "Export Classroom ZIP",
    "classroomZipDesc": "Course structure + media files",
    "scriptMd": "Download Script (.md)",
    "scriptMdDesc": "Narration text as Markdown",
    "script": "Download Script",
    "scriptDocx": "Download Script (.docx)",
    "scriptDocxDesc": "Genuine Word document in DOCX format",
    "slideFallback": "Slide {{order}}",
    "textOnly": "Export Script",
    "mediaPending": "Waiting for media to finish generating",
    "inlinePartial": "{{count}} external asset(s) couldn't be bundled; the course may not display correctly offline.",
    "video": "Export Video",
    "videoDesc": "Self-contained Hyperframes project (render to MP4)",
    "videoNoScenes": "No scenes available to export.",
    "videoCompiling": "Compiling video timeline...",
    "videoRendering": "Rendering slides and collecting assets...",
    "videoPackaging": "Packaging video project...",
    "videoSuccess": "Video project exported",
    "videoFailed": "Video export failed",
    "videoWarnings": "{{assets}} asset(s) missing and {{diagnostics}} issue(s) in the export report.",
    "videoMp4Success": "Video rendered",
    "videoServiceUnavailable": "Render service not configured — downloaded the project ZIP for local rendering.",
    "videoResolution": "Resolution",
    "videoFps": "Frame rate",
    "videoQuality": "Quality",
    "videoQuality_draft": "Draft",
    "videoQuality_standard": "Standard",
    "videoQuality_high": "High",
    "videoProgress": "{{percent}}%",
    "videoProgressWithEta": "{{percent}}% · about {{remaining}} left",
    "videoEtaMinSec": "{{min}} min {{sec}} sec",
    "videoEtaSec": "{{sec}} sec",
    "videoRenderMp4": "Render MP4",
    "videoDownloadZip": "Download project ZIP",
    "videoServiceHint": "MP4 rendering needs the render service. Download the ZIP to render locally.",
    "videoBurnSubtitles": "Burn in subtitles",
    "videoBurnSubtitlesDesc": "Off: export a clean video and add the subtitle file in your editor.",
    "videoQuizCtaPrompt": "Want to try an interactive quiz?",
    "videoPblCtaPrompt": "Want to explore project-based learning?",
    "videoCtaVisit": "Visit",
    "videoDownloadSubtitles": "Download subtitles (.srt)",
    "subtitlesCompiling": "Compiling subtitles...",
    "subtitlesSuccess": "Subtitles downloaded",
    "subtitlesEmpty": "No narration to make subtitles from",
    "subtitlesFailed": "Subtitle download failed",
    "noSlides": "No slides to export",
    "noSlidesSkipped": "No slides in this course — PPTX skipped",
    "nothingToExport": "Nothing to export"
  },
  "import": {
    "classroom": "Import Classroom",
    "pptx": "Import PPTX",
    "parsing": "Parsing ZIP...",
    "parsingPptx": "Parsing PPTX...",
    "validating": "Validating data...",
    "writingMedia": "Writing media files...",
    "writingCourse": "Writing course data...",
    "success": "Classroom imported successfully",
    "pptxSuccess": "PPTX parsed successfully ({{count}} slides, output logged to console)",
    "error": {
      "invalidZip": "Invalid file. Please select a valid .maic.zip file.",
      "invalidPptx": "Failed to parse PPTX. Please check the file is valid.",
      "parserUnavailable": "PPTX import is unavailable: the parser bundle is not deployed. Re-run install/sync.",
      "invalidManifest": "Invalid classroom file: manifest.json is missing or corrupted.",
      "missingData": "Invalid classroom file: missing required course data.",
      "storageFull": "Import failed: browser storage is full. Try clearing old classrooms."
    }
  },
  "chat": {
    "lecture": "Lecture",
    "noConversations": "No conversations",
    "startConversation": "Type a message below to begin chatting",
    "noMessages": "No messages yet",
    "ended": "ended",
    "unknown": "Unknown",
    "stopDiscussion": "Stop Discussion",
    "endQA": "End Q&A",
    "softClosing": "Continue discussion",
    "error": {
      "emptyAgentResponses": "Agents returned empty responses; discussion stopped. Try again or check your model settings.",
      "streamInterrupted": "Stream ended unexpectedly; discussion didn't complete. Please try again."
    },
    "elementReference": {
      "button": "Reference slide",
      "unavailable": "Only the current PPT slide can be referenced",
      "instruction": "Click a slide element · Esc to exit",
      "fallback": "Other slide elements ({{count}})",
      "clear": "Remove slide reference",
      "summary": {
        "noText": "No text",
        "emptyContent": "No content",
        "code": "Code",
        "line": "Line",
        "imageMetadata": "Image (metadata only)",
        "videoMetadata": "Video (metadata only)",
        "audioMetadata": "Audio (metadata only)"
      }
    },
    "tabs": {
      "lecture": "Notes",
      "chat": "Chat"
    },
    "lectureNotes": {
      "empty": "Notes will appear here after lecture playback",
      "emptyHint": "Press play to start the lecture",
      "pageLabel": "Page {{n}}",
      "currentPage": "Current",
      "jumpToLine": "Jump to this line",
      "jumpUnavailable": "Jump unavailable for this line"
    },
    "badge": {
      "qa": "Q&A",
      "discussion": "DISC",
      "lecture": "LEC"
    }
  },
  "actions": {
    "names": {
      "spotlight": "Spotlight",
      "laser": "Laser",
      "wb_open": "Open Whiteboard",
      "wb_draw_text": "Whiteboard Text",
      "wb_draw_shape": "Whiteboard Shape",
      "wb_draw_chart": "Whiteboard Chart",
      "wb_draw_latex": "Whiteboard Formula",
      "wb_draw_table": "Whiteboard Table",
      "wb_draw_line": "Whiteboard Line",
      "wb_clear": "Clear Whiteboard",
      "wb_delete": "Delete Element",
      "wb_close": "Close Whiteboard",
      "discussion": "Discussion"
    },
    "status": {
      "inputStreaming": "Waiting",
      "inputAvailable": "Executing",
      "outputAvailable": "Completed",
      "outputError": "Error",
      "outputDenied": "Denied",
      "running": "Executing",
      "result": "Completed",
      "error": "Error"
    }
  },
  "agentBar": {
    "readyToLearn": "Ready to learn together?",
    "expandedTitle": "Classroom Role Config",
    "configTooltip": "Click to configure classroom roles",
    "voiceLabel": "Voice",
    "voiceLoading": "Loading...",
    "voiceAutoAssign": "Voices will be auto-assigned",
    "searchVoice": "Search voices",
    "noMatchingVoices": "No matching voices",
    "noVoice": "No voice"
  },
  "proactiveCard": {
    "discussion": "Discussion",
    "join": "Join",
    "skip": "Skip",
    "pause": "Pause",
    "resume": "Resume"
  },
  "voice": {
    "startListening": "Voice input",
    "stopListening": "Stop recording"
  },
  "stage": {
    "currentScene": "Current Scene",
    "generating": "Generating...",
    "paused": "Paused",
    "generationFailed": "Generation failed",
    "confirmSwitchTitle": "Switch Scene",
    "confirmSwitchMessage": "A topic is currently in progress. Switching scenes will end the current topic. Are you sure?",
    "generatingNextPage": "Scene is being generated, please wait...",
    "courseComplete": "Course complete",
    "fullscreen": "Fullscreen",
    "exitFullscreen": "Exit Fullscreen",
    "editCourse": "Edit course",
    "doneEditing": "Done editing",
    "proModeDisabledHint": "Editing isn't available on this page — open a course slide to edit with Pro mode."
  },
  "edit": {
    "proMode": "Pro",
    "undo": "Undo",
    "redo": "Redo",
    "delete": "Delete",
    "title": "Editing · {{type}}",
    "unsupportedScene": "{{type}} is not editable yet",
    "readOnlyBadge": "{{type}} · view-only",
    "sceneType": {
      "slide": "Slide",
      "quiz": "Quiz",
      "interactive": "Interactive",
      "pbl": "PBL"
    },
    "text": {
      "toolbar": "Text toolbar",
      "label": "Text",
      "font": "Font",
      "fontDefault": "Default",
      "sizeUp": "Increase size",
      "sizeDown": "Decrease size",
      "fontSize": "Font size",
      "bold": "Bold",
      "italic": "Italic",
      "underline": "Underline",
      "color": "Text color",
      "alignLeft": "Align left",
      "alignCenter": "Align center",
      "alignRight": "Align right",
      "bullet": "Bulleted list",
      "colorHex": "Color value"
    },
    "line": {
      "toolbar": "Line toolbar",
      "kind": "Line type",
      "color": "Line color",
      "width": "Line width",
      "style": "Line style",
      "start": "Start marker",
      "end": "End marker",
      "straight": "Straight",
      "broken": "Broken line",
      "broken2": "Double broken line",
      "curve": "Curve",
      "cubic": "Cubic curve",
      "solid": "Solid",
      "dashed": "Dashed",
      "dotted": "Dotted",
      "none": "None",
      "arrow": "Arrow",
      "dot": "Dot"
    },
    "insert": {
      "toolbar": "Insert toolbar",
      "textBox": "Text box",
      "line": "Line",
      "linePresets": {
        "straight": "Straight line",
        "dashed": "Dashed line",
        "arrow": "Arrow line",
        "dashedArrow": "Dashed arrow line",
        "dottedEnd": "Dot end line",
        "broken": "Broken line",
        "doubleBroken": "Double broken line",
        "curve": "Curve",
        "cubic": "Cubic curve"
      },
      "table": "Table",
      "formula": "Formula",
      "chart": "Chart",
      "chartBar": "Bar chart",
      "chartLine": "Line chart",
      "chartPie": "Pie chart",
      "tableDimensions": "{{rows}} x {{columns}} Table",
      "dragToolbar": "Move insert tools",
      "dragToolbarKeyboard": "Move insert tools: press Enter or Space, then use the arrow keys",
      "collapseToolbar": "Collapse insert tools",
      "expandToolbar": "Expand insert tools",
      "image": "Image",
      "imageDrop": "Drop an image or click to choose a file",
      "imageOr": "or paste an image URL",
      "imageUrlPlaceholder": "https://…",
      "imageInsert": "Insert",
      "video": "Video",
      "videoDrop": "Drop a video or click to choose a file",
      "videoOr": "or paste a video URL",
      "videoUrlPlaceholder": "https://…",
      "videoInsert": "Insert",
      "audio": "Audio",
      "audioDrop": "Drop audio or click to choose a file",
      "audioOr": "or paste an audio URL",
      "audioUrlPlaceholder": "https://…",
      "audioInsert": "Insert"
    },
    "asset": {
      "drop": "Drop a file or click to choose",
      "orUrl": "or paste a file URL",
      "urlPlaceholder": "https://…",
      "insert": "Insert",
      "invalidType": "Unsupported file type",
      "readFailed": "Unable to read file"
    },
    "latex": {
      "toolbar": "Formula toolbar",
      "editFormula": "Edit formula",
      "dialog": "Formula editor",
      "source": "LaTeX source",
      "preview": "Preview",
      "symbols": "Symbols",
      "presets": "Presets",
      "invalidSource": "The LaTeX source is invalid."
    },
    "video": {
      "toolbar": "Video toolbar",
      "poster": "Set poster"
    },
    "audio": {
      "toolbar": "Audio toolbar",
      "preview": "Preview audio",
      "pause": "Pause preview",
      "loop": "Loop"
    },
    "table": {
      "doubleClickToEdit": "Double-click to edit"
    },
    "nav": {
      "addSlide": "Add slide",
      "duplicate": "Duplicate",
      "delete": "Delete",
      "deleted": "Deleted",
      "undo": "Undo",
      "copySuffix": "(copy)",
      "untitledSlide": "Untitled slide",
      "collapse": "Collapse rail",
      "expand": "Expand rail",
      "dragHandle": "Drag to reorder",
      "deckLabel": "Scenes",
      "moreActions": "More actions",
      "rename": "Rename",
      "sceneIncomplete": "This page has incomplete content",
      "addPage": "Add page",
      "nextPage": "Next page",
      "prevPage": "Previous page"
    },
    "zorder": {
      "toFront": "Bring to front",
      "toBack": "Send to back"
    },
    "image": {
      "toolbar": "Image toolbar",
      "replace": "Replace image",
      "flipH": "Flip horizontal",
      "flipV": "Flip vertical",
      "crop": "Crop image"
    },
    "contextMenu": {
      "horizontalAlignment": "Horizontal alignment",
      "verticalAlignment": "Vertical alignment",
      "selectAll": "Select all",
      "copy": "Copy",
      "cut": "Cut",
      "paste": "Paste",
      "unlock": "Unlock",
      "lock": "Lock",
      "group": "Group",
      "ungroup": "Ungroup",
      "bringForward": "Bring forward",
      "sendBackward": "Send backward",
      "alignTop": "Align top",
      "alignMiddle": "Align middle",
      "alignBottom": "Align bottom"
    },
    "background": {
      "label": "Background",
      "solid": "Solid",
      "image": "Image",
      "color": "Color"
    },
    "common": {
      "cancel": "Cancel",
      "confirm": "Confirm"
    },
    "quiz": {
      "addQuestion": "Add question",
      "reorder": "Drag to reorder",
      "deleteQuestion": "Delete question",
      "untitledQuestion": "Untitled question",
      "questionLabel": "Question",
      "questionPlaceholder": "Enter the question…",
      "typeLabel": "Type",
      "pointsLabel": "Points",
      "optionsLabel": "Options",
      "optionPlaceholder": "Option text",
      "addOption": "Add option",
      "deleteOption": "Remove option",
      "markCorrect": "Mark as correct answer",
      "moveUp": "Move up",
      "moveDown": "Move down",
      "analysisLabel": "Explanation",
      "analysisPlaceholder": "Shown after the question is graded…",
      "commentPromptLabel": "Grading guidance",
      "commentPromptPlaceholder": "How should this open response be graded?",
      "empty": "No questions yet",
      "emptyHint": "Use “Add question” to create the first one.",
      "type": {
        "single": "Single choice",
        "multiple": "Multiple choice",
        "short_answer": "Short answer"
      },
      "shortAnswerGradingNote": "Short answers are always graded by AI from the guidance below.",
      "hint": {
        "emptyText": "Question {{n}}: add question text",
        "fewOptions": "Question {{n}}: add at least two options",
        "emptyOption": "Question {{n}}: an option label is empty",
        "noCorrect": "Question {{n}}: mark a correct answer"
      }
    },
    "cue": {
      "speech": "Narration",
      "spotlight": "Spotlight",
      "laser": "Laser",
      "whiteboardOpen": "Whiteboard",
      "whiteboardText": "Writing",
      "whiteboardShape": "Shape",
      "whiteboardLatex": "Formula",
      "whiteboardTable": "Table",
      "action": "Action",
      "discussion": "Discussion"
    },
    "element": {
      "toolbar": "Element toolbar",
      "text": "Text",
      "image": "Image",
      "shape": "Shape",
      "line": "Line",
      "chart": "Chart",
      "table": "Table",
      "latex": "Formula",
      "video": "Video",
      "audio": "Audio",
      "code": "Code"
    },
    "agent": {
      "expand": "Expand AI assistant",
      "collapse": "Collapse",
      "stopped": "Stopped",
      "emptyTitle": "What would you like to change?",
      "emptyHint": "After editing this slide on the canvas, let AI regenerate narration that matches the content.",
      "placeholder": "Describe your changes to this slide…",
      "stop": "Stop generating",
      "empty": {
        "lead": "Tell me how to change this slide — I'll redo the content and re-align the narration.",
        "boundary": "For fine-grained edits use the editor; add / delete / reorder slides from the left nav.",
        "comingSoon": "More capabilities coming soon."
      },
      "interactive": {
        "emptyTitle": "What needs fixing on this page?",
        "lead": "Describe a bug on this interactive page — e.g. a button that does nothing — and I'll fix just that, keeping everything else.",
        "placeholder": "Describe the bug on this interactive page…",
        "boundary": "I make targeted fixes to the page; I won't rebuild the whole page. Switch scenes from the left nav."
      },
      "cap": {
        "content": {
          "label": "Regenerate the slide",
          "examples": "“Condense to 3 points”, “Add a real-world example”"
        },
        "narration": {
          "label": "Regenerate the narration script",
          "examples": "“Make it more conversational”, “Align with my canvas edits”"
        },
        "fixHtml": {
          "label": "Fix a bug on the page",
          "examples": "“The start button does nothing”, “Panels overlap on mobile”"
        },
        "elements": {
          "label": "Tweak selected elements",
          "examples": "“Make the title blue and move it up”, “Make this figure smaller”"
        }
      },
      "newConversation": "New conversation",
      "sessionHistory": "History",
      "sessionUntitled": "Untitled chat",
      "sessionDelete": "Delete",
      "sessionEmpty": "No past conversations",
      "thinking": "Thinking…",
      "reasoning": "Reasoning",
      "thought": "Thought for",
      "title": "Edit with AI"
    },
    "timeline": {
      "title": "Narration script",
      "regenAllTts": "Regenerate all voiceover",
      "voiceAll": "Voice all",
      "counts": "{{speech}} narration · {{cue}} cues",
      "panLeft": "Pan left",
      "panRight": "Pan right",
      "collapseAxis": "Collapse to axis",
      "expandTrack": "Expand track",
      "emptyHint": "Drag actions onto the axis to start, or let MAIC Agent generate narration.",
      "speechPlaceholder": "Enter this narration line…",
      "reorder": "Drag to reorder",
      "moveLeft": "Move left",
      "moveRight": "Move right",
      "pickElement": "Pick element",
      "bound": "Bound",
      "fieldAction": "Action",
      "fieldElement": "Element",
      "fieldContent": "Content",
      "addDiscussionExists": "Only one discussion per scene",
      "discussionTerminal": "END",
      "discussionTerminalHint": "A discussion stays at the end of the scene (one per scene)",
      "discussionTopicPlaceholder": "Discussion topic (required)",
      "discussionPromptPlaceholder": "Guidance prompt (optional)",
      "discussionAgent": "Initiator",
      "discussionAgentUnset": "Unspecified",
      "addAction": "Add action"
    },
    "picker": {
      "title": "Insert action",
      "speechDesc": "Speak a line — can auto-voice",
      "spotlightDesc": "Highlight an element on the canvas",
      "laserDesc": "Point a laser at an element",
      "discussionDesc": "Pose a question, pick who starts it"
    },
    "tts": {
      "cancelPreview": "Cancel preview",
      "preview": "Preview",
      "regenerate": "Regenerate voiceover",
      "statusReady": "Voiced",
      "statusNone": "Not voiced",
      "statusGenerating": "Generating",
      "stopPreview": "Stop preview",
      "statusError": "Failed"
    },
    "pick": {
      "pickFor": "Pick an element for \"{{label}}\"",
      "pickHint": "Click a highlighted element or the list below · Esc to cancel",
      "pageElements": "Page elements · {{count}}",
      "expand": "Expand",
      "collapse": "Collapse",
      "noElements": "No locatable elements on this slide.",
      "bindHint": "Click a highlighted element on the canvas to bind",
      "refCapHint": "Limit reached — remove one to swap · Esc when done",
      "refHint": "Click to add or remove · Esc when done",
      "refLead": "Referencing elements · {{count}}/{{max}}"
    },
    "regen": {
      "title": "Regenerate narration",
      "running": "Generating…",
      "noActions": "No actions generated",
      "actionsCount": "{{count}} actions",
      "generating": "Generating",
      "notGenerated": "Not generated",
      "updated": "Updated"
    },
    "regenScene": {
      "title": "Regenerate slide",
      "generating": "Generating",
      "updated": "Updated",
      "notGenerated": "Not generated",
      "elementsCount": "{{count}} elements",
      "restore": "Restore previous",
      "restored": "Restored",
      "resume": "Resume"
    },
    "fixHtml": {
      "title": "Fix interactive page",
      "fixing": "Fixing",
      "fixed": "Fixed",
      "notFixed": "Not fixed",
      "editsCount": "{{count}} edit(s)"
    },
    "readCard": {
      "title": "Read slide content",
      "reading": "Reading",
      "done": "Read",
      "failed": "Not read"
    },
    "editElements": {
      "title": "Edit elements",
      "editing": "Editing",
      "applied": "Applied",
      "notApplied": "Not applied",
      "applyFailed": "The editor could not apply the element edit. Nothing was changed.",
      "applyPartiallyFailed": "The editor could not apply one or more element edits. Other edits may have been applied."
    },
    "roster": {
      "title": "Class roster",
      "count": "{{count}} members",
      "editHint": "Click a member to edit",
      "personaLabel": "Persona",
      "personaPlaceholder": "Describe the role personality, teaching style, and tasks...",
      "noPersona": "No persona yet",
      "unnamed": "Untitled",
      "teacherBadge": "Lead",
      "moveUp": "Move up",
      "moveDown": "Move down",
      "removeFromClass": "Remove from class",
      "aiClassmates": "AI classmates · {{count}}",
      "addRole": "Add role",
      "shortTitle": "Roster"
    },
    "elementRef": {
      "remove": "Remove reference {{label}}",
      "counts": "{{count}}/{{max}} referenced",
      "exitPicking": "Done picking",
      "startPicking": "Reference elements"
    },
    "dock": {
      "elementRefHint": "Element references — pick elements to send with your next message",
      "globalTools": "Global tools"
    }
  },
  "classroomComplete": {
    "title": "Course complete",
    "trailLabels": {
      "slide": "pages",
      "quiz": "quizzes",
      "interactive": "interactives",
      "pbl": "projects"
    },
    "quizScoreLabel": "{{correct}} / {{total}} correct",
    "encouragement": {
      "high": "Outstanding — you nailed it.",
      "mid": "Solid work — keep it up.",
      "low": "A good start — review and try again."
    }
  },
  "whiteboard": {
    "title": "Interactive Whiteboard",
    "open": "Open Whiteboard",
    "clear": "Clear Whiteboard",
    "minimize": "Minimize Whiteboard",
    "ready": "Whiteboard is ready",
    "readyHint": "Elements will appear here when added by AI",
    "clearSuccess": "Whiteboard cleared successfully",
    "clearError": "Failed to clear whiteboard: ",
    "resetView": "Reset View",
    "restoreError": "Failed to restore whiteboard: ",
    "history": "History",
    "restore": "Restore",
    "noHistory": "No history yet",
    "restored": "Whiteboard restored",
    "elementCount": "{{count}} elements"
  },
  "quiz": {
    "title": "Quiz",
    "subtitle": "Test your knowledge",
    "questionsCount": "questions",
    "totalPrefix": "",
    "pointsSuffix": "pts",
    "startQuiz": "Start Quiz",
    "multipleChoiceHint": "(Multiple choice — select all correct answers)",
    "inputPlaceholder": "Type your answer here...",
    "charCount": "chars",
    "yourAnswer": "Your answer:",
    "notAnswered": "Not answered",
    "aiComment": "AI Feedback",
    "singleChoice": "Single",
    "multipleChoice": "Multiple",
    "shortAnswer": "Short answer",
    "analysis": "Analysis: ",
    "excellent": "Excellent!",
    "keepGoing": "Keep going!",
    "needsReview": "Needs review",
    "correct": "correct",
    "incorrect": "incorrect",
    "answering": "In Progress",
    "submitAnswers": "Submit Answers",
    "aiGrading": "AI is grading...",
    "aiGradingWait": "Please wait, analyzing your answers",
    "quizReport": "Quiz Report",
    "retry": "Retry"
  },
  "roundtable": {
    "teacher": "TEACHER",
    "you": "YOU",
    "inputPlaceholder": "Type your message...",
    "listening": "Listening...",
    "processing": "Processing...",
    "noSpeechDetected": "No speech detected, please try again",
    "discussionEnded": "Discussion ended",
    "qaEnded": "Q&A ended",
    "thinking": "Thinking",
    "yourTurn": "Your turn",
    "stopDiscussion": "Stop Discussion",
    "softClosing": "Continue discussion",
    "autoPlay": "Auto-play",
    "autoPlayOff": "Stop auto-play",
    "speed": "Speed",
    "previousLine": "Previous line",
    "nextLine": "Next line",
    "lineProgress": "Line {{current}} / {{total}}",
    "voiceInput": "Voice input",
    "voiceInputDisabled": "Voice input disabled",
    "textInput": "Text input",
    "stopRecording": "Stop recording",
    "startRecording": "Start recording"
  },
  "pbl": {
    "emptyProject": "PBL project has not been generated yet. Please create via course generation.",
    "v2": {
      "hero": {
        "title": "Project-Based Learning",
        "stage": "Stages",
        "task": "Tasks",
        "tutor": "Tutor",
        "greetingBanner": "Your tutor is saying hello…",
        "startProject": "Start Project",
        "continueProject": "Continue Project",
        "resetProgress": "Reset learning progress",
        "resetConfirmTitle": "Reset learning progress?",
        "resetConfirmDescription": "This clears all progress for this project — chat history, submissions, and stage status — and you'll start over from the beginning. This can't be undone.",
        "resetConfirmConfirm": "Reset",
        "resetConfirmCancel": "Cancel",
        "startHint": "Click to enter the workspace. {{name}} will guide you through each stage.",
        "startError": "Unable to start: {{error}}",
        "youWillLearn": "What you'll gain",
        "instructorTagline": "Guides you through the whole project",
        "scenarioCharacter": "Role-play character",
        "scenarioCharacterTagline": "The character you'll interact with in the scenario",
        "scenarioFlow": "Flow",
        "close": "Close"
      },
      "sidebar": {
        "title": "Project Roadmap",
        "summary": "{{completed}} / {{total}} tasks · {{stages}} stages",
        "enterScenario": "Enter the scene",
        "advanceScene": "Advance the scene",
        "continueScene": "Next stage",
        "stagePrep": "Prep",
        "stageRoleplay": "Simulation",
        "stageWrapup": "Debrief",
        "completeAct": "Finish this act",
        "completeTask": "Done"
      },
      "workspace": {
        "progressLabel": "Progress",
        "resizeSidebar": "Resize sidebar and chat",
        "resizeSubmission": "Resize chat and submission panel",
        "enterFullscreen": "Expand to fullscreen workspace",
        "exitFullscreen": "Exit fullscreen workspace",
        "exitNativeFullscreen": "Exit fullscreen",
        "returnToHero": "Back to project overview",
        "breadcrumbOverview": "Overview",
        "breadcrumbCurrent": "Workspace"
      },
      "chat": {
        "placeholder": "Chat with {{name}} about your progress...",
        "placeholderCompleted": "Project complete. Check out your report.",
        "send": "Send",
        "voiceInput": "Voice input",
        "keyboardHint": "Enter to send · Shift+Enter for newline",
        "readingSubmission": "Reading submission…",
        "generatingMilestoneFeedback": "Generating milestone feedback…",
        "generatingFinalEval": "Generating final evaluation…",
        "readingSubmissionWithTitle": "Reading latest submission for \"{{title}}\"…",
        "evaluatingTask": "{{name}} · Reviewing task",
        "evaluatingFinal": "{{name}} · Final evaluation",
        "narrating": "Setting the scene…",
        "choosePrompt": "Pick an option",
        "choiceOrType": "Pick one, or type your own…",
        "suggestionsToggle": "Need ideas? See some ways to respond",
        "guidancePointer": "Stuck? Check this act's goal and tips in the panel on the right.",
        "roleplayHistoryTitle": "Role-play history",
        "coachHint": "Coach tip",
        "thinking": "{{name}} · Thinking",
        "typing": "{{name}} · Typing…",
        "submitted": "Work submitted",
        "evaluatingSubmission": "Evaluating your submission…",
        "evaluatingSubmissionDetail": "Task: \"{{title}}\". Feedback on this submission will appear here once evaluation is complete.",
        "milestoneFeedbackPending": "The milestone feedback will appear once ready.",
        "emptyChat": "No messages yet.",
        "emptyChatHint": "Your project walkthrough with {{name}} will start here.",
        "continueError": "Unable to continue: {{error}}",
        "stillTyping": "Still typing",
        "handoverHint": "Click \"Continue to Next Stage\" to keep going."
      },
      "scene": {
        "expand": "Expand",
        "collapse": "Collapse",
        "greetHint": "Tap to say hi",
        "label": "The scene"
      },
      "milestoneCard": {
        "title": "Milestone Review",
        "youLearned": "What you learned",
        "nextStage": "Next stage:",
        "continueHint": "Click Continue to enter the next stage.",
        "alreadyEntered": "Next stage entered",
        "continueToNext": "Continue to Next Stage",
        "projectAlmostDone": "🎉 Project almost done — awaiting completion report"
      },
      "taskEvalCard": {
        "title": "Submission Feedback",
        "strengths": "What went well",
        "improvements": "Next steps"
      },
      "briefing": {
        "intro": "The premise introduced during prep — kept here so you can revisit it anytime in the scene.",
        "tablistLabel": "Right panel tabs",
        "submissionTab": "Submit",
        "briefingTab": "Briefing",
        "setting": "Setting",
        "learnerRole": "Your role",
        "goal": "Goal",
        "rules": "Rules",
        "cast": "Cast",
        "identity": "Identity",
        "situation": "Situation"
      },
      "submission": {
        "textSubmission": "Text submission",
        "fileTooLarge": "File exceeds 5 MB limit. Try splitting or compressing.",
        "contentRequired": "Content cannot be empty",
        "readFileFailed": "Failed to read file: {{error}}",
        "parsingPdf": "Parsing PDF…",
        "parsePdfFailed": "Failed to parse PDF: {{error}}",
        "pdfNoText": "No extractable text found in this PDF.",
        "imageUploadFailed": "Failed to upload image: {{error}}",
        "imageTooLargeNoStorage": "Image too large to attach without storage configured (max 2 MB locally).",
        "imageNeedsCaptionNoVision": "The current model can't read images. Add a text description of the image before submitting, or switch to a vision-capable model in Settings.",
        "unsupportedFileType": "Unsupported file type. Only text files (.txt, .md, .csv, .json, .py, …) and PDF are accepted.",
        "pasteTab": "Paste text / image",
        "uploadTab": "Upload file",
        "pastePlaceholder": "Paste your code, document, answer — or an image / screenshot — here…",
        "uploadPlaceholder": "Uploaded content will appear here. Edit before submitting…",
        "imageCaptionPlaceholder": "Add an optional caption for this image…",
        "imageSelectedReplace": "Image selected · click to replace",
        "removeImage": "Remove image",
        "processing": "Processing…",
        "cancelProcessingConfirm": "A file is still being processed. Cancel and discard this upload?",
        "currentTask": "Current Task",
        "hints": "Hints",
        "submitOutput": "Submit",
        "evaluating": "Evaluating submission…",
        "lockedWhileStreaming": "The instructor is replying — please wait before submitting.",
        "evalFailed": "Evaluation failed: {{error}}",
        "submittedCount": "{{count}} submitted",
        "submissionHistory": "Submission History",
        "fromTask": "Task: {{title}}",
        "download": "Download",
        "viewSubmission": "View submission",
        "noActiveTask": "No active task.",
        "canceling": "Cancel",
        "submitting": "Submitting…",
        "selectFileHint": "Choose a file · Max 5 MB · Text, PDF or image",
        "modalTitle": "Submit your work",
        "modalTaskLabel": "Task: {{title}}",
        "fileRead": "Read: {{filename}} · {{size}} KB",
        "submittedBadge": "Submitted ({{count}})",
        "receiptFile": "File: {{filename}}",
        "receiptTemplate": "Submitted work for this task ({{label}})."
      },
      "agentTabs": {
        "noAgent": "No AI agent configured for this project."
      },
      "completion": {
        "noWhatsNext": "The final evaluation hasn't been written yet.",
        "backToWorkspace": "Back to Workspace",
        "completionCta": "View Report",
        "title": "Completion Report",
        "whatYouBuilt": "What you built",
        "whatYouLearned": "What you learned",
        "whatsNext": "What's next",
        "noDataFallback": "Not yet written",
        "stageReview": "Stage Reviews",
        "summary": "You completed {{completed}} of {{total}} tasks across {{stages}} stages.",
        "statConcepts": "Concepts mastered",
        "statTurns": "Messages exchanged",
        "statScope": "Stages · Tasks",
        "statDuration": "Time spent",
        "statSubmissions": "Work submitted",
        "coreStageBadge": "Core",
        "conceptsInStageLabel": "Concepts:",
        "submissionsInStage": "Submitted {{count}} piece(s) of work",
        "coreConceptGrasp": "Core concept \"{{concept}}\" — {{quality}}",
        "stageNoData": "No recorded output in this stage.",
        "scenario": {
          "summary": "You completed all {{acts}} acts of this scenario. Here's how the role-play went.",
          "whatYouDidWell": "What you did well",
          "skillsPracticed": "Skills you practised",
          "statGoals": "Goals met",
          "statActs": "Acts completed",
          "goalReviewTitle": "Act-by-act review",
          "goalReviewHint": "This scenario set a few key goals for each act. Here's a look back at how your conversation actually went — you met {{achieved}} of {{total}} this time.",
          "goalListTitle": "What each act asked of you",
          "goalListHint": "This scenario set a few key goals for each act. Here's a look back at what each act asked you to do.",
          "goalAchieved": "achieved",
          "goalPartial": "partly done",
          "goalMissed": "not done",
          "statGoodDecisions": "Strong choices",
          "statScore": "Decision score",
          "statBeats": "Acts completed",
          "decisionReviewTitle": "Decision review",
          "good": "strong",
          "ok": "okay",
          "poor": "to improve",
          "decisionScore": "Decision score {{score}}",
          "castLabel": "You interacted with: {{names}}"
        },
        "highlightsTitle": "Highlights",
        "highlight": {
          "independence": "You demonstrated {{unlocks}}/{{total}} concepts on your own — no prompting needed. Solid understanding.",
          "resilience": "In \"{{title}}\" you overcame {{errors}} errors, tackling each one — real grit.",
          "resilienceGeneral": "You overcame {{errors}} errors, tackling each one — real grit.",
          "completion": "You completed every task. Steady progress all the way through."
        },
        "synthesisQuality": {
          "strong": "Strong understanding ✅",
          "ok": "Good grasp 👍",
          "weak": "Room to grow 💪"
        },
        "durationMinutes": "{{m}} min",
        "durationHours": "{{h}} hr",
        "durationHoursMinutes": "{{h}} hr {{m}} min"
      },
      "completionCard": {
        "title": "Project Complete · Completion",
        "subtitle": "Congratulations! You finished the entire project.",
        "description": "Based on your performance data (time spent, conversations, error recovery, concepts unlocked…), we have generated a completion report showing what you built, what you learned, and where to go next."
      }
    }
  },
  "share": {
    "notReady": "Available after generation completes"
  },
  "classroom": {
    "recentClassrooms": "Recent",
    "today": "Today",
    "yesterday": "Yesterday",
    "daysAgo": "days ago",
    "slides": "slides",
    "nameCopied": "Name copied",
    "deleteConfirmTitle": "Delete",
    "delete": "Delete",
    "rename": "Rename",
    "renamePlaceholder": "Enter classroom name",
    "renameFailed": "Failed to rename classroom",
    "searchPlaceholder": "Search courses...",
    "searchAriaLabel": "Search courses",
    "clearSearch": "Clear",
    "searchEmpty": "No courses match your search",
    "newFolderTitle": "New folder",
    "newFolderDesc": "Group courses by topic or use for easier access.",
    "newFolderInline": "New folder…",
    "folderNameLabel": "Folder name",
    "folderNamePlaceholder": "e.g. Math, English, Major courses",
    "folderNameHint": "CJK and Latin both OK; spaces count.",
    "folderNameExists": "A folder with this name already exists",
    "folderCountLimit": "Folder count limit reached",
    "folderWidth": "Width {{width}}/{{max}}",
    "folderCreate": "Create",
    "folderBadge": "Folder",
    "folderCourseCountUnit": "courses",
    "deleteFolderTitle": "Delete folder \"{{name}}\"",
    "deleteFolderEmptyDesc": "This folder is empty. Deletion cannot be undone.",
    "deleteFolderUngroupDesc": "Courses stay in \"My courses\", just unfiled.",
    "moveToFolder": "Move to folder",
    "moveToFolderLabel": "Move to…",
    "ungrouped": "Ungrouped",
    "searchResults": "Search results",
    "folderCreateFailed": "Failed to create folder",
    "folderRenameFailed": "Failed to rename folder",
    "folderDeleteFailed": "Failed to delete folder",
    "moveFailed": "Failed to move course",
    "emptyFolderHint": "This folder is empty",
    "emptyLibraryHint": "No courses yet — create one above, or import a course.",
    "folderNameEmpty": "Folder name cannot be empty",
    "deleteFolderOnly": "Delete folder only",
    "deleteFolderAndCourses": "Delete folder and {{count}} course",
    "deleteFolderAndCourses_other": "Delete folder and {{count}} courses",
    "deleteFolderConfirmRemove": "This removes the folder and its courses, including chat history.",
    "notFound": "Course not found",
    "notFoundDesc": "This course does not exist, or it has been deleted.",
    "backToHome": "Back to home"
  },
  "upload": {
    "pdfSizeLimit": "Supports PDF files up to 50MB",
    "courseMaterialSizeLimit": "Documents, slides, spreadsheets, images, and plain text — up to 50MB (accepted formats depend on the selected extractor)",
    "generateFailed": "Failed to generate classroom, please try again",
    "requirementPlaceholder": "Tell me anything you want to learn, e.g.\n\"Teach me Python from scratch in 30 minutes\"\n\"Explain Fourier Transform on the whiteboard\"\n\"How to play the board game Avalon\"",
    "requirementRequired": "Please enter course requirements",
    "fileTooLarge": "File too large. Please select a file smaller than 50MB",
    "courseMaterialCountLimit": "You can upload up to 5 course material files",
    "courseMaterialTotalSizeLimit": "Total course material size must be under 150MB",
    "unsupportedCourseMaterial": "This format isn't supported by the current extractor. Switch the extractor or pick a different file."
  },
  "generation": {
    "pdfLoadFailed": "Failed to load PDF file, please try again",
    "pdfParseFailed": "PDF parsing failed",
    "analyzingCourseMaterial": "Analyzing documents",
    "analyzingCourseMaterialDesc": "Extracting document structure and content...",
    "courseMaterialLoadFailed": "Failed to load course material, please try again",
    "courseMaterialParseFailed": "Course material parsing failed",
    "streamNotReadable": "Unable to read generation stream",
    "generatingOutlines": "Drafting Course Outline",
    "generatingOutlinesDesc": "Structuring the learning path...",
    "generatingSlideContent": "Generating Page Content",
    "generatingSlideContentDesc": "Creating slides, quizzes, and interactive content...",
    "generatingActions": "Generating Teaching Actions",
    "generatingActionsDesc": "Orchestrating narration, spotlights, and interactions...",
    "generationComplete": "Generation complete!",
    "generationFailed": "Generation failed",
    "speechFailed": "Speech generation failed",
    "retryScene": "Retry",
    "retryingScene": "Regenerating...",
    "backToHome": "Back to Home",
    "sessionNotFound": "Session Not Found",
    "sessionNotFoundDesc": "Please fill in course requirements to start the generation process.",
    "goBackAndRetry": "Go Back and Retry",
    "classroomReady": "Your personalized AI learning environment has been generated successfully.",
    "aiWorking": "AI Agents Working...",
    "textTruncated": "Document text is long, using first {{n}} characters for generation",
    "imageTruncated": "{{total}} images found, exceeding the {{max}} image limit. Extra images will use text descriptions only",
    "agentGeneration": "Generating Classroom Roles",
    "agentGenerationDesc": "Generating roles based on course content...",
    "agentRevealTitle": "Your Classroom Roles",
    "viewAgents": "View Roles",
    "continue": "Continue",
    "outlineRetrying": "Outline generation issue, retrying...",
    "outlineEmptyResponse": "Model returned no valid outlines. Please check model configuration and try again",
    "outlineGenerateFailed": "Outline generation failed, please try again later",
    "sceneGenerateFailed": "Scene generation failed, please try again later",
    "sceneGenerateAuthFailed": "Scene generation failed because the model provider rejected the credentials. Please check your model configuration.",
    "sceneGenerateRateLimited": "Scene generation is rate limited. Please wait a moment and try again.",
    "sceneGenerateProviderUnavailable": "The model provider is temporarily unavailable. Please try again later.",
    "sceneGenerateInvalidResponse": "The model did not return valid scene content. Please try a different model or adjust the course requirements.",
    "reviewOutlineTitle": "Review your outline",
    "reviewOutlineDesc": "Edit, reorder, remove, or add scenes before content generation begins.",
    "reviewOutlineAutoContinue": "Generation will continue automatically unless you review the outline.",
    "outlineEditorTitle": "Scene outline",
    "outlineEditorSummary": "{{count}} scenes total. You can edit, add, remove, or reorder them before generation starts.",
    "addFirstScene": "Add first scene",
    "noOutlines": "No scene outlines yet",
    "sceneTitlePlaceholder": "Scene title",
    "sceneTypeSlide": "Slide",
    "sceneTypeQuiz": "Quiz",
    "sceneTypeInteractive": "Interactive",
    "sceneTypePbl": "PBL",
    "sceneDescriptionPlaceholder": "Briefly describe the purpose and content of this scene",
    "quizQuestionCount": "Question count",
    "quizDifficulty": "Difficulty",
    "quizType": "Question type",
    "quizDifficultyEasy": "Easy",
    "quizDifficultyMedium": "Medium",
    "quizDifficultyHard": "Hard",
    "quizTypeSingle": "Single choice",
    "quizTypeMultiple": "Multiple choice",
    "quizTypeText": "Short answer",
    "alwaysReviewOutlines": "Always review outlines before generation",
    "outlineEditorEyebrow": "AI-generated outline",
    "outlineEditorStreamingProgress": "Streaming · {{count}} scenes ready",
    "outlineEditorStreamingWaiting": "Waiting for the first scene to arrive…",
    "outlineEditorWaitingConfirm": "Waiting for outlines…",
    "outlineExpandHint": "Tap to review",
    "reviewOutlineStreamingDesc": "Outline is still streaming in. You can edit once it's complete.",
    "addKeyPoint": "Add key point",
    "removeKeyPoint": "Remove key point",
    "insertSceneHere": "Insert a scene here",
    "deleteSceneConfirm": "Delete this scene?",
    "deleteSceneConfirmDesc": "This scene and its key points will be removed from the outline.",
    "deleteSceneConfirmAction": "Delete",
    "collapseEditor": "Collapse",
    "quizConfigSummary": "{{count}} questions",
    "interactiveWidgetKind": "Widget kind",
    "widgetSimulation": "Simulation",
    "widgetDiagram": "Diagram",
    "widgetCode": "Code",
    "widgetGame": "Game",
    "widgetVisualization3d": "3D",
    "interactiveConcept": "Concept",
    "interactiveConceptPlaceholder": "Concept to explore",
    "pblConfigSummary": "Project",
    "pblSubtype": "PBL type",
    "pblSubtypeProject": "Project",
    "pblSubtypeScenario": "Scenario",
    "pblProjectTopic": "Project topic",
    "pblProjectTopicPlaceholder": "Project topic",
    "pblProjectDescription": "Description",
    "pblProjectDescriptionPlaceholder": "What students will build",
    "pblScenarioBrief": "Scenario brief",
    "pblScenarioBriefPlaceholder": "Situation, characters, and practice goal",
    "pblTargetSkills": "Target skills",
    "pblAddSkill": "Add skill",
    "widgetProceduralSkill": "Procedural skill",
    "removeSkill": "Remove skill",
    "dragSceneHint": "Drag to reorder; or focus and press Ctrl/⌘ + ↑ / ↓",
    "deleteScene": "Delete scene",
    "backToRequirements": "Back to requirements",
    "confirmAndGenerateCourse": "Confirm and generate course",
    "generatingInProgress": "Generating...",
    "webSearching": "Web Search",
    "webSearchingDesc": "Searching the web for up-to-date information",
    "webSearchFailed": "Web search failed",
    "outlinesReadyCount": "{{ready}} / {{total}} sections ready",
    "jumpToBlankTitle": "Jump to a section that still needs a title",
    "analyzingMediaMaterial": "Analyzing audio/video"
  },
  "settings": {
    "title": "Settings",
    "description": "Configure application settings",
    "language": "Language",
    "languageDesc": "Select interface language",
    "theme": "Theme",
    "themeDesc": "Select theme mode (Light/Dark/System)",
    "themeOptions": {
      "light": "Light",
      "dark": "Dark",
      "system": "System"
    },
    "apiKey": "API Key",
    "apiKeyDesc": "Configure your API key",
    "apiBaseUrl": "API Endpoint URL",
    "apiBaseUrlDesc": "Configure your API endpoint URL",
    "apiKeyRequired": "API key cannot be empty",
    "model": "Model Configuration",
    "modelDesc": "Configure AI models",
    "modelPlaceholder": "Enter or select model name",
    "ttsModel": "TTS Model",
    "ttsModelDesc": "Configure TTS models",
    "ttsModelPlaceholder": "Enter or select TTS model name",
    "ttsModelOptions": {
      "openaiTts": "OpenAI TTS",
      "azureTts": "Azure TTS"
    },
    "availableModels": "Available Models",
    "modelSelectedViaVoice": "Model is determined by voice selection",
    "testConnection": "Test Connection",
    "testConnectionDesc": "Test current API configuration is available",
    "testing": "Testing...",
    "agentSettings": "Agent Settings",
    "agentSettingsDesc": "Select the agents to participate in the conversation. Select 1 for single agent mode, select multiple for multi-agent collaborative mode.",
    "agentMode": "Agent Mode",
    "agentModePreset": "Preset",
    "agentModeAuto": "Auto-generate",
    "agentModeAutoDesc": "AI will automatically generate appropriate roles",
    "autoAgentCount": "Agent Count",
    "autoAgentCountDesc": "Number of agents to auto-generate (including teacher)",
    "atLeastOneAgent": "Please select at least 1 agent",
    "singleAgentMode": "Single Agent Mode",
    "directAnswer": "Direct Answer",
    "multiAgentMode": "Multi-Agent Mode",
    "agentsCollaborating": "Collaborative Discussion",
    "agentsCollaboratingCount": "{{count}} agents selected for collaborative discussion",
    "priority": "Priority",
    "actions": "Actions",
    "actionCount": "{{count}} actions",
    "selectedAgent": "Selected Agent",
    "selectedAgents": "Selected Agents",
    "required": "Required",
    "agentNames": {
      "default-1": "AI Teacher",
      "default-2": "AI Assistant",
      "default-3": "Class Clown",
      "default-4": "Curious Mind",
      "default-5": "Note Taker",
      "default-6": "Deep Thinker"
    },
    "agentRoles": {
      "teacher": "Teacher",
      "assistant": "Assistant",
      "student": "Student"
    },
    "agentDescriptions": {
      "default-1": "Lead teacher with clear and structured explanations",
      "default-2": "Supports learning and helps clarify key points",
      "default-3": "Brings humor and energy to the classroom",
      "default-4": "Always curious, loves asking why and how",
      "default-5": "Diligently records and organizes class notes",
      "default-6": "Thinks deeply and explores the essence of topics"
    },
    "close": "Close",
    "save": "Save",
    "providers": "LLM",
    "addProviderDescription": "Add custom model providers to extend available AI models",
    "providerNames": {
      "openai": "OpenAI",
      "azure": "Azure OpenAI",
      "anthropic": "Claude",
      "google": "Gemini",
      "bedrock": "Amazon Bedrock",
      "deepseek": "DeepSeek",
      "qwen": "Qwen",
      "kimi": "Kimi",
      "minimax": "MiniMax",
      "glm": "GLM",
      "siliconflow": "SiliconFlow",
      "doubao": "Doubao",
      "openrouter": "OpenRouter",
      "grok": "Grok",
      "tencent-hunyuan": "Tencent Hunyuan",
      "xiaomi": "Xiaomi MiMo",
      "lemonade": "Lemonade (Local)",
      "ollama": "Ollama (Local)",
      "tavily": "Tavily",
      "bocha": "Bocha",
      "brave": "Brave Search",
      "baidu": "Baidu",
      "claude": "Claude",
      "searxng": "SearXNG"
    },
    "providerTypes": {
      "openai": "OpenAI Protocol",
      "azure": "Azure OpenAI",
      "anthropic": "Claude Protocol",
      "google": "Gemini Protocol",
      "bedrock": "Amazon Bedrock"
    },
    "modelCount": "models",
    "modelSingular": "model",
    "defaultModel": "Default Model",
    "webSearch": "Web Search",
    "mcp": "MCP",
    "knowledgeBase": "Knowledge Base",
    "documentParser": "Document Parser",
    "conversationSettings": "Conversation",
    "keyboardShortcuts": "Shortcuts",
    "generalSettings": "General",
    "systemSettings": "System",
    "addProvider": "Add",
    "importFromClipboard": "Import from Clipboard",
    "apiSecret": "API Key",
    "apiHost": "Base URL",
    "azureDeploymentHint": "Enter your Azure OpenAI endpoint above, then add each Azure deployment name as a model.",
    "baseUrlRegion": {
      "china": "China",
      "international": "International",
      "xiaomiPayg": "Pay-as-you-go",
      "xiaomiTokenPlanCN": "Token Plan CN",
      "xiaomiTokenPlanSGP": "Token Plan SG",
      "xiaomiTokenPlanEU": "Token Plan EU"
    },
    "requestUrl": "Request URL",
    "models": "Models",
    "comfyuiWorkflows": "Workflows",
    "comfyuiRefresh": "Refresh",
    "comfyuiNoWorkflowsFoundPrefix": "No workflow JSON files found in",
    "comfyuiAddWorkflowPrefix": "Add a",
    "comfyuiAddWorkflowSuffix": "file to get started.",
    "comfyuiFolderHintPrefix": "Place workflow JSON files in your",
    "comfyuiFolderHintMiddle": "folder. The filename becomes the display name — e.g.",
    "comfyuiLoadError": "Failed to load workflows: {error}",
    "addModel": "Add",
    "reset": "Reset",
    "fetch": "Fetch",
    "connectionSuccess": "Connection successful",
    "connectionFailed": "Connection failed",
    "capabilities": {
      "vision": "Vision",
      "tools": "Tools",
      "streaming": "Streaming"
    },
    "contextWindow": "Context",
    "contextShort": "ctx",
    "outputWindow": "Output",
    "addProviderButton": "Add",
    "addProviderDialog": "Add Model Provider",
    "providerName": "Name",
    "providerNamePlaceholder": "e.g., My OpenAI Proxy",
    "providerNameRequired": "Please enter provider name",
    "providerApiMode": "API Mode",
    "apiModeOpenAI": "OpenAI Protocol",
    "apiModeAnthropic": "Claude Protocol",
    "apiModeGoogle": "Gemini Protocol",
    "defaultBaseUrl": "Default Base URL",
    "providerIcon": "Provider Icon URL",
    "requiresApiKey": "Requires API Key",
    "deleteProvider": "Delete Provider",
    "deleteProviderConfirm": "Are you sure you want to delete this provider?",
    "addCustomTTSProvider": "Add Custom TTS Provider",
    "addCustomASRProvider": "Add Custom ASR Provider",
    "addCustomAudioProviderDescription": "Add a custom OpenAI-compatible audio provider",
    "customVoices": "Voices",
    "voiceIdPlaceholder": "Voice ID (e.g. alloy)",
    "voiceNamePlaceholder": "Display Name",
    "addVoice": "Add",
    "modelNamePlaceholder": "Optional",
    "defaultModelHint": "Model name sent in API requests (e.g. kokoro, tts-1)",
    "noVoicesAdded": "No voices added yet. Add voices below for per-agent selection.",
    "noModelsAdded": "No models added yet. Add models below to enable model selection.",
    "noModelsWarning": "Please add at least one model below before using this provider.",
    "asrNoTranscription": "No transcription generated. Try speaking louder or longer.",
    "cannotDeleteBuiltIn": "Cannot delete built-in provider",
    "resetToDefault": "Reset to Default",
    "resetToDefaultDescription": "Restore model list to default configuration (API key and Base URL will be preserved)",
    "resetConfirmDescription": "This will remove all custom models and restore the built-in default model list. API key and Base URL will be preserved.",
    "confirmReset": "Confirm Reset",
    "resetSuccess": "Successfully reset to default configuration",
    "saveSuccess": "Settings saved",
    "saveFailed": "Failed to save settings, please try again",
    "cannotDeleteBuiltInModel": "Cannot delete built-in model",
    "cannotEditBuiltInModel": "Cannot edit built-in model",
    "modelIdRequired": "Please enter model ID",
    "noModelsAvailable": "No models available for testing",
    "providerMetadata": "Provider Metadata",
    "editModel": "Edit Model",
    "editModelDescription": "Edit model configuration and capabilities",
    "addNewModel": "New Model",
    "modelsManagementDescription": "Manage the models and capabilities available for this provider.",
    "addNewModelDescription": "Add a new model configuration",
    "modelId": "Model ID",
    "modelIdPlaceholder": "e.g., gpt-4o",
    "modelName": "Display Name",
    "modelCapabilities": "Capabilities",
    "advancedSettings": "Advanced Settings",
    "contextWindowLabel": "Context Window",
    "contextWindowPlaceholder": "e.g., 128000",
    "outputWindowLabel": "Max Output Tokens",
    "outputWindowPlaceholder": "e.g., 4096",
    "testModel": "Test Model",
    "deleteModel": "Delete",
    "cancelEdit": "Cancel",
    "saveModel": "Save",
    "howToUse": "How to Use",
    "step1ConfigureProvider": "Go to \"Model Providers\", select or add a provider, and configure connection settings (API key, Base URL, etc.)",
    "step2SelectModel": "Select the model you want to use in \"Active Model\" below",
    "step3StartUsing": "After saving, the system will use your selected model",
    "activeModel": "Active Model",
    "activeModelDescription": "Select the model for AI conversations and content generation",
    "searchModels": "Search models",
    "noModelsFound": "No matching models found",
    "noConfiguredProviders": "No configured providers",
    "configureProvidersFirst": "Please configure provider connection settings in \"Model Providers\" on the left",
    "currentlyUsing": "Currently using",
    "ttsSettings": "Text-to-Speech",
    "asrSettings": "Speech Recognition",
    "audioSettings": "Audio Settings",
    "ttsSection": "Text-to-Speech (TTS)",
    "asrSection": "Automatic Speech Recognition (ASR)",
    "ttsDescription": "TTS (Text-to-Speech) - Convert text to speech",
    "asrDescription": "ASR (Automatic Speech Recognition) - Convert speech to text",
    "enableTTS": "Enable Text-to-Speech",
    "ttsEnabledDescription": "When enabled, speech audio will be generated during course creation",
    "ttsVoiceConfigHint": "Per-agent voice can be configured in \"Classroom Role Config\" on the homepage",
    "enableASR": "Enable Speech Recognition",
    "asrEnabledDescription": "When enabled, students can use microphone for voice input",
    "ttsProvider": "TTS Provider",
    "ttsLanguageFilter": "Language Filter",
    "allLanguages": "All Languages",
    "ttsVoice": "Voice",
    "ttsSpeed": "Speed",
    "ttsBaseUrl": "Base URL",
    "ttsApiKey": "API Key",
    "doubaoAppId": "App ID",
    "doubaoAccessKey": "Access Key",
    "asrProvider": "ASR Provider",
    "asrLanguage": "Recognition Language",
    "asrBaseUrl": "Base URL",
    "asrApiKey": "API Key",
    "enterApiKey": "Enter API Key",
    "enterCustomBaseUrl": "Enter custom Base URL",
    "browserNativeNote": "Browser Native ASR requires no configuration and is completely free",
    "providerOpenAITTS": "OpenAI TTS (gpt-4o-mini-tts)",
    "providerAzureTTS": "Azure TTS",
    "providerGLMTTS": "GLM TTS",
    "providerQwenTTS": "Qwen TTS (Alibaba Cloud Bailian)",
    "providerVoxCPMTTS": "VoxCPM2",
    "providerDoubaoTTS": "Doubao TTS 2.0 (Volcengine)",
    "providerElevenLabsTTS": "ElevenLabs TTS",
    "providerMiniMaxTTS": "MiniMax TTS",
    "providerLemonadeTTS": "Lemonade TTS (Local)",
    "providerBrowserNativeTTS": "Browser Native TTS",
    "voxcpmBackend": "Backend",
    "voxcpmBaseUrlPending": "Enter a Base URL to generate the request URL",
    "voxcpmAutoVoiceNoPreview": "Auto Voice is generated from agent context and cannot be previewed directly",
    "voxcpmVoicesTitle": "VoxCPM Voices",
    "voxcpmVoicesDescription": "Saved in this browser and added to the shared Agent Bar voice pool.",
    "voxcpmAutoVoicePrivacyNote": "Auto Voice sends the agent persona to your configured VoxCPM backend as the voice prompt.",
    "voxcpmPromptCount": "Prompt {{count}}",
    "voxcpmCloneCount": "Clone {{count}}",
    "voxcpmCloneUnsupported": "Current backend does not support cloning",
    "voxcpmVoicePool": "Voice Pool",
    "voxcpmVoiceCount": "{{count}} voices",
    "voxcpmAutoVoice": "Auto Voice",
    "voxcpmAutoVoiceDescription": "Use the agent persona as the voice prompt",
    "voxcpmUnavailable": "Unavailable",
    "voxcpmClone": "Clone",
    "voxcpmCloneUnsupportedDetail": "Current backend does not support cloning",
    "voxcpmNoCustomVoices": "No custom voices yet",
    "voxcpmCloneSaveOnly": "Saved only for this backend",
    "voxcpmVoiceNamePlaceholder": "Voice name",
    "voxcpmPromptPlaceholder": "Example: clear, natural teacher voice with moderate pace",
    "voxcpmAddVoice": "Add Voice",
    "voxcpmCloneVoiceNamePlaceholder": "Cloned voice name",
    "voxcpmUploadReferenceAudio": "Upload reference audio",
    "voxcpmRecord": "Record",
    "voxcpmReferenceAudioLimitHint": "Reference audio must be 10 MB / 60 seconds or smaller and is converted to WAV before saving.",
    "voxcpmReferenceTextPlaceholder": "Reference audio transcript, optional",
    "voxcpmVoiceDescriptionPlaceholder": "Voice description, optional",
    "voxcpmAddClone": "Add Clone",
    "voxcpmRecordingUnsupported": "This browser does not support recording",
    "voxcpmRecordedVoiceName": "Recorded Voice",
    "voxcpmRecordingFailed": "Recording conversion failed",
    "voxcpmRecordingStartFailed": "Unable to start recording",
    "voxcpmBaseUrlRequired": "Enter a VoxCPM Base URL first",
    "voxcpmPreviewFailed": "Preview failed",
    "voxcpmVoiceSaved": "VoxCPM voice saved",
    "voxcpmVoiceSaveFailed": "Failed to save voice",
    "voxcpmReferenceAudioInvalid": "Invalid reference audio",
    "voxcpmCloneSaved": "VoxCPM cloned voice saved",
    "voxcpmCloneSaveFailed": "Failed to save cloned voice",
    "voxcpmStopPreview": "Stop preview",
    "voxcpmPreviewVoice": "Preview voice",
    "voxcpmDeleteVoice": "Delete voice",
    "qwenCloneVoicesTitle": "Qwen TTS Cloned Voices",
    "qwenCloneRefText": "Enter the verbatim transcript of the reference audio",
    "qwenCloneRefAudioHint": "Use a clean 1–60 second voice sample. A 10–20 second sample is recommended; audio is converted to 24 kHz mono PCM WAV.",
    "qwenCloneSaved": "Qwen cloned voice registered and saved",
    "qwenCloneSaveFailed": "Failed to register the Qwen cloned voice",
    "qwenCloneUnsupported": "Recording is not supported in this browser; upload an audio file instead.",
    "qwenCloneSpeedHint": "Cloned voices always synthesize at 1× speed.",
    "qwenCloneDeleteWarning": "The voice was removed locally, but provider deletion failed.",
    "qwenCloneNarrationUnavailable": "The assigned voice is unavailable. Narration will use another enabled voice instead.",
    "qwenCloneDiscussionUnavailable": "The assigned voice is unavailable. Discussion will use another enabled voice instead.",
    "providerOpenAIWhisper": "OpenAI ASR (gpt-4o-mini-transcribe)",
    "providerBrowserNative": "Browser Native ASR",
    "providerQwenASR": "Qwen ASR (Alibaba Cloud Bailian)",
    "providerFunASRASR": "FunASR (Local)",
    "providerLemonadeASR": "Lemonade ASR (Local)",
    "providerAzureASR": "Azure STT",
    "providerUnpdf": "unpdf (Built-in)",
    "providerMinerU": "MinerU",
    "providerMinerUCloud": "MinerU (Cloud)",
    "browserNativeTTSNote": "Browser Native TTS requires no configuration and is completely free, using system built-in voices",
    "testTTS": "Test TTS",
    "testASR": "Test ASR",
    "testSuccess": "Test Successful",
    "testFailed": "Test Failed",
    "ttsTestText": "TTS Test Text",
    "ttsTestSuccess": "TTS test successful, audio played",
    "ttsTestFailed": "TTS test failed",
    "asrTestSuccess": "Speech recognition successful",
    "asrTestFailed": "Speech recognition failed",
    "asrProcessing": "Processing...",
    "asrResult": "Recognition Result",
    "asrNotSupported": "Browser does not support Speech Recognition API",
    "browserTTSNotSupported": "Browser does not support Speech Synthesis API",
    "browserTTSNoVoices": "Current browser has no available TTS voices",
    "microphoneAccessDenied": "Microphone access denied",
    "microphoneAccessFailed": "Failed to access microphone",
    "asrResultPlaceholder": "Recognition result will be displayed after recording",
    "useThisProvider": "Use This Provider",
    "fetchVoices": "Fetch Voice List",
    "fetchingVoices": "Fetching...",
    "voicesFetched": "Voices fetched",
    "fetchVoicesFailed": "Failed to fetch voices",
    "voiceApiKeyRequired": "API Key required",
    "voiceBaseUrlRequired": "Base URL required",
    "ttsTestTextPlaceholder": "Enter text to convert",
    "ttsTestTextDefault": "Hello, this is a test speech.",
    "startRecording": "Start Recording",
    "stopRecording": "Stop Recording",
    "recording": "Recording...",
    "transcribing": "Transcribing...",
    "transcriptionResult": "Transcription Result",
    "noTranscriptionResult": "No transcription result",
    "baseUrlOptional": "Base URL (Optional)",
    "defaultValue": "Default",
    "voiceMarin": "Recommended - Best Quality",
    "voiceCedar": "Recommended - Best Quality",
    "voiceAlloy": "Neutral, Balanced",
    "voiceAsh": "Steady, Professional",
    "voiceBallad": "Elegant, Lyrical",
    "voiceCoral": "Warm, Friendly",
    "voiceEcho": "Male, Clear",
    "voiceFable": "Narrative, Vivid",
    "voiceNova": "Female, Bright",
    "voiceOnyx": "Male, Deep",
    "voiceSage": "Wise, Composed",
    "voiceShimmer": "Female, Soft",
    "voiceVerse": "Natural, Smooth",
    "glmVoiceTongtong": "Default voice",
    "glmVoiceChuichui": "Chuichui voice",
    "glmVoiceXiaochen": "Xiaochen voice",
    "glmVoiceJam": "Jam voice",
    "glmVoiceKazi": "Kazi voice",
    "glmVoiceDouji": "Douji voice",
    "glmVoiceLuodo": "Luodo voice",
    "qwenVoiceCherry": "Sunny, warm and natural",
    "qwenVoiceSerena": "Gentle and soft",
    "qwenVoiceEthan": "Energetic and vibrant",
    "qwenVoiceChelsie": "Anime virtual girlfriend",
    "qwenVoiceMomo": "Playful and cheerful",
    "qwenVoiceVivian": "Cute and sassy",
    "qwenVoiceMoon": "Cool and handsome",
    "qwenVoiceMaia": "Intellectual and gentle",
    "qwenVoiceKai": "A SPA for your ears",
    "qwenVoiceNofish": "Designer who can't pronounce retroflex sounds",
    "qwenVoiceBella": "Little loli who doesn't get drunk",
    "qwenVoiceJennifer": "Brand-level, cinematic American female voice",
    "qwenVoiceRyan": "Fast-paced, dramatic performance",
    "qwenVoiceKaterina": "Mature lady with memorable rhythm",
    "qwenVoiceAiden": "American boy who masters cooking",
    "qwenVoiceEldricSage": "Steady and wise elder",
    "qwenVoiceMia": "Gentle as spring water, well-behaved as snow",
    "qwenVoiceMochi": "Smart little adult with childlike innocence",
    "qwenVoiceBellona": "Loud voice, clear pronunciation, vivid characters",
    "qwenVoiceVincent": "Unique hoarse voice telling tales of war and honor",
    "qwenVoiceBunny": "Super cute loli",
    "qwenVoiceNeil": "Professional news anchor",
    "qwenVoiceElias": "Professional instructor",
    "qwenVoiceArthur": "Simple voice soaked by years and dry tobacco",
    "qwenVoiceNini": "Soft and sticky voice like glutinous rice cake",
    "qwenVoiceEbona": "Her whisper is like a rusty key",
    "qwenVoiceSeren": "Gentle and soothing voice to help you sleep",
    "qwenVoicePip": "Naughty but full of childlike innocence",
    "qwenVoiceStella": "Sweet confused girl voice that becomes just when shouting",
    "qwenVoiceBodega": "Enthusiastic Spanish uncle",
    "qwenVoiceSonrisa": "Enthusiastic Latin American lady",
    "qwenVoiceAlek": "Cold of battle nation, warm under woolen coat",
    "qwenVoiceDolce": "Lazy Italian uncle",
    "qwenVoiceSohee": "Gentle, cheerful Korean unnie",
    "qwenVoiceOnoAnna": "Mischievous childhood friend",
    "qwenVoiceLenn": "Rational German youth who wears suit and listens to post-punk",
    "qwenVoiceEmilien": "Romantic French big brother",
    "qwenVoiceAndre": "Magnetic, natural and calm male voice",
    "qwenVoiceRadioGol": "Football poet Rádio Gol!",
    "qwenVoiceJada": "Lively Shanghai lady",
    "qwenVoiceDylan": "Beijing boy",
    "qwenVoiceLi": "Patient yoga teacher",
    "qwenVoiceMarcus": "Broad face, short words, solid heart - old Shaanxi taste",
    "qwenVoiceRoy": "Humorous and straightforward Taiwanese boy",
    "qwenVoicePeter": "Tianjin cross-talk professional supporter",
    "qwenVoiceSunny": "Sweet Sichuan girl",
    "qwenVoiceEric": "Chengdu gentleman",
    "qwenVoiceRocky": "Humorous Hong Kong guy",
    "qwenVoiceKiki": "Sweet Hong Kong girl",
    "lang_auto": "Auto Detect",
    "lang_zh": "中文",
    "lang_yue": "粤語",
    "lang_en": "English",
    "lang_ja": "日本語",
    "lang_ko": "한국어",
    "lang_es": "Español",
    "lang_fr": "Français",
    "lang_de": "Deutsch",
    "lang_ru": "Русский",
    "lang_ar": "العربية",
    "lang_pt": "Português",
    "lang_it": "Italiano",
    "lang_af": "Afrikaans",
    "lang_hy": "Հայերեն",
    "lang_az": "Azərbaycan",
    "lang_be": "Беларуская",
    "lang_bs": "Bosanski",
    "lang_bg": "Български",
    "lang_ca": "Català",
    "lang_hr": "Hrvatski",
    "lang_cs": "Čeština",
    "lang_da": "Dansk",
    "lang_nl": "Nederlands",
    "lang_et": "Eesti",
    "lang_fi": "Suomi",
    "lang_gl": "Galego",
    "lang_el": "Ελληνικά",
    "lang_he": "עברית",
    "lang_hi": "हिन्दी",
    "lang_hu": "Magyar",
    "lang_is": "Íslenska",
    "lang_id": "Bahasa Indonesia",
    "lang_kn": "ಕನ್ನಡ",
    "lang_kk": "Қазақша",
    "lang_lv": "Latviešu",
    "lang_lt": "Lietuvių",
    "lang_mk": "Македонски",
    "lang_ms": "Bahasa Melayu",
    "lang_mr": "मराठी",
    "lang_mi": "Te Reo Māori",
    "lang_ne": "नेपाली",
    "lang_no": "Norsk",
    "lang_fa": "فارسی",
    "lang_pl": "Polski",
    "lang_ro": "Română",
    "lang_sr": "Српски",
    "lang_sk": "Slovenčina",
    "lang_sl": "Slovenščina",
    "lang_sw": "Kiswahili",
    "lang_sv": "Svenska",
    "lang_tl": "Tagalog",
    "lang_fil": "Filipino",
    "lang_ta": "தமிழ்",
    "lang_th": "ไทย",
    "lang_tr": "Türkçe",
    "lang_uk": "Українська",
    "lang_ur": "اردو",
    "lang_vi": "Tiếng Việt",
    "lang_cy": "Cymraeg",
    "lang_zh-CN": "中文（简体，中国）",
    "lang_zh-TW": "中文（繁體，台灣）",
    "lang_zh-HK": "粵語（香港）",
    "lang_yue-Hant-HK": "粵語（繁體）",
    "lang_en-US": "English (United States)",
    "lang_en-GB": "English (United Kingdom)",
    "lang_en-AU": "English (Australia)",
    "lang_en-CA": "English (Canada)",
    "lang_en-IN": "English (India)",
    "lang_en-NZ": "English (New Zealand)",
    "lang_en-ZA": "English (South Africa)",
    "lang_ja-JP": "日本語（日本）",
    "lang_ko-KR": "한국어（대한민국）",
    "lang_de-DE": "Deutsch (Deutschland)",
    "lang_fr-FR": "Français (France)",
    "lang_es-ES": "Español (España)",
    "lang_es-MX": "Español (México)",
    "lang_es-AR": "Español (Argentina)",
    "lang_es-CO": "Español (Colombia)",
    "lang_it-IT": "Italiano (Italia)",
    "lang_pt-BR": "Português (Brasil)",
    "lang_pt-PT": "Português (Portugal)",
    "lang_ru-RU": "Русский (Россия)",
    "lang_nl-NL": "Nederlands (Nederland)",
    "lang_pl-PL": "Polski (Polska)",
    "lang_cs-CZ": "Čeština (Česko)",
    "lang_da-DK": "Dansk (Danmark)",
    "lang_fi-FI": "Suomi (Suomi)",
    "lang_sv-SE": "Svenska (Sverige)",
    "lang_no-NO": "Norsk (Norge)",
    "lang_tr-TR": "Türkçe (Türkiye)",
    "lang_el-GR": "Ελληνικά (Ελλάδα)",
    "lang_hu-HU": "Magyar (Magyarország)",
    "lang_ro-RO": "Română (România)",
    "lang_sk-SK": "Slovenčina (Slovensko)",
    "lang_bg-BG": "Български (България)",
    "lang_hr-HR": "Hrvatski (Hrvatska)",
    "lang_ca-ES": "Català (Espanya)",
    "lang_ar-SA": "العربية (السعودية)",
    "lang_ar-EG": "العربية (مصر)",
    "lang_he-IL": "עברית (ישראל)",
    "lang_hi-IN": "हिन्दी (भारत)",
    "lang_th-TH": "ไทย (ประเทศไทย)",
    "lang_vi-VN": "Tiếng Việt (Việt Nam)",
    "lang_id-ID": "Bahasa Indonesia (Indonesia)",
    "lang_ms-MY": "Bahasa Melayu (Malaysia)",
    "lang_fil-PH": "Filipino (Pilipinas)",
    "lang_af-ZA": "Afrikaans (Suid-Afrika)",
    "lang_uk-UA": "Українська (Україна)",
    "pdfSettings": "PDF Parsing",
    "documentParsingSettings": "Document Parsing",
    "supportedFormats": "Supported Formats",
    "mineruSelfHostFormatsNote": "PDF and image parsing require the mineru[pipeline] or mineru[core] extras on your MinerU server. Lightweight mineru-api installs may only handle Office documents.",
    "pdfParsingSettings": "PDF Parsing Settings",
    "pdfDescription": "Choose PDF parsing engine with support for text extraction, image processing, and table recognition",
    "pdfProvider": "PDF Parser",
    "pdfFeatures": "Supported Features",
    "pdfApiKey": "API Key",
    "pdfBaseUrl": "Base URL",
    "mineruDescription": "MinerU is a commercial PDF parsing service that supports advanced features such as table extraction, formula recognition, and layout analysis.",
    "mineruApiKeyRequired": "You need to apply for an API Key on the MinerU website before use.",
    "mineruWarning": "Warning",
    "mineruCostWarning": "MinerU is a commercial service and may incur fees. Please check the MinerU website for pricing details.",
    "enterMinerUApiKey": "Enter MinerU API Key",
    "mineruLocalDescription": "MinerU supports local deployment with advanced PDF parsing (tables, formulas, layout analysis). Requires deploying MinerU service first.",
    "mineruServerAddress": "Local MinerU server address (e.g., http://localhost:8080)",
    "mineruApiKeyOptional": "Only required if server has authentication enabled",
    "mineruCloudApiKeyPlaceholder": "Enter MinerU Cloud API Key",
    "optionalApiKey": "Optional API Key",
    "featureText": "Text Extraction",
    "featureImages": "Image Extraction",
    "featureTables": "Table Extraction",
    "featureFormulas": "Formula Recognition",
    "featureLayoutAnalysis": "Layout Analysis",
    "featureMetadata": "Metadata",
    "enableImageGeneration": "Enable AI Image Generation",
    "imageGenerationDisabledHint": "When enabled, images will be auto-generated during course creation",
    "imageSettings": "Image Generation",
    "imageSection": "Text to Image",
    "imageProvider": "Image Generation Provider",
    "imageModel": "Image Generation Model",
    "providerSeedream": "Seedream (ByteDance)",
    "providerOpenAIImage": "OpenAI Image",
    "providerQwenImage": "Qwen Image (Alibaba)",
    "providerNanoBanana": "Nano Banana (Gemini)",
    "providerMiniMaxImage": "MiniMax Image",
    "providerGrokImage": "Grok Image (xAI)",
    "providerComfyUIImage": "ComfyUI Image",
    "providerLemonadeImage": "Lemonade Image (Local)",
    "testImageGeneration": "Test Image Generation",
    "testImageConnectivity": "Test Connection",
    "imageConnectivitySuccess": "Image service connected successfully",
    "imageConnectivityFailed": "Image service connection failed",
    "imageTestSuccess": "Image generation test succeeded",
    "imageTestFailed": "Image generation test failed",
    "imageTestPromptPlaceholder": "Enter image description to test",
    "imageTestPromptDefault": "A cute cat sitting on a desk",
    "imageGenerating": "Generating image...",
    "imageGenerationFailed": "Image generation failed",
    "enableVideoGeneration": "Enable AI Video Generation",
    "videoGenerationDisabledHint": "When enabled, videos will be auto-generated during course creation",
    "videoSettings": "Video Generation",
    "videoSection": "Text to Video",
    "videoProvider": "Video Generation Provider",
    "videoModel": "Video Generation Model",
    "providerSeedance": "Seedance (ByteDance)",
    "providerKling": "Kling (Kuaishou)",
    "providerVeo": "Veo (Google)",
    "providerSora": "Sora (OpenAI)",
    "providerMiniMaxVideo": "MiniMax Video",
    "providerGrokVideo": "Grok Video (xAI)",
    "providerHappyHorse": "HappyHorse (Alibaba Cloud)",
    "testVideoGeneration": "Test Video Generation",
    "testVideoConnectivity": "Test Connection",
    "videoConnectivitySuccess": "Video service connected successfully",
    "videoConnectivityFailed": "Video service connection failed",
    "testingConnection": "Testing...",
    "videoTestSuccess": "Video generation test succeeded",
    "videoTestFailed": "Video generation test failed",
    "videoTestPromptDefault": "A cute cat walking on a desk",
    "videoGenerating": "Generating video (est. 1-2 min)...",
    "videoGenerationWarning": "Video generation usually takes 1-2 minutes, please be patient",
    "mediaRetry": "Retry",
    "mediaContentSensitive": "Sorry, this content triggered a safety check.",
    "mediaGenerationDisabled": "Generation disabled in settings",
    "singleAgent": "Single Agent",
    "multiAgent": "Multi-Agent",
    "selectAgents": "Select Agents",
    "noVisionWarning": "Current model does not support vision. Images can still be placed in slides, but the model cannot understand image content to optimize selection and layout",
    "serverConfigured": "Server",
    "serverConfiguredNotice": "This provider is managed by the server and can't be edited here. To use your own credentials, add a separate provider.",
    "ttsProviderEnabledLabel": "Enable this provider",
    "ttsProviderEnabledHint": "When off, this provider is hidden from the voice picker and never auto-assigned.",
    "ttsProviderUnavailableHint": "Configure this provider before enabling it.",
    "ttsProviderDisabledByAdmin": "This provider has been disabled by the server administrator and cannot be enabled.",
    "optionalOverride": "Optional — leave empty to use server config",
    "setupNeeded": "Setup required",
    "modelNotConfigured": "Please select a model to get started",
    "dangerZone": "Danger Zone",
    "clearCache": "Clear Local Cache",
    "clearCacheDescription": "Delete all locally stored data, including classroom records, chat history, audio cache, and app settings. This action cannot be undone.",
    "clearCacheConfirmTitle": "Are you sure you want to clear all cache?",
    "clearCacheConfirmDescription": "This will permanently delete all of the following data and cannot be recovered:",
    "clearCacheConfirmItems": "Classrooms & scenes, Chat history, Audio & image cache, App settings & preferences",
    "clearCacheConfirmInput": "Type \"DELETE\" to continue",
    "clearCacheConfirmPhrase": "DELETE",
    "clearCacheButton": "Permanently Delete All Data",
    "clearCacheSuccess": "Cache cleared, page will refresh shortly",
    "clearCacheFailed": "Failed to clear cache, please try again",
    "clearCacheBlockedByOtherTabs": "Close other app tabs and retry.",
    "persistUnavailable": "Your changes aren't being saved because the app can't access its stored data. If reloading doesn't help, clear the local cache in Settings.",
    "persistChangesLost": "Storage is working again, but changes you made while it was unavailable could not be saved and have been replaced by the last saved version.",
    "webSearchSettings": "Web Search",
    "webSearchApiKey": "Search API Key",
    "webSearchApiKeyPlaceholder": "Enter your search API key",
    "webSearchApiKeyPlaceholderServer": "Server key configured, optionally override",
    "webSearchApiKeyHint": "Get an API key from the selected search provider",
    "claudeSearchModel": "Search Model",
    "claudeSearchModelHint": "The Claude model that runs web searches and summarizes results.",
    "webSearchApiKeyOptional": "API key is optional. Without one, public page scraping will be used as a fallback.",
    "searxngServerOnlyNotice": "SearXNG must be configured on the server. Set the SEARXNG_BASE_URL environment variable (or the web-search section in server-providers.yml). Client-supplied instance URLs are not accepted.",
    "baiduSubSources": "Baidu Search Sources",
    "baiduSubSourcesDescription": "Choose at least one Baidu source to query.",
    "baiduSubSourceWeb": "Web Search",
    "baiduSubSourceWebDescription": "General web pages from Baidu AI Search.",
    "baiduSubSourceBaike": "Baidu Baike",
    "baiduSubSourceBaikeDescription": "Encyclopedia entries from Baidu Baike.",
    "baiduSubSourceScholar": "Baidu Scholar",
    "baiduSubSourceScholarDescription": "Academic papers from Baidu Scholar.",
    "viewDocs": "API Docs",
    "webSearchBaseUrl": "Base URL",
    "webSearchServerConfigured": "Server-side search API key is configured",
    "optional": "Optional",
    "selectProvider": "Select Provider",
    "customProvider": "Custom",
    "presetPickHint": "Picking a provider auto-fills its base URL and protocol; enter your key then click \"Fetch Models\". Not listed? Use \"Custom\".",
    "presetCategory": {
      "tokenPlan": "Token Plans",
      "aggregator": "Aggregators",
      "thirdParty": "Vendors",
      "official": "Official"
    },
    "fetchModels": "Fetch Models",
    "fetchModelsResult": "Fetched {total} models, added {added}",
    "fetchModelsNoEndpoint": "This provider has no model list endpoint — add models manually",
    "fetchModelsAuthError": "API key is invalid or expired",
    "fetchModelsFailed": "Failed to fetch models",
    "usage": {
      "title": "Usage",
      "refresh": "Refresh",
      "disclaimer": "Usage is system-tracked; only server-side calls are counted.",
      "totalRequests": "Requests",
      "totalTokens": "LLM Tokens",
      "dailyTrend": "Daily Token Trend",
      "tokens": "Tokens",
      "byModel": "By Model",
      "model": "Model",
      "type": "Type",
      "reqs": "Reqs",
      "usage": "Usage",
      "empty": "No usage data yet",
      "kindLlm": "LLM",
      "kindImage": "Image",
      "kindVideo": "Video",
      "kindTts": "Speech",
      "kindAsr": "ASR",
      "unitToken": "tokens",
      "unitImage": "images",
      "unitSecond": "sec",
      "unitCharacter": "chars"
    },
    "tokenPlan": {
      "nav": "Token Plan",
      "title": "Token Plan Setup",
      "desc": "Pick your token plan provider and enter the key — it auto-configures every adapted modality (LLM/image/video/speech/web search).",
      "selectPlan": "Select Provider",
      "apiKey": "API Key",
      "enable": "Enable",
      "updateKey": "Update key",
      "modelsCount": "{{n}} models",
      "capabilities": "Capabilities offered",
      "offeredNote": "Models offered by this plan. Pick the ones you want on the generation bar — availability depends on your plan tier, and unsupported models will error at generation time."
    },
    "skills": {
      "nav": "Skills",
      "title": "Skill settings",
      "description": "Browse the skills installed for your account, inspect a skill, and download it as a zip to share or back up.",
      "mySkills": "My skills",
      "builtinSkills": "Built-in skills",
      "emptyMySkills": "No skills of your own yet — ask the agent in a chat to create one from history.",
      "emptyBuiltinSkills": "No built-in skills are available.",
      "listFailed": "Could not load the skill list",
      "retry": "Retry",
      "badgeBuiltin": "Built-in",
      "badgeOwner": "My skill",
      "badgeConstraints": "Constraints",
      "details": "Details",
      "download": "Download",
      "detailFailed": "Could not load the skill details",
      "contentLabel": "Content",
      "builtinDetailNote": "This skill ships with OpenMAIC. Download it to import into another agent workspace.",
      "upload": "Upload",
      "uploading": "Uploading…",
      "uploadFailed": "Could not upload the skill. Check the file and try again.",
      "delete": "Delete",
      "deleting": "Deleting…",
      "deleteTitle": "Delete skill?",
      "deleteConfirm": "This removes the skill from your account. This action cannot be undone.",
      "deleteFailed": "Could not delete the skill. Please try again."
    },
    "ttsBrowserNativeTimelineNotice": "Browser-native TTS doesn't support the editor timeline's audio features (preview, regenerate, and bulk voiceover). Switch to a managed TTS provider to generate and manage per-line audio.",
    "alidocmindAccessKeyId": "AccessKey ID",
    "alidocmindAccessKeySecret": "AccessKey Secret"
  },
  "workspace": {
    "untitledCourse": "Untitled course",
    "sceneCount": "{{count}} pages",
    "sceneCount_one": "{{count}} page",
    "sceneCount_other": "{{count}} pages",
    "courseLinkHint": "Open {{name}} in the right pane",
    "courseLinkMore": "{{count}} more classroom(s)",
    "courseMention": {
      "title": "Reference a classroom for this message",
      "empty": "No classroom matches",
      "alreadyNamed": "Already referenced",
      "remove": "Remove {{name}}",
      "pillHint": "This message references {{name}}",
      "notAccepted": "The server is temporarily unavailable. Please try again shortly.",
      "reference": "Reference {{name}}",
      "capped": "Showing the first {{count}} — keep typing to narrow it down"
    },
    "heroTitle": "What will you create today?",
    "heroSubtitle": "Share an idea and turn it into a learning journey people can step into",
    "newSession": "New chat",
    "sections": {
      "courses": "Courses",
      "sessions": "Chats"
    },
    "coursesEmpty": "No courses yet",
    "sessionsEmpty": "No chats yet",
    "loading": "Loading",
    "loadFailed": "Couldn't load",
    "retry": "Retry",
    "untitledSession": "Untitled chat",
    "pagePosition": "Page {{index}} of {{total}}",
    "exitPro": "Exit Pro",
    "navAria": "Workspace navigation",
    "homeAria": "Back to home",
    "currentSession": "Current chat",
    "startLearning": "Start learning",
    "time": {
      "justNow": "Just now",
      "minutesAgo": "{{count}}m ago",
      "hoursAgo": "{{count}}h ago",
      "daysAgo": "{{count}}d ago"
    },
    "sessionStatus": {
      "connecting": "Connecting",
      "queued": "Queued",
      "running": "Running",
      "succeeded": "Ready",
      "failed": "Needs attention",
      "cancelled": "Stopped"
    },
    "backToWorkspace": "Back to workspace",
    "searchPlaceholder": "Filter by name",
    "searchAria": "Search {{section}}",
    "searchEmpty": "No matches",
    "showMore": "Show {{count}} more",
    "showLess": "Show less",
    "utilitiesAria": "Preferences and account",
    "resizeAria": "Drag to resize the sidebar",
    "chatPaneAria": "Chat panel",
    "classroomPaneAria": "Classroom",
    "collapseNav": "Collapse navigation",
    "expandNav": "Expand navigation",
    "expandNavInto": "Expand navigation · {{section}}",
    "collapseChat": "Collapse conversation",
    "expandChat": "Conversation",
    "collapseClassroom": "Collapse classroom",
    "expandClassroom": "Classroom",
    "readOnlyBadge": "Read-only",
    "noCourseTitle": "No course open",
    "noCourseHint": "Open one from a course link in the conversation, or pick one from the list on the left — the conversation stays put",
    "resizeChatAria": "Drag to resize the conversation pane",
    "firstPageLanding": "The first page is landing…",
    "autoSaving": "Auto-saving…",
    "autoSaved": "Saved",
    "collapsedTitle": "Both panes are collapsed",
    "collapsedHint": "Use the tabs on the left to bring the conversation or the classroom back",
    "moreUtilities": "More",
    "rowMore": "More actions for {{name}}",
    "folderDeleteHint": "The courses inside move back to the top level. Nothing is deleted.",
    "dropToUnfile": "Drop here to move out of the folder",
    "renameInvalid": "A name must be 1–120 characters",
    "renameForbidden": "You did not create this course, so you cannot rename it",
    "renameGone": "That course no longer exists",
    "renameSession": "Rename chat",
    "renameSessionAria": "Rename chat “{{name}}”",
    "renameSessionFailed": "Rename failed, please retry",
    "delete": "Delete",
    "confirmDelete": "Confirm delete",
    "deleting": "Deleting…",
    "deleteFailed": "Couldn't delete. Please try again.",
    "tabsAria": "Chats and courses",
    "courseTabsAria": "Open courses",
    "courseTabClose": "Close tab: {{name}}",
    "courseTabRunning": "Generating",
    "foldersUnavailable": "Folders are not available in this build"
  },
  "profile": {
    "title": "Profile",
    "defaultNickname": "Learner",
    "chooseAvatar": "Choose Avatar",
    "uploadAvatar": "Upload",
    "bioPlaceholder": "Tell us about yourself — the AI teacher will personalize lessons for you...",
    "avatarHint": "Your avatar will appear in classroom discussions and chats",
    "fileTooLarge": "Image too large — please choose one under 5 MB",
    "invalidFileType": "Please select an image file",
    "editTooltip": "Click to edit profile"
  },
  "media": {
    "imageCapability": "Image Generation",
    "imageHint": "Generate images in slides",
    "videoCapability": "Video Generation",
    "videoHint": "Generate videos in slides",
    "ttsCapability": "Text-to-Speech",
    "ttsHint": "AI teacher speaks aloud",
    "asrCapability": "Speech Recognition",
    "asrHint": "Voice input for discussion",
    "provider": "Provider",
    "model": "Model",
    "voice": "Voice",
    "speed": "Speed",
    "language": "Language"
  },
  "proMode": {
    "attach": "Attach material",
    "mentionCourse": "Reference a classroom",
    "loadSkill": "Load a skill",
    "skillMenuTitle": "Choose a course-design skill",
    "skillsLoading": "Loading skills…",
    "noSkillsAvailable": "No skills available",
    "userSkillsGroup": "My Skills",
    "builtinSkillsGroup": "Built-in Skills",
    "skillsLoadFailed": "Skills failed to load. Click to retry",
    "retrySkills": "Retry",
    "noSkillMatch": "No Skills match “{{query}}”",
    "badgeAria": "Pro mode",
    "badgeEnter": "Pro mode",
    "badgeExit": "Back to classic",
    "launchPlaceholder": "Describe the learning experience you want to create",
    "launchSend": "Start build"
  },
  "accessCode": {
    "title": "Enter Access Code",
    "placeholder": "Access code",
    "error": "Invalid access code. Please try again."
  },
  "workbench": {
    "tool": {
      "label": {
        "extractMaterial": null,
        "waitMaterials": null
      },
      "error": {
        "materialExtraction": null
      }
    }
  }
}
