- Add fr-FR locale with French translations (875 keys) - Register fr-FR in locale index, LanguageToggle, and date-locale - Add common.french key to all existing locale files - Sync fr-FR key structure to match current en-US after cleanup Based on #514, rebased and adapted to the current locale structure. Closes #481 Co-authored-by: saikrishna-prathapaneni <saiprathapaneni23@gmail.com>
917 lines
44 KiB
TypeScript
917 lines
44 KiB
TypeScript
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",
|
|
},
|
|
}
|