@object-ui/i18n 16.1.0 → 17.1.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.
@@ -1,6 +1,15 @@
1
1
  const ru = {
2
2
  // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
3
3
  capability: {
4
+ label: {
5
+ manage_users: "Управление пользователями",
6
+ manage_org_users: "Управление пользователями организации",
7
+ manage_metadata: "Управление метаданными",
8
+ manage_platform_settings: "Управление настройками платформы",
9
+ setup_access: "Доступ к настройке",
10
+ setup_write: "Запись настроек",
11
+ studio_access: "Доступ к Studio",
12
+ },
4
13
  group: {
5
14
  platform: 'Платформа',
6
15
  org: 'Организация',
@@ -74,6 +83,10 @@ const ru = {
74
83
  package: "Пакет",
75
84
  },
76
85
  actions: {
86
+ decisionOutput: {
87
+ help: 'Передаётся в поток как результат решения.',
88
+ helpMultiValue: 'Передаётся в поток как результат решения. Несколько значений разделяйте запятыми.',
89
+ },
77
90
  resultDialog: {
78
91
  defaultTitle: 'Сохраните это значение сейчас',
79
92
  acknowledge: 'Я сохранил(а) это',
@@ -94,6 +107,16 @@ const ru = {
94
107
  type: "{{field}} должно быть допустимым {{type}}",
95
108
  },
96
109
  form: {
110
+ noPermissionToSave: "У вас нет прав на сохранение этой записи.",
111
+ submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
112
+ discardTitle: "Отменить изменения?",
113
+ discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
114
+ keepEditing: "Продолжить редактирование",
115
+ discard: "Отменить",
116
+ conflictTitle: "Конфликт сохранения",
117
+ conflictMessage: "Пока вы редактировали, эту запись изменил другой пользователь. Перезапись заменит его изменения вашими.",
118
+ conflictLatestVersion: "Его сохранение: {{time}}",
119
+ conflictOverwrite: "Перезаписать",
97
120
  addItem: "Добавить элемент",
98
121
  removeItem: "Удалить элемент",
99
122
  fieldRequired: "Это поле обязательно",
@@ -104,8 +127,6 @@ const ru = {
104
127
  stepOf: "Шаг {{current}} из {{total}}",
105
128
  createTitle: "Создать {{object}}",
106
129
  editTitle: "Редактировать {{object}}",
107
- createDescription: "Добавить новый {{object}} в базу данных.",
108
- editDescription: "Обновить данные {{object}}",
109
130
  saveRecord: "Сохранить запись",
110
131
  create: "Создать",
111
132
  update: "Обновить",
@@ -114,14 +135,70 @@ const ru = {
114
135
  deleteSuccess: "{{object}} удалён",
115
136
  },
116
137
  fields: {
138
+ image: {
139
+ upload: "Загрузить изображение",
140
+ addMore: "Добавить ещё изображения",
141
+ uploading: "Загрузка…",
142
+ imageAlt: "Изображение {{index}}",
143
+ crop: "Обрезать изображение {{index}}",
144
+ remove: "Удалить изображение {{index}}",
145
+ enlarge: "Увеличить {{name}}",
146
+ preview: "Предпросмотр изображения",
147
+ previous: "Предыдущее изображение",
148
+ next: "Следующее изображение",
149
+ counter: "{{current}} / {{total}}",
150
+ },
117
151
  relativeDate: {
118
152
  overdue: "Просрочено на {{count}} дн.",
119
153
  },
154
+ file: {
155
+ dragDropHere: 'Перетащите файлы сюда',
156
+ dropFilesHere: 'Отпустите файлы здесь',
157
+ browseHint: 'или нажмите для выбора',
158
+ browseHintCamera: 'или нажмите для выбора • используйте кнопку камеры ниже',
159
+ takePhoto: 'Сделать фото',
160
+ takeSelfie: 'Сделать селфи',
161
+ cameraCapture: 'Съёмка камерой',
162
+ uploading: 'Загрузка…',
163
+ uploadingPct: 'Загрузка… ({{pct}} %)',
164
+ fileFallback: 'Файл',
165
+ upload: 'Загрузить',
166
+ remove: 'Удалить {{name}}',
167
+ exceedsMaxSize: '«{{name}}» превышает максимальный размер ({{max}} МБ)',
168
+ uploadFailed: 'Не удалось загрузить «{{name}}»: {{error}}',
169
+ },
120
170
  richText: {
121
171
  format: "Формат: {{format}}",
122
172
  basicEditorHint: "Редактор форматированного текста (базовый)",
123
173
  placeholder: "Введите текст...",
124
174
  },
175
+ objectRef: {
176
+ loading: "Загрузка объектов…",
177
+ placeholder: "Выберите объект",
178
+ search: "Поиск объектов…",
179
+ empty: "Объекты не найдены",
180
+ },
181
+ recipient: {
182
+ selectTypeFirst: "Сначала выберите тип получателя.",
183
+ loading: "Загрузка…",
184
+ search: "Поиск…",
185
+ empty: "Совпадений нет",
186
+ select: "Выберите получателя",
187
+ selectUser: "Выберите пользователя",
188
+ selectTeam: "Выберите команду",
189
+ selectBusinessUnit: "Выберите бизнес-подразделение",
190
+ selectPosition: "Выберите должность",
191
+ selectUnitAndSubordinates: "Выберите бизнес-подразделение",
192
+ },
193
+ filterCondition: {
194
+ selectObjectFirst: "Сначала выберите объект.",
195
+ noCriteria: "Условия не заданы — это правило ничего не предоставляет",
196
+ criteriaRequired: "Добавьте хотя бы одно условие. Правило без условий предоставило бы доступ ко всем записям, поэтому его нельзя сохранить.",
197
+ invalidJson: "Некорректный JSON — правило не будет соответствовать ни одной записи, пока это не исправлено.",
198
+ jsonOnly: "Этот критерий можно редактировать только как JSON",
199
+ editAsJson: "Редактировать как JSON",
200
+ useVisualBuilder: "Использовать визуальный конструктор",
201
+ },
125
202
  },
126
203
  table: {
127
204
  rowsPerPage: "Строк на странице",
@@ -156,6 +233,37 @@ const ru = {
156
233
  delete: "Удалить",
157
234
  },
158
235
  grid: {
236
+ bulkSelected: "Выбрано: {{count}}",
237
+ bulkSelectedAllMatches: "Выбрано: {{count}} (все совпадения)",
238
+ bulkClear: "Снять выделение",
239
+ bulkAllOnPage: "Выбраны все {{count}} на этой странице.",
240
+ bulkSelectAllMatching: "Выбрать все совпадения ({{count}})",
241
+ bulkAllMatchingSelected: "Выбраны все подходящие записи ({{count}}).",
242
+ bulk: {
243
+ confirmDefault: "Будет применено к записям: {{count}}.",
244
+ overLimit: "Выбрано ({{count}}) больше лимита действия ({{limit}}). Уменьшите выбор, чтобы продолжить.",
245
+ affectedRecords: "Затрагиваемые записи ({{count}}):",
246
+ skippedIneligible: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
247
+ rowFallback: "Строка {{index}}",
248
+ andMore: "… и ещё {{count}}",
249
+ processed: "Обработано {{count}} / {{total}}",
250
+ processedFailed: " · с ошибкой: {{count}}",
251
+ undonePrefix: "Отменено — ",
252
+ succeeded: "Успешно {{count}} / {{total}}",
253
+ resultFailed: " · Ошибок {{count}}",
254
+ retry: "Повторить",
255
+ downloadErrorCsv: "Скачать CSV с ошибками",
256
+ cancel: "Отмена",
257
+ back: "Назад",
258
+ next: "Далее",
259
+ run: "Выполнить",
260
+ running: "Выполняется…",
261
+ undo: "Отменить",
262
+ undoing: "Отмена…",
263
+ done: "Готово",
264
+ selectPlaceholder: "Выберите…",
265
+ loading: "Загрузка…",
266
+ },
159
267
  actions: "Действия",
160
268
  edit: "Редактировать",
161
269
  delete: "Удалить",
@@ -181,7 +289,88 @@ const ru = {
181
289
  densityCycleShortHint: "Нажмите для изменения",
182
290
  },
183
291
  import: {
292
+ downloadTemplate: "Скачать шаблон",
293
+ downloadTemplateHint: "Получите CSV с нужными столбцами (обязательные поля отмечены *).",
294
+ templateFileName: "{{object}}-import-template",
295
+ autoMatched: "Сопоставлено автоматически",
296
+ autoMatchedSummary: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
297
+ confidence: {
298
+ high: "Высокая точность",
299
+ medium: "Средняя точность",
300
+ low: "Низкая точность",
301
+ },
302
+ asyncQueued: "В очереди — подготовка импорта…",
303
+ asyncProcessing: "Импортировано {{processed}} из {{total}} строк… {{progress}} %",
304
+ asyncLargeHint: "Файл большой, поэтому импорт выполнится в фоновом режиме.",
305
+ largeSampleNotice: "Предпросмотр первых {{shown}} из {{total}} строк.",
306
+ cancelImport: "Отменить импорт",
307
+ importCancelled: "Импорт отменён",
308
+ resultsTruncated: "Показаны результаты первых {{count}} строк (из {{total}}).",
309
+ createdCount: "Создано: {{count}}",
310
+ updatedCount: "Обновлено: {{count}}",
311
+ downloadFailed: "Скачать строки с ошибками",
312
+ options: "Параметры импорта",
313
+ writeMode: "Если строка совпадает с существующей записью",
314
+ writeModeOpt: {
315
+ insert: "Всегда создавать новую",
316
+ update: "Обновлять существующую (пропускать без совпадения)",
317
+ upsert: "Обновлять при совпадении, иначе создавать",
318
+ },
319
+ matchFields: "Сопоставлять по",
320
+ matchFieldsPlaceholder: "Выберите поля для сопоставления…",
321
+ matchFieldsHint: "Строки сопоставляются с существующими записями по этим полям.",
322
+ needMatchFields: "Выберите хотя бы одно поле для сопоставления.",
323
+ matchOnlyField: "(только сопоставление)",
324
+ optCreateOptions: "Сохранять неизвестные значения списка",
325
+ optRunAutomations: "Выполнять автоматизации и триггеры",
326
+ optTreatHistorical: "Импортировать как исторические данные",
327
+ optTreatHistoricalHint: "(импортирует завершённые записи как есть — пропускает проверки конечного автомата и сохраняет исходные отметки времени и автора вместо текущих)",
328
+ optSkipBlankKey: "Пропускать строки с пустым значением сопоставления",
329
+ optBackground: "Импортировать в фоновом режиме",
330
+ optBackgroundHint: "(выполняется как отменяемая задача)",
331
+ validate: "Проверить данные",
332
+ validating: "Проверка…",
333
+ validateHint: "Проверить каждую строку на сервере перед импортом.",
334
+ validatePassed: "Все строки ({{ok}}) корректны.",
335
+ validateFailed: "Корректных: {{ok}}, с ошибками: {{errors}}.",
336
+ errorRowPrefix: "Строка {{row}}: ",
337
+ referenceNotFound: "Нет записи, соответствующей «{{value}}»",
338
+ referenceAmbiguous: "«{{value}}» соответствует нескольким записям — используйте уникальное значение или идентификатор записи",
339
+ invalidBoolean: "«{{value}}» не является допустимым значением true/false",
340
+ invalidNumber: "«{{value}}» не является допустимым числом",
341
+ invalidDate: "«{{value}}» не является допустимой датой",
342
+ invalidOption: "«{{value}}» не входит в число допустимых вариантов",
343
+ requiredValue: "Это поле обязательно",
344
+ matchAmbiguous: "Соответствует нескольким существующим записям — используйте уникальное значение или идентификатор записи",
345
+ history: "История",
346
+ historyBack: "Назад к импорту",
347
+ historyDescription: "Недавние импорты для этого объекта.",
348
+ historyHint: "Фоновые задачи импорта, сначала новые.",
349
+ historyRefresh: "Обновить",
350
+ historyLoading: "Загрузка…",
351
+ historyEmpty: "Импортов пока нет.",
352
+ historyUnsupported: "Для этого источника данных история импорта недоступна.",
353
+ historyColStatus: "Статус",
354
+ historyColRows: "Строк",
355
+ historyColResult: "Результат",
356
+ historyColTime: "Когда",
357
+ errorCount: "Ошибок: {{count}}",
358
+ undoImport: "Отменить импорт",
359
+ undoing: "Отмена…",
360
+ undoConfirm: "Отменить этот импорт? Созданные им записи будут удалены, а обновлённые — восстановлены к прежним значениям.",
361
+ reverted: "Отменён",
362
+ jobStatus: {
363
+ pending: "Ожидает",
364
+ running: "Выполняется",
365
+ succeeded: "Успешно",
366
+ failed: "Ошибка",
367
+ cancelled: "Отменено",
368
+ },
369
+ legacyReferenceBlocked: "Импорт заблокирован: {{fields}} — поля связи, которым нужен серверный маршрут импорта для преобразования имён в идентификаторы записей, а это подключение его не поддерживает. Импорт в виде обычного текста повредит данные. Обновите бэкенд/клиент либо снимите сопоставление этих столбцов и импортируйте их отдельно.",
370
+ missingRequiredHint: "Продолжение невозможно — не сопоставлены обязательные поля: {{fields}}. Добавьте соответствующий столбец в файл или вернитесь и загрузите файл, где он есть.",
371
+ legacyFallbackNotice: "Импортировано через режим совместимости: это подключение не поддерживает серверный маршрут импорта, поэтому значения сохранены как текст без приведения типов на сервере. Обновите бэкенд/клиент для полноценного импорта (приведение типов и поиск связей).",
184
372
  title: "Импорт {{object}}",
373
+ notAllowed: "Этот объект не открыт для импорта.",
185
374
  stepUpload: "Загрузка",
186
375
  stepMapping: "Сопоставление",
187
376
  stepPreview: "Предпросмотр",
@@ -257,6 +446,42 @@ const ru = {
257
446
  moreEvents: "+{{count}} ещё",
258
447
  },
259
448
  list: {
449
+ firstRunTitle: "Здесь пока пусто",
450
+ firstRunMessage: "Создайте первую запись, чтобы начать.",
451
+ noMatches: "Подходящих записей нет",
452
+ noMatchesMessage: "Ни одна запись не соответствует текущим фильтрам или поиску. Измените или сбросьте их.",
453
+ loadErrorTitle: "Не удалось загрузить записи",
454
+ loadErrorMessage: "При загрузке данных произошла ошибка. Проверьте соединение и попробуйте снова.",
455
+ loadErrorForbiddenTitle: "Нет доступа",
456
+ loadErrorForbiddenMessage: "У вас нет прав на просмотр этих записей. Обратитесь к администратору, если считаете, что доступ вам нужен.",
457
+ loadErrorUnauthorizedTitle: "Требуется вход",
458
+ loadErrorUnauthorizedMessage: "Сессия истекла или вы вышли из системы. Войдите снова, чтобы просмотреть эти записи.",
459
+ loadErrorRejectedTitle: "Запрос этого представления отклонён",
460
+ loadErrorRejectedMessage: "Сервер не смог обработать фильтр или параметры запроса этого представления. Обычно помогает сброс фильтров; если представление сохранено в таком виде, исправить его должен администратор.",
461
+ retry: "Повторить",
462
+ managedBy: {
463
+ system: {
464
+ title: "Здесь пока пусто",
465
+ message: "Записи появляются автоматически при выполнении исходного действия (например, «Отправить на согласование», «Поделиться», «Пригласить»). Запустите одно из них на исходной записи, чтобы создать строку.",
466
+ },
467
+ appendOnly: {
468
+ title: "События не зафиксированы",
469
+ message: "Это неизменяемый журнал аудита. Строки записывает платформа при наступлении событий — историю можно выгрузить, но создавать записи отсюда нельзя.",
470
+ },
471
+ betterAuth: {
472
+ title: "Записей identity нет",
473
+ message: "Эти записи создаёт поставщик аутентификации — при входе, подготовке учётных записей и в процессах безопасности, — а не добавляются здесь вручную.",
474
+ },
475
+ betterAuthUser: {
476
+ title: "Пользователей пока нет",
477
+ message: "Учётные записи создаёт поставщик аутентификации, а не эта страница. Пригласите коллег в организацию — они появятся автоматически при первом входе (JIT-подготовка через SSO). Конечные пользователи приложения добавляются, когда регистрируются в нём сами.",
478
+ },
479
+ betterAuthTeam: {
480
+ title: "Команд пока нет",
481
+ message: "Команды объединяют участников внутри организации. Создайте команду кнопкой «Создать команду» либо они появятся через процессы подготовки организаций и SSO вашего поставщика аутентификации.",
482
+ },
483
+ },
484
+ refresh: "Обновить",
260
485
  loading: 'Loading records...',
261
486
  recordCount: "{{count}} записей",
262
487
  recordCountOne: "{{count}} запись",
@@ -268,6 +493,8 @@ const ru = {
268
493
  filterRecords: "Фильтр записей",
269
494
  sort: "Сортировка",
270
495
  sortRecords: "Сортировка записей",
496
+ sortByIdSuffix: "(по ID)",
497
+ sortRelationalHint: "Столбцы, ссылающиеся на другую запись, здесь не показаны: их можно сортировать только по сохранённому ID, а не по имени, которое видно в ячейке. Чтобы сортировать по этому имени, добавьте поле-формулу с ним.",
271
498
  group: "Группировка",
272
499
  groupBy: "Группировать по",
273
500
  export: "Экспорт",
@@ -297,6 +524,11 @@ const ru = {
297
524
  recordEditingTitle: "Редактирование записей",
298
525
  },
299
526
  managedByBadge: {
527
+ systemWritable: {
528
+ short: "Схема платформы",
529
+ title: "Определено платформой, доступно администратору для записи",
530
+ body: "Схему этого объекта задаёт платформа, но строки вы создаёте и редактируете здесь сами. Кто именно может писать, определяют делегированное администрирование и безопасность на уровне записей, а не этот значок.",
531
+ },
300
532
  config: {
301
533
  short: "Конфигурация",
302
534
  title: "Конфигурация администратора",
@@ -319,6 +551,7 @@ const ru = {
319
551
  },
320
552
  },
321
553
  kanban: {
554
+ uncategorized: "Без категории",
322
555
  addCard: "Добавить карточку",
323
556
  addColumn: "Добавить колонку",
324
557
  moveCard: "Переместить карточку",
@@ -340,12 +573,92 @@ const ru = {
340
573
  },
341
574
  },
342
575
  gantt: {
576
+ viewMode: {
577
+ day: "День",
578
+ week: "Неделя",
579
+ month: "Месяц",
580
+ quarter: "Квартал",
581
+ year: "Год",
582
+ },
583
+ row: {
584
+ expand: "Развернуть",
585
+ collapse: "Свернуть",
586
+ open: "Открыть подробности",
587
+ },
588
+ aria: {
589
+ taskList: "Список задач",
590
+ },
591
+ tooltip: {
592
+ days: "дн",
593
+ },
594
+ menu: {
595
+ view: "Показать подробности",
596
+ edit: "Редактировать на месте",
597
+ delete: "Удалить",
598
+ addPredecessor: "Добавить предшественника…",
599
+ addSuccessor: "Добавить последователя…",
600
+ removeDependency: "Удалить зависимость",
601
+ noCandidates: "Нет доступных задач",
602
+ searchTasks: "Поиск задач…",
603
+ },
604
+ delete: {
605
+ title: "Удалить эту задачу?",
606
+ body: "«{{title}}» будет удалена безвозвратно. Это действие нельзя отменить.",
607
+ cancel: "Отмена",
608
+ confirm: "Удалить",
609
+ deleting: "Удаление…",
610
+ },
611
+ drawer: {
612
+ fallbackTitle: "Подробности задачи",
613
+ },
614
+ linkType: {
615
+ fs: "Окончание → Начало",
616
+ ss: "Начало → Начало",
617
+ ff: "Окончание → Окончание",
618
+ sf: "Начало → Окончание",
619
+ },
620
+ conflict: {
621
+ title: "Конфликт расписания",
622
+ body: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
623
+ confirm: "Перепланировать автоматически",
624
+ cancel: "Оставить как есть",
625
+ },
626
+ autoScheduleDlg: {
627
+ title: "Автопланирование",
628
+ body: "Сдвинуть {count} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
629
+ skipped: "{count} заблокированных задач(и) также нарушают связи и были пропущены.",
630
+ confirm: "Применить",
631
+ cancel: "Отмена",
632
+ none: "Все зависимости соблюдены — перепланировать нечего.",
633
+ },
634
+ resource: {
635
+ header: "Ресурс",
636
+ peak: "Пик",
637
+ over: "перегружен",
638
+ empty: "Нет задач для распределения.",
639
+ },
640
+ readOnly: "Только чтение",
641
+ readOnlyHint: "Редактирование в этом представлении отключено.",
642
+ lockedHint: "Нет прав на редактирование",
643
+ writeFailed: "Не удалось сохранить — изменение отменено",
343
644
  column: {
344
645
  taskName: "Название задачи",
345
646
  start: "Начало",
346
647
  end: "Конец",
347
648
  },
348
649
  toolbar: {
650
+ thisWeek: "Эта неделя",
651
+ thisMonth: "Этот месяц",
652
+ viewMode: "Детализация шкалы времени",
653
+ enterFullscreen: "Полноэкранный режим",
654
+ exitFullscreen: "Выйти из полноэкранного режима",
655
+ criticalPath: "Выделить критический путь",
656
+ autoSchedule: "Автоматически планировать зависимости",
657
+ exportPng: "Экспортировать в PNG",
658
+ exportPdf: "Экспортировать в PDF",
659
+ saveLayout: "Сохранить компоновку",
660
+ undo: "Отменить",
661
+ redo: "Повторить",
349
662
  prevPeriod: "Предыдущий период",
350
663
  nextPeriod: "Следующий период",
351
664
  zoomIn: "Увеличить",
@@ -391,6 +704,11 @@ const ru = {
391
704
  redo: 'Redo',
392
705
  },
393
706
  detail: {
707
+ editInlineHint: "Дважды щёлкните для редактирования",
708
+ systemActor: "Система",
709
+ unknownUser: "Неизвестно",
710
+ created: "Создано",
711
+ updated: "Обновлено",
394
712
  back: "Назад",
395
713
  edit: "Редактировать",
396
714
  editInline: "Редактировать",
@@ -451,6 +769,18 @@ const ru = {
451
769
  attachmentCount: "{{count}} вложение",
452
770
  attachmentCountPlural: "{{count}} вложений",
453
771
  removeAttachment: "Удалить вложение",
772
+ // Record Attachments panel (enable.files, objectstack#4358)
773
+ attachments: "Вложения",
774
+ uploadAttachment: "Загрузить",
775
+ loadingAttachments: "Загрузка вложений…",
776
+ noAttachments: "Вложений пока нет. Загрузите файл, чтобы начать.",
777
+ downloadAttachment: "Скачать",
778
+ deleteAttachment: "Удалить вложение",
779
+ attachmentDeleteDenied: "Удалить это вложение может только загрузивший его пользователь или тот, кто может редактировать эту запись.",
780
+ attachmentParentAccessDenied: "У вас нет доступа для прикрепления файлов к этой записи.",
781
+ attachmentDownloadDenied: "У вас нет доступа для скачивания этого вложения.",
782
+ attachmentAuthRequired: "Войдите в систему, чтобы скачать это вложение.",
783
+ attachmentPermissionDenied: "У вас нет разрешения на это действие.",
454
784
  unifiedDiff: "Единое представление",
455
785
  sideBySideDiff: "Параллельное представление",
456
786
  noChanges: "Нет изменений",
@@ -498,9 +828,15 @@ const ru = {
498
828
  saving: "Сохранение…",
499
829
  lockedByApproval: "Заблокировано для согласования",
500
830
  lockedTooltip: "У этой записи есть ожидающий запрос на согласование; редактирование заблокировано",
831
+ writeStrippedTitle: "Часть полей не сохранена",
832
+ writeStrippedReadonly: "Поля только для чтения, поэтому не сохранены: {{fields}}",
833
+ writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не сохранены: {{fields}}",
834
+ approvalPendingEditable: "На согласовании · редактирование доступно",
835
+ approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
501
836
  cancelApproval: "Отменить согласование",
502
837
  cancelApprovalInFlight: "Отмена…",
503
838
  cancelApprovalTooltip: "Отмените ожидающий запрос на согласование, чтобы разблокировать запись",
839
+ cancelApprovalTooltipUnlocked: "Отменить ожидающий запрос на согласование",
504
840
  cancelApprovalFailed: "Не удалось отменить согласование",
505
841
  cancelApprovalUnavailable: "Отмена согласований не поддерживается этим источником данных",
506
842
  linkCopied: "Ссылка скопирована в буфер обмена",
@@ -603,6 +939,35 @@ const ru = {
603
939
  resetZoom: "Сбросить масштаб",
604
940
  },
605
941
  dashboard: {
942
+ noRows: "Нет строк",
943
+ pickMeasures: "Выберите меры (значения) для этого виджета набора данных.",
944
+ datasetUnsupported: "Этот источник данных не поддерживает запросы к наборам данных.",
945
+ details: "Подробности",
946
+ exportCsv: "Экспорт в CSV",
947
+ openInList: "Открыть в списке",
948
+ filters: {
949
+ label: "Фильтры дашборда",
950
+ dateRange: "Период",
951
+ allTime: "За всё время",
952
+ custom: "Произвольный…",
953
+ all: "Все",
954
+ reset: "Сбросить",
955
+ range: {
956
+ today: "Сегодня",
957
+ yesterday: "Вчера",
958
+ this_week: "Эта неделя",
959
+ last_week: "Прошлая неделя",
960
+ this_month: "Этот месяц",
961
+ last_month: "Прошлый месяц",
962
+ this_quarter: "Этот квартал",
963
+ last_quarter: "Прошлый квартал",
964
+ this_year: "Этот год",
965
+ last_year: "Прошлый год",
966
+ last_7_days: "Последние 7 дней",
967
+ last_30_days: "Последние 30 дней",
968
+ last_90_days: "Последние 90 дней",
969
+ },
970
+ },
606
971
  addWidget: "Добавить виджет",
607
972
  removeWidget: "Удалить виджет",
608
973
  editLayout: "Редактировать макет",
@@ -730,6 +1095,7 @@ const ru = {
730
1095
  navTypeGroup: "Группа",
731
1096
  navTypeSeparator: "Разделитель",
732
1097
  navTypeAction: "Действие",
1098
+ navTypeComponent: "Компонент",
733
1099
  navEditIcon: "Редактировать значок",
734
1100
  navToggleVisible: "Переключить видимость",
735
1101
  navHidden: "Скрыто",
@@ -831,8 +1197,199 @@ const ru = {
831
1197
  },
832
1198
  },
833
1199
  console: {
1200
+ settingsHub: {
1201
+ title: "Настройки",
1202
+ subtitle: "Настройте рабочее пространство, интеграции и флаги функций.",
1203
+ loadError: "Не удалось загрузить настройки",
1204
+ empty: "Настройки не зарегистрированы. Плагины могут регистрировать манифесты настроек через SettingsService.",
1205
+ settingsCount: "Настроек: {{n}}",
1206
+ beta: "Бета",
1207
+ categories: {
1208
+ Workspace: "Рабочее пространство",
1209
+ Communication: "Коммуникации",
1210
+ Security: "Безопасность",
1211
+ Infrastructure: "Инфраструктура",
1212
+ Beta: "Бета",
1213
+ Other: "Прочее",
1214
+ },
1215
+ },
1216
+ objectData: {
1217
+ badge: "Данные",
1218
+ description: "Срез данных, заданный URL — не привязан к сохранённому представлению.",
1219
+ filteredBy: "Фильтр",
1220
+ removeFilter: "Убрать фильтр {{field}}",
1221
+ saveAsView: "Сохранить как представление",
1222
+ noAccessTitle: "Доступ запрещён",
1223
+ noAccess: "У вас нет прав на просмотр этих данных.",
1224
+ },
1225
+ identityImport: {
1226
+ policyTitle: "Настройка входа для импортированных пользователей",
1227
+ policy: {
1228
+ auto: "Автоматически (рекомендуется)",
1229
+ invite: "Отправить приглашения",
1230
+ temporary: "Временные пароли",
1231
+ none: "Без пароля (только учётная запись)",
1232
+ },
1233
+ policyHint: {
1234
+ auto: "Доступным пользователям отправляется приглашение (по почте или SMS); тем, до кого не удалось дозвониться, выдаётся одноразовый пароль, который показывается ОДИН РАЗ на экране результата. Работает как с сервисом почты/SMS, так и без него.",
1235
+ invite: "Каждый созданный пользователь получает письмо для установки пароля (или SMS-приглашение для строк только с телефоном). Требуется настроенный сервис почты/SMS — недоступные строки завершатся ошибкой.",
1236
+ temporary: "Для развёртываний без почты/SMS: каждый созданный пользователь получает одноразовый пароль, который показывается ОДИН РАЗ на экране результата. При первом входе потребуется его сменить.",
1237
+ none: "Пользователи сначала входят по OTP на телефон, магической ссылке или ссылке сброса пароля, а затем задают собственный пароль.",
1238
+ },
1239
+ passwordsNote: "Временные пароли — показываются один раз и нигде не сохраняются. Сохраните их сейчас; каждый пользователь должен сменить свой при первом входе.",
1240
+ passwordsMore: "Остальные записи опущены — воспользуйтесь загрузкой файла.",
1241
+ passwordsDownload: "Скачать CSV",
1242
+ },
1243
+ ai: {
1244
+ usage: {
1245
+ title: "Использование ИИ",
1246
+ meterBuild: "Сборка",
1247
+ meterAsk: "Вопрос",
1248
+ statusOk: "Осталось много",
1249
+ statusLow: "Заканчивается",
1250
+ statusFull: "Лимит исчерпан",
1251
+ resetsDaily: "Сбросится сегодня ночью",
1252
+ resetsMonthly: "Сбросится в следующем цикле",
1253
+ ctaUpgrade: "Повысьте тариф, чтобы продолжить",
1254
+ ctaTopUp: "Добавьте кредиты, чтобы продолжить",
1255
+ ariaLabel: "Использование ИИ: {{status}}",
1256
+ },
1257
+ workspaceTitle: "Рабочее пространство ИИ",
1258
+ workspaceSubtitle: "Задавайте вопросы, изучайте и возвращайтесь к диалогам",
1259
+ openChats: "Открыть чаты",
1260
+ chats: "Чаты",
1261
+ chatsDescription: "Просматривайте диалоги с ИИ и управляйте ими.",
1262
+ share: "Поделиться",
1263
+ shareTitle: "Поделиться этим диалогом",
1264
+ shareDisabledTitle: "Начните диалог, чтобы включить публикацию",
1265
+ newChat: "Создать",
1266
+ searchChats: "Поиск по чатам...",
1267
+ noChatsYet: "Чатов пока нет",
1268
+ noChatsDescription: "Начните новый диалог, и он появится здесь.",
1269
+ noMatchingChats: "Подходящих чатов нет.",
1270
+ newConversation: "Новый диалог",
1271
+ renameConversation: "Переименовать диалог",
1272
+ deleteConversation: "Удалить диалог",
1273
+ saveRename: "Сохранить название",
1274
+ cancelRename: "Отменить переименование",
1275
+ loadingHistory: "Загрузка истории диалога...",
1276
+ conversationReady: "Диалог готов",
1277
+ preparingConversation: "Подготовка нового диалога",
1278
+ offlineDemoMode: "Автономный демонстрационный режим — список агентов недоступен",
1279
+ sendFailedRateLimited: "Вы отправляете сообщения слишком часто. Ваше сообщение сохранено ниже — подождите немного и попробуйте снова.",
1280
+ sendFailedGeneric: "Не удалось отправить сообщение. Оно сохранено ниже — попробуйте ещё раз.",
1281
+ askAgent: "Спросить {{agent}}...",
1282
+ assistant: "Ассистент",
1283
+ liveCanvas: "Живой предпросмотр — {{app}} (черновик)",
1284
+ liveCanvasUnlisted: "Работающее приложение — {{app}} (скрыто до публикации)",
1285
+ loadingAgents: "Загрузка агентов...",
1286
+ askAnything: "Спросите о чём угодно...",
1287
+ emptyTitle: "Начните диалог",
1288
+ emptyDescription: "Спросите о чём угодно — ассистент видит контекст вашего текущего приложения.",
1289
+ switchAssistant: "Сменить ассистента",
1290
+ chooseAgent: "Выберите ассистента…",
1291
+ empty: {
1292
+ build: {
1293
+ title: "Создать с помощью ИИ",
1294
+ description: "Опишите приложение или процесс обычными словами — я подготовлю объекты, экраны и автоматизации, а вы проверите и опубликуете.",
1295
+ },
1296
+ ask: {
1297
+ title: "Спросите свои данные",
1298
+ description: "Задавайте вопросы о записях — количество, списки и сводки по доступным вам данным.",
1299
+ },
1300
+ editApp: {
1301
+ title: "Редактирование «{{app}}»",
1302
+ titleGeneric: "Редактировать это приложение",
1303
+ description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или автоматизацию либо скорректирую существующее.",
1304
+ },
1305
+ },
1306
+ clearConversation: "Очистить",
1307
+ sendHint: "чтобы отправить",
1308
+ agentActivity: "Активность агента",
1309
+ toolCompleted: "Завершено",
1310
+ toolRunning: "Выполняется",
1311
+ toolAwaitingApproval: "Ожидает подтверждения",
1312
+ toolFailed: "Ошибка",
1313
+ toolDetailsHidden: "Входные данные инструментов и необработанные результаты в этом режиме скрыты.",
1314
+ copy: "Копировать",
1315
+ copied: "Скопировано",
1316
+ regenerate: "Сгенерировать заново",
1317
+ model: "Модель",
1318
+ submit: "Отправить",
1319
+ uploadFiles: "Загрузить файлы",
1320
+ stopResponse: "Остановить ответ",
1321
+ trace: "трассировка",
1322
+ viewTrace: "Посмотреть трассировку",
1323
+ nextSteps: "Что дальше",
1324
+ publishDrafts: "Опубликовать",
1325
+ publishOk: "Опубликовано — объекты активны.",
1326
+ seedWarn: "Опубликовано, но часть примеров данных загрузить не удалось.",
1327
+ openBuiltApp: "Открыть приложение",
1328
+ designBuiltApp: "Открыть в Studio",
1329
+ previewDraft: "Предпросмотр",
1330
+ previewApp: "Предпросмотр приложения",
1331
+ resizeSplit: "Изменить размер чата и предпросмотра",
1332
+ hideChats: "Скрыть чаты",
1333
+ showChats: "Показать чаты",
1334
+ planTitle: "Предложенный план",
1335
+ planQuestions: "Подтвердите перед сборкой",
1336
+ planAssumptions: "Допущения",
1337
+ planApproveHint: "Ответьте, чтобы утвердить или скорректировать этот план.",
1338
+ planApprove: "Собрать",
1339
+ planAdjust: "Скорректировать",
1340
+ justNow: "только что",
1341
+ minutesAgo: "{{count}} мин назад",
1342
+ hoursAgo: "{{count}} ч назад",
1343
+ daysAgo: "{{count}} дн назад",
1344
+ agentLabels: {
1345
+ ask: "Вопрос",
1346
+ build: "Сборка",
1347
+ dataChat: "Ассистент",
1348
+ metadataAssistant: "Ассистент по метаданным",
1349
+ },
1350
+ suggestions: {
1351
+ dataChat: {
1352
+ userCount: "Сколько пользователей в системе? Перечисли их адреса электронной почты.",
1353
+ recentRecords: "Перечисли 5 последних созданных записей.",
1354
+ recordCounts: "Посчитай количество записей по каждому объекту.",
1355
+ },
1356
+ metadataAssistant: {
1357
+ buildCrm: "Создай CRM для продаж — клиенты, контакты и воронка сделок с итогами по этапам.",
1358
+ buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам.",
1359
+ buildFlow: "Спроектируй службу поддержки — заявки с приоритетом, процесс статусов и связи с клиентами.",
1360
+ buildInventory: "Создай приложение для склада — товары, остатки, поставщики и индикация низких остатков.",
1361
+ buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, этапы собеседований и заметки.",
1362
+ },
1363
+ generic: {
1364
+ help: "Чем ты можешь мне помочь?",
1365
+ availableObjects: "Перечисли доступные объекты данных.",
1366
+ recentActivity: "Сделай сводку моей недавней активности.",
1367
+ },
1368
+ editApp: {
1369
+ addField: "Добавь поле в один из объектов.",
1370
+ addObject: "Добавь новый объект и свяжи его с существующим.",
1371
+ addDashboard: "Добавь дашборд с ключевыми показателями.",
1372
+ addAutomation: "Добавь автоматизацию — согласование, процесс статусов или уведомление.",
1373
+ },
1374
+ },
1375
+ changesTitle: "Подтвердите изменения",
1376
+ changesConfirmed: "Подтверждено",
1377
+ changesConfirm: "Подтвердить",
1378
+ changesConfirmHint: "Ответьте, чтобы подтвердить или скорректировать это изменение.",
1379
+ changeVerb: {
1380
+ createObject: "Создать объект",
1381
+ addField: "Добавить поле",
1382
+ modifyField: "Изменить поле",
1383
+ deleteField: "Удалить поле",
1384
+ createMetadata: "Создать",
1385
+ updateMetadata: "Изменить",
1386
+ createSeed: "Сгенерировать примеры данных",
1387
+ createPackage: "Создать пакет приложения",
1388
+ },
1389
+ },
834
1390
  title: "Консоль ObjectStack",
835
1391
  initializing: "Инициализация приложения...",
1392
+ loadingHint: "Настройка нового окружения может занять некоторое время.",
836
1393
  breadcrumb: {
837
1394
  dashboards: "Панели",
838
1395
  pages: "Страницы",
@@ -874,6 +1431,7 @@ const ru = {
874
1431
  toggleDarkMode: "Переключить тёмный режим",
875
1432
  },
876
1433
  commandPalette: {
1434
+ title: "Палитра команд",
877
1435
  placeholder: "Введите команду или поиск...",
878
1436
  noResults: "Результаты не найдены.",
879
1437
  objects: "Объекты",
@@ -907,6 +1465,14 @@ const ru = {
907
1465
  system: "Системная",
908
1466
  },
909
1467
  objectView: {
1468
+ viewTypeTree: "Дерево",
1469
+ viewTypeTreeDesc: "Выстраивает самоссылающиеся записи в иерархию по родительскому полю.",
1470
+ parentField: "Родительское поле",
1471
+ parentFieldHelp: "Поле, указывающее на родительскую запись (тот же объект) и задающее иерархию. Подходят только самоссылающиеся поля.",
1472
+ viewName: "Название",
1473
+ viewNameHelp: "Машинный ключ (snake_case). Заполняется автоматически из заголовка — при желании измените.",
1474
+ viewNameRequired: "Введите ключ (строчные буквы, цифры, подчёркивание). Для нелатинских заголовков автозаполнение не работает.",
1475
+ viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
910
1476
  systemViewReadonly: 'System view defined in code - duplicate to customize.',
911
1477
  expandToPage: 'Open as full page',
912
1478
  objectNotFound: "Объект не найден",
@@ -1120,7 +1686,28 @@ const ru = {
1120
1686
  },
1121
1687
  },
1122
1688
  auth: {
1689
+ setPassword: {
1690
+ title: "Задать резервный пароль",
1691
+ description: "Вы вошли через единый вход. Задайте локальный пароль, чтобы входить в эту среду напрямую, если SSO станет недоступен.",
1692
+ email: "Электронная почта",
1693
+ newPassword: "Новый пароль",
1694
+ confirmPassword: "Подтвердите пароль",
1695
+ submit: "Задать пароль",
1696
+ submitting: "Сохранение…",
1697
+ success: "Локальный пароль задан",
1698
+ failed: "Не удалось задать пароль",
1699
+ passwordsMismatch: "Пароли не совпадают",
1700
+ noSession: "Срок действия сессии истёк.",
1701
+ backToSignIn: "Войти снова",
1702
+ },
1123
1703
  login: {
1704
+ signingIn: "Выполняется вход…",
1705
+ ssoHandoff: "Перейти к {{target}}",
1706
+ devAdminHint: {
1707
+ title: "Среда разработки",
1708
+ body: "Войдите под предустановленным администратором для разработки:",
1709
+ dismiss: "Закрыть",
1710
+ },
1124
1711
  title: "Войдите в свой аккаунт",
1125
1712
  description: "Введите электронную почту и пароль для продолжения",
1126
1713
  emailLabel: "Электронная почта",
@@ -1133,6 +1720,7 @@ const ru = {
1133
1720
  noAccountText: "Нет аккаунта?",
1134
1721
  signUpText: "Зарегистрироваться",
1135
1722
  errors: {
1723
+ oauthCallbackFailed: "Не удалось завершить единый вход — ссылка для входа истекла или уже была использована. Попробуйте ещё раз.",
1136
1724
  invalidCredentials: "Неверный email или пароль. Попробуйте ещё раз.",
1137
1725
  emailNotVerified: "Пожалуйста, подтвердите email перед входом.",
1138
1726
  },
@@ -1258,6 +1846,40 @@ const ru = {
1258
1846
  shell: {
1259
1847
  tenantHostHint: "Вы входите в это рабочее пространство",
1260
1848
  },
1849
+ layout: {
1850
+ headline: "Создавайте мощные бизнес-приложения быстрее.",
1851
+ subhead: "Универсальная платформа для управления корпоративными данными, рабочими процессами и аналитикой.",
1852
+ },
1853
+ remediation: {
1854
+ signOut: "Выйти из аккаунта",
1855
+ password: {
1856
+ title: "Срок действия пароля истёк",
1857
+ fallbackMessage: "Задайте новый пароль, чтобы продолжить.",
1858
+ current: "Текущий пароль",
1859
+ next: "Новый пароль",
1860
+ confirm: "Подтвердите новый пароль",
1861
+ submit: "Изменить пароль и продолжить",
1862
+ submitting: "Обновление…",
1863
+ mismatch: "Новые пароли не совпадают.",
1864
+ failed: "Не удалось изменить пароль.",
1865
+ },
1866
+ mfa: {
1867
+ title: "Настройка двухфакторной аутентификации",
1868
+ fallbackMessage: "Ваша организация требует приложение-аутентификатор для продолжения.",
1869
+ confirmPassword: "Подтвердите пароль",
1870
+ continue: "Продолжить",
1871
+ preparing: "Подготовка…",
1872
+ enrollFailed: "Не удалось начать привязку.",
1873
+ scanTitle: "Отсканируйте в приложении-аутентификаторе",
1874
+ scanBody: "Отсканируйте этот QR-код с помощью Google Authenticator, 1Password, Authy и т. п., затем введите 6-значный код.",
1875
+ backupTitle: "Сохраните резервные коды",
1876
+ backupBody: "Храните их в надёжном месте — каждый код можно использовать один раз, если вы потеряете устройство.",
1877
+ codeLabel: "6-значный код",
1878
+ verify: "Проверить и продолжить",
1879
+ verifying: "Проверка…",
1880
+ invalidCode: "Неверный код. Попробуйте ещё раз.",
1881
+ },
1882
+ },
1261
1883
  },
1262
1884
  profile: {
1263
1885
  title: "Профиль",
@@ -1322,11 +1944,15 @@ const ru = {
1322
1944
  settings: "Настройки рабочего пространства",
1323
1945
  },
1324
1946
  help: {
1947
+ onThisPage: "На этой странице",
1948
+ keyboardShortcuts: "Сочетания клавиш",
1325
1949
  appDocs: 'Документация приложения',
1326
1950
  allDocs: 'Вся документация',
1327
1951
  onlineDocs: 'Онлайн-документация',
1328
1952
  },
1329
1953
  sidebar: {
1954
+ packageManagement: "Управление пакетами",
1955
+ searchNavigation: "Поиск по навигации...",
1330
1956
  settings: "Настройки",
1331
1957
  help: "Помощь",
1332
1958
  helpTooltip: "Помощь и документация",
@@ -1343,14 +1969,66 @@ const ru = {
1343
1969
  removeFromFavorites: "Убрать {{name}} из избранного",
1344
1970
  },
1345
1971
  topbar: {
1972
+ openAssistant: "Открыть ассистента {{name}}",
1973
+ offline: "Не в сети",
1974
+ usersOnline: "Пользователи сейчас в сети",
1975
+ switchView: "Сменить представление",
1976
+ switchObject: "Сменить объект",
1977
+ connection: {
1978
+ connected: "Подключено",
1979
+ connecting: "Подключение...",
1980
+ reconnecting: "Переподключение...",
1981
+ disconnected: "Отключено",
1982
+ error: "Ошибка подключения",
1983
+ },
1984
+ stage: {
1985
+ preview: "Предварительная версия",
1986
+ beta: "Бета",
1987
+ tooltip: "Платформа в предварительной версии — функции могут измениться.",
1988
+ },
1346
1989
  aiAssistant: "ИИ-ассистент",
1347
1990
  designInStudio: "Дизайн в Studio",
1348
1991
  },
1349
1992
  home: {
1993
+ build: {
1994
+ title: "Создать приложение",
1995
+ subtitle: "Начните с нуля — спроектируйте объекты, формы, автоматизации и интерфейсы.",
1996
+ },
1997
+ template: {
1998
+ title: "Начать с шаблона",
1999
+ subtitle: "Установите шаблонное приложение из маркетплейса и настройте его под себя.",
2000
+ },
2001
+ welcomeAdminDescription: "Опишите свой бизнес одним предложением — ИИ создаст объекты, экраны, API и инструменты агента. Либо настройте всё сами через меню слева.",
2002
+ welcomeAdminDescriptionNoBuild: "Настройте первое приложение через меню «Администрирование» слева. Когда появятся данные, ИИ-ассистент поможет их изучить.",
2003
+ welcomeAdminDescriptionNoAi: "Настройте первое приложение через меню «Администрирование» слева.",
2004
+ noAppsTitle: "Приложений пока нет",
2005
+ noAppsDescription: "Ваше рабочее пространство настраивается — приложения, которыми поделится администратор, появятся здесь.",
2006
+ buildWithAI: "Создать с помощью ИИ",
2007
+ askAI: "Спросить ИИ",
2008
+ recoveryReminder: {
2009
+ message: "Задайте резервный пароль, чтобы входить в систему даже когда единый вход недоступен.",
2010
+ cta: "Задать пароль",
2011
+ dismiss: "Закрыть",
2012
+ },
2013
+ pendingDrafts: {
2014
+ message: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2015
+ cta: "Опубликовать",
2016
+ publishing: "Публикация…",
2017
+ published: "Опубликовано! Изменения вступили в силу.",
2018
+ publishFailed: "Не удалось опубликовать",
2019
+ },
1350
2020
  title: "Главная",
1351
2021
  subtitle: "Панель вашего рабочего пространства",
1352
2022
  nav: "Главная",
1353
2023
  allApps: "Все приложения",
2024
+ yourApps: "Ваши приложения",
2025
+ showMoreApps: "Ещё",
2026
+ showLess: "Свернуть",
2027
+ continueEmpty: "Открытые вами элементы появятся здесь.",
2028
+ actionCenter: {
2029
+ title: "Требует вашего внимания",
2030
+ empty: "Всё выполнено",
2031
+ },
1354
2032
  loading: "Загрузка рабочего пространства...",
1355
2033
  recent: "Недавние",
1356
2034
  starred: "Избранные",
@@ -1402,7 +2080,21 @@ const ru = {
1402
2080
  },
1403
2081
  },
1404
2082
  layout: {
2083
+ systemNav: {
2084
+ systemSettings: "Системные настройки",
2085
+ applications: "Приложения",
2086
+ appMarketplace: "Маркетплейс приложений",
2087
+ objectManager: "Менеджер объектов",
2088
+ users: "Пользователи",
2089
+ organizations: "Организации",
2090
+ roles: "Роли",
2091
+ configuration: "Конфигурация",
2092
+ createApp: "Создать приложение",
2093
+ },
1405
2094
  appSwitcher: {
2095
+ switchApplication: "Сменить приложение",
2096
+ appsAvailable: "Доступно приложений: {{count}}",
2097
+ editNavigation: "Изменить навигацию",
1406
2098
  home: "Главная",
1407
2099
  addApp: "Добавить приложение",
1408
2100
  editApp: "Редактировать приложение",
@@ -1495,8 +2187,8 @@ const ru = {
1495
2187
  uploading: "Загрузка…",
1496
2188
  defaultActionTitle: "Действие",
1497
2189
  ok: "ОК",
1498
- lookupPlaceholder: "Вставить ID записи (UUID) для {{label}}",
1499
- lookupHelpText: "Введите ID записи связанного объекта. Выбор записи будет добавлен позже.",
2190
+ lookupPlaceholder: "ID записи для {{label}}",
2191
+ lookupHelpText: "Для этого параметра не настроен объект ссылки, поэтому выбор записи недоступен. Введите ID записи или попросите администратора исправить параметр действия.",
1500
2192
  },
1501
2193
  actionConfirm: {
1502
2194
  title: "Подтвердите действие",
@@ -1521,6 +2213,8 @@ const ru = {
1521
2213
  updateFailed: "Не удалось обновить навигацию",
1522
2214
  },
1523
2215
  objectActions: {
2216
+ resetPackageSetConfirm: "Этот набор разрешений поставляется с установленным пакетом и не может быть удалён. Удаление сбросит его к исходному состоянию из пакета и отменит ваши настройки в этой среде. Продолжить?",
2217
+ resetPackageSetSuccess: "Набор разрешений сброшен к исходному состоянию из пакета",
1524
2218
  deleteSuccess: "{{label}} успешно удалён",
1525
2219
  deleteFailed: "Не удалось удалить {{label}}",
1526
2220
  noRecordId: "ID записи не указан",
@@ -1685,6 +2379,7 @@ const ru = {
1685
2379
  },
1686
2380
  },
1687
2381
  organizations: {
2382
+ create: "Создать рабочее пространство",
1688
2383
  mine: "Мои организации",
1689
2384
  title: "Организации",
1690
2385
  heading: "Ваши организации",
@@ -1698,6 +2393,11 @@ const ru = {
1698
2393
  noMatches: "Нет организаций, соответствующих запросу.",
1699
2394
  },
1700
2395
  notifications: {
2396
+ regionLabel: "Уведомления",
2397
+ groupCount: "Уведомлений: {{count}}",
2398
+ groupUnread: "Непрочитанных: {{count}}",
2399
+ groupMarkRead: "Отметить прочитанными",
2400
+ groupMarkReadTitle: "Отметить прочитанными все этого типа",
1701
2401
  empty: "Нет уведомлений",
1702
2402
  markAllRead: "Отметить все как прочитанные",
1703
2403
  viewAll: "Показать все уведомления",
@@ -1816,7 +2516,103 @@ const ru = {
1816
2516
  done: 'Готово — скрыть',
1817
2517
  },
1818
2518
  },
2519
+ excelImport: {
2520
+ noImportableFields: "У этого объекта нет полей, доступных для импорта.",
2521
+ schemaReadFailed: "Не удалось прочитать схему объекта.",
2522
+ imported: "Импортировано строк: {{count}} в {{object}}.",
2523
+ importFrom: "Импортировать реальные строки из",
2524
+ into: "в",
2525
+ opening: "Открытие…",
2526
+ importAction: "Импорт",
2527
+ dismiss: "Скрыть",
2528
+ },
2529
+ cloudOnboarding: {
2530
+ hintCreate: "Создайте первое окружение — отдельное рабочее пространство со своим URL, базой данных и тарифом. Разработка ведётся внутри него.",
2531
+ hintReady: "Продакшн-окружение готово. Откройте его, чтобы создавать и запускать приложения — всё происходит внутри окружения.",
2532
+ createEnvironment: "Создать окружение",
2533
+ openProduction: "Открыть продакшн",
2534
+ manageEnvironments: "Управление окружениями",
2535
+ },
2536
+ aiModelStatus: {
2537
+ summary: "Сборка / вопросы используют {{conversational}} ({{conversationalSource}}); структурированный вывод — {{structured}} ({{structuredSource}}).",
2538
+ summaryRouting: "Политика маршрутизации: бесплатные тарифы → {{free}}, платные тарифы → {{paid}}.",
2539
+ modelUnknown: "неизвестно",
2540
+ sourceUnknown: "адаптер не сообщил",
2541
+ rowConversational: "Модель Build / Ask",
2542
+ rowStructured: "Структурированный (blueprint / seed)",
2543
+ rowReasoning: "Интенсивность рассуждений",
2544
+ readFailed: "Не удалось прочитать действующую модель ИИ. В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
2545
+ readFailedWithStatus: "Не удалось прочитать действующую модель ИИ (HTTP {{status}}). В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
2546
+ overridesInEffect: "Действующие переопределения: ",
2547
+ noOverrides: "нет — используются значения по умолчанию развёрнутого кода.",
2548
+ adapter: "Адаптер: ",
2549
+ sourceCodeDefault: "значение по умолчанию в коде (без env-переопределения)",
2550
+ sourceInherits: "как у build/ask",
2551
+ sourcePinned: "закреплено через {{source}}",
2552
+ },
2553
+ chatbotError: {
2554
+ title: "Ошибка ответа",
2555
+ fallbackDetail: "Что-то пошло не так. Попробуйте ещё раз.",
2556
+ details: "Подробности",
2557
+ hide: "Скрыть",
2558
+ retry: "Повторить",
2559
+ },
2560
+ chatbotQuota: {
2561
+ title: "Требуется обновление тарифа",
2562
+ fallbackMessage: "Вы исчерпали квоту ИИ.",
2563
+ buyCredits: "Купить пакет кредитов",
2564
+ upgradePlan: "Повысить тариф",
2565
+ },
2566
+ environment: {
2567
+ addEnvironment: "Добавить окружение",
2568
+ setUpProduction: "Настройте продакшн-окружение",
2569
+ addDevelopment: "Добавить окружение разработки",
2570
+ },
2571
+ cloudConnection: {
2572
+ checking: "Проверка подключения…",
2573
+ retry: "Повторить",
2574
+ errors: {
2575
+ expired: "Срок действия запроса истёк до подтверждения. Начните заново.",
2576
+ bindFailed: "Не удалось выполнить привязку.",
2577
+ deviceCodeFailed: "Не удалось запросить код устройства.",
2578
+ },
2579
+ waiting: {
2580
+ popupOpened: "Подтвердите подключение в только что открывшемся окне — эта страница обновится сама.",
2581
+ polling: "Ожидание подтверждения в облачной консоли…",
2582
+ openApproval: "Открыть страницу подтверждения",
2583
+ copy: "Копировать",
2584
+ copied: "Скопировано",
2585
+ codePrefilled: "Код уже подставлен на странице подтверждения.",
2586
+ openItHere: "Окно не появилось? Откройте здесь",
2587
+ cancel: "Отмена",
2588
+ },
2589
+ bound: {
2590
+ title: "Подключено к ObjectStack Cloud",
2591
+ runtime: "Среда выполнения",
2592
+ organization: "Организация",
2593
+ approvedBy: "Подтвердил",
2594
+ runtimeId: "ID среды выполнения",
2595
+ environment: "Окружение",
2596
+ since: "Подключено",
2597
+ privatePackages: "Приватные пакеты вашей организации теперь отображаются в Маркетплейсе в разделе «Ваша организация».",
2598
+ disconnect: "Отключить",
2599
+ },
2600
+ unbound: {
2601
+ title: "Не подключено",
2602
+ body: "Подключите эту среду выполнения к управляющему слою ObjectStack, чтобы просматривать приватные пакеты вашей организации и устанавливать их здесь. Подтверждение — один клик в вашей облачной учётной записи; никакие идентификаторы и учётные данные на этой странице не вводятся.",
2603
+ connect: "Подключить",
2604
+ },
2605
+ },
1819
2606
  marketplace: {
2607
+ suggestedBindings: {
2608
+ promptEveryone: "Приложение предлагает предоставить «{{set}}» всем вошедшим пользователям (позиция Everyone).",
2609
+ promptGuest: "Приложение предлагает предоставить «{{set}}» неаутентифицированным посетителям (позиция Guest).",
2610
+ confirm: "Предоставить",
2611
+ confirming: "Предоставление…",
2612
+ dismiss: "Закрыть",
2613
+ confirmedToast: "«{{set}}» теперь предоставлен: {{anchor}}.",
2614
+ dismissedToast: "Предложение по «{{set}}» закрыто.",
2615
+ },
1820
2616
  title: "Маркетплейс приложений",
1821
2617
  subtitle: "Просматривайте одобренные приложения из каталога ObjectStack. Нажмите на приложение, чтобы увидеть подробности и установить его.",
1822
2618
  searchPlaceholder: "Поиск приложений по имени или ID манифеста…",
@@ -1868,6 +2664,7 @@ const ru = {
1868
2664
  updateAvailable: 'Доступно обновление',
1869
2665
  },
1870
2666
  action: {
2667
+ installed: "Установлено",
1871
2668
  install: "Установить",
1872
2669
  reinstall: "Переустановить",
1873
2670
  working: "Обработка…",
@@ -1938,6 +2735,14 @@ const ru = {
1938
2735
  yearsAgo: "{{count}} лет назад",
1939
2736
  },
1940
2737
  },
2738
+ approvals: {
2739
+ approve: 'Утвердить',
2740
+ reject: 'Отклонить',
2741
+ comment: 'Комментарий (необязательно)',
2742
+ approveSuccess: 'Утверждено',
2743
+ rejectSuccess: 'Отклонено',
2744
+ rejectConfirm: 'Отклонить этот запрос на согласование?',
2745
+ },
1941
2746
  approvalsInbox: {
1942
2747
  loadMore: 'Загрузить ещё',
1943
2748
  loadingMore: 'Загрузка…',
@@ -1962,13 +2767,28 @@ const ru = {
1962
2767
  slaRemaining: 'SLA: осталось {{dur}}',
1963
2768
  slaOverdue: 'SLA просрочен на {{dur}}',
1964
2769
  actReassign: 'Передано',
2770
+ reassignFromTo: 'от {{from}} к {{to}}',
1965
2771
  actRemind: 'Напоминание',
1966
2772
  actRequestInfo: 'Запрошены данные',
1967
2773
  actComment: 'Комментарий',
1968
2774
  stepProgress: 'Шаги согласования',
1969
2775
  prevRequest: 'Назад',
1970
2776
  nextRequest: 'Далее',
1971
- positionOf: '{{index}} из {{total}}',
2777
+ positionOf: 'Запрос {{index}} из {{total}}',
2778
+ progressApprovals: 'Согласования — {{got}} из {{need}}',
2779
+ progressGroups: 'Ход визирования — {{got}} из {{need}} групп',
2780
+ progressEligible: 'Доступных согласующих: {{count}}',
2781
+ progressBar: 'Ход решения',
2782
+ declaredActions: 'Действия',
2783
+ attachmentChip: 'Вложение',
2784
+ attachmentOpenFailed: 'Не удалось открыть вложение — попробуйте ещё раз',
2785
+ approveOneTitle: 'Согласовать «{{title}}»?',
2786
+ approveOneBody: 'Запрос будет согласован от вашего имени. Чтобы добавить комментарий или вложение, откройте запрос.',
2787
+ flowOrigin: 'Инициировано потоком',
2788
+ sortBy: 'Сортировка',
2789
+ sortRecent: 'Сначала новые',
2790
+ sortOldest: 'Сначала старые',
2791
+ sortAmount: 'Сумма (по убыванию)',
1972
2792
  quickPhrase1: 'Согласовано — соответствует требованиям.',
1973
2793
  quickPhrase2: 'Согласовано с условиями — следите за исполнением.',
1974
2794
  quickPhrase3: 'Дополните материалы и отправьте повторно.',
@@ -2097,6 +2917,10 @@ const ru = {
2097
2917
  retry: 'Повторить',
2098
2918
  },
2099
2919
  draftBar: {
2920
+ messageClean: "Предпросмотр черновика — неопубликованных изменений нет; всё здесь уже действует.",
2921
+ sampleDataTitle: "Примеры данных появятся после публикации",
2922
+ sampleDataBody: "Вы просматриваете структуру приложения. Опубликуйте его, чтобы загрузить примеры записей и запустить его.",
2923
+ publishCta: "Опубликовать и посмотреть",
2100
2924
  message: 'Предпросмотр черновика — вы видите неопубликованные изменения. Ничего не вступит в силу до публикации.',
2101
2925
  publish: 'Опубликовать',
2102
2926
  publishing: 'Публикация…',