@object-ui/i18n 17.3.0 → 17.6.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +1929 -1
  2. package/README.md +41 -12
  3. package/dist/i18n.d.ts +1 -1
  4. package/dist/i18n.js +1 -2
  5. package/dist/index.d.ts +23 -21
  6. package/dist/index.js +31 -21
  7. package/dist/locales/ar.d.ts +638 -369
  8. package/dist/locales/ar.js +744 -424
  9. package/dist/locales/de.d.ts +638 -369
  10. package/dist/locales/de.js +759 -446
  11. package/dist/locales/en.d.ts +673 -404
  12. package/dist/locales/en.js +899 -406
  13. package/dist/locales/es.d.ts +638 -369
  14. package/dist/locales/es.js +739 -427
  15. package/dist/locales/fr.d.ts +638 -369
  16. package/dist/locales/fr.js +738 -423
  17. package/dist/locales/index.d.ts +6476 -3786
  18. package/dist/locales/index.js +20 -20
  19. package/dist/locales/ja.d.ts +638 -369
  20. package/dist/locales/ja.js +732 -417
  21. package/dist/locales/ko.d.ts +638 -369
  22. package/dist/locales/ko.js +736 -424
  23. package/dist/locales/pt.d.ts +638 -369
  24. package/dist/locales/pt.js +737 -425
  25. package/dist/locales/ru.d.ts +638 -369
  26. package/dist/locales/ru.js +750 -424
  27. package/dist/locales/zh.d.ts +672 -403
  28. package/dist/locales/zh.js +720 -403
  29. package/dist/pickLocalized.d.ts +58 -0
  30. package/dist/pickLocalized.js +115 -7
  31. package/dist/provider.d.ts +84 -2
  32. package/dist/provider.js +305 -31
  33. package/dist/useDisplayLocale.d.ts +49 -0
  34. package/dist/useDisplayLocale.js +55 -0
  35. package/dist/useObjectLabel.d.ts +94 -14
  36. package/dist/useObjectLabel.js +134 -21
  37. package/dist/useSafeTranslation.js +51 -3
  38. package/dist/utils/index.d.ts +4 -3
  39. package/dist/utils/index.js +4 -3
  40. package/dist/utils/number-display.d.ts +32 -0
  41. package/dist/utils/number-display.js +32 -0
  42. package/dist/utils/spec-formatters.d.ts +39 -13
  43. package/dist/utils/spec-formatters.js +3 -3
  44. package/package.json +4 -3
@@ -1,4 +1,18 @@
1
1
  const ru = {
2
+ // objectui#4467 — the impersonation banner (app-shell ImpersonationBanner).
3
+ // Raised by `session.impersonatedBy`, so it survives SPA reboots; it names
4
+ // BOTH parties because the audit trail attributes the work to the impersonated
5
+ // user, and the exit states its own failure rather than appearing to succeed.
6
+ impersonation: {
7
+ banner: {
8
+ message: 'Вы работаете от имени {{user}} — все действия записываются на этого пользователя.',
9
+ startedBy: 'Начато администратором {{admin}}.',
10
+ stop: 'Прекратить работу от чужого имени',
11
+ stopping: 'Завершение…',
12
+ stopFailed: 'Не удалось прекратить работу от чужого имени: {{reason}}',
13
+ notRestored: 'Сервер принял запрос, но не восстановил сеанс администратора — вы всё ещё работаете от имени {{user}}. Выйдите и войдите снова, чтобы завершить.',
14
+ },
15
+ },
2
16
  // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
3
17
  capability: {
4
18
  label: {
@@ -16,6 +30,32 @@ const ru = {
16
30
  other: 'Другое',
17
31
  },
18
32
  },
33
+ // objectui#3546 slice six — сводка шести граней авторизации в
34
+ // PermissionFacetLink (только чтение) плюс ссылка в Studio.
35
+ //
36
+ // Четыре счётных значения записаны как «Существительное: {{count}}» — этот
37
+ // приём в паке уже применён 25 раз (lookup.recordCount, notifications.
38
+ // groupCount, approvalsInbox.bulkApproved …) и он верен при ЛЮБОМ числе, так
39
+ // что для категорий few/many, которых в паке нет, базовый ключ даёт
40
+ // правильный русский, а не английский. Поэтому `_one` здесь совпадает с
41
+ // базовым ключом — форма не зависит от числа.
42
+ perm: {
43
+ facet: {
44
+ none: "Нет",
45
+ more: "+{{count}} ещё",
46
+ objects: "Объектов: {{count}}",
47
+ objects_one: "Объектов: {{count}}",
48
+ fields: "Правил для полей: {{count}}",
49
+ fields_one: "Правил для полей: {{count}}",
50
+ rls: "Политик RLS: {{count}}",
51
+ rls_one: "Политик RLS: {{count}}",
52
+ tabs: "Правил для вкладок: {{count}}",
53
+ tabs_one: "Правил для вкладок: {{count}}",
54
+ adminScope: "Делегированное администрирование настроено",
55
+ designInStudio: "Дизайн в Studio →",
56
+ designInStudioHint: "Дизайн в Studio",
57
+ },
58
+ },
19
59
  lookup: {
20
60
  recentlyUsed: 'Недавние',
21
61
  allResults: 'Все результаты',
@@ -46,13 +86,13 @@ const ru = {
46
86
  common: {
47
87
  addToFavorites: "Добавить в избранное",
48
88
  removeFromFavorites: "Удалить из избранного",
49
- loading: "Загрузка...",
89
+ loading: "Загрузка…",
50
90
  save: "Сохранить",
91
+ discard: "Отменить",
51
92
  cancel: "Отмена",
52
93
  delete: "Удалить",
53
94
  edit: "Редактировать",
54
95
  create: "Создать",
55
- search: "Поиск",
56
96
  filter: "Фильтр",
57
97
  reset: "Сбросить",
58
98
  confirm: "Подтвердить",
@@ -76,7 +116,7 @@ const ru = {
76
116
  required: "Обязательно",
77
117
  optional: "Необязательно",
78
118
  selectOption: "Выберите вариант",
79
- select: "Выбрать...",
119
+ select: "Выбрать…",
80
120
  openChat: "Открыть чат",
81
121
  closeChat: "Закрыть чат",
82
122
  closePanel: "Закрыть панель",
@@ -85,6 +125,11 @@ const ru = {
85
125
  itemCountOne: "{{count}} элемент",
86
126
  toggleSidebar: "Переключить боковую панель",
87
127
  package: "Пакет",
128
+ done: "Готово",
129
+ editInStudio: "Редактировать в Studio",
130
+ record: "Запись",
131
+ retry: "Повторить",
132
+ printDialogHint: "Открывает диалог печати браузера (это не экспорт в PDF)",
88
133
  },
89
134
  actions: {
90
135
  decisionOutput: {
@@ -116,6 +161,9 @@ const ru = {
116
161
  submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
117
162
  discardTitle: "Отменить изменения?",
118
163
  discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
164
+ // objectui#4024 — the create/edit dialog's `sr-only` accessible
165
+ // description, used when the form declares no `description` of its own.
166
+ dialogDescriptionFallback: "Заполните поля формы, затем отправьте или отмените.",
119
167
  keepEditing: "Продолжить редактирование",
120
168
  discard: "Отменить",
121
169
  conflictTitle: "Конфликт сохранения",
@@ -184,7 +232,7 @@ const ru = {
184
232
  richText: {
185
233
  format: "Формат: {{format}}",
186
234
  basicEditorHint: "Редактор форматированного текста (базовый)",
187
- placeholder: "Введите текст...",
235
+ placeholder: "Введите текст…",
188
236
  },
189
237
  options: {
190
238
  empty: "Нет доступных вариантов",
@@ -220,6 +268,14 @@ const ru = {
220
268
  tags: {
221
269
  placeholder: "Введите и нажмите Enter, чтобы добавить…",
222
270
  },
271
+ // objectui#4028 — `AddressField`'s five sub-labels.
272
+ address: {
273
+ street: "Улица и дом",
274
+ city: "Город",
275
+ state: "Область / штат",
276
+ postalCode: "Почтовый индекс",
277
+ country: "Страна",
278
+ },
223
279
  textarea: {
224
280
  characterCount: "Количество символов: {{count}} из {{max}}",
225
281
  charactersRemaining: "Осталось символов: {{count}}",
@@ -250,7 +306,7 @@ const ru = {
250
306
  saveAll: "Сохранить всё ({{count}})",
251
307
  addRecord: "Добавить запись",
252
308
  open: "Открыть",
253
- search: "Поиск...",
309
+ search: "Поиск…",
254
310
  modified: "{{count}} строк изменено",
255
311
  saveFailed: 'Не удалось сохранить',
256
312
  selected: "{{count}} выбрано",
@@ -294,7 +350,7 @@ const ru = {
294
350
  delete: "Удалить",
295
351
  export: "Экспорт",
296
352
  exportAs: "Экспорт в {{format}}",
297
- loading: "Загрузка таблицы...",
353
+ loading: "Загрузка таблицы…",
298
354
  errorLoading: "Ошибка загрузки таблицы",
299
355
  pullToRefresh: "Потяните для обновления",
300
356
  refreshing: "Обновление…",
@@ -305,6 +361,22 @@ const ru = {
305
361
  yes: "Да",
306
362
  no: "Нет",
307
363
  systemFields: "Система",
364
+ // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
365
+ // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
366
+ // pack controls its own separator and word order.
367
+ summary: {
368
+ pattern: "{{label}}: {{value}}",
369
+ count: "Количество",
370
+ countEmpty: "Пустые",
371
+ countFilled: "Заполненные",
372
+ countUnique: "Уникальные",
373
+ percentEmpty: "Пустые",
374
+ percentFilled: "Заполненные",
375
+ sum: "Сумма",
376
+ avg: "Среднее",
377
+ min: "Мин.",
378
+ max: "Макс.",
379
+ },
308
380
  toolbar: {
309
381
  densityMode: "Плотность",
310
382
  densityCompact: "Компактный",
@@ -418,12 +490,12 @@ const ru = {
418
490
  templateName: "Название шаблона",
419
491
  save: "Сохранить",
420
492
  deleteTemplate: "Удалить шаблон",
421
- savedMapping: 'Saved mapping:',
422
- chooseSavedMapping: 'Choose a saved mapping…',
423
- manualMapping: '— Map columns manually —',
424
- transform: 'Transform',
425
- savedMappingHint: 'Mapping “{{name}}” applies rename + transforms + type coercion on the server. Column mapping is read-only.',
426
- savedMappingPreviewNote: 'The preview shows your source columns; on import, mapping “{{name}}” applies rename, transforms and type coercion on the server.',
493
+ savedMapping: 'Сохранённое сопоставление:',
494
+ chooseSavedMapping: 'Выбрать сохранённое сопоставление…',
495
+ manualMapping: '— Сопоставить столбцы вручную —',
496
+ transform: 'Преобразование',
497
+ savedMappingHint: 'Сопоставление «{{name}}» применяет на сервере переименование + преобразования + приведение типов. Сопоставление столбцов доступно только для чтения.',
498
+ savedMappingPreviewNote: 'В предпросмотре показаны исходные столбцы; при импорте сопоставление «{{name}}» применяет на сервере переименование, преобразования и приведение типов.',
427
499
  csvColumn: "Столбец",
428
500
  mapsTo: "Сопоставляется с",
429
501
  typeMismatch: "Похоже на {{type}}",
@@ -483,6 +555,8 @@ const ru = {
483
555
  loadErrorUnauthorizedMessage: "Сессия истекла или вы вышли из системы. Войдите снова, чтобы просмотреть эти записи.",
484
556
  loadErrorRejectedTitle: "Запрос этого представления отклонён",
485
557
  loadErrorRejectedMessage: "Сервер не смог обработать фильтр или параметры запроса этого представления. Обычно помогает сброс фильтров; если представление сохранено в таком виде, исправить его должен администратор.",
558
+ loadErrorApiDisabledTitle: "Этот объект недоступен через API",
559
+ loadErrorApiDisabledMessage: "Страница не может загрузить записи, потому что объект не открыт через API. Это настройка самого объекта, а не права доступа — администратор должен включить доступ по API, чтобы эта страница заработала.",
486
560
  retry: "Повторить",
487
561
  managedBy: {
488
562
  system: {
@@ -507,7 +581,7 @@ const ru = {
507
581
  },
508
582
  },
509
583
  refresh: "Обновить",
510
- loading: 'Loading records...',
584
+ loading: "Загрузка записей…",
511
585
  recordCount: "{{count}} записей",
512
586
  recordCountOne: "{{count}} запись",
513
587
  addRecord: "Добавить запись",
@@ -519,7 +593,8 @@ const ru = {
519
593
  sort: "Сортировка",
520
594
  sortRecords: "Сортировка записей",
521
595
  sortByIdSuffix: "(по ID)",
522
- sortRelationalHint: "Столбцы, ссылающиеся на другую запись, здесь не показаны: их можно сортировать только по сохранённому ID, а не по имени, которое видно в ячейке. Чтобы сортировать по этому имени, добавьте поле-формулу с ним.",
596
+ sortRelationalHint: "Столбцы, ссылающиеся на другую запись, здесь не показаны: их можно сортировать только по сохранённому ID, а не по имени, которое видно в ячейке. Чтобы сортировать по этому имени, денормализуйте его в этот объект — как сохраняемое поле, которое записывается при изменении источника, — и сортируйте по нему. Не поле-формула: она виртуальна, столбец для неё не хранится, и сервер отказывается сортировать по ней.",
597
+ resetSortToDefault: "Сбросить к сортировке представления",
523
598
  group: "Группировка",
524
599
  groupBy: "Группировать по",
525
600
  export: "Экспорт",
@@ -577,13 +652,16 @@ const ru = {
577
652
  },
578
653
  kanban: {
579
654
  uncategorized: "Без категории",
655
+ columns: "колонок",
580
656
  addCard: "Добавить карточку",
581
657
  addColumn: "Добавить колонку",
582
658
  moveCard: "Переместить карточку",
583
659
  deleteCard: "Удалить карточку",
584
660
  deleteColumn: "Удалить колонку",
585
661
  noCards: "Нет карточек",
586
- cardTitlePlaceholder: "Введите название карточки...",
662
+ cardTitlePlaceholder: "Введите название карточки…",
663
+ requiredFieldsTitle: "Заполните обязательные поля",
664
+ requiredFieldsDescription: "Это перемещение делает поля ниже обязательными. Заполните их, чтобы продолжить.",
587
665
  },
588
666
  timeline: {
589
667
  bucket: {
@@ -596,6 +674,13 @@ const ru = {
596
674
  noDate: "Без даты",
597
675
  unassigned: "Не назначено",
598
676
  },
677
+ scale: {
678
+ week: "Неделя {{n}}",
679
+ quarter: "{{quarter}} кв. {{year}}",
680
+ },
681
+ gantt: {
682
+ rowLabel: "Элементы",
683
+ },
599
684
  },
600
685
  gantt: {
601
686
  viewMode: {
@@ -642,6 +727,18 @@ const ru = {
642
727
  ff: "Окончание → Окончание",
643
728
  sf: "Начало → Окончание",
644
729
  },
730
+ linkEnd: {
731
+ start: "Начало",
732
+ end: "Конец",
733
+ },
734
+ link: {
735
+ rejected: {
736
+ self: "Задача не может зависеть от самой себя.",
737
+ locked: "Эта строка заблокирована и не может принять новую зависимость.",
738
+ group: "Сводная строка не может быть целью зависимости — свяжите одну из её задач.",
739
+ cycle: "Эта связь создаст циклическую зависимость.",
740
+ },
741
+ },
645
742
  conflict: {
646
743
  title: "Конфликт расписания",
647
744
  body: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
@@ -650,8 +747,8 @@ const ru = {
650
747
  },
651
748
  autoScheduleDlg: {
652
749
  title: "Автопланирование",
653
- body: "Сдвинуть {count} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
654
- skipped: "{count} заблокированных задач(и) также нарушают связи и были пропущены.",
750
+ body: "Сдвинуть {{count}} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
751
+ skipped: "{{count}} заблокированных задач(и) также нарушают связи и были пропущены.",
655
752
  confirm: "Применить",
656
753
  cancel: "Отмена",
657
754
  none: "Все зависимости соблюдены — перепланировать нечего.",
@@ -688,6 +785,7 @@ const ru = {
688
785
  exportPng: "Экспортировать в PNG",
689
786
  exportPdf: "Экспортировать в PDF",
690
787
  saveLayout: "Сохранить компоновку",
788
+ refresh: "Обновить",
691
789
  undo: "Отменить",
692
790
  redo: "Повторить",
693
791
  prevPeriod: "Предыдущий период",
@@ -728,11 +826,11 @@ const ru = {
728
826
  defaultBadge: "по умолчанию",
729
827
  tabActionsFor: "Действия с представлением {{name}}",
730
828
  readonlyAriaLabel: "Представление только для чтения",
731
- readonlyTooltip: "Системное представление — скопируйте для настройки.",
829
+ readonlyTooltip: "Системное представление — определено в коде, только для чтения.",
732
830
  },
733
831
  designer: {
734
- undo: 'Undo',
735
- redo: 'Redo',
832
+ undo: "Отменить",
833
+ redo: "Повторить",
736
834
  },
737
835
  detail: {
738
836
  editInlineHint: "Дважды щёлкните для редактирования",
@@ -774,13 +872,15 @@ const ru = {
774
872
  relatedRecords: "{{count}} записей",
775
873
  relatedRecordOne: "{{count}} запись",
776
874
  noRelatedRecords: "Связанные записи не найдены",
777
- loading: "Загрузка...",
875
+ loading: "Загрузка…",
778
876
  copyToClipboard: "Копировать в буфер обмена",
779
877
  copied: "Скопировано!",
780
878
  deleteConfirmation: "Вы уверены, что хотите удалить эту запись?",
879
+ deleted: "Запись удалена",
781
880
  editRecord: "Редактировать запись",
782
881
  viewAll: "Показать все",
783
882
  new: "Создать",
883
+ add: "Добавить",
784
884
  emptyValue: "—",
785
885
  activity: "Активность",
786
886
  editRow: "Редактировать",
@@ -791,7 +891,7 @@ const ru = {
791
891
  nextPage: "Далее",
792
892
  pageOf: "Страница {{current}} из {{total}}",
793
893
  sortBy: "Сортировать по",
794
- filterPlaceholder: "Фильтр...",
894
+ filterPlaceholder: "Фильтр…",
795
895
  highlightFields: "Ключевые поля",
796
896
  comments: "Комментарии",
797
897
  searchComments: "Поиск комментариев…",
@@ -821,6 +921,10 @@ const ru = {
821
921
  attachmentDownloadDenied: "У вас нет доступа для скачивания этого вложения.",
822
922
  attachmentAuthRequired: "Войдите в систему, чтобы скачать это вложение.",
823
923
  attachmentPermissionDenied: "У вас нет разрешения на это действие.",
924
+ attachmentsAccessDenied: "У вас нет доступа к этим вложениям.",
925
+ attachmentsLoadFailed: "Не удалось загрузить вложения этой записи.",
926
+ attachmentsApiUnavailable: "Список вложений недоступен для этого объекта.",
927
+ retryLoadAttachments: "Повторить",
824
928
  unifiedDiff: "Единое представление",
825
929
  sideBySideDiff: "Параллельное представление",
826
930
  noChanges: "Нет изменений",
@@ -856,6 +960,7 @@ const ru = {
856
960
  loadMore: "Загрузить ещё",
857
961
  edited: "(изменено)",
858
962
  via: "через {{source}}",
963
+ viewSource: "Показать источник",
859
964
  replyCount: "{{count}} ответ",
860
965
  replyCountPlural: "{{count}} ответов",
861
966
  replyPlaceholder: "Ответить…",
@@ -871,6 +976,8 @@ const ru = {
871
976
  writeStrippedTitle: "Сохранено, но часть полей не применена",
872
977
  writeStrippedReadonly: "Поля только для чтения, поэтому не применены: {{fields}}",
873
978
  writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не применены: {{fields}}",
979
+ writeStrippedPrimaryKey: "Идентификатор записи нельзя изменить при сохранении, поэтому поля не применены: {{fields}}",
980
+ writeStrippedUnknownReason: "Не применены сервером: {{fields}}",
874
981
  approvalPendingEditable: "На согласовании · редактирование доступно",
875
982
  approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
876
983
  approvalProgress: "Согласования — {{got}} из {{need}}",
@@ -883,6 +990,13 @@ const ru = {
883
990
  cancelApprovalTooltipUnlocked: "Отменить ожидающий запрос на согласование",
884
991
  cancelApprovalFailed: "Не удалось отменить согласование",
885
992
  cancelApprovalUnavailable: "Отмена согласований не поддерживается этим источником данных",
993
+ pathLabel: 'Путь записи',
994
+ pathStageCompleted: '{{stage}}, завершён',
995
+ pathStageCurrent: '{{stage}}, текущий этап',
996
+ pathStageUpcoming: '{{stage}}, предстоит',
997
+ pathStageLostCurrent: '{{stage}}, проигран, текущий этап',
998
+ pathStageLostUpcoming: '{{stage}}, проигран, не достигнут',
999
+ pathStageWonUpcoming: '{{stage}}, целевой этап, не достигнут',
886
1000
  linkCopied: "Ссылка скопирована в буфер обмена",
887
1001
  linkCopyFailed: "Не удалось скопировать ссылку",
888
1002
  cancel: "Отмена",
@@ -897,11 +1011,20 @@ const ru = {
897
1011
  concurrentUpdateReload: "Загрузить текущую версию",
898
1012
  concurrentUpdateOverwrite: "Всё равно перезаписать",
899
1013
  concurrentUpdateCancel: "Отмена",
1014
+ concurrentUpdateRecordLabel: "этой записи",
900
1015
  openInNewTab: "Открыть в новой вкладке",
901
1016
  history: "История",
1017
+ historyEmpty: "Истории пока нет",
902
1018
  deleteRowTitle: "Удалить запись",
903
1019
  createdBy: "Создано",
904
1020
  updatedBy: "Обновлено",
1021
+ // objectui#3863 — base key, and in ru this is the slot users actually hit: `few`
1022
+ // (2-4) and `many` (5-20, 25-30, …) are unenumerated, so before this key those
1023
+ // counts rendered ENGLISH. The value therefore cannot agree with the numeral —
1024
+ // it uses the «Существительное: {{count}}» form this pack already writes 22 times
1025
+ // (lookup.recordCount `Записей: {{count}}`, notifications.groupCount), which is
1026
+ // correct for EVERY Russian count. `_one` keeps the agreeing form for 1/21/31/…
1027
+ showEmptyRelated: "+ Пустых: {{count}}",
905
1028
  showEmptyRelated_one: "+ {{count}} пустое",
906
1029
  showEmptyRelated_other: "+ {{count}} пустых",
907
1030
  copyEmail: "Копировать email",
@@ -913,7 +1036,8 @@ const ru = {
913
1036
  },
914
1037
  chart: {
915
1038
  noData: "Нет данных для графика",
916
- loading: "Загрузка графика...",
1039
+ loading: "Загрузка графика…",
1040
+ nullCategory: "(Не указано)",
917
1041
  },
918
1042
  map: {
919
1043
  searchLocations: "Поиск местоположений…",
@@ -922,68 +1046,9 @@ const ru = {
922
1046
  invalidCoordinates: "{{count}} запись с отсутствующими или недействительными координатами исключена из карты.",
923
1047
  invalidCoordinatesPlural: "{{count}} записей с отсутствующими или недействительными координатами исключены из карты.",
924
1048
  },
925
- workflow: {
926
- draft: "Черновик",
927
- active: "Активный",
928
- paused: "Приостановлен",
929
- completed: "Завершён",
930
- cancelled: "Отменён",
931
- save: "Сохранить",
932
- publish: "Опубликовать",
933
- addNode: "Добавить узел",
934
- workflowFlow: "Рабочий процесс",
935
- properties: "Свойства",
936
- connections: "Соединения",
937
- quickConnect: "Быстрое соединение",
938
- fromPlaceholder: "От...",
939
- toPlaceholder: "К...",
940
- connect: "Соединить",
941
- label: "Метка",
942
- type: "Тип",
943
- description: "Описание",
944
- assignee: "Ответственный",
945
- assigneeType: "Тип ответственного",
946
- user: "Пользователь",
947
- role: "Роль",
948
- group: "Группа",
949
- expression: "Выражение",
950
- timeoutMinutes: "Тайм-аут (минуты)",
951
- selectNodeToEdit: "Выберите узел для редактирования его свойств",
952
- workflowTitle: "Название рабочего процесса",
953
- newWorkflow: "Новый рабочий процесс",
954
- outConnections: "{{count}} выходов",
955
- start: "Начало",
956
- end: "Конец",
957
- task: "Задача",
958
- userTask: "Задача пользователя",
959
- serviceTask: "Сервисная задача",
960
- scriptTask: "Скриптовая задача",
961
- approval: "Одобрение",
962
- condition: "Условие",
963
- parallelGateway: "Параллельный шлюз",
964
- joinGateway: "Шлюз объединения",
965
- boundaryEvent: "Граничное событие",
966
- delay: "Задержка",
967
- notification: "Уведомление",
968
- webhook: "Webhook",
969
- allowConcurrency: "Разрешить (параллельное выполнение)",
970
- forbidConcurrency: "Запретить (пропустить новые)",
971
- replaceConcurrency: "Заменить (отменить текущие)",
972
- queueConcurrency: "Очередь (выполнить после текущего)",
973
- conditionEvent: "Условие",
974
- manualEvent: "Ручной",
975
- webhookEvent: "Webhook",
976
- timerEvent: "Таймер",
977
- signalEvent: "Сигнал",
978
- versionHistory: "История версий",
979
- importBpmn: "Импорт BPMN",
980
- exportBpmn: "Экспорт BPMN",
981
- undo: "Отменить",
982
- redo: "Повторить",
983
- resetZoom: "Сбросить масштаб",
984
- },
985
1049
  dashboard: {
986
1050
  noRows: "Нет строк",
1051
+ loading: "Загрузка…",
987
1052
  pickMeasures: "Выберите меры (значения) для этого виджета набора данных.",
988
1053
  datasetUnsupported: "Этот источник данных не поддерживает запросы к наборам данных.",
989
1054
  details: "Подробности",
@@ -1020,6 +1085,105 @@ const ru = {
1020
1085
  total: "Итого",
1021
1086
  noDataAvailable: "Данные недоступны",
1022
1087
  noDataSourceFor: "Нет источника данных для",
1088
+ config: {
1089
+ breadcrumb: {
1090
+ dashboard: "Дашборд",
1091
+ configuration: "Конфигурация",
1092
+ widget: "Виджет",
1093
+ chart: "Диаграмма",
1094
+ table: "Таблица",
1095
+ pivotTable: "Сводная таблица",
1096
+ },
1097
+ section: {
1098
+ general: "Основные",
1099
+ layout: "Макет",
1100
+ data: "Данные",
1101
+ dataBinding: "Привязка данных",
1102
+ appearance: "Внешний вид",
1103
+ },
1104
+ field: {
1105
+ title: "Заголовок",
1106
+ description: "Описание",
1107
+ columns: "Столбцы",
1108
+ gap: "Отступ",
1109
+ rowHeight: "Высота строки (px)",
1110
+ autoRefresh: "Автообновление",
1111
+ showDescription: "Показать описание",
1112
+ theme: "Тема",
1113
+ widgetType: "Тип виджета",
1114
+ colorVariant: "Вариант цвета",
1115
+ dataset: "Набор данных",
1116
+ dimensions: "Измерения",
1117
+ values: "Значения",
1118
+ width: "Ширина (столбцы)",
1119
+ height: "Высота (строки)",
1120
+ },
1121
+ placeholder: {
1122
+ dashboardTitle: "Заголовок дашборда",
1123
+ dashboardDescription: "Краткое описание под заголовком",
1124
+ widgetTitle: "Заголовок виджета",
1125
+ widgetDescription: "Описание виджета",
1126
+ datasetName: "Имя набора данных",
1127
+ selectDataset: "Выберите набор данных…",
1128
+ searchDatasets: "Поиск наборов данных…",
1129
+ addDimension: "Добавить измерение…",
1130
+ addMeasure: "Добавить меру…",
1131
+ searchMembers: "Поиск…",
1132
+ },
1133
+ empty: {
1134
+ datasets: "Наборы данных не найдены.",
1135
+ dimensions: "Измерения не выбраны.",
1136
+ measures: "Меры не выбраны.",
1137
+ nothingToAdd: "Больше нечего добавить.",
1138
+ },
1139
+ help: {
1140
+ dataset: "Набор данных семантического слоя, к которому привязан этот виджет (ADR-0021).",
1141
+ dimensions: "Группировать/разделять значения по этим измерениям набора данных.",
1142
+ dimensionsPivot: "Поля группировки/разделения. Последнее измерение разворачивается по столбцам.",
1143
+ values: "Меры из набора данных для отображения (хотя бы одна).",
1144
+ },
1145
+ action: {
1146
+ add: "Добавить",
1147
+ remove: "Удалить {{name}}",
1148
+ },
1149
+ refresh: {
1150
+ off: "Выкл.",
1151
+ every30s: "Каждые 30 с",
1152
+ every1m: "Каждую 1 мин",
1153
+ every5m: "Каждые 5 мин",
1154
+ every15m: "Каждые 15 мин",
1155
+ every30m: "Каждые 30 мин",
1156
+ every1h: "Каждый 1 час",
1157
+ },
1158
+ themeOption: {
1159
+ light: "Светлая",
1160
+ dark: "Тёмная",
1161
+ auto: "Авто",
1162
+ },
1163
+ widgetType: {
1164
+ metric: "Метрика",
1165
+ bar: "Столбчатая диаграмма",
1166
+ horizontalBar: "Горизонтальная гистограмма",
1167
+ line: "Линейная диаграмма",
1168
+ pie: "Круговая диаграмма",
1169
+ donut: "Кольцевая диаграмма",
1170
+ area: "Диаграмма с областями",
1171
+ scatter: "Точечная диаграмма",
1172
+ funnel: "Воронка",
1173
+ table: "Таблица",
1174
+ pivot: "Сводная таблица",
1175
+ },
1176
+ color: {
1177
+ default: "По умолчанию",
1178
+ blue: "Синий",
1179
+ teal: "Бирюзовый",
1180
+ orange: "Оранжевый",
1181
+ purple: "Фиолетовый",
1182
+ success: "Успех",
1183
+ warning: "Предупреждение",
1184
+ danger: "Опасность",
1185
+ },
1186
+ },
1023
1187
  trend: {
1024
1188
  vsLastQuarter: "пред. квартал",
1025
1189
  vsLastMonth: "пред. месяц",
@@ -1029,24 +1193,6 @@ const ru = {
1029
1193
  vsPreviousPeriod: "пред. период",
1030
1194
  },
1031
1195
  },
1032
- configPanel: {
1033
- save: "Сохранить",
1034
- discard: "Отменить",
1035
- close: "Закрыть",
1036
- layout: "Макет",
1037
- columns: "Столбцы",
1038
- gap: "Отступ",
1039
- rowHeight: "Высота строки",
1040
- data: "Данные",
1041
- refreshInterval: "Интервал обновления",
1042
- appearance: "Внешний вид",
1043
- title: "Заголовок",
1044
- showDescription: "Показать описание",
1045
- theme: "Тема",
1046
- configuration: "Конфигурация",
1047
- general: "Основные",
1048
- advanced: "Дополнительно",
1049
- },
1050
1196
  appDesigner: {
1051
1197
  createApp: "Создать приложение",
1052
1198
  editApp: "Редактировать приложение",
@@ -1077,7 +1223,7 @@ const ru = {
1077
1223
  faviconUrl: "Favicon URL",
1078
1224
  preview: "Предпросмотр",
1079
1225
  complete: "Завершить",
1080
- snakeCaseHint: "Must be snake_case (e.g. my_app)",
1226
+ snakeCaseHint: "Должно быть в формате snake_case (например, my_app)",
1081
1227
  modeEdit: "Редактировать",
1082
1228
  modePreview: "Предпросмотр",
1083
1229
  modeCode: "Код",
@@ -1097,8 +1243,6 @@ const ru = {
1097
1243
  showSort: "Показать сортировку",
1098
1244
  appearance: "Внешний вид",
1099
1245
  rowHeight: "Высота строки",
1100
- stripedRows: "Чередующиеся строки",
1101
- bordered: "С рамкой",
1102
1246
  livePreview: "Предпросмотр в реальном времени",
1103
1247
  stepBasicDesc: "Имя, заголовок и макет",
1104
1248
  stepObjectsDesc: "Выбрать бизнес-объекты",
@@ -1212,7 +1356,6 @@ const ru = {
1212
1356
  unique: "Уникальное",
1213
1357
  readOnly: "Только чтение",
1214
1358
  hidden: "Скрытое",
1215
- indexed: "Индексированное",
1216
1359
  externalId: "Внешний ID",
1217
1360
  trackHistory: "Отслеживать историю",
1218
1361
  defaultValue: "Значение по умолчанию",
@@ -1241,6 +1384,7 @@ const ru = {
1241
1384
  },
1242
1385
  },
1243
1386
  console: {
1387
+ saveAdvisoryTitle: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1244
1388
  settingsHub: {
1245
1389
  title: "Настройки",
1246
1390
  subtitle: "Настройте рабочее пространство, интеграции и флаги функций.",
@@ -1285,6 +1429,15 @@ const ru = {
1285
1429
  passwordsDownload: "Скачать CSV",
1286
1430
  },
1287
1431
  ai: {
1432
+ pendingDrafts: {
1433
+ // Число вынесено в конец («…: {{count}}») — так этот пак пишет
1434
+ // количества, как в home.pendingDrafts.publishedVerified.
1435
+ count: "Ещё не опубликовано изменений: {{count}} — пользователи их не видят.",
1436
+ publish: "Опубликовать",
1437
+ published: "Все ожидающие изменения вступили в силу.",
1438
+ failed: "Не удалось опубликовать.",
1439
+ publishedWithFindings: "Опубликовано, но проверки среды выполнения выявили проблемы: {{detail}}",
1440
+ },
1288
1441
  usage: {
1289
1442
  title: "Использование ИИ",
1290
1443
  meterBuild: "Сборка",
@@ -1307,7 +1460,7 @@ const ru = {
1307
1460
  shareTitle: "Поделиться этим диалогом",
1308
1461
  shareDisabledTitle: "Начните диалог, чтобы включить публикацию",
1309
1462
  newChat: "Создать",
1310
- searchChats: "Поиск по чатам...",
1463
+ searchChats: "Поиск по чатам…",
1311
1464
  noChatsYet: "Чатов пока нет",
1312
1465
  noChatsDescription: "Начните новый диалог, и он появится здесь.",
1313
1466
  noMatchingChats: "Подходящих чатов нет.",
@@ -1316,18 +1469,18 @@ const ru = {
1316
1469
  deleteConversation: "Удалить диалог",
1317
1470
  saveRename: "Сохранить название",
1318
1471
  cancelRename: "Отменить переименование",
1319
- loadingHistory: "Загрузка истории диалога...",
1472
+ loadingHistory: "Загрузка истории диалога…",
1320
1473
  conversationReady: "Диалог готов",
1321
1474
  preparingConversation: "Подготовка нового диалога",
1322
1475
  offlineDemoMode: "Автономный демонстрационный режим — список агентов недоступен",
1323
1476
  sendFailedRateLimited: "Вы отправляете сообщения слишком часто. Ваше сообщение сохранено ниже — подождите немного и попробуйте снова.",
1324
1477
  sendFailedGeneric: "Не удалось отправить сообщение. Оно сохранено ниже — попробуйте ещё раз.",
1325
- askAgent: "Спросить {{agent}}...",
1478
+ askAgent: "Спросить {{agent}}…",
1326
1479
  assistant: "Ассистент",
1327
1480
  liveCanvas: "Живой предпросмотр — {{app}} (черновик)",
1328
1481
  liveCanvasUnlisted: "Работающее приложение — {{app}} (скрыто до публикации)",
1329
- loadingAgents: "Загрузка агентов...",
1330
- askAnything: "Спросите о чём угодно...",
1482
+ loadingAgents: "Загрузка агентов…",
1483
+ askAnything: "Спросите о чём угодно…",
1331
1484
  emptyTitle: "Начните диалог",
1332
1485
  emptyDescription: "Спросите о чём угодно — ассистент видит контекст вашего текущего приложения.",
1333
1486
  switchAssistant: "Сменить ассистента",
@@ -1420,6 +1573,11 @@ const ru = {
1420
1573
  changesConfirmed: "Подтверждено",
1421
1574
  changesConfirm: "Подтвердить",
1422
1575
  changesConfirmHint: "Ответьте, чтобы подтвердить или скорректировать это изменение.",
1576
+ changesApplying: "Применение…",
1577
+ changesApplied: "Применено",
1578
+ changesDrafted: "Сохранено как черновик",
1579
+ changesFailed: "Не применено",
1580
+ discussing: "Обсуждается: {{target}}",
1423
1581
  changeVerb: {
1424
1582
  createObject: "Создать объект",
1425
1583
  addField: "Добавить поле",
@@ -1430,9 +1588,60 @@ const ru = {
1430
1588
  createSeed: "Сгенерировать примеры данных",
1431
1589
  createPackage: "Создать пакет приложения",
1432
1590
  },
1591
+ // objectui#3546 slice four — the AI console surfaces: the /ai chat page's app switcher,
1592
+ // connection banner and plan/publish cards, the ChatDock chrome, and the
1593
+ // conversation-list date buckets. `group.*` is the template-key family
1594
+ // `console.ai.group.${key}` (ConversationsSidebar), enumerated from the
1595
+ // ConversationGroupKey union — all five members, no wildcard.
1596
+ collapseToDock: "Свернуть в боковую панель",
1597
+ switchApp: "Сменить приложение",
1598
+ switchAppLabel: "Диалоги сборки по приложениям",
1599
+ newApp: "Новое приложение",
1600
+ connectionWaiting: "Ожидание сервера…",
1601
+ connectionStalled: "Всё ещё выполняется…",
1602
+ connectionOffline: "Соединение потеряно — переподключение…",
1603
+ designingPlan: "Проектирование вашего приложения…",
1604
+ designingPlanHint: {
1605
+ data: "Определяю данные, которые вы будете отслеживать…",
1606
+ objects: "Формирую объекты и их поля…",
1607
+ relations: "Соединяю связанные записи…",
1608
+ lookups: "Настраиваю связи и подстановки…",
1609
+ views: "Планирую экраны и представления…",
1610
+ forms: "Размещаю формы и списки…",
1611
+ defaults: "Добавляю разумные значения по умолчанию и проверки…",
1612
+ dashboard: "Набрасываю дашборд для отслеживания…",
1613
+ review: "Перепроверяю, что структура согласована…",
1614
+ finalize: "Собираю план воедино…",
1615
+ },
1616
+ planBuilding: "Сборка…",
1617
+ planBuilt: "Собрано",
1618
+ planDeferred: "Ещё не собрано",
1619
+ planReady: "План готов. Соберите его сейчас или скажите, что нужно скорректировать.",
1620
+ published: "Опубликовано",
1621
+ publishFailed: "Не удалось опубликовать",
1622
+ unavailableTitle: "Ассистент ИИ недоступен",
1623
+ unavailableDescription: "В этой среде ассистент ИИ не включён. Всё остальное работает как обычно.",
1624
+ unavailableError: "Не удалось связаться с сервисом ИИ. Возможно, он временно недоступен — повторите попытку или вернитесь на главную.",
1625
+ unavailableRetry: "Повторить",
1626
+ unavailableHome: "На главную",
1627
+ dock: {
1628
+ title: "Ассистент",
1629
+ description: "Чат с ассистентом ИИ",
1630
+ resize: "Изменить размер чата",
1631
+ collapse: "Свернуть чат",
1632
+ maximize: "Открыть на всю страницу",
1633
+ open: "Открыть ассистента",
1634
+ },
1635
+ group: {
1636
+ today: "Сегодня",
1637
+ yesterday: "Вчера",
1638
+ previous7Days: "Предыдущие 7 дней",
1639
+ previous30Days: "Предыдущие 30 дней",
1640
+ older: "Ранее",
1641
+ },
1433
1642
  },
1434
1643
  title: "Консоль ObjectStack",
1435
- initializing: "Инициализация приложения...",
1644
+ initializing: "Инициализация приложения…",
1436
1645
  loadingHint: "Настройка нового окружения может занять некоторое время.",
1437
1646
  breadcrumb: {
1438
1647
  dashboards: "Панели",
@@ -1440,6 +1649,31 @@ const ru = {
1440
1649
  reports: "Отчёты",
1441
1650
  system: "Система",
1442
1651
  },
1652
+ // objectui#4024 — the single-namespace settings screen. Its sibling
1653
+ // `settingsHub` above already resolved through this pack; the view was the
1654
+ // one file still carrying English literals.
1655
+ settingsView: {
1656
+ backToHub: "Все настройки",
1657
+ back: "Назад",
1658
+ noNamespace: "Пространство имён не выбрано.",
1659
+ loadError: "Не удалось загрузить настройки",
1660
+ saved: "Настройки сохранены",
1661
+ saveFailed: "Ошибка сохранения",
1662
+ lockedByEnv: "Заблокировано окружением: {{key}}",
1663
+ lockedByEnvNoKey: "Заблокировано окружением",
1664
+ actionSucceeded: "Действие выполнено",
1665
+ actionFailed: "Действие не выполнено",
1666
+ discard: "Отменить",
1667
+ saveChanges: "Сохранить изменения",
1668
+ unsavedCount: "Несохранённых изменений: {{count}}",
1669
+ unsavedCount_one: "{{count}} несохранённое изменение",
1670
+ unsavedCount_other: "{{count}} несохранённых изменений",
1671
+ cryptoRefusalTitle: "Эта установка не может шифровать секреты",
1672
+ cryptoRefusalSubjectSuffix: "объявлен зашифрованным, поэтому ничего не было записано.",
1673
+ cryptoRefusalNoSubject: "Значение, объявленное зашифрованным, было отклонено, поэтому ничего не было записано.",
1674
+ cryptoRefusalToast: "Не удалось зашифровать секреты: {{subject}}",
1675
+ cryptoRefusalToastNoSubject: "Не удалось зашифровать секреты",
1676
+ },
1443
1677
  loadingSteps: {
1444
1678
  connecting: "Подключение к источнику данных",
1445
1679
  loadingConfig: "Загрузка конфигурации",
@@ -1469,6 +1703,7 @@ const ru = {
1469
1703
  general: "Общие",
1470
1704
  navigation: "Навигация",
1471
1705
  dataViews: "Представления данных",
1706
+ aiChat: "Ассистент ИИ",
1472
1707
  preferences: "Настройки",
1473
1708
  },
1474
1709
  openCommandPalette: "Открыть палитру команд",
@@ -1479,11 +1714,13 @@ const ru = {
1479
1714
  createRecord: "Создать новую запись",
1480
1715
  refreshData: "Обновить данные",
1481
1716
  editRecord: "Редактировать выбранную запись",
1717
+ newChat: "Новый чат",
1718
+ toggleChatsList: "Переключить список чатов",
1482
1719
  toggleDarkMode: "Переключить тёмный режим",
1483
1720
  },
1484
1721
  commandPalette: {
1485
1722
  title: "Палитра команд",
1486
- placeholder: "Введите команду или поиск...",
1723
+ placeholder: "Введите команду или поиск…",
1487
1724
  noResults: "Результаты не найдены.",
1488
1725
  objects: "Объекты",
1489
1726
  dashboards: "Панели мониторинга",
@@ -1509,6 +1746,12 @@ const ru = {
1509
1746
  goHome: "На главную",
1510
1747
  errorDetails: "Подробности ошибки (только для разработки)",
1511
1748
  },
1749
+ // objectui#3546 slice four — the console's catch-all route (AppContent `RouteNotFound`).
1750
+ notFound: {
1751
+ title: "Страница не найдена",
1752
+ description: "Открытый URL не соответствует ни одному представлению в этом приложении.",
1753
+ back: "Назад",
1754
+ },
1512
1755
  theme: {
1513
1756
  toggle: "Переключить тему",
1514
1757
  light: "Светлая",
@@ -1524,109 +1767,41 @@ const ru = {
1524
1767
  viewNameHelp: "Машинный ключ (snake_case). Заполняется автоматически из заголовка — при желании измените.",
1525
1768
  viewNameRequired: "Введите ключ (строчные буквы, цифры, подчёркивание). Для нелатинских заголовков автозаполнение не работает.",
1526
1769
  viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
1527
- systemViewReadonly: 'System view defined in code - duplicate to customize.',
1528
- expandToPage: 'Open as full page',
1770
+ systemViewReadonly: "Системное представление определено в коде — только для чтения.",
1771
+ cannotEditMetaView: "Это встроенное представление, определённое в коде, — изменить его нельзя.",
1772
+ cannotDeleteMetaView: "Это встроенное представление, определённое в коде, — удалить его нельзя.",
1773
+ expandToPage: "Открыть на всю страницу",
1529
1774
  objectNotFound: "Объект не найден",
1530
1775
  objectNotFoundDescription: "Объект «{{objectName}}» не существует в текущей конфигурации.",
1531
1776
  objectNotFoundHint: "Проверьте настройки навигации приложения или выберите другой объект на боковой панели.",
1532
1777
  filterOrNotSavable: "Этот фильтр объединяет условия через ИЛИ, что сохранённое представление пока не может хранить. Он по-прежнему применяется к этому списку — уберите группировку ИЛИ, чтобы сохранить его в представлении.",
1533
1778
  filterNestedNotSavable: "Этот фильтр использует вложенные группы условий, которые сохранённое представление не может хранить. Преобразуйте его в один список условий, чтобы сохранить в представлении.",
1534
1779
  allRecords: "Все записи",
1535
- exitDesignMode: "Выйти из режима дизайна",
1536
- enterDesignMode: "Войти в режим дизайна",
1537
- metadataInspector: "Инспектор метаданных",
1538
- editView: "Редактировать представление",
1539
- addView: "Добавить представление",
1540
- designTools: "Инструменты дизайна",
1541
1780
  new: "Создать",
1542
1781
  configureView: "Настроить представление",
1543
- closePanel: "Закрыть панель",
1544
- page: "Страница",
1545
- pageConfigHint: "Панель инструментов, навигация и настройки оболочки представления",
1546
- listConfigHint: "Отрисовка данных, столбцы и внешний вид для этого типа списка",
1547
- general: "Общие",
1548
- generalHint: "Название, описание и тип представления",
1549
1782
  toolbar: "Панель инструментов",
1550
- toolbarHint: "Поиск, фильтр, сортировка, группировка и переключение плотности",
1551
1783
  toolbarEnabledCount: "{{count}} из {{total}} включено",
1552
- navigationSection: "Навигация",
1553
- navigationHint: "Поведение при нажатии на строку и настройки детального представления",
1554
- records: "Записи",
1555
- recordsHint: "Режим выбора, добавление записи и встроенное редактирование",
1556
- exportPrint: "Экспорт и печать",
1557
- exportPrintHint: "Форматы экспорта, печать и отображение количества записей",
1558
- showAllFields: "Показать все",
1559
- hideAllFields: "Скрыть все",
1560
- searchFields: "Поиск полей...",
1784
+ searchFields: "Поиск полей…",
1561
1785
  title: "Заголовок",
1562
- description: "Описание",
1563
- data: "Данные",
1564
- source: "Источник",
1565
- columns: "Столбцы",
1566
- filterBy: "Фильтр по",
1567
- sortBy: "Сортировка по",
1568
- appearance: "Внешний вид",
1569
- showDescription: "Показать описание",
1570
1786
  viewType: "Тип представления",
1571
- userFilters: "Фильтры пользователя",
1572
- enableSearch: "Включить поиск",
1573
- enableFilter: "Включить фильтр",
1574
- enableSort: "Включить сортировку",
1575
- enableHideFields: "Включить скрытие полей",
1576
- enableGroup: "Включить группировку",
1577
- enableColor: "Включить цвет",
1578
- enableDensity: "Включить плотность",
1579
- userActions: "Действия пользователя",
1580
- addRecordViaForm: "Добавить записи через форму",
1581
- advanced: "Расширенные",
1582
- allowExport: "Разрешить экспорт",
1583
1787
  recordCount: "{{count}} записей",
1584
- noDescription: "Нет описания",
1585
- none: "Нет",
1586
- columnsConfigured: "{{count}} столбцов",
1587
1788
  save: "Сохранить",
1588
1789
  discard: "Отменить",
1589
1790
  createView: "Создать представление",
1590
1791
  newView: "Новое представление",
1591
- typeOptions: "Параметры типа",
1592
1792
  groupByField: "Поле группировки",
1593
1793
  startDateField: "Поле даты начала",
1594
1794
  titleField: "Поле заголовка",
1595
1795
  latitudeField: "Поле широты",
1596
1796
  longitudeField: "Поле долготы",
1597
1797
  imageField: "Поле изображения",
1598
- dateField: "Поле даты",
1599
- selectField: "Выберите поле...",
1600
- gridOptionsHint: "Представление таблицы использует столбцы, настроенные выше.",
1798
+ selectField: "Выберите поле…",
1601
1799
  groupBy: "Группировать по",
1602
- prefixField: "Поле префикса",
1603
- fields: "Поля",
1604
- fieldsVisible: "{{count}} видимых",
1605
- sortsCount: "{{count}} сортировок",
1606
- filtersCount: "{{count}} фильтров",
1607
1800
  endDateField: "Поле даты окончания",
1608
- color: "Цвет",
1609
- fieldTextColor: "Цвет текста поля",
1610
- rowHeight: "Высота строки",
1611
- wrapHeaders: "Перенос заголовков",
1612
- showFieldDescriptions: "Показать описания полей",
1613
- collapseAllByDefault: "Свернуть всё по умолчанию",
1614
- striped: "Полосатые строки",
1615
- bordered: "Ячейки с границами",
1616
- inlineEdit: "Редактировать записи встроенно",
1617
- addDeleteRecordsInline: "Добавлять/удалять записи встроенно",
1618
- clickIntoRecordDetails: "Нажмите для просмотра деталей записи",
1619
- navigationMode: "Режим навигации",
1620
- navigationWidth: "Ширина навигации",
1621
- navigationWidthHint: "Доступно для режимов навигации: выдвижная панель, модальное окно и разделённый вид",
1622
- openNewTab: "Открыть в новой вкладке",
1623
- openNewTabHint: "Доступно для режимов навигации: страница и новое окно",
1624
1801
  import: "Импорт",
1625
1802
  importTitle: "Импорт из CSV",
1626
1803
  importedToast: "{{count}} строк импортировано.",
1627
1804
  importedWithSkipped: "{{ok}} строк импортировано; {{skipped}} пропущено.",
1628
- showAdvancedSettings: "Показать расширенные настройки",
1629
- showFewerSettings: "Меньше настроек",
1630
1805
  createViewDesc: "Выберите тип представления и задайте ему имя. Все настройки можно изменить позже.",
1631
1806
  cancel: "Отмена",
1632
1807
  create: "Создать",
@@ -1659,7 +1834,7 @@ const ru = {
1659
1834
  latitudeFieldHelp: "Поле с широтой (только гео-поля).",
1660
1835
  longitudeFieldHelp: "Поле с долготой (только гео-поля).",
1661
1836
  imageFieldHelp: "Обложка галереи берётся из этого поля изображения или вложений.",
1662
- selectOption: "Выбрать...",
1837
+ selectOption: "Выбрать…",
1663
1838
  noEligibleFieldForType: "Нет подходящих полей этого типа. Сначала добавьте его к объекту.",
1664
1839
  viewTypeUnavailable: "У этого объекта нет поля, которое может служить \"{{field}}\".",
1665
1840
  viewTypeUnavailableShort: "Не поддерживается этим объектом.",
@@ -1674,58 +1849,9 @@ const ru = {
1674
1849
  xAxisFieldHelp: "Категориальное или временное измерение.",
1675
1850
  yAxisField: "Поле оси Y",
1676
1851
  yAxisFieldHelp: "Числовое поле для агрегации.",
1677
- selectionMode: "Режим выбора",
1678
- selectionNone: "Нет",
1679
- selectionSingle: "Одиночный",
1680
- selectionMultiple: "Множественный",
1681
- pageSize: "Размер страницы",
1682
- pageSizeOptions: "Варианты размера страницы",
1683
- exportFormats: "Форматы экспорта",
1684
- exportMaxRecords: "Макс. записей",
1685
- exportIncludeHeaders: "Включить заголовки",
1686
- exportFileNamePrefix: "Префикс имени файла",
1687
- searchableFields: "Поля для поиска",
1688
- filterableFields: "Поля для фильтрации",
1689
- resizableColumns: "Изменяемые столбцы",
1690
- densityCompact: "Компактный",
1691
- densityComfortable: "Обычный",
1692
- densitySpacious: "Просторный",
1693
- densityMode: "Режим плотности",
1694
- hiddenFields: "Скрытые поля",
1695
- rowActions: "Действия строки",
1696
- bulkActions: "Массовые действия",
1697
- sharing: "Общий доступ",
1698
- sharingEnabled: "Общий доступ включён",
1699
- sharingVisibility: "Видимость",
1700
- addRecordEnabled: "Добавление записей включено",
1701
- addRecordPosition: "Позиция",
1702
- addRecordMode: "Режим",
1703
- addRecordFormView: "Представление формы",
1704
- conditionalFormatting: "Условное форматирование",
1705
- addRule: "Добавить правило",
1706
- quickFilters: "Быстрые фильтры",
1707
- addQuickFilter: "Добавить быстрый фильтр",
1708
- ufElements: "Элементы",
1709
- ufDropdown: "Выпадающий список",
1710
1852
  ufTabs: "Вкладки",
1711
- ufToggle: "Переключатель",
1712
- ufAddField: "+ Добавить поле фильтра...",
1713
- ufNoFields: "Поля недоступны",
1714
- ufAddTab: "+ Добавить вкладку",
1715
- ufTabLabel: "Метка",
1853
+ ufAddField: "+ Добавить поле фильтра…",
1716
1854
  ufShowAllRecords: "Показать вкладку \"Все записи\"",
1717
- ufAllowAddTab: "Разрешить добавление вкладок",
1718
- showRecordCount: "Показать количество записей",
1719
- allowPrinting: "Разрешить печать",
1720
- virtualScroll: "Виртуальная прокрутка",
1721
- emptyStateTitle: "Заголовок пустого состояния",
1722
- emptyStateMessage: "Сообщение пустого состояния",
1723
- emptyStateIcon: "Значок пустого состояния",
1724
- ariaLabel: "Метка ARIA",
1725
- ariaDescribedBy: "Описано ARIA",
1726
- ariaLive: "ARIA Live",
1727
- accessibility: "Доступность",
1728
- viewTabs: "Вкладки представлений",
1729
1855
  },
1730
1856
  localeSwitcher: {
1731
1857
  label: "Язык",
@@ -1769,7 +1895,7 @@ const ru = {
1769
1895
  passwordPlaceholder: "Введите пароль",
1770
1896
  forgotPasswordText: "Забыли пароль?",
1771
1897
  submitButton: "Войти",
1772
- submittingButton: "Вход...",
1898
+ submittingButton: "Вход…",
1773
1899
  noAccountText: "Нет аккаунта?",
1774
1900
  signUpText: "Зарегистрироваться",
1775
1901
  errors: {
@@ -1777,6 +1903,18 @@ const ru = {
1777
1903
  invalidCredentials: "Неверный email или пароль. Попробуйте ещё раз.",
1778
1904
  emailNotVerified: "Пожалуйста, подтвердите email перед входом.",
1779
1905
  },
1906
+ // objectui#3546 slice three — phone/OTP sign-in. `{seconds}` is LoginForm's own
1907
+ // literal `.replace()` hole, not i18next interpolation: keep the single braces.
1908
+ emailOrPhoneLabel: "Электронная почта или номер телефона",
1909
+ emailOrPhonePlaceholder: "name@example.com или +1 555 000 0000",
1910
+ phoneLabel: "Номер телефона",
1911
+ phonePlaceholder: "+1 555 000 0000",
1912
+ otpCodeLabel: "Код подтверждения",
1913
+ otpCodePlaceholder: "6-значный код",
1914
+ sendOtpButton: "Получить код",
1915
+ resendOtpCountdownText: "Отправить снова через {seconds} с",
1916
+ usePhoneOtpText: "Войти по коду подтверждения",
1917
+ usePasswordSignInText: "Войти с паролем",
1780
1918
  },
1781
1919
  register: {
1782
1920
  title: "Создать аккаунт",
@@ -1792,7 +1930,7 @@ const ru = {
1792
1930
  passwordMismatchError: "Пароли не совпадают",
1793
1931
  passwordTooShortError: "Пароль должен содержать не менее 8 символов",
1794
1932
  submitButton: "Создать аккаунт",
1795
- submittingButton: "Создание аккаунта...",
1933
+ submittingButton: "Создание аккаунта…",
1796
1934
  hasAccountText: "Уже есть аккаунт?",
1797
1935
  signInText: "Войти",
1798
1936
  errors: {
@@ -1813,12 +1951,26 @@ const ru = {
1813
1951
  emailLabel: "Электронная почта",
1814
1952
  emailPlaceholder: "name@example.com",
1815
1953
  submitButton: "Отправить ссылку для сброса",
1816
- submittingButton: "Отправка...",
1954
+ submittingButton: "Отправка…",
1817
1955
  successTitle: "Проверьте почту",
1818
- successDescription: "Мы отправили ссылку для сброса пароля на {{email}}. Пожалуйста, проверьте свою почту.",
1956
+ successDescription: "Мы отправили ссылку для сброса пароля на {email}. Пожалуйста, проверьте свою почту.",
1819
1957
  backToSignInText: "Вернуться к входу",
1820
1958
  rememberPasswordText: "Помните свой пароль?",
1821
1959
  signInText: "Войти",
1960
+ // objectui#3546 slice three — the SMS reset branch of the same form.
1961
+ phoneLabel: "Номер телефона",
1962
+ phonePlaceholder: "+1 555 000 0000",
1963
+ otpCodeLabel: "Код подтверждения",
1964
+ otpCodePlaceholder: "6-значный код",
1965
+ sendOtpButton: "Получить код",
1966
+ resendOtpCountdownText: "Отправить снова через {seconds} с",
1967
+ newPasswordLabel: "Новый пароль",
1968
+ newPasswordPlaceholder: "Введите новый пароль",
1969
+ resetButton: "Сбросить пароль",
1970
+ usePhoneResetText: "Сбросить по SMS-коду",
1971
+ useEmailResetText: "Сбросить по электронной почте",
1972
+ phoneSuccessTitle: "Пароль сброшен",
1973
+ phoneSuccessDescription: "Ваш пароль сброшен. Теперь вы можете войти с новым паролем.",
1822
1974
  },
1823
1975
  resetPassword: {
1824
1976
  title: "Установить новый пароль",
@@ -1857,6 +2009,8 @@ const ru = {
1857
2009
  backToLogin: "Вернуться ко входу",
1858
2010
  checkSpam: "Не получили письмо? Проверьте папку \"Спам\" или обратитесь в поддержку.",
1859
2011
  or: "Или",
2012
+ // objectui#3546 slice three.
2013
+ resendUnavailable: "Возможно, отправка писем не настроена для этой среды. Если проблема повторяется, обратитесь в поддержку.",
1860
2014
  },
1861
2015
  setup: {
1862
2016
  welcomeTitle: "Добро пожаловать в ObjectStack",
@@ -1895,6 +2049,9 @@ const ru = {
1895
2049
  invalidDescription: "В URL не указан код устройства.",
1896
2050
  loading: "Загрузка…",
1897
2051
  cancel: "Отмена",
2052
+ // objectui#3546 slice three — device-authorization plugin switched off.
2053
+ disabledTitle: "Авторизация устройств не включена",
2054
+ disabledDescription: "В этой инсталляции авторизация устройств не включена, поэтому это устройство здесь одобрить нельзя.",
1898
2055
  },
1899
2056
  shell: {
1900
2057
  tenantHostHint: "Вы входите в это рабочее пространство",
@@ -1934,6 +2091,29 @@ const ru = {
1934
2091
  },
1935
2092
  },
1936
2093
  },
2094
+ // objectui#3546 slice three — the /oauth/consent screen.
2095
+ oauth: {
2096
+ consent: {
2097
+ title: "{{appName}} запрашивает доступ к вашему аккаунту",
2098
+ request: "{{appName}} запрашивает разрешение{{suffix}}.",
2099
+ unknownApp: "приложение",
2100
+ willAllow: "Это приложение сможет:",
2101
+ scope: {
2102
+ openid: "Подтверждать вашу личность",
2103
+ profile: "Читать основной профиль (имя, фото)",
2104
+ email: "Читать ваш адрес электронной почты",
2105
+ offlineAccess: "Оставаться в системе (обновление доступа)",
2106
+ },
2107
+ deny: "Отклонить",
2108
+ authorize: "Разрешить",
2109
+ submitting: "Авторизация…",
2110
+ granted: "Доступ предоставлен",
2111
+ denied: "Доступ запрещён",
2112
+ noRedirect: "Сервер не вернул URL для перенаправления.",
2113
+ failed: "Не удалось выдать согласие",
2114
+ footer: "Вы можете отозвать доступ в любое время в настройках аккаунта.",
2115
+ },
2116
+ },
1937
2117
  profile: {
1938
2118
  title: "Профиль",
1939
2119
  subtitle: "Управляйте настройками своей учётной записи",
@@ -1995,6 +2175,8 @@ const ru = {
1995
2175
  invite: "Пригласить участника",
1996
2176
  members: "Участники",
1997
2177
  settings: "Настройки рабочего пространства",
2178
+ multiOrgDisabled: "Создание новых организаций отключено в этой среде.",
2179
+ createFailed: 'Не удалось создать рабочее пространство',
1998
2180
  },
1999
2181
  help: {
2000
2182
  onThisPage: "На этой странице",
@@ -2005,7 +2187,7 @@ const ru = {
2005
2187
  },
2006
2188
  sidebar: {
2007
2189
  packageManagement: "Управление пакетами",
2008
- searchNavigation: "Поиск по навигации...",
2190
+ searchNavigation: "Поиск по навигации…",
2009
2191
  settings: "Настройки",
2010
2192
  help: "Помощь",
2011
2193
  helpTooltip: "Помощь и документация",
@@ -2029,8 +2211,8 @@ const ru = {
2029
2211
  switchObject: "Сменить объект",
2030
2212
  connection: {
2031
2213
  connected: "Подключено",
2032
- connecting: "Подключение...",
2033
- reconnecting: "Переподключение...",
2214
+ connecting: "Подключение…",
2215
+ reconnecting: "Переподключение…",
2034
2216
  disconnected: "Отключено",
2035
2217
  error: "Ошибка подключения",
2036
2218
  },
@@ -2046,10 +2228,12 @@ const ru = {
2046
2228
  build: {
2047
2229
  title: "Создать приложение",
2048
2230
  subtitle: "Начните с нуля — спроектируйте объекты, формы, автоматизации и интерфейсы.",
2231
+ noCapability: "Создание приложений недоступно в этом рабочем пространстве — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.",
2049
2232
  },
2050
2233
  template: {
2051
2234
  title: "Начать с шаблона",
2052
2235
  subtitle: "Установите шаблонное приложение из маркетплейса и настройте его под себя.",
2236
+ marketplaceDisabled: "Для этого рантайма не настроен маркетплейс приложений, поэтому здесь нет шаблонов для установки.",
2053
2237
  },
2054
2238
  welcomeAdminDescription: "Опишите свой бизнес одним предложением — ИИ создаст объекты, экраны, API и инструменты агента. Либо настройте всё сами через меню слева.",
2055
2239
  welcomeAdminDescriptionNoBuild: "Настройте первое приложение через меню «Администрирование» слева. Когда появятся данные, ИИ-ассистент поможет их изучить.",
@@ -2069,6 +2253,15 @@ const ru = {
2069
2253
  publishing: "Публикация…",
2070
2254
  published: "Опубликовано! Изменения вступили в силу.",
2071
2255
  publishFailed: "Не удалось опубликовать",
2256
+ // objectui#3546 slice six — seedWarn совпадает с console.ai.seedWarn по
2257
+ // английскому тексту, поэтому берём тот же перевод. В двух счётных
2258
+ // строках число вынесено в конец («…: {{count}}») — так пак пишет
2259
+ // количества, скобочные формы вида «файл(ов)» здесь не нужны.
2260
+ nothing: "Публиковать нечего.",
2261
+ probeWarn: "Опубликовано, но проверка выявила проблемы.",
2262
+ seedWarn: "Опубликовано, но часть примеров данных загрузить не удалось.",
2263
+ publishedVerified: "Опубликовано и проверено — активных строк примеров данных: {{count}}.",
2264
+ capabilityWarn: "Проверка при создании — несуществующих ссылок на возможности: {{count}}.",
2072
2265
  },
2073
2266
  title: "Главная",
2074
2267
  subtitle: "Панель вашего рабочего пространства",
@@ -2082,7 +2275,7 @@ const ru = {
2082
2275
  title: "Требует вашего внимания",
2083
2276
  empty: "Всё выполнено",
2084
2277
  },
2085
- loading: "Загрузка рабочего пространства...",
2278
+ loading: "Загрузка рабочего пространства…",
2086
2279
  recent: "Недавние",
2087
2280
  starred: "Избранные",
2088
2281
  welcome: "Добро пожаловать в ObjectUI",
@@ -2143,6 +2336,9 @@ const ru = {
2143
2336
  roles: "Роли",
2144
2337
  configuration: "Конфигурация",
2145
2338
  createApp: "Создать приложение",
2339
+ administration: "Администрирование",
2340
+ datasources: "Источники данных",
2341
+ documentation: "Документация",
2146
2342
  },
2147
2343
  appSwitcher: {
2148
2344
  switchApplication: "Сменить приложение",
@@ -2182,7 +2378,7 @@ const ru = {
2182
2378
  search: {
2183
2379
  title: "Поиск",
2184
2380
  back: "Назад",
2185
- placeholder: "Поиск объектов, панелей, страниц, отчётов...",
2381
+ placeholder: "Поиск объектов, панелей, страниц, отчётов…",
2186
2382
  inputAriaLabel: "Поиск объектов, панелей, страниц, отчётов",
2187
2383
  resultsCount: "{{count}} результат для \"{{query}}\"",
2188
2384
  resultsCountPlural: "{{count}} результатов для \"{{query}}\"",
@@ -2201,6 +2397,7 @@ const ru = {
2201
2397
  empty: {
2202
2398
  objectNotFound: "Объект не найден",
2203
2399
  objectNotFoundDescription: "Определение объекта \"{{name}}\" отсутствует. Проверьте конфигурацию или вернитесь назад.",
2400
+ interfacePageSourceMissing: "Эта интерфейсная страница ссылается на \"{{name}}\", который недоступен.",
2204
2401
  pageNotFound: "Страница не найдена",
2205
2402
  pageNotFoundDescription: "Страница \"{{name}}\" не найдена. Возможно, она была удалена или переименована.",
2206
2403
  dashboardNotFound: "Панель не найдена",
@@ -2209,27 +2406,17 @@ const ru = {
2209
2406
  reportNotFoundDescription: "Отчёт \"{{name}}\" не найден. Возможно, он был удалён или переименован.",
2210
2407
  noAppsConfigured: "Нет приложений",
2211
2408
  noAppsConfiguredDescription: "Нет зарегистрированных приложений. Создайте первое приложение или посетите системные настройки.",
2409
+ appNotAvailable: "Приложение недоступно",
2410
+ appNotAvailableDescription: "Это приложение пока недоступно — возможно, публикация ещё идёт. Повторите попытку через мгновение.",
2411
+ appAccessDenied: "У вас нет доступа к этому приложению",
2412
+ appAccessDeniedDescription: "Это приложение существует, но у вашей учётной записи нет прав на его открытие. Обратитесь к администратору за доступом.",
2413
+ appAccessDeniedHome: "На главную",
2212
2414
  createFirstApp: "Создать приложение",
2213
2415
  systemSettings: "Системные настройки",
2214
2416
  back: "Назад",
2215
2417
  recordNotFound: "Запись не найдена",
2216
2418
  recordNotFoundDescription: "Искомая запись не существует или была удалена.",
2217
2419
  },
2218
- renderer: {
2219
- noPageSchema: "Схема страницы не указана",
2220
- noFormSchema: "Схема формы не указана",
2221
- noDashboardSchema: "Схема панели не указана",
2222
- pageRendering: "Рендеринг страницы: {{name}}",
2223
- dashboardRendering: "Рендеринг панели: {{name}}",
2224
- formRenderingMode: "Форма в режиме {{mode}}",
2225
- formRenderingFor: "для записи {{id}}",
2226
- createRecord: "Создать запись",
2227
- editRecord: "Редактировать запись",
2228
- page: "Страница",
2229
- dashboard: "Панель",
2230
- save: "Сохранить",
2231
- cancel: "Отмена",
2232
- },
2233
2420
  actionDialog: {
2234
2421
  title: "Параметры действия",
2235
2422
  description: "Введите необходимую информацию для продолжения.",
@@ -2280,7 +2467,7 @@ const ru = {
2280
2467
  deleteFailed: "Не удалось удалить представление",
2281
2468
  },
2282
2469
  dashboardActions: {
2283
- pdfPreparing: "Подготовка экспорта PDF…",
2470
+ printDialogOpening: "Открывается диалог печати браузера (это не экспорт в PDF)",
2284
2471
  exportFailed: "Ошибка экспорта: {{message}}",
2285
2472
  forecastSoon: "Прогнозное представление скоро будет",
2286
2473
  },
@@ -2324,126 +2511,159 @@ const ru = {
2324
2511
  first: "Первый",
2325
2512
  },
2326
2513
  editor: {
2327
- breadcrumb: "Конфигурация",
2328
- basic: "Основное",
2329
- title: "Заголовок",
2330
- titlePlaceholder: "напр., Воронка по кварталам",
2331
- description: "Описание",
2332
- descriptionPlaceholder: "Что показывает этот отчёт?",
2333
- type: "Тип отчёта",
2334
- typeTabular: "Табличный — плоский список",
2335
- typeSummary: "Сводный — группировка с итогами",
2336
- typeMatrix: "Матричный — сводка строки × столбцы",
2337
- typeJoined: "Объединённый — несколько блоков",
2338
- typeHelp: "Выберите макет, который соответствует тому, что хотите увидеть.",
2339
- data: "Данные",
2340
- objectName: "Источник данных",
2341
- objectNamePlaceholder: "напр., opportunity",
2342
- objectNameHelp: "К какому объекту обращается этот отчёт?",
2343
- limit: "Лимит строк",
2344
- limitPlaceholder: "напр., 100",
2345
- columns: "Столбцы",
2346
- columnsHint: "Выберите поля для столбцов. В сводных и матричных отчётах добавляйте агрегаты (Сумма, Количество…).",
2347
- filters: "Фильтры",
2348
- filtersHint: "Ограничьте строки, попадающие в отчёт.",
2349
- filtersComplex: "В отчёте используется расширенный фильтр, который нельзя редактировать здесь. При сохранении он останется без изменений.",
2350
- groupBy: "Группировать по",
2351
- groupByHint: "Сгруппируйте данные и посчитайте промежуточные итоги.",
2352
- rows: "Строки",
2353
- rowsHint: "Сгруппировать строки по этим полям.",
2354
- columnsAxis: "Столбцы",
2355
- columnsAxisHint: "Развернуть эти поля по горизонтали.",
2356
- values: "Значения",
2357
- valuesHint: "Числа в каждой ячейке. Выберите одно или несколько полей и задайте агрегат (Сумма, Количество…).",
2358
- grouping: "Группировка",
2359
- addGrouping: "Добавить группировку",
2360
- dateGranularity: "Гранулярность даты",
2361
- dateGranularityNone: "(исходное значение)",
2362
- day: "День",
2363
- week: "Неделя",
2364
- month: "Месяц",
2365
- quarter: "Квартал",
2366
- year: "Год",
2367
- sortAsc: "По возрастанию",
2368
- sortDesc: "По убыванию",
2369
- chart: "График",
2370
- chartHint: "Дополнительная визуализация рядом с таблицей.",
2371
- chartType: "Тип графика",
2372
- chartTitle: "Заголовок графика",
2373
- chartTitlePlaceholder: "По умолчанию — заголовок отчёта",
2374
- chartXAxis: "Ось X (категория)",
2375
- chartYAxis: "Ось Y (значение)",
2376
- chartShowLegend: "Показывать легенду",
2377
- chartShowDataLabels: "Показывать подписи данных",
2378
- chartNone: "(без графика)",
2379
- chartBar: "Столбчатый",
2380
- chartLine: "Линейный",
2381
- chartArea: "Областной",
2382
- chartPie: "Круговой",
2383
- chartDonut: "Кольцевой",
2384
- chartFunnel: "Воронка",
2385
- validationNeedsObject: "Выберите источник данных перед добавлением столбцов.",
2386
- validationMatrixNeedsRowsCols: "Для матричного отчёта нужны хотя бы одна строка и один столбец.",
2387
- validationSummaryNeedsRows: "Для сводного отчёта нужно хотя бы одно поле группировки.",
2388
- blocks: "Блоки",
2389
- blocksHint: "Каждый блок — отдельная таблица или график. Фильтры блока объединяются с фильтром отчёта по И.",
2390
- addBlock: "Добавить блок",
2391
- removeBlock: "Удалить блок",
2392
- blockName: "Имя блока",
2393
- blockNamePlaceholder: "уникальное_имя_блока",
2394
- blockLabel: "Отображаемое название",
2395
- blockLabelPlaceholder: "Показывается над блоком",
2396
- blockDescription: "Описание",
2397
- blockDescriptionPlaceholder: "Необязательный контекст для блока",
2398
- validationJoinedNeedsBlocks: "Объединённый отчёт должен содержать хотя бы один блок.",
2399
- validationBlockNameRequired: "У каждого блока должно быть непустое имя.",
2400
- validationBlockNameDuplicate: "Имена блоков в отчёте должны быть уникальными.",
2401
- validationBlockNeedsColumns: "В каждом блоке должна быть хотя бы одна колонка.",
2402
- noneOption: "(нет)",
2403
- addCondition: "Добавить условие",
2404
- combineLogic: "Объединить с",
2405
- opContains: "содержит",
2406
- opIsEmpty: "пусто",
2407
- opIsNotEmpty: "не пусто",
2408
- formatAuto: "Авто",
2409
- formatCurrency: "Валюта",
2410
- formatPercent: "Процент",
2411
- formatInteger: "Целое число",
2412
- formatDate: "Дата",
2413
- formatDatetime: "Дата и время",
2414
- columnLabelPlaceholder: "Переопределить подпись",
2415
- aggregateColumn: "Агрегат",
2416
- formatColumn: "Формат",
2417
- addColumns: "Добавить столбцы",
2418
- searchFields: "Поиск полей…",
2419
- noMatchingFields: "Нет полей, соответствующих запросу.",
2420
- noFieldsAvailable: "Полей нет.",
2421
- columnsCount: "{n} столбец(ов) выбрано",
2422
- columnsEmpty: "Столбцы ещё не выбраны.",
2423
- fieldPickerTitle: "Выбрать поля",
2424
- fieldPickerDescription: "Выберите одно или несколько полей для добавления. Используйте поиск для фильтрации.",
2425
- fieldPickerChangeTitle: "Изменить поле",
2426
- fieldPickerAddGroupingTitle: "Добавить группировку",
2427
- fieldPickerEmpty: "(Выбрать поле)",
2428
- fieldPickerSelected: "{n} выбрано",
2429
- fieldPickerClear: "Сбросить выбор",
2430
- fieldPickerAdd: "Добавить",
2431
- fieldPickerAddN: "Добавить {n}",
2514
+ panelTitle: "Редактировать отчёт",
2432
2515
  },
2433
2516
  },
2434
2517
  organizations: {
2435
2518
  create: "Создать рабочее пространство",
2436
- mine: "Мои организации",
2437
- title: "Организации",
2438
- heading: "Ваши организации",
2439
- subtitle: "Выберите организацию, чтобы продолжить, или создайте новую.",
2440
- searchPlaceholder: "Поиск организации",
2441
- new: "Новая организация",
2442
- current: "Текущая организация",
2519
+ mine: "Мои рабочие пространства",
2520
+ title: "Рабочие пространства",
2521
+ heading: "Ваши рабочие пространства",
2522
+ subtitle: "Выберите рабочее пространство, чтобы продолжить, или создайте новое.",
2523
+ searchPlaceholder: "Поиск рабочего пространства",
2524
+ new: "Новое рабочее пространство",
2525
+ current: "Текущее рабочее пространство",
2443
2526
  manage: "Управление",
2444
- emptyTitle: "Пока нет организаций",
2445
- emptyDescription: "Создайте свою первую организацию, чтобы начать.",
2446
- noMatches: "Нет организаций, соответствующих запросу.",
2527
+ emptyTitle: "Пока нет рабочих пространств",
2528
+ emptyDescription: "Создайте своё первое рабочее пространство, чтобы начать.",
2529
+ noMatches: "Нет рабочих пространств, соответствующих запросу.",
2530
+ },
2531
+ organization: {
2532
+ roles: {
2533
+ owner: 'Владелец',
2534
+ admin: 'Администратор',
2535
+ delegatedAdmin: 'Делегированный администратор',
2536
+ member: 'Участник',
2537
+ },
2538
+ errors: {
2539
+ notAllowedToInvite: 'У вас нет прав приглашать пользователей в эту организацию.',
2540
+ notAllowedToInviteWithRole: 'У вас нет прав приглашать пользователя с этой ролью.',
2541
+ alreadyInvited: 'Этот пользователь уже приглашён в эту организацию.',
2542
+ organizationExists: 'Такая организация уже существует.',
2543
+ slugTaken: 'Этот идентификатор уже занят.',
2544
+ notAllowedToCreate: 'У вас нет прав создавать новую организацию.',
2545
+ notTheRecipient: 'Вы не являетесь получателем этого приглашения.',
2546
+ invitationNotFound: 'Это приглашение больше не существует или истекло.',
2547
+ unknown: 'Что-то пошло не так. Попробуйте ещё раз.',
2548
+ },
2549
+ backToList: "Назад к организациям",
2550
+ notFound: "Организация не найдена",
2551
+ notFoundDescription: "Эта организация не существует или у вас нет к ней доступа.",
2552
+ tabs: {
2553
+ members: "Участники",
2554
+ invitations: "Приглашения",
2555
+ settings: "Настройки",
2556
+ },
2557
+ members: {
2558
+ title: "Участники",
2559
+ inviteMember: "Пригласить участника",
2560
+ inviteRestrictedNote: "Только администраторы организации могут приглашать участников.",
2561
+ removeMember: "Удалить участника",
2562
+ removeConfirmTitle: "Удалить участника?",
2563
+ removeConfirmDescription: "{{name}} будет удалён из организации и сразу потеряет доступ.",
2564
+ removeConfirmAction: "Удалить",
2565
+ memberRemoved: "Участник удалён",
2566
+ removeFailed: "Не удалось удалить участника",
2567
+ roleUpdated: "Роль обновлена",
2568
+ roleUpdateFailed: "Не удалось обновить роль",
2569
+ memberActions: 'Действия с участником',
2570
+ loadFailed: 'Не удалось загрузить участников',
2571
+ },
2572
+ invitations: {
2573
+ title: "Приглашения",
2574
+ empty: "Приглашений нет.",
2575
+ expiresAt: "Истекает",
2576
+ linkCopied: "Ссылка на приглашение скопирована",
2577
+ copyFailed: "Не удалось скопировать ссылку",
2578
+ canceled: "Приглашение отменено",
2579
+ cancelFailed: "Не удалось отменить приглашение",
2580
+ cancelTitle: "Отменить приглашение?",
2581
+ cancelDescription: "Приглашение для {{email}} будет отозвано.",
2582
+ cancelAction: "Отменить приглашение",
2583
+ inviteTitle: "Пригласить участника",
2584
+ inviteDescription: "Человек получит приглашение вступить в эту организацию.",
2585
+ emailLabel: "Электронная почта",
2586
+ roleLabel: "Роль",
2587
+ placementLabel: "Назначение (необязательно)",
2588
+ placementDescription: "Применяется при принятии приглашения. Показаны только подразделения и должности, которые вы можете делегировать.",
2589
+ businessUnitLabel: "Бизнес-подразделение",
2590
+ businessUnitPlaceholder: "Без назначения",
2591
+ positionsLabel: "Должности",
2592
+ sendInvite: "Отправить приглашение",
2593
+ sentTitle: "Приглашение создано",
2594
+ sentDescription: "Отправьте ссылку ниже приглашённому. Чтобы принять приглашение, ему нужно войти в систему.",
2595
+ linkLabel: "Ссылка для принятия",
2596
+ invitedAs: "{{email}} приглашён как {{role}}",
2597
+ copyLinkLabel: 'Скопировать ссылку-приглашение',
2598
+ loadFailed: 'Не удалось загрузить приглашения',
2599
+ inviteFailed: 'Не удалось пригласить участника',
2600
+ status: {
2601
+ all: "Все",
2602
+ pending: "Ожидает",
2603
+ accepted: "Принято",
2604
+ rejected: "Отклонено",
2605
+ canceled: "Отменено",
2606
+ },
2607
+ },
2608
+ settings: {
2609
+ generalTitle: "Общие",
2610
+ generalDescription: "Обновите сведения об организации.",
2611
+ readOnlyNote: "Изменять настройки могут только владельцы.",
2612
+ nameLabel: "Название организации",
2613
+ slugLabel: "Слаг",
2614
+ logoLabel: "Логотип",
2615
+ logoUpload: "Загрузить",
2616
+ logoReplace: "Заменить",
2617
+ logoClear: "Удалить",
2618
+ logoUploaded: "Логотип загружен — сохраните, чтобы применить",
2619
+ logoUploadFailed: "Не удалось загрузить логотип",
2620
+ save: "Сохранить изменения",
2621
+ saved: "Настройки сохранены",
2622
+ saveFailed: "Не удалось сохранить настройки",
2623
+ leaveTitle: "Покинуть организацию",
2624
+ leaveDescription: "Вы потеряете доступ к этой организации.",
2625
+ leaveAction: "Покинуть",
2626
+ leaveConfirmTitle: "Покинуть организацию?",
2627
+ leaveConfirmDescription: "Вы уверены, что хотите покинуть {{name}}? Доступ будет потерян немедленно.",
2628
+ leaveConfirmAction: "Покинуть",
2629
+ leftOrg: "Вы покинули организацию",
2630
+ leaveFailed: "Не удалось покинуть организацию",
2631
+ dangerZone: "Опасная зона",
2632
+ deleteTitle: "Удалить организацию",
2633
+ deleteDescription: "Безвозвратно удалить эту организацию и все её данные.",
2634
+ deleteAction: "Удалить",
2635
+ deleteConfirmTitle: "Удалить организацию?",
2636
+ deleteConfirmDescription: "Это действие необратимо. Все данные будут удалены безвозвратно. Введите слаг организации для подтверждения.",
2637
+ deleteConfirmSlugLabel: "Введите «{{slug}}» для подтверждения",
2638
+ deleteConfirmAction: "Удалить организацию",
2639
+ deleted: "Организация удалена",
2640
+ deleteFailed: "Не удалось удалить организацию",
2641
+ },
2642
+ accept: {
2643
+ title: "Вас пригласили",
2644
+ description: "Вас пригласили присоединиться к {{orgName}} в роли {{role}}.",
2645
+ errorTitle: "Приглашение недоступно",
2646
+ goToOrgs: "Перейти к организациям",
2647
+ loading: "Загрузка приглашения…",
2648
+ organization: "Организация",
2649
+ role: "Роль",
2650
+ expiresAt: "Истекает",
2651
+ accept: "Принять приглашение",
2652
+ accepted: "Приглашение принято",
2653
+ acceptFailed: "Не удалось принять приглашение",
2654
+ decline: "Отклонить",
2655
+ declined: "Приглашение отклонено",
2656
+ declineFailed: "Не удалось отклонить приглашение",
2657
+ },
2658
+ current: {
2659
+ label: "Текущая организация",
2660
+ },
2661
+ switcher: {
2662
+ label: "Переключить организацию",
2663
+ groupLabel: "Рабочая организация",
2664
+ groupHint: "Новые записи создаются здесь. В представлениях отображаются данные из всех ваших организаций.",
2665
+ manageMembers: "Управление участниками",
2666
+ },
2447
2667
  },
2448
2668
  notifications: {
2449
2669
  regionLabel: "Уведомления",
@@ -2458,6 +2678,9 @@ const ru = {
2458
2678
  viewApprovals: "Показать утверждения",
2459
2679
  noPendingApprovals: "Нет ожидающих утверждений",
2460
2680
  openApprovalsInbox: "Открыть входящие утверждений",
2681
+ badgeTotal: "Всего: {{total}}",
2682
+ badgeNotifications: "{{unread}} уведомлений",
2683
+ badgeApprovals: "{{approvals}} ожидающих утверждений",
2461
2684
  emptyUnread: "Всё прочитано",
2462
2685
  filterUnread: "Непрочитанные",
2463
2686
  filterAll: "Все",
@@ -2482,52 +2705,6 @@ const ru = {
2482
2705
  consentRequired: "Пожалуйста, примите политику конфиденциальности.",
2483
2706
  rateLimited: "Проверьте ответы перед отправкой.",
2484
2707
  redirectBlocked: "Ответ принят, но URL перенаправления заблокирован по соображениям безопасности.",
2485
- demo: {
2486
- contactTitle: "Связаться с нами",
2487
- contactDescription: "Расскажите о вашем проекте, и наш менеджер свяжется с вами в течение рабочего дня.",
2488
- supportTitle: "Отправить запрос в поддержку",
2489
- supportDescription: "Опишите проблему — наша команда ответит в течение рабочего дня.",
2490
- thankYouSalesTitle: "Спасибо — мы получили ваше сообщение!",
2491
- thankYouSalesMessage: "Наш менеджер свяжется с вами в течение рабочего дня.",
2492
- thankYouSupportTitle: "Готово — ваш запрос в очереди.",
2493
- thankYouSupportMessage: "Инженер поддержки скоро свяжется с вами. Сохраните эту страницу, если у вас есть скриншоты.",
2494
- field: {
2495
- firstName: "Имя",
2496
- lastName: "Фамилия",
2497
- email: "Рабочий email",
2498
- phone: "Телефон",
2499
- jobTitle: "Должность",
2500
- company: "Компания",
2501
- website: "Сайт",
2502
- industry: "Отрасль",
2503
- companySize: "Размер компании",
2504
- howCanWeHelp: "Как мы можем помочь?",
2505
- subject: "Тема",
2506
- description: "Описание",
2507
- issueType: "Тип проблемы",
2508
- priority: "Приоритет",
2509
- },
2510
- industry: {
2511
- technology: "Технологии",
2512
- software: "Программное обеспечение / SaaS",
2513
- finance: "Финансы",
2514
- healthcare: "Здравоохранение",
2515
- retail: "Розница",
2516
- other: "Другое",
2517
- },
2518
- issueType: {
2519
- question: "Вопрос",
2520
- problem: "Проблема",
2521
- bug: "Ошибка",
2522
- feature_request: "Пожелание",
2523
- },
2524
- priority: {
2525
- low: "Низкий",
2526
- medium: "Средний",
2527
- high: "Высокий",
2528
- critical: "Критический",
2529
- },
2530
- },
2531
2708
  },
2532
2709
  connectAgent: {
2533
2710
  disabled: {
@@ -2640,6 +2817,7 @@ const ru = {
2640
2817
  retry: "Повторить",
2641
2818
  errors: {
2642
2819
  expired: "Срок действия запроса истёк до подтверждения. Начните заново.",
2820
+ accessDenied: "Запрос на подключение отклонён. Начните заново.",
2643
2821
  bindFailed: "Не удалось выполнить привязку.",
2644
2822
  deviceCodeFailed: "Не удалось запросить код устройства.",
2645
2823
  },
@@ -2705,10 +2883,16 @@ const ru = {
2705
2883
  installedBadge: "Установлено v{{version}}",
2706
2884
  load: {
2707
2885
  failed: "Не удалось загрузить маркетплейс",
2708
- failedHint: "По умолчанию этот рантайм указывает на публичное облако ObjectStack. Убедитесь, что рантайм онлайн.",
2886
+ failedHintConfigured: "Этот рантайм обращается к маркетплейсу через control plane по адресу {{url}}. Убедитесь, что он доступен и достижим отсюда.",
2887
+ failedHintSameOrigin: "Этот рантайм сам обслуживает каталог маркетплейса. Убедитесь, что рантайм онлайн.",
2709
2888
  packageFailed: "Не удалось загрузить пакет",
2710
2889
  notFound: "Не найдено.",
2711
2890
  },
2891
+ disabled: {
2892
+ title: "Маркетплейс приложений отключён",
2893
+ description: "Для этого рантайма не настроен маркетплейс, поэтому здесь нечего просматривать или устанавливать.",
2894
+ hint: "Это ожидаемое состояние, когда рантайм запущен с <code>OS_CLOUD_URL=off</code> (или <code>none</code>, <code>local</code>, <code>disabled</code>). Чтобы включить маркетплейс, укажите в <code>OS_CLOUD_URL</code> адрес control plane и перезапустите рантайм.",
2895
+ },
2712
2896
  detail: {
2713
2897
  homepage: "Сайт",
2714
2898
  installedV: "Установлено · v{{version}}",
@@ -2744,6 +2928,7 @@ const ru = {
2744
2928
  dismiss: "Закрыть",
2745
2929
  openOnCloud: "Открыть в облаке",
2746
2930
  backHome: "На главную",
2931
+ updateTo: "Обновить",
2747
2932
  },
2748
2933
  install: {
2749
2934
  dialogTitle: "Установить {{name}}",
@@ -2760,6 +2945,37 @@ const ru = {
2760
2945
  localManifestConflict: "{{message}}\nПримечание: Локальное приложение уже имеет этот manifest_id. Сначала удалите его из objectstack.config.ts.",
2761
2946
  localUnauthorized: "Сначала войдите в этот рантайм.",
2762
2947
  localMarketplaceUnavailable: "OS_CLOUD_URL не настроен.",
2948
+ updateTo: "Обновить → v{{version}}",
2949
+ installedVersion: "Установлено v{{version}}",
2950
+ },
2951
+ // objectui#3546 — the MarketplacePage "Your organization" strip.
2952
+ org: {
2953
+ heading: "Ваша организация",
2954
+ install: "Установить",
2955
+ installed: "Установлено {{name}}",
2956
+ installedBadge: "Установлено",
2957
+ installing: "Установка…",
2958
+ },
2959
+ // ADR-0025 PD4 §3.5/§3.11 — the pre-install consent panel
2960
+ // (PluginDisclosure.tsx). `runtime` is a CLOSED enum: spec
2961
+ // PluginRuntimeSchema = z.enum(['node', 'sandbox', 'worker']).
2962
+ disclosure: {
2963
+ containsCode: "Этот пакет содержит код",
2964
+ reviewed: "Проверено и одобрено",
2965
+ unreviewed: "Ещё не проверено",
2966
+ signed: "Подписано",
2967
+ grantsIntro: "При установке пакет получит:",
2968
+ services: "Сервисы платформы",
2969
+ hooks: "Хуки жизненного цикла",
2970
+ network: "Доступ к сети",
2971
+ fs: "Доступ к файловой системе",
2972
+ noPermissions: "Не запрашивает особых разрешений.",
2973
+ acknowledge: "Я понимаю, что этот пакет выполняет код и получает указанные выше разрешения.",
2974
+ runtime: {
2975
+ node: "В процессе · полное доверие",
2976
+ sandbox: "В песочнице",
2977
+ worker: "Вне процесса",
2978
+ },
2763
2979
  },
2764
2980
  uninstall: {
2765
2981
  confirm: "Удалить {{manifestId}} v{{version}}?\n\nКэшированный манифест будет удалён.",
@@ -2916,12 +3132,19 @@ const ru = {
2916
3132
  submittedAgo: 'Отправлен {{when}}',
2917
3133
  completedAt: 'Завершён {{when}}',
2918
3134
  waitingOn: 'Ожидает решения',
3135
+ approverNameSeparator: ', ',
3136
+ approverUnstaffed: '{{seat}} (сейчас не занята)',
2919
3137
  history: 'История',
2920
3138
  noActions: 'Действий пока нет.',
2921
3139
  actSubmit: 'Отправлен',
2922
3140
  actApprove: 'Согласован',
2923
3141
  actReject: 'Отклонён',
2924
3142
  actRecall: 'Отозван',
3143
+ overrideActionLabel: '{{action}} (по праву администратора)',
3144
+ overrideNotice: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а все согласующие, ещё не принявшие решение, будут пропущены. Решение будет записано как административное переопределение.',
3145
+ overrideNoticeWho: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а согласующие, ещё не принявшие решение, будут пропущены — {{who}}. Решение будет записано как административное переопределение.',
3146
+ viaOverrideChip: 'Переопределение администратора',
3147
+ viaOverrideHint: 'У исполнителя не было места согласующего на этом шаге — допущен по пути административного переопределения.',
2925
3148
  rawData: 'Исходные данные (JSON)',
2926
3149
  copy: 'Копировать',
2927
3150
  copied: 'Скопировано',
@@ -3008,6 +3231,39 @@ const ru = {
3008
3231
  detailChangedKeys: 'Также изменено:',
3009
3232
  confirmNote: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
3010
3233
  publishConfirm: 'Опубликовать всё',
3234
+ // [objectui#5418] Pre-publish security-posture findings, shown next to
3235
+ // the confirm button so a refusal the door would issue is read BEFORE
3236
+ // the click rather than as a toast after the batch rolled back.
3237
+ securityBlockTitle: 'Публикация будет отклонена — {{count}} элемент(ов) требуют решения',
3238
+ securityBlockWhere: 'Исправьте это в объекте в разделе «Настройки → Общий доступ к записям» и опубликуйте снова.',
3239
+ },
3240
+ // ADR-0045 — the materialized-but-unlisted app banner
3241
+ // (UnpublishedAppBar.tsx), sibling of draftBar above.
3242
+ unpublishedBar: {
3243
+ message: 'Неопубликованное приложение — полностью работает, но видно только создателям. Опубликуйте, чтобы его увидели ваши пользователи.',
3244
+ publish: 'Опубликовать',
3245
+ publishing: 'Публикация…',
3246
+ published: 'Опубликовано! Приложение теперь видно вашим пользователям.',
3247
+ publishFailed: 'Не удалось опубликовать',
3248
+ },
3249
+ // ADR-0067 — the append-only build/revert timeline (CommitTimeline.tsx);
3250
+ // `button` is the banner's entry point into it.
3251
+ history: {
3252
+ button: 'История',
3253
+ title: 'История сборок',
3254
+ description: 'Все изменения этого приложения, новые сверху. Любой шаг можно отменить — подтверждать публикацию не нужно.',
3255
+ loadFailed: 'Не удалось загрузить историю:',
3256
+ loadFailedUnavailable: 'Хранилище коммитов временно недоступно — это чтение не выполнено, поэтому история не показана. Повторите попытку через мгновение.',
3257
+ loading: 'Загрузка истории…',
3258
+ empty: 'Истории для этого приложения пока нет.',
3259
+ revertLabel: 'Изменение отменено',
3260
+ applyLabel: 'Изменение сборки',
3261
+ revert: 'отмена',
3262
+ items: 'элементов',
3263
+ revertAction: 'Отменить',
3264
+ reverted: 'Отменено — изменение возвращено.',
3265
+ revertFailed: 'Не удалось отменить',
3266
+ revertUnavailable: 'Хранилище коммитов временно недоступно — отмена могла не примениться. Откройте историю заново и проверьте, прежде чем повторять.',
3011
3267
  },
3012
3268
  },
3013
3269
  filterBuilder: {
@@ -3026,10 +3282,15 @@ const ru = {
3026
3282
  noResults: "Нет результатов",
3027
3283
  searchField: "Поиск {{label}}…",
3028
3284
  enterId: "Введите ID {{label}}",
3285
+ addValue: "Введите значение и нажмите Enter",
3286
+ removeValue: "Удалить {{value}}",
3287
+ rangeStart: "От",
3288
+ rangeEnd: "До",
3029
3289
  operators: {
3030
3290
  equals: "Равно",
3031
3291
  notEquals: "Не равно",
3032
3292
  contains: "Содержит",
3293
+ containsCaseInsensitive: "Содержит (без учёта регистра)",
3033
3294
  notContains: "Не содержит",
3034
3295
  isEmpty: "Пусто",
3035
3296
  isNotEmpty: "Не пусто",
@@ -3042,6 +3303,12 @@ const ru = {
3042
3303
  between: "Между",
3043
3304
  in: "В списке",
3044
3305
  notIn: "Не в списке",
3306
+ startsWith: "Начинается с",
3307
+ endsWith: "Заканчивается на",
3308
+ isNull: "Равно null",
3309
+ isNotNull: "Не равно null",
3310
+ exists: "Задано",
3311
+ notExists: "Не задано",
3045
3312
  },
3046
3313
  },
3047
3314
  sortBuilder: {
@@ -3087,5 +3354,64 @@ const ru = {
3087
3354
  statusIdle: "бездействует",
3088
3355
  statusAway: "отошёл",
3089
3356
  },
3357
+ wizard: {
3358
+ missingRequired: "Заполните обязательные поля: {{fields}}",
3359
+ },
3360
+ flowRunner: {
3361
+ title: 'Ввод',
3362
+ submitting: 'Отправка…',
3363
+ saveAndContinue: 'Сохранить и продолжить',
3364
+ nextStep: 'Сохранено — следующий шаг',
3365
+ completed: 'Поток «{{flow}}» завершён',
3366
+ },
3367
+ appManagement: {
3368
+ title: "Приложения",
3369
+ subtitle: "Управление всеми настроенными приложениями",
3370
+ newApp: "Новое приложение",
3371
+ searchLabel: "Поиск приложений",
3372
+ searchPlaceholder: "Поиск приложений…",
3373
+ selectedCount: "Выбрано: {{n}}",
3374
+ bulkEnable: "Включить",
3375
+ bulkDisable: "Отключить",
3376
+ selectAll: "Выбрать все ({{n}})",
3377
+ empty: "Приложения не найдены.",
3378
+ defaultBadge: "По умолчанию",
3379
+ active: "Активно",
3380
+ inactive: "Неактивно",
3381
+ selectApp: "Выбрать {{name}}",
3382
+ openApp: "Открыть приложение",
3383
+ openAppNamed: "Открыть {{name}}",
3384
+ editApp: "Редактировать приложение",
3385
+ editAppNamed: "Редактировать {{name}}",
3386
+ editWithAi: "Редактировать с ИИ",
3387
+ editWithAiNamed: "Редактировать {{name}} с ИИ",
3388
+ enableApp: "Включить приложение",
3389
+ disableApp: "Отключить приложение",
3390
+ enableAppNamed: "Включить {{name}}",
3391
+ disableAppNamed: "Отключить {{name}}",
3392
+ setDefault: "Установить по умолчанию",
3393
+ setDefaultNamed: "Установить {{name}} по умолчанию",
3394
+ deleteApp: "Удалить приложение",
3395
+ deleteAppNamed: "Удалить {{name}}",
3396
+ confirmDelete: "Нажмите ещё раз для подтверждения удаления",
3397
+ confirmDeleteNamed: "Подтвердить удаление {{name}}",
3398
+ toast: {
3399
+ noClient: "Не удаётся подключиться к службе метаданных",
3400
+ unknownError: "неизвестная ошибка",
3401
+ appEnabled: "{{name}} включено",
3402
+ appDisabled: "{{name}} отключено",
3403
+ toggleFailed: "Не удалось изменить состояние приложения: {{reason}}",
3404
+ setDefaultDone: "{{name}} установлено по умолчанию",
3405
+ setDefaultFailed: "Не удалось установить приложение по умолчанию: {{reason}}",
3406
+ appDeleted: "{{name}} удалено",
3407
+ deleteFailed: "Не удалось удалить приложение: {{reason}}",
3408
+ bulkEnabled: "Включено приложений: {{n}}",
3409
+ bulkDisabled: "Отключено приложений: {{n}}",
3410
+ bulkFailed: "Не удалось для {{n}}: {{details}}",
3411
+ bulkFailureEntry: "{{name}} ({{reason}})",
3412
+ bulkFailureJoiner: "; ",
3413
+ bulkOperationFailed: "Массовая операция не выполнена: {{reason}}",
3414
+ },
3415
+ },
3090
3416
  };
3091
3417
  export default ru;