Files
huly-platform/plugins/setting-assets/lang/ru.json
T
Don KendallandGitHub 5a3d673e84 feat(account): revocable API tokens managed from account settings (#10624)
* feat: API token management in workspace settings

Add UI and backend support for creating, listing, and revoking
API tokens scoped to workspaces. Includes owner-level workspace
token visibility, OpenAPI documentation, Mongo/Postgres persistence,
and i18n translations.

Signed-off-by: Don Kendall <kendall@donkendall.com>

* feat: enforce API token revocation at transactor level

Embed apiTokenId in JWT extra field and add a per-token revocation
cache (60s TTL) in the transactor REST handler. Revoked tokens are
now rejected within ~60 seconds instead of remaining valid until
JWT expiry.

Adds checkApiTokenRevoked account service method for the transactor
to query individual token revocation status.

Signed-off-by: Don Kendall <kendall@donkendall.com>

* feat: implement Phase 1 API token scopes (read/write/delete)

Add coarse-grained scope enforcement for API tokens. Tokens can now
be created with scopes ['read:*'], ['read:*','write:*'], or
['read:*','write:*','delete:*']. Existing tokens without scopes
retain full access (backward compatible).

- DB: v26 migration adds scopes TEXT[] column to api_tokens
- Types: add scopes field to ApiToken and ApiTokenInfo
- Operations: createApiToken accepts/validates/persists scopes,
  embeds in JWT via extra.scopes
- Enforcement: withSession checks scopes against method; tx handler
  additionally requires delete:* for TxRemoveDoc
- Client: createApiToken signature accepts optional scopes param
- UI: scope preset dropdown in create popup (default: Read Only),
  permissions column in token list with i18n labels
- Also fixes 3 pre-existing TS2322/TS2345 errors in operations.ts

Signed-off-by: Don Kendall <kendall@donkendall.com>

* test: add unit tests for API token scope enforcement

- scopes.test.ts: 8 tests for hasScope() and getRequiredScope() logic
- apiTokenScopes.test.ts: 7 tests for createApiToken scope validation
  (valid scopes, multiple scopes, no scopes backward compat, invalid
  format rejection, empty array rejection, domain-scope rejection)
  and listApiTokens scopes inclusion
- Export hasScope/getRequiredScope from rpc.ts for testability

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: address review feedback — role restriction, locale parity, formatting

- Restrict API token creation/revocation to AccountRole.User or higher
  (guests cannot use API tokens), per reviewer suggestion
- Add 5 missing translation keys (ApiTokenPermissions, ApiTokenScopePreset,
  ApiTokenScopeReadOnly, ApiTokenScopeReadWrite, ApiTokenScopeFullAccess)
  to all non-en locale files to fix locale parity CI test
- Fix prettier formatting in apiTokenScopes.test.ts
- Rename local `extra` to `tokenExtra` in createApiToken to avoid
  shadowing the decoded token's `extra` field

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: address aonnikov architectural review feedback

- rpc.ts: use system service token for checkApiTokenRevoked so the
  revocation check is not coupled to the user's potentially-revoked
  bearer token; systemAccountUuid + service:'server' ensures account
  service always accepts the call
- ApiDocsSection.svelte: derive transactor base URL from
  login.metadata.LoginEndpoint (set on auth) instead of
  window.location.origin, which is not necessarily the transactor host
- ApiTokenCreatePopup.svelte: replace manual translate() calls and
  themeStore language watch with DropdownLabelsIntl + DropdownIntlItem[],
  which handle i18n automatically; error state is now IntlString
- General.svelte: remove legacy GenerateApiToken button, handler, and
  ApiTokenPopup import in favour of the new ApiTokens settings panel

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: formatting in ApiTokenPopup, apiTokenScopes test, and operations

Signed-off-by: Don Kendall <kendall@donkendall.com>

* fix: apply rushx fmt to pass CI formatting check

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix: restore (s as any) cast in server_http.ts removed by ESLint autofix

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* refactor(token): centralize API token revocation/expiry in verifyToken

Address @aonnikov's review: the bespoke checkApiTokenRevoked RPC and the
ad-hoc revocation cache in the transactor are replaced by a reusable
verifyToken in server-token that checks signature, expiry, and (for
revokable API tokens) revocation via a pluggable checker.

- server-token: add verifyToken + isTokenExpired + setApiTokenRevocationChecker
  (the 'method to verify' metadata the plugin needs, without depending on the
  account client). Revocation cache (60s TTL) now lives here, reusable by any
  service (transactor, blob access, etc.).
- account: the account is now authoritative — wrap() rejects revoked/expired
  API tokens, so any account method (selectWorkspace/getWorkspaceInfo/...)
  naturally 401s. Removed the redundant checkApiTokenRevoked method.
- account-client: drop checkApiTokenRevoked.
- transactor: withSession uses verifyToken; the registered checker reuses the
  existing getLoginInfoByToken instead of a dedicated boolean RPC. Scopes are
  parsed once and threaded through (no re-decode in the tx handler).
- tests: verifyToken/isTokenExpired unit coverage.

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(setting): derive REST API base from account-provided transactor endpoint

Address @aonnikov: the REST API host must come from the transactor endpoint
returned by the account service (the login endpoint, a ws(s):// URL), not be
constructed from window.location. Convert ws->http and append /api/v1, matching
the existing ServerManagerGeneral pattern.

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* i18n(setting): translate API token strings across all locales

Address @ArtyomSavchenko: the new API token UI strings were left in English
in non-en locales. Provide translations for ru/de/es/fr/it/pt/pt-br/zh/ja/cs/tr.
The en/ru locale-parity test passes (the prior failure was an en/ru key
mismatch, resolved by the develop merge).

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* style: wrap long lines to satisfy prettier (account utils import, ApiDocsSection)

Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(api-token): drop unenforceable scopes, harden the token lifecycle

The scopes were only ever consulted in the transactor's REST handler, so
they promised a boundary the platform did not keep:

- the WebSocket transport decodes the token and never looks at scopes, so
  a read-only token could open a socket and issue any transaction;
- even on the REST path, delete:* only matched a top-level TxRemoveDoc and
  was bypassed by nesting the removal in a TxApplyIf;
- nothing stopped a scoped token from calling createApiToken and minting
  an unscoped one.

Narrowing a token's rights has to happen in the pipeline, where it covers
every transport, and that is a larger design than this feature. Until then
a token carries its account's rights and says so, rather than displaying a
restriction that does not hold. Scopes are removed end to end.

What is kept is made to work:

- API tokens can no longer create, list or revoke API tokens. Otherwise a
  leaked token renews itself and revokes the tokens meant to stop it.
- Revocation fails closed. The account is the only authority on it, so an
  unreachable account now rejects the token instead of admitting a revoked
  one to whoever can keep the account busy. Verdicts stay trusted for the
  cache TTL so brief outages do not cut off healthy tokens.
- The revocation cache is bounded and re-checks negative verdicts.
- Revoking your own token no longer requires a role in its workspace, so
  leaving a workspace cannot strand a credential you can never revoke.
- The per-account limit counts only usable tokens; revoked and expired
  ones are kept for the audit trail and used to lock out anyone rotating.
- Rejected REST tokens are logged with a reason, since expired, revoked
  and unverifiable are one opaque 401 from outside.

The unused listWorkspaceApiTokens/revokeWorkspaceApiToken pair is removed;
it had no caller and no test.

Tests cover the role restriction, the API-token guard, ownership on
revoke, the limit accounting and fail-closed revocation. Removing any of
those checks fails them.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* fix(setting): correct the API token settings page

- Moves the page from workspace settings to account settings. Tokens
  belong to the account: the page already lists them across every
  workspace, and creating one only needs the User role the account
  service checks, not Owner as the category required.
- Surfaces failures. A failed revoke was logged to the console and the
  row re-rendered unchanged; loading workspaces could reject unhandled
  and leave an empty dropdown with no explanation.
- Outside a secure context there is no clipboard API, so the OK button
  did nothing and the dialog had no way out but Cancel. It now closes,
  leaving the token selectable.
- Replaces hardcoded English labels, adds aria-expanded on the docs
  disclosure and labels on the copy targets.
- Fills in the Korean and Polish translations, which were the only two
  locales missing these keys, and drops the API access strings orphaned
  when this PR replaced the old Generate API token button.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

* chore: drop docs/openapi.yaml from the API token PR

Unrelated to this feature and wrong for this repo: it documents a
/_tokens minting service and a tools/mint-token CLI that do not exist
here, uses reverse-proxy prefixes from a self-hosted deployment rather
than the transactor's /api/v1 routes, and states that revocation is a
future enhancement, which is what this PR implements. Nothing references
it. REST API docs belong in their own change, generated against the
routes that exist.

Claude-Session: https://claude.ai/code/session_01ANdoXbdn5k2hZy734EwKe7
Signed-off-by: Don Kendall <dkendall@ledoweb.com>

---------

Signed-off-by: Don Kendall <kendall@donkendall.com>
Signed-off-by: Don Kendall <dkendall@ledoweb.com>
2026-08-04 13:10:48 +07:00

287 lines
24 KiB
JSON

{
"string": {
"Setting": "Настройки",
"Spaces": "Пространства",
"Integrations": "Интеграции",
"Support": "Поддержка",
"Privacy": "Конфиденциальность",
"Terms": "Условия",
"MinValue": "Минимальное значение",
"MaxValue": "Максимальное значение",
"IntegerOnly": "Только целые числа",
"IdentifierExists": "Идентификатор уже существует",
"Reset": "Обнулить",
"AccountSettings": "Настройки аккаунта",
"Categories": "Категории",
"Delete": "Удалить",
"ChangePassword": "Изменить пароль",
"Disconnect": "Отключить",
"DisconnectAll": "Отключить все",
"Saving": "Сохранение...",
"Saved": "Сохранено",
"Add": "Добавить",
"AddNew": "Добавить {type}",
"Proceed": "Продолжить",
"NewEmail": "Новая почта",
"SendConfirmation": "Отправить код подтверждения",
"CodeSent": "Код отправлен. Пожалуйста, введите его в поле ниже.",
"SendAgain": "Отправить снова",
"SendAgainIn": "Можно отправить снова через",
"Value": "Значение",
"Signout": "Выйти",
"Settings": "Настройки",
"SelectWorkspace": "Выбрать пространство",
"InviteWorkspace": "Пригласить в пространство",
"DeleteStatus": "Удаление статуса",
"DeleteStatusConfirm": "Вы действительно хотите удалить этот статус?",
"Reconnect": "Переподключить",
"IntegrationDisabled": " была отключена",
"IntegrationDisabledSetting": "Интеграция была отключена",
"IntegrationDisabledDescr": "Интеграция отключена",
"IntegrationWith": "Интеграция с ",
"ClassSetting": "Настройки класса",
"ClassSettingHint": "Набор или категория вещей, обладающих каким-либо свойством или атрибутом, отличающимся от других по виду, типу или качеству.",
"ClassProperties": "Свойства класса",
"Classes": "Классы",
"Attributes": "Атрибуты",
"DeleteAttribute": "Удалить атрибут",
"DeleteAttributeConfirm": "Вы действительно хотите удалить этот атрибут?",
"DeleteAttributeExistConfirm": "Вы действительно хотите удалить этот атрибут? Данные будут утеряны",
"DeleteMixin": "Удалить Миксин",
"DeleteMixinConfirm": "Вы действительно хотите удалить этот Миксин?",
"DeleteMixinExistConfirm": "Вы действительно хотите удалить этот Миксин? Данные будут утеряны",
"Attribute": "Атрибут",
"Custom": "Пользовательский",
"Type": "Тип",
"WithTime": "Со временем",
"DateMode": "Тип времени",
"CreatingAttribute": "Создание атрибута",
"EditAttribute": "Редактирование атрибута",
"CreateEnum": "Создать справочник",
"EditEnum": "Редактировать справочник",
"Enums": "Справочники",
"EnumsSettingHint": "Набор или категория вещей, обладающих каким-либо свойством или атрибутом, отличающимся от других по виду, типу или качеству.",
"EnumTitle": "Заголовок справочника",
"EnumsCount": "{count, plural, one {# вариант} other {# вариантов}}",
"ProjectTypesCount": "{count, plural, =0 {Нет типов проектов} =1 {# тип проекта} few {# типа проектов} other {# типов проектов}}",
"Options": "Варианты",
"EnterOptionTitle": "Введите название варианта",
"NewEnumDialogClose": "Вы действительно хотите закрыть окно?",
"NewEnumDialogCloseNote": "Все внесенные изменения будут потеряны",
"NewValue": "Новое значение",
"Leave": "Покинуть рабочее пространство",
"LeaveDescr": "Вы действительно хотите покинуть рабочее пространство? Отменить это действие невозможно",
"Members": "Участники",
"WorkspaceSettings": "Рабочее пространство",
"Select": "Выбрать",
"AddOwner": "Добавить владельца",
"ReadonlyGuest": "Только чтение",
"Guest": "Гость",
"User": "Пользователь",
"Maintainer": "Сопровождающий",
"Owner": "Владелец",
"OwnerFirstName": "Имя владельца",
"OwnerLastName": "Фамилия владельца",
"Role": "Роль",
"FailedToSave": "Не удалось обновить пароль",
"ImportEnum": "Загрузить значения справочника",
"ImportEnumCopy": "Загрузить значения справочника из буфера обмена",
"CreateMixin": "Создать Миксин",
"OldNames": "Предыдущие значения",
"NewClassName": "Введите новое имя класса или выберете прошлое значение...",
"ShowAttribute": "Показать",
"HideAttribute": "Спрятать",
"Visibility": "Видимость",
"Hidden": "Спрятанный",
"Configure": "Настроить",
"InviteSettings": "Настройки приглашений",
"RoleCapabilitySettings": "Настройки доступа",
"DefaultInviteRoleForJoin": "Роль по умолчанию после присоединения по ссылке-приглашению:",
"InviteLinkGeneratorRoles": "Выберите роли пользователей, которые могут создавать ссылки-приглашения:",
"DefaultValue": "Значение по умолчанию",
"SelectAValue": "Выбрать значение",
"DateOnly": "Только дата",
"OnlyTime": "Только время",
"DateAndTime": "Дата и время",
"Configuration": "Конфигурация",
"ConfigurationEnabled": "Включено",
"ConfigurationDisabled": "Выключено",
"ConfigDisable": "Выключить",
"ConfigEnable": "Включить",
"ConfigBeta": "Ознакомительная версия",
"Properties": "Свойства",
"TaskTypes": "Типы задач",
"Automations": "Автоматизация",
"Collections": "Коллекции",
"ClassColon": "Класс:",
"SpaceTypes": "Типы пространств",
"NewSpaceType": "Новый тип пространства",
"SpaceTypeTitle": "Название типа пространства",
"General": "Общее",
"Description": "Описание",
"CountSpaces": "{count, plural, =0 {Нет пространств} =1 {# пространство} =2 {# пространства} =3 {# пространства} =4 {# пространства} other {# пространств}}",
"Roles": "Роли",
"RoleName": "Название роли",
"Permissions": "Разрешения",
"Assignees": "Назначенные",
"DeleteRole": "Удалить роль",
"DeleteRoleConfirmation": "Вы действительно хотите удалить эту роль? Все пользователи с этой ролью потеряют имеющиеся разрешения.",
"DeleteWorkspace": "Удалить рабочее пространство",
"DeleteWorkspaceConfirm": "Вы действительно хотите удалить это рабочее пространство? Вы и все остальные пользователи потеряют доступ к этому рабочему пространству. Вся информация из рабочего пространства будет утеряна. Это действие нельзя отменить. Вы хотите продолжить?",
"DeleteSpaceType": "Удалить тип пространства",
"DeleteSpaceTypeConfirm": "Вы действительно хотите удалить этот тип пространства?",
"WorkspaceName": "Название рабочего пространства",
"Workspace": "Рабочее пространство",
"OwnerOrMaintainerRequired": "Вы должны иметь роль Владельца/Сопровождаемого",
"LastOwnerLeaveTitle": "Невозможно выйти из рабочего пространства",
"LastOwnerLeaveMessage": "Вы являетесь единственным владельцем этого рабочего пространства. Чтобы выйти, сначала назначьте владельцем другого участника. Если это рабочее пространство больше никому не нужно, рассмотрите возможность его удаления.",
"Backup": "Резервное копирование",
"BackupLast": "Последнее резервное копирование",
"BackupTotalSnapshots": "Всего снимков",
"BackupTotalFiles": "Файлы",
"BackupSize": "Размер резервной копии",
"BackupLinkInfo": "URL-адрес каталога резервной копии, который можно скачать рекурсивно с помощью инструментов, таких как wget или curl.",
"BackupBearerTokenInfo": "Для доступа к резервной копии требуется токен доступа.",
"BackupSnapshots": "Снимки резервной копии",
"BackupFileDownload": "Скачать файл",
"BackupFiles": "Файлы резервной копии",
"BackupNoBackup": "В настоящее время резервные копии недоступны.",
"BackupDownloadAll": "Скачать полную резервную копию",
"BackupPreparingDownload": "Подготовка резервной копии…",
"BackupDownloadAllInfo": "Скачать все файлы резервной копии одним архивом .zip, который можно сохранить на компьютере.",
"BackupCopyScript": "Копировать скрипт загрузки",
"BackupCopyToken": "Копировать токен",
"BackupScriptInfo": "Скрипт оболочки, который скачивает все файлы резервной копии с помощью curl. Сохраните его и запустите в терминале; он запросит токен резервной копии, поэтому в скрипте не хранятся секреты.",
"BackupRestoreGuide": "Инструкция по резервному копированию и восстановлению",
"BackupRestoreGuideInfo": "Пошаговая инструкция о том, как скачать эту резервную копию и восстановить её в другом инстансе Huly.",
"NonBackupedBlobs": "Не резервируемые блобы",
"Calendar": "Календарь",
"StartOfTheWeek": "Начало недели",
"SystemSetupString": "Системная настройка ({day})",
"DefaultString": "По умолчанию ({day})",
"AddAttribute": "Добавить атрибут",
"WorkspaceNamePattern": "Имя должно быть длиной 40 символов или меньше, не должно быть пустым и не может содержать специальные символы (<, >, /)",
"Mailboxes": "Почтовые ящики",
"CreateMailbox": "Создать почтовый ящик",
"CreateMailboxPlaceholder": "my-cool-name",
"MailboxNoDomains": "Почтовые домены не настроены",
"MailboxLimitReached": "Достигнут лимит почтовых ящиков",
"MailboxErrorInvalidName": "Недопустимое имя почтового ящика",
"MailboxErrorDomainNotFound": "Домен не найден",
"MailboxErrorNameRulesViolated": "Имя почтового ящика должно быть от {minLen} до {maxLen} символов в длину",
"MailboxErrorMailboxExists": "Это имя почтового ящика уже занято",
"MailboxErrorMailboxCountLimit": "Достигнут лимит количества почтовых ящиков для вашей учетной записи",
"DeleteMailbox": "Удалить почтовый ящик",
"MailboxDeleteConfirmation": "Вы уверены, что хотите удалить этот почтовый ящик?",
"DisablePermissions": "Отключить ролевое управление доступом",
"EnablePermissions": "Включить ролевое управление доступом",
"DisablePermissionsConfirmation": "Вы уверены, что хотите отключить ролевое управление доступом? Все роли и разрешения будут отключены.",
"EnablePermissionsConfirmation": "Вы уверены, что хотите включить ролевое управление доступом? Все роли и разрешения будут включены.",
"BetaWarning": "Модули, помеченные как бета-версии, доступны для экспериментальных целей и могут быть не полностью функциональными. Мы не рекомендуем полагаться на функции бета-версии для критической работы в настоящее время.",
"IntegrationFailed": "Не удалось создать интеграцию",
"IntegrationError": "Пожалуйста, попробуйте снова или свяжитесь с поддержкой, если проблема не исчезнет",
"EmailIsUsed": "Адрес электронной почты уже используется другим аккаунтом",
"Customize": "Настроить",
"GuestAccess": "Анонимные гости",
"GuestAccessDescription": "Позволяет анонимным пользователям просматривать рабочее пространство в режиме только для чтения",
"GuestSignUpDescription": "Позволяет анонимным пользователям присоединяться к вашему рабочему пространству в качестве гостей с ограниченными правами редактирования",
"GuestChannelsDescription": "Каналы, в которых гости могут писать сообщения после присоединения",
"GuestChannelsArrayLabel": "Выбрать каналы",
"GuestSelectSpaces": "Выбрать пространства",
"GuestAutoJoinAvailableSpaces": "Автоприсоединение к пространствам",
"GuestAutoJoinAvailableSpacesHint": "У каждого приложения ниже своя строка «Автоприсоединение к пространствам»: выберите, куда при активации добавлять гостей воркспейса. Изменения применяются сразу.",
"GuestAnonymousVisibleSpaces": "Пространства, видимые анонимно",
"GuestAnonymousVisibleSpacesHint": "У каждой карточки приложения своя строка: выберите пространства, куда добавляется анонимная учётная запись только для чтения в участники, чтобы посетители без аккаунта могли их открыть. Изменения применяются сразу.",
"ManageIdentities": "Управление идентификаторами",
"Release": "Освободить",
"ReleaseSocialId": "Освободить социальный ID",
"ReleaseSocialIdConfirm": "Вы уверены, что хотите освободить этот социальный ID: {socialId}? Это удалит его из вашего аккаунта, и вы больше не сможете использовать его для входа в систему. Кроме того, все связанные интеграции будут удалены.",
"ReleasePrimarySocialId": "Освободить основной социальный ID",
"ReleasePrimarySocialIdConfirm": "Освобождение вашего текущего основного социального ID потребует перезагрузки страницы. Вы уверены, что хотите продолжить?",
"Login": "Вход",
"Primary": "Основной",
"MyIntegrations": "Мои интеграции",
"AllIntegrations": "Все",
"ConnectedIntegrations": "Подключенные",
"AvailableIntegrations": "Доступные",
"Connect": "Подключить",
"Integrate": "Интегрировать",
"FailedToLoadIntegrations": "Не удалось загрузить интеграции",
"FailedToDisconnect": "Не удалось отключить интеграцию",
"ServiceIsUnavailable": "Сервис недоступен",
"Integrated": "Интегрировано",
"Connected": "Подключено",
"Disconnected": "Отключено",
"Available": "Доступно",
"NotConnectedIntegration": "Учетная запись {account} не интегрирована с рабочим пространством",
"IntegrationIsUnstable": "Сервис интеграции испытывает проблемы. Некоторые функции могут работать некорректно.",
"AccessControl": "Контроль доступа",
"DangerZone": "Опасная зона",
"Restricted": "Ограничено",
"RestrictedAttributeWarning": "Вы действительно хотите ограничить изменение атрибута? Это действие создаст разрешения для этого атрибута. Отменить это действие невозможно.",
"PasswordAgingRule": "Правило устаревания пароля",
"PasswordAgingRuleDescription": "Количество дней, после которых пользователи должны будут изменить свой пароль.",
"OfficeSettings": "Настройки офиса",
"OfficeDefaultSettings": "Настройки по умолчанию для переговорных",
"DefaultStartWithTranscription": "Включить транскрипцию в новых комнатах",
"DefaultStartWithRecording": "Включить запись в новых комнатах",
"GuestPermissionsSettings": "Гости",
"GuestPermissionsApplicationPermissions": "Права приложений",
"GuestPermissionsApplicationPermissionsHint": "Выберите, какие приложения доступны гостям, затем настройте права для каждого приложения ниже.",
"GuestPermissionsTabGuest": "Гость",
"GuestPermissionsTabAnonymousGuest": "Анонимный гость",
"GuestPermissionsAnonymousApplicationHint": "Доступ к приложениям для анонимных гостей (только чтение). Видимые приложения также могут зависеть от конфигурации развёртывания.",
"ImportDocumentPermission": "Импорт документов",
"ImportDocumentDescription": "Предоставляет пользователям возможность импортировать документы в рабочее пространство",
"SelectUsers": "Выбрать пользователей",
"ShowInTitle": "Показывать в заголовке",
"SpaceMembersOnly": "Только участники пространства",
"Security": "Безопасность",
"TwoFactorAuth": "Двухфакторная аутентификация",
"TwoFactorAuthDescription": "Двухфакторная аутентификация добавляет дополнительный уровень безопасности к вашей учетной записи",
"EnableTwoFactorAuth": "Включить двухфакторную аутентификацию",
"DisableTwoFactorAuth": "Отключить двухфакторную аутентификацию",
"TwoFactorAuthEnabled": "Двухфакторная аутентификация включена",
"TwoFactorAuthDisabled": "Двухфакторная аутентификация отключена",
"ShowQRCode": "Показать QR-код",
"EnterVerificationCode": "Введите код подтверждения",
"OverrideAttribute": "Переопределить атрибут",
"Required": "Обязательный",
"ApiBaseUrl": "Базовый URL",
"ApiEndpointAccount": "Получить информацию об аккаунте",
"ApiEndpointFindAll": "Запрос документов по классу",
"ApiEndpointFindAllPost": "Запрос с фильтрами (тело JSON)",
"ApiEndpointLoadModel": "Загрузка модели данных",
"ApiEndpointPing": "Проверка работоспособности",
"ApiEndpointTx": "Создание или обновление документов",
"ApiTokenCopyWarning": "Скопируйте этот токен сейчас. Вы больше не сможете его увидеть.",
"ApiTokenCreated": "Токен создан",
"ApiTokenExpiry": "Срок действия",
"ApiTokenName": "Название токена",
"ApiTokenNoTokens": "Пока нет API-токенов",
"ApiTokenRevoke": "Отозвать токен",
"ApiTokenRevokeConfirm": "Вы уверены, что хотите отозвать этот токен? Он больше не будет пригоден для доступа к API.",
"ApiTokenWorkspace": "Рабочее пространство",
"ApiTokenStatusActive": "Активен",
"ApiTokenStatusExpiring": "Истекает",
"ApiTokenStatusRevoked": "Отозван",
"ApiTokenStatusExpired": "Истёк",
"ApiTokenExpiry7Days": "7 дней",
"ApiTokenExpiry30Days": "30 дней",
"ApiTokenExpiry90Days": "90 дней",
"ApiTokenExpiry180Days": "180 дней",
"ApiTokenExpiry365Days": "365 дней",
"ApiTokenLoadError": "Не удалось загрузить API-токены",
"ApiTokenCreateError": "Не удалось создать токен. Пожалуйста, попробуйте ещё раз.",
"ApiTokens": "API-токены",
"ApiUsageDescription": "Используйте API-токен со встроенным REST API для запроса и изменения данных рабочего пространства. Передавайте токен как Bearer-токен в заголовке Authorization.",
"ApiUsageTitle": "Использование REST API",
"ApiWorkspaceId": "Идентификатор вашего рабочего пространства (UUID) включён в токен. Передавайте его как :workspaceId в URL.",
"CreateApiToken": "Создать токен",
"Created": "Создан",
"Expires": "Истекает",
"TokenStatus": "Статус",
"ApiTokenRevokeError": "Не удалось отозвать токен. Попробуйте ещё раз."
}
}