zames_pro 2.72.8 → 2.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,20 @@ export const configMessages = {
6
6
  'cfg.group.checkpoint': { ru: 'Чекпойнты', en: 'Checkpoints' },
7
7
  'cfg.group.transcript': { ru: 'Транскрипт', en: 'Transcript' },
8
8
  'cfg.group.browser': { ru: 'Браузер / DeepSeek', en: 'Browser / DeepSeek' },
9
+ 'cfg.group.qwen': { ru: 'Qwen', en: 'Qwen' },
10
+ 'cfg.f.provider': { ru: 'Провайдер чата', en: 'Chat provider' },
11
+ 'cfg.f.qwen_model': {
12
+ ru: 'Модель Qwen (id)',
13
+ en: 'Qwen model (id)',
14
+ },
15
+ 'cfg.f.qwen_minSendIntervalMs': {
16
+ ru: 'Qwen: пауза между отправками (мс)',
17
+ en: 'Qwen: pause between sends (ms)',
18
+ },
19
+ 'cfg.f.qwen_answerTimeoutMs': {
20
+ ru: 'Qwen: таймаут ответа (мс)',
21
+ en: 'Qwen: answer timeout (ms)',
22
+ },
9
23
  'cfg.f.ui_contextLimit': {
10
24
  ru: 'Размер контекста (токены)',
11
25
  en: 'Context window (tokens)',
@@ -148,7 +162,6 @@ export const configMessages = {
148
162
  en: 'Persist the login session in the profile',
149
163
  },
150
164
  'cfg.title': { ru: 'Настройки zames', en: 'zames settings' },
151
- 'cfg.current': { ru: 'Текущий конфиг:', en: 'Current config:' },
152
165
  'cfg.usage': {
153
166
  ru: 'Использование: /config [menu | list | get <путь> | set <путь> <значение> | reset <путь> | path | lang <ru|en>]',
154
167
  en: 'Usage: /config [menu | list | get <path> | set <path> <value> | reset <path> | path | lang <ru|en>]',
@@ -179,7 +192,6 @@ export const configMessages = {
179
192
  ru: 'Конфиг (глобальный): {global}\nКонфиг (проект): {project}',
180
193
  en: 'Config (global): {global}\nConfig (project): {project}',
181
194
  },
182
- 'cfg.keys': { ru: 'Доступные параметры:', en: 'Available settings:' },
183
195
  'cfg.lang_set': {
184
196
  ru: 'Язык переключён на {v}.',
185
197
  en: 'Language switched to {v}.',
@@ -188,20 +200,4 @@ export const configMessages = {
188
200
  ru: 'Использование: /config lang <ru|en>',
189
201
  en: 'Usage: /config lang <ru|en>',
190
202
  },
191
- 'cfg.scope_current': {
192
- ru: 'Запись конфига: {v} ({file})',
193
- en: 'Config write scope: {v} ({file})',
194
- },
195
- 'cfg.scope_usage': {
196
- ru: 'Использование: /config scope <project|home>. project = .zamesrc.json (в git), home = ~/.zames/. Для личных настроек выбери home, чтобы не коммитить их.',
197
- en: 'Usage: /config scope <project|home>. project = .zamesrc.json (committed), home = ~/.zames/. Use home for personal settings so they are not committed.',
198
- },
199
- 'cfg.scope_set': {
200
- ru: 'Запись конфига: {v} ({file})',
201
- en: 'Config write scope: {v} ({file})',
202
- },
203
- 'cfg.scope_bad': {
204
- ru: 'Неизвестный scope: {v}. Используй project или home.',
205
- en: 'Unknown scope: {v}. Use project or home.',
206
- },
207
203
  };
@@ -5,28 +5,28 @@ export const deepseekMessages = {
5
5
  // printed around the moment they happen (browser.ts / agent-loop.ts), not as
6
6
  // a bare error at the end of the run.
7
7
  'ds.rate_limit_wait': {
8
- ru: '⏳ DeepSeek: «слишком часто». Жду {min} мин ({attempt}/{max}) и повторю отправку...',
9
- en: '⏳ DeepSeek: "too frequent". Waiting {min} min ({attempt}/{max}), then resending...',
8
+ ru: '⏳ {provider}: «слишком часто». Жду {min} мин ({attempt}/{max}) и повторю отправку...',
9
+ en: '⏳ {provider}: "too frequent". Waiting {min} min ({attempt}/{max}), then resending...',
10
10
  },
11
11
  'ds.rate_limit_give_up': {
12
- ru: '✖ DeepSeek не принял сообщение после {attempt} пауз по {min} мин. Подожди и попробуй снова.',
13
- en: '✖ DeepSeek refused the message after {attempt} waits of {min} min. Wait and try again.',
12
+ ru: '✖ {provider} не принял сообщение после {attempt} пауз по {min} мин. Подожди и попробуй снова.',
13
+ en: '✖ {provider} refused the message after {attempt} waits of {min} min. Wait and try again.',
14
14
  },
15
15
  'ds.server_busy_wait': {
16
- ru: '⏳ DeepSeek: сервер занят. Жду {sec}с ({attempt}/{max}) и повторю...',
17
- en: '⏳ DeepSeek: server busy. Waiting {sec}s ({attempt}/{max}), then retrying...',
16
+ ru: '⏳ {provider}: сервер занят. Жду {sec}с ({attempt}/{max}) и повторю...',
17
+ en: '⏳ {provider}: server busy. Waiting {sec}s ({attempt}/{max}), then retrying...',
18
18
  },
19
19
  'ds.server_busy_give_up': {
20
- ru: '✖ DeepSeek: сервер не ответил после {attempt} повторов. Попробуй позже.',
21
- en: '✖ DeepSeek: the server did not respond after {attempt} retries. Try again later.',
20
+ ru: '✖ {provider}: сервер не ответил после {attempt} повторов. Попробуй позже.',
21
+ en: '✖ {provider}: the server did not respond after {attempt} retries. Try again later.',
22
22
  },
23
23
  'ds.ask_retry': {
24
24
  ru: '⚠ Отправка не удалась (попытка {attempt}/{max} на этот запрос): {error} — повторяю...',
25
25
  en: '⚠ Send failed (attempt {attempt}/{max} for this request): {error} — retrying...',
26
26
  },
27
27
  'ds.incomplete_retry': {
28
- ru: '⏳ DeepSeek оборвал ответ и кнопки Continue нет — переотправляю задачу ({attempt}/{max})...',
29
- en: '⏳ DeepSeek truncated the answer and there is no Continue button — resending the task ({attempt}/{max})...',
28
+ ru: '⏳ {provider} оборвал ответ и кнопки Continue нет — переотправляю задачу ({attempt}/{max})...',
29
+ en: '⏳ {provider} truncated the answer and there is no Continue button — resending the task ({attempt}/{max})...',
30
30
  },
31
31
  'ds.attach_read_failed': {
32
32
  ru: '⚠ не удалось прочитать вложение {name}: {error}',
@@ -41,8 +41,8 @@ export const deepseekMessages = {
41
41
  en: '⚠ could not attach the files: {error}',
42
42
  },
43
43
  'ds.incomplete_give_up': {
44
- ru: '✖ DeepSeek {attempt} раз подряд оборвал ответ, не дойдя до конца. Возможно, включён режим размышления — попробуй выключить его (browser.deepThinking) или повтори позже.',
45
- en: '✖ DeepSeek truncated the answer {attempt} times in a row. The reasoning mode (deep thinking) may be on — try turning it off (browser.deepThinking) or retry later.',
44
+ ru: '✖ {provider} {attempt} раз подряд оборвал ответ, не дойдя до конца. Возможно, включён режим размышления — попробуй выключить его (browser.deepThinking) или повтори позже.',
45
+ en: '✖ {provider} truncated the answer {attempt} times in a row. The reasoning mode (deep thinking) may be on — try turning it off (browser.deepThinking) or retry later.',
46
46
  },
47
47
  'ds.ask_restart_browser': {
48
48
  ru: '⚠ Браузер потерял страницу — перезапускаю и вхожу заново...',
@@ -53,45 +53,41 @@ export const deepseekMessages = {
53
53
  en: '⚠ Could not restart the browser: {error}',
54
54
  },
55
55
  'ds.ask_failed': {
56
- ru: '✖ Не удалось получить ответ от DeepSeek после {max} попыток: {error}',
57
- en: '✖ Could not get an answer from DeepSeek after {max} attempts: {error}',
56
+ ru: '✖ Не удалось получить ответ от {provider} после {max} попыток: {error}',
57
+ en: '✖ Could not get an answer from {provider} after {max} attempts: {error}',
58
58
  },
59
59
  'ds.input_missing': {
60
- ru: '✖ Не найдено поле ввода на странице DeepSeek. Запусти /debug-dom и поправь INPUT_SELECTORS.',
61
- en: '✖ The DeepSeek input field was not found. Run /debug-dom and fix INPUT_SELECTORS.',
60
+ ru: '✖ Не найдено поле ввода на странице {provider}. Запусти /debug-dom и поправь INPUT_SELECTORS.',
61
+ en: '✖ The {provider} input field was not found. Run /debug-dom and fix INPUT_SELECTORS.',
62
62
  },
63
63
  'ds.input_partial': {
64
64
  ru: '✖ Не удалось вставить текст в поле ввода целиком ({got} из {want} символов). Сообщение не отправлено, чтобы не отправить обрезанный текст. Попробуй ещё раз или разбей сообщение.',
65
65
  en: '✖ Could not paste the whole text into the input ({got} of {want} chars). The message was not sent to avoid sending a truncated text. Retry or split the message.',
66
66
  },
67
67
  'ds.send_no_start': {
68
- ru: '✖ Ответ не начал генерироваться за 35с даже после повторной отправки. Проверь чат DeepSeek вручную (возможно, кнопка отправки не нажимается или сессия разлогинилась).',
69
- en: '✖ The answer did not start generating within 35s even after resending. Check the DeepSeek chat manually (the send button may not be clickable or the session may have expired).',
68
+ ru: '✖ Ответ не начал генерироваться за 35с даже после повторной отправки. Проверь чат {provider} вручную (возможно, кнопка отправки не нажимается или сессия разлогинилась).',
69
+ en: '✖ The answer did not start generating within 35s even after resending. Check the {provider} chat manually (the send button may not be clickable or the session may have expired).',
70
70
  },
71
71
  'ds.send_no_new_answer': {
72
- ru: '✖ Новый ответ не получен — на странице остался прежний текст. Возможно, сообщение не отправилось. Проверь чат DeepSeek вручную.',
73
- en: '✖ No new answer received — the page still shows the previous text. The message may not have been sent. Check the DeepSeek chat manually.',
72
+ ru: '✖ Новый ответ не получен — на странице остался прежний текст. Возможно, сообщение не отправилось. Проверь чат {provider} вручную.',
73
+ en: '✖ No new answer received — the page still shows the previous text. The message may not have been sent. Check the {provider} chat manually.',
74
74
  },
75
75
  'ds.continue_clicked': {
76
- ru: '▶ Нажал «Continue» (DeepSeek приостановил вывод — возобновляю).',
77
- en: '▶ Clicked "Continue" (DeepSeek paused the output — resuming).',
76
+ ru: '▶ Нажал «Continue» ({provider} приостановил вывод — возобновляю).',
77
+ en: '▶ Clicked "Continue" ({provider} paused the output — resuming).',
78
78
  },
79
79
  'ds.answer_timeout': {
80
- ru: '⏳ DeepSeek не ответил за {sec}с ({attempt}/{max}) — повторяю запрос...',
81
- en: '⏳ DeepSeek did not answer within {sec}s ({attempt}/{max}) — retrying the request...',
80
+ ru: '⏳ {provider} не ответил за {sec}с ({attempt}/{max}) — повторяю запрос...',
81
+ en: '⏳ {provider} did not answer within {sec}s ({attempt}/{max}) — retrying the request...',
82
82
  },
83
83
  'ds.answer_timeout_give_up': {
84
- ru: '✖ DeepSeek перестал отвечать, лимит повторов исчерпан. Модель не дала ответа — проверь чат DeepSeek вручную.',
85
- en: '✖ DeepSeek stopped responding, retry limit exhausted. The model gave no answer — check the DeepSeek chat manually.',
84
+ ru: '✖ {provider} перестал отвечать, лимит повторов исчерпан. Модель не дала ответа — проверь чат вручную.',
85
+ en: '✖ {provider} stopped responding, retry limit exhausted. The model gave no answer — check the chat manually.',
86
86
  },
87
87
  'ds.tool_retry': {
88
88
  ru: '⏳ Агент не распознал ответ модели — прошу продолжить ({attempt}/{max})...',
89
89
  en: '⏳ The agent did not recognize the model answer — asking it to continue ({attempt}/{max})...',
90
90
  },
91
- 'ds.stalled': {
92
- ru: '⚠ Агент остановился, не завершив задачу (модель перестала вызывать инструменты). Проверь чат DeepSeek — задача может быть не выполнена.',
93
- en: '⚠ The agent stopped before finishing (the model stopped calling tools). Check the DeepSeek chat — the task may be incomplete.',
94
- },
95
91
  'ds.not_launched': {
96
92
  ru: '✖ Браузер не запущен.',
97
93
  en: '✖ The browser is not launched.',
@@ -145,17 +141,21 @@ export const deepseekMessages = {
145
141
  ru: 'Войдите в DeepSeek: откройте https://chat.deepseek.com/ в своём браузере. Если включён headless — задайте логин/пароль через /config или запустите с --headed.',
146
142
  en: 'Sign in to DeepSeek: open https://chat.deepseek.com/ in your browser. If headless is on — set the login/password via /config or run with --headed.',
147
143
  },
148
- 'auth.session_saved': {
149
- ru: 'Сессия DeepSeek сохранена.',
150
- en: 'DeepSeek session saved.',
144
+ 'auth.mfa_required': {
145
+ ru: '🔐 DeepSeek требует код подтверждения на почту {v}.',
146
+ en: '🔐 DeepSeek requires a verification code sent to {v}.',
147
+ },
148
+ 'auth.mfa_code_sent': {
149
+ ru: '🔐 DeepSeek требует код подтверждения. Запросил код на почту {v} — проверь почту.',
150
+ en: '🔐 DeepSeek requires a verification code. Requested a code to {v} — check your inbox.',
151
151
  },
152
- 'auth.session_restored': {
153
- ru: 'Сессия DeepSeek восстановлена.',
154
- en: 'DeepSeek session restored.',
152
+ 'auth.mfa_prompt': {
153
+ ru: 'Код из письма: ',
154
+ en: 'Code from the email: ',
155
155
  },
156
- 'auth.enter_to_continue': {
157
- ru: 'Нажмите Enter, чтобы продолжить...',
158
- en: 'Press Enter to continue...',
156
+ 'auth.mfa_failed': {
157
+ ru: 'Код подтверждения не принят: {v}',
158
+ en: 'The verification code was not accepted: {v}',
159
159
  },
160
160
  'cfg.menu.title': {
161
161
  ru: '⚙ Настройки — выбери параметр',
@@ -127,10 +127,6 @@ export const doctorMessages = {
127
127
  ru: 'Часть модулей не перезагрузилась:',
128
128
  en: 'Some modules failed to reload:',
129
129
  },
130
- 'msg.reload_done': {
131
- ru: 'Перезагружено модулей: {n}. Браузер и чат не тронуты.',
132
- en: 'Reloaded modules: {n}. Browser and chat untouched.',
133
- },
134
130
  'msg.reload_error': { ru: 'Ошибка reload:', en: 'Reload error:' },
135
131
  'msg.abort_gen_short': {
136
132
  ru: '⏹ Esc — прерываю генерацию...',
package/dist/i18n/help.js CHANGED
@@ -377,10 +377,6 @@ export const helpMessages = {
377
377
  ru: '🗜️ Сжимаю историю чата (DeepSeek)...',
378
378
  en: '🗜️ Compacting the chat history (DeepSeek)...',
379
379
  },
380
- 'compact.empty': {
381
- ru: 'Нечего сжимать: в чате ещё нет ответов.',
382
- en: 'Nothing to compact: the chat has no answers yet.',
383
- },
384
380
  'compact.summary_failed': {
385
381
  ru: 'Не удалось получить резюме от модели: {v}',
386
382
  en: 'Could not get the summary from the model: {v}',
@@ -427,6 +423,14 @@ export const helpMessages = {
427
423
  ru: '/config lang <ru|en> сменить язык интерфейса и агента',
428
424
  en: '/config lang <ru|en> switch UI and agent language',
429
425
  },
426
+ 'help.cmd.provider': {
427
+ ru: '/provider <deepseek|qwen> переключить провайдера чата',
428
+ en: '/provider <deepseek|qwen> switch the chat provider',
429
+ },
430
+ 'help.cmd.model': {
431
+ ru: '/model [id] показать/выбрать модель Qwen',
432
+ en: '/model [id] show/pick the Qwen model',
433
+ },
430
434
  'help.cmd.debug_dom': {
431
435
  ru: '/debug-dom сохранить HTML страницы (для отладки)',
432
436
  en: '/debug-dom dump page HTML (debug)',
@@ -461,10 +465,6 @@ export const helpMessages = {
461
465
  ru: '🧠 Заметка добавлена в {v}',
462
466
  en: '🧠 Note appended to {v}',
463
467
  },
464
- 'init.exists': {
465
- ru: 'AGENTS.md уже существует: {v}',
466
- en: 'AGENTS.md already exists: {v}',
467
- },
468
468
  'init.created': { ru: 'Создан {v}', en: 'Created {v}' },
469
469
  'init.analyzing': {
470
470
  ru: 'Изучаю проект и готовлю AGENTS.md...',
@@ -4,10 +4,6 @@ export const promptMessages = {
4
4
  ru: 'ВАЖНО: отвечай оператору на русском языке. Весь текст в поле message инструмента respond, а также любые пояснения — на русском.',
5
5
  en: 'IMPORTANT: reply to the operator in English. All text in the respond tool message field, and any explanations, must be in English.',
6
6
  },
7
- 'prompt.tools_header': {
8
- ru: 'You have access to the following tools:',
9
- en: 'You have access to the following tools:',
10
- },
11
7
  // The hard "ONLY TOOL CALLS" block. All prose around a tool call is a
12
8
  // protocol violation: the operator never sees it (only tool calls and the
13
9
  // final respond reach the terminal), so it is pure pollution. We cannot
@@ -0,0 +1,85 @@
1
+ // Qwen (chat.qwen.ai) provider messages — everything the operator sees while
2
+ // the active backend is Qwen. Kept in its own section file (like deepseek.ts)
3
+ // so provider-specific wording has one home.
4
+ export const qwenMessages = {
5
+ 'qwen.guest_mode': {
6
+ ru: 'Qwen: вход не выполнен, работаю в гостевом режиме (≈10 сообщений в сутки, без вложений). Войдите через /provider login или запустите с --headed.',
7
+ en: 'Qwen: not signed in, running in guest mode (~10 messages/day, no attachments). Log in via /provider login or launch with --headed.',
8
+ },
9
+ 'qwen.login_email_prompt': {
10
+ ru: 'Email для входа в Qwen{def}: ',
11
+ en: 'Qwen login email{def}: ',
12
+ },
13
+ 'qwen.login_code_prompt': {
14
+ ru: 'Код из письма Qwen: ',
15
+ en: 'Qwen email code: ',
16
+ },
17
+ 'qwen.login_pass_prompt': {
18
+ ru: 'Пароль Qwen: ',
19
+ en: 'Qwen password: ',
20
+ },
21
+ 'qwen.login_ok': {
22
+ ru: 'Qwen: вход выполнен.',
23
+ en: 'Qwen: signed in.',
24
+ },
25
+ 'qwen.login_failed': {
26
+ ru: 'Qwen: войти не удалось. Войдите вручную в окне браузера (запустите с --headed) и повторите.',
27
+ en: 'Qwen: sign-in failed. Sign in manually in the browser window (launch with --headed) and retry.',
28
+ },
29
+ 'qwen.attach_unsupported': {
30
+ ru: 'Qwen: вложения пока не поддерживаются — файлы не отправлены.',
31
+ en: 'Qwen: attachments are not supported yet — files were not sent.',
32
+ },
33
+ 'qwen.guest_limit': {
34
+ ru: 'Qwen: исчерпан суточный лимит гостя. Войдите в аккаунт (email / Google / GitHub) командой /provider login или запустите с --headed.',
35
+ en: 'Qwen: the guest daily limit is exhausted. Sign in (email / Google / GitHub) with /provider login, or launch with --headed.',
36
+ },
37
+ 'qwen.restart_browser': {
38
+ ru: '⚠ Qwen: страница браузера потеряна — перезапускаю и вхожу заново...',
39
+ en: '⚠ Qwen: the browser lost the page — restarting and signing in again...',
40
+ },
41
+ 'qwen.restart_failed': {
42
+ ru: '⚠ Qwen: не удалось перезапустить браузер: {error}',
43
+ en: '⚠ Qwen: could not restart the browser: {error}',
44
+ },
45
+ 'qwen.model_set': {
46
+ ru: 'Модель Qwen: {v}',
47
+ en: 'Qwen model: {v}',
48
+ },
49
+ 'qwen.model_list': {
50
+ ru: 'Доступные модели Qwen:\n{v}',
51
+ en: 'Available Qwen models:\n{v}',
52
+ },
53
+ 'qwen.model_error': {
54
+ ru: 'Не удалось получить список моделей Qwen: {v}',
55
+ en: 'Failed to fetch the Qwen model list: {v}',
56
+ },
57
+ 'provider.switched': {
58
+ ru: 'Провайдер чата: {v}. Перезапустите zames, чтобы сменить браузер.',
59
+ en: 'Chat provider: {v}. Restart zames to switch the browser.',
60
+ },
61
+ 'provider.usage': {
62
+ ru: 'Использование: /provider <deepseek|qwen> | /provider login | /provider status',
63
+ en: 'Usage: /provider <deepseek|qwen> | /provider login | /provider status',
64
+ },
65
+ 'provider.handoff_saved': {
66
+ ru: 'Контекст текущего чата сжат и сохранён для {v}. Он подхватится при следующем запуске.',
67
+ en: 'The current chat was summarized and saved for {v}. It will be carried over on the next launch.',
68
+ },
69
+ 'provider.handoff_used': {
70
+ ru: '📎 Подхватил контекст предыдущего провайдера (carried-over summary).',
71
+ en: '📎 Carried over the previous provider context (handoff summary).',
72
+ },
73
+ 'provider.handoff_empty': {
74
+ ru: 'Не удалось сжать историю — контекст НЕ перенесён. Текущий чат останется у старого провайдера.',
75
+ en: 'Could not summarize the chat — context NOT carried over. The current chat stays with the old provider.',
76
+ },
77
+ 'provider.login_done': {
78
+ ru: 'Проверка входа завершена.',
79
+ en: 'Login check complete.',
80
+ },
81
+ 'provider.status': {
82
+ ru: 'Провайдер: {v}, модель: {m}, вход: {auth}',
83
+ en: 'Provider: {v}, model: {m}, login: {auth}',
84
+ },
85
+ };
@@ -112,7 +112,6 @@ export const selfReviewMessages = {
112
112
  ru: '\nИспользуй /resume <n> для продолжения.\n',
113
113
  en: '\nUse /resume <n> to continue.\n',
114
114
  },
115
- 'chats.none': { ru: 'Чатов не найдено.', en: 'No chats found.' },
116
115
  'chats.none_hint': {
117
116
  ru: 'Чатов не найдено. Возможно, сайдбар свёрнут или селекторы устарели.',
118
117
  en: 'No chats found. The sidebar may be collapsed or the selectors are outdated.',
@@ -142,10 +141,6 @@ export const selfReviewMessages = {
142
141
  en: 'No chat #{n}. Total: {total}.',
143
142
  },
144
143
  'chats.opening': { ru: 'Открываю: {v}', en: 'Opening: {v}' },
145
- 'chats.context_kept': {
146
- ru: ' Контекст чата сохранён. Системный промпт будет переслан на следующей задаче.\n',
147
- en: ' Chat context kept. The system prompt will be resent on the next task.\n',
148
- },
149
144
  'chats.prompt_will_resend': {
150
145
  ru: ' Системный промпт будет переслан на следующей задаче.\n',
151
146
  en: ' System prompt will be resent on the next task.\n',
package/dist/i18n.js CHANGED
@@ -16,6 +16,7 @@ import { selfReviewMessages } from './i18n/self-review.js';
16
16
  import { mcpMessages } from './i18n/mcp.js';
17
17
  import { configMessages } from './i18n/config.js';
18
18
  import { promptMessages } from './i18n/prompt.js';
19
+ import { qwenMessages } from './i18n/qwen.js';
19
20
  export const DEFAULT_LOCALE = 'ru';
20
21
  export const LOCALES = [
21
22
  { code: 'ru', name: 'Русский', englishName: 'Russian' },
@@ -47,6 +48,7 @@ export const CATALOG = {
47
48
  ...mcpMessages,
48
49
  ...configMessages,
49
50
  ...promptMessages,
51
+ ...qwenMessages,
50
52
  };
51
53
  export function translate(locale) {
52
54
  const loc = isLocale(locale) ? locale : DEFAULT_LOCALE;