trypost/lang/pt-BR/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' => 'Configurações',
'description' => 'Gerencie seu perfil e configurações da conta',
'hub' => [
'title' => 'Configurações',
'description' => 'Escolha o que você quer gerenciar.',
'profile' => [
'title' => 'Perfil',
'description' => 'Atualize suas informações pessoais, senha e preferências de notificações.',
],
'workspace' => [
'title' => 'Workspace',
'description' => 'Configure seu workspace, marca, membros e chaves de API.',
],
'account' => [
'title' => 'Conta',
'description' => 'Gerencie informações da conta, uso e faturamento.',
],
],
'nav' => [
'profile' => 'Perfil',
'authentication' => 'Autenticação',
'workspace' => 'Workspace',
'members' => 'Membros',
'notifications' => 'Notificações',
'billing' => 'Faturamento',
],
'notifications' => [
'title' => 'Preferências de notificações',
'heading' => 'Notificações por e-mail',
'description' => 'Escolha quais notificações por e-mail deseja receber',
'post_published' => 'Post publicado',
'post_published_description' => 'Receber um e-mail quando seu post for publicado com sucesso',
'post_failed' => 'Post falhou',
'post_failed_description' => 'Receber um e-mail quando seu post falhar ao publicar',
'account_disconnected' => 'Conta desconectada',
'account_disconnected_description' => 'Receber um e-mail quando uma conta social for desconectada',
'save' => 'Salvar preferências',
],
'profile' => [
'title' => 'Configurações do perfil',
'photo_heading' => 'Foto do perfil',
'photo_description' => 'Envie uma foto de perfil',
'heading' => 'Informações do perfil',
'description' => 'Atualize seu nome e endereço de e-mail',
'avatar' => 'Avatar',
'name' => 'Nome',
'name_placeholder' => 'Nome completo',
'email' => 'Endereço de e-mail',
'email_placeholder' => 'Endereço de e-mail',
'email_unverified' => 'Seu endereço de e-mail não foi verificado.',
'resend_verification' => 'Clique aqui para reenviar o e-mail de verificação.',
'verification_sent' => 'Um novo link de verificação foi enviado para seu endereço de e-mail.',
'save' => 'Salvar',
],
'authentication' => [
'title' => 'Autenticação',
'page_title' => 'Configurações de autenticação',
'sessions' => [
'title' => 'Sessões ativas',
'description' => 'Se você notar algo suspeito, encerre as sessões em outros dispositivos.',
'unknown_browser' => 'Navegador desconhecido',
'unknown_ip' => 'IP desconhecido',
'on' => 'em',
'active_now' => 'Ativa agora',
'log_out_others' => 'Encerrar outras sessões',
'modal_title' => 'Encerrar outras sessões',
'modal_description_password' => 'Digite sua senha atual para confirmar o encerramento das outras sessões.',
'modal_description_email' => 'Digite seu e-mail para confirmar o encerramento das outras sessões.',
'password_placeholder' => 'Senha atual',
'email_placeholder' => 'Seu e-mail',
'cancel' => 'Cancelar',
'submit' => 'Encerrar outras sessões',
'email_mismatch' => 'O e-mail não corresponde à sua conta.',
'flash_logged_out' => 'Outras sessões foram encerradas.',
],
'password' => [
'update_title' => 'Atualizar senha',
'set_title' => 'Definir uma senha',
'update_description' => 'Use uma senha longa e aleatória para manter sua conta segura.',
'set_description' => 'Adicione uma senha para entrar sem precisar de um provedor conectado.',
'current_password' => 'Senha atual',
'new_password' => 'Nova senha',
'confirm_password' => 'Confirmar senha',
'save' => 'Salvar senha',
'set' => 'Definir senha',
],
'providers' => [
'title' => 'Contas conectadas',
'description' => 'Faça login mais rápido usando esses provedores conectados.',
'connected' => 'Conectada',
'not_connected' => 'Não conectada',
'connect' => 'Conectar',
'disconnect' => 'Desconectar',
'flash_disconnected' => ':provider desconectada com sucesso.',
'flash_connected' => ':provider conectada com sucesso.',
'flash_already_linked' => 'Essa conta do :provider já está vinculada a outro usuário.',
'flash_cannot_disconnect' => 'Você não pode desconectar seu único método de login. Defina uma senha ou conecte outro provedor primeiro.',
],
],
'delete_account' => [
'heading' => 'Excluir conta',
'description' => 'Exclua sua conta e todos os seus recursos',
'warning' => 'Atenção',
'warning_message' => 'Continue com cuidado: isso não pode ser desfeito. Se você for o dono desta conta, os membros convidados também serão excluídos permanentemente.',
'button' => 'Excluir conta',
'modal_title' => 'Tem certeza que deseja excluir sua conta?',
'modal_description_password' => 'Uma vez excluída, todos os seus recursos e dados também serão permanentemente removidos. Se você for o dono da conta, os membros convidados também serão excluídos permanentemente. Digite sua senha para confirmar.',
'modal_description_email' => 'Uma vez excluída, todos os seus recursos e dados também serão permanentemente removidos. Se você for o dono da conta, os membros convidados também serão excluídos permanentemente. Digite o seu e-mail :email para confirmar.',
'password' => 'Senha',
'password_placeholder' => 'Senha',
'email_placeholder' => 'Seu e-mail',
'email_mismatch' => 'O e-mail não corresponde à sua conta.',
'cancel' => 'Cancelar',
'confirm' => 'Excluir conta',
],
'workspace' => [
'tabs' => [
'workspace' => 'Workspace',
'brand' => 'Marca',
'users' => 'Membros',
'api_keys' => 'API Keys',
'mcp' => 'MCP',
],
'title' => 'Configurações do workspace',
'logo_heading' => 'Logo do workspace',
'logo_description' => 'Envie um logo para o workspace',
'heading' => 'Nome do workspace',
'description' => 'Atualize o nome do workspace',
'members_heading' => 'Membros',
'members_description' => 'Gerencie membros e convites do workspace',
'name' => 'Nome',
'name_placeholder' => 'Meu Workspace',
'save' => 'Salvar',
'danger_description' => 'Ações irreversíveis.',
'delete_warning' => 'Atenção',
'delete_title' => 'Excluir este workspace',
'delete_description' => 'Exclui este workspace de forma permanente, incluindo posts, contas conectadas e mídia. Você passa a ser cobrado por um workspace a menos.',
'delete_description_self_hosted' => 'Exclui permanentemente este workspace, seus posts, contas conectadas e mídia.',
'delete_only_description' => 'Você não pode excluir seu único workspace. Cancele a assinatura na cobrança para parar de pagar, ou exclua sua conta em Autenticação para cancelar a cobrança e remover tudo permanentemente.',
'delete_go_to_billing' => 'Ir para cobrança',
'delete_go_to_delete_account' => 'Excluir conta',
'delete_members_warning' => '{1}:count outro membro perderá o acesso. Membros sem outro workspace no TryPost terão a conta excluída permanentemente.|[2,*]:count outros membros perderão o acesso. Membros sem outro workspace no TryPost terão a conta excluída permanentemente.',
'delete_action' => 'Excluir workspace',
'delete_cancel' => 'Cancelar',
'delete_confirm_title' => 'Excluir workspace?',
'delete_confirm_description' => 'Isso exclui permanentemente o workspace e todos os seus dados. Sua cobrança será atualizada para refletir um workspace a menos.',
'delete_confirm_description_self_hosted' => 'Isso exclui permanentemente o workspace e todos os seus dados.',
],
'brand' => [
'title' => 'Marca',
'description' => 'Configure a identidade da sua marca para os conteúdos gerados por AI.',
'name' => 'Nome do workspace',
'name_placeholder' => 'Minha marca',
'website' => 'Site',
'website_placeholder' => 'https://suamarca.com',
'brand_description' => 'Descrição',
'brand_description_placeholder' => 'Conte sobre sua marca, o que você faz e quem é seu público...',
'voice' => 'Voz da marca',
'voice_description' => 'Escolha os traços que definem como seu conteúdo soa.',
'voice_group' => [
'pov' => 'Ponto de vista',
'formality' => 'Formalidade',
'energy' => 'Energia',
'humor' => 'Humor',
'attitude' => 'Atitude',
'warmth' => 'Calor',
'confidence' => 'Confiança',
'style' => 'Estilo',
],
'voice_trait' => [
'first_person' => 'Primeira pessoa',
'second_person' => 'Segunda pessoa (você)',
'third_person' => 'Terceira pessoa',
'formal' => 'Formal',
'balanced' => 'Equilibrado',
'casual' => 'Casual',
'calm' => 'Calmo',
'moderate' => 'Moderado',
'enthusiastic' => 'Entusiasmado',
'vibrant' => 'Vibrante',
'serious' => 'Sério',
'dry' => 'Sutil / seco',
'witty' => 'Bem-humorado',
'playful' => 'Brincalhão',
'respectful' => 'Respeitoso',
'even_handed' => 'Equilibrado',
'bold' => 'Ousado',
'provocative' => 'Provocador',
'neutral' => 'Neutro',
'friendly' => 'Amigável',
'empathetic' => 'Empático',
'humble' => 'Humilde',
'confident' => 'Confiante',
'assertive' => 'Assertivo',
'direct' => 'Direto',
'concise' => 'Conciso',
'transparent' => 'Transparente',
'no_hype' => 'Sem hype',
'practical' => 'Prático',
'data_driven' => 'Baseado em dados',
'storytelling' => 'Narrativo',
'inspirational' => 'Inspiracional',
'educational' => 'Educativo',
'technical' => 'Técnico',
'minimalist' => 'Poucos emojis',
],
'brand_color' => 'Cor da marca',
'background_color' => 'Cor de fundo',
'text_color' => 'Cor do texto',
'font' => 'Fonte',
'image_style' => 'Estilo das imagens',
'image_style_description' => 'Estilo visual aplicado ao gerar imagens de slides e capas para posts com AI.',
'image_style_cinematic' => 'Cinematográfico',
'image_style_illustration' => 'Ilustração',
'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 do conteúdo',
'content_language_description' => 'Idioma usado nas legendas, hashtags e em qualquer texto dentro de imagens ou vídeos gerados por AI.',
'font_placeholder' => 'Selecionar uma fonte…',
'font_search' => 'Buscar fonte…',
'font_empty' => 'Nenhuma fonte encontrada.',
'language_placeholder' => 'Selecionar um idioma…',
'language_search' => 'Buscar idioma…',
'language_empty' => 'Nenhum idioma encontrado.',
],
'members' => [
'title' => 'Membros',
'heading' => 'Membros da equipe',
'description' => 'Gerencie membros e convites deste workspace',
'cancel' => 'Cancelar',
'remove' => 'Remover',
'make_role' => 'Tornar :role',
'invite' => [
'title' => 'Convidar Membro',
'description' => 'Envie um convite por e-mail para adicionar colaboradores',
'email' => 'E-mail',
'email_placeholder' => 'colaborador@email.com',
'role' => 'Função',
'role_placeholder' => 'Selecione uma função',
'submit' => 'Enviar Convite',
],
'pending' => [
'title' => 'Convites Pendentes',
'description' => 'Convites aguardando aceitação',
'empty' => 'Nenhum convite pendente',
],
'list' => [
'title' => 'Membros',
'description' => 'Pessoas com acesso a este workspace',
'empty' => 'Nenhum membro além do proprietário',
],
'remove_modal' => [
'title' => 'Remover membro',
'description' => 'Tem certeza que deseja remover este membro do workspace? Ele perderá acesso a todos os recursos do workspace.',
'action' => 'Remover membro',
],
'cancel_invite_modal' => [
'title' => 'Cancelar convite',
'description' => 'Tem certeza que deseja cancelar este convite?',
'action' => 'Cancelar convite',
],
'roles' => [
'owner' => 'Proprietário',
'admin' => 'Administrador',
'member' => 'Membro',
'viewer' => 'Visualizador',
],
'errors' => [
'invite_exists' => 'Já existe um convite para este e-mail.',
'email_belongs_to_account' => 'Este e-mail já pertence a outra conta TryPost. Peça um e-mail de trabalho dedicado.',
],
'flash' => [
'invite_sent' => 'Convite enviado com sucesso!',
'invite_deleted' => 'Convite excluído.',
'member_removed' => 'Membro removido com sucesso.',
'role_updated' => 'Função do membro atualizada.',
'wrong_email' => 'Este convite é para um endereço de e-mail diferente.',
'already_member' => 'Você já é membro deste workspace.',
'invite_accepted' => 'Bem-vindo! Você agora é membro do workspace.',
'invite_workspace_gone' => 'Este convite não é mais válido porque o workspace foi excluído.',
'invite_declined' => 'Convite recusado.',
],
],
'account' => [
'tabs' => [
'account' => 'Conta',
'usage' => 'Uso',
'billing' => 'Faturamento',
],
'title' => 'Configurações da conta',
'description' => 'Gerencie o nome da conta e o e-mail de cobrança',
'name' => 'Nome da conta',
'name_placeholder' => 'Minha Empresa',
'billing_email' => 'E-mail de cobrança',
'billing_email_placeholder' => 'cobranca@empresa.com',
'billing_email_hint' => 'Este e-mail será usado para faturas e comunicações de cobrança do Stripe.',
'submit' => 'Salvar',
],
'flash' => [
'account_updated' => 'Conta atualizada com sucesso!',
'profile_updated' => 'Perfil atualizado com sucesso!',
'password_updated' => 'Senha atualizada com sucesso!',
'workspace_updated' => 'Configurações atualizadas com sucesso!',
'photo_updated' => 'Foto atualizada com sucesso!',
'photo_deleted' => 'Foto removida com sucesso!',
'delete_failed_billing' => 'Não foi possível cancelar sua assinatura no provedor de cobrança. Nada foi excluído. Tente novamente ou entre em contato com o suporte.',
'logo_updated' => 'Logo enviado com sucesso!',
'logo_deleted' => 'Logo removido com sucesso!',
'notifications_updated' => 'Preferências de notificações atualizadas!',
],
'api_keys' => [
'title' => 'Chaves API',
'page_title' => 'Chaves API',
'heading' => 'Chaves API',
'description' => 'Gerencie chaves API para acesso programático ao seu workspace.',
'create' => 'Criar chave API',
'copy' => 'Copiar',
'new_token_message' => 'Sua nova chave API foi criada. Copie agora — você não poderá vê-la novamente.',
'table' => [
'name' => 'Nome',
'key' => 'Chave',
'status' => 'Status',
'expires' => 'Expira',
'last_used' => 'Último uso',
'never' => 'Nunca',
],
'actions' => [
'copy_id' => 'Copiar ID da chave API',
'copy_id_success' => 'ID da chave API copiado',
'delete' => 'Excluir',
],
'empty' => [
'title' => 'Nenhuma chave API',
'description' => 'Crie uma chave API para acessar seu workspace programaticamente.',
],
'delete_modal' => [
'title' => 'Excluir chave API',
'description' => 'Tem certeza que deseja excluir esta chave API? Aplicações que a usam perderão acesso imediatamente.',
'action' => 'Excluir chave API',
],
'create_dialog' => [
'title' => 'Criar chave API',
'description' => 'Crie uma nova chave API para acesso programático ao seu workspace.',
'name' => 'Nome',
'name_placeholder' => 'ex. Chave API de Produção',
'expires' => 'Data de expiração (opcional)',
'expires_placeholder' => 'Sem expiração',
'submit' => 'Criar',
'cancel' => 'Cancelar',
],
'flash' => [
'created' => 'Chave de API criada com sucesso!',
'deleted' => 'Chave de API excluída com sucesso!',
],
],
];