trypost/lang/ru/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
24 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
return [
'title' => 'Настройки',
'description' => 'Управляйте профилем и настройками аккаунта',
'hub' => [
'title' => 'Настройки',
'description' => 'Выберите, чем хотите управлять.',
'profile' => [
'title' => 'Профиль',
'description' => 'Обновите личные данные, пароль и настройки уведомлений.',
],
'workspace' => [
'title' => 'Рабочее пространство',
'description' => 'Настройте рабочее пространство, бренд, участников и API-ключи.',
],
'account' => [
'title' => 'Аккаунт',
'description' => 'Управляйте данными аккаунта, использованием и оплатой.',
],
],
'nav' => [
'profile' => 'Профиль',
'authentication' => 'Аутентификация',
'workspace' => 'Рабочее пространство',
'members' => 'Участники',
'notifications' => 'Уведомления',
'billing' => 'Оплата',
],
'notifications' => [
'title' => 'Настройки уведомлений',
'heading' => 'Email-уведомления',
'description' => 'Выберите, какие email-уведомления хотите получать',
'post_published' => 'Пост опубликован',
'post_published_description' => 'Получать письмо, когда ваш пост успешно опубликован',
'post_failed' => 'Ошибка публикации поста',
'post_failed_description' => 'Получать письмо, когда пост не удаётся опубликовать',
'account_disconnected' => 'Аккаунт отключён',
'account_disconnected_description' => 'Получать письмо, когда социальный аккаунт отключается',
'save' => 'Сохранить настройки',
],
'profile' => [
'title' => 'Настройки профиля',
'photo_heading' => 'Фото профиля',
'photo_description' => 'Загрузите фото профиля',
'heading' => 'Информация профиля',
'description' => 'Обновите имя и адрес email',
'avatar' => 'Аватар',
'name' => 'Имя',
'name_placeholder' => 'Полное имя',
'email' => 'Адрес email',
'email_placeholder' => 'Адрес email',
'email_unverified' => 'Ваш адрес email не подтверждён.',
'resend_verification' => 'Нажмите здесь, чтобы отправить письмо для подтверждения повторно.',
'verification_sent' => 'Новая ссылка для подтверждения отправлена на ваш email.',
'save' => 'Сохранить',
],
'authentication' => [
'title' => 'Аутентификация',
'page_title' => 'Настройки аутентификации',
'sessions' => [
'title' => 'Активные сессии',
'description' => 'Если заметите что-то подозрительное, выйдите на других устройствах.',
'unknown_browser' => 'Неизвестный браузер',
'unknown_ip' => 'Неизвестный IP',
'on' => 'на',
'active_now' => 'Активна сейчас',
'log_out_others' => 'Выйти на других устройствах',
'modal_title' => 'Выйти на других устройствах',
'modal_description_password' => 'Введите текущий пароль, чтобы подтвердить выход из других сессий браузера.',
'modal_description_email' => 'Введите свой адрес email, чтобы подтвердить выход из других сессий браузера.',
'password_placeholder' => 'Текущий пароль',
'email_placeholder' => 'Email вашего аккаунта',
'cancel' => 'Отмена',
'submit' => 'Выйти на других устройствах',
'email_mismatch' => 'Адрес email не совпадает с вашим аккаунтом.',
'flash_logged_out' => 'Вы вышли на других устройствах.',
],
'password' => [
'update_title' => 'Обновить пароль',
'set_title' => 'Задать пароль',
'update_description' => 'Убедитесь, что для аккаунта используется длинный случайный пароль для безопасности.',
'set_description' => 'Добавьте пароль, чтобы входить без подключённого провайдера.',
'current_password' => 'Текущий пароль',
'new_password' => 'Новый пароль',
'confirm_password' => 'Подтвердите пароль',
'save' => 'Сохранить пароль',
'set' => 'Задать пароль',
],
'providers' => [
'title' => 'Подключённые аккаунты',
'description' => 'Входите быстрее с помощью этих подключённых провайдеров.',
'connected' => 'Подключено',
'not_connected' => 'Не подключено',
'connect' => 'Подключить',
'disconnect' => 'Отключить',
'flash_disconnected' => ':provider успешно отключён.',
'flash_connected' => ':provider успешно подключён.',
'flash_already_linked' => 'Этот аккаунт :provider уже привязан к другому пользователю.',
'flash_cannot_disconnect' => 'Нельзя отключить единственный способ входа. Сначала задайте пароль или подключите другого провайдера.',
],
],
'delete_account' => [
'heading' => 'Удалить аккаунт',
'description' => 'Удалите аккаунт и все его ресурсы',
'warning' => 'Внимание',
'warning_message' => 'Действуйте осторожно: это нельзя отменить. Если вы владелец этого аккаунта, приглашённые участники также будут удалены навсегда.',
'button' => 'Удалить аккаунт',
'modal_title' => 'Вы уверены, что хотите удалить аккаунт?',
'modal_description_password' => 'После удаления аккаунта все его ресурсы и данные также будут безвозвратно удалены. Если вы владелец аккаунта, приглашённые участники также будут удалены навсегда. Введите пароль для подтверждения.',
'modal_description_email' => 'После удаления аккаунта все его ресурсы и данные также будут безвозвратно удалены. Если вы владелец аккаунта, приглашённые участники также будут удалены навсегда. Введите свой адрес email :email для подтверждения.',
'password' => 'Пароль',
'password_placeholder' => 'Пароль',
'email_placeholder' => 'Email вашего аккаунта',
'email_mismatch' => 'Адрес email не совпадает с вашим аккаунтом.',
'cancel' => 'Отмена',
'confirm' => 'Удалить аккаунт',
],
'workspace' => [
'tabs' => [
'workspace' => 'Рабочее пространство',
'brand' => 'Бренд',
'users' => 'Участники',
'api_keys' => 'API-ключи',
'mcp' => 'MCP',
],
'title' => 'Настройки рабочего пространства',
'logo_heading' => 'Логотип рабочего пространства',
'logo_description' => 'Загрузите логотип для рабочего пространства',
'heading' => 'Название рабочего пространства',
'description' => 'Обновите название рабочего пространства',
'members_heading' => 'Участники',
'members_description' => 'Управляйте участниками и приглашениями рабочего пространства',
'name' => 'Название',
'name_placeholder' => 'Моё рабочее пространство',
'save' => 'Сохранить',
'danger_description' => 'Необратимые действия.',
'delete_warning' => 'Внимание',
'delete_title' => 'Удалить этот workspace',
'delete_description' => 'Безвозвратно удаляет этот workspace и всё в нём — посты, подключённые аккаунты и медиа. Вам будут выставлять счёт на один workspace меньше.',
'delete_description_self_hosted' => 'Безвозвратно удаляет этот workspace, его посты, подключённые аккаунты и медиа.',
'delete_only_description' => 'Вы не можете удалить свой единственный workspace. Отмените подписку в разделе оплаты, чтобы перестать платить, или удалите аккаунт в Аутентификации, чтобы отменить оплату и навсегда удалить всё.',
'delete_go_to_billing' => 'Перейти к оплате',
'delete_go_to_delete_account' => 'Удалить аккаунт',
'delete_members_warning' => '{1}:count другой участник потеряет доступ. Участники без другого workspace в TryPost будут удалены навсегда.|[2,*]:count других участников потеряют доступ. Участники без другого workspace в TryPost будут удалены навсегда.',
'delete_action' => 'Удалить workspace',
'delete_cancel' => 'Отмена',
'delete_confirm_title' => 'Удалить workspace?',
'delete_confirm_description' => 'Это безвозвратно удалит workspace и все его данные. Оплата обновится с учётом на один workspace меньше.',
'delete_confirm_description_self_hosted' => 'Это безвозвратно удалит workspace и все его данные.',
],
'brand' => [
'title' => 'Бренд',
'description' => 'Настройте айдентику бренда для сгенерированного ИИ контента.',
'name' => 'Название рабочего пространства',
'name_placeholder' => 'Мой бренд',
'website' => 'Веб-сайт',
'website_placeholder' => 'https://yourbrand.com',
'brand_description' => 'Описание',
'brand_description_placeholder' => 'Расскажите о своём бренде, чем вы занимаетесь и кто ваша аудитория...',
'voice' => 'Голос бренда',
'voice_description' => 'Выберите черты, определяющие, как звучит ваш контент.',
'voice_group' => [
'pov' => 'Точка зрения',
'formality' => 'Формальность',
'energy' => 'Энергия',
'humor' => 'Юмор',
'attitude' => 'Отношение',
'warmth' => 'Теплота',
'confidence' => 'Уверенность',
'style' => 'Стиль',
],
'voice_trait' => [
'first_person' => 'Первое лицо',
'second_person' => 'Второе лицо (вы)',
'third_person' => 'Третье лицо',
'formal' => 'Формальный',
'balanced' => 'Сбалансированный',
'casual' => 'Непринуждённый',
'calm' => 'Спокойный',
'moderate' => 'Умеренный',
'enthusiastic' => 'Восторженный',
'vibrant' => 'Яркий',
'serious' => 'Серьёзный',
'dry' => 'Сдержанный / тонкий',
'witty' => 'Остроумный',
'playful' => 'Игривый',
'respectful' => 'Уважительный',
'even_handed' => 'Беспристрастный',
'bold' => 'Смелый',
'provocative' => 'Провокационный',
'neutral' => 'Нейтральный',
'friendly' => 'Дружелюбный',
'empathetic' => 'Эмпатичный',
'humble' => 'Скромный',
'confident' => 'Уверенный',
'assertive' => 'Напористый',
'direct' => 'Прямой',
'concise' => 'Лаконичный',
'transparent' => 'Прозрачный',
'no_hype' => 'Без пафоса',
'practical' => 'Практичный',
'data_driven' => 'На основе данных',
'storytelling' => 'Повествовательный',
'inspirational' => 'Вдохновляющий',
'educational' => 'Обучающий',
'technical' => 'Технический',
'minimalist' => 'Мало эмодзи',
],
'brand_color' => 'Цвет бренда',
'background_color' => 'Цвет фона',
'text_color' => 'Цвет текста',
'font' => 'Шрифт',
'image_style' => 'Стиль изображений',
'image_style_description' => 'Визуальный стиль, применяемый при генерации изображений слайдов и обложек для ИИ-постов.',
'image_style_cinematic' => 'Кинематографичный',
'image_style_illustration' => 'Иллюстрация',
'image_style_isometric_3d' => 'Изометрия',
'image_style_cartoon' => 'Мультяшный',
'image_style_typographic' => 'Типографика',
'image_style_infographic' => 'Инфографика',
'image_style_minimalist' => 'Минимализм',
'image_style_mockup' => 'Макет',
'content_language' => 'Язык контента',
'content_language_description' => 'Язык, используемый для сгенерированных ИИ подписей, хэштегов и любого текста внутри сгенерированных изображений или видео.',
'font_placeholder' => 'Выберите шрифт…',
'font_search' => 'Поиск шрифта…',
'font_empty' => 'Шрифты не найдены.',
'language_placeholder' => 'Выберите язык…',
'language_search' => 'Поиск языка…',
'language_empty' => 'Язык не найден.',
],
'members' => [
'title' => 'Участники',
'heading' => 'Участники команды',
'description' => 'Управляйте участниками и приглашениями этого рабочего пространства',
'cancel' => 'Отмена',
'remove' => 'Удалить',
'make_role' => 'Назначить :role',
'invite' => [
'title' => 'Пригласить участника',
'description' => 'Отправьте приглашение по email, чтобы добавить сотрудников',
'email' => 'Email',
'email_placeholder' => 'collaborator@email.com',
'role' => 'Роль',
'role_placeholder' => 'Выберите роль',
'submit' => 'Отправить приглашение',
],
'pending' => [
'title' => 'Ожидающие приглашения',
'description' => 'Приглашения, ожидающие принятия',
'empty' => 'Нет ожидающих приглашений',
],
'list' => [
'title' => 'Участники',
'description' => 'Люди с доступом к этому рабочему пространству',
'empty' => 'Нет участников, кроме владельца',
],
'remove_modal' => [
'title' => 'Удалить участника',
'description' => 'Вы уверены, что хотите удалить этого участника из рабочего пространства? Он потеряет доступ ко всем его ресурсам.',
'action' => 'Удалить участника',
],
'cancel_invite_modal' => [
'title' => 'Отменить приглашение',
'description' => 'Вы уверены, что хотите отменить это приглашение?',
'action' => 'Отменить приглашение',
],
'roles' => [
'owner' => 'Владелец',
'admin' => 'Администратор',
'member' => 'Участник',
'viewer' => 'Наблюдатель',
],
'errors' => [
'invite_exists' => 'Для этого e-mail уже существует приглашение.',
'email_belongs_to_account' => 'Этот e-mail уже принадлежит другому аккаунту TryPost. Попросите выделенный рабочий e-mail.',
],
'flash' => [
'invite_sent' => 'Приглашение успешно отправлено!',
'invite_deleted' => 'Приглашение удалено.',
'member_removed' => 'Участник успешно удалён.',
'role_updated' => 'Роль участника обновлена.',
'wrong_email' => 'Это приглашение для другого адреса email.',
'already_member' => 'Вы уже являетесь участником этого рабочего пространства.',
'invite_accepted' => 'Добро пожаловать! Теперь вы участник рабочего пространства.',
'invite_workspace_gone' => 'Это приглашение больше недействительно, потому что рабочее пространство было удалено.',
'invite_declined' => 'Приглашение отклонено.',
],
],
'account' => [
'tabs' => [
'account' => 'Аккаунт',
'usage' => 'Использование',
'billing' => 'Оплата',
],
'title' => 'Настройки аккаунта',
'description' => 'Управляйте названием аккаунта и email для счетов',
'name' => 'Название аккаунта',
'name_placeholder' => 'Моя компания',
'billing_email' => 'Email для счетов',
'billing_email_placeholder' => 'billing@company.com',
'billing_email_hint' => 'Этот email будет использоваться для счетов и платёжных уведомлений от Stripe.',
'submit' => 'Сохранить',
],
'flash' => [
'account_updated' => 'Аккаунт успешно обновлён!',
'profile_updated' => 'Профиль успешно обновлён!',
'password_updated' => 'Пароль успешно обновлён!',
'workspace_updated' => 'Настройки успешно обновлены!',
'photo_updated' => 'Фото успешно обновлено!',
'photo_deleted' => 'Фото успешно удалено!',
'delete_failed_billing' => 'Не удалось отменить подписку у платёжного провайдера. Ничего не было удалено. Попробуйте снова или обратитесь в поддержку.',
'logo_updated' => 'Логотип успешно загружен!',
'logo_deleted' => 'Логотип успешно удалён!',
'notifications_updated' => 'Настройки уведомлений обновлены!',
],
'api_keys' => [
'title' => 'API-ключи',
'page_title' => 'API-ключи',
'heading' => 'API-ключи',
'description' => 'Управляйте API-ключами для программного доступа к рабочему пространству.',
'create' => 'Создать API-ключ',
'copy' => 'Копировать',
'new_token_message' => 'Ваш новый API-ключ создан. Скопируйте его сейчас — вы больше не сможете его увидеть.',
'table' => [
'name' => 'Название',
'key' => 'Ключ',
'status' => 'Статус',
'expires' => 'Истекает',
'last_used' => 'Последнее использование',
'never' => 'Никогда',
],
'actions' => [
'copy_id' => 'Копировать ID API-ключа',
'copy_id_success' => 'ID API-ключа скопирован в буфер обмена',
'delete' => 'Удалить',
],
'empty' => [
'title' => 'Пока нет API-ключей',
'description' => 'Создайте API-ключ для программного доступа к рабочему пространству.',
],
'delete_modal' => [
'title' => 'Удалить API-ключ',
'description' => 'Вы уверены, что хотите удалить этот API-ключ? Все приложения, использующие этот ключ, немедленно потеряют доступ.',
'action' => 'Удалить API-ключ',
],
'create_dialog' => [
'title' => 'Создать API-ключ',
'description' => 'Создайте новый API-ключ для программного доступа к рабочему пространству.',
'name' => 'Название',
'name_placeholder' => 'например, Продакшн API-ключ',
'expires' => 'Дата истечения (необязательно)',
'expires_placeholder' => 'Без истечения',
'submit' => 'Создать',
'cancel' => 'Отмена',
],
'flash' => [
'created' => 'API-ключ успешно создан!',
'deleted' => 'API-ключ успешно удалён!',
],
],
];