{ "common": { "you": "You", "confirm": "Confirm", "cancel": "Cancel", "loading": "Loading...", "back": "Back" }, "home": { "slogan": "Generative Learning in Multi-Agent Interactive Classroom" }, "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", "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." }, "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" }, "multiTab": { "conflict": { "title": "Another tab is editing this course", "body": "Editing is locked to a single tab to avoid conflicting changes. Close the other tab (or wait for its session to time out) before entering edit mode here.", "actionDismiss": "Got it" } }, "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", "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" }, "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": { "preview": "Preview", "regenerate": "Regenerate voiceover", "statusReady": "Voiced", "statusNone": "Not voiced", "statusGenerating": "Generating", "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" }, "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" } }, "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." }, "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": { "modeLabel": "Generation mode", "normalMode": "Standard generation", "largeMode": "Large task", "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", "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", "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." }, "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" }, "profile": { "title": "Profile", "defaultNickname": "Learner" }, "media": { "imageCapability": "Image Generation", "imageShort": "Image", "imageHint": "Generate images in slides", "videoCapability": "Video Generation", "videoShort": "Video", "videoHint": "Generate videos in slides", "ttsCapability": "Text-to-Speech", "ttsShort": "Voice", "ttsHint": "AI teacher speaks aloud", "asrCapability": "Speech Recognition", "asrShort": "Mic", "asrHint": "Voice input for discussion", "webSearchShort": "Search", "provider": "Provider", "model": "Model", "voice": "Voice", "speed": "Speed", "language": "Language" }, "accessCode": { "title": "Enter Access Code", "placeholder": "Access code", "error": "Invalid access code. Please try again." }, "publish": { "title": "Publish courseware", "menuDesc": "Freeze and publish to the courseware registry", "desc": "Freezes the current classroom into an immutable bundle and uploads it to the courseware registry (server). Published courseware plays directly on the learner end with no runtime generation.", "freezeHint": "A completeness gate runs before publish: every narration audio and scene media must resolve, or the publish fails.", "publish": "Publish", "packaging": "Packaging courseware…", "uploading": "Uploading to the courseware registry…", "success": "Published", "failed": "Publish failed", "retry": "Retry", "errorHint": "Add the missing resources and publish again. If the issue persists, check the ops and registry publish configuration (COURSEWARE_PUBLISH_TOKEN).", "coursewareId": "Courseware ID", "version": "Version", "scenes": "Scenes", "quizScenes": "Quiz scenes", "copyUrl": "Copy URL", "copied": "Copied", "untitled": "Untitled courseware", "sceneCount": "{{count}} scenes", "manageLink": "Open publish management", "manageTitle": "Courseware publish management", "manageDesc": "Versions published to the courseware registry", "backToApp": "Back to app", "refresh": "Refresh", "loading": "Loading…", "loadFailed": "Load failed", "empty": "Nothing published yet. Use “Publish courseware” in the classroom export menu.", "learnerUrl": "Learner URL", "learnerUrlHint": "Users open this link to start learning" }, "learner": { "resolving": "Resolving courseware…", "downloading": "Downloading courseware (first visit)…", "opening": "Opening courseware…", "loadFailed": "Failed to load courseware", "retry": "Retry", "backHome": "Back to home", "onceHint": "The courseware downloads once on first visit; later visits play from the local cache.", "catalogBrand": "MAILUO Learning", "catalogTitle": "Course Catalog", "catalogDesc": "High-quality courseware, ready to learn. Ask the AI assistant anytime.", "catalogCount": "{{count}} courses", "catalogEmpty": "No courses published yet. Check back later.", "quizCount": "{{count}} quizzes", "publishedAt": "Published", "openCatalog": "Open learner catalog" }, "qa": { "title": "AI Assistant", "toggle": "Toggle AI assistant", "welcome": "Hi, I'm this course's AI assistant 👋\nAsk me anything about the course content,\nor let me search the web for up-to-date info.", "placeholder": "Type your question…", "streaming": "Thinking…", "searched": "Web search used", "sceneRef": "Course scene", "error": "Error", "voiceOn": "Read-aloud on", "voiceOff": "Read-aloud off" }, "resume": { "title": "Resuming courseware generation", "sceneProgress": "Scene {{done}}/{{total}}", "generatingScene": "Generating: {{title}}", "moreScenes": "…{{count}} more scenes queued", "mediaResume": "Polishing courseware (generating missing media)…", "failedTitle": "Some scenes failed to generate", "failedHint": "Retry the failed scenes, or enter the classroom to see what is ready", "retry": "Retry", "enterClassroom": "Enter classroom", "backHome": "Back to home" }, "jobs": { "title": "Background generation", "subtitle": "Runs on the server — close the page and it keeps going", "backgroundMode": "Background", "started": "Generation started in the background; you can leave this page", "viewTasks": "View tasks", "statusQueued": "Queued", "statusRunning": "Generating", "statusSucceeded": "Done", "statusFailed": "Failed", "statusCancelled": "Cancelled", "cancel": "Cancel", "open": "Open", "deleteConfirm": "Delete this job? Its generated courseware will be removed too.", "sceneProgress": "Scene {{done}}/{{total}}", "empty": "No background generation jobs", "loadFailed": "Failed to load jobs", "foregroundFallback": "Uploaded materials or interactive mode active — using foreground generation (background mode does not support these yet)", "generateBackground": "Background", "generateForeground": "Foreground", "backgroundHint": "Runs on the server — close the page and it keeps going; manage it in the task panel below", "foregroundHint": "Interactive generation: outline review + per-scene progress (supports materials & interactive mode)", "resume": "Resume" }, "course": { "createTitle": "Create a large course", "createPlaceholder": "Describe your large topic, e.g. Introduction to Machine Learning — from linear regression to neural networks, covering supervised/unsupervised learning, model evaluation and tuning, for absolute beginners…\nThe system will first plan a course framework (4-15 modules) for your review; only after you confirm will it generate a complete courseware for each module.", "createAction": "Create & build framework", "webSearch": "Web research", "imageGen": "Generate images", "videoGen": "Generate videos", "tts": "Generate audio", "listTitle": "Courses", "empty": "No large courses yet — create your first one with the form above.", "modulesProgress": "Modules {{succeeded}}/{{total}}", "status": { "queued": "Queued", "framework_generating": "Building framework", "framework_ready": "Awaiting confirmation", "generating": "Generating modules", "completed": "Completed", "failed": "Failed", "cancelled": "Cancelled" }, "frameworkGenerating": "Building the course framework…", "frameworkGeneratingHint": "The topic is being decomposed into modules (~1 minute). You will review and confirm it before modules are generated.", "frameworkReviewTitle": "Framework ready — please confirm", "frameworkReviewHint": "No module courseware is generated until you confirm; you can regenerate the framework if needed.", "targetAudience": "Target learners", "languageDirectiveLabel": "Teaching language & terminology", "courseGoals": "Whole-course goals", "continuityContract": "Cross-module continuity contract (click to expand)", "terminology": "Terminology rules", "teachingStyle": "Teaching style", "difficultyProgression": "Difficulty progression", "assessmentStrategy": "Assessment strategy", "moduleGenerationDetails": "Review module goals, knowledge boundaries & generation prompt", "learningObjectives": "Learning objectives", "prerequisites": "Prerequisites", "incomingKnowledge": "Assumed incoming knowledge", "outgoingKnowledge": "Knowledge handed to later modules", "excludedTopics": "Topics excluded from this module", "generationPrompt": "Master-agent generation prompt", "none": "None", "actualOutput": "Actual generated output", "scenesUnit": "scenes", "semanticHash": "Semantic hash", "actualCoverage": "Actual coverage", "actualInteractions": "Actual interactions", "actualAssessments": "Actual assessments", "startModulesAction": "Confirm & generate modules", "regenerateFrameworkAction": "Regenerate framework", "confirmCostHint": "After confirming, {{count}} module coursewares will be generated one by one — track progress, cancel, or regenerate an ordered tail from any module.", "awaitingConfirmHint": "Framework ready — awaiting confirmation", "moduleGenerating": "Generating module {{index}}: {{title}}", "jobSceneProgress": "Scenes {{done}}/{{total}}", "panelTitle": "Large courses", "progressTitle": "Generation progress", "publishedCount": "{{count}} modules published", "progressHint": "Modules are generated strictly in order. A failure pauses later modules until it is fixed, so they can continue from actual prior output.", "frameworkTitle": "Course framework", "languageDirective": "Language directive (click to expand)", "modulesTitle": "Modules (in learning order)", "noModules": "The framework is still generating — the module list will appear shortly…", "moduleStatus": { "pending": "Pending", "generating": "Generating", "succeeded": "Done", "failed": "Failed" }, "publishedBadge": "Published", "openClassroom": "Open courseware", "previewLearner": "Learner preview", "regenerateModule": "Regenerate from here", "regenerateModuleCascadeHint": "This module's actual output affects continuity, so this module and every later module will be regenerated in order.", "cancelAction": "Cancel", "resumeAction": "Resume", "publishAction": "Publish course", "learnerLink": "Learner link", "copied": "Copied", "backToList": "Back to courses", "createdAt": "Created", "actionDone": { "publish": "Course published", "start": "Module generation started", "resume": "Generation resumed", "cancel": "Cancellation requested", "regenerate": "This module and its downstream modules are regenerating in order", "frameworkRegenerate": "Framework regeneration started" }, "learner": { "brand": "Large Course", "backToCatalog": "Back to catalog", "backToCourse": "Back to course", "catalogCourses": "Large courses (learn module by module)", "catalogCoursewares": "Single-courseware courses", "moduleCount": "{{count}} modules", "progress": "Learning progress", "progressHint": "Module progress is stored on this device; mark a module complete after finishing it.", "moduleStatus": { "notStarted": "Not started", "inProgress": "In progress", "completed": "Completed" }, "enterModule": "Start learning", "markDone": "Mark complete", "undoDone": "Unmark", "notFound": "Course not found or not published yet." } } }