feat(i18n): full app + docs localization (de/en)
Build & Push Docker Image / build (push) Successful in 2m33s

- translate remaining pages/components (admin, analytics, redundancy,
  trash, compare, browse, watchlist, admin tools tab, category combobox,
  theme toggle, tool preview card, tool-new/edit) to t() calls
- locales: 453 keys each, parity verified
- docs: bilingual handbook + release notes via *.en.md variants,
  language-aware docs.tsx (markdown paths, nav titles, search index),
  LanguageSwitcher in docs header
- generate-docs: emit per-locale handbook/release/search output,
  localized index.json fields (fileEn/titleEn), en-aware snapshots
This commit is contained in:
opencode
2026-08-04 08:35:05 +02:00
parent a65e2eb92c
commit 3de59ccaaf
77 changed files with 3786 additions and 440 deletions
+283 -7
View File
@@ -53,7 +53,9 @@
"loading": "Loading…",
"all": "All",
"none": "None",
"language": "Language"
"language": "Language",
"viewDetails": "View details",
"guideTooltip": "Guide in the documentation"
},
"home": {
"welcome": "Welcome to toolr",
@@ -80,6 +82,8 @@
"category": "Category",
"rating": "Rating",
"reviews": "Reviews",
"reviewCount_one": "{{count}} review",
"reviewCount_other": "{{count}} reviews",
"noToolsFound": "No tools found",
"noToolsMatch": "We couldn't find any tools matching your current filters. Try adjusting your search criteria or add a new tool.",
"addTool": "Add Tool",
@@ -103,7 +107,9 @@
"features": "Features",
"minRating": "Min. rating",
"any": "Any",
"clearFilters": "Clear filters"
"clearFilters": "Clear filters",
"removeFeature": "Remove feature: {{feature}}",
"removeMinRating": "Remove min rating"
},
"detail": {
"ratingBreakdown": "Rating Breakdown",
@@ -133,7 +139,65 @@
"deleteToTrash": "This will move {{name}} to the trash. It can be restored later.",
"deletePermanent": "This will permanently remove {{name}} and all its ratings. This cannot be undone.",
"deleting": "Deleting…",
"deleteAction": "Delete"
"deleteAction": "Delete",
"invalidToolId": "Invalid Tool ID",
"backToBrowse": "Back to browse",
"keyFeatures": "Key Features",
"toolNotFound": "Tool not found.",
"similarTools": "Similar Tools",
"noSimilarTools": "No similar tools found.",
"linkTool": "Link Tool",
"linkSimilarTool": "Link Similar Tool",
"linkSimilarToolSub": "Manually link this tool to another tool.",
"toolId": "Tool ID",
"toolIdPlaceholder": "Enter target tool ID",
"relationType": "Relation Type",
"relationSimilar": "Similar",
"relationReplaces": "Replaces",
"relationSupersededBy": "Superseded By",
"notesOptional": "Notes (Optional)",
"notesPlaceholder": "Why are these tools related?",
"createLink": "Create Link",
"noCostInfo": "No cost information added yet.",
"costDialogSub": "Manage license cost information for this tool.",
"licenseType": "License Type",
"licenseFree": "Free",
"licenseSubscription": "Subscription",
"licenseOneTime": "One-Time",
"licenseUsageBased": "Usage-Based",
"billingPeriod": "Billing Period",
"billingMonthly": "Monthly",
"billingQuarterly": "Quarterly",
"billingYearly": "Yearly",
"costLabel": "Cost",
"currency": "Currency",
"costNotes": "Notes",
"costNotesPlaceholder": "Billing details, contract info...",
"commentOptional": "Comment (Optional)",
"commentLabel": "Comment",
"commentPlaceholder": "What do you think about this tool?",
"nameOptional": "Name (Optional)",
"nameLabel": "Name",
"anonymousPlaceholder": "Anonymous",
"anonymousEngineer": "Anonymous Engineer",
"beFirstToReview": "Be the first to share your thoughts on this tool.",
"shareExperience": "Share your experience with {{name}}",
"score": "Score",
"toastRelationCreated": "Relation created",
"toastRelationFailed": "Failed to create relation",
"toastRelationDeleted": "Relation deleted",
"toastRelationDeleteFailed": "Failed to delete relation",
"toastCostUpdated": "Cost updated",
"toastCostAdded": "Cost added",
"toastCostFailed": "Failed to save cost",
"toastCostDeleted": "Cost deleted",
"toastCostDeleteFailed": "Failed to delete cost",
"toastRatingSubmitted": "Rating submitted",
"toastRatingThanks": "Thank you for your feedback!",
"toastRatingFailed": "Failed to submit rating",
"toastToolDeleted": "Tool deleted",
"toastDeleteFailed": "Failed to delete",
"unexpectedError": "An unexpected error occurred."
},
"compare": {
"title": "Compare Tools",
@@ -176,7 +240,29 @@
"deletePermanently": "Delete permanently",
"emptyTrash": "Empty trash",
"deletedAt": "Deleted at",
"deletedBy": "Deleted by"
"deletedBy": "Deleted by",
"name": "Name",
"category": "Category",
"actions": "Actions",
"selectAll": "Select all",
"selectName": "Select {{name}}",
"restoreAction": "Restore",
"deleteAction": "Delete",
"deleteConfirmTitle": "Delete {{count}} tool(s) permanently?",
"deleteConfirmSub": "This permanently removes the selected tools along with all their ratings, costs and relations. This cannot be undone.",
"emptyConfirmTitle": "Empty the trash?",
"emptyConfirmSub": "This permanently removes all {{count}} tool(s) in the trash along with their ratings, costs and relations. This cannot be undone.",
"toastRestored": "Tools restored",
"toastRestoredSub": "{{count}} tool(s) restored.",
"toastRestoreFailed": "Failed to restore",
"toastDeleted": "Tools deleted",
"toastDeletedSub": "{{count}} tool(s) permanently removed.",
"toastDeleteFailed": "Failed to delete",
"toastEmptied": "Trash emptied",
"toastEmptiedSub": "{{count}} tool(s) permanently removed.",
"toastEmptyFailed": "Failed to empty trash",
"searchPlaceholder": "Search tools…",
"toolCount": "{{count}} tool(s)"
},
"notFound": {
"text": "This page doesn't exist.",
@@ -191,7 +277,7 @@
"latest": "Latest",
"repo": "Repository",
"nav": "Documentation",
"guides": "Guide",
"guides": "Guides",
"endpoints": "Endpoints",
"schemas": "Data models",
"releases": "Release notes",
@@ -209,7 +295,10 @@
"parameter": "Parameter",
"noResults": "No results",
"fields": "Fields",
"fieldHelpHint": "Note: form fields link via the ? icon directly to the respective rows of this table."
"fieldHelpHint": "Note: form fields link via the ? icon directly to the respective rows of this table.",
"name": "Name",
"in": "In",
"requestBody": "Request Body"
},
"command": {
"navigate": "Navigate",
@@ -217,5 +306,192 @@
"tools": "Tools",
"noResults": "No tools found for \"{{query}}\".",
"startTyping": "Start typing to search tools."
},
"admin": {
"accessRequired": "Admin Access Required",
"accessRequiredSub": "You need admin rights to view this page.",
"goHome": "Go Home",
"panel": "Admin Panel",
"panelSub": "Manage users and review system changes.",
"redundancyDashboard": "Redundancy Dashboard",
"tabUsers": "Users",
"tabTools": "Tools",
"tabAudit": "Audit Log",
"tabSystem": "System",
"localUsers": "Local Users",
"localUsersSub": "Manage accounts for local authentication.",
"addUser": "Add User",
"noUsersYet": "No users yet.",
"auditLog": "Audit Log",
"auditLogSub": "All create, update and delete operations tracked by the system.",
"by": "by",
"noAuditEntries": "No audit entries yet.",
"system": "System",
"systemSub": "Build information of the currently live deployment.",
"version": "Version",
"commit": "Commit",
"buildDate": "Build date",
"trashRetention": "Trash retention",
"days": "days",
"keepForever": "Keep forever",
"createNewUser": "Create New User",
"username": "Username",
"password": "Password",
"emailOptional": "Email (Optional)",
"role": "Role",
"roleUser": "User",
"roleAdmin": "Admin",
"plan": "Plan",
"planFree": "Free",
"planPremium": "Premium",
"planEnterprise": "Enterprise",
"creating": "Creating…",
"createUser": "Create User",
"editUser": "Edit User — {{username}}",
"setPassword": "Set Password",
"resetsPassword": "Resets the user's password immediately.",
"idpManaged": "Password is managed by the identity provider (Keycloak). Reset it there.",
"setting": "Setting…",
"deleteUser": "Delete User",
"deleteUserConfirm": "Are you sure you want to delete {{username}}? This cannot be undone.",
"minPasswordPlaceholder": "min. 6 characters",
"usernamePlaceholder": "username",
"emailPlaceholder": "user@example.com",
"toastUserCreated": "User created",
"toastUserCreatedSub": "{{username}} has been created.",
"toastUserCreateFailed": "Failed to create user",
"toastUserUpdated": "User updated",
"toastUserUpdateFailed": "Failed to update user",
"toastPwTooShort": "Password too short",
"toastPwTooShortSub": "Minimum 6 characters.",
"toastPwUpdated": "Password updated",
"toastPwUpdatedSub": "Password for {{username}} has been set.",
"toastPwSetFailed": "Failed to set password",
"toastUserDeleted": "User deleted",
"toastUserDeletedSub": "{{username}} has been removed.",
"toastUserDeleteFailed": "Failed to delete user"
},
"adminTools": {
"accessRequired": "Admin access required.",
"allTools": "All Tools",
"toolCount": "{{count}} tool(s)",
"selected": "{{count}} selected",
"searchPlaceholder": "Search tools…",
"moveToTrash": "Move to trash ({{count}})",
"noMatch": "No tools match your search.",
"noToolsYet": "No tools yet.",
"selectAll": "Select all",
"selectName": "Select {{name}}",
"name": "Name",
"category": "Category",
"rating": "Rating",
"createdBy": "Created by",
"createdAt": "Created at",
"actions": "Actions",
"confirmTitle": "Move {{count}} tool(s) to trash?",
"confirmSub": "The selected tools will be hidden from all public views and moved to the trash, where they can be restored or permanently deleted.",
"moveToTrashAction": "Move to trash",
"toastMoved": "Tools moved to trash",
"toastMovedSub": "{{count}} tool(s) moved to trash.",
"toastMoveFailed": "Failed to move to trash"
},
"analytics": {
"title": "Platform Analytics",
"subtitle": "Macro-level insights into tool performance and community engagement.",
"totalToolsIndexed": "Total Tools Indexed",
"totalRatingsCast": "Total Ratings Cast",
"activeCategories": "Active Categories",
"avgGlobalScore": "Avg Global Score",
"top8Tools": "Top 8 Tools by Combined Score",
"top8ToolsSub": "Highest rated tools across the platform",
"toolsByCategory": "Tools by Category",
"toolsByCategorySub": "Distribution of tools across categories",
"globalRatingDistribution": "Global Rating Distribution",
"globalRatingDistributionSub": "How users are voting across all tools",
"radarTools": "Tools"
},
"redundancy": {
"title": "Tool Analysis & Recommendations",
"subtitle": "Automatic redundancy detection with cost and rating comparison. Admin can manually confirm which tool is the better choice.",
"toolsComparisons": "{{tools}} tools, {{pairs}} comparisons",
"totalMonthly": "/mo total",
"reviews": "reviews",
"features": "features",
"comparisonsTitle": "Comparisons & Recommendations",
"vs": "vs",
"noTools": "No tools found.",
"perMonth": "/mo",
"toastEvalSaved": "Evaluation saved",
"toastEvalFailed": "Failed to save evaluation"
},
"toolForm": {
"backToBrowse": "Back to browse",
"backToTool": "Back to tool",
"addTitle": "Add a New Tool",
"addSubtitle": "Submit a tool you use to let the community rate and review it.",
"editTitle": "Edit Tool",
"editSubtitle": "Update tool details and metadata.",
"signInRequired": "Sign in required",
"signInRequiredSub": "You must be signed in to submit a tool.",
"toolDetails": "Tool Details",
"toolDetailsNewSub": "Provide the basic information about the tool.",
"toolDetailsEditSub": "Modify the tool information below.",
"name": "Name",
"nameMin": "Name must be at least 2 characters",
"category": "Category",
"categoryRequired": "Category is required",
"websiteUrl": "Website URL",
"websiteUrlOptional": "Website URL (Optional)",
"iconUrl": "Icon / Logo URL",
"iconUrlOptional": "Icon / Logo URL (Optional)",
"iconPreview": "icon preview",
"description": "Description",
"descriptionMin": "Description must be at least 10 characters",
"invalidUrl": "Must be a valid URL",
"features": "Features",
"featuresNewSub": "List key capabilities. Existing features from other tools are selectable.",
"featuresEditSub": "Key capabilities of this tool. Existing features from other tools are selectable.",
"addFeature": "Add Feature",
"noFeatures": "No features added.",
"featurePlaceholder": "e.g. Real-time collaboration",
"tags": "Tags",
"tagsNewSub": "Keywords to help find this tool. Existing tags from other tools are selectable.",
"tagsEditSub": "Keywords for this tool. Existing tags from other tools are selectable.",
"addTag": "Add Tag",
"tag": "Tag",
"namePlaceholder": "e.g. React, Next.js, Postgres",
"urlPlaceholder": "https://...",
"logoPlaceholder": "https://example.com/logo.png",
"descriptionPlaceholderNew": "What does this tool do? Why do people use it?",
"descriptionPlaceholderEdit": "What does this tool do?",
"addingTool": "Adding Tool...",
"submitTool": "Submit Tool",
"saving": "Saving…",
"saveChanges": "Save Changes",
"toastAdded": "Tool added successfully",
"toastAddedSub": "Your tool is now available for review.",
"toastAddFailed": "Failed to add tool",
"toastUpdated": "Tool updated",
"toastUpdatedSub": "Changes saved successfully.",
"toastUpdateFailed": "Failed to update tool",
"tagsHelp": "Keywords to help find this tool. Existing tags from other tools are selectable.",
"tagPlaceholder": "Tag"
},
"category": {
"placeholder": "Select or type a category...",
"searchPlaceholder": "Search or enter new category...",
"noCategories": "No categories found.",
"knownCategories": "Known categories",
"createNew": "Create new",
"create": "+ Create"
},
"theme": {
"title": "Theme",
"light": "Light",
"dark": "Dark",
"system": "System",
"chooseTitle": "Choose theme",
"switchLight": "Switch to light theme",
"switchDark": "Switch to dark theme"
}
}
}