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