fix(ci): fix 3 pre-existing CI failures + doc updates

- i18n: add 115 missing EN translation keys (parity with FA)
- csrf: test /dashboard-legacy/keys (SPA owns /dashboard/*)
- oauth: add tier scopes to test fixture allowed_scopes
- DOCKER_README: v3.13.0 — remove Appwrite/Directus, clarify 8 plugins
- getting-started: remove Appwrite/Directus, add Coolify endpoint row
- Overview.tsx: fix Lang type for AdminStatsPanel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-21 00:05:33 +02:00
parent 43fd2201a0
commit 349913ca2d
7 changed files with 212 additions and 71 deletions

View File

@@ -775,6 +775,152 @@ DASHBOARD_TRANSLATIONS = {
"uploads to /wp/v2/media; Consumer Key/Secret do not work for that. Optional."
),
"api_keys.user_intro": "Use these to authenticate MCP clients to your hub.",
"api_keys.admin_intro": "Personal and machine keys for MCP clients. Each key has separate access and an independent log.",
"api_keys.admin_empty_cta": "Create one to authenticate MCP clients.",
"api_keys.admin_warning": (
"Admin access grants full system control including destructive operations "
"(delete, write env, system tools). Anyone with this key can act on all your "
"sites. Unless the client truly needs it, choose a narrower scope."
),
"api_keys.user_empty_cta": "Create one to connect a client.",
"api_keys.description": "Description",
"api_keys.description_placeholder": "What is this key for?",
"api_keys.expiry_label": "Expiry (days, optional)",
"api_keys.expiry_placeholder": "Leave blank for no expiry",
"api_keys.sensitive_warning": (
"Reads backup files and environment variables that often contain sensitive data. "
"Treat this key like a credential and do not share it over unencrypted channels."
),
"api_keys.confirm_delete": 'Permanently delete "{name}"?\nThis cannot be undone.',
"api_keys.confirm_delete_user": 'Delete "{name}"?\nThis key will stop working immediately.',
"api_keys.confirm_revoke": 'Revoke "{name}"?\nThis key will stop working immediately.',
"api_keys.toast_deleted": "Key deleted",
"api_keys.toast_revoked": "Key revoked",
# Audit log
"audit.intro": (
"Every authentication, tool call, and settings change. GDPR-compliant. "
"Filters are applied server-side."
),
"audit.col.time": "Time",
"audit.col.actor": "User",
"audit.col.event": "Event",
"audit.col.level": "Level",
"audit.col.message": "Message",
"audit.col.result": "Result",
"audit.col.target": "Target",
"audit.col.duration": "Duration",
"audit.search_placeholder": "Search user / event / target / message…",
"audit.event_type_placeholder": "Event type (e.g. tool_call)",
"audit.date_filter_title": "Filter by a day (YYYY-MM-DD)",
"audit.level.info": "Info",
"audit.level.warn": "Warning",
"audit.no_entries": "No entries found.",
"audit.zero_entries": "No entries",
"audit.clear_filters": "Clear filters",
"audit.page_label": "Page",
"audit.page_size": "Page size",
"audit.per_page": "{n} per page",
"audit.range_of": "{from}{to} of {total}",
# Badges
"badge.admin": "Admin",
"badge.elevated": "Elevated",
"badge.sensitive": "Sensitive",
# Connect page
"connect.connect_x": "Connect {name}",
"connect.client.claude-code.desc": "CLI · Developer",
"connect.client.vscode.desc": "Extension · Preview",
"connect.client.cursor.desc": "JSON config",
"connect.client.chatgpt.desc": "OAuth · Apps SDK",
"connect.client.gemini.desc": "CLI · Token",
"connect.client.custom.name": "Custom client",
"connect.client.custom.desc": "Any MCP client",
"connect.json.paste_into": "Paste this into your {name} MCP config",
"connect.json.location_hint": "Settings → MCP Servers · File path differs by client",
"connect.json.compatible": "Compatible:",
"connect.json.custom_mcp": "Custom MCP",
"connect.json.token_once": "Token shown only once",
"connect.json.token_once_body": "Save it somewhere safe. You can rotate it anytime from API Keys.",
"connect.claude.step1": "Use this connector URL",
"connect.claude.step1_body": "Enter this URL in Claude.ai Connectors in your browser when it asks for the MCP endpoint.",
"connect.claude.step2": "Confirm in Claude.ai",
"connect.claude.step2_body_prefix": "Claude will show:",
"connect.claude.step2_body_suffix": "Confirm to continue.",
"connect.claude.step3": "You're connected",
"connect.claude.step3_body": "You'll see the new client in your overview. Ask Claude to list your sites.",
"connect.claude.prompt_text": "MCP Hub wants access to N tools",
"connect.claude.open_desktop": "Open Claude Desktop",
"connect.claude.link_lifetime": "Link valid for 10 minutes · One-time use",
"connect.cli.step1": "Run this in your terminal",
"connect.cli.step2": "Confirm",
"connect.oauth.register_btn": "Register OAuth client",
"connect.oauth.step1": "Register the OAuth app (once)",
"connect.oauth.step1_body": "The hub creates an OAuth client and gives you a Redirect URL to paste into your AI tool manifest.",
"connect.oauth.step2": "Sign in via the AI client",
"connect.oauth.step2_body": 'Users see a "Sign in with MCP Hub" button. You confirm access once; the token refreshes automatically.',
"connect.tier.admin_warning": (
"Admin exposes destructive operations (delete posts, set options, install plugins, "
"write env) on this site. Anyone with this site's token can act with full access. "
"Unless the agent needs everything, choose a narrower scope."
),
"connect.tier.install_warning": (
"Installer is an elevated scope — installs run code from the WordPress/theme "
"repository on your site. Only use when the client needs this access."
),
"connect.tier.sensitive_warning": (
"Sensitive reads is an elevated scope — includes backups and environment variables. "
"Only use when the client needs this access."
),
"connect.toast.scope_updated": "Tool access updated to {scope}",
"connect.toast.scope_failed": "Update failed: {error}",
# OAuth clients
"oauth.empty": "You have no OAuth clients yet.",
"oauth.register_first": "Register your first client",
"oauth.none": "— None —",
"oauth.allowed_scope": "Allowed scope",
"oauth.confirm_delete": 'Delete OAuth client "{name}"?\nUsers signed in via this client will be disconnected.',
"oauth.admin_warning": (
"Admin scope on a third-party OAuth client allows that app to act on all your "
"sites on behalf of users. Only use for trusted applications you control."
),
"oauth.sensitive_warning": "Sensitive reads exposes backups and environment variables to the OAuth client.",
"oauth.invalid_uris": "{n} URI is not a valid http(s) address:",
"oauth.valid_uris": "{n} valid URI.",
"oauth.toast_created": "Client created",
"oauth.toast_deleted": "Client deleted",
"oauth.toast_delete_failed": "Delete failed: {error}",
"oauth.toast_create_failed": "Create failed: {error}",
# Sites
"sites.dialog_add_title": "Add site",
"sites.dialog_add_submit": "Add site",
"sites.dialog_edit_title": "Edit site",
"sites.dialog_edit_submit": "Save changes",
"sites.field_plugin_type": "Plugin",
"sites.field_url": "URL",
"sites.field_alias": "Alias",
"sites.alias_placeholder": "short-site-id",
"sites.alias_hint": "Short ID the AI sees as `site=…`. Lowercase letters, digits and hyphens only.",
"sites.credentials": "Credentials",
"sites.cred_unchanged": "Leave blank to keep the current value",
"sites.show_advanced": "Show advanced fields",
"sites.hide_advanced": "Hide advanced fields",
"sites.manage_tools": "Manage tools",
"sites.toast_created": "Site created",
"sites.toast_updated": "Site updated",
# Tier hints (used on the Connect page scope selector)
"tier.read.hint": "List and inspect resources — read-only.",
"tier.read_sensitive.hint": "Includes backups, environment variables, and other sensitive reads.",
"tier.write.hint": "Create / update / delete resources and configuration.",
"tier.editor.hint": "Pages, posts, content editing (wordpress_specialist F.19.5).",
"tier.settings.hint": "Options, databases, identity, cron (wordpress_specialist F.19.6).",
"tier.install.hint": "Install plugins/themes from the repository. Treat as elevated access.",
"tier.deploy.hint": "Run deployments and lifecycle, without editing.",
"tier.admin.hint": "Full system control including destructive operations.",
"tier.custom.hint": "After selecting this, enable/disable tools manually.",
# Pagination
"previous": "Previous",
"next": "Next",
# Status labels
"status.revoked": "Revoked",
# Audit / generic
"event_type": "Event type",
"level": "Level",