feat: i18n support with first translations

This commit is contained in:
2026-02-21 10:45:41 +01:00
parent a5281a7750
commit b8005bec30
48 changed files with 2792 additions and 462 deletions

View File

@@ -0,0 +1,320 @@
{
"common.save": "Save",
"common.cancel": "Cancel",
"common.clear": "Clear",
"common.settings": "Settings",
"common.tasks": "Tasks",
"common.running": "running",
"common.pending": "pending",
"activity.posts": "Posts",
"activity.pages": "Pages",
"activity.media": "Media",
"activity.tags": "Tags",
"activity.aiAssistant": "AI Assistant",
"activity.import": "Import",
"activity.sourceControl": "Source Control",
"activity.toggleHint": "(click again to toggle sidebar)",
"tasks.backgroundTasks": "Background Tasks",
"tasks.clearCompleted": "Clear completed",
"tasks.recent": "Recent",
"tasks.noActive": "No active tasks",
"tasks.cancelTask": "Cancel task",
"tasks.triggerTitle": "{running} running, {pending} pending",
"app.taskCompleted": "Task completed: {message}",
"app.taskFailed": "Task failed: {message}",
"app.databaseRebuildFailed": "Database rebuild failed",
"app.textReindexFailed": "Text reindex failed",
"app.sitemapGenerationFailed": "Sitemap generation failed",
"app.previewOpenFailed": "Failed to open selected post preview",
"app.metadataDiff": "Metadata Diff",
"app.importComplete": "Import complete: {posts} posts, {media} media files",
"settings.language.english": "English",
"settings.language.german": "German",
"settings.language.french": "French",
"settings.language.italian": "Italian",
"settings.language.spanish": "Spanish",
"settings.language.portuguese": "Portuguese (Português)",
"settings.language.dutch": "Dutch (Nederlands)",
"settings.language.polish": "Polish (Polski)",
"settings.language.russian": "Russian (Русский)",
"settings.language.japanese": "Japanese (日本語)",
"settings.language.chinese": "Chinese (中文)",
"settings.language.korean": "Korean (한국어)",
"settings.language.arabic": "Arabic (العربية)",
"settings.language.hindi": "Hindi (हिन्दी)",
"settings.language.turkish": "Turkish (Türkçe)",
"settings.language.swedish": "Swedish (Svenska)",
"settings.language.danish": "Danish (Dansk)",
"settings.language.norwegian": "Norwegian (Norsk)",
"settings.language.finnish": "Finnish (Suomi)",
"settings.language.czech": "Czech (Čeština)",
"settings.project.title": "Project",
"settings.project.browse": "Browse",
"settings.project.reset": "Reset",
"settings.project.resetDefault": "Reset to default",
"settings.project.selectDataFolder": "Select Project Data Folder",
"settings.editor.title": "Editor",
"settings.editor.mode.wysiwyg": "WYSIWYG (Visual Editor)",
"settings.editor.mode.markdown": "Markdown (Source)",
"settings.editor.mode.preview": "Preview (Read-only)",
"settings.editor.diff.inline": "Inline",
"settings.editor.diff.sideBySide": "Side by Side",
"settings.content.title": "Post Categories",
"settings.content.renderInLists": "Render in lists",
"settings.content.showTitles": "Show titles",
"settings.ai.title": "AI Assistant",
"settings.ai.noModels": "No models available",
"settings.publishing.ftpTitle": "FTP Publishing",
"settings.publishing.sshTitle": "SSH Publishing",
"settings.data.title": "Database Maintenance",
"settings.data.fileSystemTitle": "File System",
"settings.search.placeholder": "Search settings...",
"settings.search.noResults": "No settings found matching \"{query}\"",
"settings.search.clear": "Clear search",
"settings.toast.publishingSaved": "Publishing credentials saved",
"settings.toast.saveCredentialsFailed": "Failed to save credentials",
"settings.toast.credentialsCleared": "{type} credentials cleared",
"settings.toast.projectSaved": "Project settings saved",
"settings.toast.projectSaveFailed": "Failed to save project settings",
"settings.toast.categoryAdded": "Category \"{category}\" added",
"settings.toast.categoryAddFailed": "Failed to add category",
"settings.toast.categoryExists": "Category already exists",
"settings.toast.categoryProtected": "Cannot delete standard category \"{category}\"",
"settings.toast.categoryAtLeastOne": "Must have at least one category",
"settings.toast.categoryRemoved": "Category \"{category}\" removed",
"settings.toast.categoryRemoveFailed": "Failed to remove category",
"settings.toast.categoriesReset": "Categories reset to defaults",
"settings.toast.categoriesResetFailed": "Failed to reset categories",
"settings.toast.categorySettingsUpdateFailed": "Failed to update category settings",
"settings.toast.systemPromptSaved": "System prompt saved",
"settings.toast.systemPromptSaveFailed": "Failed to save system prompt",
"settings.toast.systemPromptReset": "System prompt reset to default",
"settings.toast.systemPromptResetFailed": "Failed to reset system prompt",
"settings.toast.apiKeySaved": "API key saved and validated",
"settings.toast.apiKeyInvalid": "Invalid API key",
"settings.toast.apiKeySaveFailed": "Failed to save API key",
"settings.toast.defaultModelUpdated": "Default model updated",
"settings.toast.defaultModelUpdateFailed": "Failed to set default model",
"settings.toast.rebuildPostsLoading": "Rebuilding posts database...",
"settings.toast.rebuildPostsSuccess": "Posts database rebuilt",
"settings.toast.rebuildPostsFailed": "Failed to rebuild posts database",
"settings.toast.rebuildMediaLoading": "Rebuilding media database...",
"settings.toast.rebuildMediaSuccess": "Media database rebuilt",
"settings.toast.rebuildMediaFailed": "Failed to rebuild media database",
"settings.toast.rebuildLinksLoading": "Rebuilding post links...",
"settings.toast.rebuildLinksSuccess": "Post links rebuilt",
"settings.toast.rebuildLinksFailed": "Failed to rebuild post links",
"settings.toast.thumbnailsLoading": "Generating thumbnails...",
"settings.toast.thumbnailsGenerated": "Generated {count} thumbnails",
"settings.toast.thumbnailsAlreadyExist": "All thumbnails already exist",
"settings.toast.thumbnailsComplete": "Thumbnail generation complete",
"settings.toast.thumbnailsFailed": "Failed to generate thumbnails",
"chat.setupTitle": "AI Chat Setup",
"chat.apiKeyRequiredTitle": "OpenCode Zen API Key Required",
"chat.apiKeyRequiredDescription": "Enter your OpenCode API key to enable AI chat.",
"chat.apiKeyPlaceholder": "Enter your API key...",
"chat.apiKeySave": "Save Key",
"chat.apiKeyValidating": "Validating...",
"chat.apiKeyInvalid": "Invalid API key. Please check and try again.",
"chat.apiKeyValidationFailed": "Failed to validate API key.",
"chat.newChat": "New Chat",
"chat.welcomeTitle": "Welcome to the AI Assistant",
"chat.welcomeDescription": "I can help you manage your posts and media. Try asking me to:",
"chat.welcomeTipSearch": "Search for posts about a specific topic",
"chat.welcomeTipDetails": "Get details about a specific post",
"chat.welcomeTipTags": "List all tags or categories in your blog",
"chat.welcomeTipMetadata": "Update metadata for posts or media",
"chat.welcomeTipImages": "List all images in your media library",
"chat.role.you": "You",
"chat.role.assistant": "Assistant",
"chat.stop": "Stop",
"chat.inputPlaceholder": "Type a message...",
"chat.errorPrefix": "Error: {error}",
"chat.errorNoResponse": "Failed to get a response. Please try again.",
"chat.errorEmptyResponse": "The model returned an empty response. Try a different model or rephrase your question.",
"chat.errorGeneric": "Sorry, an error occurred while processing your message.",
"chat.cancelledSuffix": "(cancelled)",
"aiSuggestions.title": "AI Image Analysis",
"aiSuggestions.close": "Close",
"aiSuggestions.analyzing": "Analyzing image...",
"aiSuggestions.titleField": "Title",
"aiSuggestions.altField": "Alt Text",
"aiSuggestions.captionField": "Caption",
"aiSuggestions.hasExisting": "(has existing value)",
"aiSuggestions.current": "Current",
"aiSuggestions.intro": "Select which AI-generated values to apply. Existing values are preserved by default.",
"aiSuggestions.empty": "No suggestions were generated for this image.",
"aiSuggestions.wait": "Please wait...",
"aiSuggestions.applySelected": "Apply Selected",
"insert.title.link": "Insert Link",
"insert.title.image": "Insert Image",
"insert.tab.linkInternal": "Link to Post",
"insert.tab.imageInternal": "Media Library",
"insert.tab.linkExternal": "External URL",
"insert.tab.imageExternal": "External Image",
"insert.searchPlaceholder.link": "Search posts by title or content...",
"insert.searchPlaceholder.image": "Search media by name, title, or alt text...",
"insert.status.searching": "Searching...",
"insert.status.typeMore": "Type at least 2 characters to search",
"insert.status.noResults": "No {kind} found for \"{query}\"",
"insert.label.url": "URL",
"insert.label.linkTextOptional": "Link Text (optional)",
"insert.label.altText": "Alt Text",
"insert.placeholder.linkUrl": "https://example.com",
"insert.placeholder.imageUrl": "https://example.com/image.jpg",
"insert.placeholder.linkText": "Click here",
"insert.placeholder.imageAlt": "Description of the image",
"insert.submit.link": "Insert Link",
"insert.submit.image": "Insert Image",
"insert.hint.internal": "Use ↑↓ to navigate, Enter to select, Esc to close",
"insert.hint.external": "Enter URL and press Enter or click button, Esc to close",
"insert.hint.canonicalPost": "Canonical: /YYYY/MM/DD/slug",
"insert.hint.canonicalMedia": "Canonical: /media/YYYY/MM/file.ext",
"postLinks.loading": "Loading links...",
"postLinks.link": "link",
"postLinks.links": "links",
"postLinks.linksTo": "Links to ({count})",
"postLinks.linkedBy": "Linked by ({count})",
"postLinks.openTitle": "Open: {title}",
"docs.title": "Documentation",
"docs.subtitle": "User guide for this installed bDS version.",
"gitDiff.header": "Diff: {target}",
"gitDiff.noProject": "No active project selected.",
"gitDiff.noProjectPath": "Unable to resolve project path.",
"gitDiff.loadFailed": "Failed to load diff.",
"gitDiff.loading": "Loading diff...",
"gitDiff.changedFiles": "Changed files",
"gitDiff.previousFile": "Previous file",
"gitDiff.nextFile": "Next file",
"errorModal.error": "Error",
"errorModal.stackTrace": "Stack Trace",
"errorModal.copyClipboard": "Copy to clipboard",
"errorModal.copy": "Copy",
"errorModal.noStack": "No stack trace available",
"confirmDelete.title": "Confirm Deletion",
"confirmDelete.promptPost": "Are you sure you want to delete the post",
"confirmDelete.promptMedia": "Are you sure you want to delete the media file",
"confirmDelete.warning": "Warning:",
"confirmDelete.referencedBy": "This {itemType} is referenced by the following items:",
"confirmDelete.note": "Deleting this {itemType} will remove all these references.",
"confirmDelete.cancel": "Cancel",
"confirmDelete.deletePost": "Delete Post",
"confirmDelete.deleteMedia": "Delete Media",
"confirmDelete.itemType.post": "post",
"confirmDelete.itemType.media": "media",
"lightbox.close": "Close (Esc)",
"lightbox.previous": "Previous (←)",
"lightbox.next": "Next (→)",
"credentials.error.load": "Failed to load credentials:",
"credentials.error.save": "Failed to save credentials:",
"credentials.toast.saved": "Credentials saved",
"credentials.toast.saveFailed": "Failed to save credentials",
"credentials.toast.testing": "Testing {type} connection...",
"credentials.toast.connectionFailed": "Connection failed - check credentials",
"credentials.tab.ftp": "FTP",
"credentials.tab.ssh": "SSH",
"credentials.ftp.title": "FTP Publishing",
"credentials.ftp.description": "Configure FTP for publishing your blog to a web server.",
"credentials.ssh.title": "SSH Publishing",
"credentials.ssh.description": "Configure SSH for secure publishing to your server.",
"credentials.field.host": "Host",
"credentials.field.username": "Username",
"credentials.field.password": "Password",
"credentials.field.sshKeyPath": "SSH Key Path",
"credentials.action.testConnection": "Test Connection",
"credentials.ftp.placeholder.host": "ftp.example.com",
"credentials.ftp.placeholder.username": "ftp-user",
"credentials.ftp.placeholder.password": "Password",
"credentials.ssh.placeholder.host": "server.example.com",
"credentials.ssh.placeholder.username": "ssh-user",
"credentials.ssh.placeholder.keyPath": "~/.ssh/id_rsa",
"gitSidebar.header": "SOURCE CONTROL",
"gitSidebar.loading": "Loading...",
"gitSidebar.error.fetchRemoteUpdates": "Failed to fetch remote updates.",
"gitSidebar.error.refreshRemoteState": "Unable to refresh remote tracking state.",
"gitSidebar.error.gitMissing": "Git executable not found. Please install Git and restart the app.",
"gitSidebar.error.noActiveProject": "No active project selected.",
"gitSidebar.error.loadRepoStatus": "Unable to load repository status.",
"gitSidebar.error.initFailed": "Failed to initialize git repository.",
"gitSidebar.error.actionFailed": "Failed to {action}.",
"gitSidebar.error.commitFailed": "Failed to commit changes.",
"gitSidebar.progress.preparingInit": "Preparing repository initialization...",
"gitSidebar.progress.pushingRemote": "Pushing commits to remote... this can take a while for large uploads.",
"gitSidebar.progress.fetching": "Fetching remote updates...",
"gitSidebar.progress.pulling": "Pulling latest changes...",
"gitSidebar.progress.pruningLfs": "Pruning local Git LFS cache...",
"gitSidebar.progress.committing": "Creating commit...",
"gitSidebar.progress.initializingRepo": "Initializing repository...",
"gitSidebar.history.synced": "Synced",
"gitSidebar.history.localOnly": "Local only",
"gitSidebar.history.remoteOnly": "Remote only",
"gitSidebar.init.transcript": "Initialization transcript",
"gitSidebar.aria.repoActions": "Repository actions",
"gitSidebar.aria.openChanges": "Open Changes",
"gitSidebar.aria.commitStatusLegend": "Commit status legend",
"gitSidebar.aria.versionHistory": "Version History",
"gitSidebar.action.fetch": "Fetch",
"gitSidebar.action.fetching": "Fetching...",
"gitSidebar.action.pull": "Pull",
"gitSidebar.action.pulling": "Pulling...",
"gitSidebar.action.push": "Push",
"gitSidebar.action.pushing": "Pushing...",
"gitSidebar.action.pruneLfs": "Prune LFS",
"gitSidebar.action.pruning": "Pruning...",
"gitSidebar.action.commit": "Commit",
"gitSidebar.action.committing": "Committing...",
"gitSidebar.action.initializeGit": "Initialize Git",
"gitSidebar.action.initializing": "Initializing...",
"gitSidebar.openChanges": "Open Changes ({count})",
"gitSidebar.versionHistory": "Version History ({count})",
"gitSidebar.loadingChanges": "Loading changes...",
"gitSidebar.noChanges": "No changes",
"gitSidebar.loadingHistory": "Loading history...",
"gitSidebar.noCommits": "No commits yet",
"gitSidebar.branch": "Branch: {branch}",
"gitSidebar.aheadBehind": "ahead {ahead} / behind {behind}",
"gitSidebar.notRepo": "This project is not a git repository.",
"gitSidebar.placeholder.remoteUrl": "Optional remote repository URL",
"gitSidebar.placeholder.commitMessage": "Commit message",
"editor.untitled": "Untitled",
"tabBar.style": "Style",
"tabBar.loading": "Loading...",
"tabBar.unknown": "Unknown",
"tabBar.preview": "Preview",
"tabBar.modified": "Modified",
"tabBar.closeHint": "Close (Ctrl+W)",
"tabBar.scrollLeft": "Scroll tabs left",
"tabBar.scrollRight": "Scroll tabs right",
"tabBar.commitTitle": "Commit {hash}",
"tabBar.error.fetchPostTitle": "Failed to fetch post title:",
"tabBar.error.fetchChatTitle": "Failed to fetch chat title:",
"tabBar.error.fetchImportTitle": "Failed to fetch import definition title:",
"tabBar.error.fetchCommitTitle": "Failed to fetch commit titles:",
"metadataDiff.title": "Metadata Diff Tool",
"metadataDiff.description": "Compare post metadata between database and markdown files. Fix inconsistencies caused by bugs or manual edits.",
"metadataDiff.error.loadStats": "Failed to load database statistics",
"metadataDiff.error.scan": "Failed to scan for differences",
"metadataDiff.progress.starting": "Starting scan...",
"metadataDiff.progress.scanningPublished": "Scanning published posts...",
"metadataDiff.progress.scanning": "Scanning...",
"metadataDiff.action.scan": "Scan for Differences",
"metadataDiff.action.rescan": "Re-scan",
"metadataDiff.stats.totalPosts": "Total Posts",
"metadataDiff.stats.published": "Published",
"metadataDiff.stats.drafts": "Drafts",
"metadataDiff.stats.mediaFiles": "Media Files",
"metadataDiff.summary.noDiffs": "✅ No differences found! All {total} published posts are in sync.",
"metadataDiff.summary.withDiffs": "⚠️ Found {count} posts with differences out of {total} published posts.",
"metadataDiff.group.differences": "{label} Differences",
"metadataDiff.group.postsCount": "{count} posts",
"metadataDiff.sync.failed": "failed",
"metadataDiff.sync.dbToFile.title": "Update files with database values",
"metadataDiff.sync.dbToFile.success": "Synced {success} posts to files{failed}",
"metadataDiff.sync.dbToFile.error": "Failed to sync to files",
"metadataDiff.sync.fileToDb.title": "Update database with file values",
"metadataDiff.sync.fileToDb.success": "Synced {success} files to database{failed}",
"metadataDiff.sync.fileToDb.error": "Failed to sync to database",
"metadataDiff.value.database": "Database",
"metadataDiff.value.file": "File",
"metadataDiff.empty": "Click \"Scan for Differences\" to compare database metadata with file metadata."
}