feat(i18n): add Russian (ru) localization support (#798)
This commit is contained in:
committed by
GitHub
Unverified
parent
fc9e37c4a3
commit
66b2ddb2dc
@@ -30,7 +30,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="README.md">English</a> | <a href="README.zh-CN.md">简体中文</a> | 日本語
|
<a href="README.md">English</a> | <a href="README.zh-CN.md">简体中文</a> | 日本語 | <a href="README.ru-RU.md">Русский</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
English | <a href="README.zh-CN.md">简体中文</a> | <a href="README.ja-JP.md">日本語</a>
|
English | <a href="README.zh-CN.md">简体中文</a> | <a href="README.ja-JP.md">日本語</a> | <a href="README.ru-RU.md">Русский</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
477
README.ru-RU.md
Normal file
477
README.ru-RU.md
Normal file
@@ -0,0 +1,477 @@
|
|||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="src/assets/logo.svg" width="128" height="128" alt="ClawX Logo" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h1 align="center">ClawX</h1>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<strong>Десктоп-интерфейс для AI-агентов OpenClaw</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="#возможности">Возможности</a> •
|
||||||
|
<a href="#почему-clawx">Почему ClawX</a> •
|
||||||
|
<a href="#быстрый-старт">Быстрый старт</a> •
|
||||||
|
<a href="#архитектура">Архитектура</a> •
|
||||||
|
<a href="#разработка">Разработка</a> •
|
||||||
|
<a href="#участие">Участие</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://img.shields.io/badge/platform-MacOS%20%7C%20Windows%20%7C%20Linux-blue" alt="Platform" />
|
||||||
|
<img src="https://img.shields.io/badge/electron-40+-47848F?logo=electron" alt="Electron" />
|
||||||
|
<img src="https://img.shields.io/badge/react-19-61DAFB?logo=react" alt="React" />
|
||||||
|
<a href="https://discord.com/invite/84Kex3GGAh" target="_blank">
|
||||||
|
<img src="https://img.shields.io/discord/1399603591471435907?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb" alt="chat on Discord" />
|
||||||
|
</a>
|
||||||
|
<img src="https://img.shields.io/github/downloads/ValueCell-ai/ClawX/total?color=%23027DEB" alt="Downloads" />
|
||||||
|
<img src="https://img.shields.io/badge/license-MIT-green" alt="License" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="README.md">English</a> | <a href="README.zh-CN.md">简体中文</a> | <a href="README.ja-JP.md">日本語</a> | Русский
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
**ClawX** — это мост между мощными AI-агентами и повседневными пользователями. Построенный на базе [OpenClaw](https://github.com/OpenClaw), он превращает управление AI через командную строку в доступный и красивый десктоп-опыт — терминал не нужен.
|
||||||
|
|
||||||
|
Автоматизация рабочих процессов, управление AI-каналами или планирование интеллектуальных задач — ClawX предоставляет интерфейс для эффективного использования AI-агентов.
|
||||||
|
|
||||||
|
ClawX поставляется с предустановленными лучшими практиками для провайдеров моделей и нативно поддерживает Windows, а также многоязычные настройки. Вы можете тонко настроить расширенные параметры через **Настройки → Дополнительно → Режим разработчика**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Скриншоты
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/chat.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/cron.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/skills.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/channels.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/models.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="resources/screenshot/ru/settings.png" style="width: 100%; height: auto;">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Почему ClawX
|
||||||
|
|
||||||
|
Создание AI-агентов не должно требовать владения командной строкой. Философия ClawX проста: **мощные технологии заслуживают интерфейса, который уважает ваше время.**
|
||||||
|
|
||||||
|
| Проблема | Решение ClawX |
|
||||||
|
|----------|---------------|
|
||||||
|
| Сложная настройка через CLI | Установка в один клик с мастером настройки |
|
||||||
|
| Редактирование конфигурационных файлов | Визуальные настройки с проверкой в реальном времени |
|
||||||
|
| Управление процессами | Автоматическое управление жизненным циклом шлюза |
|
||||||
|
| Несколько AI-провайдеров | Единая панель настройки провайдеров |
|
||||||
|
| Установка навыков/плагинов | Встроенный маркетплейс и управление навыками |
|
||||||
|
|
||||||
|
### OpenClaw внутри
|
||||||
|
|
||||||
|
ClawX построен непосредственно на официальном ядре **OpenClaw**. Вместо отдельной установки мы встраиваем среду выполнения в приложение для бесшовного опыта "всё включено".
|
||||||
|
|
||||||
|
Мы стремимся поддерживать строгое соответствие с проектом OpenClaw, чтобы вы всегда имели доступ к новейшим возможностям, улучшениям стабильности и совместимости с экосистемой.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
### 🎯 Нулевой порог настройки
|
||||||
|
Весь процесс — от установки до первого взаимодействия с AI — выполняется через интуитивный графический интерфейс. Без терминальных команд, без YAML-файлов, без поиска переменных окружения.
|
||||||
|
|
||||||
|
### 💬 Интеллектуальный интерфейс чата
|
||||||
|
Общайтесь с AI-агентами через современный чат. Поддержка нескольких контекстов разговора, истории сообщений, рендеринга Markdown и прямая маршрутизация через `@agent` в главном поле ввода для мультиагентных конфигураций.
|
||||||
|
При выборе другого агента через `@agent` ClawX переключается непосредственно в контекст этого агента вместо ретрансляции через агента по умолчанию. Рабочие пространства агентов по умолчанию разделены, но более строгая изоляция зависит от настроек песочницы OpenClaw.
|
||||||
|
Каждый агент может переопределить свои настройки `provider/model`; агенты без переопределения продолжают наследовать глобальную модель по умолчанию.
|
||||||
|
|
||||||
|
### 📡 Управление несколькими каналами
|
||||||
|
Настраивайте и отслеживайте несколько AI-каналов одновременно. Каждый канал работает независимо, позволяя запускать специализированных агентов для разных задач.
|
||||||
|
Каждый канал теперь поддерживает несколько учётных записей, привязку агента к учётной записи и переключение канала по умолчанию прямо на странице Каналы.
|
||||||
|
Для пользовательских идентификаторов учётных записей каналов ClawX требует совместимый с OpenClaw канонический формат (`[a-z0-9_-]`, строчные буквы, максимум 64 символа, должен начинаться с буквы или цифры) для предотвращения ошибок маршрутизации.
|
||||||
|
ClawX также включает официальный плагин личного WeChat от Tencent, позволяя подключить WeChat напрямую со страницы Каналы через встроенный QR-код.
|
||||||
|
|
||||||
|
### ⏰ Автоматизация по расписанию
|
||||||
|
Планируйте автоматический запуск AI-задач. Определяйте триггеры, устанавливайте интервалы и позволяйте AI-агентам работать круглосуточно без ручного вмешательства.
|
||||||
|
На странице Cron теперь можно настроить внешнюю доставку непосредственно в форме задачи с отдельными селекторами учётной записи отправителя и цели получателя. Для поддерживаемых каналов цели получателей автоматически обнаруживаются из каталогов каналов или известной истории сессий, поэтому больше не нужно редактировать `jobs.json` вручную.
|
||||||
|
|
||||||
|
### 🧩 Расширяемая система навыков
|
||||||
|
Расширяйте возможности AI-агентов готовыми навыками. Просматривайте, устанавливайте и управляйте навыками через встроенную панель — менеджеры пакетов не нужны.
|
||||||
|
ClawX также предварительно упаковывает полные навыки обработки документов (`pdf`, `xlsx`, `docx`, `pptx`), автоматически развёртывает их в управляемый каталог навыков (по умолчанию `~/.openclaw/skills`) при запуске и включает по умолчанию при первой установке. Дополнительные упакованные навыки (`find-skills`, `self-improving-agent`, `tavily-search`, `brave-web-search`) также включены по умолчанию; если необходимые API-ключи отсутствуют, OpenClaw покажет ошибки конфигурации во время выполнения.
|
||||||
|
На странице Навыки отображаются навыки из нескольких источников OpenClaw (управляемый каталог, workspace и дополнительные каталоги навыков), а также показывается фактическое расположение каждого навыка для прямого открытия папки.
|
||||||
|
|
||||||
|
Переменные окружения для встроенных поисковых навыков:
|
||||||
|
- `BRAVE_SEARCH_API_KEY` для `brave-web-search`
|
||||||
|
- `TAVILY_API_KEY` для `tavily-search` (OAuth также может поддерживаться вышестоящей средой выполнения)
|
||||||
|
- `find-skills` и `self-improving-agent` не требуют API-ключей
|
||||||
|
|
||||||
|
### 🔐 Безопасная интеграция провайдеров
|
||||||
|
Подключайтесь к нескольким AI-провайдерам (OpenAI, Anthropic и др.) с учётными данными, безопасно хранящимися в системной связке ключей. OpenAI поддерживает как API-ключи, так и OAuth через браузер (подписка Codex).
|
||||||
|
Для провайдеров **Custom**, используемых с OpenAI-совместимыми шлюзами, вы можете установить пользовательский `User-Agent` в **Настройки → AI Провайдеры → Редактировать провайдера** для совместимости с чувствительными эндпоинтами.
|
||||||
|
Когда совместимый шлюз отклоняет `/models` по причинам, не связанным с аутентификацией, ClawX автоматически переключается на легковесный зонд `/chat/completions` или `/responses` при проверке API-ключа.
|
||||||
|
|
||||||
|
### 🌙 Адаптивные темы
|
||||||
|
Светлая тема, тёмная тема или синхронизация с системой. ClawX автоматически адаптируется к вашим предпочтениям.
|
||||||
|
|
||||||
|
### 🚀 Управление автозапуском
|
||||||
|
В **Настройки → Общие** вы можете включить **Запускать при старте системы**, чтобы ClawX автоматически запускался после входа в систему.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### Системные требования
|
||||||
|
|
||||||
|
- **Операционная система**: macOS 11+, Windows 10+ или Linux (Ubuntu 20.04+)
|
||||||
|
- **Память**: минимум 4 ГБ RAM (рекомендуется 8 ГБ)
|
||||||
|
- **Хранилище**: 1 ГБ свободного места на диске
|
||||||
|
|
||||||
|
### Установка
|
||||||
|
|
||||||
|
#### Готовые релизы (рекомендуется)
|
||||||
|
|
||||||
|
Скачайте последний релиз для вашей платформы со страницы [Releases](https://github.com/ValueCell-ai/ClawX/releases).
|
||||||
|
|
||||||
|
#### Сборка из исходников
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Клонирование репозитория
|
||||||
|
git clone https://github.com/ValueCell-ai/ClawX.git
|
||||||
|
cd ClawX
|
||||||
|
|
||||||
|
# Инициализация проекта
|
||||||
|
pnpm run init
|
||||||
|
|
||||||
|
# Запуск в режиме разработки
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Первый запуск
|
||||||
|
|
||||||
|
При первом запуске ClawX **Мастер настройки** проведёт вас через:
|
||||||
|
|
||||||
|
1. **Язык и регион** — настройка предпочтительного языка и региона
|
||||||
|
2. **AI-провайдер** — добавление провайдеров с API-ключами или OAuth (для провайдеров, поддерживающих вход через браузер/устройство)
|
||||||
|
3. **Пакеты навыков** — выбор предустановленных навыков для распространённых сценариев
|
||||||
|
4. **Проверка** — тестирование конфигурации перед входом в основной интерфейс
|
||||||
|
|
||||||
|
Мастер предварительно выбирает системный язык, если он поддерживается, иначе переключается на английский.
|
||||||
|
|
||||||
|
### Настройки прокси
|
||||||
|
|
||||||
|
ClawX включает встроенные настройки прокси для сред, где Electron, шлюз OpenClaw или каналы вроде Telegram должны выходить в интернет через локальный прокси-клиент.
|
||||||
|
|
||||||
|
Откройте **Настройки → Шлюз → Прокси** и настройте:
|
||||||
|
|
||||||
|
- **Прокси-сервер**: прокси по умолчанию для всех запросов
|
||||||
|
- **Правила обхода**: хосты, которые должны подключаться напрямую, разделённые точкой с запятой, запятыми или новыми строками
|
||||||
|
- В **Режиме разработчика** можно дополнительно переопределить:
|
||||||
|
- **HTTP Прокси**
|
||||||
|
- **HTTPS Прокси**
|
||||||
|
- **ALL_PROXY / SOCKS**
|
||||||
|
|
||||||
|
Рекомендуемые примеры локальных настроек:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Прокси-сервер: http://127.0.0.1:7890
|
||||||
|
```
|
||||||
|
Примечания:
|
||||||
|
|
||||||
|
- Значение `host:port` рассматривается как HTTP.
|
||||||
|
- Если расширенные поля прокси пусты, ClawX использует `Прокси-сервер`.
|
||||||
|
- Сохранение настроек прокси немедленно повторно применяет сеть Electron и автоматически перезапускает шлюз.
|
||||||
|
- ClawX также синхронизирует прокси с конфигурацией канала Telegram в OpenClaw, когда Telegram включён.
|
||||||
|
- При перезапуске шлюза существующий прокси канала Telegram сохраняется, если прокси ClawX отключен.
|
||||||
|
- Чтобы явно очистить прокси Telegram из конфигурации OpenClaw, сохраните настройки прокси с отключенным прокси.
|
||||||
|
- В **Настройки → Дополнительно → Разработчик** можно запустить **OpenClaw Doctor** для выполнения `openclaw doctor --json` и просмотра диагностического вывода, не покидая приложение.
|
||||||
|
- В упакованных сборках Windows встроенный `openclaw` CLI/TUI запускается через поставляемый `node.exe` для стабильного поведения ввода в терминале.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
ClawX использует **двухпроцессную архитектуру с унифицированным уровнем Host API**. Рендерер обращается к единой абстракции клиента, а Electron Main управляет выбором протокола и жизненным циклом процессов:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────────┐
|
||||||
|
│ Десктоп-приложение ClawX │
|
||||||
|
│ │
|
||||||
|
│ ┌────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Главный процесс Electron │ │
|
||||||
|
│ │ • Управление жизненным циклом окна и приложения │ │
|
||||||
|
│ │ • Наблюдение за процессом шлюза │ │
|
||||||
|
│ │ • Интеграция с системой (трей, уведомления, связка ключей)│ │
|
||||||
|
│ │ • Оркестрация автообновлений │ │
|
||||||
|
│ └────────────────────────────────────────────────────────────┘ │
|
||||||
|
│ │ │
|
||||||
|
│ IPC (авторитетная плоскость управления) │
|
||||||
|
│ ▼ │
|
||||||
|
│ ┌────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Процесс рендерера React │ │
|
||||||
|
│ │ • Современный UI на компонентах (React 19) │ │
|
||||||
|
│ │ • Управление состоянием с Zustand │ │
|
||||||
|
│ │ • Унифицированные вызовы host-api/api-client │ │
|
||||||
|
│ │ • Рендеринг Markdown │ │
|
||||||
|
│ └────────────────────────────────────────────────────────────┘ │
|
||||||
|
└──────────────────────────────┬──────────────────────────────────┘
|
||||||
|
│
|
||||||
|
Стратегия транспорта, управляемая Main
|
||||||
|
(Сначала WS, затем HTTP, затем IPC)
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────┐
|
||||||
|
│ Host API и прокси-уровень Main │
|
||||||
|
│ │
|
||||||
|
│ • hostapi:fetch (прокси Main, избегает CORS в dev/prod) │
|
||||||
|
│ • gateway:httpProxy (Рендерер не вызывает Gateway HTTP напрямую)│
|
||||||
|
│ • Унифицированное отображение ошибок и повторные попытки │
|
||||||
|
└──────────────────────────────┬──────────────────────────────────┘
|
||||||
|
│
|
||||||
|
Резерв WS / HTTP / IPC
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────┐
|
||||||
|
│ Шлюз OpenClaw │
|
||||||
|
│ │
|
||||||
|
│ • Среда выполнения AI-агентов и оркестрация │
|
||||||
|
│ • Управление каналами сообщений │
|
||||||
|
│ • Среда выполнения навыков/плагинов │
|
||||||
|
│ • Уровень абстракции провайдеров │
|
||||||
|
└─────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Принципы проектирования
|
||||||
|
|
||||||
|
- **Изоляция процессов**: Среда выполнения AI работает в отдельном процессе, обеспечивая отзывчивость UI даже при тяжёлых вычислениях
|
||||||
|
- **Единая точка входа для фронтенда**: Запросы рендерера проходят через host-api/api-client; детали протокола скрыты за стабильным интерфейсом
|
||||||
|
- **Владение транспортом в Main**: Electron Main управляет использованием WS/HTTP и откатом к IPC для надёжности
|
||||||
|
- **Корректное восстановление**: Встроенная логика переподключения, таймаутов и отката автоматически обрабатывает временные сбои
|
||||||
|
- **Безопасное хранение**: API-ключи и конфиденциальные данные используют нативные механизмы безопасного хранения ОС
|
||||||
|
- **Безопасность CORS**: Локальный HTTP-доступ проксируется через Main, предотвращая CORS-проблемы на стороне рендерера
|
||||||
|
|
||||||
|
### Модель процессов и устранение неполадок шлюза
|
||||||
|
|
||||||
|
- ClawX — это приложение Electron, поэтому **один экземпляр приложения обычно отображается как несколько процессов ОС** (main/renderer/zygote/utility). Это нормально.
|
||||||
|
- Защита единственного экземпляра использует блокировку Electron плюс локальный файл блокировки процессов, предотвращая дублирование запуска приложения в средах с нестабильным IPC/сессионной шиной.
|
||||||
|
- При последовательных обновлениях смешанные старые/новые версии могут иметь асимметричное поведение защиты. Для лучшей надёжности обновите все десктоп-клиенты до одной версии.
|
||||||
|
- Слушатель шлюза OpenClaw должен быть **единственным владельцем**: только один процесс должен слушать `127.0.0.1:18789`.
|
||||||
|
- Для проверки активного слушателя:
|
||||||
|
- macOS/Linux: `lsof -nP -iTCP:18789 -sTCP:LISTEN`
|
||||||
|
- Windows (PowerShell): `Get-NetTCPConnection -LocalPort 18789 -State Listen`
|
||||||
|
- Нажатие кнопки закрытия окна (`X`) скрывает ClawX в трей; это **не** полностью закрывает приложение. Используйте меню трея **Quit ClawX** для полного завершения.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Варианты использования
|
||||||
|
|
||||||
|
### 🤖 Персональный AI-ассистент
|
||||||
|
Настройте универсального AI-агента, который может отвечать на вопросы, составлять письма, резюмировать документы и помогать с повседневными задачами — всё через чистый десктоп-интерфейс.
|
||||||
|
|
||||||
|
### 📊 Автоматизированный мониторинг
|
||||||
|
Настройте запланированных агентов для отслеживания новостных лент, цен или определённых событий. Результаты доставляются в ваш предпочтительный канал уведомлений.
|
||||||
|
|
||||||
|
### 💻 Производительность разработчика
|
||||||
|
Интегрируйте AI в рабочий процесс разработки. Используйте агентов для проверки кода, генерации документации или автоматизации повторяющихся задач кодирования.
|
||||||
|
|
||||||
|
### 🔄 Автоматизация рабочих процессов
|
||||||
|
Связывайте несколько навыков для создания сложных конвейеров автоматизации. Обрабатывайте данные, преобразовывайте контент и запускайте действия — всё визуально оркестрируется.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Разработка
|
||||||
|
|
||||||
|
### Требования
|
||||||
|
|
||||||
|
- **Node.js**: 22+ (рекомендуется LTS)
|
||||||
|
- **Менеджер пакетов**: pnpm 9+ (рекомендуется) или npm
|
||||||
|
|
||||||
|
### Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
ClawX/
|
||||||
|
├── electron/ # Главный процесс Electron
|
||||||
|
│ ├── api/ # Маршрутизатор API и обработчики Main
|
||||||
|
│ │ └── routes/ # Модули маршрутов RPC/HTTP прокси
|
||||||
|
│ ├── services/ # Службы провайдеров, секретов и среды выполнения
|
||||||
|
│ │ ├── providers/ # Логика синхронизации моделей provider/account
|
||||||
|
│ │ └── secrets/ # Связка ключей ОС и хранилище секретов
|
||||||
|
│ ├── shared/ # Общие схемы провайдеров и константы
|
||||||
|
│ │ └── providers/
|
||||||
|
│ ├── main/ # Точка входа приложения, окна, регистрация IPC
|
||||||
|
│ ├── gateway/ # Менеджер процесса шлюза OpenClaw
|
||||||
|
│ ├── preload/ # Безопасный IPC-мост
|
||||||
|
│ └── utils/ # Утилиты (хранилище, аутентификация, пути)
|
||||||
|
├── src/ # Процесс рендерера React
|
||||||
|
│ ├── lib/ # Унифицированный фронтенд API и модель ошибок
|
||||||
|
│ ├── stores/ # Хранилища Zustand (settings/chat/gateway)
|
||||||
|
│ ├── components/ # Переиспользуемые UI-компоненты
|
||||||
|
│ ├── pages/ # Setup/Dashboard/Chat/Channels/Skills/Cron/Settings
|
||||||
|
│ ├── i18n/ # Ресурсы локализации
|
||||||
|
│ └── types/ # Определения типов TypeScript
|
||||||
|
├── tests/
|
||||||
|
│ ├── e2e/ # Сквозные дымовые тесты Playwright Electron
|
||||||
|
│ └── unit/ # Модульные/интеграционные тесты Vitest
|
||||||
|
├── resources/ # Статические ресуры (иконки, изображения)
|
||||||
|
└── scripts/ # Скрипты сборки и утилит
|
||||||
|
```
|
||||||
|
|
||||||
|
### Доступные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Разработка
|
||||||
|
pnpm run init # Установить зависимости + скачать uv
|
||||||
|
pnpm dev # Запуск с горячей перезагрузкой (автоподготовка упакованных навыков при отсутствии)
|
||||||
|
|
||||||
|
# Качество кода
|
||||||
|
pnpm lint # Запустить ESLint
|
||||||
|
pnpm typecheck # Проверка типов TypeScript
|
||||||
|
|
||||||
|
# Тестирование
|
||||||
|
pnpm test # Запустить модульные тесты
|
||||||
|
pnpm run test:e2e # Запустить E2E дымовые тесты Electron с Playwright
|
||||||
|
pnpm run test:e2e:headed # Запустить E2E тесты Electron с видимым окном
|
||||||
|
pnpm run comms:replay # Вычислить метрики повторного воспроизведения коммуникаций
|
||||||
|
pnpm run comms:baseline # Обновить базовый снимок коммуникаций
|
||||||
|
pnpm run comms:compare # Сравнить метрики воспроизведения с базовыми порогами
|
||||||
|
|
||||||
|
# Сборка и упаковка
|
||||||
|
pnpm run build:vite # Собрать только фронтенд
|
||||||
|
pnpm build # Полная production-сборка (с ресурсами упаковки)
|
||||||
|
pnpm package # Упаковать для текущей платформы (включает предустановленные навыки)
|
||||||
|
pnpm package:mac # Упаковать для macOS
|
||||||
|
pnpm package:win # Упаковать для Windows
|
||||||
|
pnpm package:linux # Упаковать для Linux
|
||||||
|
```
|
||||||
|
|
||||||
|
На headless Linux запускайте тесты Electron под сервером отображения, например `xvfb-run -a pnpm run test:e2e`.
|
||||||
|
|
||||||
|
### Проверка регрессии коммуникаций
|
||||||
|
|
||||||
|
Когда PR изменяет пути коммуникации (события шлюза, поток отправки/получения чата, доставка каналов или откат транспорта), запустите:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm run comms:replay
|
||||||
|
pnpm run comms:compare
|
||||||
|
```
|
||||||
|
|
||||||
|
`comms-regression` в CI проверяет обязательные сценарии и пороги.
|
||||||
|
|
||||||
|
### E2E-тесты Electron
|
||||||
|
|
||||||
|
Сьют Playwright Electron запускает упакованный рендерер и главный процесс из `dist/` и `dist-electron/`, поэтому не требует предварительного ручного запуска `pnpm dev`.
|
||||||
|
|
||||||
|
`pnpm run test:e2e` автоматически:
|
||||||
|
|
||||||
|
- собирает рендерер и пакеты Electron с `pnpm run build:vite`
|
||||||
|
- запускает Electron в изолированном режиме E2E с временным `HOME`
|
||||||
|
- использует временный каталог `userData` ClawX
|
||||||
|
- пропускает тяжёлые побочные эффекты запуска, такие как автозапуск шлюза, установку упакованных навыков, создание трея и автоустановку CLI
|
||||||
|
|
||||||
|
Первые два базовых спецификации покрывают:
|
||||||
|
|
||||||
|
- видимость мастера настройки при первом запуске на чистом профиле
|
||||||
|
- пропуск настройки и навигация на страницу Models внутри приложения Electron
|
||||||
|
|
||||||
|
Добавляйте будущие потоки Electron в `tests/e2e/` и переиспользуйте общий fixture в `tests/e2e/fixtures/electron.ts`.
|
||||||
|
|
||||||
|
### Технологический стек
|
||||||
|
|
||||||
|
| Уровень | Технология |
|
||||||
|
|----------------|-------------------------------|
|
||||||
|
| Среда выполнения | Electron 40+ |
|
||||||
|
| UI-фреймворк | React 19 + TypeScript |
|
||||||
|
| Стилизация | Tailwind CSS + shadcn/ui |
|
||||||
|
| Состояние | Zustand |
|
||||||
|
| Сборка | Vite + electron-builder |
|
||||||
|
| Тестирование | Vitest + Playwright |
|
||||||
|
| Анимация | Framer Motion |
|
||||||
|
| Иконки | Lucide React |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Участие
|
||||||
|
|
||||||
|
Мы приветствуем вклад сообщества! Исправления багов, новые функции, улучшения документации или переводы — каждый вклад делает ClawX лучше.
|
||||||
|
|
||||||
|
### Как внести вклад
|
||||||
|
|
||||||
|
1. **Сделайте форк** репозитория
|
||||||
|
2. **Создайте** ветку функции (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. **Зафиксируйте** изменения с понятными сообщениями
|
||||||
|
4. **Отправьте** в свою ветку
|
||||||
|
5. **Откройте** Pull Request
|
||||||
|
|
||||||
|
### Руководящие принципы
|
||||||
|
|
||||||
|
- Следуйте существующему стилю кода (ESLint + Prettier)
|
||||||
|
- Пишите тесты для нового функционала
|
||||||
|
- Обновляйте документацию по мере необходимости
|
||||||
|
- Держите коммиты атомарными и описательными
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Благодарности
|
||||||
|
|
||||||
|
ClawX построен на плечах отличных проектов с открытым исходным кодом:
|
||||||
|
|
||||||
|
- [OpenClaw](https://github.com/OpenClaw) – Среда выполнения AI-агентов
|
||||||
|
- [Electron](https://www.electronjs.org/) – Кроссплатформенный десктоп-фреймворк
|
||||||
|
- [React](https://react.dev/) – Библиотека UI-компонентов
|
||||||
|
- [shadcn/ui](https://ui.shadcn.com/) – Красиво спроектированные компоненты
|
||||||
|
- [Zustand](https://github.com/pmndrs/zustand) – Легковесное управление состоянием
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Сообщество
|
||||||
|
|
||||||
|
Присоединяйтесь к нашему сообществу, чтобы общаться с другими пользователями, получать поддержку и делиться опытом.
|
||||||
|
|
||||||
|
| WeChat Enterprise | Feishu Group | Discord |
|
||||||
|
| :---: | :---: | :---: |
|
||||||
|
| <img src="src/assets/community/wecom-qr.png" width="150" alt="WeChat QR Code" /> | <img src="src/assets/community/feishu-qr.png" width="150" alt="Feishu QR Code" /> | <img src="src/assets/community/20260212-185822.png" width="150" alt="Discord QR Code" /> |
|
||||||
|
|
||||||
|
### Партнёрская программа ClawX 🚀
|
||||||
|
|
||||||
|
Мы запускаем Партнёрскую программу ClawX и ищем партнёров, которые могут помочь представить ClawX большему числу клиентов, особенно тем, у кого есть потребности в кастомных AI-агентах или автоматизации.
|
||||||
|
|
||||||
|
Партнёры помогают связывать нас с потенциальными пользователями и проектами, а команда ClawX предоставляет полную техническую поддержку, кастомизацию и интеграцию.
|
||||||
|
|
||||||
|
Если вы работаете с клиентами, заинтересованными в AI-инструментах или автоматизации, мы будем рады сотрудничеству.
|
||||||
|
|
||||||
|
Напишите нам в DM или на [public@valuecell.ai](mailto:public@valuecell.ai) для получения дополнительной информации.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## История звёзд
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://api.star-history.com/svg?repos=ValueCell-ai/ClawX&type=Date" alt="Star History Chart" />
|
||||||
|
</p>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
ClawX выпускается под [лицензией MIT](LICENSE). Вы можете свободно использовать, модифицировать и распространять это программное обеспечение.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<sub>Создано с ❤️ командой ValueCell</sub>
|
||||||
|
</p>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="README.md">English</a> | 简体中文 | <a href="README.ja-JP.md">日本語</a>
|
<a href="README.md">English</a> | 简体中文 | <a href="README.ja-JP.md">日本語</a> | <a href="README.ru-RU.md">Русский</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
BIN
resources/screenshot/ru/channels.png
Normal file
BIN
resources/screenshot/ru/channels.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 754 KiB |
BIN
resources/screenshot/ru/chat.png
Normal file
BIN
resources/screenshot/ru/chat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 622 KiB |
BIN
resources/screenshot/ru/cron.png
Normal file
BIN
resources/screenshot/ru/cron.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 697 KiB |
BIN
resources/screenshot/ru/models.png
Normal file
BIN
resources/screenshot/ru/models.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 656 KiB |
BIN
resources/screenshot/ru/settings.png
Normal file
BIN
resources/screenshot/ru/settings.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 675 KiB |
BIN
resources/screenshot/ru/skills.png
Normal file
BIN
resources/screenshot/ru/skills.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 840 KiB |
@@ -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];
|
export type LanguageCode = (typeof SUPPORTED_LANGUAGE_CODES)[number];
|
||||||
|
|
||||||
|
|||||||
@@ -39,10 +39,22 @@ import jaSkills from './locales/ja/skills.json';
|
|||||||
import jaCron from './locales/ja/cron.json';
|
import jaCron from './locales/ja/cron.json';
|
||||||
import jaSetup from './locales/ja/setup.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 = [
|
export const SUPPORTED_LANGUAGES = [
|
||||||
{ code: 'en', label: 'English' },
|
{ code: 'en', label: 'English' },
|
||||||
{ code: 'zh', label: '中文' },
|
{ code: 'zh', label: '中文' },
|
||||||
{ code: 'ja', label: '日本語' },
|
{ code: 'ja', label: '日本語' },
|
||||||
|
{ code: 'ru', label: 'Русский' },
|
||||||
] as const satisfies ReadonlyArray<{ code: LanguageCode; label: string }>;
|
] as const satisfies ReadonlyArray<{ code: LanguageCode; label: string }>;
|
||||||
|
|
||||||
const resources = {
|
const resources = {
|
||||||
@@ -79,6 +91,17 @@ const resources = {
|
|||||||
cron: jaCron,
|
cron: jaCron,
|
||||||
setup: jaSetup,
|
setup: jaSetup,
|
||||||
},
|
},
|
||||||
|
ru: {
|
||||||
|
common: ruCommon,
|
||||||
|
settings: ruSettings,
|
||||||
|
dashboard: ruDashboard,
|
||||||
|
chat: ruChat,
|
||||||
|
channels: ruChannels,
|
||||||
|
agents: ruAgents,
|
||||||
|
skills: ruSkills,
|
||||||
|
cron: ruCron,
|
||||||
|
setup: ruSetup,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
i18n
|
i18n
|
||||||
|
|||||||
77
src/i18n/locales/ru/agents.json
Normal file
77
src/i18n/locales/ru/agents.json
Normal file
@@ -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}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
392
src/i18n/locales/ru/channels.json
Normal file
392
src/i18n/locales/ru/channels.json
Normal file
@@ -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": "Просмотреть документацию"
|
||||||
|
}
|
||||||
72
src/i18n/locales/ru/chat.json
Normal file
72
src/i18n/locales/ru/chat.json
Normal file
@@ -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": "Старее месяца"
|
||||||
|
}
|
||||||
|
}
|
||||||
59
src/i18n/locales/ru/common.json
Normal file
59
src/i18n/locales/ru/common.json
Normal file
@@ -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": "Шлюз не запущен."
|
||||||
|
}
|
||||||
|
}
|
||||||
120
src/i18n/locales/ru/cron.json
Normal file
120
src/i18n/locales/ru/cron.json
Normal file
@@ -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": "Неизвестно"
|
||||||
|
}
|
||||||
|
}
|
||||||
65
src/i18n/locales/ru/dashboard.json
Normal file
65
src/i18n/locales/ru/dashboard.json
Normal file
@@ -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": "Ошибка解析 использования"
|
||||||
|
}
|
||||||
|
}
|
||||||
282
src/i18n/locales/ru/settings.json
Normal file
282
src/i18n/locales/ru/settings.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
152
src/i18n/locales/ru/setup.json
Normal file
152
src/i18n/locales/ru/setup.json
Normal file
@@ -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-команд"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
111
src/i18n/locales/ru/skills.json
Normal file
111
src/i18n/locales/ru/skills.json
Normal file
@@ -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. Проверьте подключение или установку."
|
||||||
|
}
|
||||||
|
}
|
||||||
92
tests/e2e/language-russian.spec.ts
Normal file
92
tests/e2e/language-russian.spec.ts
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user