export const enUS = { common: { search: "Search...", create: "New", new: "New", cancel: "Cancel", delete: "Delete", edit: "Edit", theme: "Theme", signOut: "Sign Out", noMatches: "No matches found", tryDifferentSearch: "Try using a different search term.", light: "Light", dark: "Dark", system: "System", loading: "Loading...", note: "Note", insight: "Insight", newSource: "New Source", newNotebook: "New Notebook", newPodcast: "New Podcast", language: "Language", english: "English", chinese: "简体中文", japanese: "日本語", french: "Français", russian: "Русский", source: "Source", notebook: "Notebook", podcast: "Podcast", quickActions: "Quick actions", quickActionsDesc: "Navigation, search, ask, theme", appName: "Open Notebook", add: "Add", remove: "Remove", confirm: "Confirm", warning: "Warning", error: "Error", success: "Success", model: "Model", back: "Back", next: "Next", done: "Done", processing: "Processing...", creating: "Creating...", linked: "Linked", adding: "Adding...", addSelected: "Add Selected", customModel: "Custom Model", failed: "failed", current: "Current", save: "Save", writeNote: "Write Note", batchMode: "Batch Mode", optional: "Optional", type: "Type", title: "Title", created: "Created {time}", updated: "Updated {time}", actions: "Actions", noResults: "No results", references: "References", refreshPage: "Please try refreshing the page", refresh: "Refresh", aiGenerated: "AI Generated", human: "Human", unknown: "Unknown", notes: "Notes", chat: "Chat", deleteForever: "Delete Forever", connectionError: "Connection Error", unableToConnect: "Unable to connect to the API server", retryConnection: "Retry Connection", diagnosticInfo: "Diagnostic Information", version: "Version", built: "Built", apiUrl: "API URL", frontendUrl: "Frontend URL", checkConsoleLogs: "Check browser console for detailed logs (look for 🔧 [Config] messages)", yes: "Yes", no: "No", saving: "Saving...", description: "Description", saveToNote: "Save to note", copyToClipboard: "Copy to clipboard", close: "Close", insights: "Insights", progress: "Progress", deleting: "Deleting...", created_label: "Created", updated_label: "Updated", download: "Download", saveChanges: "Save Changes", name: "Name", default: "Default", nameRequired: "Name is required", modelConfiguration: "Model Configuration", resetToDefault: "Reset to Default", reasoning: "Reasoning", searchTerms: "Search Terms", strategy: "Strategy", individualAnswers: "Individual Answers ({count})", finalAnswer: "Final Answer", notebookLabel: "Notebook: {name}", itemNotFound: "This {type} could not be found", accessibility: { transformationViews: "Transformation views", searchKB: "Ask or search your knowledge base", enterQuestion: "Enter your question to ask the knowledge base", enterSearch: "Enter search query", searchKBBtn: "Search knowledge base", podcastViews: "Podcast views", ytVideo: "YouTube video", askResponse: "Ask Response", searchNotebooks: "Search notebooks", }, url: "URL", errorDetails: "Error Details", editTransformation: "Edit Transformation", retry: "Try Again", traditionalChinese: "繁體中文", portuguese: "Português", completed: "completed", saveSuccess: "Saved successfully", contextModes: { off: "Not included in chat", insights: "Insights only", full: "Full content", clickToCycle: "Click to cycle", }, clickToEdit: "Click to edit", }, apiErrors: { notebookNotFound: "Notebook not found", sourceNotFound: "Source not found", transformationNotFound: "Transformation not found", fileUploadFailed: "File upload failed", urlRequired: "URL is required for link type", contentRequired: "Content is required for text type", invalidSourceType: "Invalid source type", processingFailed: "Processing failed", failedToQueue: "Failed to queue processing", invalidSortBy: "Sort field must be 'created' or 'updated'", invalidSortOrder: "Sort order must be 'asc' or 'desc'", accessDenied: "Access to file denied", fileNotFoundOnServer: "File not found on server", searchFailed: "Search failed", askFailed: "Ask failed", pleaseEnterQuestion: "Please enter a question", pleaseConfigureModels: "Please configure all required models", failedToCreateSession: "Failed to create session", failedToUpdateSession: "Failed to update session", failedToDeleteSession: "Failed to delete session", failedToSendMessage: "Failed to send message", unauthorized: "Unauthorized access, please check your password", invalidPassword: "Invalid password", embeddingModelRequired: "This feature requires an embedding model. Please configure one in the Models section.", strategyModelNotFound: "Strategy model not found", answerModelNotFound: "Answer model not found", finalAnswerModelNotFound: "Final answer model not found", noAnswerGenerated: "No answer could be generated", genericError: "An unexpected error occurred", }, connectionErrors: { apiTitle: "Unable to Connect to API Server", apiDesc: "The Open Notebook API server could not be reached", dbTitle: "Database Connection Failed", dbDesc: "The API server is running, but the database is not accessible", troubleshooting: "This usually means:", apiUnreachable1: "The API server is not running", apiUnreachable2: "The API server is running on a different address", apiUnreachable3: "Network connectivity issues", dbFailed1: "SurrealDB is not running", dbFailed2: "Database connection settings are incorrect", dbFailed3: "Network issues between API and database", quickFixes: "Quick fixes:", setApiUrl: "Set the API_URL environment variable:", checkSurreal: "Check if SurrealDB is running:", seeDocumentation: "For detailed setup instructions, see:", docLink: "Open Notebook Documentation", showTechnical: "Show Technical Details", attemptedUrl: "Attempted URL", message: "Message", technicalDetails: "Technical Details", stackTrace: "Stack Trace", retryLabel: "Retry Connection", retryHint: "Press R or click the button to retry", dockerLabel: "For Docker", localDevLabel: "For local development", }, auth: { loginTitle: "Open Notebook", loginDesc: "Enter your password to access the application", passwordPlaceholder: "Password", signingIn: "Signing in...", signIn: "Sign In", connectErrorHint: "Unable to connect to server. Please check if the API is running.", }, navigation: { collect: "Collect", process: "Process", create: "Create", manage: "Manage", sources: "Sources", notebooks: "Notebooks", askAndSearch: "Ask and Search", podcasts: "Podcasts", models: "Models", transformations: "Transformations", transformation: "Transformation", settings: "Settings", advanced: "Advanced", nav: "Navigation", language: "Toggle language", theme: "Theme", ask: "Ask", }, notebooks: { title: "Notebooks", newNotebook: "New Notebook", searchPlaceholder: "Search notebooks...", archived: "Archived", archive: "Archive", unarchive: "Unarchive", deleteNotebook: "Delete Notebook", deleteNotebookDesc: "Are you sure you want to delete \"{name}\"? This action cannot be undone.", deleteNotebookLoading: "Loading deletion preview...", deleteNotebookNotes: "{count} note(s) will be permanently deleted.", deleteNotebookNoNotes: "No notes to delete.", deleteNotebookExclusiveSources: "{count} source(s) exist only in this notebook.", deleteNotebookSharedSources: "{count} source(s) are shared with other notebooks and will be unlinked.", deleteNotebookNoSources: "No sources in this notebook.", deleteExclusiveSourcesLabel: "Delete exclusive sources", keepExclusiveSourcesLabel: "Unlink and keep them", activeNotebooks: "Active Notebooks", archivedNotebooks: "Archived Notebooks", notFound: "Notebook not found", notFoundDesc: "The requested notebook does not exist.", updated: "Updated", namePlaceholder: "Notebook name", addDescription: "Add description...", noNotesYet: "No notes yet", deleteNote: "Delete Note", deleteNoteConfirm: "Are you sure you want to delete this note? This action cannot be undone.", noteCreatedSuccess: "Note created successfully", failedToCreateNote: "Failed to create note", noteUpdatedSuccess: "Note updated successfully", failedToUpdateNote: "Failed to update note", noteDeletedSuccess: "Note deleted successfully", failedToDeleteNote: "Failed to delete note", createNew: "Create New Notebook", createNewDesc: "Enter a name and optional description to get started.", descPlaceholder: "Add more info about this notebook here...", createSuccess: "Notebook created successfully", updateSuccess: "Notebook updated successfully", deleteSuccess: "Notebook deleted successfully", }, sources: { title: "Sources", add: "Add Source", addNew: "Add New Source", addExisting: "Add Existing Source", delete: "Delete Source", statusPreparing: "Preparing", statusQueued: "Queued", statusProcessing: "Processing", statusCompleted: "Completed", statusFailed: "Failed", statusPreparingDesc: "Preparing to process", statusQueuedDesc: "Waiting to be processed", statusProcessingDesc: "Being processed", statusCompletedDesc: "Successfully processed", statusFailedDesc: "Processing failed", failedToLoad: "Failed to load sources", allSourcesDesc: "View all your sources here. You can add new sources or manage existing ones.", allSources: "All Sources", insights: "Insights", yes: "Yes", no: "No", loadingMore: "Loading more...", noSourcesYet: "No sources yet", allSourcesDescShort: "View all your sources here.", cannotSaveNoteNoNotebook: "Cannot save note: notebook ID not available", createFirstSource: "Add your first source to start building your knowledge base.", deleteSourceConfirm: "Are you sure you want to delete this source?", deleteConfirm: "Are you sure you want to delete this?", deleteConfirmWithTitle: "Are you sure you want to delete \"{title}\"?", deleteSuccess: "Source deleted successfully. Note: To delete the file from storage, you must enable checking the \"delete file\" option in the settings page.", failedToDelete: "Failed to delete source", sourceQueued: "Source Queued", sourceQueuedDesc: "Source submitted for background processing. You can monitor progress in the sources list.", sourceAddedSuccess: "Source added successfully", failedToAddSource: "Failed to add source", sourceUpdatedSuccess: "Source updated successfully", failedToUpdateSource: "Failed to update source", sourceDeletedSuccess: "Source deleted successfully", failedToDeleteSource: "Failed to delete source", fileUploadedSuccess: "File uploaded successfully", failedToUploadFile: "Failed to upload file", sourceRequeued: "Source Retry Queued", sourceRequeuedDesc: "The source has been requeued for processing.", failedToRetry: "Retry Failed", sourcesAddedToNotebook: "{count} source(s) added to notebook", failedToAddSourcesToNotebook: "Failed to add sources to notebook", partialAddSuccess: "{success} source(s) added, {failed} failed", sourceRemovedFromNotebook: "Source removed from notebook successfully", failedToRemoveSourceFromNotebook: "Failed to remove source from notebook", removeConfirm: "Are you sure you want to remove this from the notebook?", checking: "Checking...", untitledSource: "Untitled Source", maxItems: "max {count}", insightsCount: "{count} insights", details: "Details", detailsTitle: "Source Details", content: "Content", metadata: "Metadata", type: { link: "Link", file: "File", text: "Text", }, id: "Source ID", topics: "Topics", embedded: "Embedded", notEmbedded: "Not Embedded", embedContent: "Embed Content", embedding: "Embedding...", alreadyEmbedded: "Already Embedded", downloadFile: "Download File", fileUnavailable: "File unavailable", preparing: "Preparing...", generateNewInsight: "Generate New Insight", selectTransformation: "Select a transformation...", noInsightsYet: "No insights yet", createFirstInsight: "Create your first insight using a transformation above", viewInsight: "View Insight", deleteInsight: "Delete Insight", deleteInsightConfirm: "Are you sure you want to delete this insight? This action cannot be undone.", insightGenerationStarted: "Insight generation started. It will appear shortly.", editNote: "Edit note", createNote: "Create note", addTitle: "Add a title...", untitledNote: "Untitled Note", writeNotePlaceholder: "Write your note content here...", saveNote: "Save Note", createNoteBtn: "Create Note", createFirstNote: "Create your first note to capture insights and observations.", urlLabel: "URL(s) *", fileLabel: "File(s) *", textContentLabel: "Text Content *", enterUrlsPlaceholder: "Enter URLs, one per line\nhttps://example.com/article1\nhttps://example.com/article2", batchUrlHint: "Paste multiple URLs (one per line) to batch import", invalidUrlsDetected: "Invalid URLs detected:", lineLabel: "Line {line}", fixInvalidUrls: "Please fix or remove invalid URLs to continue", selectMultipleFilesHint: "Select multiple files to batch import. Supported: Documents (PDF, DOC, DOCX, PPT, XLS, EPUB, TXT, MD), Media (MP4, MP3, WAV, M4A), Images (JPG, PNG), Archives (ZIP)", selectedFiles: "Selected files:", textPlaceholder: "Paste or type your content here...", htmlDetected: "HTML content detected. It will be converted to Markdown after processing.", titlePlaceholder: "Give your source a descriptive title", batchTitlesAuto: "Titles will be automatically generated for each source.", batchCommonSettings: "The same notebooks and transformations will be applied to all items.", urlsCount: "{count} URL(s)", filesCount: "{count} file(s)", addSource: "Add Source", notEmbeddedAlert: "Content Not Embedded", notEmbeddedDesc: "This content hasn't been embedded for vector search. Embedding enables advanced search capabilities and better content discovery.", openOnYoutube: "Open on YouTube", urlCopied: "URL copied to clipboard", viewSource: "View Source", noInsightSelected: "No insight selected", sourceInsight: "Source Insight", manageNotebooks: "Manage Notebooks", manageNotebooksDesc: "Manage which notebooks contain this source", noNotebooksAvailable: "No notebooks available", loadFailed: "Failed to load source details", removeFromNotebook: "Remove from Notebook", retryProcessing: "Retry Processing", deleteSource: "Delete Source", retry: "Retry", addExistingTitle: "Add Existing Sources", addExistingDesc: "Select existing sources from across all your notebooks to add to the current one.", searchPlaceholder: "Search sources by name or URL...", noNotebooksFound: "No notebooks found.", showingFirst100: "Showing first 100 sources. Use search to find specific ones.", selectedCount: "{count} sources selected", added: "Added on {date}", addUrl: "Add URL", uploadFile: "Upload File", enterText: "Enter Text", processDescription: "Content will be processed and analyzed by AI.", processingFiles: "Processing your files...", titleRequired: "A title is required for text content", titleGenerated: "If left empty, a title will be generated from the content", batchCount: "{count} {type} will be processed", enableEmbedding: "Enable embedding for search", embeddingDesc: "Allows this source to be found in vector searches and AI queries", embeddingAlways: "Embedding enabled automatically", embeddingAlwaysDesc: "Your settings are configured to always embed content for vector search.", embeddingNever: "Embedding disabled", embeddingNeverDesc: "Your settings are configured to skip embedding. Vector search won't be available for this source.", changeInSettings: "You can change this in Settings", notFound: "Source not found", noContent: "No content available", insightsDesc: "Insights generated from model analysis", uploadedFile: "Uploaded file", fileUnavailableDesc: "This file is currently unavailable due to storage system reasons.", batchSuccess: "{count} source(s) created successfully", batchFailed: "Failed to create all {count} sources", batchPartial: "{success} succeeded, {failed} failed", submittingSource: "Submitting source for processing...", processingBatchSources: "Processing {count} sources. This may take a few moments.", processingSource: "Your source is being processed. This may take a few moments.", maxFilesAllowed: "Maximum {count} files allowed per batch", }, chat: { sessions: "Sessions", sessionTitlePlaceholder: "Type a title here...", noSessions: "No chat sessions yet", deleteSession: "Delete Session", deleteSessionDesc: "Are you sure you want to delete this chat session? This action cannot be undone.", sendPlaceholder: "Ask anything about your sources...", sessionsTitle: "Chat Sessions", chatWith: "Chat with {name}", startConversation: "Start a conversation about this {type}", askQuestions: "Ask questions to understand the content better", pressToSend: "Press {key} to send", model: "Model", createToStart: "Create a session to start.", chatWithNotebook: "Chat with Notebook", unableToLoadChat: "Unable to load chat", noDescription: "No description", startByCreating: "Start by creating your first notebook to organize your research.", messagesCount: "{count} messages", sessionCreated: "Chat session created", sessionUpdated: "Session updated", sessionDeleted: "Session deleted", }, searchPage: { askAndSearch: "Ask and Search", chooseAMode: "Choose a mode", askBeta: "Ask (beta)", search: "Search", askYourKb: "Ask Your Knowledge Base (beta)", askYourKbDesc: "The LLM will answer your query based on the documents in your knowledge base.", question: "Question", enterQuestionPlaceholder: "Enter your question...", pressToSubmit: "Press Cmd/Ctrl+Enter to submit", noEmbeddingModel: "You can't use this feature because you have no embedding model selected. Please set one up in the Models page.", usingCustomModels: "Using Custom Models", usingDefaultModels: "Using Default Models", advanced: "Advanced", strategy: "Strategy", answer: "Answer", final: "Final", ask: "Ask", processing: "Processing...", saveToNotebooks: "Save to Notebooks", searchDesc: "Search your knowledge base for specific keywords or concepts", enterSearchPlaceholder: "Enter search query...", pressToSearch: "Press Enter to search", searchType: "Search Type", vectorSearchWarning: "Vector search requires an embedding model. Only text search is available.", textSearch: "Text Search", vectorSearch: "Vector Search", searchIn: "Search In", searchSources: "Search Sources", searchNotes: "Search Notes", resultsFound: "{count} results found", matches: "Matches ({count})", noResultsFor: "No results found for “{query}”", notSet: "Not set", saveToNotebook: "Save to Notebook", saveSuccess: "Successfully saved to notebook", saveError: "Failed to save to notebook", selectNotebook: "Select Notebook", searchAndAsk: "Search & Ask", searchResultsFor: "Search results for “{query}”", askAbout: "Ask about “{query}”", orSearchKb: "Or search your knowledge base", saving: "Saving...", advancedModelTitle: "Advanced Model Selection", advancedModelDesc: "Choose specific models for each stage of the Ask process", strategyModel: "Strategy Model", answerModel: "Answer Model", finalAnswerModel: "Final Answer Model", selectStrategyPlaceholder: "Select strategy model", selectAnswerPlaceholder: "Select answer model", selectFinalPlaceholder: "Select final answer model", saveChanges: "Save Changes", processingQuestion: "Processing your question...", }, podcasts: { generateEpisode: "Generate Podcast Episode", generateEpisodeDesc: "Select the content to include and configure the episode details before generating a new podcast episode.", content: "Content", contentDesc: "Pick notebooks, sources, and notes to include in this episode.", itemsSelected: "{count} items selected", tokens: "{count} tokens", chars: "{count} chars", loadingNotebooks: "Loading notebooks...", noNotebooksFoundInPodcasts: "No notebooks found. Create a notebook and add content before generating a podcast.", noContentSelected: "No content selected", summary: "Summary", fullContent: "Full content", untitledSource: "Untitled source", untitledNote: "Untitled note", episodeSettings: "Episode Settings", episodeProfile: "Episode profile", episodeProfilePlaceholder: "Select an episode profile", episodeName: "Episode name", episodeNamePlaceholder: "e.g., AI and the Future of Work", additionalInstructions: "Additional instructions", instructionsPlaceholder: "Any supplementary advice to append to the episode briefing...", generating: "Generating...", generate: "Generate", hostPlaceholder: "Host {number}", profileRequired: "Episode Profile Required", profileRequiredDesc: "Select an episode profile before generating a podcast.", nameRequired: "Episode name required", nameRequiredDesc: "Provide a name for the episode.", addContext: "Add context", addContextDesc: "Select at least one source or note to include in the episode.", generationFailed: "Podcast generation failed", speakerProfile: "Speaker Profile", usesSpeakerProfile: "Uses speaker profile", sources: "Sources", notes: "Notes", noSources: "No sources available in this notebook.", noNotes: "No notes available in this notebook.", selectMode: "Select mode", buildContextFailed: "Failed to build context. Please review your selections.", podcastTaskStarted: "Podcast task started", loadingProfiles: "Loading episode profiles...", noProfilesFound: "No episode profiles found. Create an episode profile before generating a podcast.", listTitle: "Podcasts", listDesc: "Keep track of generated episodes and manage reusable templates.", chooseAView: "Choose a view", episodesTab: "Episodes", templatesTab: "Templates", overviewTitle: "Episodes overview", overviewDesc: "Monitor podcast generation jobs and review the final artefacts.", generateBtn: "Generate Podcast", total: "Total", processingLabel: "Processing", completedLabel: "Completed", failedLabel: "Failed", pendingLabel: "Pending", loadErrorTitle: "Failed to load episodes", loadErrorDesc: "We could not fetch the latest podcast episodes. Try again shortly.", loadingEpisodes: "Loading episodes…", noEpisodesYet: "No podcast episodes yet. Generate your first one from the notebook or source chat interfaces.", statusRunningTitle: "Currently Processing", statusRunningDesc: "Episodes that are actively generating assets.", statusPendingTitle: "Queued / Pending", statusPendingDesc: "Submitted episodes waiting to start processing.", statusCompletedTitle: "Completed Episodes", statusCompletedDesc: "Ready to review, download, or publish.", statusFailedTitle: "Failed Episodes", statusFailedDesc: "Episodes that encountered issues during generation.", templatesWorkspaceTitle: "Templates workspace", templatesWorkspaceDesc: "Build reusable episode and speaker configurations for fast podcast production.", howTemplatesPowerTitle: "How templates power podcast generation", howTemplatesPowerDesc: "Templates split the podcast workflow into two reusable building blocks. Mix and match them whenever you generate a new episode.", episodeProfilesSetFormat: "Episode profiles set the format", episodeProfilesList1: "Outline the number of segments and how the story flows", episodeProfilesList2: "Pick the language models used for briefing, outlining, and script writing", episodeProfilesList3: "Store default briefings so every episode starts with a consistent tone", speakerProfilesBringVoices: "Speaker profiles bring voices to life", speakerProfilesList1: "Choose the text-to-speech provider and model", speakerProfilesList2: "Capture personality, backstory, and pronunciation notes per speaker", speakerProfilesList3: "Reuse the same host or guest voices across different episode formats", recommendedWorkflow: "Recommended workflow", workflowStep1: "Create speaker profiles for each voice you need", workflowStep2: "Build episode profiles that reference those speakers by name", workflowStep3: "Generate podcasts by selecting the episode profile that fits the story", workflowHint: "Episode profiles reference speaker profiles by name, so starting with speakers avoids missing voice assignments later.", failedToLoadTemplates: "Failed to load templates data", failedToLoadTemplatesDesc: "Ensure the API is running and try again. Some sections may be incomplete.", loadingTemplates: "Loading templates…", speakerProfilesTitle: "Speaker profiles", speakerProfilesDesc: "Configure voices and personalities for generated episodes.", createSpeaker: "Create speaker", noSpeakerProfiles: "No speaker profiles yet. Create one to make episode templates available.", noDescription: "No description provided.", usedByCount_one: "Used by 1 episode", usedByCount_other: "Used by {count} episodes", usedByCount: "Used by {count} episodes", unused: "Unused", voiceId: "Voice ID", backstory: "Backstory", personality: "Personality", edit: "Edit", duplicate: "Duplicate", deleteSpeakerProfileTitle: "Delete speaker profile?", deleteSpeakerProfileDesc: "Deleting “{name}” cannot be undone.", deleteSpeakerDisabledHint: "Remove this speaker from episode profiles before deleting it.", deleting: "Deleting…", episodeProfilesTitle: "Episode profiles", episodeProfilesDesc: "Define reusable generation settings for your shows.", createProfile: "Create profile", createSpeakerFirst: "Create a speaker profile before adding an episode profile.", noEpisodeProfiles: "No episode profiles yet. Create one to kickstart podcast generation.", speakerCreated: "Speaker Created", speakerCreatedDesc: "The speaker \"{name}\" has been successfully added.", failedToCreateSpeaker: "Failed to create speaker profile", speakerUpdated: "Speaker Updated", speakerUpdatedDesc: "The speaker \"{name}\" has been successfully updated.", failedToUpdateSpeaker: "Failed to update speaker profile", speakerDeleted: "Speaker Deleted", speakerDeletedDesc: "The speaker \"{name}\" has been successfully removed.", failedToDeleteSpeaker: "Failed to delete speaker profile", speakerDuplicated: "Speaker Duplicated", speakerDuplicatedDesc: "The speaker \"{name}\" has been successfully duplicated.", failedToDuplicateSpeaker: "Failed to duplicate speaker profile", generationStarted: "Generation Started", generationStartedDesc: "Podcast generation has been queued.", failedToStartGeneration: "Failed to start generation", tryAgainMoment: "Please try again in a moment.", deleteProfileTitle: "Delete profile?", deleteProfileDesc: "This will remove “{name}”. Existing episodes keep their data, but new ones will no longer use this configuration.", profileCreated: "Profile Created", profileCreatedDesc: "The episode profile \"{name}\" has been successfully created.", failedToCreateProfile: "Failed to create profile", profileUpdated: "Profile Updated", profileUpdatedDesc: "The episode profile \"{name}\" has been successfully updated.", failedToUpdateProfile: "Failed to update profile", profileDeleted: "Profile Deleted", profileDeletedDesc: "The episode profile \"{name}\" has been successfully removed.", failedToDeleteProfile: "Failed to delete profile", failedToDeleteProfileDesc: "Failed to remove the episode profile.", profileDuplicated: "Profile Duplicated", profileDuplicatedDesc: "The episode profile \"{name}\" has been successfully duplicated.", failedToDuplicateProfile: "Failed to duplicate profile", episodeDeleted: "Episode Deleted", episodeDeletedDesc: "The episode has been successfully deleted.", failedToDeleteEpisode: "Failed to delete episode", failedToDeleteSpeakerDesc: "Failed to remove the speaker profile.", outlineModel: "Outline model", transcriptModel: "Transcript model", segments: "Segments", defaultBriefingTitle: "Default briefing", created: "Created at {time}", details: "Details", summaryTab: "Summary", outlineTab: "Outline", transcriptTab: "Transcript", briefing: "Briefing", noOutline: "No outline available.", noTranscript: "No transcript available.", deleteEpisodeTitle: "Delete episode?", deleteEpisodeDesc: "This will remove “{name}” and its audio file permanently.", audioUnavailable: "Audio unavailable", segment: "Segment", speaker: "Speaker", profile: "Profile", link: "Link", file: "File", embedded: "Embedded", notEmbedded: "Not embedded", noSpeakerProfilesAvailable: "No speaker profiles available", noLanguageModelsAvailable: "No language models available", editEpisodeProfile: "Edit Episode Profile", createEpisodeProfile: "Create Episode Profile", episodeProfileFormDesc: "Define how episodes should be generated and which speaker configuration they use by default.", noSpeakerProfilesDesc: "Create a speaker profile before configuring an episode profile.", noLanguageModelsDesc: "Add language models in the Models section to configure outline and transcript generation.", profileName: "Profile name", profileNamePlaceholder: "e.g., Tech discussion", descriptionPlaceholder: "Short summary of when to use this profile", speakerConfig: "Speaker configuration", selectSpeakerProfile: "Select a speaker profile", outlineGeneration: "Outline generation", transcriptGeneration: "Transcript generation", defaultBriefingPlaceholder: "Outline the structure, tone, and goals for this episode format", editSpeakerProfile: "Edit Speaker Profile", createSpeakerProfile: "Create Speaker Profile", speakerProfileFormDesc: "Configure text-to-speech settings and define up to four speakers.", noTtsModelsAvailable: "No text-to-speech models available", noTtsModelsDesc: "Add TTS models in the Models section before creating a speaker profile.", speakers: "Speakers", speakersDesc: "Configure between one and four voices for this profile.", addSpeaker: "Add speaker", speakerNumber: "Speaker {number}", backstoryPlaceholder: "Short biography or context for the speaker", personalityPlaceholder: "Describe style and tone", outlineProviderRequired: "Outline provider is required", outlineModelRequired: "Outline model is required", transcriptProviderRequired: "Transcript provider is required", transcriptModelRequired: "Transcript model is required", defaultBriefingRequired: "Default briefing is required", segmentsInteger: "Must be an integer", segmentsMin: "At least 3 segments", segmentsMax: "Maximum 20 segments", voiceIdRequired: "Voice ID is required", backstoryRequired: "Backstory is required", personalityRequired: "Personality is required", speakerCountMin: "At least one speaker is required", speakerCountMax: "You can configure up to 4 speakers", delete: "Delete", failedToDelete: "Failed to delete podcast", }, settings: { contentProcessing: "Content Processing", contentProcessingDesc: "Configure how documents and URLs are processed", docEngine: "Document Processing Engine", docEnginePlaceholder: "Select document processing engine", urlEngine: "URL Processing Engine", urlEnginePlaceholder: "Select URL processing engine", autoRecommended: "Auto (Recommended)", simple: "Simple", docling: "Docling", helpMeChoose: "Help me choose", docHelp: "· Docling is a little slower but more accurate, specially if the documents contain tables and images. · Simple will extract any content from the document without formatting it. · Auto (recommended) will try to process through docling and default to simple.", firecrawl: "Firecrawl", jina: "Jina", urlHelp: "· Firecrawl is a paid service (with a free tier), and very powerful. · Jina is a good option as well and also has a free tier. · Simple will use basic HTTP extraction and will miss content on javascript-based websites. · Auto (recommended) will try to use firecrawl then Jina, finally fallback to simple.", embeddingAndSearch: "Embedding and Search", embeddingAndSearchDesc: "Configure search and embedding options", defaultEmbeddingOption: "Default Embedding Option", embeddingOptionPlaceholder: "Select embedding option", ask: "Ask", always: "Always", never: "Never", embeddingHelp: "Embedding the content will make it easier to find by you and by your AI agents. If you are running a local embedding model (Ollama, for example), you shouldn't worry about cost and just embed everything.", fileManagement: "File Management", fileManagementDesc: "Configure file handling and storage options", autoDeleteFiles: "Auto Delete Files", autoDeletePlaceholder: "Select auto delete option", filesHelp: "Once your files are uploaded and processed, they are not required anymore. Most users should allow Open Notebook to delete uploaded files from the upload folder automatically.", loadFailed: "Failed to load settings", }, advanced: { title: "AdvancedTools", desc: "Advanced tools and utilities for power users", systemInfo: "System Info", rebuildEmbeddings: "Rebuild Embeddings", rebuildEmbeddingsDesc: "Rebuild vector search index for all sources", currentVersion: "Current Version", latestVersion: "Latest Version", status: "Status", updateAvailable: "Version {version} Available", updateAvailableDesc: "A new version of Open Notebook is available.", upToDate: "Up to Date", unknown: "Unknown", viewOnGithub: "View on GitHub", updateCheckFailed: "Unable to check for updates. GitHub may be unreachable.", rebuild: { mode: "Rebuild Mode", existing: "Existing", all: "All", existingDesc: "Re-embed only items that already have embeddings (faster, for model switching)", allDesc: "Re-embed existing items + create embeddings for items without any (slower, comprehensive)", include: "Include in Rebuild", selectOneError: "Please select at least one item type to rebuild", starting: "Starting Rebuild...", startBtn: "🚀 Start Rebuild", queued: "Queued", running: "Submitting jobs...", completed: "Jobs Submitted!", failed: "Failed", leavePageHint: "You can leave this page as this will run in the background", startNew: "Start New Rebuild", itemsProcessed: "{processed}/{total} jobs submitted ({percent}%)", failedItems: "{count} jobs failed to submit", time: "Time", whenToRebuild: "When should I rebuild embeddings?", whenToRebuildAns: "You should rebuild when switching models, upgrading versions, fixing corruption, or after bulk imports.", howLong: "How long does rebuilding take?", howLongAns: "Processing time depends on item count, model speed, and API rate limits. Local models are usually very fast.", isSafe: "Is it safe to rebuild while using the app?", isSafeAns: "Yes, rebuilding is safe! It doesn't delete content, only replaces embeddings, and handles errors gracefully.", }, }, transformations: { title: "Transformations", desc: "Transformations are prompts that will be used by the LLM to process a source and extract insights, summaries, etc.", workspace: "Choose a workspace", playground: "Playground", defaultPrompt: "Default Transformation Prompt", defaultPromptDesc: "This will be added to all your transformation prompts", defaultPromptPlaceholder: "Enter your default transformation instructions...", listTitle: "Custom Transformations", createNew: "Create New", inputLabel: "Input Text", inputPlaceholder: "Enter some text to transform...", outputLabel: "Output", runTest: "Run Transformation", running: "Running...", selectToStart: "Select a transformation to start", name: "Name", namePlaceholder: "Unique identifier, e.g. key_topics", titlePlaceholder: "Displayed title, defaults to name", promptPlaceholder: "Write the prompt that will power this transformation...", descriptionPlaceholder: "Describe what this transformation does.", suggestDefault: "Suggest by default on new sources", promptHint: "Prompts should be written with the source content in mind. You can ask the model to summarise, extract insights, or produce structured outputs such as tables.", createSuccess: "Transformation created successfully", updateSuccess: "Transformation updated successfully", deleteSuccess: "Transformation deleted successfully", noTransformations: "No transformations yet", createOne: "Create a transformation to get started", selectModel: "Select a model", deleteConfirm: "Are you sure you want to delete this transformation?", model: "Model", systemPrompt: "System Prompt", overrideModelDesc: "Override the default model for this chat session. Leave empty to use the system default.", sessionUseReplacement: "This session will use {name} instead of the default model.", systemDefault: "System Default", }, models: { embedding: "Embedding Models", tts: "Text to Speech (TTS)", stt: "Speech to Text (STT)", provider: "Provider", apiKey: "API Key", deleteSuccess: "Model deleted successfully", saveSuccess: "Model saved successfully", noModels: "No models", discoverModels: "Discover Models", noModelsFound: "No models found from this provider", modelType: "Model Type", modelTypeHint: "Select the type for the models you want to add. If you need different types, add them in separate batches.", deleteModel: "Delete Model", defaultAssignments: "Default Model Assignments", defaultAssignmentsDesc: "Configure which models to use for different purposes across Open Notebook", missingRequiredModels: "Missing required models: {models}. Open Notebook may not function properly without these.", selectModelPlaceholder: "Select a model", requiredModelPlaceholder: "⚠️ Required - Select a model", chatModelLabel: "Chat Model", chatModelDesc: "Used for chat conversations", transformationModelLabel: "Transformation Model", transformationModelDesc: "Used for summaries, insights, and transformations", toolsModelLabel: "Tools Model", toolsModelDesc: "Used for function calling - OpenAI or Anthropic recommended", largeContextModelLabel: "Large Context Model", largeContextModelDesc: "Used for processing large documents - Gemini recommended", embeddingModelLabel: "Embedding Model", embeddingModelDesc: "Used for semantic search and vector embeddings", ttsModelLabel: "Text-to-Speech Model", ttsModelDesc: "Used for podcast generation", sttModelLabel: "Speech-to-Text Model", sttModelDesc: "Used for audio transcription", selectProviderPlaceholder: "Select a provider", providerRequired: "Provider is required", modelRequired: "Model is required", embeddingChangeTitle: "Embedding Model Change", embeddingChangeConfirm: "You are about to change your embedding model from {from} to {to}.", rebuildRequired: "Important: Rebuild Required", rebuildReason: "Changing your embedding model requires rebuilding all existing embeddings to maintain consistency. Without rebuilding, your searches may return incorrect or incomplete results.", whatHappensNext: "What happens next:", step1: "Your default embedding model will be updated", step2: "Existing embeddings will remain unchanged until rebuild", step3: "New content will use the new embedding model", step4: "You should rebuild embeddings as soon as possible", proceedToRebuildPrompt: "Would you like to proceed to the Advanced page to start the rebuild now?", changeModelOnly: "Change Model Only", changeAndRebuild: "Change & Go to Rebuild", autoAssign: "Auto-assign Defaults", autoAssigning: "Assigning...", autoAssignSuccess: "{count} default models automatically assigned", autoAssignNoModels: "No models available to assign. Please sync models first.", autoAssignAlreadySet: "All default models are already configured", testModel: "Test Model", testModelSuccess: "Model Test Passed", testModelFailed: "Model Test Failed", searchOrAddModel: "Search or type a model name...", addCustomModel: "Add \"{name}\"", }, apiKeys: { title: "Configure your AI with your own API keys", description: "Store API keys securely in the database to enable AI providers in Open Notebook.", encryptionRequired: "Encryption key not configured", encryptionRequiredDescription: "Set the OPEN_NOTEBOOK_ENCRYPTION_KEY environment variable to any secret string to enable storing API keys in the database.", configured: "Configured", notConfigured: "Not configured", migrationAvailable: "Environment Variables Detected", migrationDescription: "{count} API key(s) are configured via environment variables and can be migrated to the database for easier management.", migrateToDatabase: "Migrate to Database", migrating: "Migrating...", migrationSuccess: "{count} API key(s) migrated successfully", migrationErrors: "{count} key(s) failed to migrate", migrationNothingToMigrate: "All keys are already in the database", learnMore: "Learn how to configure API keys →", testConnection: "Test Connection", testSuccess: "Connection successful", testFailed: "Connection test failed", syncModels: "Sync Models", syncSuccess: "Discovered {discovered} models, added {new} new", syncNoNew: "Discovered {count} models, all already registered", syncFailed: "Failed to sync models", getApiKey: "Get API Key", vertexProject: "GCP Project ID", vertexLocation: "Region", vertexCredentials: "Service Account JSON Path", addConfig: "Add Configuration", editConfig: "Edit Configuration", deleteConfig: "Delete Configuration", configName: "Configuration Name", configNameHint: "A descriptive name for this configuration (e.g., 'Production', 'Development')", baseUrl: "Base URL", baseUrlOverrideHint: "Only change this if you need to override the provider's default API endpoint.", deleteConfigConfirm: "Are you sure you want to delete '{name}'? This cannot be undone.", configSaveSuccess: "Configuration saved successfully", configUpdateSuccess: "Configuration updated successfully", configDeleteSuccess: "Configuration deleted successfully", apiKeyEditHint: "Leave blank to keep the existing API key", }, setupBanner: { encryptionRequired: "Encryption key not configured", encryptionRequiredDescription: "Set the OPEN_NOTEBOOK_ENCRYPTION_KEY environment variable to enable secure credential storage.", migrationAvailable: "API key migration available", migrationDescription: "{count} provider(s) have API keys set via environment variables. Migrate them to the database for easier management.", goToSettings: "Go to Settings", viewDocs: "View docs", }, }