trypost/lang/de/settings.php
Paulo Castellano 4d8353d758
MCP: workspace settings, viewer read access, and token access (#241)
* Add workspace MCP settings and token access controls.

Ship MCP settings UI, OAuth revoke/list helpers, Passport deploy wiring,
and workspace.token:mcp gating so assistants can connect without pulling
in welcome/onboarding from the parent epic.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Type MCP client config shapes instead of string checks.

Encode http/config-root on each advanced client and tighten primary
client ids so snippet generation does not branch on magic strings.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Polish MCP settings follow-ups from review.

Translate Ukrainian MCP copy, deep-link ChatGPT into connector
creation, drop an unused asset and revoke arg, and assert PATs are
rejected on the MCP endpoint.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Harden MCP connected clients, revoke scope, and OAuth consent.

List recoverable sessions with live refresh tokens, revoke only PATs,
throttle registration alone, and block viewers from authorizing MCP.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Simplify MCP OAuth route throttling to a single middleware group.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Allow workspace viewers read-only MCP access with web policy writes.

Mirror the web app: MCP connects on view + OAuth mcp:use, write tools
enforce createPost/update/delete/manageAccounts/manageTeam, and demotion
to Viewer keeps grants. Cover role denials, consent, and disconnect.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Harden MCP tool authz with shared workspace helpers.

Route ApiKey tools through AuthorizesMcpTool, fail closed on null user
or policy argument, and resolve the current workspace before mutating.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop redundant string casts on validated request data.

Enum::from and validated() fields are already strings, so the casts
add noise without changing behavior.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Show only the current user's MCP connections in settings.

Match API keys privacy: list and disconnect your own OAuth clients,
not teammates' across the account.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Cover LoadWorkspaceFromToken gaps and harden AuthorizesMcpTool tests.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop redundant is_string guard before UpdatePostTool find.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Refactor AppSidebar to always show MCP link and simplify route middleware definition in ai.php. The MCP link is now consistently displayed regardless of the current workspace state, and the route middleware syntax has been streamlined.

* Refresh MCP connected clients with Inertia usePoll.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Bump laravel/mcp to 0.9.1 and add the TryPost server icon.

Requires laravel/boost 2.5 for the Icon attribute; expose images/trypost/icon.png on TryPostServer.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop no-op ReflectionClass import in TryPostServerTest.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 09:54:51 -03:00

387 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
return [
'title' => 'Einstellungen',
'description' => 'Verwalte dein Profil und deine Kontoeinstellungen',
'hub' => [
'title' => 'Einstellungen',
'description' => 'Wähle, was du verwalten möchtest.',
'profile' => [
'title' => 'Profil',
'description' => 'Aktualisiere deine persönlichen Daten, dein Passwort und deine Benachrichtigungseinstellungen.',
],
'workspace' => [
'title' => 'Workspace',
'description' => 'Konfiguriere deinen Workspace, deine Marke, deine Mitglieder und deine API-Keys.',
],
'account' => [
'title' => 'Konto',
'description' => 'Verwalte deine Kontoinformationen, deine Nutzung und deine Abrechnung.',
],
],
'nav' => [
'profile' => 'Profil',
'authentication' => 'Authentifizierung',
'workspace' => 'Workspace',
'members' => 'Mitglieder',
'notifications' => 'Benachrichtigungen',
'billing' => 'Abrechnung',
],
'notifications' => [
'title' => 'Benachrichtigungseinstellungen',
'heading' => 'E-Mail-Benachrichtigungen',
'description' => 'Wähle, welche E-Mail-Benachrichtigungen du erhalten möchtest',
'post_published' => 'Beitrag veröffentlicht',
'post_published_description' => 'Erhalte eine E-Mail, wenn dein Beitrag erfolgreich veröffentlicht wurde',
'post_failed' => 'Beitrag fehlgeschlagen',
'post_failed_description' => 'Erhalte eine E-Mail, wenn die Veröffentlichung deines Beitrags fehlschlägt',
'account_disconnected' => 'Konto getrennt',
'account_disconnected_description' => 'Erhalte eine E-Mail, wenn ein Social-Media-Konto getrennt wird',
'save' => 'Einstellungen speichern',
],
'profile' => [
'title' => 'Profileinstellungen',
'photo_heading' => 'Profilfoto',
'photo_description' => 'Lade ein Profilfoto hoch',
'heading' => 'Profilinformationen',
'description' => 'Aktualisiere deinen Namen und deine E-Mail-Adresse',
'avatar' => 'Avatar',
'name' => 'Name',
'name_placeholder' => 'Vollständiger Name',
'email' => 'E-Mail-Adresse',
'email_placeholder' => 'E-Mail-Adresse',
'email_unverified' => 'Deine E-Mail-Adresse ist nicht bestätigt.',
'resend_verification' => 'Klicke hier, um die Bestätigungs-E-Mail erneut zu senden.',
'verification_sent' => 'Ein neuer Bestätigungslink wurde an deine E-Mail-Adresse gesendet.',
'save' => 'Speichern',
],
'authentication' => [
'title' => 'Authentifizierung',
'page_title' => 'Authentifizierungseinstellungen',
'sessions' => [
'title' => 'Aktive Sitzungen',
'description' => 'Wenn dir etwas Verdächtiges auffällt, melde dich von anderen Geräten ab.',
'unknown_browser' => 'Unbekannter Browser',
'unknown_ip' => 'Unbekannte IP',
'on' => 'am',
'active_now' => 'Jetzt aktiv',
'log_out_others' => 'Andere Geräte abmelden',
'modal_title' => 'Andere Geräte abmelden',
'modal_description_password' => 'Gib dein aktuelles Passwort ein, um zu bestätigen, dass du andere Browser-Sitzungen abmelden möchtest.',
'modal_description_email' => 'Gib deine E-Mail-Adresse ein, um zu bestätigen, dass du andere Browser-Sitzungen abmelden möchtest.',
'password_placeholder' => 'Aktuelles Passwort',
'email_placeholder' => 'E-Mail deines Kontos',
'cancel' => 'Abbrechen',
'submit' => 'Andere Geräte abmelden',
'email_mismatch' => 'Die E-Mail-Adresse stimmt nicht mit deinem Konto überein.',
'flash_logged_out' => 'Du wurdest von anderen Geräten abgemeldet.',
],
'password' => [
'update_title' => 'Passwort aktualisieren',
'set_title' => 'Passwort festlegen',
'update_description' => 'Stelle sicher, dass dein Konto ein langes, zufälliges Passwort verwendet, um sicher zu bleiben.',
'set_description' => 'Füge ein Passwort hinzu, damit du dich ohne verbundenen Anbieter anmelden kannst.',
'current_password' => 'Aktuelles Passwort',
'new_password' => 'Neues Passwort',
'confirm_password' => 'Passwort bestätigen',
'save' => 'Passwort speichern',
'set' => 'Passwort festlegen',
],
'providers' => [
'title' => 'Verbundene Konten',
'description' => 'Melde dich schneller mit diesen verbundenen Anbietern an.',
'connected' => 'Verbunden',
'not_connected' => 'Nicht verbunden',
'connect' => 'Verbinden',
'disconnect' => 'Trennen',
'flash_disconnected' => ':provider erfolgreich getrennt.',
'flash_connected' => ':provider erfolgreich verbunden.',
'flash_already_linked' => 'Dieses :provider-Konto ist bereits mit einem anderen Benutzer verknüpft.',
'flash_cannot_disconnect' => 'Du kannst deine einzige Anmeldemethode nicht trennen. Lege zuerst ein Passwort fest oder verbinde einen anderen Anbieter.',
],
],
'delete_account' => [
'heading' => 'Konto löschen',
'description' => 'Lösche dein Konto und alle zugehörigen Ressourcen',
'warning' => 'Warnung',
'warning_message' => 'Sei vorsichtig: Das kann nicht rückgängig gemacht werden. Wenn du Eigentümer dieses Kontos bist, werden eingeladene Mitglieder ebenfalls dauerhaft gelöscht.',
'button' => 'Konto löschen',
'modal_title' => 'Möchtest du dein Konto wirklich löschen?',
'modal_description_password' => 'Sobald dein Konto gelöscht ist, werden auch alle zugehörigen Ressourcen und Daten dauerhaft gelöscht. Wenn du Eigentümer des Kontos bist, werden eingeladene Mitglieder ebenfalls dauerhaft gelöscht. Bitte gib dein Passwort ein, um zu bestätigen.',
'modal_description_email' => 'Sobald dein Konto gelöscht ist, werden auch alle zugehörigen Ressourcen und Daten dauerhaft gelöscht. Wenn du Eigentümer des Kontos bist, werden eingeladene Mitglieder ebenfalls dauerhaft gelöscht. Bitte gib deine E-Mail-Adresse :email ein, um zu bestätigen.',
'password' => 'Passwort',
'password_placeholder' => 'Passwort',
'email_placeholder' => 'E-Mail deines Kontos',
'email_mismatch' => 'Die E-Mail-Adresse stimmt nicht mit deinem Konto überein.',
'cancel' => 'Abbrechen',
'confirm' => 'Konto löschen',
],
'workspace' => [
'tabs' => [
'workspace' => 'Workspace',
'brand' => 'Marke',
'users' => 'Mitglieder',
'api_keys' => 'API-Keys',
'mcp' => 'MCP',
],
'title' => 'Workspace-Einstellungen',
'logo_heading' => 'Workspace-Logo',
'logo_description' => 'Lade ein Logo für deinen Workspace hoch',
'heading' => 'Workspace-Name',
'description' => 'Aktualisiere den Namen deines Workspace',
'members_heading' => 'Mitglieder',
'members_description' => 'Verwalte die Mitglieder und Einladungen des Workspace',
'name' => 'Name',
'name_placeholder' => 'Mein Workspace',
'save' => 'Speichern',
'danger_description' => 'Unwiderrufliche Aktionen.',
'delete_warning' => 'Warnung',
'delete_title' => 'Diesen Workspace löschen',
'delete_description' => 'Löscht diesen Workspace dauerhaft — inklusive Beiträge, verbundener Konten und Medien. Du wirst für einen Workspace weniger berechnet.',
'delete_description_self_hosted' => 'Löscht diesen Workspace dauerhaft inklusive Beiträge, verbundener Konten und Medien.',
'delete_only_description' => 'Du kannst deinen einzigen Workspace nicht löschen. Kündige das Abonnement in der Abrechnung, um die Zahlung zu stoppen, oder lösche dein Konto unter Authentifizierung, um die Abrechnung zu beenden und alles dauerhaft zu entfernen.',
'delete_go_to_billing' => 'Zur Abrechnung',
'delete_go_to_delete_account' => 'Konto löschen',
'delete_members_warning' => '{1}:count weiteres Mitglied verliert den Zugriff. Mitglieder ohne anderen TryPost-Workspace werden dauerhaft gelöscht.|[2,*]:count weitere Mitglieder verlieren den Zugriff. Mitglieder ohne anderen TryPost-Workspace werden dauerhaft gelöscht.',
'delete_action' => 'Workspace löschen',
'delete_cancel' => 'Abbrechen',
'delete_confirm_title' => 'Workspace löschen?',
'delete_confirm_description' => 'Dadurch wird der Workspace und alle seine Daten dauerhaft gelöscht. Deine Abrechnung wird um einen Workspace reduziert.',
'delete_confirm_description_self_hosted' => 'Dadurch wird der Workspace und alle seine Daten dauerhaft gelöscht.',
],
'brand' => [
'title' => 'Marke',
'description' => 'Konfiguriere deine Markenidentität für KI-generierte Inhalte.',
'name' => 'Workspace-Name',
'name_placeholder' => 'Meine Marke',
'website' => 'Website',
'website_placeholder' => 'https://yourbrand.com',
'brand_description' => 'Beschreibung',
'brand_description_placeholder' => 'Erzähl uns von deiner Marke, was du machst und wer deine Zielgruppe ist...',
'voice' => 'Markenton',
'voice_description' => 'Wähle die Eigenschaften, die den Klang deiner Inhalte bestimmen.',
'voice_group' => [
'pov' => 'Perspektive',
'formality' => 'Förmlichkeit',
'energy' => 'Energie',
'humor' => 'Humor',
'attitude' => 'Haltung',
'warmth' => 'Wärme',
'confidence' => 'Selbstbewusstsein',
'style' => 'Stil',
],
'voice_trait' => [
'first_person' => 'Erste Person',
'second_person' => 'Zweite Person (du)',
'third_person' => 'Dritte Person',
'formal' => 'Förmlich',
'balanced' => 'Ausgewogen',
'casual' => 'Locker',
'calm' => 'Ruhig',
'moderate' => 'Moderat',
'enthusiastic' => 'Enthusiastisch',
'vibrant' => 'Lebhaft',
'serious' => 'Ernst',
'dry' => 'Trocken / subtil',
'witty' => 'Geistreich',
'playful' => 'Verspielt',
'respectful' => 'Respektvoll',
'even_handed' => 'Unparteiisch',
'bold' => 'Mutig',
'provocative' => 'Provokativ',
'neutral' => 'Neutral',
'friendly' => 'Freundlich',
'empathetic' => 'Einfühlsam',
'humble' => 'Bescheiden',
'confident' => 'Selbstbewusst',
'assertive' => 'Durchsetzungsstark',
'direct' => 'Direkt',
'concise' => 'Prägnant',
'transparent' => 'Transparent',
'no_hype' => 'Ohne Hype',
'practical' => 'Praktisch',
'data_driven' => 'Datenbasiert',
'storytelling' => 'Storytelling',
'inspirational' => 'Inspirierend',
'educational' => 'Lehrreich',
'technical' => 'Technisch',
'minimalist' => 'Wenige Emojis',
],
'brand_color' => 'Markenfarbe',
'background_color' => 'Hintergrundfarbe',
'text_color' => 'Textfarbe',
'font' => 'Schriftart',
'image_style' => 'Bildstil',
'image_style_description' => 'Visueller Stil, der beim Generieren von Slide- und Coverbildern für KI-Beiträge angewendet wird.',
'image_style_cinematic' => 'Filmisch',
'image_style_illustration' => 'Illustration',
'image_style_isometric_3d' => 'Isometrisch',
'image_style_cartoon' => 'Cartoon',
'image_style_typographic' => 'Typografisch',
'image_style_infographic' => 'Infografik',
'image_style_minimalist' => 'Minimalistisch',
'image_style_mockup' => 'Mockup',
'content_language' => 'Inhaltssprache',
'content_language_description' => 'Sprache für KI-generierte Bildunterschriften, Hashtags und jeglichen Text in generierten Bildern oder Videos.',
'font_placeholder' => 'Schriftart auswählen…',
'font_search' => 'Schriftart suchen…',
'font_empty' => 'Keine Schriftarten gefunden.',
'language_placeholder' => 'Sprache auswählen…',
'language_search' => 'Sprache suchen…',
'language_empty' => 'Keine Sprache gefunden.',
],
'members' => [
'title' => 'Mitglieder',
'heading' => 'Teammitglieder',
'description' => 'Verwalte Mitglieder und Einladungen für diesen Workspace',
'cancel' => 'Abbrechen',
'remove' => 'Entfernen',
'make_role' => 'Zu :role machen',
'invite' => [
'title' => 'Mitglied einladen',
'description' => 'Sende eine E-Mail-Einladung, um Mitarbeiter hinzuzufügen',
'email' => 'E-Mail',
'email_placeholder' => 'mitarbeiter@email.com',
'role' => 'Rolle',
'role_placeholder' => 'Rolle auswählen',
'submit' => 'Einladung senden',
],
'pending' => [
'title' => 'Ausstehende Einladungen',
'description' => 'Einladungen, die auf Annahme warten',
'empty' => 'Keine ausstehenden Einladungen',
],
'list' => [
'title' => 'Mitglieder',
'description' => 'Personen mit Zugriff auf diesen Workspace',
'empty' => 'Keine Mitglieder außer dem Inhaber',
],
'remove_modal' => [
'title' => 'Mitglied entfernen',
'description' => 'Möchtest du dieses Mitglied wirklich aus dem Workspace entfernen? Es verliert den Zugriff auf alle Workspace-Ressourcen.',
'action' => 'Mitglied entfernen',
],
'cancel_invite_modal' => [
'title' => 'Einladung zurückziehen',
'description' => 'Möchtest du diese Einladung wirklich zurückziehen?',
'action' => 'Einladung zurückziehen',
],
'roles' => [
'owner' => 'Inhaber',
'admin' => 'Admin',
'member' => 'Mitglied',
'viewer' => 'Betrachter',
],
'errors' => [
'invite_exists' => 'Für diese E-Mail existiert bereits eine Einladung.',
'email_belongs_to_account' => 'Diese E-Mail gehört bereits zu einem anderen TryPost-Konto. Bitte eine dedizierte Arbeits-E-Mail verwenden.',
],
'flash' => [
'invite_sent' => 'Einladung erfolgreich gesendet!',
'invite_deleted' => 'Einladung gelöscht.',
'member_removed' => 'Mitglied erfolgreich entfernt.',
'role_updated' => 'Rolle des Mitglieds aktualisiert.',
'wrong_email' => 'Diese Einladung gilt für eine andere E-Mail-Adresse.',
'already_member' => 'Du bist bereits Mitglied dieses Workspace.',
'invite_accepted' => 'Willkommen! Du bist jetzt Mitglied des Workspace.',
'invite_workspace_gone' => 'Diese Einladung ist nicht mehr gültig, weil der Workspace gelöscht wurde.',
'invite_declined' => 'Einladung abgelehnt.',
],
],
'account' => [
'tabs' => [
'account' => 'Konto',
'usage' => 'Nutzung',
'billing' => 'Abrechnung',
],
'title' => 'Kontoeinstellungen',
'description' => 'Verwalte deinen Kontonamen und deine Rechnungs-E-Mail',
'name' => 'Kontoname',
'name_placeholder' => 'Meine Firma',
'billing_email' => 'Rechnungs-E-Mail',
'billing_email_placeholder' => 'rechnung@firma.com',
'billing_email_hint' => 'Diese E-Mail-Adresse wird für Rechnungen und Abrechnungskommunikation von Stripe verwendet.',
'submit' => 'Speichern',
],
'flash' => [
'account_updated' => 'Konto erfolgreich aktualisiert!',
'profile_updated' => 'Profil erfolgreich aktualisiert!',
'password_updated' => 'Passwort erfolgreich aktualisiert!',
'workspace_updated' => 'Einstellungen erfolgreich aktualisiert!',
'photo_updated' => 'Foto erfolgreich aktualisiert!',
'photo_deleted' => 'Foto erfolgreich entfernt!',
'delete_failed_billing' => 'Wir konnten dein Abonnement beim Zahlungsanbieter nicht kündigen. Es wurde nichts gelöscht. Bitte versuche es erneut oder kontaktiere den Support.',
'logo_updated' => 'Logo erfolgreich hochgeladen!',
'logo_deleted' => 'Logo erfolgreich entfernt!',
'notifications_updated' => 'Benachrichtigungseinstellungen aktualisiert!',
],
'api_keys' => [
'title' => 'API-Keys',
'page_title' => 'API-Keys',
'heading' => 'API-Keys',
'description' => 'Verwalte API-Keys für den programmatischen Zugriff auf deinen Workspace.',
'create' => 'API-Key erstellen',
'copy' => 'Kopieren',
'new_token_message' => 'Dein neuer API-Key wurde erstellt. Kopiere ihn jetzt du kannst ihn danach nicht mehr sehen.',
'table' => [
'name' => 'Name',
'key' => 'Key',
'status' => 'Status',
'expires' => 'Läuft ab',
'last_used' => 'Zuletzt verwendet',
'never' => 'Nie',
],
'actions' => [
'copy_id' => 'API-Key-ID kopieren',
'copy_id_success' => 'API-Key-ID in die Zwischenablage kopiert',
'delete' => 'Löschen',
],
'empty' => [
'title' => 'Noch keine API-Keys',
'description' => 'Erstelle einen API-Key, um programmatisch auf deinen Workspace zuzugreifen.',
],
'delete_modal' => [
'title' => 'API-Key löschen',
'description' => 'Möchtest du diesen API-Key wirklich löschen? Alle Anwendungen, die diesen Key verwenden, verlieren sofort den Zugriff.',
'action' => 'API-Key löschen',
],
'create_dialog' => [
'title' => 'API-Key erstellen',
'description' => 'Erstelle einen neuen API-Key für den programmatischen Zugriff auf deinen Workspace.',
'name' => 'Name',
'name_placeholder' => 'z. B. Produktions-API-Key',
'expires' => 'Ablaufdatum (optional)',
'expires_placeholder' => 'Kein Ablauf',
'submit' => 'Erstellen',
'cancel' => 'Abbrechen',
],
'flash' => [
'created' => 'API-Key erfolgreich erstellt!',
'deleted' => 'API-Key erfolgreich gelöscht!',
],
],
];