trypost/lang/es/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

385 lines
18 KiB
PHP

<?php
return [
'title' => 'Configuración',
'description' => 'Administra tu perfil y configuración de la cuenta',
'hub' => [
'title' => 'Configuración',
'description' => 'Elige qué quieres gestionar.',
'profile' => [
'title' => 'Perfil',
'description' => 'Actualiza tu información personal, contraseña y preferencias de notificaciones.',
],
'workspace' => [
'title' => 'Workspace',
'description' => 'Configura tu workspace, marca, miembros y claves de API.',
],
'account' => [
'title' => 'Cuenta',
'description' => 'Gestiona la información de la cuenta, uso y facturación.',
],
],
'nav' => [
'profile' => 'Perfil',
'authentication' => 'Autenticación',
'workspace' => 'Workspace',
'members' => 'Miembros',
'notifications' => 'Notificaciones',
'billing' => 'Facturación',
],
'notifications' => [
'title' => 'Preferencias de notificaciones',
'heading' => 'Notificaciones por correo',
'description' => 'Elige qué notificaciones por correo deseas recibir',
'post_published' => 'Post publicado',
'post_published_description' => 'Recibir un correo cuando tu post se publique correctamente',
'post_failed' => 'Post fallido',
'post_failed_description' => 'Recibir un correo cuando tu post falle al publicar',
'account_disconnected' => 'Cuenta desconectada',
'account_disconnected_description' => 'Recibir un correo cuando una cuenta social se desconecte',
'save' => 'Guardar preferencias',
],
'profile' => [
'title' => 'Configuración del perfil',
'photo_heading' => 'Foto de perfil',
'photo_description' => 'Sube una foto de perfil',
'heading' => 'Información del perfil',
'description' => 'Actualiza tu nombre y correo electrónico',
'avatar' => 'Avatar',
'name' => 'Nombre',
'name_placeholder' => 'Nombre completo',
'email' => 'Correo electrónico',
'email_placeholder' => 'Correo electrónico',
'email_unverified' => 'Tu correo electrónico no ha sido verificado.',
'resend_verification' => 'Haz clic aquí para reenviar el correo de verificación.',
'verification_sent' => 'Se ha enviado un nuevo enlace de verificación a tu correo electrónico.',
'save' => 'Guardar',
],
'authentication' => [
'title' => 'Autenticación',
'page_title' => 'Configuración de autenticación',
'sessions' => [
'title' => 'Sesiones activas',
'description' => 'Si notas algo sospechoso, cierra sesión en otros dispositivos.',
'unknown_browser' => 'Navegador desconocido',
'unknown_ip' => 'IP desconocida',
'on' => 'en',
'active_now' => 'Activa ahora',
'log_out_others' => 'Cerrar otras sesiones',
'modal_title' => 'Cerrar otras sesiones',
'modal_description_password' => 'Introduce tu contraseña actual para confirmar el cierre de las demás sesiones.',
'modal_description_email' => 'Escribe tu correo electrónico para confirmar el cierre de las demás sesiones.',
'password_placeholder' => 'Contraseña actual',
'email_placeholder' => 'Tu correo',
'cancel' => 'Cancelar',
'submit' => 'Cerrar otras sesiones',
'email_mismatch' => 'El correo electrónico no coincide con tu cuenta.',
'flash_logged_out' => 'Has cerrado sesión en los demás dispositivos.',
],
'password' => [
'update_title' => 'Actualizar contraseña',
'set_title' => 'Definir una contraseña',
'update_description' => 'Asegúrate de usar una contraseña larga y aleatoria para mantener tu cuenta segura.',
'set_description' => 'Añade una contraseña para iniciar sesión sin un proveedor conectado.',
'current_password' => 'Contraseña actual',
'new_password' => 'Nueva contraseña',
'confirm_password' => 'Confirmar contraseña',
'save' => 'Guardar contraseña',
'set' => 'Definir contraseña',
],
'providers' => [
'title' => 'Cuentas conectadas',
'description' => 'Inicia sesión más rápido con estos proveedores conectados.',
'connected' => 'Conectada',
'not_connected' => 'No conectada',
'connect' => 'Conectar',
'disconnect' => 'Desconectar',
'flash_disconnected' => ':provider desconectada correctamente.',
'flash_connected' => ':provider conectada correctamente.',
'flash_already_linked' => 'Esa cuenta de :provider ya está vinculada a otro usuario.',
'flash_cannot_disconnect' => 'No puedes desconectar tu único método de inicio de sesión. Define una contraseña o conecta otro proveedor primero.',
],
],
'delete_account' => [
'heading' => 'Eliminar cuenta',
'description' => 'Elimina tu cuenta y todos sus recursos',
'warning' => 'Advertencia',
'warning_message' => 'Procede con cuidado: esto no se puede deshacer. Si eres el propietario de esta cuenta, los miembros invitados también se eliminarán de forma permanente.',
'button' => 'Eliminar cuenta',
'modal_title' => '¿Estás seguro de que deseas eliminar tu cuenta?',
'modal_description_password' => 'Una vez eliminada, todos sus recursos y datos también se eliminarán permanentemente. Si eres el propietario de la cuenta, los miembros invitados también se eliminarán de forma permanente. Introduce tu contraseña para confirmar.',
'modal_description_email' => 'Una vez eliminada, todos sus recursos y datos también se eliminarán permanentemente. Si eres el propietario de la cuenta, los miembros invitados también se eliminarán de forma permanente. Escribe tu correo :email para confirmar.',
'password' => 'Contraseña',
'password_placeholder' => 'Contraseña',
'email_placeholder' => 'Tu correo',
'email_mismatch' => 'El correo electrónico no coincide con tu cuenta.',
'cancel' => 'Cancelar',
'confirm' => 'Eliminar cuenta',
],
'workspace' => [
'tabs' => [
'workspace' => 'Workspace',
'brand' => 'Marca',
'users' => 'Miembros',
'api_keys' => 'API Keys',
'mcp' => 'MCP',
],
'title' => 'Configuración del workspace',
'logo_heading' => 'Logo del workspace',
'logo_description' => 'Sube un logo para tu workspace',
'heading' => 'Nombre del workspace',
'description' => 'Actualiza el nombre del workspace',
'members_heading' => 'Miembros',
'members_description' => 'Administra miembros e invitaciones del workspace',
'name' => 'Nombre',
'name_placeholder' => 'Mi Workspace',
'save' => 'Guardar',
'danger_description' => 'Acciones irreversibles.',
'delete_warning' => 'Advertencia',
'delete_title' => 'Eliminar este workspace',
'delete_description' => 'Elimina este workspace de forma permanente, incluyendo publicaciones, cuentas conectadas y medios. Pasarás a pagar por un workspace menos.',
'delete_description_self_hosted' => 'Elimina permanentemente este workspace, sus publicaciones, cuentas conectadas y medios.',
'delete_only_description' => 'No puedes eliminar tu único workspace. Cancela la suscripción en facturación para dejar de pagar, o elimina tu cuenta en Autenticación para cancelar la facturación y borrar todo de forma permanente.',
'delete_go_to_billing' => 'Ir a facturación',
'delete_go_to_delete_account' => 'Eliminar cuenta',
'delete_members_warning' => '{1}:count miembro más perderá el acceso. Los miembros sin otro workspace en TryPost se eliminarán de forma permanente.|[2,*]:count miembros más perderán el acceso. Los miembros sin otro workspace en TryPost se eliminarán de forma permanente.',
'delete_action' => 'Eliminar workspace',
'delete_cancel' => 'Cancelar',
'delete_confirm_title' => '¿Eliminar workspace?',
'delete_confirm_description' => 'Esto elimina permanentemente el workspace y todos sus datos. Tu facturación se actualizará para reflejar un workspace menos.',
'delete_confirm_description_self_hosted' => 'Esto elimina permanentemente el workspace y todos sus datos.',
],
'brand' => [
'title' => 'Marca',
'description' => 'Configura la identidad de tu marca para el contenido generado por IA.',
'name' => 'Nombre del workspace',
'name_placeholder' => 'Mi marca',
'website' => 'Sitio web',
'website_placeholder' => 'https://tumarca.com',
'brand_description' => 'Descripción',
'brand_description_placeholder' => 'Cuéntanos sobre tu marca, lo que haces y quién es tu audiencia...',
'voice' => 'Voz de marca',
'voice_description' => 'Elige los rasgos que definen cómo suena tu contenido.',
'voice_group' => [
'pov' => 'Punto de vista',
'formality' => 'Formalidad',
'energy' => 'Energía',
'humor' => 'Humor',
'attitude' => 'Actitud',
'warmth' => 'Calidez',
'confidence' => 'Confianza',
'style' => 'Estilo',
],
'voice_trait' => [
'first_person' => 'Primera persona',
'second_person' => 'Segunda persona (tú)',
'third_person' => 'Tercera persona',
'formal' => 'Formal',
'balanced' => 'Equilibrado',
'casual' => 'Casual',
'calm' => 'Calmo',
'moderate' => 'Moderado',
'enthusiastic' => 'Entusiasta',
'vibrant' => 'Vibrante',
'serious' => 'Serio',
'dry' => 'Sutil / seco',
'witty' => 'Ingenioso',
'playful' => 'Juguetón',
'respectful' => 'Respetuoso',
'even_handed' => 'Equilibrado',
'bold' => 'Audaz',
'provocative' => 'Provocador',
'neutral' => 'Neutro',
'friendly' => 'Amigable',
'empathetic' => 'Empático',
'humble' => 'Humilde',
'confident' => 'Seguro',
'assertive' => 'Asertivo',
'direct' => 'Directo',
'concise' => 'Conciso',
'transparent' => 'Transparente',
'no_hype' => 'Sin hype',
'practical' => 'Práctico',
'data_driven' => 'Basado en datos',
'storytelling' => 'Narrativo',
'inspirational' => 'Inspiracional',
'educational' => 'Educativo',
'technical' => 'Técnico',
'minimalist' => 'Pocos emojis',
],
'brand_color' => 'Color de marca',
'background_color' => 'Color de fondo',
'text_color' => 'Color de texto',
'font' => 'Fuente',
'image_style' => 'Estilo de imágenes',
'image_style_description' => 'Estilo visual aplicado al generar imágenes de diapositivas y portadas para publicaciones con IA.',
'image_style_cinematic' => 'Cinematográfico',
'image_style_illustration' => 'Ilustración',
'image_style_isometric_3d' => 'Isométrico',
'image_style_cartoon' => 'Cartoon',
'image_style_typographic' => 'Tipográfico',
'image_style_infographic' => 'Infográfico',
'image_style_minimalist' => 'Minimalista',
'image_style_mockup' => 'Mockup',
'content_language' => 'Idioma del contenido',
'content_language_description' => 'Idioma usado en los subtítulos, hashtags y cualquier texto dentro de imágenes o videos generados por IA.',
'font_placeholder' => 'Seleccionar una fuente…',
'font_search' => 'Buscar fuente…',
'font_empty' => 'No hay fuentes que coincidan.',
'language_placeholder' => 'Seleccionar un idioma…',
'language_search' => 'Buscar idioma…',
'language_empty' => 'No se encontró ningún idioma.',
],
'members' => [
'title' => 'Miembros',
'heading' => 'Miembros del equipo',
'description' => 'Administra miembros e invitaciones de este workspace',
'cancel' => 'Cancelar',
'remove' => 'Eliminar',
'make_role' => 'Hacer :role',
'invite' => [
'title' => 'Invitar miembro',
'description' => 'Envía una invitación por correo para agregar colaboradores',
'email' => 'Correo electrónico',
'email_placeholder' => 'colaborador@email.com',
'role' => 'Rol',
'role_placeholder' => 'Selecciona un rol',
'submit' => 'Enviar invitación',
],
'pending' => [
'title' => 'Invitaciones pendientes',
'description' => 'Invitaciones en espera de aceptación',
'empty' => 'No hay invitaciones pendientes',
],
'list' => [
'title' => 'Miembros',
'description' => 'Personas con acceso a este workspace',
'empty' => 'No hay miembros además del propietario',
],
'remove_modal' => [
'title' => 'Eliminar miembro',
'description' => '¿Estás seguro de que deseas eliminar a este miembro del workspace? Perderá acceso a todos los recursos del workspace.',
'action' => 'Eliminar miembro',
],
'cancel_invite_modal' => [
'title' => 'Cancelar invitación',
'description' => '¿Estás seguro de que deseas cancelar esta invitación?',
'action' => 'Cancelar invitación',
],
'roles' => [
'owner' => 'Propietario',
'admin' => 'Administrador',
'member' => 'Miembro',
'viewer' => 'Espectador',
],
'errors' => [
'invite_exists' => 'Ya existe una invitación para este correo.',
'email_belongs_to_account' => 'Este correo ya pertenece a otra cuenta de TryPost. Pide un correo de trabajo dedicado.',
],
'flash' => [
'invite_sent' => '¡Invitación enviada correctamente!',
'invite_deleted' => 'Invitación eliminada.',
'member_removed' => '¡Miembro eliminado correctamente!',
'role_updated' => 'Rol del miembro actualizado.',
'wrong_email' => 'Esta invitación es para otro correo electrónico.',
'already_member' => 'Ya eres miembro de este workspace.',
'invite_accepted' => '¡Bienvenido! Ahora eres miembro del workspace.',
'invite_workspace_gone' => 'Esta invitación ya no es válida porque el workspace fue eliminado.',
'invite_declined' => 'Invitación rechazada.',
],
],
'account' => [
'tabs' => [
'account' => 'Cuenta',
'usage' => 'Uso',
'billing' => 'Facturación',
],
'title' => 'Configuración de cuenta',
'description' => 'Gestiona el nombre de la cuenta y el correo de facturación',
'name' => 'Nombre de la cuenta',
'name_placeholder' => 'Mi Empresa',
'billing_email' => 'Correo de facturación',
'billing_email_placeholder' => 'facturacion@empresa.com',
'billing_email_hint' => 'Este correo se usará para facturas y comunicaciones de facturación de Stripe.',
'submit' => 'Guardar',
],
'flash' => [
'account_updated' => '¡Cuenta actualizada correctamente!',
'profile_updated' => '¡Perfil actualizado correctamente!',
'password_updated' => '¡Contraseña actualizada correctamente!',
'workspace_updated' => '¡Configuración actualizada correctamente!',
'photo_updated' => '¡Foto actualizada correctamente!',
'photo_deleted' => '¡Foto eliminada correctamente!',
'delete_failed_billing' => 'No pudimos cancelar tu suscripción con el proveedor de facturación. No se eliminó nada. Inténtalo de nuevo o contacta con soporte.',
'logo_updated' => '¡Logo subido correctamente!',
'logo_deleted' => '¡Logo eliminado correctamente!',
'notifications_updated' => '¡Preferencias de notificaciones actualizadas!',
],
'api_keys' => [
'title' => 'Claves API',
'page_title' => 'Claves API',
'heading' => 'Claves API',
'description' => 'Administra claves API para acceso programático a tu workspace.',
'create' => 'Crear clave API',
'copy' => 'Copiar',
'new_token_message' => 'Tu nueva clave API ha sido creada. Cópiala ahora — no podrás verla de nuevo.',
'table' => [
'name' => 'Nombre',
'key' => 'Clave',
'status' => 'Estado',
'expires' => 'Expira',
'last_used' => 'Último uso',
'never' => 'Nunca',
],
'actions' => [
'copy_id' => 'Copiar ID de clave API',
'copy_id_success' => 'ID de clave API copiado',
'delete' => 'Eliminar',
],
'empty' => [
'title' => 'No hay claves API',
'description' => 'Crea una clave API para acceder a tu workspace programáticamente.',
],
'delete_modal' => [
'title' => 'Eliminar clave API',
'description' => '¿Estás seguro de que deseas eliminar esta clave API? Las aplicaciones que la usen perderán acceso inmediatamente.',
'action' => 'Eliminar clave API',
],
'create_dialog' => [
'title' => 'Crear clave API',
'description' => 'Crea una nueva clave API para acceso programático a tu workspace.',
'name' => 'Nombre',
'name_placeholder' => 'ej. Clave API de Producción',
'expires' => 'Fecha de expiración (opcional)',
'expires_placeholder' => 'Sin expiración',
'submit' => 'Crear',
'cancel' => 'Cancelar',
],
'flash' => [
'created' => '¡Clave API creada correctamente!',
'deleted' => '¡Clave API eliminada correctamente!',
],
],
];