* 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>
385 lines
18 KiB
PHP
385 lines
18 KiB
PHP
<?php
|
|
|
|
return [
|
|
'title' => 'Instellingen',
|
|
'description' => 'Beheer je profiel- en accountinstellingen',
|
|
|
|
'hub' => [
|
|
'title' => 'Instellingen',
|
|
'description' => 'Kies wat je wilt beheren.',
|
|
'profile' => [
|
|
'title' => 'Profiel',
|
|
'description' => 'Werk je persoonlijke gegevens, wachtwoord en meldingsvoorkeuren bij.',
|
|
],
|
|
'workspace' => [
|
|
'title' => 'Workspace',
|
|
'description' => 'Configureer je workspace, merk, leden en API-sleutels.',
|
|
],
|
|
'account' => [
|
|
'title' => 'Account',
|
|
'description' => 'Beheer je accountgegevens, gebruik en facturatie.',
|
|
],
|
|
],
|
|
|
|
'nav' => [
|
|
'profile' => 'Profiel',
|
|
'authentication' => 'Authenticatie',
|
|
'workspace' => 'Workspace',
|
|
'members' => 'Leden',
|
|
'notifications' => 'Meldingen',
|
|
'billing' => 'Facturatie',
|
|
],
|
|
|
|
'notifications' => [
|
|
'title' => 'Meldingsvoorkeuren',
|
|
'heading' => 'E-mailmeldingen',
|
|
'description' => 'Kies welke e-mailmeldingen je wilt ontvangen',
|
|
'post_published' => 'Post gepubliceerd',
|
|
'post_published_description' => 'Ontvang een e-mail wanneer je post succesvol is gepubliceerd',
|
|
'post_failed' => 'Post mislukt',
|
|
'post_failed_description' => 'Ontvang een e-mail wanneer je post niet kan worden gepubliceerd',
|
|
'account_disconnected' => 'Account losgekoppeld',
|
|
'account_disconnected_description' => 'Ontvang een e-mail wanneer een social account wordt losgekoppeld',
|
|
'save' => 'Voorkeuren opslaan',
|
|
],
|
|
|
|
'profile' => [
|
|
'title' => 'Profielinstellingen',
|
|
'photo_heading' => 'Profielfoto',
|
|
'photo_description' => 'Upload een profielfoto',
|
|
'heading' => 'Profielgegevens',
|
|
'description' => 'Werk je naam en e-mailadres bij',
|
|
'avatar' => 'Avatar',
|
|
'name' => 'Naam',
|
|
'name_placeholder' => 'Volledige naam',
|
|
'email' => 'E-mailadres',
|
|
'email_placeholder' => 'E-mailadres',
|
|
'email_unverified' => 'Je e-mailadres is niet geverifieerd.',
|
|
'resend_verification' => 'Klik hier om de verificatiemail opnieuw te versturen.',
|
|
'verification_sent' => 'Er is een nieuwe verificatielink naar je e-mailadres verstuurd.',
|
|
'save' => 'Opslaan',
|
|
],
|
|
|
|
'authentication' => [
|
|
'title' => 'Authenticatie',
|
|
'page_title' => 'Authenticatie-instellingen',
|
|
'sessions' => [
|
|
'title' => 'Actieve sessies',
|
|
'description' => 'Als je iets verdachts opmerkt, log dan uit op andere apparaten.',
|
|
'unknown_browser' => 'Onbekende browser',
|
|
'unknown_ip' => 'Onbekend IP',
|
|
'on' => 'op',
|
|
'active_now' => 'Nu actief',
|
|
'log_out_others' => 'Uitloggen op andere apparaten',
|
|
'modal_title' => 'Uitloggen op andere apparaten',
|
|
'modal_description_password' => 'Voer je huidige wachtwoord in om te bevestigen dat je op andere browsersessies wilt uitloggen.',
|
|
'modal_description_email' => 'Typ je e-mailadres om te bevestigen dat je op andere browsersessies wilt uitloggen.',
|
|
'password_placeholder' => 'Huidig wachtwoord',
|
|
'email_placeholder' => 'Je account-e-mailadres',
|
|
'cancel' => 'Annuleren',
|
|
'submit' => 'Uitloggen op andere apparaten',
|
|
'email_mismatch' => 'Het e-mailadres komt niet overeen met je account.',
|
|
'flash_logged_out' => 'Je bent uitgelogd op andere apparaten.',
|
|
],
|
|
'password' => [
|
|
'update_title' => 'Wachtwoord bijwerken',
|
|
'set_title' => 'Wachtwoord instellen',
|
|
'update_description' => 'Zorg dat je account een lang, willekeurig wachtwoord gebruikt om veilig te blijven.',
|
|
'set_description' => 'Voeg een wachtwoord toe zodat je kunt inloggen zonder een gekoppelde provider.',
|
|
'current_password' => 'Huidig wachtwoord',
|
|
'new_password' => 'Nieuw wachtwoord',
|
|
'confirm_password' => 'Bevestig wachtwoord',
|
|
'save' => 'Wachtwoord opslaan',
|
|
'set' => 'Wachtwoord instellen',
|
|
],
|
|
'providers' => [
|
|
'title' => 'Gekoppelde accounts',
|
|
'description' => 'Log sneller in met deze gekoppelde providers.',
|
|
'connected' => 'Gekoppeld',
|
|
'not_connected' => 'Niet gekoppeld',
|
|
'connect' => 'Koppelen',
|
|
'disconnect' => 'Loskoppelen',
|
|
'flash_disconnected' => ':provider succesvol losgekoppeld.',
|
|
'flash_connected' => ':provider succesvol gekoppeld.',
|
|
'flash_already_linked' => 'Dat :provider-account is al aan een andere gebruiker gekoppeld.',
|
|
'flash_cannot_disconnect' => 'Je kunt je enige inlogmethode niet loskoppelen. Stel eerst een wachtwoord in of koppel een andere provider.',
|
|
],
|
|
],
|
|
|
|
'delete_account' => [
|
|
'heading' => 'Account verwijderen',
|
|
'description' => 'Verwijder je account en alle bijbehorende gegevens',
|
|
'warning' => 'Waarschuwing',
|
|
'warning_message' => 'Ga voorzichtig te werk: dit kan niet ongedaan worden gemaakt. Als je de eigenaar van dit account bent, worden uitgenodigde leden ook permanent verwijderd.',
|
|
'button' => 'Account verwijderen',
|
|
'modal_title' => 'Weet je zeker dat je je account wilt verwijderen?',
|
|
'modal_description_password' => 'Zodra je account is verwijderd, worden ook alle bijbehorende gegevens permanent verwijderd. Als je de eigenaar van het account bent, worden uitgenodigde leden ook permanent verwijderd. Voer je wachtwoord in om te bevestigen.',
|
|
'modal_description_email' => 'Zodra je account is verwijderd, worden ook alle bijbehorende gegevens permanent verwijderd. Als je de eigenaar van het account bent, worden uitgenodigde leden ook permanent verwijderd. Typ je e-mailadres :email om te bevestigen.',
|
|
'password' => 'Wachtwoord',
|
|
'password_placeholder' => 'Wachtwoord',
|
|
'email_placeholder' => 'Je account-e-mailadres',
|
|
'email_mismatch' => 'Het e-mailadres komt niet overeen met je account.',
|
|
'cancel' => 'Annuleren',
|
|
'confirm' => 'Account verwijderen',
|
|
],
|
|
|
|
'workspace' => [
|
|
'tabs' => [
|
|
'workspace' => 'Workspace',
|
|
'brand' => 'Merk',
|
|
'users' => 'Leden',
|
|
'api_keys' => 'API-sleutels',
|
|
'mcp' => 'MCP',
|
|
],
|
|
'title' => 'Workspace-instellingen',
|
|
'logo_heading' => 'Workspace-logo',
|
|
'logo_description' => 'Upload een logo voor je workspace',
|
|
'heading' => 'Workspacenaam',
|
|
'description' => 'Werk de naam van je workspace bij',
|
|
'members_heading' => 'Leden',
|
|
'members_description' => 'Beheer workspaceleden en uitnodigingen',
|
|
'name' => 'Naam',
|
|
'name_placeholder' => 'Mijn workspace',
|
|
'save' => 'Opslaan',
|
|
'danger_description' => 'Onomkeerbare acties.',
|
|
'delete_warning' => 'Waarschuwing',
|
|
'delete_title' => 'Deze workspace verwijderen',
|
|
'delete_description' => 'Verwijdert deze workspace permanent, inclusief posts, gekoppelde accounts en media. Je wordt voor één workspace minder gefactureerd.',
|
|
'delete_description_self_hosted' => 'Verwijdert deze workspace permanent, inclusief posts, gekoppelde accounts en media.',
|
|
'delete_only_description' => 'Je kunt je enige workspace niet verwijderen. Zeg je abonnement op in facturatie om te stoppen met betalen, of verwijder je account bij Authenticatie om de facturatie te annuleren en alles permanent te wissen.',
|
|
'delete_go_to_billing' => 'Naar facturatie',
|
|
'delete_go_to_delete_account' => 'Account verwijderen',
|
|
'delete_members_warning' => '{1}:count ander lid verliest toegang. Leden zonder andere TryPost-workspace worden permanent verwijderd.|[2,*]:count andere leden verliezen toegang. Leden zonder andere TryPost-workspace worden permanent verwijderd.',
|
|
'delete_action' => 'Workspace verwijderen',
|
|
'delete_cancel' => 'Annuleren',
|
|
'delete_confirm_title' => 'Workspace verwijderen?',
|
|
'delete_confirm_description' => 'Dit verwijdert de workspace en al zijn gegevens permanent. Je facturatie wordt bijgewerkt met één workspace minder.',
|
|
'delete_confirm_description_self_hosted' => 'Dit verwijdert de workspace en al zijn gegevens permanent.',
|
|
],
|
|
|
|
'brand' => [
|
|
'title' => 'Merk',
|
|
'description' => 'Configureer je merkidentiteit voor AI-gegenereerde content.',
|
|
'name' => 'Workspacenaam',
|
|
'name_placeholder' => 'Mijn merk',
|
|
'website' => 'Website',
|
|
'website_placeholder' => 'https://jouwmerk.nl',
|
|
'brand_description' => 'Omschrijving',
|
|
'brand_description_placeholder' => 'Vertel ons over je merk, wat je doet en wie je publiek is...',
|
|
'voice' => 'Merkstem',
|
|
'voice_description' => 'Kies de eigenschappen die bepalen hoe je content klinkt.',
|
|
'voice_group' => [
|
|
'pov' => 'Perspectief',
|
|
'formality' => 'Formaliteit',
|
|
'energy' => 'Energie',
|
|
'humor' => 'Humor',
|
|
'attitude' => 'Houding',
|
|
'warmth' => 'Warmte',
|
|
'confidence' => 'Zelfverzekerdheid',
|
|
'style' => 'Stijl',
|
|
],
|
|
'voice_trait' => [
|
|
'first_person' => 'Eerste persoon',
|
|
'second_person' => 'Tweede persoon (je)',
|
|
'third_person' => 'Derde persoon',
|
|
'formal' => 'Formeel',
|
|
'balanced' => 'Gebalanceerd',
|
|
'casual' => 'Informeel',
|
|
'calm' => 'Rustig',
|
|
'moderate' => 'Gematigd',
|
|
'enthusiastic' => 'Enthousiast',
|
|
'vibrant' => 'Levendig',
|
|
'serious' => 'Serieus',
|
|
'dry' => 'Droog / subtiel',
|
|
'witty' => 'Gevat',
|
|
'playful' => 'Speels',
|
|
'respectful' => 'Respectvol',
|
|
'even_handed' => 'Evenwichtig',
|
|
'bold' => 'Gedurfd',
|
|
'provocative' => 'Provocerend',
|
|
'neutral' => 'Neutraal',
|
|
'friendly' => 'Vriendelijk',
|
|
'empathetic' => 'Empathisch',
|
|
'humble' => 'Bescheiden',
|
|
'confident' => 'Zelfverzekerd',
|
|
'assertive' => 'Assertief',
|
|
'direct' => 'Direct',
|
|
'concise' => 'Beknopt',
|
|
'transparent' => 'Transparant',
|
|
'no_hype' => 'Geen hype',
|
|
'practical' => 'Praktisch',
|
|
'data_driven' => 'Datagedreven',
|
|
'storytelling' => 'Verhalend',
|
|
'inspirational' => 'Inspirerend',
|
|
'educational' => 'Educatief',
|
|
'technical' => 'Technisch',
|
|
'minimalist' => 'Weinig emoji\'s',
|
|
],
|
|
'brand_color' => 'Merkkleur',
|
|
'background_color' => 'Achtergrondkleur',
|
|
'text_color' => 'Tekstkleur',
|
|
'font' => 'Lettertype',
|
|
'image_style' => 'Beeldstijl',
|
|
'image_style_description' => 'Visuele stijl die wordt toegepast bij het genereren van slide- en coverafbeeldingen voor AI-posts.',
|
|
'image_style_cinematic' => 'Cinematisch',
|
|
'image_style_illustration' => 'Illustratie',
|
|
'image_style_isometric_3d' => 'Isometrisch',
|
|
'image_style_cartoon' => 'Cartoon',
|
|
'image_style_typographic' => 'Typografisch',
|
|
'image_style_infographic' => 'Infographic',
|
|
'image_style_minimalist' => 'Minimalistisch',
|
|
'image_style_mockup' => 'Mockup',
|
|
'content_language' => 'Contenttaal',
|
|
'content_language_description' => 'Taal die wordt gebruikt voor AI-gegenereerde bijschriften, hashtags en tekst in gegenereerde afbeeldingen of video\'s.',
|
|
'font_placeholder' => 'Kies een lettertype…',
|
|
'font_search' => 'Lettertype zoeken…',
|
|
'font_empty' => 'Geen lettertypen gevonden.',
|
|
'language_placeholder' => 'Kies een taal…',
|
|
'language_search' => 'Taal zoeken…',
|
|
'language_empty' => 'Geen taal gevonden.',
|
|
|
|
],
|
|
|
|
'members' => [
|
|
'title' => 'Leden',
|
|
'heading' => 'Teamleden',
|
|
'description' => 'Beheer leden en uitnodigingen voor deze workspace',
|
|
|
|
'cancel' => 'Annuleren',
|
|
'remove' => 'Verwijderen',
|
|
'make_role' => 'Maak :role',
|
|
|
|
'invite' => [
|
|
'title' => 'Lid uitnodigen',
|
|
'description' => 'Stuur een e-mailuitnodiging om medewerkers toe te voegen',
|
|
'email' => 'E-mail',
|
|
'email_placeholder' => 'medewerker@email.com',
|
|
'role' => 'Rol',
|
|
'role_placeholder' => 'Selecteer een rol',
|
|
'submit' => 'Uitnodiging versturen',
|
|
],
|
|
|
|
'pending' => [
|
|
'title' => 'Openstaande uitnodigingen',
|
|
'description' => 'Uitnodigingen die op acceptatie wachten',
|
|
'empty' => 'Geen openstaande uitnodigingen',
|
|
],
|
|
|
|
'list' => [
|
|
'title' => 'Leden',
|
|
'description' => 'Mensen met toegang tot deze workspace',
|
|
'empty' => 'Geen leden behalve de eigenaar',
|
|
],
|
|
|
|
'remove_modal' => [
|
|
'title' => 'Lid verwijderen',
|
|
'description' => 'Weet je zeker dat je dit lid uit de workspace wilt verwijderen? Ze verliezen de toegang tot alle workspacebronnen.',
|
|
'action' => 'Lid verwijderen',
|
|
],
|
|
|
|
'cancel_invite_modal' => [
|
|
'title' => 'Uitnodiging annuleren',
|
|
'description' => 'Weet je zeker dat je deze uitnodiging wilt annuleren?',
|
|
'action' => 'Uitnodiging annuleren',
|
|
],
|
|
|
|
'roles' => [
|
|
'owner' => 'Eigenaar',
|
|
'admin' => 'Beheerder',
|
|
'member' => 'Lid',
|
|
'viewer' => 'Kijker',
|
|
],
|
|
|
|
'errors' => [
|
|
'invite_exists' => 'Er bestaat al een uitnodiging voor dit e-mailadres.',
|
|
'email_belongs_to_account' => 'Dit e-mailadres behoort al tot een ander TryPost-account. Vraag om een speciaal werk-e-mailadres.',
|
|
],
|
|
|
|
'flash' => [
|
|
'invite_sent' => 'Uitnodiging succesvol verstuurd!',
|
|
'invite_deleted' => 'Uitnodiging verwijderd.',
|
|
'member_removed' => 'Lid succesvol verwijderd.',
|
|
'role_updated' => 'Rol van lid bijgewerkt.',
|
|
'wrong_email' => 'Deze uitnodiging is voor een ander e-mailadres.',
|
|
'already_member' => 'Je bent al lid van deze workspace.',
|
|
'invite_accepted' => 'Welkom! Je bent nu lid van de workspace.',
|
|
'invite_workspace_gone' => 'Deze uitnodiging is niet meer geldig omdat de workspace is verwijderd.',
|
|
'invite_declined' => 'Uitnodiging geweigerd.',
|
|
],
|
|
],
|
|
|
|
'account' => [
|
|
'tabs' => [
|
|
'account' => 'Account',
|
|
'usage' => 'Gebruik',
|
|
'billing' => 'Facturatie',
|
|
],
|
|
'title' => 'Accountinstellingen',
|
|
'description' => 'Beheer je accountnaam en factuur-e-mailadres',
|
|
'name' => 'Accountnaam',
|
|
'name_placeholder' => 'Mijn bedrijf',
|
|
'billing_email' => 'Factuur-e-mailadres',
|
|
'billing_email_placeholder' => 'facturatie@bedrijf.com',
|
|
'billing_email_hint' => 'Dit e-mailadres wordt gebruikt voor facturen en factuurcommunicatie van Stripe.',
|
|
'submit' => 'Opslaan',
|
|
],
|
|
|
|
'flash' => [
|
|
'account_updated' => 'Account succesvol bijgewerkt!',
|
|
'profile_updated' => 'Profiel succesvol bijgewerkt!',
|
|
'password_updated' => 'Wachtwoord succesvol bijgewerkt!',
|
|
'workspace_updated' => 'Instellingen succesvol bijgewerkt!',
|
|
'photo_updated' => 'Foto succesvol bijgewerkt!',
|
|
'photo_deleted' => 'Foto succesvol verwijderd!',
|
|
'delete_failed_billing' => 'We konden je abonnement bij de betalingsprovider niet annuleren. Er is niets verwijderd. Probeer het opnieuw of neem contact op met support.',
|
|
'logo_updated' => 'Logo succesvol geüpload!',
|
|
'logo_deleted' => 'Logo succesvol verwijderd!',
|
|
'notifications_updated' => 'Meldingsvoorkeuren bijgewerkt!',
|
|
],
|
|
|
|
'api_keys' => [
|
|
'title' => 'API-sleutels',
|
|
'page_title' => 'API-sleutels',
|
|
'heading' => 'API-sleutels',
|
|
'description' => 'Beheer API-sleutels voor programmatische toegang tot je workspace.',
|
|
'create' => 'API-sleutel aanmaken',
|
|
'copy' => 'Kopiëren',
|
|
'new_token_message' => 'Je nieuwe API-sleutel is aangemaakt. Kopieer hem nu — je kunt hem later niet meer zien.',
|
|
'table' => [
|
|
'name' => 'Naam',
|
|
'key' => 'Sleutel',
|
|
'status' => 'Status',
|
|
'expires' => 'Verloopt',
|
|
'last_used' => 'Laatst gebruikt',
|
|
'never' => 'Nooit',
|
|
],
|
|
'actions' => [
|
|
'copy_id' => 'API-sleutel-ID kopiëren',
|
|
'copy_id_success' => 'API-sleutel-ID gekopieerd naar klembord',
|
|
'delete' => 'Verwijderen',
|
|
],
|
|
'empty' => [
|
|
'title' => 'Nog geen API-sleutels',
|
|
'description' => 'Maak een API-sleutel aan om programmatisch toegang te krijgen tot je workspace.',
|
|
],
|
|
'delete_modal' => [
|
|
'title' => 'API-sleutel verwijderen',
|
|
'description' => 'Weet je zeker dat je deze API-sleutel wilt verwijderen? Alle applicaties die deze sleutel gebruiken verliezen direct de toegang.',
|
|
'action' => 'API-sleutel verwijderen',
|
|
],
|
|
'create_dialog' => [
|
|
'title' => 'API-sleutel aanmaken',
|
|
'description' => 'Maak een nieuwe API-sleutel aan voor programmatische toegang tot je workspace.',
|
|
'name' => 'Naam',
|
|
'name_placeholder' => 'bijv. Productie-API-sleutel',
|
|
'expires' => 'Vervaldatum (optioneel)',
|
|
'expires_placeholder' => 'Geen vervaldatum',
|
|
'submit' => 'Aanmaken',
|
|
'cancel' => 'Annuleren',
|
|
],
|
|
'flash' => [
|
|
'created' => 'API-sleutel succesvol aangemaakt!',
|
|
'deleted' => 'API-sleutel succesvol verwijderd!',
|
|
],
|
|
],
|
|
];
|