| 1 | import type { DeepStringShape } from './index' |
| 2 | import { zh } from './zh' |
| 3 | |
| 4 | export const en = { |
| 5 | common: { |
| 6 | cancel: 'Cancel', |
| 7 | delete: 'Delete', |
| 8 | edit: 'Edit', |
| 9 | preview: 'Preview', |
| 10 | save: 'Save', |
| 11 | dontSave: "Don't save", |
| 12 | saving: 'Saving...', |
| 13 | copy: 'Copy', |
| 14 | optional: 'Optional', |
| 15 | retryLater: 'Please try again later', |
| 16 | loading: 'Loading...' |
| 17 | }, |
| 18 | generationNotifications: { |
| 19 | untitled: 'Untitled presentation', |
| 20 | view: 'View', |
| 21 | completed: '"{title}" generation completed', |
| 22 | partial: '"{title}" completed with {count} failed page(s)', |
| 23 | failed: '"{title}" generation failed' |
| 24 | }, |
| 25 | templateDialog: { |
| 26 | createTitle: 'Save as Template', |
| 27 | editTitle: 'Edit Template', |
| 28 | createDescription: 'Save this deck for future reuse.', |
| 29 | editDescription: 'Update the name, description, and tags.', |
| 30 | nameLabel: 'Template name', |
| 31 | descriptionLabel: 'Description', |
| 32 | descriptionPlaceholder: 'Use case, structure, or visual style', |
| 33 | tagsLabel: 'Tags', |
| 34 | tagsPlaceholder: 'Separate with commas, e.g. business, review, data', |
| 35 | update: 'Update' |
| 36 | }, |
| 37 | templates: { |
| 38 | eyebrow: 'Templates', |
| 39 | title: 'Templates', |
| 40 | description: 'Manage saved deck templates and use them to create new presentation sessions.', |
| 41 | count: '{count} templates', |
| 42 | refresh: 'Refresh', |
| 43 | importPptx: 'Import PPTX as template', |
| 44 | pageCount: '{count} pages', |
| 45 | thumbnailGenerating: 'Preparing cover', |
| 46 | pageCountLabel: 'Pages', |
| 47 | noDescription: 'No description', |
| 48 | use: 'Use', |
| 49 | emptyTitle: 'No templates yet', |
| 50 | emptyDescription: 'Save reusable layouts here for faster starts.', |
| 51 | emptyHint: 'Save from the editor or session list', |
| 52 | loadFailed: 'Failed to load templates', |
| 53 | settingsRequiredTitle: 'Setup required', |
| 54 | settingsRequiredDescription: 'Please configure storage, model, and API key first.', |
| 55 | goToSettings: 'Go to settings', |
| 56 | documentSingleOnly: 'Upload one reference document at a time.', |
| 57 | documentCountExceeded: 'Too many documents', |
| 58 | documentTooLargeTitle: 'Document too large', |
| 59 | documentTooLarge: 'Document must be under {maxSize}MB.', |
| 60 | documentPathFailedTitle: 'Failed to read document', |
| 61 | documentPathFailed: 'Cannot read the document path. Please choose again.', |
| 62 | referenceAttached: 'Reference document attached', |
| 63 | referenceProcessingWait: |
| 64 | 'The reference file is still processing. Please wait before generating.', |
| 65 | referenceAttachFailed: 'Failed to attach reference document', |
| 66 | removeReference: 'Remove reference document', |
| 67 | documentParsed: 'Document parsed', |
| 68 | documentParsedDescription: |
| 69 | 'Processed {count} source item(s) and filled the title, pages, and outline', |
| 70 | documentParseFailed: 'Failed to parse document', |
| 71 | pptxSingleOnlyTitle: 'Too many files', |
| 72 | pptxSingleOnly: 'Import one PPTX at a time.', |
| 73 | unsupportedPptxTitle: 'Unsupported file', |
| 74 | unsupportedPptx: 'Please choose a .pptx file.', |
| 75 | pptxTooLargeTitle: 'PPTX too large', |
| 76 | pptxTooLarge: 'PPTX must be under {maxSize}MB.', |
| 77 | pptxPathFailedTitle: 'Failed to read PPTX', |
| 78 | pptxPathFailed: 'Cannot read the PPTX path. Please choose again.', |
| 79 | pptxTemplatePreparing: 'Preparing import', |
| 80 | importingPptxTemplate: 'Importing PPTX template', |
| 81 | pptxTemplateImported: 'PPTX template imported', |
| 82 | pptxTemplateImportedDescription: 'Added to the template library with {pageCount} pages', |
| 83 | pptxTemplateImportedWithWarnings: |
| 84 | 'Added to the template library with {pageCount} pages and {warningCount} warning(s)', |
| 85 | pptxTemplateImportFailed: 'Failed to import PPTX template', |
| 86 | briefRequired: 'Please enter a brief or upload a document outline first.', |
| 87 | sessionCreated: 'Session created from template', |
| 88 | sessionCreatedDescription: 'Regenerating content with the selected template', |
| 89 | directEditCreatedDescription: 'Template pages copied and ready to edit', |
| 90 | createFailed: 'Failed to create from template', |
| 91 | deleted: 'Template deleted', |
| 92 | deleteFailed: 'Failed to delete template', |
| 93 | updated: 'Template updated', |
| 94 | updateFailed: 'Failed to update template', |
| 95 | previewTitle: 'Template preview', |
| 96 | previewDescription: '{count} pages. Scan the full structure and visual rhythm.', |
| 97 | pageFallback: 'Page {pageNumber}', |
| 98 | useDialogTitle: 'Create session from template', |
| 99 | useDialogDescription: |
| 100 | 'Enter a content direction or upload a document outline. Generation uses the source document and keeps the template visuals.', |
| 101 | sessionTitleLabel: 'Session title', |
| 102 | briefLabel: 'Brief / outline', |
| 103 | parsed: 'Parsed', |
| 104 | briefPlaceholder: |
| 105 | 'Describe the topic, audience, structure, and priorities, or upload a document to parse an outline.', |
| 106 | parsingDocument: 'Parsing...', |
| 107 | processingDocument: 'Processing...', |
| 108 | uploadDocument: 'Upload reference document', |
| 109 | uploadDocumentTooltip: |
| 110 | 'Supports txt, md, csv, and docx (≤{maxSize}MB). Uploading only attaches a reference document and does not change the form. Use "AI analyze and fill" to analyze it with the selected model and suggest the title, page count, and outline.', |
| 111 | analyzeDocument: 'AI analyze and fill', |
| 112 | analyzeDocumentTooltip: |
| 113 | 'Analyze the uploaded reference document with the selected model and suggest a title, page count, and outline. Nothing is written to the form until you confirm.', |
| 114 | analyzingDocument: 'Parsing...', |
| 115 | supportedDocuments: 'Supports md/txt/csv/docx, up to {maxSize}MB', |
| 116 | creating: 'Creating...', |
| 117 | creatingEditable: 'Creating editable session', |
| 118 | createEditable: 'Create for editing', |
| 119 | createAndGenerate: 'Create and generate', |
| 120 | deleteTitle: 'Delete template', |
| 121 | deleteDescription: 'Delete "{name}"? Existing sessions will not be affected.', |
| 122 | deleting: 'Deleting...' |
| 123 | }, |
| 124 | app: { |
| 125 | updateAvailable: 'New version {version} available', |
| 126 | updateAvailableDescription: 'Current version: {currentVersion}. Click to download.', |
| 127 | updateAvailableTitle: 'New version {version} available', |
| 128 | updateAvailableDialogDescription: |
| 129 | 'Current version: {currentVersion}. You can download the update now.', |
| 130 | currentVersion: 'Current version', |
| 131 | latestVersion: 'Latest version', |
| 132 | download: 'Download', |
| 133 | downloadHome: 'Official download', |
| 134 | changeLog: 'Changelog', |
| 135 | later: 'Later', |
| 136 | open: 'Open' |
| 137 | }, |
| 138 | nav: { |
| 139 | home: 'Home', |
| 140 | sessions: 'Sessions', |
| 141 | editHtml: 'Web Editor', |
| 142 | templates: 'Templates', |
| 143 | styles: 'Styles', |
| 144 | fonts: 'Fonts', |
| 145 | tokenUsage: 'Token usage', |
| 146 | settings: 'Settings', |
| 147 | helpDocs: 'Help docs', |
| 148 | backToSessions: 'Back to sessions', |
| 149 | newPresentation: 'New presentation', |
| 150 | tagline: 'AI presentation workbench' |
| 151 | }, |
| 152 | home: { |
| 153 | eyebrow: 'Unleash your creativity', |
| 154 | title: 'Start a new presentation task', |
| 155 | description: |
| 156 | 'Built-in 70+ styles, custom style support, Chart.js charts, anime.js animation, and a progressive workflow from task brief to session refinement.', |
| 157 | uploadDocument: 'Upload document/image', |
| 158 | uploadReference: 'Upload reference file', |
| 159 | processingReference: 'Processing...', |
| 160 | uploadReferenceTooltip: |
| 161 | 'Supports txt, md, csv, docx (≤{maxSize}MB), and png/jpg/webp images (≤{imageMaxSize}MB). Uploading only attaches source material and does not change the form. For images, click "Parse" on the image tag first so the app can turn them into generation-ready reference content.', |
| 162 | referenceAttached: 'Reference file attached', |
| 163 | imageReferenceAttachedNeedsParse: |
| 164 | 'Image uploaded. Parse it into a readable reference document first.', |
| 165 | imageReferenceNeedsParse: |
| 166 | 'The uploaded image cannot be used directly as a reference file. Click "Parse" on the image tag first.', |
| 167 | imageReferenceNeedsParseShort: 'Image cannot be used until parsed', |
| 168 | imageReferenceTagTooltip: |
| 169 | 'This image is pending parsing and cannot be passed to generation directly. Click "Parse" to create a readable reference document.', |
| 170 | parseImageReference: 'Parse', |
| 171 | parsingImageReference: 'Parsing', |
| 172 | imageReferenceParsed: 'Image parsed into a readable reference document', |
| 173 | referenceProcessingWait: |
| 174 | 'The reference file is still processing. Please wait before generating.', |
| 175 | referenceAttachFailed: 'Failed to attach reference file', |
| 176 | removeReference: 'Remove reference file', |
| 177 | revealReferenceFile: 'Show reference file', |
| 178 | revealReferenceFileTooltip: 'Reveal this reference file in its folder without opening it', |
| 179 | revealReferenceFileFailed: 'Failed to show reference file', |
| 180 | analyzeReference: 'AI analyze and fill', |
| 181 | analyzeReferenceTooltip: |
| 182 | 'Use the selected model to analyze the reference file and suggest a title, page count, and brief. Nothing is written to the form until you confirm.', |
| 183 | analyzingReference: 'Analyzing...', |
| 184 | referenceAttachHint: |
| 185 | 'Upload only attaches source material; AI analysis consumes model tokens and suggests form values.', |
| 186 | analysisSuggestionTitle: 'Suggestions', |
| 187 | currentValue: 'Current', |
| 188 | emptyValue: 'Empty', |
| 189 | applyEmptyFields: 'Fill empty fields', |
| 190 | applySelectedFields: 'Apply selected', |
| 191 | parsingDocument: 'Parsing...', |
| 192 | uploadDocumentTooltip: |
| 193 | 'Supports txt, md, csv, docx (≤{maxSize}MB), and png/jpg/webp images (≤{imageMaxSize}MB). Parsing fills in the topic, page count, and detailed brief; documents remain available as generation references, while images are turned into an editable creation brief and a custom style.', |
| 194 | importPptx: 'Import PPTX for AI editing', |
| 195 | importingPptx: 'Importing and parsing...', |
| 196 | importPptxTooltip: |
| 197 | 'Import an existing PPTX — it converts to editable pages and extracts a reusable style template.', |
| 198 | parsed: 'Parsed', |
| 199 | localOnly: 'Documents/images are parsed into AI-readable context for the current task.', |
| 200 | topic: 'Topic', |
| 201 | topicPlaceholder: 'Example: 2026 AI Agent product roadmap', |
| 202 | style: 'Style', |
| 203 | stylePlaceholder: 'Select style', |
| 204 | fontScheme: 'Font scheme', |
| 205 | fontSchemeAuto: 'Auto match', |
| 206 | fontSchemeAutoHint: 'AI will choose title and body fonts based on the topic and style.', |
| 207 | fontSchemeManualHint: 'Uses the selected fonts as title and body fonts.', |
| 208 | fontSchemePartialHint: |
| 209 | 'Choose both title and body fonts to lock the pair; otherwise AI will keep matching fonts automatically.', |
| 210 | fontPairTitle: 'Title', |
| 211 | fontPairBody: 'Body', |
| 212 | fontPairBoth: 'Title/Body', |
| 213 | fontSourceUploaded: 'User', |
| 214 | fontSourceBuiltIn: 'Built-in', |
| 215 | pageCount: 'Pages', |
| 216 | slideSize: 'Canvas size', |
| 217 | slideSizeWide: 'Widescreen 16:9', |
| 218 | slideSizeVertical: 'Vertical 9:16', |
| 219 | slideSizeStandard: 'Standard 4:3', |
| 220 | slideSizeSquare: 'Square 1:1', |
| 221 | slideSizePortrait: 'Portrait 3:4', |
| 222 | slideSizeXiaohongshu: 'Xiaohongshu', |
| 223 | enableImageGeneration: 'Enable image generation', |
| 224 | imageGenerationHint: 'Pages generate images only when a layout visual slot benefits from one.', |
| 225 | imageModel: 'Image model', |
| 226 | imageModelPlaceholder: 'Select an image model', |
| 227 | imageModelRequired: 'Select an available image model before enabling image generation.', |
| 228 | imageModelUnavailable: 'Configure an available image model in Settings first.', |
| 229 | brief: 'Detailed brief', |
| 230 | animationPreferences: 'Animation preferences', |
| 231 | animationPreferenceOptions: { |
| 232 | fade: 'Soft fade', |
| 233 | 'fade-up': 'Fade up', |
| 234 | 'fade-down': 'Fade down', |
| 235 | 'fade-left': 'Fade from right', |
| 236 | 'fade-right': 'Fade from left', |
| 237 | 'scale-in': 'Soft scale in', |
| 238 | 'slide-up': 'Slide up', |
| 239 | 'slide-down': 'Slide down', |
| 240 | 'slide-left': 'Slide left', |
| 241 | 'slide-right': 'Slide right', |
| 242 | 'fly-in': 'Directional fly-in', |
| 243 | wipe: 'Wipe reveal', |
| 244 | 'zoom-in': 'Zoom in', |
| 245 | 'spin-in': 'Soft spin in', |
| 246 | 'pulse-soft': 'Soft pulse', |
| 247 | pulse: 'Pulse', |
| 248 | 'pulse-strong': 'Strong pulse', |
| 249 | 'grow-shrink-soft': 'Soft grow-shrink', |
| 250 | 'grow-shrink': 'Grow-shrink', |
| 251 | 'grow-shrink-strong': 'Strong grow-shrink' |
| 252 | }, |
| 253 | animationPreferenceLimitReached: 'Select up to 3 animation preferences', |
| 254 | documentOutline: 'Document outline', |
| 255 | outlinePageCount: '{count} pages', |
| 256 | outlineRoleChapter: 'Chapter', |
| 257 | outlineRoleContent: 'Content', |
| 258 | outlineItemTitle: 'Title', |
| 259 | outlineItemContent: 'Brief summary', |
| 260 | outlineSourceRange: 'Source lines {start}-{end}', |
| 261 | briefPlaceholder: |
| 262 | 'You can include:\n- The outline structure and what each section or page should cover\n- Which parts of the source document matter most, including conclusions, data, or examples to keep\n- How each page should present the content, such as chart, comparison, process, or summary; for click animation, say "click to reveal items", "keyboard reveal", "step-by-step narration", "expand item by item", or "presentation pacing control"\n- How to organize the source material, such as background, solution, then summary\n- Anything to emphasize, de-emphasize, or avoid', |
| 263 | creating: 'Creating...', |
| 264 | createAndStart: 'Create session and start', |
| 265 | unnamedTopic: 'Untitled topic', |
| 266 | defaultPrompt: 'Create a {pageCount}-page presentation about "{topic}" in the {style} style.', |
| 267 | settingsRequired: 'Please complete model and storage configuration in Settings first.', |
| 268 | settingsRequiredTitle: 'Settings incomplete', |
| 269 | goToSettings: 'Go to settings', |
| 270 | completeInfoTitle: 'Complete the form', |
| 271 | validationTopic: 'Please enter a topic.', |
| 272 | validationStylesLoading: 'Styles are still loading. Please try again shortly.', |
| 273 | validationStyle: 'Please select a style.', |
| 274 | validationStyleMissing: 'The selected style no longer exists. Please choose again.', |
| 275 | validationPageCount: 'Please enter page count ({min}-{max}).', |
| 276 | validationPageCountNumber: 'Page count must be a number.', |
| 277 | validationPageCountRange: 'Page count must be between {min} and {max}.', |
| 278 | validationBrief: 'Please enter a detailed brief.', |
| 279 | styleLoadFailed: 'Failed to load styles', |
| 280 | sessionCreated: 'Session created', |
| 281 | generationStarted: 'Generation started', |
| 282 | sessionCreateFailed: 'Failed to create session', |
| 283 | pptxStorageRequiredTitle: 'Storage directory required', |
| 284 | pptxStorageRequired: 'Please choose a storage directory in Settings before importing a PPTX.', |
| 285 | documentSingleOnly: 'Upload one document or image at a time.', |
| 286 | documentCountExceeded: 'Too many documents', |
| 287 | documentTooLargeTitle: 'File too large', |
| 288 | documentTooLarge: |
| 289 | 'A single document or image must be under {maxSize}MB. Please compress or split it.', |
| 290 | imageTooLarge: 'A single image must be under {maxSize}MB. Please compress it and try again.', |
| 291 | documentPathFailedTitle: 'Cannot read file path', |
| 292 | documentPathFailed: 'Cannot read the file path. Please choose a local document or image again.', |
| 293 | documentParsed: 'Parsed', |
| 294 | documentParsedDescription: |
| 295 | 'Processed {count} source item(s) and filled the topic, page count, and brief', |
| 296 | imageParsedWithStyle: 'Processed the image reference and created custom style "{style}"', |
| 297 | documentParseFailed: 'Failed to parse file', |
| 298 | pptxSingleOnlyTitle: 'Too many PPTX files', |
| 299 | pptxSingleOnly: 'Import one PPTX file at a time.', |
| 300 | unsupportedFileTitle: 'Unsupported file type', |
| 301 | unsupportedPptx: 'Please upload a .pptx file.', |
| 302 | pptxTooLargeTitle: 'PPTX file too large', |
| 303 | pptxTooLarge: 'A single PPTX must be under {maxSize}MB.', |
| 304 | pptxPathFailedTitle: 'Cannot read PPTX path', |
| 305 | pptxPathFailed: 'Please choose a local PPTX file again.', |
| 306 | pptxPreparing: 'Preparing PPTX import...', |
| 307 | pptxImportDone: 'PPTX imported', |
| 308 | pptxImportedWithWarnings: 'Imported {pageCount} pages with {warningCount} fallback warning(s).', |
| 309 | pptxImported: 'Imported {pageCount} pages.', |
| 310 | pptxImportFailed: 'Failed to import PPTX' |
| 311 | }, |
| 312 | sessions: { |
| 313 | eyebrow: 'Sessions', |
| 314 | title: 'Sessions', |
| 315 | newSession: 'New session', |
| 316 | importSessionFile: 'Import session file', |
| 317 | importSessionFileTooltip: |
| 318 | 'Supports importing for secondary editing:\n1. slide-pack files exported by OhMyPPT\n2. standard session directory ZIPs (zip the whole session folder)\n(Note: files exported from the editing page)', |
| 319 | importing: 'Importing...', |
| 320 | importDone: 'Session imported', |
| 321 | importedFallbackTitle: 'Imported session', |
| 322 | importedDescription: 'Imported "{title}" with {pageCount} pages.', |
| 323 | importFailed: 'Failed to import session', |
| 324 | emptyTitle: 'No sessions yet', |
| 325 | emptyDescription: 'Create your first presentation task', |
| 326 | searchButton: 'Search sessions', |
| 327 | searchPlaceholder: 'Search session titles', |
| 328 | clearSearch: 'Clear search', |
| 329 | noSearchResultsTitle: 'No matching sessions', |
| 330 | noSearchResultsDescription: 'Try another title keyword.', |
| 331 | sourcePptx: 'PPTX import', |
| 332 | sourceSessionFile: 'Session import', |
| 333 | sourceSaveAsNew: 'Saved as new', |
| 334 | sourceDocument: 'Document', |
| 335 | sourceAi: 'AI created', |
| 336 | sourceThinking: 'Think Mode', |
| 337 | sourceTemplate: 'Template', |
| 338 | statusComplete: 'Complete', |
| 339 | statusPartialComplete: 'Partially complete', |
| 340 | statusPartialCompleteTip: 'Enter editor to fix error pages', |
| 341 | statusContinuable: 'Can continue', |
| 342 | statusRegenerate: 'Regenerate needed', |
| 343 | statusQueued: 'Queued', |
| 344 | statusGenerating: 'Generating', |
| 345 | statusGeneratingProgress: 'Generating {progress}%', |
| 346 | actionEnter: 'Open session', |
| 347 | actionContinue: 'Continue', |
| 348 | actionRegenerate: 'Regenerate', |
| 349 | actionViewProgress: 'View progress', |
| 350 | editTitle: 'Edit session name', |
| 351 | titleEmpty: 'Name cannot be empty', |
| 352 | titleTooLong: 'Name too long', |
| 353 | titleTooLongDescription: 'Session name cannot exceed 120 characters.', |
| 354 | titleUpdated: 'Session name updated', |
| 355 | renameFailed: 'Rename failed', |
| 356 | deleteConfirmTitle: 'Delete session', |
| 357 | deleteConfirmDescription: 'Delete "{title}"? This action cannot be undone.', |
| 358 | deleted: 'Session deleted', |
| 359 | deleteFailed: 'Failed to delete session', |
| 360 | renameDescription: |
| 361 | 'Only the session name used in lists and exports will change. Page content will not be regenerated.', |
| 362 | renamePlaceholder: 'Enter a new session name', |
| 363 | pagesCount: '{generated}/{total} pages', |
| 364 | failedCount: '{count} failed', |
| 365 | saveTemplateTooltipDisabled: 'At least 1 page must be generated before saving as template', |
| 366 | saveTemplateTooltip: 'Save as template', |
| 367 | editTitleTooltip: 'Edit session name' |
| 368 | }, |
| 369 | settings: { |
| 370 | eyebrow: 'Preferences', |
| 371 | title: 'Settings', |
| 372 | interface: 'Interface', |
| 373 | language: 'Interface language', |
| 374 | languagePlaceholder: 'Select interface language', |
| 375 | chinese: 'Simplified Chinese', |
| 376 | english: 'English', |
| 377 | generalTab: 'General', |
| 378 | modelTab: 'Base model configuration', |
| 379 | imageModelTab: 'Image models', |
| 380 | advancedTab: 'Advanced', |
| 381 | usagePageEyebrow: 'Usage Analytics', |
| 382 | usagePageTitle: 'Token usage', |
| 383 | usagePageDescription: |
| 384 | 'Review input, output, and total token trends, plus usage distribution across models(For reference only).', |
| 385 | usagePeriod7d: 'Last 7 days', |
| 386 | usagePeriod30d: 'Last 30 days', |
| 387 | usagePeriodAll: 'All time', |
| 388 | usageRefresh: 'Refresh', |
| 389 | usageLoading: 'Loading token usage...', |
| 390 | usageLoadFailed: 'Failed to load token usage.', |
| 391 | usageTotalTokens: 'Total tokens', |
| 392 | usageInputTokens: 'Input tokens', |
| 393 | usageOutputTokens: 'Output tokens', |
| 394 | usageCalls: 'Model calls', |
| 395 | usageTrend: 'Daily token trend', |
| 396 | usageTodayHourly: "Today's hourly usage", |
| 397 | usageByModel: 'Usage by model', |
| 398 | usageEmpty: 'No model usage has been recorded yet', |
| 399 | modelAccess: 'Base model configuration', |
| 400 | imageModelAccess: 'Image models', |
| 401 | modelHelpTitle: 'Recommended cloud models', |
| 402 | addModel: 'Add model', |
| 403 | modelHelpDocs: 'Help docs', |
| 404 | addImageModel: 'Add image model', |
| 405 | imageModelUsageHint: |
| 406 | 'Image models are not used for visuals during generation yet. After pages are generated, add visuals separately as needed.', |
| 407 | editModel: 'Edit model', |
| 408 | editImageModel: 'Edit image model', |
| 409 | modelName: 'Alias', |
| 410 | modelNamePlaceholder: 'Model alias, anything you like', |
| 411 | noModels: 'No model configs yet. Add a model first.', |
| 412 | noImageModels: 'No image model configs yet. Add a text-to-image model first.', |
| 413 | modelSettingsRequiredTitle: 'Model setup incomplete', |
| 414 | modelSettingsRequiredDescription: 'Please add and enable an available model in Settings first.', |
| 415 | generationModel: 'Run model', |
| 416 | currentActiveModel: 'Default model: {name}', |
| 417 | currentActiveImageModel: 'Default image model: {name}', |
| 418 | activeModel: 'Default model', |
| 419 | activeImageModel: 'Default image model', |
| 420 | activateModel: 'Set default', |
| 421 | activateImageModel: 'Set default', |
| 422 | activeModelUpdated: 'Default model updated', |
| 423 | activeImageModelUpdated: 'Default image model updated', |
| 424 | activateModelFailed: 'Failed to set default model', |
| 425 | activateImageModelFailed: 'Failed to set default image model', |
| 426 | deleteModelConfirm: 'Delete "{name}"?', |
| 427 | deleteModelFailed: 'Failed to delete model', |
| 428 | deleteImageModelFailed: 'Failed to delete image model', |
| 429 | modelDeleted: 'Model deleted', |
| 430 | imageModelDeleted: 'Image model deleted', |
| 431 | providerPreset: 'Provider preset', |
| 432 | providerPlaceholder: 'Select Provider', |
| 433 | providerOpenAIChatCompletions: 'OpenAI / compatible Chat Completions', |
| 434 | providerOpenAIResponses: 'OpenAI Responses', |
| 435 | modelHint: 'Any compatible model name for this provider is accepted.', |
| 436 | imageModelConfigHint: 'Enter the full provider JSON.', |
| 437 | imageModelConfigHintJimeng: |
| 438 | 'Connect Jimeng 3.0 for single-slide presentation visuals. Example: {"reqKey":"jimeng_t2i_v30","accessKeyId":"...","secretKey":"..."}', |
| 439 | imageModelConfigHintJimeng4: |
| 440 | 'Connect Jimeng 4.0 for higher-quality single-slide illustrations and background assets. Example: {"reqKey":"jimeng_t2i_v40","accessKeyId":"...","secretKey":"...","force_single":true}', |
| 441 | imageModelConfigHintAgnes: |
| 442 | 'Connect Agnes AI for presentation illustrations, backgrounds, and visual elements. Example: {"model":"agnes-image-2.0-flash","apiKey":"...","responseFormat":"url"}', |
| 443 | imageModelConfigHintSiliconflow: |
| 444 | 'Connect SiliconFlow image models and choose a model name for the style and speed you need. Example: {"model":"Tongyi-MAI/Z-Image-Turbo","apiKey":"..."}', |
| 445 | imageModelConfigHintOpenAICompatible: |
| 446 | 'Connect a service with OpenAI Chat Completions image capability and generate slide visuals in the same workflow. Example: {"baseUrl":"https://api.openai.com","apiKey":"...","model":"gpt-image-1"}', |
| 447 | imageModelConfigHintGemini: |
| 448 | 'Connect Gemini image generation for illustrations, backgrounds, and visual concepts based on slide content. Uses Google by default, with baseUrl available for a team service endpoint. Example: {"model":"gemini-3.1-flash-image","apiKey":"..."}', |
| 449 | imageModelConfigHintSeedream: |
| 450 | 'Connect Volcengine Ark Seedream image generation for slide illustrations, backgrounds, and visual assets. Put selectable size values in sizes for the current model. Example: {"baseUrl":"https://ark.cn-beijing.volces.com","model":"doubao-seedream-5-0-260128","apiKey":"...","response_format":"url","sizes":["2K"],"sequential_image_generation":"disabled","stream":false}', |
| 451 | imageProviderOfficialDocs: 'Official docs', |
| 452 | baseUrlHint: 'Enter a service URL compatible with the selected provider protocol.', |
| 453 | baseUrlHintGoogle: 'Leave empty for official Google API. Fill only if using a proxy.', |
| 454 | maxTokensHint: |
| 455 | 'Max output tokens, default 4096. Generally no need to change. Adjust based on model limits.', |
| 456 | disableTemperature: 'Disable temperature', |
| 457 | disableTemperatureHint: |
| 458 | 'Keeping temperature enabled is recommended. Disable it only when unsupported, as this may affect generation results.', |
| 459 | thinkingParameterMode: 'thinking parameter', |
| 460 | thinkingParameterModeHint: |
| 461 | 'Compatibility setting for OpenAI-compatible services. If the service reports unsupported parameter: thinking, choose omit.', |
| 462 | thinkingParameterModeAuto: 'Auto (recommended)', |
| 463 | thinkingParameterModeOmit: 'Do not send thinking', |
| 464 | timeoutSection: 'Model timeouts (seconds)', |
| 465 | timeoutPlanning: 'Outline planning', |
| 466 | timeoutDesign: 'Design contract', |
| 467 | timeoutAgent: 'Generation/editing', |
| 468 | timeoutDocument: 'Document parsing', |
| 469 | timeoutSeconds: 'Model call timeout (seconds)', |
| 470 | timeoutPlaceholder: 'Example: 300', |
| 471 | timeoutHint: 'For local or slower models. Cloud models usually do not need changes here.', |
| 472 | timeoutPlanningHint: 'Default 300 seconds. Used for titles, key points, and outlines.', |
| 473 | timeoutDesignHint: 'Default 300 seconds. Used for the deck visual direction.', |
| 474 | timeoutAgentHint: 'Default 600 seconds. Used for page generation and edits.', |
| 475 | timeoutDocumentHint: 'Default 600 seconds. Used for uploaded document outline parsing.', |
| 476 | apiKeyPlaceholder: 'Enter {provider} API Key', |
| 477 | verifying: 'Verifying...', |
| 478 | verify: 'Verify', |
| 479 | verifyHint: |
| 480 | 'Uses the current provider preset, model, api_key, and base_url for a real connectivity check. Local Ollama can use any value.', |
| 481 | imageVerifyHint: |
| 482 | 'Verification generates one real test image at the provider default size and only passes when an image is returned.', |
| 483 | imageVerificationPreview: 'Verification image', |
| 484 | imageVerificationPreviewAlt: 'Image generated during image model verification', |
| 485 | imageVerificationPrompt: 'Test prompt: Generate a cartoon cat', |
| 486 | imageVerifyPassed: 'Image model verified', |
| 487 | imageVerifyPassedDescription: 'A test image was generated successfully', |
| 488 | imageVerifyFailed: 'Image model verification failed', |
| 489 | imageVerifyFailedDescription: 'Check the model configuration and API credentials', |
| 490 | modelPlaceholder: 'Example: deepseek-v4-flash', |
| 491 | imageModelPlaceholder: |
| 492 | 'Example: Jimeng 3.0 / Jimeng 4.0 / Agnes AI / SiliconFlow / OpenAI compatible / Gemini', |
| 493 | imageModelNamePlaceholder: 'Model alias, anything you like', |
| 494 | baseUrlPlaceholder: 'Example: https://api.deepseek.com', |
| 495 | imageBaseUrlPlaceholder: 'Leave empty for built-in defaults, or enter a compatible service URL', |
| 496 | imageBaseUrlHint: |
| 497 | 'Jimeng 3.0, Jimeng 4.0, Agnes AI, SiliconFlow, OpenAI-compatible image APIs, and Gemini are available.', |
| 498 | defaultImageSize: 'Default size', |
| 499 | defaultImageQuality: 'Default quality', |
| 500 | defaultImageCount: 'Default count', |
| 501 | imageExtraJsonHint: |
| 502 | 'Optional. Override endpoint, headers, requestBody, or other provider-specific fields.', |
| 503 | fillImageModelConfig: 'Enter valid model_config JSON.', |
| 504 | storage: 'Storage', |
| 505 | storagePath: 'Storage path', |
| 506 | storagePlaceholder: 'Choose a storage folder first', |
| 507 | choose: 'Choose', |
| 508 | storageHint: 'New creative generation results will be written to this folder.', |
| 509 | saveSettings: 'Save settings', |
| 510 | saveModel: 'Save model settings', |
| 511 | saveImageModel: 'Save image model', |
| 512 | saveTimeouts: 'Save timeouts', |
| 513 | saveFailed: 'Failed to save settings', |
| 514 | saved: 'Settings saved', |
| 515 | savedDescription: 'Configuration has been written locally', |
| 516 | modelSaved: 'Model settings saved', |
| 517 | imageModelSaved: 'Image model saved', |
| 518 | modelSavedDescription: 'Model config has been written locally', |
| 519 | imageModelSavedDescription: 'Image model config has been written locally', |
| 520 | timeoutSavedDescription: 'Global timeout settings have been written locally', |
| 521 | fillModelName: 'Enter an alias first', |
| 522 | fillApiKey: 'Enter api_key first', |
| 523 | fillModel: 'Enter model first', |
| 524 | verifyBeforeSave: 'Verify the model before saving.', |
| 525 | verifyImageBeforeSave: 'Generate a test image successfully before saving the image model.', |
| 526 | verifyPassed: 'API Key verified', |
| 527 | verifyPassedDescription: 'The current configuration can call the model', |
| 528 | verifyFailed: 'API Key verification failed', |
| 529 | verifyFailedDescription: 'Check model / api_key / base_url', |
| 530 | choosePathFailed: 'Failed to choose folder', |
| 531 | storagePathUpdated: 'Storage path updated', |
| 532 | proxySection: 'Network Proxy', |
| 533 | proxyLabel: 'Proxy address', |
| 534 | proxyPlaceholder: 'e.g. http://127.0.0.1:7890', |
| 535 | proxyHint: |
| 536 | 'Supports HTTP and SOCKS5 proxies for accessing services like Gemini. Leave empty to disable.', |
| 537 | proxySavedDescription: 'Proxy settings saved. Takes effect immediately.' |
| 538 | }, |
| 539 | styles: { |
| 540 | eyebrow: 'Style Lab', |
| 541 | title: 'Style management', |
| 542 | description: |
| 543 | 'Built-in 70+ styles. Import PPTX, HTML, images, and more to auto-extract styles, or create your own from scratch.', |
| 544 | refresh: 'Refresh', |
| 545 | newStyle: 'New style', |
| 546 | newStyleTooltip: 'Create a new custom style template', |
| 547 | importMenu: 'Import Style', |
| 548 | importMenuTooltip: 'Import a packaged style ZIP or a style folder.', |
| 549 | officialSkillLabel: 'Official style skill: arcsin1/style-generate-skill', |
| 550 | supportsImageGeneration: 'Image generation', |
| 551 | importPackage: 'Import Style ZIP', |
| 552 | importPackageTooltip: 'Import a packaged style ZIP.', |
| 553 | importPackageDirectory: 'Import Style Folder', |
| 554 | importPackageDirectoryTooltip: |
| 555 | 'Import a style folder containing only style.json, SKILL.md, and preview.html.', |
| 556 | importingPackage: 'Importing...', |
| 557 | exportPackage: 'Export ZIP', |
| 558 | exportPackageTooltip: 'Export this style as a portable ZIP package', |
| 559 | packageZipRequired: 'Choose a .zip style package', |
| 560 | packageImported: 'Style package imported', |
| 561 | packageImportFailed: 'Failed to import style package', |
| 562 | packageExported: 'Style package exported', |
| 563 | packageExportFailed: 'Failed to export style package', |
| 564 | generatePreview: 'Generate preview', |
| 565 | generatePreviewTooltip: 'Generate a visual preview cover for this style', |
| 566 | generatingPreview: 'Generating...', |
| 567 | previewTooltip: 'View this style preview', |
| 568 | editTooltip: 'Edit this style name, description, and prompt', |
| 569 | deleteTooltip: 'Delete this style after a confirmation', |
| 570 | previewGenerated: 'Preview generated', |
| 571 | previewGenerationFailed: 'Failed to generate preview', |
| 572 | refreshed: 'Style list refreshed', |
| 573 | refreshedDescription: '{count} styles total', |
| 574 | loadFailed: 'Failed to load styles', |
| 575 | sourceBuiltin: 'builtin', |
| 576 | deleted: 'Style deleted', |
| 577 | deleteFailed: 'Failed to delete style', |
| 578 | deleteConfirmTitle: 'Delete this style?', |
| 579 | deleteConfirmDescription: |
| 580 | '“{name}” will be removed from the style list. This cannot be undone.', |
| 581 | styleCaseFilter: 'Filter by use case', |
| 582 | allStyleCases: 'All', |
| 583 | noMatchingStyles: 'No styles match this use case', |
| 584 | searchPlaceholder: 'Search by name or use case…', |
| 585 | clearSearch: 'Clear search', |
| 586 | aiRecommend: 'AI Recommend', |
| 587 | aiRecommending: 'Recommending…', |
| 588 | aiRecommendationTopicRequired: 'Enter a topic first', |
| 589 | aiRecommendationFailed: 'AI recommendation failed. Try again.', |
| 590 | clearRecommendation: 'Show all styles', |
| 591 | favoriteStyles: 'Favorites', |
| 592 | favoriteStyle: 'Favorite style', |
| 593 | unfavoriteStyle: 'Remove favorite', |
| 594 | favoriteStyleTooltip: 'Favorite this style', |
| 595 | unfavoriteStyleTooltip: 'Remove this style from favorites', |
| 596 | favoriteFailed: 'Failed to update favorite', |
| 597 | noFavoriteStyles: 'No favorite styles yet', |
| 598 | pagesCount: 'Pages · {count}' |
| 599 | }, |
| 600 | styleEditor: { |
| 601 | eyebrow: 'Style Editor', |
| 602 | newStyle: 'New style', |
| 603 | createTitle: 'Create your style', |
| 604 | editTitle: 'Edit style', |
| 605 | backToList: 'Back to list', |
| 606 | loading: 'Loading style content...', |
| 607 | defaultLabel: 'My style', |
| 608 | defaultDescription: 'Custom style', |
| 609 | defaultCategory: 'Custom', |
| 610 | detailLoadFailed: 'Failed to load style details', |
| 611 | invalidStyleId: 'Invalid styleId', |
| 612 | backAndRetry: 'Go back to the list and try again', |
| 613 | fillName: 'Enter a name first', |
| 614 | fillPrompt: 'Enter a style prompt first', |
| 615 | saved: 'Style saved', |
| 616 | savedOverride: 'Saved as a built-in style override', |
| 617 | savedCustom: 'Custom style updated', |
| 618 | saveFailed: 'Save failed', |
| 619 | importStyle: 'Import and parse', |
| 620 | importImage: 'Import image and parse', |
| 621 | importing: 'Parsing...', |
| 622 | importHint: |
| 623 | 'Import files, PPTX, or images to extract style: .md/.txt/.html (≤{textMaxSize}MB), .pptx (≤{pptxMaxSize}MB), images (≤{imageMaxSize}MB).', |
| 624 | importSuccess: 'Style imported and parsed', |
| 625 | importFailed: 'Failed to import style', |
| 626 | imageFormatInvalidTitle: 'Unsupported image format', |
| 627 | imageFormatInvalid: 'Only PNG / JPEG / WEBP images are supported.', |
| 628 | imageReadFailed: 'Failed to read image. Please reselect and try again.', |
| 629 | fileTooLargeTitle: 'File too large', |
| 630 | fileTooLarge: 'A single style file must be under {maxSize}MB.', |
| 631 | filePathFailedTitle: 'Cannot read file path', |
| 632 | filePathFailed: 'Please choose a local style file again.', |
| 633 | deleted: 'Style deleted', |
| 634 | deleteFailed: 'Delete failed', |
| 635 | name: 'Name', |
| 636 | descriptionLabel: 'Description', |
| 637 | descriptionPlaceholder: 'Describe this style in one sentence', |
| 638 | styleCaseLabel: 'Use cases', |
| 639 | styleCasePlaceholder: 'Example: tech talks, product launches, education, annual summaries', |
| 640 | writingTips: 'Style Skill writing tips', |
| 641 | skillMarkdown: 'Skill Markdown', |
| 642 | tipStructure: |
| 643 | "Describe the overall mood in flowing prose first, then details. Don't write a cold spec doc.", |
| 644 | tipAnimation: |
| 645 | 'Weave colors into emotional descriptions (e.g. "warm light blue"), list specific imagery (paper boats, umbrellas, clouds).', |
| 646 | tipNatural: |
| 647 | 'Describe fonts by their character (handwritten, rounded, warm) — not just family names or specs.', |
| 648 | tipReadable: |
| 649 | 'State the target audience and use case (e.g. "youth mental health PPT") so the model understands context.', |
| 650 | promptReferenceTitle: 'Style Extraction Prompt Reference', |
| 651 | promptReferenceSubtitle: '(can be used for generation elsewhere)', |
| 652 | promptRef1: |
| 653 | 'Open with a natural-language paragraph describing the overall visual mood, e.g. "clean, bright, light-toned with generous whitespace"', |
| 654 | promptRef2: |
| 655 | '## Colors: List primary, background, text colors with hex values, e.g. "background #FFFFFF, text dark gray #1F2937"', |
| 656 | promptRef3: |
| 657 | '## Typography: Describe font style, weight, size hierarchy, line height, e.g. "bold sans-serif titles, regular body, line height 1.6+"', |
| 658 | promptRef4: |
| 659 | '## Layout: Specify alignment, information hierarchy, whitespace and density, e.g. "modular sections, centered or left-aligned, moderate density"', |
| 660 | promptRef5: |
| 661 | '## Animation: Describe entrance animations with public data-anim values, duration, easing, e.g. "fade or gentle slide-up, 0.4s–0.6s, ease-out"', |
| 662 | promptRef6: |
| 663 | '## Use case: Define target audience and scenario, e.g. "business reports, product intros, project summaries — formal but not dull"', |
| 664 | promptRef7: |
| 665 | '## Avoid: List elements to avoid, e.g. "no high-saturation clashing colors, no heavy gradients and shadows"', |
| 666 | emptyMarkdown: '_No Markdown content_', |
| 667 | saveStyle: 'Save style', |
| 668 | currentMode: 'Current mode: {mode}', |
| 669 | builtinMode: 'Built-in (saving creates an override)', |
| 670 | template: `A clean, bright, light-toned style with a pure white or very light gray background and generous whitespace for an open, uncluttered reading experience. |
| 671 | |
| 672 | ## Colors |
| 673 | Neutral grays as the primary palette, with a single brand accent color (e.g. blue #2563EB or green #16A34A) for titles and key elements. Background: pure white #FFFFFF. Text: dark gray #1F2937. Restrained yet professional. |
| 674 | |
| 675 | ## Typography |
| 676 | Titles use a clean sans-serif font in bold, dark gray or black. Body text uses regular-weight sans-serif at a comfortable size with line height above 1.6 for readability. Clear hierarchy through font size, weight, and color. |
| 677 | |
| 678 | ## Layout |
| 679 | Clear modular structure, content centered or left-aligned. Hierarchy established through font size, color, and spacing. Generous whitespace, moderate information density per slide. |
| 680 | |
| 681 | ## Animation |
| 682 | Calm and subtle rhythm. Elements fade in or gently slide up over 0.4s–0.6s with ease-out easing. Avoid flashy transitions. |
| 683 | |
| 684 | ## Suitable for |
| 685 | Business presentations, product introductions, project summaries — formal but not stiff. |
| 686 | |
| 687 | ## Avoid |
| 688 | - Do not use high-saturation colors |
| 689 | - Do not stack heavy gradients and shadows |
| 690 | - Do not create flickering or large-scale shaking animations` |
| 691 | }, |
| 692 | generating: { |
| 693 | stages: { |
| 694 | preflight: 'Prepare', |
| 695 | planning: 'Plan', |
| 696 | rendering: 'Generate', |
| 697 | validation: 'Validate' |
| 698 | }, |
| 699 | created: 'Understanding request', |
| 700 | currentSession: 'Current session', |
| 701 | defaultPrompt: 'Create a clear first draft that can be previewed directly.', |
| 702 | pageDetail: 'Page {pageNumber}: {title}', |
| 703 | completed: 'Completed', |
| 704 | failedRetryOrBack: 'Failed', |
| 705 | stillRunning: 'Generating pages', |
| 706 | started: 'Generating pages', |
| 707 | queued: 'Queued', |
| 708 | failed: 'Failed', |
| 709 | previousFailed: 'The previous generation for this session failed. You can retry directly.', |
| 710 | keptFailed: 'Failed', |
| 711 | resumed: 'Generating pages', |
| 712 | incompleteSome: |
| 713 | 'Session incomplete: {generated}/{total} pages finished. Continue generating the remaining pages.', |
| 714 | continueRemainingEvent: 'Retrying', |
| 715 | incompleteNone: 'Session incomplete: 0/{total} pages finished. Please regenerate.', |
| 716 | noValidPagesEvent: 'Failed', |
| 717 | backHome: 'Back home', |
| 718 | title: 'AI is generating your presentation', |
| 719 | expandLog: 'Expand log panel', |
| 720 | collapseLog: 'Collapse log panel', |
| 721 | logTitle: 'Progress log', |
| 722 | progress: 'Progress', |
| 723 | growing: 'Generating pages', |
| 724 | eyebrow: 'Generating', |
| 725 | interrupted: 'Interrupted', |
| 726 | cancelGeneration: 'Cancel', |
| 727 | failedRetry: 'Generation failed. Please retry.', |
| 728 | continueRemaining: 'Continue remaining pages', |
| 729 | backToSessions: 'Back to sessions', |
| 730 | regenerate: 'Regenerate', |
| 731 | enterEditor: 'Enter Editor to Fix' |
| 732 | }, |
| 733 | sessionDetail: { |
| 734 | sessionFallback: 'Session', |
| 735 | master: 'Master', |
| 736 | masterTitle: 'Slide Master', |
| 737 | masterDescription: 'Override linked slide backgrounds and fonts.', |
| 738 | masterStyle: 'Style master', |
| 739 | masterStyleTitle: 'Style master', |
| 740 | masterGlobalElements: 'Global elements', |
| 741 | masterLayoutLibrary: 'Layout master', |
| 742 | layoutMasterTitle: 'Layout master', |
| 743 | layoutMasterDescription: 'Choose a default composition for each slide intent.', |
| 744 | layoutMasterIntentCover: 'Cover / section', |
| 745 | layoutMasterIntentData: 'Data focus', |
| 746 | layoutMasterIntentComparison: 'Comparison', |
| 747 | layoutMasterIntentTimeline: 'Timeline', |
| 748 | layoutMasterIntentConcept: 'Content / concept', |
| 749 | layoutMasterIntentProcess: 'Process', |
| 750 | layoutMasterIntentSummary: 'Summary / closing', |
| 751 | layoutMasterIntentQuote: 'Quote', |
| 752 | layoutMasterIntentImage: 'Image focus', |
| 753 | layoutMasterReset: 'Restore defaults', |
| 754 | layoutMasterSave: 'Save layout mapping', |
| 755 | layoutMasterSaved: 'Layout mapping saved for future generated slides', |
| 756 | layoutMasterLoadFailed: 'Failed to load layout master', |
| 757 | layoutMasterSaveFailed: 'Failed to save layout master', |
| 758 | masterElementsTitle: 'Global elements', |
| 759 | masterElementsDescription: 'Place a shared logo, footer, page number, and watermark.', |
| 760 | masterOverrideBackground: 'Override existing slide backgrounds', |
| 761 | masterBackground: 'Slide background', |
| 762 | masterBackgroundStyle: 'Background style', |
| 763 | masterBackgroundSolid: 'Solid', |
| 764 | masterBackgroundGradient: 'Gradient', |
| 765 | masterBackgroundImage: 'Image', |
| 766 | masterBackgroundImageChoose: 'Choose from library', |
| 767 | masterBackgroundImageUpload: 'Upload image', |
| 768 | masterBackgroundImageClear: 'Remove image', |
| 769 | masterBackgroundImageEmpty: 'Choose a background image', |
| 770 | masterBackgroundImageUploadFailed: 'Failed to upload background image', |
| 771 | masterGradientPreview: 'Gradient preview', |
| 772 | masterGradientConfigure: 'Edit gradient', |
| 773 | masterGradientEditorTitle: 'Gradient background', |
| 774 | masterGradientEditorDescription: 'Adjust the gradient type, angle, and color stops.', |
| 775 | masterGradientType: 'Gradient type', |
| 776 | masterGradientLinear: 'Linear', |
| 777 | masterGradientRadial: 'Radial', |
| 778 | masterGradientAngle: 'Gradient angle', |
| 779 | masterGradientPresets: 'Color presets', |
| 780 | masterGradientStops: 'Color stops', |
| 781 | masterGradientStop: 'Stop {position}%', |
| 782 | masterGradientStopColor: 'Stop color', |
| 783 | masterGradientAddStop: 'Add color stop', |
| 784 | masterGradientRemoveStop: 'Remove color stop', |
| 785 | masterGradientConfirm: 'Confirm gradient', |
| 786 | masterTitleFont: 'Title font', |
| 787 | masterBodyFont: 'Body font', |
| 788 | masterTitleFontSize: 'Title font size', |
| 789 | masterBodyFontSize: 'Body font size', |
| 790 | masterFontSizeInherit: 'Inherit', |
| 791 | masterFontInherit: 'Inherit page font', |
| 792 | masterFontInheritWithFamily: 'Current: {family}', |
| 793 | masterFontSans: 'Sans serif', |
| 794 | masterFontSerif: 'Serif', |
| 795 | masterFontMono: 'Monospace', |
| 796 | masterPageCounts: '{linked} linked, {unlinked} unlinked, {missing} missing.', |
| 797 | masterUnlinkedHint: |
| 798 | '{count} slide(s) are unlinked. Saving automatically links and applies the master.', |
| 799 | masterReset: 'Reset', |
| 800 | masterSaveAndApply: 'Save and apply', |
| 801 | masterSaved: 'Master saved and applied to all slides', |
| 802 | masterLoadFailed: 'Failed to load master', |
| 803 | masterSaveFailed: 'Failed to save master', |
| 804 | masterElementsReset: 'Reset elements', |
| 805 | masterElementLogo: 'Logo', |
| 806 | masterLogoEmpty: 'No logo selected', |
| 807 | masterLogoChoose: 'Choose logo from library', |
| 808 | masterLogoUpload: 'Upload logo', |
| 809 | masterLogoClear: 'Remove logo', |
| 810 | masterLogoUploadFailed: 'Failed to upload logo', |
| 811 | masterFooter: 'Footer', |
| 812 | masterWatermark: 'Watermark', |
| 813 | masterElementVisible: 'Show', |
| 814 | masterElementFontSize: 'Font size', |
| 815 | masterElementColor: 'Text color', |
| 816 | masterWatermarkRotation: 'Watermark rotation', |
| 817 | masterShowPageNumber: 'Show page number', |
| 818 | masterHideElementsOnSlide: 'Hide global elements on this slide', |
| 819 | masterPageOverrideFailed: 'Failed to update slide master setting', |
| 820 | current: 'Current', |
| 821 | pagesCount: 'Pages · {count}', |
| 822 | pageTab: 'Pages', |
| 823 | outlineTab: 'Outline', |
| 824 | pageNumber: 'Page {pageNumber}', |
| 825 | pagesEmpty: 'No pages yet', |
| 826 | outlineEmpty: 'No outline yet', |
| 827 | copyOutline: 'Copy outline', |
| 828 | outlineCopied: 'Copied', |
| 829 | downloadAllOutlines: 'Download all outlines', |
| 830 | outlinesExported: 'Outline export succeeded', |
| 831 | backToSessions: 'Back to sessions', |
| 832 | toolbarExport: 'Export', |
| 833 | toolbarMore: 'More', |
| 834 | toolbarExportPptxEditable: 'Editable PPTX', |
| 835 | toolbarExportPptxImageOnly: 'Image PPTX', |
| 836 | toolbarExportPng: 'PNG Image', |
| 837 | toolbarExportLongImage: 'PNG Long Image', |
| 838 | toolbarExportVideo: 'MP4 Video', |
| 839 | toolbarExportPdf: 'PDF File', |
| 840 | toolbarExportSlidePack: 'Slide Pack', |
| 841 | toolbarExportSlidePackDesc: 'Standalone preview pack', |
| 842 | toolbarExportSessionZip: 'Session ZIP', |
| 843 | toolbarExportSessionZipDesc: 'Full session directory archive', |
| 844 | exportPptx: 'Export PPTX', |
| 845 | exportSinglePagePptx: 'Export this slide as editable or image PPTX', |
| 846 | exportImagePdf: 'Export Image/PDF', |
| 847 | exportPng: 'Export PNG', |
| 848 | exportPdf: 'Export PDF', |
| 849 | speechScript: 'Speaker Notes', |
| 850 | speechScriptTooltip: 'Generate speaker notes from slide content', |
| 851 | speechScriptTabConfig: 'Settings', |
| 852 | speechScriptTabResult: 'Result', |
| 853 | speechScriptScope: 'Scope', |
| 854 | speechScriptScopeAll: 'All', |
| 855 | speechScriptScopeAllDesc: 'All slides', |
| 856 | speechScriptScopeSingle: 'Single', |
| 857 | speechScriptScopeSingleDesc: 'Current slide', |
| 858 | speechScriptDialogTitle: 'Speaker Notes', |
| 859 | speechScriptCopy: 'Copy', |
| 860 | speechScriptCopied: 'Copied', |
| 861 | speechScriptEmptyHint: 'Click the button above to generate', |
| 862 | speechScriptViewFile: 'View file', |
| 863 | speechScriptError: 'Failed to generate speaker notes, please try again', |
| 864 | speechScriptGenerate: 'Generate', |
| 865 | speechScriptRegenerate: 'Regenerate', |
| 866 | speechScriptLength: 'Length', |
| 867 | speechScriptLengthShort: 'Brief', |
| 868 | speechScriptLengthShortDesc: '~1 min per slide', |
| 869 | speechScriptLengthMedium: 'Standard', |
| 870 | speechScriptLengthMediumDesc: '~2 min per slide', |
| 871 | speechScriptLengthLong: 'Detailed', |
| 872 | speechScriptLengthLongDesc: '~3 min per slide', |
| 873 | speechScriptStyle: 'Style', |
| 874 | speechScriptStyleFormal: 'Formal', |
| 875 | speechScriptStyleConversational: 'Conversational', |
| 876 | speechScriptStyleStorytelling: 'Storytelling', |
| 877 | speechScriptStyleCustom: 'Custom', |
| 878 | speechScriptStyleCustomPlaceholder: |
| 879 | 'Describe the style you want, e.g. humorous and engaging, use lots of analogies and examples...', |
| 880 | speechScriptGenerating: 'Generating slide {current} of {total}', |
| 881 | speechScriptGeneratingSingle: 'Generating slide {pageNumber}', |
| 882 | speechScriptGeneratingInit: 'Preparing...', |
| 883 | preview: 'Browser Preview', |
| 884 | previewTooltip: 'Open in browser — works independently outside the app', |
| 885 | present: 'Present', |
| 886 | presentTooltip: 'Fullscreen presentation, arrow keys or mouse wheel to navigate, Esc to exit', |
| 887 | saveAsNewSession: 'Save as New Session', |
| 888 | saveAsNewSessionDefaultName: '{title} Copy', |
| 889 | saveAsNewSessionDialogTitle: 'Save as New Session', |
| 890 | saveAsNewSessionDialogDescription: |
| 891 | 'Copies the current session pages and assets into an independent new session. Chat records and version history are not copied.', |
| 892 | saveAsNewSessionNameLabel: 'New session name', |
| 893 | saveAsNewSessionNamePlaceholder: 'Enter a new session name', |
| 894 | saveAsNewSessionSaving: 'Saving...', |
| 895 | saveAsNewSessionConfirm: 'Save as New Session', |
| 896 | saveAsNewSessionSuccess: 'Saved as new session', |
| 897 | saveAsNewSessionFailed: 'Failed to save as new session', |
| 898 | saveAsNewSessionTitleRequired: 'Enter a new session name', |
| 899 | saveTemplate: 'Save as Template', |
| 900 | saveTemplateTooltip: 'Save this presentation as a template', |
| 901 | revealFile: 'Show source file', |
| 902 | collapseMessages: 'Collapse message panel', |
| 903 | expandMessages: 'Expand message panel', |
| 904 | chatMode: 'Chat', |
| 905 | imageMode: 'Image', |
| 906 | messageTitle: 'Messages and input', |
| 907 | context: 'Context', |
| 908 | contextPlaceholder: 'Select context', |
| 909 | currentPage: 'Current page', |
| 910 | mainSession: 'Main session', |
| 911 | pageContext: 'Current page · P{pageNumber}', |
| 912 | mainContext: 'Main session', |
| 913 | assetPlaceholder: |
| 914 | 'Describe how to use these assets, for example: use the first image as the cover background.', |
| 915 | pagePlaceholder: |
| 916 | 'Current-page mode only edits this page. You can use Inspect to select an element, then ask to adjust color or font size.', |
| 917 | mainPlaceholder: |
| 918 | 'Main-session mode: describe changes for the deck pages, such as unifying title styles, changing all backgrounds, or rearranging specific pages.', |
| 919 | mainDisabledPlaceholder: |
| 920 | 'Main-session sending is disabled. Switch Context to Current page first.', |
| 921 | emptyMessages: 'No creative messages yet', |
| 922 | activityTitle: 'Edit progress', |
| 923 | activityDescription: 'Follow page edits, retries, and completion in real time.', |
| 924 | activityProcessing: 'Processing edit task', |
| 925 | activityCancelling: 'Cancelling and restoring the previous content', |
| 926 | pageEditPlanning: 'Understanding this slide edit request', |
| 927 | pageEditPlanTitle: 'Edit plan', |
| 928 | pageEditPlanConfirm: 'Confirm and edit', |
| 929 | pageEditPlanCancel: 'Cancel plan', |
| 930 | pageEditPlanRequiresSavedEdits: |
| 931 | 'Save or discard unsaved adjustments on this slide before confirming the AI edit plan.', |
| 932 | pageEditPlanReturnToTarget: 'Return to the slide for this plan before confirming it.', |
| 933 | pageEditPlanWaitForJob: |
| 934 | 'Another slide edit is still running. Finish it before running this plan.', |
| 935 | pageEditOtherPageBusy: |
| 936 | 'AI is editing another slide. You can keep browsing and editing manually, then send a new AI edit when it finishes.', |
| 937 | pageEditAssessmentBusy: |
| 938 | 'Another slide request is being assessed or awaiting confirmation. Resolve it before sending a new one.', |
| 939 | activityCompleted: 'Edit completed', |
| 940 | activityPartialCompleted: 'Edit completed with {count} failed slide(s)', |
| 941 | activityRunFailed: 'Edit task failed', |
| 942 | activityPageFailed: 'Slide {page} failed: {title}', |
| 943 | activityPageContext: 'Slide {page}: {title}', |
| 944 | activityUnknownError: 'No failure reason was returned. Retry or check the main-process log.', |
| 945 | activityStatusRunning: 'Generating', |
| 946 | activityStatusCompleted: 'Completed', |
| 947 | activityStatusCancelled: 'Cancelled', |
| 948 | activityStatusFailed: 'Failed', |
| 949 | selectorBadge: 'SELECTOR', |
| 950 | clearSelector: 'Clear selector', |
| 951 | selectorPropertiesReady: '{count} properties read', |
| 952 | mainDeckHint: 'Main session edits one or more pages from your instruction.', |
| 953 | mainPageScopeAll: 'All pages', |
| 954 | mainPageScopeCount: '{count} pages', |
| 955 | mainPageScopeMessagePrefix: 'Page scope: {pages}', |
| 956 | mainPageScopeConflictWarning: |
| 957 | 'Specific pages are selected, so this run will only edit those pages. Switch back to All pages to edit the full deck.', |
| 958 | mainPageScopeLimitReached: 'You can select at most {count} pages at a time.', |
| 959 | mainPageScopeAllLimitReached: |
| 960 | 'This deck has {count} pages. Select at most {limit} specific pages before editing.', |
| 961 | mainPageScopeNotFound: |
| 962 | 'No matching slide was found in the instruction. Check the slide number or select a scope first.', |
| 963 | mainPageStructureUnsupported: |
| 964 | 'Main-session chat cannot add, delete, or reorder slides yet. Use the slide tools on the left.', |
| 965 | mainDisabled: |
| 966 | 'Main-session sending is disabled. Switch Context to Current page before editing.', |
| 967 | removeAsset: 'Remove asset', |
| 968 | addAsset: 'Add asset', |
| 969 | chooseImage: 'Choose image', |
| 970 | chooseVideo: 'Choose video', |
| 971 | chooseFileSoon: 'Choose file (soon)', |
| 972 | stop: 'Stop', |
| 973 | send: 'Send', |
| 974 | imageModelPlaceholder: 'Select image model', |
| 975 | imageModelRequiredHint: 'Configure an image model in Settings first.', |
| 976 | imagePromptPlaceholder: |
| 977 | 'Describe the image to generate, or click "Outline prompt" to fill a prompt from the current page.', |
| 978 | imagePromptFromOutline: 'Outline prompt', |
| 979 | imagePromptFromCurrentPage: 'Style prompt', |
| 980 | imagePromptGenerating: 'Generating visual...', |
| 981 | imagePromptGenerated: 'Visual description generated', |
| 982 | imagePromptGenerateFailed: 'Failed to generate visual description', |
| 983 | imagePromptRequired: 'Enter an image prompt first', |
| 984 | generateImage: 'Generate image', |
| 985 | imageGenerating: 'Generating image...', |
| 986 | imageGenerated: 'Image generated', |
| 987 | imageGeneratedDescription: 'Generated {count} image(s)', |
| 988 | imageGenerateFailed: 'Failed to generate image', |
| 989 | imageHistoryLoadFailed: 'Failed to load image history', |
| 990 | autoImageInProgress: 'Finalizing the automatic illustration for this slide.', |
| 991 | autoImageDegraded: 'The illustration failed; the fallback layout was kept.', |
| 992 | autoImageLayoutFailed: 'The generated image was not adopted by the current layout.', |
| 993 | autoImageCancelled: 'The automatic illustration was cancelled; the original layout was kept.', |
| 994 | autoImageRetry: 'Retry illustration', |
| 995 | autoImageRetryStarted: 'Retrying failed illustration', |
| 996 | autoImageRetryFailed: 'Failed to retry illustration', |
| 997 | imageResultEmpty: 'No generated images yet', |
| 998 | imagePreviewTitle: 'Image preview', |
| 999 | imagePreviewOpen: 'Open larger preview', |
| 1000 | addImageToCanvas: 'Add to canvas', |
| 1001 | imageAddedToCanvas: 'Image added to canvas', |
| 1002 | setImageAsBackground: 'Set as background', |
| 1003 | imageSetAsBackground: 'Image set as background', |
| 1004 | imageOptions: 'Model + settings', |
| 1005 | imageConfigButton: 'Model + settings', |
| 1006 | imageConfigTitle: 'Model and settings', |
| 1007 | imageSizeLabel: 'Ratio', |
| 1008 | imageCountLabel: 'Count', |
| 1009 | imageOutlinePromptIntro: 'Generate one presentation-ready visual asset for the current slide.', |
| 1010 | imageOutlineTitle: 'Slide title', |
| 1011 | imageOutlineContent: 'Slide outline', |
| 1012 | imageOutlineConstraints: |
| 1013 | 'Use this as a slide background or illustration. Avoid garbled text, pseudo-text, random glyph-like marks, and copy unrelated to the current content. Only keep a short, clearly legible phrase when its exact wording is explicitly provided and the scene genuinely needs it. Leave clean space for typography, and do not mention aspect ratios, sizes, or resolutions.', |
| 1014 | editText: 'Edit text', |
| 1015 | exitTextEdit: 'Exit edit', |
| 1016 | previewMode: 'Preview', |
| 1017 | browseMode: 'Browse', |
| 1018 | browseRequiresSavedEdits: 'Save or discard unsaved edits before entering Browse.', |
| 1019 | pageSwitchSaveConfirmTitle: 'Save current page edits first?', |
| 1020 | pageSwitchSaveConfirmDescription: |
| 1021 | 'Save unsaved edits on the current page before switching to “{page}”.', |
| 1022 | pageSwitchSaveConfirmAction: 'Save and switch', |
| 1023 | workspaceSwitchSaveConfirmTitle: 'Save current page edits first?', |
| 1024 | workspaceSwitchSaveConfirmDescription: |
| 1025 | 'Save unsaved edits on the current page before switching to “{mode}”.', |
| 1026 | workspaceSwitchSaveConfirmAction: 'Save and switch', |
| 1027 | styleMode: 'Style', |
| 1028 | styleRequiresSavedEdits: 'Save or discard unsaved edits before switching styles.', |
| 1029 | styleTitle: 'Switch deck style', |
| 1030 | styleDescription: |
| 1031 | 'Redraw every slide while preserving its original text and data, with a newly designed visual layout.', |
| 1032 | styleLoading: 'Loading styles...', |
| 1033 | styleLoadFailed: 'Failed to load styles', |
| 1034 | currentStyle: 'Current style', |
| 1035 | styleSwitching: 'Switching', |
| 1036 | styleSwitchCompleted: 'Style switched', |
| 1037 | styleSwitchFailed: 'Failed to switch style', |
| 1038 | styleSwitchCancelFailed: 'Failed to cancel style switch', |
| 1039 | styleSwitchConfirmTitle: 'Switch the entire deck style?', |
| 1040 | styleSwitchConfirmDescription: |
| 1041 | 'All slides will be redrawn using “{style}”. Each slide keeps its original text and data, while its layout and visual structure may be redesigned.', |
| 1042 | styleSwitchConfirmAction: 'Switch style', |
| 1043 | styleSwitchPartial: '{count} slides still failed. Retry only those slides.', |
| 1044 | styleSwitchRetry: 'Retry failed slides', |
| 1045 | styleSwitchRetrying: 'Retrying', |
| 1046 | activityRetryFailedPages: 'Retry failed slides ({count})', |
| 1047 | activityRetrying: 'Retrying failed slides', |
| 1048 | activityRetryFailed: 'Failed to retry slides', |
| 1049 | editMode: 'Edit', |
| 1050 | animationTab: 'Animation', |
| 1051 | indexTransitionLabel: 'Page transition', |
| 1052 | elementAnimationLabel: 'Element animation', |
| 1053 | elementAnimationPreview: 'Preview slide', |
| 1054 | elementAnimationSelectTarget: 'Select an element', |
| 1055 | elementAnimationSelectTargetTitle: 'Select an element on the canvas', |
| 1056 | elementAnimationSelectTargetHint: |
| 1057 | 'Then choose an entrance, emphasis, or exit animation for that element.', |
| 1058 | elementAnimationCategoryEntrance: 'Entrance', |
| 1059 | elementAnimationCategoryEmphasis: 'Emphasis', |
| 1060 | elementAnimationCategoryExit: 'Exit', |
| 1061 | elementAnimationClearFirstHint: |
| 1062 | 'This element already has an animation. Click "None" to clear it before switching types.', |
| 1063 | elementAnimationTriggerAuto: 'Auto', |
| 1064 | elementAnimationTriggerClick: 'Click', |
| 1065 | elementAnimationDuration: 'Duration', |
| 1066 | elementAnimationDurationFast: 'Fast 360ms', |
| 1067 | elementAnimationDurationStandard: 'Standard 600ms', |
| 1068 | elementAnimationDurationSlow: 'Gentle 900ms', |
| 1069 | elementAnimationDurationCustom: 'Custom {duration}ms', |
| 1070 | elementAnimationDirection: 'Direction', |
| 1071 | elementAnimationDirectionLeft: 'From left', |
| 1072 | elementAnimationDirectionRight: 'From right', |
| 1073 | elementAnimationDirectionTop: 'From top', |
| 1074 | elementAnimationDirectionBottom: 'From bottom', |
| 1075 | elementAnimationAdvancedPath: 'Advanced path animation', |
| 1076 | elementAnimationExitFade: 'Fade out', |
| 1077 | elementAnimationExitScale: 'Scale out', |
| 1078 | elementAnimationExitZoom: 'Zoom out', |
| 1079 | elementAnimationExitWipe: 'Wipe out', |
| 1080 | elementAnimationExitFly: 'Fly out', |
| 1081 | elementAnimationSaved: 'Element animation updated', |
| 1082 | elementAnimationLoadFailed: 'Failed to load element animation', |
| 1083 | elementAnimationSaveFailed: 'Failed to save element animation', |
| 1084 | indexTransitionNone: 'None', |
| 1085 | indexTransitionFade: 'Fade', |
| 1086 | indexTransitionSlideLeft: 'Slide left', |
| 1087 | indexTransitionSlideUp: 'Slide up', |
| 1088 | indexTransitionPush: 'Push', |
| 1089 | indexTransitionWipe: 'Wipe', |
| 1090 | indexTransitionZoom: 'Zoom', |
| 1091 | indexTransitionFlip: 'Flip', |
| 1092 | indexTransitionStack: 'Stack', |
| 1093 | indexTransitionRotate: 'Rotate', |
| 1094 | indexTransitionCube: 'Cube', |
| 1095 | indexTransitionCoverFlow: 'Cover Flow', |
| 1096 | indexTransitionBlur: 'Blur', |
| 1097 | indexTransitionIris: 'Iris', |
| 1098 | indexTransitionSwing: 'Swing', |
| 1099 | indexTransitionCenterReveal: 'Center reveal', |
| 1100 | indexTransitionSaved: 'Page transition updated', |
| 1101 | indexTransitionLoadFailed: 'Failed to load page transition', |
| 1102 | indexTransitionSaveFailed: 'Failed to save page transition', |
| 1103 | saveCurrentPage: 'Save page', |
| 1104 | saveCurrentPageTooltip: 'Save edits on the current page and write a version history entry', |
| 1105 | exitEditMode: 'Exit Edit Mode', |
| 1106 | elementInspector: 'Inspector', |
| 1107 | noElementSelected: 'No element selected', |
| 1108 | closeInspector: 'Close inspector', |
| 1109 | closeSpeechDrawer: 'Close speech script panel', |
| 1110 | textContent: 'Text', |
| 1111 | formulaContent: 'Formula', |
| 1112 | formulaDisplayMode: 'Display on its own line', |
| 1113 | formulaPreview: 'Preview', |
| 1114 | formulaPreviewEmpty: 'Enter LaTeX to preview', |
| 1115 | chartContent: 'Chart data', |
| 1116 | chartType: 'Chart type', |
| 1117 | chartTitle: 'Title', |
| 1118 | chartLabels: 'X axis', |
| 1119 | chartValues: 'Y axis', |
| 1120 | chartData: 'Data', |
| 1121 | chartImportData: 'Import', |
| 1122 | chartImportDataTooltip: |
| 1123 | 'Import CSV, TSV, JSON, or Excel. The category column becomes the X axis; numeric columns become Y series, and missing values are filled with 0.', |
| 1124 | chartImportDataFailed: 'Failed to import data', |
| 1125 | chartDataPlaceholder: |
| 1126 | '[\n { "x": "Q1", "Revenue": 24, "Profit": 8 },\n { "x": "Q2", "Revenue": 36, "Profit": 0 }\n]', |
| 1127 | chartPrimaryColor: 'Primary color', |
| 1128 | chartAccentColor: 'Accent color', |
| 1129 | chartTextColor: 'Text color', |
| 1130 | chartSmoothLine: 'Smooth line', |
| 1131 | chartHorizontal: 'Horizontal', |
| 1132 | chartStacked: 'Stacked', |
| 1133 | chartAreaFill: 'Area fill', |
| 1134 | chartShowPoints: 'Show points', |
| 1135 | chartShowLegend: 'Show legend', |
| 1136 | chartDoughnutCutout: 'Cutout size', |
| 1137 | chartRadarFill: 'Area fill', |
| 1138 | textColor: 'Color', |
| 1139 | textStyle: 'Text style', |
| 1140 | textAlign: 'Text alignment', |
| 1141 | alignLeft: 'Align left', |
| 1142 | alignCenter: 'Align center', |
| 1143 | alignRight: 'Align right', |
| 1144 | alignJustify: 'Justify', |
| 1145 | fontSize: 'Size', |
| 1146 | fontWeight: 'Weight', |
| 1147 | appearance: 'Appearance', |
| 1148 | opacity: 'Opacity', |
| 1149 | backgroundColor: 'Background', |
| 1150 | visualColor: 'Color', |
| 1151 | media: 'Media', |
| 1152 | objectFit: 'Object fit', |
| 1153 | alt: 'Alt text', |
| 1154 | poster: 'Poster', |
| 1155 | controls: 'Controls', |
| 1156 | muted: 'Muted', |
| 1157 | loop: 'Loop', |
| 1158 | autoplay: 'Autoplay', |
| 1159 | playsInline: 'Inline', |
| 1160 | preload: 'Preload', |
| 1161 | decrease: 'Decrease', |
| 1162 | increase: 'Increase', |
| 1163 | cancel: 'Cancel', |
| 1164 | save: 'Save', |
| 1165 | selectTextElementHint: 'Click a text element on the page to edit content and style here.', |
| 1166 | exitWithoutSaving: 'Exit editing', |
| 1167 | exitAdjust: 'Exit adjustment', |
| 1168 | adjustLayout: 'Adjust position/size', |
| 1169 | zIndex: 'Layer order', |
| 1170 | zIndexNegativeHint: |
| 1171 | 'Negative layers sit behind content. Hold Alt / Option to click or drag them.', |
| 1172 | saveAdjustments: 'Save adjustments', |
| 1173 | copyElement: 'Copy', |
| 1174 | copyElementFailed: 'Failed to copy element', |
| 1175 | applyElementToAllPages: 'Apply to all pages', |
| 1176 | syncElementApplying: 'Applying...', |
| 1177 | syncElementApplied: 'Applied to {count} page(s)', |
| 1178 | syncElementFailed: 'Failed to apply to all pages', |
| 1179 | syncElementReadFailed: 'Could not read the current element. Select it again and retry.', |
| 1180 | deleteElement: 'Delete element', |
| 1181 | deleteElementConfirm: 'Are you sure you want to delete this element? This cannot be undone.', |
| 1182 | nonTextElementHint: |
| 1183 | 'Still working on this feature.\nYou can use AI mode to inspect and edit elements for now.', |
| 1184 | inspectorUnavailable: |
| 1185 | 'Cannot read this element’s real properties.\nSelect an element inside the page again.', |
| 1186 | deleteElementFailed: 'Failed to delete element', |
| 1187 | exitInspect: 'Exit inspect', |
| 1188 | inspectElement: 'Inspect element', |
| 1189 | aiMode: 'AI', |
| 1190 | exitAiMode: 'Exit AI', |
| 1191 | exitAndSave: 'Exit & Save Version', |
| 1192 | undo: 'Undo', |
| 1193 | redo: 'Redo', |
| 1194 | undoCurrentPageTooltip: 'Undo last action', |
| 1195 | redoCurrentPageTooltip: 'Redo last action', |
| 1196 | discardAllEditsTooltip: 'Discard all changes', |
| 1197 | clickTextToEdit: 'Double-click text to edit', |
| 1198 | dblClickTextToEdit: 'Double-click text to edit', |
| 1199 | editModeToast: 'Drag to adjust position and size, click to select and edit elements', |
| 1200 | animationModeToast: 'Animation mode active — select an element to adjust its animation', |
| 1201 | editorSnap: 'Snap', |
| 1202 | editorGrid: 'Grid', |
| 1203 | editorRulerHint: 'Click the ruler to add a guide', |
| 1204 | editorGuideRemoveHint: 'Drag outside the canvas to remove guide', |
| 1205 | editorClearGuides: 'Clear guides', |
| 1206 | failedPageHint: |
| 1207 | 'This page failed last time and is showing a recoverable file. Keep the Current page context and describe how to fix or regenerate it.', |
| 1208 | clickToSelect: 'Click an element to select it', |
| 1209 | emptyPreviewTitle: 'Waiting for your creative draft', |
| 1210 | briefHint: 'Enter a brief in the message panel and the preview will appear here.', |
| 1211 | imageOnly: 'Only image assets are supported for now', |
| 1212 | imagePathFailed: 'Cannot read image path', |
| 1213 | mediaOnly: 'Only image/video assets are supported for now', |
| 1214 | mediaPathFailed: 'Cannot read media file path', |
| 1215 | assetsAdded: 'Added {count} asset(s)', |
| 1216 | assetUploadFailed: 'Asset upload failed', |
| 1217 | switchToPageFirst: 'Main-session sending is disabled. Switch to Current page first.', |
| 1218 | useUploadedAssets: 'Use uploaded assets', |
| 1219 | selectPageFirst: 'Select a page before sending', |
| 1220 | selectorLocated: '(selected element located)', |
| 1221 | exportFailed: 'Export failed', |
| 1222 | exportCancelled: 'Export cancelled', |
| 1223 | exportProgressPreparing: 'Preparing export...', |
| 1224 | exportProgressRendering: 'Processing page {current}/{total}', |
| 1225 | exportProgressPackaging: 'Packaging files...', |
| 1226 | exportProgressWriting: 'Writing file...', |
| 1227 | exportPdfStart: 'Exporting PDF', |
| 1228 | exportPdfDescription: |
| 1229 | 'Large decks or complex charts may take a while. Keep the window open and the result will appear automatically.', |
| 1230 | exportSuccessPages: 'PDF export succeeded ({count} pages)', |
| 1231 | exportPngStart: 'Exporting PNG images', |
| 1232 | exportPngDescription: |
| 1233 | 'All pages will be saved as high-resolution images, suitable for docs, Notion, or social posts.', |
| 1234 | pngExported: 'PNG export succeeded ({count} images)', |
| 1235 | exportLongImageStart: 'Exporting long image', |
| 1236 | exportLongImageDescription: |
| 1237 | 'All pages are stitched vertically into a single long image, great for social posts, chat, or long docs.', |
| 1238 | longImageExported: 'Long image export succeeded ({count} pages)', |
| 1239 | exportVideoStart: 'Exporting MP4 video', |
| 1240 | exportVideoDescription: |
| 1241 | 'This version exports each page as a static video segment and opens the file location when complete.', |
| 1242 | videoExported: 'MP4 export succeeded ({count} pages)', |
| 1243 | pptxPreparingEditable: 'Preparing editable PPTX', |
| 1244 | pptxPreparingEditableDescription: |
| 1245 | 'Export may take longer while fonts are embedded. Please wait. Preserving all elements editable where possible, including text, shapes, images, and tables.', |
| 1246 | pptxPreparingImage: 'Preparing image PPTX', |
| 1247 | pptxPreparingImageDescription: |
| 1248 | 'Each page is exported as a high-resolution image for pixel-perfect fidelity.', |
| 1249 | pptxExported: 'PPTX export succeeded ({count} pages)', |
| 1250 | pptxEditableDescription: 'All elements were preserved editable where possible.', |
| 1251 | pptxImageDescription: 'Each page is a high-resolution image for pixel-perfect fidelity.', |
| 1252 | exportPptxEditable: 'Editable Export', |
| 1253 | exportPptxImageOnly: 'Image Export', |
| 1254 | exportPackage: 'Pack Export', |
| 1255 | exportPackageTooltip: |
| 1256 | 'Export a runnable preview pack, or compress the full session directory as a ZIP package.', |
| 1257 | exportSlidePack: 'Export slide-pack file', |
| 1258 | exportSlidePackDescription: 'Create a standalone preview pack for sharing a view-only deck.', |
| 1259 | exportSessionZip: 'Export ZIP session package', |
| 1260 | exportSessionZipDescription: |
| 1261 | 'Compress the full current session directory for backup, migration, or troubleshooting.', |
| 1262 | slidePackPreparing: 'Packaging preview...', |
| 1263 | slidePackPreparingDescription: 'Building standalone executable for browser preview', |
| 1264 | slidePackExported: 'Preview pack export succeeded', |
| 1265 | slidePackExportedDescription: 'Executable generated, double-click to preview in browser', |
| 1266 | sessionZipPreparing: 'Compressing session files...', |
| 1267 | sessionZipPreparingDescription: 'Packaging the full current session directory as a ZIP file.', |
| 1268 | sessionZipExported: 'Session ZIP export succeeded', |
| 1269 | sessionZipExportedDescription: |
| 1270 | 'The ZIP contains the current session directory for backup, migration, or troubleshooting.', |
| 1271 | history: 'Version History', |
| 1272 | historyTooltip: 'View saved versions from page saves, AI edits, and page management', |
| 1273 | historyTitle: 'History versions', |
| 1274 | historyRecent: 'Latest 20', |
| 1275 | historyLoading: 'Loading history...', |
| 1276 | historyEmptyTitle: 'No history yet', |
| 1277 | historyEmptyDescription: 'A version is recorded after generation or editing completes.', |
| 1278 | historyCurrent: 'Current', |
| 1279 | historyRollback: 'Rollback', |
| 1280 | historyRollingBack: 'Rolling back...', |
| 1281 | historyChangedPages: 'Changed pages: {pages}', |
| 1282 | historyLoadFailed: 'Failed to load history', |
| 1283 | historyRollbackConfirm: |
| 1284 | 'This will restore the deck to the selected version. Current files will be replaced, but later history will remain available.', |
| 1285 | historyRollbackSuccess: 'Restored history version', |
| 1286 | historyRollbackFailed: 'Rollback failed', |
| 1287 | pageLoadNotice: |
| 1288 | 'Some pages took longer to load and were exported from the current view. Please quickly inspect the PPTX.', |
| 1289 | noEditableTextNotice: |
| 1290 | 'Some pages were preserved as full visuals and may need manual text tweaks in PowerPoint.', |
| 1291 | exportCheckNotice: 'File exported. Please quickly inspect layout details in the PPTX.', |
| 1292 | layoutSaveFailed: 'Failed to save adjustments', |
| 1293 | adjustmentsSaved: 'Saved {count} adjustment(s)', |
| 1294 | templateSaved: 'Saved as template', |
| 1295 | templateSaveFailed: 'Failed to save template', |
| 1296 | viewTemplates: 'View templates', |
| 1297 | manualAdjustHistory: 'Manual page element adjustment', |
| 1298 | discardedAdjustments: 'Discarded unsaved adjustments', |
| 1299 | textSaved: 'Text saved', |
| 1300 | textSaveFailed: 'Failed to save text', |
| 1301 | textSaveEmpty: 'Text cannot be empty', |
| 1302 | inspectActiveToast: 'AI mode active — select elements on the page for AI to modify', |
| 1303 | addPage: 'Add Page', |
| 1304 | addBlankPage: 'Add blank page', |
| 1305 | addGeneratedPage: 'Add generated page', |
| 1306 | addPagesFromSession: 'Add pages from another session', |
| 1307 | mergePagesTitle: 'Add pages from another session', |
| 1308 | mergePagesDescription: |
| 1309 | 'Copy selected pages from another session to the end of this session. The source session will not be changed.', |
| 1310 | mergeSearchSessions: 'Search sessions', |
| 1311 | mergeNoSessions: 'No sessions available', |
| 1312 | mergeUntitledSession: 'Untitled session', |
| 1313 | mergeSelectSession: 'Select a session', |
| 1314 | mergeSelectSessionHint: 'Choose a session on the left, then select pages to add', |
| 1315 | mergeNoPages: 'This session has no available pages', |
| 1316 | mergePageCount: '{count} pages', |
| 1317 | mergeSelectedCount: '{count}/{max} selected', |
| 1318 | mergePageLimitReached: 'You can add up to {count} pages at a time', |
| 1319 | mergeSelectAll: 'Select all available', |
| 1320 | mergeSelectFirstPages: 'Select first {count}', |
| 1321 | mergeClearSelection: 'Clear selection', |
| 1322 | mergeAddPages: 'Add {count} pages', |
| 1323 | mergeAddingPages: 'Adding pages...', |
| 1324 | mergeLoadFailed: 'Failed to load session pages', |
| 1325 | mergePagesFailed: 'Failed to add session pages', |
| 1326 | mergeErrorInvalidRequest: 'Invalid request. Reopen the dialog and try again.', |
| 1327 | mergeErrorSameSession: 'Pages cannot be added from the current session.', |
| 1328 | mergeErrorNoPageSelected: 'Select at least one page to add.', |
| 1329 | mergeErrorPageLimit: 'The selected pages exceed the allowed limit.', |
| 1330 | mergeErrorSessionNotFound: 'The source or current session no longer exists.', |
| 1331 | mergeErrorSessionBusy: 'The source or current session is generating. Try again later.', |
| 1332 | mergeErrorSlideSizeMismatch: |
| 1333 | 'The source and current sessions use different canvas sizes and cannot be merged.', |
| 1334 | mergeErrorPageNotFound: 'A selected source page no longer exists.', |
| 1335 | mergeErrorPageUnavailable: 'A selected source page is incomplete or its file is missing.', |
| 1336 | mergeErrorTargetFont: 'The current template font configuration could not be loaded.', |
| 1337 | mergeErrorPageCopy: 'A page could not be copied. Check its resources and try again.', |
| 1338 | mergeDisabledSessionBusy: 'This session is generating. It can be added when complete.', |
| 1339 | mergeDisabledSessionEmpty: 'This session has no pages.', |
| 1340 | mergeDisabledSlideSizeMismatch: 'Canvas size differs from the current presentation.', |
| 1341 | mergeDisabledPageIncomplete: 'This page has not finished generating.', |
| 1342 | mergeDisabledPageMissing: 'The page file is missing.', |
| 1343 | addPagesFromTemplate: 'Add pages from a template', |
| 1344 | mergeTemplateTitle: 'Add pages from a template', |
| 1345 | mergeTemplateDescription: |
| 1346 | 'Copy selected pages from a template to the end of this presentation, keeping the template styling.', |
| 1347 | mergeTemplateSearchTemplates: 'Search templates', |
| 1348 | mergeTemplateNoTemplates: 'No templates available', |
| 1349 | mergeTemplateUntitled: 'Untitled template', |
| 1350 | mergeTemplateSelectTemplate: 'Select a template', |
| 1351 | mergeTemplateSelectTemplateHint: 'Choose a template on the left, then select pages to add', |
| 1352 | mergeTemplateNoPages: 'This template has no available pages', |
| 1353 | mergeTemplatePageCount: '{count} pages', |
| 1354 | mergeTemplateSelectedCount: '{count}/{max} selected', |
| 1355 | mergeTemplateSelectAll: 'Select all available', |
| 1356 | mergeTemplateSelectFirstPages: 'Select first {count}', |
| 1357 | mergeTemplateSourceBadge: 'Source', |
| 1358 | mergeTemplateAddingPages: 'Adding pages...', |
| 1359 | mergeTemplateAddPages: 'Add {count} pages', |
| 1360 | mergeTemplateSuccess: 'Added {count} pages from template "{template}"', |
| 1361 | mergeTemplateLoadFailed: 'Failed to load templates', |
| 1362 | mergeTemplatePagesFailed: 'Failed to add template pages', |
| 1363 | mergePagesSuccess: 'Added {count} pages from “{session}”', |
| 1364 | collapseSidebar: 'Collapse sidebar', |
| 1365 | expandSidebar: 'Expand sidebar', |
| 1366 | untitledPage: 'Untitled page', |
| 1367 | addBlankPageHint: |
| 1368 | 'Choose an existing page as the base. It will be copied to the end with only page text cleared.', |
| 1369 | addBlankPageCreate: 'Create blank page', |
| 1370 | addBlankPageFailed: 'Failed to add blank page', |
| 1371 | addPageHint: 'Auto-generated in the current style — just describe the page you want', |
| 1372 | addPageDescription: 'Describe the page you want to add', |
| 1373 | addPageGenerating: 'Generating new page...', |
| 1374 | addPageGenerate: 'Generate', |
| 1375 | addPageCancel: 'Cancel', |
| 1376 | addPageFailed: 'Failed to add page', |
| 1377 | deleteConfirmTitle: 'Delete this page?', |
| 1378 | retryFailedPage: 'Regenerate this page', |
| 1379 | retryPageGenerating: 'Regenerating page...', |
| 1380 | retryPageFailed: 'Failed to regenerate page' |
| 1381 | }, |
| 1382 | pageManagement: { |
| 1383 | dragHandle: 'Drag to reorder', |
| 1384 | editPageTitle: 'Edit title', |
| 1385 | editPageTitleDescription: 'Rename the current page and sync the preview list and history.', |
| 1386 | editPageOutline: 'Edit outline', |
| 1387 | pageOutlinePlaceholder: 'Enter page outline', |
| 1388 | savePageOutline: 'Save outline', |
| 1389 | updateOutlineFailed: 'Failed to save page outline', |
| 1390 | pageTitleLabel: 'Page title', |
| 1391 | pageTitlePlaceholder: 'Enter page title', |
| 1392 | pageTitleRequired: 'Please enter a page title', |
| 1393 | savePageTitle: 'Save title', |
| 1394 | updateTitleFailed: 'Failed to save page title', |
| 1395 | deletePage: 'Delete page', |
| 1396 | duplicatePage: 'Duplicate page', |
| 1397 | deleteConfirmTitle: 'Delete this page?', |
| 1398 | deleteConfirmDescription: 'The page will be removed from this presentation.', |
| 1399 | deleteConfirmAction: 'Delete', |
| 1400 | deleteLastPageError: 'Cannot delete the last page', |
| 1401 | reorderFailed: 'Failed to reorder pages', |
| 1402 | deleteFailed: 'Failed to delete page', |
| 1403 | duplicatePageFailed: 'Failed to duplicate page' |
| 1404 | }, |
| 1405 | editMode: { |
| 1406 | addText: 'Plain Text', |
| 1407 | defaultText: 'New text', |
| 1408 | artText: 'WordArt', |
| 1409 | artTextEffect: 'Current effect', |
| 1410 | artTextContent: 'Text', |
| 1411 | artTextFontSize: 'Font size', |
| 1412 | addImage: 'Image', |
| 1413 | addVideo: 'Video', |
| 1414 | addShape: 'Shape', |
| 1415 | addIcon: 'Icon', |
| 1416 | shapeRect: 'Rectangle', |
| 1417 | shapeRoundedRect: 'Rounded', |
| 1418 | shapeEllipse: 'Ellipse', |
| 1419 | shapeLine: 'Line', |
| 1420 | shapeArrowRight: 'Arrow', |
| 1421 | shapeTriangle: 'Triangle', |
| 1422 | shapeDiamond: 'Diamond', |
| 1423 | shapePentagon: 'Pentagon', |
| 1424 | shapeHexagon: 'Hexagon', |
| 1425 | shapeParallelogram: 'Parallelogram', |
| 1426 | shapeTrapezoid: 'Trapezoid', |
| 1427 | shapeStar: 'Star', |
| 1428 | shapeChevron: 'Chevron', |
| 1429 | iconSectionIcons: 'Icons', |
| 1430 | iconSectionNumbers: 'Numbers', |
| 1431 | chartBar: 'Bar', |
| 1432 | chartLine: 'Line', |
| 1433 | chartPie: 'Pie', |
| 1434 | chartDoughnut: 'Doughnut', |
| 1435 | chartRadar: 'Radar', |
| 1436 | chart: 'Chart', |
| 1437 | formula: 'Formula', |
| 1438 | fromLibrary: 'Choose from Library', |
| 1439 | fromLocal: 'Upload from Local', |
| 1440 | chooseImage: 'Choose Image', |
| 1441 | chooseVideo: 'Choose Video', |
| 1442 | assetPickerHint: 'Select an asset then confirm', |
| 1443 | loadingAssets: 'Loading...', |
| 1444 | noAssets: 'No assets yet. Upload from local first.', |
| 1445 | cancel: 'Cancel', |
| 1446 | confirmAdd: 'Confirm Add' |
| 1447 | }, |
| 1448 | fonts: { |
| 1449 | eyebrow: 'Fonts', |
| 1450 | title: 'Font Management', |
| 1451 | description: |
| 1452 | 'Manage locally uploaded fonts. Choose a font scheme on the home page before generating, or let AI auto-match.', |
| 1453 | openFolder: 'Open font folder', |
| 1454 | upload: 'Upload font', |
| 1455 | uploadDialogTitle: 'Upload font', |
| 1456 | uploadDialogDescription: |
| 1457 | 'Only .woff2 format is supported. You can set different weights and styles for each file.', |
| 1458 | uploadDialogDownloadPre: 'Visit', |
| 1459 | uploadDialogDownloadPost: 'to download free woff2 font files.', |
| 1460 | googleFontsHelperLink: 'Google Fonts Helper', |
| 1461 | familyName: 'Font family', |
| 1462 | familyNamePlaceholder: 'My Brand Sans', |
| 1463 | role: 'Usage', |
| 1464 | roleBoth: 'Title & Body', |
| 1465 | roleTitle: 'Title', |
| 1466 | roleBody: 'Body', |
| 1467 | roleNone: 'Not set', |
| 1468 | scripts: 'Script', |
| 1469 | scriptsPlaceholder: 'Select', |
| 1470 | scriptsLatin: 'Latin', |
| 1471 | scriptsCjk: 'Chinese', |
| 1472 | scriptsMixed: 'Mixed', |
| 1473 | scriptsNone: 'Not set', |
| 1474 | category: 'Category', |
| 1475 | categorySans: 'Sans-serif', |
| 1476 | categorySerif: 'Serif', |
| 1477 | categoryDisplay: 'Display', |
| 1478 | categoryHandwriting: 'Handwriting', |
| 1479 | categoryMonospace: 'Monospace', |
| 1480 | chooseFiles: 'Choose files', |
| 1481 | uploadButton: 'Confirm Upload', |
| 1482 | removeFile: 'Remove file', |
| 1483 | uploadedFonts: 'Uploaded fonts', |
| 1484 | fontCount: '{count} font(s)', |
| 1485 | loading: 'Loading...', |
| 1486 | emptyUpload: 'No fonts uploaded yet. Click the button above to add your brand fonts.', |
| 1487 | fileCount: '{count} file(s)', |
| 1488 | googleFontsTitle: 'Built-in Google Fonts', |
| 1489 | googleFontsDesc: 'Bundled locally. Auto-matched or manually selected during generation.', |
| 1490 | loadFailed: 'Failed to load fonts', |
| 1491 | chooseFailed: 'Failed to choose font files', |
| 1492 | fillFamily: 'Please enter the font family name', |
| 1493 | selectFile: 'Please select .woff2 font files', |
| 1494 | selectScripts: 'Please select the script', |
| 1495 | uploaded: 'Font uploaded', |
| 1496 | uploadFailed: 'Font upload failed', |
| 1497 | deleted: 'Font deleted', |
| 1498 | deleteFailed: 'Failed to delete font', |
| 1499 | deleteLabel: 'Delete {family}' |
| 1500 | }, |
| 1501 | thinking: { |
| 1502 | homeTitle: 'Start a Presentation', |
| 1503 | homeDescription: |
| 1504 | 'Have a topic or source material ready? Generate a first draft now. Still shaping the idea? Chat first to build the outline.', |
| 1505 | quickCreate: 'Quick Create', |
| 1506 | quickCreateDescription: |
| 1507 | 'Already have an outline or clear direction — pick a style, set the page count, and generate an editable draft right away.', |
| 1508 | quickCreateBadge: 'Draft fast', |
| 1509 | quickCreatePointOne: 'Set topic, pages, and style, with optional source material.', |
| 1510 | quickCreatePointTwo: 'Best when you have a direction and want an editable draft quickly.', |
| 1511 | startQuickCreate: 'Start generating', |
| 1512 | exploreProject: 'Chat to Create', |
| 1513 | exploreProjectDescription: |
| 1514 | 'Still shaping the idea? Chat with AI to refine the outline and page structure, then generate when ready.', |
| 1515 | exploreProjectBadge: 'Plan first', |
| 1516 | explorePointOne: 'Turn conversation into outline, page structure, and style direction.', |
| 1517 | explorePointTwo: 'Upload documents and images as source material.', |
| 1518 | startExplore: 'Start chatting', |
| 1519 | creatingExplore: 'Creating', |
| 1520 | continueExplore: 'Continue your latest chat', |
| 1521 | revealWorkspace: 'Show exploration folder', |
| 1522 | newWorkspace: 'New chat', |
| 1523 | historyTitle: 'History', |
| 1524 | historyLoadFailed: 'Failed to load history', |
| 1525 | historyEmptyTitle: 'No history yet', |
| 1526 | historyEmptyDescription: |
| 1527 | 'Create a new chat to organize the idea and source material into a generation outline.', |
| 1528 | emptyWorkspaceTitle: 'Choose a chat to continue', |
| 1529 | emptyWorkspaceDescription: |
| 1530 | 'Or start a new chat and shape the topic, source material, and page structure from scratch.', |
| 1531 | untitledWorkspace: 'Untitled chat', |
| 1532 | restoredContextTitle: 'Restored Context', |
| 1533 | deleteWorkspace: 'Delete chat', |
| 1534 | deleteWorkspaceTitle: 'Delete this history item?', |
| 1535 | deleteWorkspaceDescription: |
| 1536 | 'Delete "{title}"? The related thinking files and source material will be removed permanently.', |
| 1537 | deleteWorkspaceDone: 'History item deleted', |
| 1538 | deleteWorkspaceFailed: 'Failed to delete history item', |
| 1539 | homeNoteOne: 'Use quick create for simple, already-defined tasks.', |
| 1540 | homeNoteTwo: |
| 1541 | 'Use explore for complex material and confirm the outline, page structure, and style direction before generation.', |
| 1542 | homeNoteThree: 'Both paths eventually use the same generation flow.', |
| 1543 | eyebrow: 'Explore before creating', |
| 1544 | title: 'Chat to Create', |
| 1545 | description: |
| 1546 | 'Shape the brief, source material, and page structure through conversation, then generate the deck with 70+ built-in styles, custom styles, Chart.js charts, and anime.js animation.', |
| 1547 | chatTitle: 'AI Chat', |
| 1548 | thinking: 'Thinking...', |
| 1549 | inputPlaceholder: 'Describe the topic and content you want to present...', |
| 1550 | welcomeMessage: |
| 1551 | 'Hi, I can help turn a raw creative idea into a clear content plan.\n\nStart anywhere:\n\n- **Share an idea** and I’ll shape the structure and key points\n- **Upload material** and I’ll pull out what’s useful\n- **Say “generate a creative outline from this”** and I’ll organize the plan before generation\n\nSend over your idea, notes, or direction.', |
| 1552 | sourceCount: '{count} sources', |
| 1553 | pageCardsTitle: 'Page Outline', |
| 1554 | pageCountLabel: '{count} pages', |
| 1555 | noPagesYet: 'No pages yet. Start a conversation to build the outline', |
| 1556 | noDocumentYet: 'The generation outline has no content yet', |
| 1557 | outlineView: 'Outline', |
| 1558 | editOutline: 'Edit page outline', |
| 1559 | saveOutline: 'Save page outline', |
| 1560 | outlineTitle: 'Page title', |
| 1561 | outlineObjective: 'Page objective', |
| 1562 | outlineSummary: 'Content summary', |
| 1563 | outlineKeyPoints: 'Key points', |
| 1564 | outlineKeyPointsHint: 'Enter one key point per line', |
| 1565 | outlineRequired: 'Complete the title, objective, summary, and key points', |
| 1566 | outlineSaved: 'Page outline saved', |
| 1567 | outlineSaveFailed: 'Failed to save page outline', |
| 1568 | confirmAndGenerate: 'Confirm & Generate', |
| 1569 | createFailed: 'Failed to create workspace', |
| 1570 | stageCollect: 'Collecting', |
| 1571 | stageOutline: 'Outlining', |
| 1572 | stageDraft: 'Drafting', |
| 1573 | stageRefine: 'Refining', |
| 1574 | stageReady: 'Ready', |
| 1575 | generationDialogTitle: 'Confirm generation parameters', |
| 1576 | generationDialogDescription: 'Confirm the parameters below to start generating', |
| 1577 | styleId: 'Style', |
| 1578 | fontMode: 'Font', |
| 1579 | prepareFailed: 'Failed to prepare generation', |
| 1580 | sourceUploaded: 'Source uploaded', |
| 1581 | uploadFailed: 'Failed to upload sources', |
| 1582 | removeSource: 'Remove source', |
| 1583 | removeSourceFailed: 'Failed to remove source', |
| 1584 | uploadTooltip: |
| 1585 | 'Supports .md, .txt, .csv, .docx documents (up to {documentMaxSize}MB each) and .png, .jpg, .webp images (up to {imageMaxSize}MB each)', |
| 1586 | sourcePreprocessHint: |
| 1587 | 'After you send the message, the app will structure the document first, then pass it to AI for outlining.', |
| 1588 | needMoreWork: 'Complete the outline before generating' |
| 1589 | }, |
| 1590 | htmlEditor: { |
| 1591 | eyebrow: 'Local HTML', |
| 1592 | edit: 'Edit', |
| 1593 | backToList: 'Back to list', |
| 1594 | delete: 'Delete', |
| 1595 | emptyTitle: 'Start editing a web page', |
| 1596 | emptyHint: 'Choose an HTML file from your computer to begin.', |
| 1597 | import: 'Import HTML', |
| 1598 | importTooltip: 'Currently supports importing one HTML file at a time.', |
| 1599 | thumbnailGenerating: 'Generating preview', |
| 1600 | untitled: 'Untitled', |
| 1601 | listTitle: 'HTML editor', |
| 1602 | searchButton: 'Search HTML files', |
| 1603 | searchPlaceholder: 'Search by file name or path', |
| 1604 | clearSearch: 'Clear search', |
| 1605 | noSearchResultsTitle: 'No matching HTML files', |
| 1606 | noSearchResultsDescription: 'Try another file name or path keyword.', |
| 1607 | removeFromLibraryTitle: 'Remove from the document library?', |
| 1608 | removeFromLibraryDescription: |
| 1609 | 'This removes the database record for "{name}". The HTML file stays on your computer.', |
| 1610 | removedFromLibrary: 'Removed from the document library', |
| 1611 | removeFromLibraryFailed: 'Unable to remove the document. Please try again.', |
| 1612 | undo: 'Undo', |
| 1613 | redo: 'Redo', |
| 1614 | discard: 'Discard changes', |
| 1615 | save: 'Save', |
| 1616 | export: 'Export', |
| 1617 | revealFile: 'Show file', |
| 1618 | revealFileFailed: 'Unable to show the current HTML file', |
| 1619 | preview: 'Preview in browser', |
| 1620 | history: 'Version history', |
| 1621 | historyEmpty: 'No versions yet', |
| 1622 | restore: 'Restore', |
| 1623 | discardAll: 'Discard all changes', |
| 1624 | exported: 'Exported', |
| 1625 | insertText: 'Text', |
| 1626 | insertArtText: 'Art text', |
| 1627 | insertShape: 'Shape', |
| 1628 | insertIcon: 'Icon', |
| 1629 | insertChart: 'Chart', |
| 1630 | insertImage: 'Insert image', |
| 1631 | insertVideo: 'Insert video', |
| 1632 | mediaSourceHint: 'Choose from the local media library or enter an accessible external URL.', |
| 1633 | mediaSourceLocal: 'Local file', |
| 1634 | mediaSourceExternal: 'External URL', |
| 1635 | mediaLibrary: 'Local media', |
| 1636 | localMediaHint: |
| 1637 | "Uploaded files remain in this HTML document's assets directory and can be reused.", |
| 1638 | chooseMediaFile: 'Upload local file', |
| 1639 | mediaLibraryEmpty: 'No local media yet', |
| 1640 | mediaUrlPlaceholder: 'https://example.com/media', |
| 1641 | invalidMediaUrl: 'Enter a valid http or https URL.', |
| 1642 | insertMediaFailed: |
| 1643 | 'Unable to insert into the canvas. Please wait for the page to finish loading and try again.', |
| 1644 | insertMedia: 'Insert', |
| 1645 | insertFormula: 'Formula', |
| 1646 | copyElement: 'Copy element', |
| 1647 | selectToEdit: 'Select an element to edit its properties', |
| 1648 | retry: 'Retry', |
| 1649 | aiMode: 'Inspect element', |
| 1650 | aiModeButton: 'AI mode', |
| 1651 | closeAiMode: 'Close inspect mode', |
| 1652 | aiInspectHint: 'Select an element and let AI assist with its redesign', |
| 1653 | aiSelectHint: |
| 1654 | 'Optionally select an element to attach its context; otherwise AI analyzes the whole page.', |
| 1655 | selectedElement: 'Inspected element', |
| 1656 | clearSelectedElement: 'Clear inspected element', |
| 1657 | aiEmpty: 'Ask AI to analyze the whole page, or select an element for a targeted redesign.', |
| 1658 | aiThinking: 'AI is thinking...', |
| 1659 | aiPlaceholder: 'Describe how you want to redesign this element...', |
| 1660 | aiSelectedContext: 'Inspected element attached', |
| 1661 | aiDocumentContext: 'Current HTML document', |
| 1662 | aiSend: 'Send redesign request', |
| 1663 | aiClearConversation: 'Clear conversation', |
| 1664 | aiFailed: 'AI request failed. Please try again.', |
| 1665 | aiPlanTitle: 'AI-identified redesign plan', |
| 1666 | aiIntent: 'Detected intent', |
| 1667 | aiIntentInspect: 'Inspect element', |
| 1668 | aiIntentRedesign: 'Assist with redesign', |
| 1669 | aiIntentStyle: 'Style redesign', |
| 1670 | aiIntentLayout: 'Layout redesign', |
| 1671 | aiIntentContent: 'Content redesign', |
| 1672 | aiIntentOther: 'Other request' |
| 1673 | } |
| 1674 | } satisfies DeepStringShape<typeof zh> |
| 1675 |