diff --git a/README.ja-JP.md b/README.ja-JP.md index d0e660bc1..a6a868adc 100644 --- a/README.ja-JP.md +++ b/README.ja-JP.md @@ -30,7 +30,7 @@
- English | 简体中文 | 日本語 + English | 简体中文 | 日本語 | Русский
--- diff --git a/README.md b/README.md index f65ac7c6e..c320b1a53 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@- English | 简体中文 | 日本語 + English | 简体中文 | 日本語 | Русский
--- diff --git a/README.ru-RU.md b/README.ru-RU.md new file mode 100644 index 000000000..7fa189c1e --- /dev/null +++ b/README.ru-RU.md @@ -0,0 +1,477 @@ + +
+
+
+Десктоп-интерфейс для AI-агентов OpenClaw +
+ ++Возможности • +Почему ClawX • +Быстрый старт • +Архитектура • +Разработка • +Участие +
+ +
+
+
+
+
+
+
+
+
+
+English | 简体中文 | 日本語 | Русский +
+ +--- + +## Обзор + +**ClawX** — это мост между мощными AI-агентами и повседневными пользователями. Построенный на базе [OpenClaw](https://github.com/OpenClaw), он превращает управление AI через командную строку в доступный и красивый десктоп-опыт — терминал не нужен. + +Автоматизация рабочих процессов, управление AI-каналами или планирование интеллектуальных задач — ClawX предоставляет интерфейс для эффективного использования AI-агентов. + +ClawX поставляется с предустановленными лучшими практиками для провайдеров моделей и нативно поддерживает Windows, а также многоязычные настройки. Вы можете тонко настроить расширенные параметры через **Настройки → Дополнительно → Режим разработчика**. + +--- + +## Скриншоты + +
+
+
+
+
+
+
+
+
+
+
+
+
|
|
|
+
+### Партнёрская программа ClawX 🚀
+
+Мы запускаем Партнёрскую программу ClawX и ищем партнёров, которые могут помочь представить ClawX большему числу клиентов, особенно тем, у кого есть потребности в кастомных AI-агентах или автоматизации.
+
+Партнёры помогают связывать нас с потенциальными пользователями и проектами, а команда ClawX предоставляет полную техническую поддержку, кастомизацию и интеграцию.
+
+Если вы работаете с клиентами, заинтересованными в AI-инструментах или автоматизации, мы будем рады сотрудничеству.
+
+Напишите нам в DM или на [public@valuecell.ai](mailto:public@valuecell.ai) для получения дополнительной информации.
+
+---
+
+## История звёзд
+
+
+
+
+Создано с ❤️ командой ValueCell +
diff --git a/README.zh-CN.md b/README.zh-CN.md index b0702981d..4e3ec919d 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -30,7 +30,7 @@ --- diff --git a/resources/screenshot/ru/channels.png b/resources/screenshot/ru/channels.png new file mode 100644 index 000000000..ff2decf97 Binary files /dev/null and b/resources/screenshot/ru/channels.png differ diff --git a/resources/screenshot/ru/chat.png b/resources/screenshot/ru/chat.png new file mode 100644 index 000000000..bd3249202 Binary files /dev/null and b/resources/screenshot/ru/chat.png differ diff --git a/resources/screenshot/ru/cron.png b/resources/screenshot/ru/cron.png new file mode 100644 index 000000000..7bdddb58e Binary files /dev/null and b/resources/screenshot/ru/cron.png differ diff --git a/resources/screenshot/ru/models.png b/resources/screenshot/ru/models.png new file mode 100644 index 000000000..4ca215f4b Binary files /dev/null and b/resources/screenshot/ru/models.png differ diff --git a/resources/screenshot/ru/settings.png b/resources/screenshot/ru/settings.png new file mode 100644 index 000000000..f7cb44804 Binary files /dev/null and b/resources/screenshot/ru/settings.png differ diff --git a/resources/screenshot/ru/skills.png b/resources/screenshot/ru/skills.png new file mode 100644 index 000000000..61c908816 Binary files /dev/null and b/resources/screenshot/ru/skills.png differ diff --git a/shared/language.ts b/shared/language.ts index a5b3d2692..f2205c745 100644 --- a/shared/language.ts +++ b/shared/language.ts @@ -1,4 +1,4 @@ -export const SUPPORTED_LANGUAGE_CODES = ['en', 'zh', 'ja'] as const; +export const SUPPORTED_LANGUAGE_CODES = ['en', 'zh', 'ja', 'ru'] as const; export type LanguageCode = (typeof SUPPORTED_LANGUAGE_CODES)[number]; diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 58ac0f41b..67d3e19eb 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -39,10 +39,22 @@ import jaSkills from './locales/ja/skills.json'; import jaCron from './locales/ja/cron.json'; import jaSetup from './locales/ja/setup.json'; +// RU +import ruCommon from './locales/ru/common.json'; +import ruSettings from './locales/ru/settings.json'; +import ruDashboard from './locales/ru/dashboard.json'; +import ruChat from './locales/ru/chat.json'; +import ruChannels from './locales/ru/channels.json'; +import ruAgents from './locales/ru/agents.json'; +import ruSkills from './locales/ru/skills.json'; +import ruCron from './locales/ru/cron.json'; +import ruSetup from './locales/ru/setup.json'; + export const SUPPORTED_LANGUAGES = [ { code: 'en', label: 'English' }, { code: 'zh', label: '中文' }, { code: 'ja', label: '日本語' }, + { code: 'ru', label: 'Русский' }, ] as const satisfies ReadonlyArray<{ code: LanguageCode; label: string }>; const resources = { @@ -79,6 +91,17 @@ const resources = { cron: jaCron, setup: jaSetup, }, + ru: { + common: ruCommon, + settings: ruSettings, + dashboard: ruDashboard, + chat: ruChat, + channels: ruChannels, + agents: ruAgents, + skills: ruSkills, + cron: ruCron, + setup: ruSetup, + }, }; i18n diff --git a/src/i18n/locales/ru/agents.json b/src/i18n/locales/ru/agents.json new file mode 100644 index 000000000..84dc2e1a9 --- /dev/null +++ b/src/i18n/locales/ru/agents.json @@ -0,0 +1,77 @@ +{ + "title": "Агенты", + "subtitle": "Создайте нового агента для маршрутизации определённых каналов к отдельной личности или рабочей области.", + "refresh": "Обновить", + "addAgent": "Добавить агента", + "gatewayWarning": "Служба шлюза не запущена. Изменения агентов и каналов могут примениться с задержкой.", + "defaultBadge": "по умолчанию", + "inherited": "унаследовано", + "none": "нет", + "modelLine": "Модель: {{model}}{{suffix}}", + "channelsLine": "Каналы: {{channels}}", + "deleteAgent": "Удалить агента", + "settings": "Настройки", + "creating": "Создание...", + "createDialog": { + "title": "Добавить агента", + "description": "Создайте нового агента по имени. Вы можете опционально унаследовать файлы рабочей области основного агента.", + "nameLabel": "Имя агента", + "namePlaceholder": "Помощник по коду", + "inheritWorkspaceLabel": "Наследовать рабочую область основного агента", + "inheritWorkspaceDescription": "Копировать SOUL.md, AGENTS.md и т.д. из основного агента" + }, + "deleteDialog": { + "title": "Удалить агента", + "message": "Удалить \"{{name}}\" из ClawX? Это навсегда удалит агента и его рабочую область, среду выполнения и файлы сессий с диска." + }, + "settingsDialog": { + "title": "Настройки {{name}}", + "description": "Обновите имя агента и управляйте тем, какие каналы принадлежат этому агенту.", + "nameLabel": "Имя агента", + "agentIdLabel": "ID агента", + "modelLabel": "Модель", + "modelOverrideLabel": "Переопределение модели", + "modelProviderLabel": "Провайдер", + "modelProviderPlaceholder": "Выберите провайдера", + "modelProviderEmpty": "Учётные записи провайдеров не настроены. Добавьте в Настройки → AI-провайдеры.", + "modelIdLabel": "ID модели", + "modelIdPlaceholder": "model-id", + "modelPreview": "Предпросмотр", + "modelOverridePlaceholder": "провайдер/модель (например: openrouter/openai/gpt-5.4)", + "modelOverrideDescription": "Выберите провайдера и ID модели для этого агента.", + "unsavedChangesTitle": "Несохранённые изменения", + "unsavedChangesMessage": "У вас есть несохранённые изменения. Если закроете сейчас, изменения будут потеряны.", + "closeWithoutSaving": "Закрыть без сохранения", + "saveModelOverride": "Сохранить модель", + "useDefaultModel": "Использовать модель по умолчанию", + "channelsTitle": "Каналы", + "channelsDescription": "Этот список доступен только для чтения. Управляйте учётными записями каналов и привязками на странице Каналов.", + "mainAccount": "Основная учётная запись", + "channelsManagedInChannels": "Этот агент связан с типами каналов. Управляйте точными привязками учётных записей на странице Каналов.", + "addChannel": "Добавить канал", + "noChannels": "К этому агенту ещё не привязаны каналы." + }, + "removeChannelDialog": { + "title": "Удалить канал", + "message": "Удалить {{name}} из ClawX? Это удалит текущую конфигурацию канала." + }, + "toast": { + "agentCreated": "Агент создан", + "agentCreateFailed": "Не удалось создать агента: {{error}}", + "agentDeleted": "Агент удалён", + "agentDeleteFailed": "Не удалось удалить агента: {{error}}", + "agentUpdated": "Агент обновлён", + "agentUpdateFailed": "Не удалось обновить агента: {{error}}", + "agentModelInvalid": "Модель должна быть в формате провайдер/модель", + "agentModelProviderRequired": "Сначала выберите провайдера", + "agentModelIdRequired": "Требуется ID модели", + "agentModelUpdated": "Модель агента обновлена", + "agentModelUpdateFailed": "Не удалось обновить модель агента: {{error}}", + "agentModelReset": "Модель агента сброшена до значения по умолчанию", + "agentModelResetFailed": "Не удалось сбросить модель агента: {{error}}", + "channelAssigned": "{{channel}} назначен агенту", + "channelAssignFailed": "Не удалось назначить канал: {{error}}", + "channelRemoved": "{{channel}} удалён", + "channelRemoveFailed": "Не удалось удалить канал: {{error}}" + } +} diff --git a/src/i18n/locales/ru/channels.json b/src/i18n/locales/ru/channels.json new file mode 100644 index 000000000..d31c4b46a --- /dev/null +++ b/src/i18n/locales/ru/channels.json @@ -0,0 +1,392 @@ +{ + "title": "Каналы сообщений", + "subtitle": "Управляйте каналами сообщений, учётными записями, привязками учётных записей к агентам и настройками по умолчанию для каждого канала.", + "refresh": "Обновить", + "addChannel": "Добавить канал", + "stats": { + "total": "Всего каналов", + "connected": "Подключено", + "disconnected": "Отключено" + }, + "gatewayWarning": "Служба шлюза не запущена. Каналы не могут подключиться.", + "availableChannels": "Доступные каналы", + "supportedChannels": "Поддерживаемые каналы", + "available": "Доступные каналы", + "availableDesc": "Подключить новый канал", + "configured": "Настроенные каналы", + "configuredDesc": "Управление уже настроенными каналами", + "configuredBadge": "Настроен", + "deleteConfirm": "Вы уверены, что хотите удалить этот канал?", + "showAll": "Показать все", + "pluginBadge": "Плагин", + "toast": { + "whatsappConnected": "WhatsApp успешно подключён", + "whatsappFailed": "Не удалось подключить WhatsApp: {{error}}", + "qrConnected": "{{name}} успешно подключён", + "qrFailed": "Не удалось подключить {{name}}: {{error}}", + "channelSaved": "Канал {{name}} сохранён", + "channelConnecting": "Подключение к {{name}}...", + "savedButRefreshFailed": "Конфигурация сохранена, но обновление данных страницы не удалось. Пожалуйста, обновите вручную.", + "restartManual": "Пожалуйста, перезапустите шлюз вручную", + "configFailed": "Ошибка конфигурации: {{error}}", + "bindingUpdated": "Привязка учётной записи обновлена", + "defaultUpdated": "Учётная запись по умолчанию обновлена", + "accountDeleted": "Учётная запись удалена", + "channelDeleted": "Канал удалён" + }, + "account": { + "add": "Добавить учётную запись", + "edit": "Редактировать", + "delete": "Удалить учётную запись", + "deleteChannel": "Удалить канал", + "deleteConfirm": "Вы уверены, что хотите удалить эту учётную запись?", + "default": "Текущая по умолчанию", + "setDefault": "Установить как канал по умолчанию", + "bindAgentLabel": "Связанный агент", + "unassigned": "Не назначено", + "mainAccount": "Основная учётная запись", + "customIdLabel": "ID учётной записи", + "customIdPlaceholder": "напр., feishu-sales-bot", + "customIdHint": "Используйте ID учётной записи из строчных букв (буквы, цифры, дефис, подчёркивание) для раз multiple учётных записей одного канала.", + "invalidId": "ID учётной записи не может быть пустым", + "invalidCanonicalId": "ID учётной записи должен содержать строчные буквы, цифры, дефисы или подчёркивания, начинаться с буквы/цифры и быть не более 64 символов.", + "idLabel": "ID: {{id}}", + "boundTo": "Связан с: {{agent}}", + "handledBy": "Обрабатывается {{agent}}", + "bindingStatusLabel": "Привязка: {{status}}", + "connectionStatusLabel": "Подключение: {{status}}", + "bindingStatus": { + "bound": "Связан", + "unbound": "Не связан" + }, + "connectionStatus": { + "connected": "Подключён", + "connecting": "Подключение", + "disconnected": "Отключён", + "error": "Ошибка" + }, + "accountIdPrompt": "Введите новый ID учётной записи для этого канала", + "accountIdExists": "ID учётной записи {{accountId}} уже существует" + }, + "dialog": { + "updateTitle": "Обновить {{name}}", + "configureTitle": "Настроить {{name}}", + "addTitle": "Добавить канал", + "existingDesc": "Обновите существующую конфигурацию", + "selectDesc": "Выберите тип канала для настройки", + "qrCode": "QR-код", + "token": "Токен", + "scanQR": "Сканируйте этот QR-код с {{name}}", + "refreshCode": "Обновить код", + "loadingConfig": "Загрузка конфигурации...", + "existingHint": "У вас уже есть конфигурация для этого канала", + "howToConnect": "Как подключить", + "viewDocs": "Просмотреть документацию", + "channelName": "Название канала", + "channelNamePlaceholder": "Мой {{name}}", + "enableChannel": "Включить канал", + "enableChannelDesc": "При выключении конфигурация сохраняется, но канал остаётся отключённым", + "credentialsVerified": "Учётные данные проверены", + "validationFailed": "Ошибка проверки", + "warnings": "Предупреждения", + "back": "Назад", + "validating": "Проверка...", + "validateConfig": "Проверить конфигурацию", + "generatingQR": "Генерация QR...", + "validatingAndSaving": "Проверка и сохранение...", + "generateQRCode": "Сгенерировать QR-код", + "updateAndReconnect": "Обновить и переподключить", + "saveAndConnect": "Сохранить и подключить", + "envVar": "Переменная окружения: {{var}}" + }, + "meta": { + "telegram": { + "description": "Подключите Telegram через токен бота от @BotFather", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/TjiGwxsMWi7hpDkDAQBc0ydMnEf#MEkKdqXP1orZU2x4SrFcdUHgnl1", + "fields": { + "botToken": { + "label": "Токен бота", + "placeholder": "123456:ABC-DEF..." + }, + "allowedUsers": { + "label": "ID разрешённых пользователей", + "placeholder": "напр., 123456789, 987654321", + "description": "Разделённый запятой список ID пользователей, которым разрешено использовать бота. Требуется для безопасности." + } + }, + "instructions": [ + "Откройте Telegram и найдите @BotFather", + "Отправьте /newbot и следуйте инструкциям", + "Скопируйте токен бота", + "Вставьте токен ниже", + "Получите свой ID пользователя от @userinfobot и вставьте ниже" + ] + }, + "discord": { + "description": "Подключите Discord через токен бота из Developer Portal", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/BkOywJYCAiYRN9k4KTTceKPMnxg#QS6LdxnA2oNtfcxtFc8cgabnnNd", + "fields": { + "token": { + "label": "Токен бота", + "placeholder": "Токен вашего Discord-бота" + }, + "guildId": { + "label": "ID сервера", + "placeholder": "напр., 123456789012345678", + "description": "Ограничьте бота определённым сервером. Правый клик по серверу → Копировать ID сервера." + }, + "channelId": { + "label": "ID канала (опционально)", + "placeholder": "напр., 123456789012345678", + "description": "Ограничьте бота определённым каналом. Правый клик по каналу → Копировать ID канала." + } + }, + "instructions": [ + "Перейдите в Discord Developer Portal → Приложения → Новое приложение", + "В разделе Бот: Добавить бота, затем скопируйте токен бота", + "Включите Message Content Intent + Server Members Intent в Бот → Privileged Gateway Intents", + "В OAuth2 → URL Generator: выберите \"bot\" + \"applications.commands\", добавьте права на сообщения", + "Пригласите бота на сервер через сгенерированный URL", + "Вставьте токен бота ниже" + ] + }, + "whatsapp": { + "description": "Подключите WhatsApp сканированием QR-кода (номер телефона не требуется)", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/ES7fwUfH8iGl8FkHYfFcyWB3n4d#doxcnUElomBZLi0NnKLUzn6zLbd", + "instructions": [ + "Откройте WhatsApp на телефоне", + "Перейдите в Настройки > Связанные устройства > Подключить устройство", + "Сканируйте QR-код, показанный ниже", + "Система автоматически определит ваш номер телефона" + ] + }, + "wechat": { + "description": "Подключите личный WeChat через официальный плагин OpenClaw от Tencent, сканированием QR-кода", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/GHYZwuPCriF0gWkXwkFcJ9zon3b", + "instructions": [ + "Нажмите \"Сгенерировать QR-код\" для установки и включения официального плагина WeChat внутри OpenClaw", + "Сканируйте QR-код ниже через WeChat и подтвердите подключение на телефоне", + "После успешного связывания новый чат WeChat ClawBot автоматически появится в WeChat", + "Вы можете повторить QR-процедуру позже, чтобы добавить другую учётную запись WeChat или переподключить существующую" + ] + }, + "dingtalk": { + "description": "Подключите DingTalk через плагин канала OpenClaw (режим Stream)", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/Y5eNwiSiZidkLskrwtJc1rUln0b#doxcnDgA78n43DbkiQjI1OqUA7b", + "fields": { + "clientId": { + "label": "Client ID (AppKey)", + "placeholder": "dingxxxxxx" + }, + "clientSecret": { + "label": "Client Secret (AppSecret)", + "placeholder": "Секрет вашего приложения" + }, + "robotCode": { + "label": "Robot Code (опционально)", + "placeholder": "Обычно совпадает с Client ID" + }, + "corpId": { + "label": "Corp ID (опционально)", + "placeholder": "dingxxxxxx" + }, + "agentId": { + "label": "Agent ID (опционально)", + "placeholder": "123456789" + } + }, + "instructions": [ + "Установите и включите плагин dingtalk в OpenClaw", + "Создайте внутреннее приложение DingTalk и включите режим Stream", + "Заполните Client ID и Client Secret (обязательно)", + "Заполните Robot Code / Corp ID / Agent ID, если ваша настройка требует этого" + ] + }, + "signal": { + "description": "Подключите Signal через signal-cli", + "docsUrl": "https://docs.openclaw.ai/channels/signal", + "fields": { + "phoneNumber": { + "label": "Номер телефона", + "placeholder": "+1234567890" + } + }, + "instructions": [ + "Установите signal-cli в вашей системе", + "Зарегистрируйте или привяжите ваш номер телефона", + "Введите ваш номер телефона ниже" + ] + }, + "feishu": { + "description": "Подключите бота Feishu/Lark через WebSocket", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/GKn8wOvHnibpPNkNkPzcAvGlnzK#GdHUdp9t9oqyegxwV8ScLvVGn1c", + "fields": { + "appId": { + "label": "App ID", + "placeholder": "cli_xxxxxx" + }, + "appSecret": { + "label": "App Secret", + "placeholder": "Секрет вашего приложения" + } + }, + "instructions": [ + "Прочитайте документацию, затем перейдите на Feishu Open Platform", + "Создайте новое приложение", + "Получите App ID и App Secret", + "Настройте подписку на события" + ] + }, + "wecom": { + "description": "Подключите бота WeCom через плагин", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/JTGnwoV0RixKPtkr4w7c7gpAnDc", + "fields": { + "botId": { + "label": "Bot ID", + "placeholder": "ww_xxxxxx" + }, + "secret": { + "label": "App Secret", + "placeholder": "Секрет вашего WeCom бота" + } + }, + "instructions": [ + "Создайте приложение в WeCom Admin Console для получения информации о конфигурации", + "Убедитесь, что конфигурация сервера получения сообщений включена", + "Введите ваш Bot ID (или Corp ID) и Secret для установления соединения" + ] + }, + "imessage": { + "description": "Подключите iMessage через BlueBubbles (macOS)", + "docsUrl": "https://docs.openclaw.ai/channels/bluebubbles", + "fields": { + "serverUrl": { + "label": "URL сервера BlueBubbles", + "placeholder": "http://localhost:1234" + }, + "password": { + "label": "Пароль сервера", + "placeholder": "Пароль вашего сервера" + } + }, + "instructions": [ + "Установите сервер BlueBubbles на ваш Mac", + "Запишите URL сервера и пароль", + "Введите данные подключения ниже" + ] + }, + "matrix": { + "description": "Подключитесь к протоколу Matrix", + "docsUrl": "https://docs.openclaw.ai/channels/matrix", + "fields": { + "homeserver": { + "label": "URL Homeserver", + "placeholder": "https://matrix.org" + }, + "accessToken": { + "label": "Access Token", + "placeholder": "Ваш access token" + } + }, + "instructions": [ + "Создайте учётную запись Matrix или используйте существующую", + "Получите access token из вашего клиента", + "Введите homeserver и token ниже" + ] + }, + "line": { + "description": "Подключите LINE Messaging API", + "docsUrl": "https://docs.openclaw.ai/channels/line", + "fields": { + "channelAccessToken": { + "label": "Channel Access Token", + "placeholder": "Ваш LINE channel access token" + }, + "channelSecret": { + "label": "Channel Secret", + "placeholder": "Ваш LINE channel secret" + } + }, + "instructions": [ + "Перейдите в LINE Developers Console", + "Создайте канал Messaging API", + "Получите Channel Access Token и Secret" + ] + }, + "msteams": { + "description": "Подключите Microsoft Teams через Bot Framework", + "docsUrl": "https://docs.openclaw.ai/channels/msteams", + "fields": { + "appId": { + "label": "App ID", + "placeholder": "Ваш Microsoft App ID" + }, + "appPassword": { + "label": "App Password", + "placeholder": "Ваш Microsoft App Password" + } + }, + "instructions": [ + "Перейдите на Azure Portal", + "Зарегистрируйте новое приложение бота", + "Получите App ID и создайте пароль", + "Настройте канал Teams" + ] + }, + "googlechat": { + "description": "Подключите Google Chat через webhook", + "docsUrl": "https://docs.openclaw.ai/channels/googlechat", + "fields": { + "serviceAccountKey": { + "label": "Путь к JSON файлу сервисного аккаунта", + "placeholder": "/path/to/service-account.json" + } + }, + "instructions": [ + "Создайте проект Google Cloud", + "Включите Google Chat API", + "Создайте сервисный аккаунт", + "Скачайте файл ключа JSON" + ] + }, + "mattermost": { + "description": "Подключите Mattermost через Bot API", + "docsUrl": "https://docs.openclaw.ai/channels/mattermost", + "fields": { + "serverUrl": { + "label": "URL сервера", + "placeholder": "https://your-mattermost.com" + }, + "botToken": { + "label": "Bot Access Token", + "placeholder": "Ваш bot access token" + } + }, + "instructions": [ + "Перейдите в Mattermost Integrations", + "Создайте новую учётную запись бота", + "Скопируйте access token" + ] + }, + "qqbot": { + "description": "Подключите канал QQ Bot (встроенный с OpenClaw 3.31)", + "docsUrl": "https://icnnp7d0dymg.feishu.cn/wiki/KPIJwlyiGiupMrkiS9ice39Zn2c", + "fields": { + "appId": { + "label": "App ID", + "placeholder": "Ваш QQ Bot App ID" + }, + "clientSecret": { + "label": "Client Secret", + "placeholder": "Ваш QQ Bot Client Secret" + } + }, + "instructions": [ + "Зарегистрируйте приложение на QQ Bot Open Platform", + "Получите App ID и Client Secret", + "Заполните ваши учётные данные ниже" + ] + } + }, + "viewDocs": "Просмотреть документацию" +} diff --git a/src/i18n/locales/ru/chat.json b/src/i18n/locales/ru/chat.json new file mode 100644 index 000000000..949d0c731 --- /dev/null +++ b/src/i18n/locales/ru/chat.json @@ -0,0 +1,72 @@ +{ + "gatewayNotRunning": "Шлюз не запущен", + "gatewayRequired": "Для использования чата требуется запущенный шлюз OpenClaw. Он запустится автоматически, или вы можете запустить его в Настройках.", + "welcome": { + "title": "Чат ClawX", + "subtitle": "Чем могу помочь?", + "askQuestions": "Задачи", + "askQuestionsDesc": "Работа над задачами", + "creativeTasks": "Непрерывное выполнение", + "creativeTasksDesc": "Выполнение многошаговых задач", + "brainstorming": "Параллельные агенты" + }, + "noLogs": "(Журналы ещё недоступны)", + "toolbar": { + "refresh": "Обновить чат", + "showThinking": "Показать размышления", + "hideThinking": "Скрыть размышления", + "currentAgent": "Общение с {{agent}}" + }, + "taskPanel": { + "eyebrow": "Вид выполнения", + "title": "Структура задачи", + "emptyTitle": "Пока нет структурированных шагов", + "emptyBody": "Когда начнётся выполнение, ClawX покажет размышления, вызовы инструментов и состояния передачи здесь.", + "status": { + "idle": "Бездействует", + "running_one": "1 активный шаг", + "running_other": "{{count}} активных шагов" + }, + "stepStatus": { + "running": "Выполняется", + "completed": "Готово", + "error": "Ошибка" + } + }, + "executionGraph": { + "eyebrow": "Выполнение в чате", + "title": "Граф выполнения", + "status": { + "active": "Активно", + "latest": "Последнее", + "previous": "Предыдущее" + }, + "branchLabel": "ветвь", + "userTrigger": "Триггер пользователя", + "userTriggerHint": "Запущен пользовательским сообщением выше", + "agentRun": "Выполнение {{agent}}", + "agentReply": "Ответ ассистента", + "agentReplyHint": "Разрешено в ответе ассистента ниже" + }, + "composer": { + "attachFiles": "Прикрепить файлы", + "pickAgent": "Выбрать агента", + "clearTarget": "Очистить целевого агента", + "targetChip": "@{{agent}}", + "agentPickerTitle": "Направить следующее сообщение другому агенту", + "gatewayDisconnectedPlaceholder": "Шлюз не подключён...", + "send": "Отправить", + "stop": "Остановить", + "gatewayConnected": "подключён", + "gatewayStatus": "шлюз {{state}} | порт: {{port}} {{pid}}", + "retryFailedAttachments": "Повторить неудавшиеся вложения" + }, + "historyBuckets": { + "today": "Сегодня", + "yesterday": "Вчера", + "withinWeek": "В течение недели", + "withinTwoWeeks": "В течение 2 недель", + "withinMonth": "В течение месяца", + "older": "Старее месяца" + } +} diff --git a/src/i18n/locales/ru/common.json b/src/i18n/locales/ru/common.json new file mode 100644 index 000000000..75c5e1bea --- /dev/null +++ b/src/i18n/locales/ru/common.json @@ -0,0 +1,59 @@ +{ + "sidebar": { + "chat": "Чат", + "newChat": "Новый чат", + "cronTasks": "Расписание", + "skills": "Навыки", + "agents": "Агенты", + "channels": "Каналы", + "dashboard": "Панель", + "settings": "Настройки", + "devConsole": "Консоль разработчика", + "models": "Модели", + "deleteSessionConfirm": "Вы уверены, что хотите удалить сессию \"{{label}}\"?", + "openClawPage": "Страница OpenClaw" + }, + "actions": { + "save": "Сохранить", + "cancel": "Отмена", + "delete": "Удалить", + "edit": "Редактировать", + "refresh": "Обновить", + "close": "Закрыть", + "copy": "Копировать", + "search": "Поиск", + "confirm": "Подтвердить", + "dismiss": "Отклонить", + "load": "Загрузить", + "install": "Установить", + "uninstall": "Удалить", + "enable": "Включить", + "disable": "Выключить", + "back": "Назад", + "next": "Далее", + "skip": "Пропустить", + "restart": "Перезапустить", + "show": "Показать", + "hide": "Скрыть", + "clear": "Очистить" + }, + "status": { + "running": "Запущен", + "stopped": "Остановлен", + "error": "Ошибка", + "connected": "Подключён", + "disconnected": "Отключён", + "enabled": "Включён", + "disabled": "Выключен", + "active": "Активен", + "paused": "Приостановлен", + "configured": "Настроен", + "loading": "Загрузка...", + "saving": "Сохранение..." + }, + "gateway": { + "notRunning": "Шлюз не запущен", + "notRunningDesc": "Для использования этой функции требуется запущенный шлюз OpenClaw. Он запустится автоматически, или вы можете запустить его в Настройках.", + "warning": "Шлюз не запущен." + } +} diff --git a/src/i18n/locales/ru/cron.json b/src/i18n/locales/ru/cron.json new file mode 100644 index 000000000..2b806ec58 --- /dev/null +++ b/src/i18n/locales/ru/cron.json @@ -0,0 +1,120 @@ +{ + "title": "Запланированные задачи", + "subtitle": "Автоматизируйте AI-workflows с запланированными задачами", + "newTask": "Новая задача", + "refresh": "Обновить", + "gatewayWarning": "Шлюз не запущен. Запланированными задачами нельзя управлять без активного шлюза.", + "stats": { + "total": "Всего задач", + "active": "Активно", + "paused": "Приостановлено", + "failed": "Ошибка" + }, + "empty": { + "title": "Нет запланированных задач", + "description": "Создайте запланированные задачи для автоматизации AI-процессов. Задачи могут отправлять сообщения, выполнять запросы или выполнять действия в указанное время.", + "create": "Создать первую задачу" + }, + "card": { + "runNow": "Запустить сейчас", + "deleteConfirm": "Вы уверены, что хотите удалить эту задачу?", + "last": "Последний", + "next": "Следующий" + }, + "dialog": { + "createTitle": "Создать задачу", + "editTitle": "Редактировать задачу", + "description": "Запланируйте автоматическую AI-задачу", + "taskName": "Название задачи", + "taskNamePlaceholder": "напр., Утренняя сводка", + "message": "Сообщение / Промпт", + "messagePlaceholder": "Что должен сделать AI? напр., Дай мне сводку новостей и погоды на сегодня", + "schedule": "Расписание", + "cronPlaceholder": "Cron-выражение (напр., 0 9 * * *)", + "usePresets": "Использовать пресеты", + "useCustomCron": "Использовать свой cron", + "deliveryTitle": "Доставка", + "deliveryDescription": "Выберите, остаётся ли эта задача в ClawX или отправляется на внешний канал.", + "deliveryModeNone": "Только в ClawX", + "deliveryModeNoneDesc": "Выполнить задачу и сохранить результат в приложении.", + "deliveryModeAnnounce": "Внешний канал", + "deliveryModeAnnounceDesc": "Отправить конечный результат через настроенный канал.", + "deliveryChannel": "Канал", + "channelUnsupportedTag": "Не поддерживается", + "deliveryAccount": "Учётная запись отправки", + "selectDeliveryAccount": "Выберите учётную запись", + "deliveryAccountDesc": "Использует тот же список настроенных учётных записей, что и на странице Каналов.", + "selectChannel": "Выберите канал", + "deliveryChannelUnsupported": "{{channel}} в настоящее время не поддерживает запланированную исходящую доставку.", + "deliveryDefaultAccountHint": "Использует учётную запись канала по умолчанию: {{account}}", + "deliveryTarget": "Получатель / Цель", + "selectDeliveryTarget": "Выберите цель доставки", + "loadingTargets": "Загрузка целей...", + "currentTarget": "Текущая цель", + "deliveryTargetGroupDefault": "Рекомендуемые", + "deliveryTargetGroupUsers": "Пользователи", + "deliveryTargetGroupChats": "Чаты", + "noDeliveryTargets": "Для выбранной учётной записи {{channel}} цели доставки недоступны.", + "deliveryTargetPlaceholder": "Введите цель доставки для этого канала", + "deliveryTargetPlaceholderFeishu": "напр., user:ou_xxx или chat:oc_xxx", + "deliveryTargetDesc": "Это соответствует delivery.to в OpenClaw и отправляется как есть.", + "deliveryTargetDescFeishu": "Используйте цель пользователя Feishu, например user:ou_xxx, или цель чата, например chat:oc_xxx.", + "deliveryTargetDescAuto": "Выберите из целей, обнаруженных для выбранной учётной записи канала.", + "deliveryTargetDescFeishuSelect": "Выберите подтверждённого получателя Feishu из доступных пользователей или чатов.", + "deliveryTargetDescFeishuAccount": "Выберите из настроенных учётных записей канала Feishu, используя тот же список учётных записей, что и на странице Каналов.", + "feishuMainTargetTitle": "Основная учётная запись Feishu", + "feishuMainTargetDesc": "Автозаполнить текущую учётную запись Feishu по умолчанию как цель доставки.", + "useFeishuMainTarget": "Использовать основную учётную запись", + "resolvingTarget": "Разрешение...", + "targetChannel": "Целевой канал", + "noChannels": "Каналы недоступны. Сначала добавьте канал.", + "discordChannelId": "ID канала Discord", + "discordChannelIdPlaceholder": "напр., 1438452657525100686", + "discordChannelIdDesc": "Правый клик по каналу Discord → Копировать ID канала", + "enableImmediately": "Включить немедленно", + "enableImmediatelyDesc": "Начать выполнение этой задачи после создания", + "saveChanges": "Сохранить изменения" + }, + "presets": { + "everyMinute": "Каждую минуту", + "every5Min": "Каждые 5 минут", + "every15Min": "Каждые 15 минут", + "everyHour": "Каждый час", + "daily9am": "Ежедневно в 9:00", + "daily6pm": "Ежедневно в 18:00", + "weeklyMon": "Еженедельно (Пн 9:00)", + "monthly1st": "Ежемесячно (1-го в 9:00)" + }, + "toast": { + "created": "Задача создана", + "updated": "Задача обновлена", + "enabled": "Задача включена", + "paused": "Задача приостановлена", + "deleted": "Задача удалена", + "triggered": "Задача успешно запущена", + "failedTrigger": "Не удалось запустить задачу: {{error}}", + "failedUpdate": "Не удалось обновить задачу", + "failedDelete": "Не удалось удалить задачу", + "nameRequired": "Пожалуйста, введите название задачи", + "messageRequired": "Пожалуйста, введите сообщение", + "channelRequired": "Пожалуйста, выберите канал", + "deliveryChannelUnsupported": "{{channel}} пока не поддерживает запланированную доставку", + "deliveryTargetRequired": "Пожалуйста, введите цель доставки", + "deliveryTargetResolved": "Цель доставки разрешена", + "failedLoadDeliveryTargets": "Не удалось загрузить цели доставки", + "failedResolveDeliveryTarget": "Не удалось разрешить цель доставки по умолчанию", + "discordIdRequired": "Пожалуйста, введите ID канала Discord", + "scheduleRequired": "Пожалуйста, выберите или введите расписание" + }, + "schedule": { + "everySeconds": "Каждые {{count}} сек", + "everyMinutes": "Каждые {{count}} мин", + "everyHours": "Каждые {{count}} ч", + "everyDays": "Каждые {{count}} дн", + "onceAt": "Один раз в {{time}}", + "weeklyAt": "Еженедельно в {{day}} в {{time}}", + "monthlyAtDay": "Ежемесячно {{day}}-го в {{time}}", + "dailyAt": "Ежедневно в {{time}}", + "unknown": "Неизвестно" + } +} diff --git a/src/i18n/locales/ru/dashboard.json b/src/i18n/locales/ru/dashboard.json new file mode 100644 index 000000000..88f36ab58 --- /dev/null +++ b/src/i18n/locales/ru/dashboard.json @@ -0,0 +1,65 @@ +{ + "gateway": "Шлюз", + "channels": "Каналы", + "skills": "Навыки", + "uptime": "Время работы", + "port": "Порт: {{port}}", + "pid": "PID: {{pid}}", + "connectedOf": "{{connected}} из {{total}} подключено", + "enabledOf": "{{enabled}} из {{total}} включено", + "sinceRestart": "С последнего перезапуска", + "gatewayNotRunning": "Шлюз не запущен", + "models": { + "title": "Модели", + "subtitle": "Управляйте AI-провайдерами и отслеживайте использование токенов." + }, + "quickActions": { + "title": "Быстрые действия", + "description": "Частые задачи и ярлыки", + "addProvider": "Добавить провайдера", + "addChannel": "Добавить канал", + "createCron": "Создать задачу", + "installSkill": "Установить навык", + "openChat": "Открыть чат", + "settings": "Настройки", + "devConsole": "Консоль" + }, + "connectedChannels": "Подключённые каналы", + "noChannels": "Каналы не настроены", + "addFirst": "Добавьте первый канал", + "activeSkills": "Активные навыки", + "noSkills": "Навыки не включены", + "enableSome": "Включите несколько навыков", + "more": "+{{count}} ещё", + "recentTokenHistory": { + "title": "Недавнее использование токенов", + "description": "Недавние ответы ассистента и результаты инструментов с данными о модели/провайдере.", + "loading": "Загрузка истории использования токенов...", + "empty": "История использования токенов пуста", + "groupByModel": "По модели", + "groupByTime": "По времени", + "last7Days": "7 дней", + "last30Days": "30 дней", + "allTime": "Всё время", + "showingLast": "{{count}} записей", + "totalTokens": "всего токенов", + "inputShort": "Ввод", + "outputShort": "Вывод", + "cacheShort": "Кэш", + "page": "Страница {{current}} / {{total}}", + "prev": "Назад", + "next": "Далее", + "unknownModel": "Неизвестная модель", + "emptyForWindow": "Нет истории использования токенов за этот период", + "input": "Ввод {{value}}", + "output": "Вывод {{value}}", + "cacheRead": "Чтение кэша {{value}}", + "cacheWrite": "Запись кэша {{value}}", + "cost": "Стоимость ${{amount}}", + "viewContent": "Просмотр содержимого", + "contentDialogTitle": "Детали использования", + "close": "Закрыть", + "noUsage": "Нет использования", + "usageParseError": "Ошибка解析 использования" + } +} diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json new file mode 100644 index 000000000..1099033b0 --- /dev/null +++ b/src/i18n/locales/ru/settings.json @@ -0,0 +1,282 @@ +{ + "title": "Настройки", + "subtitle": "Настройте ваш опыт работы с ClawX", + "appearance": { + "title": "Общие", + "description": "Настройте внешний вид", + "theme": "Тема", + "light": "Светлая", + "dark": "Тёмная", + "system": "Системная", + "language": "Язык", + "launchAtStartup": "Запуск при старте системы", + "launchAtStartupDesc": "Автоматически запускать ClawX при входе в систему" + }, + "aiProviders": { + "title": "AI-провайдеры", + "description": "Настройте провайдеров AI-моделей и API-ключи", + "overview": { + "title": "Учётные записи провайдеров", + "description": "Сводка об учётных записях провайдеров и моделях.", + "noModelSelected": "Модель не выбрана", + "multiAccountReady": "Готов к нескольким аккаунтам", + "singletonVendor": "Одноаккаунтный провайдер" + }, + "authModes": { + "apiKey": "API-ключ", + "oauthDevice": "OAuth Устройство", + "oauthBrowser": "OAuth Браузер", + "local": "Локальный" + }, + "sections": { + "model": "Настройки модели", + "fallback": "Настройки резервного переключения" + }, + "add": "Добавить провайдера", + "custom": "Свой", + "notRequired": "Не требуется", + "empty": { + "title": "Провайдеры не настроены", + "desc": "Добавьте AI-провайдера, чтобы начать использовать ClawX", + "cta": "Добавить первого провайдера" + }, + "dialog": { + "title": "Добавить AI-провайдера", + "desc": "Настройте нового провайдера AI-моделей", + "displayName": "Отображаемое имя", + "apiKey": "API-ключ", + "apiKeyConfigured": "API-ключ уже сохранён для этого провайдера.", + "apiKeyMissing": "API-ключ ещё не сохранён для этого провайдера.", + "apiKeyStored": "Ваш API-ключ хранится локально на вашем компьютере.", + "replaceApiKey": "Заменить API-ключ", + "replaceApiKeyHelp": "Оставьте это поле пустым, чтобы сохранить текущий API-ключ.", + "baseUrl": "Базовый URL", + "modelId": "ID модели", + "codePlanPreset": "Пресет Code Plan", + "codePlanMode": "Code Plan", + "useCodePlanPreset": "Использовать пресет Ark Code Plan", + "codePlanPresetDesc": "Code Plan использует https://ark.cn-beijing.volces.com/api/coding/v3 и модель ark-code-latest. Не используйте /api/v3 для трафика Code Plan.", + "codePlanDoc": "Документация Code Plan", + "protocol": "Протокол", + "advancedConfig": "Расширенная конфигурация", + "userAgent": "User-Agent", + "userAgentPlaceholder": "ClawX/1.0", + "fallbackModels": "Резервные модели", + "fallbackProviders": "Резервные провайдеры", + "fallbackModelIds": "ID резервных моделей", + "fallbackModelIdsPlaceholder": "gpt-4.1-mini\nanother-model-id", + "fallbackModelIdsHelp": "Один ID модели на строку. Эти модели используют текущую конфигурацию провайдера перед переходом к другим провайдерам.", + "noFallbackOptions": "Сначала добавьте другого провайдера, чтобы использовать его как резервный.", + "cancel": "Отмена", + "change": "Изменить провайдера", + "add": "Добавить провайдера", + "save": "Сохранить", + "customDoc": "Документация", + "validate": "Проверить" + }, + "card": { + "default": "По умолчанию", + "configured": "Настроен", + "noKey": "API-ключ не задан", + "none": "Нет", + "fallbacks_one": "Резервный: {{names}}", + "fallbacks_other": "Резервные ({{count}}): {{names}}", + "setDefault": "Установить по умолчанию", + "editKey": "Редактировать API-ключ", + "delete": "Удалить провайдера" + }, + "protocols": { + "openai": "Совместимый с OpenAI", + "openaiCompletions": "OpenAI Completions", + "openaiResponses": "OpenAI Responses", + "anthropic": "Совместимый с Anthropic" + }, + "toast": { + "added": "Провайдер успешно добавлен", + "failedAdd": "Не удалось добавить провайдера", + "deleted": "Провайдер удалён", + "failedDelete": "Не удалось удалить провайдера", + "defaultUpdated": "Провайдер по умолчанию обновлён", + "failedDefault": "Не удалось установить провайдер по умолчанию", + "updated": "Провайдер обновлён", + "failedUpdate": "Не удалось обновить провайдера", + "invalidKey": "Неверный API-ключ", + "modelRequired": "Требуется ID модели", + "minimaxConflict": "Нельзя добавить оба провайдера MiniMax (Global) и MiniMax (CN)." + }, + "oauth": { + "loginMode": "Вход через OAuth", + "apikeyMode": "API-ключ", + "loginPrompt": "Этот провайдер требует входа через браузер.", + "loginButton": "Войти через браузер", + "getApiKey": "Получить API-ключ", + "waiting": "Ожидание...", + "openLoginPage": "Открыть страницу входа", + "waitingApproval": "Ожидание подтверждения в браузере...", + "cancel": "Отмена", + "codeCopied": "Код скопирован в буфер обмена", + "authFailed": "Ошибка аутентификации", + "browserFlowUnavailable": "OAuth через браузер ещё не настроен для этого провайдера.", + "tryAgain": "Попробовать снова", + "approveLogin": "Подтвердить вход", + "step1": "Скопируйте код авторизации ниже.", + "step2": "Откройте страницу входа в браузере.", + "step3": "Вставьте код для подтверждения доступа.", + "requestingCode": "Запрос кода безопасного входа..." + } + }, + "gateway": { + "title": "Шлюз", + "description": "Настройки шлюза OpenClaw", + "status": "Статус", + "port": "Порт", + "logs": "Журналы", + "appLogs": "Журналы приложения", + "openFolder": "Открыть папку", + "autoStart": "Автозапуск шлюза", + "autoStartDesc": "Запускать шлюз при старте ClawX", + "proxyTitle": "Прокси", + "proxyDesc": "Направлять трафик Electron и шлюза через локальный прокси-клиент.", + "proxyServer": "Прокси-сервер", + "proxyServerHelp": "Прокси по умолчанию для всех запросов. Значения вида хост:порт по умолчанию используют HTTP.", + "proxyHttpServer": "HTTP-прокси", + "proxyHttpServerHelp": "Расширенная настройка для HTTP-запросов. Оставьте пустым, чтобы использовать прокси-сервер.", + "proxyHttpsServer": "HTTPS-прокси", + "proxyHttpsServerHelp": "Расширенная настройка для HTTPS-запросов. Оставьте пустым, чтобы использовать прокси-сервер.", + "proxyAllServer": "ALL_PROXY / SOCKS", + "proxyAllServerHelp": "Расширенный резерв для SOCKS-клиентов и протоколов (например, Telegram). Оставьте пустым, чтобы использовать прокси-сервер.", + "showAdvancedProxy": "Показать расширенные поля прокси", + "hideAdvancedProxy": "Скрыть расширенные поля прокси", + "proxyBypass": "Правила обхода", + "proxyBypassHelp": "Разделённые точкой с запятой, запятой или новой строкой хосты, которые должны подключаться напрямую.", + "proxyRestartNote": "Сохранение переприменяет сетевые настройки Electron и немедленно перезапускает шлюз. Обычные перезапуски шлюза сохраняют значения прокси Telegram-канала при отключённом прокси; сохраните при отключённом прокси, чтобы очистить их.", + "proxySaved": "Настройки прокси сохранены", + "proxySaveFailed": "Не удалось сохранить настройки прокси" + }, + "updates": { + "title": "Обновления", + "description": "Поддерживайте ClawX в актуальном состоянии", + "autoCheck": "Автопроверка обновлений", + "autoCheckDesc": "Проверять обновления при запуске", + "autoDownload": "Автообновление", + "autoDownloadDesc": "Автоматически загружать и устанавливать обновления", + "status": { + "checking": "Проверка обновлений...", + "downloading": "Загрузка обновления...", + "available": "Доступно обновление: v{{version}}", + "downloaded": "Готово к установке: v{{version}}", + "autoInstalling": "Перезапуск для установки обновления через {{seconds}}с...", + "failed": "Ошибка проверки обновлений", + "latest": "У вас последняя версия", + "check": "Проверить обновления" + }, + "action": { + "checking": "Проверка...", + "downloading": "Загрузка...", + "download": "Скачать обновление", + "install": "Установить и перезапустить", + "cancelAutoInstall": "Отмена", + "retry": "Повторить", + "check": "Проверить обновления" + }, + "currentVersion": "Текущая версия", + "whatsNew": "Что нового:", + "errorDetails": "Детали ошибки:", + "help": "Когда автообновление включено, обновления загружаются и устанавливаются автоматически." + }, + "advanced": { + "title": "Дополнительные", + "description": "Опции для продвинутых пользователей", + "transport": { + "label": "Предпочтение транспорта шлюза", + "desc": "Выберите, как рендерер запрашивает RPC шлюза: WebSocket, HTTP-прокси или IPC-резерв.", + "saved": "Предпочтение транспорта шлюза сохранено", + "options": { + "wsFirst": "WS сначала", + "httpFirst": "HTTP сначала", + "wsOnly": "Только WS", + "httpOnly": "Только HTTP", + "ipcOnly": "Только IPC" + }, + "descriptions": { + "wsFirst": "WS -> HTTP -> IPC", + "httpFirst": "HTTP -> WS -> IPC", + "wsOnly": "WS -> IPC", + "httpOnly": "HTTP -> IPC", + "ipcOnly": "Только IPC" + } + }, + "devMode": "Режим разработчика", + "devModeDesc": "Показывать инструменты и ярлыки разработчика", + "telemetry": "Анонимные данные об использовании", + "telemetryDesc": "Разрешить предоставление анонимных базовых данных об использовании для улучшения ClawX" + }, + "developer": { + "title": "Разработчик", + "description": "Расширенные опции для разработчиков", + "console": "Консоль OpenClaw", + "consoleDesc": "Доступ к нативному интерфейсу управления OpenClaw", + "openConsole": "Открыть консоль разработчика", + "consoleNote": "Открывает Control UI с токеном шлюза", + "gatewayToken": "Токен шлюза", + "gatewayTokenDesc": "Вставьте это в настройки Control UI при запросе", + "tokenUnavailable": "Токен недоступен", + "tokenCopied": "Токен шлюза скопирован", + "cli": "CLI OpenClaw", + "cliDesc": "Скопируйте команду для запуска OpenClaw без изменения PATH.", + "cliPowershell": "Команда PowerShell.", + "cmdUnavailable": "Команда недоступна", + "cmdCopied": "CLI-команда скопирована", + "doctor": "OpenClaw Doctor", + "doctorDesc": "Запустите `openclaw doctor` и просмотрите вывод диагностики.", + "runDoctor": "Запустить Doctor", + "runDoctorFix": "Запустить исправление Doctor", + "doctorSucceeded": "OpenClaw doctor завершён", + "doctorFailed": "OpenClaw doctor сообщил о проблемах", + "doctorRunFailed": "Не удалось запустить OpenClaw doctor", + "doctorFixSucceeded": "Исправление OpenClaw doctor завершено", + "doctorFixFailed": "Исправление OpenClaw doctor сообщило о проблемах", + "doctorFixRunFailed": "Не удалось запустить исправление OpenClaw doctor", + "doctorCopied": "Вывод doctor скопирован", + "doctorOk": "Исправен", + "doctorIssue": "Обнаружены проблемы", + "doctorFixOk": "Исправлено", + "doctorFixIssue": "Ошибка исправления", + "doctorExitCode": "Код выхода", + "doctorDuration": "Длительность", + "doctorCommand": "Команда", + "doctorWorkingDir": "Рабочая директория", + "doctorError": "Ошибка", + "doctorStdout": "Стандартный вывод", + "doctorStderr": "Стандартная ошибка", + "doctorOutputEmpty": "(пусто)", + "wsDiagnostic": "Диагностический режим WS", + "wsDiagnosticDesc": "Временно включить цепочку WS/HTTP-резервов для отладки RPC шлюза.", + "wsDiagnosticEnabled": "Диагностический режим WS включён", + "wsDiagnosticDisabled": "Диагностический режим WS отключён", + "telemetryViewer": "Просмотр телеметрии", + "telemetryViewerDesc": "Локальная телеметрия UX/производительности, последние 200 записей.", + "telemetryAggregated": "Топ событий", + "telemetryTotal": "Всего", + "telemetryErrors": "Ошибки", + "telemetrySlow": "Медленные (>=800мс)", + "telemetryEmpty": "Телеметрия ещё не собрана", + "telemetryCopied": "Телеметрия скопирована", + "telemetryCleared": "Телеметрия очищена", + "installCmd": "Установить команду \"openclaw\"", + "installCmdDesc": "Устанавливает ~/.local/bin/openclaw (без прав администратора)", + "installTitle": "Установить команду OpenClaw", + "installMessage": "Установить команду \"openclaw\"?", + "installDetail": "Это создаст ~/.local/bin/openclaw. Убедитесь, что ~/.local/bin в PATH, если хотите запускать глобально." + }, + "about": { + "title": "О приложении", + "appName": "ClawX", + "tagline": "Графический AI-ассистент", + "basedOn": "На базе OpenClaw", + "version": "Версия {{version}}", + "docs": "Веб-сайт", + "github": "GitHub", + "faq": "FAQ" + } +} diff --git a/src/i18n/locales/ru/setup.json b/src/i18n/locales/ru/setup.json new file mode 100644 index 000000000..6d68eefc2 --- /dev/null +++ b/src/i18n/locales/ru/setup.json @@ -0,0 +1,152 @@ +{ + "steps": { + "welcome": { + "title": "Добро пожаловать", + "description": "Ваш AI-ассистент готов к настройке" + }, + "runtime": { + "title": "Проверка окружения", + "description": "Проверка системных требований" + }, + "provider": { + "title": "AI-провайдер", + "description": "Настройте ваш AI-сервис" + }, + "channel": { + "title": "Подключить канал", + "description": "Подключите платформу обмена сообщениями (опционально)" + }, + "installing": { + "title": "Настройка", + "description": "Установка необходимых компонентов" + }, + "complete": { + "title": "Готово!", + "description": "ClawX готов к использованию" + } + }, + "welcome": { + "title": "Добро пожаловать в ClawX", + "description": "ClawX — это графический интерфейс для OpenClaw, упрощающий использование AI-ассистентов через ваши любимые платформы обмена сообщениями.", + "features": { + "noCommand": "Без командной строки", + "modernUI": "Современный красивый интерфейс", + "bundles": "Предварительно установленные наборы навыков", + "crossPlatform": "Кроссплатформенная поддержка" + } + }, + "runtime": { + "title": "Проверка окружения", + "viewLogs": "Просмотреть журналы", + "recheck": "Перепроверить", + "nodejs": "Среда выполнения Node.js", + "openclaw": "Пакет OpenClaw", + "gateway": "Служба шлюза", + "startGateway": "Запустить шлюз", + "status": { + "checking": "Проверка...", + "success": "Node.js доступен", + "error": "Ошибка", + "gatewayRunning": "Запущен на порту {{port}}", + "packageReady": "Пакет OpenClaw готов" + }, + "issue": { + "title": "Обнаружена проблема с окружением", + "desc": "Пожалуйста, убедитесь, что OpenClaw установлен правильно. Проверьте журналы для получения подробной информации." + }, + "logs": { + "title": "Журналы приложения", + "openFolder": "Открыть папку журналов", + "close": "Закрыть", + "noLogs": "(Журналы ещё недоступны)" + } + }, + "provider": { + "label": "Провайдер модели", + "selectPlaceholder": "Выберите провайдера...", + "baseUrl": "Базовый URL", + "modelId": "ID модели", + "modelIdDesc": "Идентификатор модели от вашего провайдера (напр. deepseek-ai/DeepSeek-V3)", + "codePlanPreset": "Пресет Code Plan", + "codePlanMode": "Code Plan", + "useCodePlanPreset": "Использовать пресет Ark Code Plan", + "codePlanPresetDesc": "Code Plan использует https://ark.cn-beijing.volces.com/api/coding/v3 и модель ark-code-latest. Не используйте /api/v3 для трафика Code Plan.", + "codePlanDoc": "Документация Code Plan", + "protocol": "Протокол", + "protocols": { + "openaiCompletions": "OpenAI Completions", + "openaiResponses": "OpenAI Responses", + "anthropic": "Совместимый с Anthropic" + }, + "apiKey": "API-ключ", + "save": "Сохранить", + "validateSave": "Проверить и сохранить", + "valid": "Провайдер успешно настроен", + "invalid": "Неверный API-ключ", + "storedLocally": "Ваш API-ключ хранится локально на вашем компьютере." + }, + "channel": { + "title": "Подключить канал сообщений", + "subtitle": "Выберите платформу для подключения вашего AI-ассистента. Вы можете добавить больше каналов позже в Настройках.", + "configure": "Настроить {{name}}", + "howTo": "Как подключить:", + "viewDocs": "Просмотреть документацию", + "validationError": "Ошибка проверки", + "connected": "{{name}} подключён", + "connectedDesc": "Ваш канал настроен. Он подключится при запуске шлюза.", + "configureAnother": "Настроить другой канал" + }, + "installing": { + "title": "Установка необходимых компонентов", + "subtitle": "Настройка инструментов для вашего AI-ассистента", + "progress": "Прогресс", + "status": { + "pending": "Ожидание", + "installing": "Установка...", + "installed": "Установлено", + "failed": "Ошибка" + }, + "error": "Ошибка настройки:", + "restart": "Попробуйте перезапустить приложение", + "wait": "Это может занять несколько моментов...", + "skip": "Пропустить этот шаг" + }, + "complete": { + "title": "Настройка завершена!", + "subtitle": "ClawX настроен и готов к использованию. Теперь вы можете начать общение с вашим AI-ассистентом.", + "provider": "AI-провайдер", + "components": "Компоненты", + "gateway": "Шлюз", + "running": "Запущен", + "footer": "Вы можете настраивать навыки и подключать каналы в Настройках" + }, + "nav": { + "next": "Далее", + "back": "Назад", + "skipStep": "Пропустить этот шаг", + "skipSetup": "Пропустить настройку", + "getStarted": "Начать" + }, + "defaultSkills": { + "opencode": { + "name": "OpenCode", + "description": "AI-помощник по программированию" + }, + "python-env": { + "name": "Python-среда", + "description": "Python runtime для навыков" + }, + "code-assist": { + "name": "Помощник по коду", + "description": "Анализ и предложения по коду" + }, + "file-tools": { + "name": "Инструменты файлов", + "description": "Операции с файлами и управление" + }, + "terminal": { + "name": "Терминал", + "description": "Выполнение shell-команд" + } + } +} diff --git a/src/i18n/locales/ru/skills.json b/src/i18n/locales/ru/skills.json new file mode 100644 index 000000000..204e66411 --- /dev/null +++ b/src/i18n/locales/ru/skills.json @@ -0,0 +1,111 @@ +{ + "title": "Навыки", + "subtitle": "Просмотр и управление AI-возможностями", + "refresh": "Обновить", + "openFolder": "Открыть папку навыков", + "gatewayWarning": "Шлюз не запущен. Навыки не могут быть загружены без активного шлюза.", + "tabs": { + "installed": "Установленные", + "marketplace": "Маркетплейс" + }, + "filter": { + "all": "Все ({{count}})", + "builtIn": "Встроенные ({{count}})", + "marketplace": "Маркетплейс ({{count}})" + }, + "search": "Поиск навыков...", + "searchMarketplace": "Поиск на маркетплейсе...", + "searchButton": "Поиск", + "actions": { + "enableVisible": "Включить видимые", + "disableVisible": "Выключить видимые", + "installSkill": "Установить навыки" + }, + "noSkills": "Навыки не найдены", + "noSkillsSearch": "Попробуйте другой поисковый запрос", + "noSkillsAvailable": "Навыки недоступны", + "detail": { + "info": "Информация", + "config": "Конфигурация", + "description": "Описание", + "version": "Версия", + "author": "Автор", + "source": "Источник", + "coreSystem": "Системный", + "bundled": "В комплекте", + "userInstalled": "Установлено пользователем", + "enabled": "Включён", + "disabled": "Выключен", + "apiKey": "API-ключ", + "apiKeyPlaceholder": "Введите API-ключ (опционально)", + "apiKeyDesc": "Основной API-ключ для этого навыка. Оставьте пустым, если не требуется или настроено в другом месте.", + "envVars": "Переменные окружения", + "addVariable": "Добавить переменную", + "noEnvVars": "Переменные окружения не настроены.", + "keyPlaceholder": "КЛЮЧ (напр., BASE_URL)", + "valuePlaceholder": "ЗНАЧЕНИЕ", + "envNote": "Примечание: Строки с пустыми ключами будут автоматически удалены при сохранении.", + "saving": "Сохранение...", + "saveConfig": "Сохранить конфигурацию", + "configSaved": "Конфигурация сохранена", + "openManual": "Открыть руководство", + "openActualFolder": "Открыть реальную папку", + "copyPath": "Копировать путь", + "pathUnavailable": "Путь недоступен", + "configurable": "Настраиваемый", + "uninstall": "Удалить", + "enable": "Включить", + "disable": "Выключить" + }, + "source": { + "badge": { + "bundled": "В комплекте", + "managed": "Управляемый", + "workspace": "Рабочая область", + "extra": "Дополнительные директории", + "agentsPersonal": "Личные .agents", + "agentsProject": "Проектные .agents", + "unknown": "Неизвестный источник" + } + }, + "toast": { + "enabled": "Навык включён", + "disabled": "Навык выключен", + "installed": "Навык установлен и включён", + "uninstalled": "Навык успешно удалён", + "openedEditor": "Открыто в редакторе", + "failedEditor": "Не удалось открыть редактор", + "failedSave": "Не удалось сохранить конфигурацию", + "failedOpenFolder": "Не удалось открыть папку навыков", + "failedInstall": "Не удалось установить", + "failedUninstall": "Не удалось удалить", + "failedFolderNotFound": "Папка навыков ещё не существует. Сначала установите навык.", + "copiedPath": "Путь скопирован", + "failedCopyPath": "Не удалось скопировать путь", + "failedOpenActualFolder": "Не удалось открыть реальную папку навыка", + "searchTimeoutError": "Поиск истёк, проверьте сеть. Вы также можете искать на ClawHub.ai, скачать ZIP и распаковать в \"{{path}}\"", + "installTimeoutError": "Установка истекла, проверьте сеть. Вы также можете скачать ZIP с ClawHub.ai и распаковать в \"{{path}}\"", + "searchRateLimitError": "Превышен лимит поиска. Вы также можете искать на ClawHub.ai, скачать ZIP и распаковать в \"{{path}}\"", + "installRateLimitError": "Превышен лимит установки. Вы также можете скачать ZIP с ClawHub.ai и распаковать в \"{{path}}\"", + "fetchTimeoutError": "Получение навыков истекло, проверьте подключение к сети.", + "fetchRateLimitError": "Превышен лимит получения навыков, попробуйте позже.", + "noBatchEnableTargets": "Все видимые навыки уже включены.", + "noBatchDisableTargets": "Все видимые навыки уже выключены.", + "batchEnabled": "{{count}} навыков включено.", + "batchDisabled": "{{count}} навыков выключено.", + "batchPartial": "Обновлено {{success}} / {{total}} навыков. Некоторые элементы не удались." + }, + "marketplace": { + "title": "Маркетплейс", + "installDialogTitle": "Установить навыки", + "installDialogSubtitle": "Обзор по умолчанию, или введите ключевые слова для поиска.", + "sourceLabel": "Источник", + "sourceClawHub": "ClawHub", + "securityNote": "Нажмите на карточку навыка, чтобы просмотреть его документацию и информацию о безопасности на ClawHub перед установкой.", + "manualInstallHint": "Проблемы с сетью? Вы всегда можете скачать ZIP-архивы навыков с ClawHub.ai и распаковать их вручную в \"{{path}}\".", + "searching": "Поиск на ClawHub...", + "noResults": "Навыки по вашему запросу не найдены.", + "emptyPrompt": "Ищите новые навыки для расширения ваших возможностей.", + "searchError": "Ошибка поиска ClawHub. Проверьте подключение или установку." + } +} diff --git a/tests/e2e/language-russian.spec.ts b/tests/e2e/language-russian.spec.ts new file mode 100644 index 000000000..9f21ce915 --- /dev/null +++ b/tests/e2e/language-russian.spec.ts @@ -0,0 +1,92 @@ +import { closeElectronApp, expect, getStableWindow, test } from './fixtures/electron'; + +test.describe('Russian language localization', () => { + test('shows Russian language option in setup wizard', async ({ launchElectronApp }) => { + const app = await launchElectronApp(); + + try { + const page = await getStableWindow(app); + + // Should see the setup wizard + await expect(page.getByTestId('setup-page')).toBeVisible(); + + // Should have Russian language button visible + const russianButton = page.locator('button', { hasText: 'Русский' }); + await expect(russianButton).toBeVisible(); + } finally { + await closeElectronApp(app); + } + }); + + test('can switch to Russian language in setup wizard', async ({ launchElectronApp }) => { + const app = await launchElectronApp(); + + try { + const page = await getStableWindow(app); + + await expect(page.getByTestId('setup-page')).toBeVisible(); + + // Click Russian language button + const russianButton = page.locator('button', { hasText: 'Русский' }); + await russianButton.click(); + + // Verify UI renders in Russian by checking for Russian-only text + // "Добро пожаловать" is unique to Russian and won't appear in English + await expect(page.locator('h2')).toContainText('Добро пожаловать'); + } finally { + await closeElectronApp(app); + } + }); + + test('Russian language persists after skipping setup', async ({ launchElectronApp }) => { + const app = await launchElectronApp(); + + try { + const page = await getStableWindow(app); + + await expect(page.getByTestId('setup-page')).toBeVisible(); + + // Switch to Russian + const russianButton = page.locator('button', { hasText: 'Русский' }); + await russianButton.click(); + + // Skip setup + await page.getByTestId('setup-skip-button').click(); + await expect(page.getByTestId('main-layout')).toBeVisible(); + + // Navigate to Settings to verify language persistence + await page.getByTestId('sidebar-nav-settings').click(); + await expect(page.getByTestId('settings-page')).toBeVisible(); + + // Verify sidebar shows Russian text (not English) + // "Настройки" is Russian-only, English is "Settings" + await expect(page.getByTestId('sidebar-nav-settings')).toContainText('Настройки'); + } finally { + await closeElectronApp(app); + } + }); + + test('can switch to Russian in Settings page', async ({ launchElectronApp }) => { + const app = await launchElectronApp({ skipSetup: true }); + + try { + const page = await getStableWindow(app); + + await expect(page.getByTestId('main-layout')).toBeVisible(); + + // Navigate to Settings (in English by default after skipSetup) + await page.getByTestId('sidebar-nav-settings').click(); + await expect(page.getByTestId('settings-page')).toBeVisible(); + + // Click Russian language button + const russianButton = page.locator('button', { hasText: 'Русский' }); + await russianButton.click(); + + // Verify sidebar switched to Russian + // "Настройки" is Russian-only, English is "Settings" + await expect(page.getByTestId('sidebar-nav-settings')).toContainText('Настройки'); + } finally { + await closeElectronApp(app); + } + }); +});