Skip to content

Commit 62998b4

Browse files
authored
fix(i18n): complete RU parity with dev en.ts + refresh RU docs (#211)
that dev's en.ts had gained since the PR was cut — breaking the gui build (tsc -b) on every dev CI run since. This adds the 13 missing keys, re-translates 5 keys whose English wording changed (billing framing reworded to clarify these are list-price estimates, not actual charges), and refreshes the RU docs pages that drifted behind English in the same window (the new `ocx account` CLI reference section, the related providers.md subsection, a web-dashboard.md disclaimer paragraph, and the README.ru.md CLI cheat-sheet line). Translations for the 13 missing keys are seeded from the maintainer's own in-flight fix branch (04e9f85), reviewed and adjusted only where needed for consistency/correctness; see PR description for details.
1 parent 15d83ba commit 62998b4

6 files changed

Lines changed: 161 additions & 13 deletions

File tree

README.ru.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ ocx codex-shim install # выполнять `ocx ensure` при кажд
289289
ocx status # работает ли прокси?
290290
ocx login <provider> # вход через OAuth (xai, anthropic, kimi, cursor, ...)
291291
ocx logout <provider> # удалить сохранённый вход
292+
ocx account <list|current|use> # просмотр/переключение аккаунтов и пулов API-ключей (маскировано; также refresh/auto-switch/remove/add-key)
292293
ocx gui # открыть веб-панель управления
293294
ocx claude [args...] # запустить Claude Code, подключённый к прокси (обнаружение моделей включено)
294295
ocx service [install|start|stop|status|uninstall] # установить/обновить/запустить фоновую службу

docs-site/src/content/docs/ru/guides/providers.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,13 @@ Providers, сохраняется в `provider.apiKeyPool`, становится
143143
же выпадающем списке можно переключать и удалять ключи; API управления — `/api/providers/keys`, он
144144
возвращает только маскированные ключи.
145145

146+
### Переключение аккаунтов из терминала
147+
148+
Используйте `ocx account list`, `ocx account current` и `ocx account use`, чтобы просматривать и
149+
переключать те же пулы Codex, OAuth и API-ключей, не открывая дашборд. Команды, JSON-вывод и
150+
поведение в новых сессиях описаны в разделе
151+
[Справочник CLI](/opencodex/ru/reference/cli/#ocx-account-subcommand).
152+
146153
### Превью-маршруты GPT-5.6
147154

148155
GPT-5.6 Sol/Terra/Luna заранее внесены в резервные списки провайдеров, чтобы `ocx sync` сохранял

docs-site/src/content/docs/ru/guides/web-dashboard.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ bun run dev:gui
3939
| **Usage / Debug** | Просмотр покрытия и трендов расхода токенов либо включение опциональной диагностики транспорта провайдеров и извлечения данных об использовании. |
4040
| **Stop** | Корректная остановка прокси и установленного фонового сервиса, восстановление нативного Codex и выход (`POST /api/stop`). |
4141

42+
Значения стоимости в **Logs** и **Usage** — это эквиваленты стоимости по прайс-листу API,
43+
рассчитанные на основе сообщённых токенов. Они не являются счётом и не подтверждают фактическое
44+
списание; расходы могут покрываться подпиской или кредитами провайдера.
45+
4246
## Селектор делегирования и маршрутизация порождений
4347

4448
Селектор **Sub-agent delegation** в дашборде сохраняет `injectionModel` и, при желании,

docs-site/src/content/docs/ru/reference/cli.md

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,144 @@ ocx provider show anthropic --json
203203
ocx models --provider anthropic --json
204204
```
205205

206+
### `ocx account <subcommand>`
207+
208+
Перечисляет и переключает аккаунты провайдеров и пулы API-ключей через работающий прокси.
209+
Поставляемая справка выглядит так:
210+
211+
```text
212+
Usage: ocx account <list|current|use|refresh|auto-switch|remove|add-key> ...
213+
214+
List and switch provider accounts and API-key pools (GUI parity).
215+
216+
list [provider] Codex account pool, OAuth accounts and API keys (identifiers shown masked as the API returns them).
217+
current <provider> Show the active account or key.
218+
use <provider> <id> Switch the active credential; 'main' selects the Codex App login.
219+
refresh <provider> Force-refresh Codex or provider quota reports.
220+
auto-switch <provider> <on|off|status|threshold N> Control the Codex pool threshold.
221+
remove <provider> <id> --yes Remove a stored account or key after an existence check.
222+
add-key <provider> [--label <label>] Add a key read only from piped stdin.
223+
Codex pool switches apply to new sessions; running threads keep their account.
224+
```
225+
226+
Все подкоманды требуют работающего прокси; CLI автоматически определяет записанный runtime-порт.
227+
Успешные операции завершаются с кодом 0. Неверное использование, неизвестный провайдер или id
228+
аккаунта/ключа, недоступный прокси и ошибка API завершаются с кодом 1. Поля учётных данных
229+
отображаются ровно так, как их возвращает management API (включая его маскирование); API-ключи и
230+
OAuth-токены в открытом виде никогда не возвращаются. Отображаемые для удобства значения
231+
синтезируются на стороне клиента, так же как в дашборде: `main` — это CLI-алиас входа Codex App
232+
в пуле аккаунтов `openai`, OAuth-аккаунты без email отображаются как `Account N`, а столбец
233+
plan/label по цепочке фолбэков использует план, замаскированный email, метку и замаскированный
234+
ключ.
235+
236+
Строки аккаунтов в `--json` используют общую структуру (необязательные поля опускаются, когда
237+
данные недоступны):
238+
239+
```json
240+
{
241+
"provider": "openai",
242+
"type": "codex | oauth | api-key",
243+
"id": "__main__",
244+
"label": "plus",
245+
"email": "m***@example.com",
246+
"plan": "plus",
247+
"masked": "sk-ab****wxyz",
248+
"active": true,
249+
"needsReauth": false,
250+
"quota": null
251+
}
252+
```
253+
254+
#### `ocx account list [provider] [--json] [--all]`
255+
256+
Без указания провайдера перечисляет пул Codex, OAuth-аккаунты и настроенные пулы API-ключей.
257+
Пустые провайдеры пропускаются, если не передан `--all`. С указанным провайдером перечисляет
258+
только это семейство учётных данных. Человекочитаемый вывод использует столбцы
259+
`PROVIDER TYPE ID PLAN/LABEL STATUS`; закреплённая строка Codex помечается как `next session`.
260+
Если существует сохранённый аккаунт Kiro, вывод отмечает, что у Kiro один слот входа и что
261+
повторный вход заменяет текущий аккаунт. Пустой результат — по-прежнему успех. `--json`
262+
возвращает:
263+
264+
```text
265+
{ accounts: AccountRow[], notes: string[] }
266+
```
267+
268+
#### `ocx account current <provider> [--json]`
269+
270+
Показывает активный аккаунт или ключ. Пул Codex без ручного закрепления сообщает об
271+
автоматическом выборе аккаунта с наименьшим использованием; другое семейство без активных учётных
272+
данных сообщает об этом состоянии и всё равно завершается с кодом 0. `--json` возвращает:
273+
274+
```text
275+
{ provider, type, activeId: string | null, autoSwitchThreshold?: number, account: AccountRow | null }
276+
```
277+
278+
#### `ocx account use <provider> <account-or-key-id|main> [--json]`
279+
280+
Выбирает существующий аккаунт Codex, OAuth-аккаунт или API-ключ. Для `openai` значение `main`
281+
выбирает вход Codex App. Выбор для Codex применяется только к **новым сессиям**; существующие
282+
потоки сохраняют свой аккаунт, а включённый порог автопереключения может позже переопределить
283+
ручное закрепление. Неизвестные провайдеры или id завершаются с кодом 1. `--json` возвращает:
284+
285+
```text
286+
{ ok: true, provider, type, activeId }
287+
```
288+
289+
#### `ocx account refresh <provider> [--json]`
290+
291+
Для пула Codex используйте `ocx account refresh openai [--json]`. Команда принудительно обновляет
292+
квоты аккаунтов и печатает доступные недельные/месячные проценты и время сброса; отсутствующие
293+
данные о квоте сообщаются как неизвестные, а не как 0%. JSON-обёртка команды —
294+
`{ accounts: AccountRow[] }` с полем `quota` в каждой строке Codex.
295+
296+
Для OAuth-провайдеров и провайдеров с API-ключами команда принудительно обновляет конечную точку
297+
отчёта о квотах провайдера; это не повторный вход по токену и не простое перечитывание списка
298+
аккаунтов. `--json` возвращает `{ provider, report: ProviderQuotaReport | null }`. Провайдер без
299+
поддерживаемого отчёта о квотах печатает `no quota report available for <provider>` и завершается
300+
с кодом 0. Неизвестные провайдеры и ошибки management API завершаются с кодом 1; неудачная или
301+
истёкшая по времени вышестоящая проверка квоты вместо этого деградирует до null-отчёта или
302+
устаревшего отчёта (код 0), как и полосы квот в дашборде.
303+
304+
#### `ocx account auto-switch <provider> <on|off|status|threshold <0-100>> [--json]`
305+
306+
Управляет только пулом аккаунтов Codex `openai`. `on` устанавливает 80%, `off` устанавливает 0%,
307+
`status` читает текущее значение, а `threshold <n>` принимает целое число от 0 до 100. Другие
308+
провайдеры и недопустимые значения завершаются с кодом 1. `--json` возвращает:
309+
310+
```text
311+
{ provider, autoSwitchThreshold: number, enabled: boolean }
312+
```
313+
314+
#### `ocx account remove <provider> <id|main> --yes [--json]`
315+
316+
Это защищённое неинтерактивное удаление требует `--yes`. Перед удалением команда проверяет, что
317+
id существует; отсутствующий id завершается с кодом 1 без отправки DELETE. Основной вход Codex App
318+
удалить нельзя, поэтому `remove openai main --yes` отклоняется. После удаления семейство читается
319+
заново: удаление закреплённого аккаунта Codex снимает закрепление и возвращает автоматический
320+
выбор; OAuth делает активным первый оставшийся аккаунт или сообщает, что аккаунтов не осталось;
321+
пулы API-ключей делают активным первый оставшийся ключ или сообщают, что ключей не осталось.
322+
Структуры `--json` для успеха и ошибки:
323+
324+
```text
325+
{ ok: true, provider, id, removedActive: boolean, promotedActiveId: string | null }
326+
{ error: string } // stderr, exit 1
327+
```
328+
329+
#### `ocx account add-key <provider> [--label <label>] [--json]`
330+
331+
Добавляет и активирует ключ для провайдера с API-ключами. Ключ читается только из
332+
неинтерактивного (не-TTY) stdin — через конвейер или перенаправление; интерактивный ввод в TTY,
333+
пустой ввод, провайдеры OAuth/Codex и ошибки API завершаются с кодом 1. Ключ никогда не выводится
334+
на экран, в том числе когда он встречается внутри метки. Предпочитайте менеджер секретов или
335+
here-string:
336+
337+
```bash
338+
ocx account add-key openrouter --label personal <<< "$OPENROUTER_API_KEY"
339+
security find-generic-password -w openrouter | ocx account add-key openrouter --json
340+
```
341+
342+
`--json` возвращает `{ ok: true, id: string | null, label?: string }` и никогда не включает ключ.
343+
206344
## Аутентификация
207345

208346
### `ocx login <provider>`

docs-site/src/data/frontier-i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Generated from PR #144 (gui/src/i18n/{en,ko,zh}.ts) — frontier.* keys only.
2-
// German strings from the PR are dropped: the docs-site ships en/ko/zh-CN.
2+
// German strings from the PR are dropped: the docs-site ships en/ko/zh-CN/ru.
33
export const FRONTIER_STRINGS = {
44
en: {
55
"frontier.subtitle": "Compare models on public coding-agent benchmarks: capability vs cost per task. Pick a domain, then a board; filter by model, effort, price, or use-case. Snapshot data — update with OpenCodex releases, not live metering.",

gui/src/i18n/ru.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import type { TKey } from "./en";
22

33
export const ru: Record<TKey, string> = {
4-
// English — source of truth. Its keys define the TKey type; ko/zh must match (compile-checked).
5-
// Strings with {cmd} render a <code> chip via <Trans>; {var} are plain interpolations.
64
// sidebar / nav / common
75
"nav.dashboard": "Дашборд",
86
"nav.providers": "Провайдеры",
@@ -317,17 +315,17 @@ export const ru: Record<TKey, string> = {
317315
"logs.col.tokPerSec": "tok/s",
318316
"logs.col.estimatedCost": "~$",
319317
"logs.metric.tokPerSecTitle": "Выходные токены в секунду за полную длительность запроса",
320-
"logs.metric.estimatedCostTitle": "Оценочная стоимость; при отсутствии подходящей цены значение недоступно",
321-
"usage.cost.total": "Оценочная стоимость (за этот период)",
322-
"usage.cost.disclaimer": "Не является счётом. Может применяться подписка или кредиты провайдера.",
318+
"logs.metric.estimatedCostTitle": "Эквивалент стоимости по прайс-листу API, а не фактическое списание; если цену не удалось сопоставить, значение недоступно",
319+
"usage.cost.total": "Эквивалент стоимости по прайс-листу API (за этот период)",
320+
"usage.cost.disclaimer": "Не является счётом. Расходы могут покрываться подпиской или кредитами провайдера.",
323321
"usage.cost.unpricedNote": "Исключено {count} запросов (нет цены или данных использования)",
324322
"logs.detail.section.basic": "Основная информация",
325323
"logs.detail.section.performance": "Производительность",
326-
"logs.detail.section.cost": "Оценочная стоимость",
324+
"logs.detail.section.cost": "Эквивалент стоимости по прайс-листу API",
327325
"logs.detail.section.attempts": "Попытки комбо",
328326
"logs.detail.section.usage": "Сырые данные использования",
329327
"logs.detail.ttft": "TTFT",
330-
"logs.detail.costTotal": "Итого",
328+
"logs.detail.costTotal": "Эквивалент по прайс-листу",
331329
"logs.detail.totalTokens": "Всего токенов",
332330
"logs.detail.matchedKey": "Совпавший ключ jawcode",
333331
"logs.detail.priceSource": "Источник цены",
@@ -506,7 +504,7 @@ export const ru: Record<TKey, string> = {
506504
"modal.tab.accounts": "Аккаунты",
507505
"modal.tab.free": "Бесплатные",
508506
"modal.tab.paid": "Платные",
509-
"modal.accountsHint": "Провайдеры аккаунтов Codex используют ваш вход в ChatGPT. Управление аккаунтами — в разделе",
507+
"modal.accountsHint": "Здесь можно войти в аккаунты ChatGPT/Codex и OAuth-провайдеров, а также в аккаунты с API-ключами. Провайдер OpenAI уже встроен — просто войдите, а не добавляйте его заново.",
510508
"modal.accountsCodexAuthLink": "Аутентификация Codex",
511509
"modal.notListed": "Нет нужного провайдера? Добавьте свой",
512510
"modal.catalogLoading": "Загрузка каталога…",
@@ -617,9 +615,9 @@ export const ru: Record<TKey, string> = {
617615
"pws.modelSearchPlaceholder": "Фильтр моделей…",
618616
"pws.modelsLoading": "Загрузка моделей…",
619617
"pws.modelsLoadFailed": "Не удалось загрузить модели.",
620-
"pws.modelsNeedsReauth": "Для обнаружения моделей необходимо повторно войти в аккаунт. Пока отображаются настроенные модели.",
618+
"pws.modelsNeedsReauth": "Для автоматического обнаружения моделей необходимо повторно войти в аккаунт. Пока отображаются настроенные модели.",
621619
"pws.modelsConfiguredFallback": "Отображаются настроенные модели (автоматическое обнаружение недоступно).",
622-
"pws.modelsTruncated": "Показаны первые {shown} из {total} моделей. Примените фильтр для уточнения списка.",
620+
"pws.modelsTruncated": "Показаны первые {shown} моделей из {total}. Примените фильтр, чтобы сузить список.",
623621
"pws.retry": "Повторить",
624622
"pws.noModels": "Для этого провайдера модели не обнаружены.",
625623
"pws.noModelMatch": "Нет моделей, соответствующих фильтру.",
@@ -717,8 +715,8 @@ export const ru: Record<TKey, string> = {
717715
"modal.apiKeyPlaceholder": "sk-… (или $ENV_VAR)",
718716
"modal.defaultModelPlaceholder": "напр. gpt-5.5",
719717
"modal.baseUrlPlaceholder": "https://...",
720-
"modal.baseUrlPlaceholderError": "Базовый URL содержит неразрешённый {placeholder}. Замените его вашим фактическим значением.",
721-
"modal.baseUrlPlaceholderHint": "Замените {placeholder} в базовом URL на ваш фактический Account ID перед добавлением.",
718+
"modal.baseUrlPlaceholderError": "Базовый URL содержит незаменённый {placeholder}. Замените его реальным значением.",
719+
"modal.baseUrlPlaceholderHint": "Перед добавлением замените {placeholder} в базовом URL на реальный ID аккаунта.",
722720
"modal.adding": "Добавление…",
723721
"modal.useOauthLogin": "← Войти через OAuth",
724722
"nav.codexAuth": "Аутентификация Codex",

0 commit comments

Comments
 (0)