@object-ui/i18n 16.0.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,9 +83,14 @@ const ru = {
74
83
  package: "Пакет",
75
84
  },
76
85
  actions: {
86
+ decisionOutput: {
87
+ help: 'Передаётся в поток как результат решения.',
88
+ helpMultiValue: 'Передаётся в поток как результат решения. Несколько значений разделяйте запятыми.',
89
+ },
77
90
  resultDialog: {
78
- defaultTitle: 'Save this value now',
79
- acknowledge: 'I have saved this',
91
+ defaultTitle: 'Сохраните это значение сейчас',
92
+ acknowledge: 'Я сохранил(а) это',
93
+ copyAll: 'Копировать всё',
80
94
  },
81
95
  },
82
96
  validation: {
@@ -93,6 +107,16 @@ const ru = {
93
107
  type: "{{field}} должно быть допустимым {{type}}",
94
108
  },
95
109
  form: {
110
+ noPermissionToSave: "У вас нет прав на сохранение этой записи.",
111
+ submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
112
+ discardTitle: "Отменить изменения?",
113
+ discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
114
+ keepEditing: "Продолжить редактирование",
115
+ discard: "Отменить",
116
+ conflictTitle: "Конфликт сохранения",
117
+ conflictMessage: "Пока вы редактировали, эту запись изменил другой пользователь. Перезапись заменит его изменения вашими.",
118
+ conflictLatestVersion: "Его сохранение: {{time}}",
119
+ conflictOverwrite: "Перезаписать",
96
120
  addItem: "Добавить элемент",
97
121
  removeItem: "Удалить элемент",
98
122
  fieldRequired: "Это поле обязательно",
@@ -103,8 +127,6 @@ const ru = {
103
127
  stepOf: "Шаг {{current}} из {{total}}",
104
128
  createTitle: "Создать {{object}}",
105
129
  editTitle: "Редактировать {{object}}",
106
- createDescription: "Добавить новый {{object}} в базу данных.",
107
- editDescription: "Обновить данные {{object}}",
108
130
  saveRecord: "Сохранить запись",
109
131
  create: "Создать",
110
132
  update: "Обновить",
@@ -113,14 +135,70 @@ const ru = {
113
135
  deleteSuccess: "{{object}} удалён",
114
136
  },
115
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
+ },
116
151
  relativeDate: {
117
152
  overdue: "Просрочено на {{count}} дн.",
118
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
+ },
119
170
  richText: {
120
171
  format: "Формат: {{format}}",
121
172
  basicEditorHint: "Редактор форматированного текста (базовый)",
122
173
  placeholder: "Введите текст...",
123
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
+ },
124
202
  },
125
203
  table: {
126
204
  rowsPerPage: "Строк на странице",
@@ -155,6 +233,37 @@ const ru = {
155
233
  delete: "Удалить",
156
234
  },
157
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
+ },
158
267
  actions: "Действия",
159
268
  edit: "Редактировать",
160
269
  delete: "Удалить",
@@ -180,7 +289,88 @@ const ru = {
180
289
  densityCycleShortHint: "Нажмите для изменения",
181
290
  },
182
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: "Импортировано через режим совместимости: это подключение не поддерживает серверный маршрут импорта, поэтому значения сохранены как текст без приведения типов на сервере. Обновите бэкенд/клиент для полноценного импорта (приведение типов и поиск связей).",
183
372
  title: "Импорт {{object}}",
373
+ notAllowed: "Этот объект не открыт для импорта.",
184
374
  stepUpload: "Загрузка",
185
375
  stepMapping: "Сопоставление",
186
376
  stepPreview: "Предпросмотр",
@@ -256,6 +446,42 @@ const ru = {
256
446
  moreEvents: "+{{count}} ещё",
257
447
  },
258
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: "Обновить",
259
485
  loading: 'Loading records...',
260
486
  recordCount: "{{count}} записей",
261
487
  recordCountOne: "{{count}} запись",
@@ -267,6 +493,8 @@ const ru = {
267
493
  filterRecords: "Фильтр записей",
268
494
  sort: "Сортировка",
269
495
  sortRecords: "Сортировка записей",
496
+ sortByIdSuffix: "(по ID)",
497
+ sortRelationalHint: "Столбцы, ссылающиеся на другую запись, здесь не показаны: их можно сортировать только по сохранённому ID, а не по имени, которое видно в ячейке. Чтобы сортировать по этому имени, добавьте поле-формулу с ним.",
270
498
  group: "Группировка",
271
499
  groupBy: "Группировать по",
272
500
  export: "Экспорт",
@@ -296,6 +524,11 @@ const ru = {
296
524
  recordEditingTitle: "Редактирование записей",
297
525
  },
298
526
  managedByBadge: {
527
+ systemWritable: {
528
+ short: "Схема платформы",
529
+ title: "Определено платформой, доступно администратору для записи",
530
+ body: "Схему этого объекта задаёт платформа, но строки вы создаёте и редактируете здесь сами. Кто именно может писать, определяют делегированное администрирование и безопасность на уровне записей, а не этот значок.",
531
+ },
299
532
  config: {
300
533
  short: "Конфигурация",
301
534
  title: "Конфигурация администратора",
@@ -318,6 +551,7 @@ const ru = {
318
551
  },
319
552
  },
320
553
  kanban: {
554
+ uncategorized: "Без категории",
321
555
  addCard: "Добавить карточку",
322
556
  addColumn: "Добавить колонку",
323
557
  moveCard: "Переместить карточку",
@@ -339,12 +573,92 @@ const ru = {
339
573
  },
340
574
  },
341
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: "Не удалось сохранить — изменение отменено",
342
644
  column: {
343
645
  taskName: "Название задачи",
344
646
  start: "Начало",
345
647
  end: "Конец",
346
648
  },
347
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: "Повторить",
348
662
  prevPeriod: "Предыдущий период",
349
663
  nextPeriod: "Следующий период",
350
664
  zoomIn: "Увеличить",
@@ -390,6 +704,11 @@ const ru = {
390
704
  redo: 'Redo',
391
705
  },
392
706
  detail: {
707
+ editInlineHint: "Дважды щёлкните для редактирования",
708
+ systemActor: "Система",
709
+ unknownUser: "Неизвестно",
710
+ created: "Создано",
711
+ updated: "Обновлено",
393
712
  back: "Назад",
394
713
  edit: "Редактировать",
395
714
  editInline: "Редактировать",
@@ -450,6 +769,18 @@ const ru = {
450
769
  attachmentCount: "{{count}} вложение",
451
770
  attachmentCountPlural: "{{count}} вложений",
452
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: "У вас нет разрешения на это действие.",
453
784
  unifiedDiff: "Единое представление",
454
785
  sideBySideDiff: "Параллельное представление",
455
786
  noChanges: "Нет изменений",
@@ -497,9 +828,15 @@ const ru = {
497
828
  saving: "Сохранение…",
498
829
  lockedByApproval: "Заблокировано для согласования",
499
830
  lockedTooltip: "У этой записи есть ожидающий запрос на согласование; редактирование заблокировано",
831
+ writeStrippedTitle: "Часть полей не сохранена",
832
+ writeStrippedReadonly: "Поля только для чтения, поэтому не сохранены: {{fields}}",
833
+ writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не сохранены: {{fields}}",
834
+ approvalPendingEditable: "На согласовании · редактирование доступно",
835
+ approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
500
836
  cancelApproval: "Отменить согласование",
501
837
  cancelApprovalInFlight: "Отмена…",
502
838
  cancelApprovalTooltip: "Отмените ожидающий запрос на согласование, чтобы разблокировать запись",
839
+ cancelApprovalTooltipUnlocked: "Отменить ожидающий запрос на согласование",
503
840
  cancelApprovalFailed: "Не удалось отменить согласование",
504
841
  cancelApprovalUnavailable: "Отмена согласований не поддерживается этим источником данных",
505
842
  linkCopied: "Ссылка скопирована в буфер обмена",
@@ -602,6 +939,35 @@ const ru = {
602
939
  resetZoom: "Сбросить масштаб",
603
940
  },
604
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
+ },
605
971
  addWidget: "Добавить виджет",
606
972
  removeWidget: "Удалить виджет",
607
973
  editLayout: "Редактировать макет",
@@ -729,6 +1095,7 @@ const ru = {
729
1095
  navTypeGroup: "Группа",
730
1096
  navTypeSeparator: "Разделитель",
731
1097
  navTypeAction: "Действие",
1098
+ navTypeComponent: "Компонент",
732
1099
  navEditIcon: "Редактировать значок",
733
1100
  navToggleVisible: "Переключить видимость",
734
1101
  navHidden: "Скрыто",
@@ -830,8 +1197,199 @@ const ru = {
830
1197
  },
831
1198
  },
832
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
+ },
833
1390
  title: "Консоль ObjectStack",
834
1391
  initializing: "Инициализация приложения...",
1392
+ loadingHint: "Настройка нового окружения может занять некоторое время.",
835
1393
  breadcrumb: {
836
1394
  dashboards: "Панели",
837
1395
  pages: "Страницы",
@@ -873,6 +1431,7 @@ const ru = {
873
1431
  toggleDarkMode: "Переключить тёмный режим",
874
1432
  },
875
1433
  commandPalette: {
1434
+ title: "Палитра команд",
876
1435
  placeholder: "Введите команду или поиск...",
877
1436
  noResults: "Результаты не найдены.",
878
1437
  objects: "Объекты",
@@ -906,6 +1465,14 @@ const ru = {
906
1465
  system: "Системная",
907
1466
  },
908
1467
  objectView: {
1468
+ viewTypeTree: "Дерево",
1469
+ viewTypeTreeDesc: "Выстраивает самоссылающиеся записи в иерархию по родительскому полю.",
1470
+ parentField: "Родительское поле",
1471
+ parentFieldHelp: "Поле, указывающее на родительскую запись (тот же объект) и задающее иерархию. Подходят только самоссылающиеся поля.",
1472
+ viewName: "Название",
1473
+ viewNameHelp: "Машинный ключ (snake_case). Заполняется автоматически из заголовка — при желании измените.",
1474
+ viewNameRequired: "Введите ключ (строчные буквы, цифры, подчёркивание). Для нелатинских заголовков автозаполнение не работает.",
1475
+ viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
909
1476
  systemViewReadonly: 'System view defined in code - duplicate to customize.',
910
1477
  expandToPage: 'Open as full page',
911
1478
  objectNotFound: "Объект не найден",
@@ -1119,7 +1686,28 @@ const ru = {
1119
1686
  },
1120
1687
  },
1121
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
+ },
1122
1703
  login: {
1704
+ signingIn: "Выполняется вход…",
1705
+ ssoHandoff: "Перейти к {{target}}",
1706
+ devAdminHint: {
1707
+ title: "Среда разработки",
1708
+ body: "Войдите под предустановленным администратором для разработки:",
1709
+ dismiss: "Закрыть",
1710
+ },
1123
1711
  title: "Войдите в свой аккаунт",
1124
1712
  description: "Введите электронную почту и пароль для продолжения",
1125
1713
  emailLabel: "Электронная почта",
@@ -1132,6 +1720,7 @@ const ru = {
1132
1720
  noAccountText: "Нет аккаунта?",
1133
1721
  signUpText: "Зарегистрироваться",
1134
1722
  errors: {
1723
+ oauthCallbackFailed: "Не удалось завершить единый вход — ссылка для входа истекла или уже была использована. Попробуйте ещё раз.",
1135
1724
  invalidCredentials: "Неверный email или пароль. Попробуйте ещё раз.",
1136
1725
  emailNotVerified: "Пожалуйста, подтвердите email перед входом.",
1137
1726
  },
@@ -1257,6 +1846,40 @@ const ru = {
1257
1846
  shell: {
1258
1847
  tenantHostHint: "Вы входите в это рабочее пространство",
1259
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
+ },
1260
1883
  },
1261
1884
  profile: {
1262
1885
  title: "Профиль",
@@ -1321,11 +1944,15 @@ const ru = {
1321
1944
  settings: "Настройки рабочего пространства",
1322
1945
  },
1323
1946
  help: {
1947
+ onThisPage: "На этой странице",
1948
+ keyboardShortcuts: "Сочетания клавиш",
1324
1949
  appDocs: 'Документация приложения',
1325
1950
  allDocs: 'Вся документация',
1326
1951
  onlineDocs: 'Онлайн-документация',
1327
1952
  },
1328
1953
  sidebar: {
1954
+ packageManagement: "Управление пакетами",
1955
+ searchNavigation: "Поиск по навигации...",
1329
1956
  settings: "Настройки",
1330
1957
  help: "Помощь",
1331
1958
  helpTooltip: "Помощь и документация",
@@ -1342,14 +1969,66 @@ const ru = {
1342
1969
  removeFromFavorites: "Убрать {{name}} из избранного",
1343
1970
  },
1344
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
+ },
1345
1989
  aiAssistant: "ИИ-ассистент",
1346
1990
  designInStudio: "Дизайн в Studio",
1347
1991
  },
1348
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
+ },
1349
2020
  title: "Главная",
1350
2021
  subtitle: "Панель вашего рабочего пространства",
1351
2022
  nav: "Главная",
1352
2023
  allApps: "Все приложения",
2024
+ yourApps: "Ваши приложения",
2025
+ showMoreApps: "Ещё",
2026
+ showLess: "Свернуть",
2027
+ continueEmpty: "Открытые вами элементы появятся здесь.",
2028
+ actionCenter: {
2029
+ title: "Требует вашего внимания",
2030
+ empty: "Всё выполнено",
2031
+ },
1353
2032
  loading: "Загрузка рабочего пространства...",
1354
2033
  recent: "Недавние",
1355
2034
  starred: "Избранные",
@@ -1401,7 +2080,21 @@ const ru = {
1401
2080
  },
1402
2081
  },
1403
2082
  layout: {
2083
+ systemNav: {
2084
+ systemSettings: "Системные настройки",
2085
+ applications: "Приложения",
2086
+ appMarketplace: "Маркетплейс приложений",
2087
+ objectManager: "Менеджер объектов",
2088
+ users: "Пользователи",
2089
+ organizations: "Организации",
2090
+ roles: "Роли",
2091
+ configuration: "Конфигурация",
2092
+ createApp: "Создать приложение",
2093
+ },
1404
2094
  appSwitcher: {
2095
+ switchApplication: "Сменить приложение",
2096
+ appsAvailable: "Доступно приложений: {{count}}",
2097
+ editNavigation: "Изменить навигацию",
1405
2098
  home: "Главная",
1406
2099
  addApp: "Добавить приложение",
1407
2100
  editApp: "Редактировать приложение",
@@ -1491,10 +2184,11 @@ const ru = {
1491
2184
  requiredError: "{{label}} обязательно",
1492
2185
  cancel: "Отмена",
1493
2186
  confirm: "Подтвердить",
2187
+ uploading: "Загрузка…",
1494
2188
  defaultActionTitle: "Действие",
1495
2189
  ok: "ОК",
1496
- lookupPlaceholder: "Вставить ID записи (UUID) для {{label}}",
1497
- lookupHelpText: "Введите ID записи связанного объекта. Выбор записи будет добавлен позже.",
2190
+ lookupPlaceholder: "ID записи для {{label}}",
2191
+ lookupHelpText: "Для этого параметра не настроен объект ссылки, поэтому выбор записи недоступен. Введите ID записи или попросите администратора исправить параметр действия.",
1498
2192
  },
1499
2193
  actionConfirm: {
1500
2194
  title: "Подтвердите действие",
@@ -1519,6 +2213,8 @@ const ru = {
1519
2213
  updateFailed: "Не удалось обновить навигацию",
1520
2214
  },
1521
2215
  objectActions: {
2216
+ resetPackageSetConfirm: "Этот набор разрешений поставляется с установленным пакетом и не может быть удалён. Удаление сбросит его к исходному состоянию из пакета и отменит ваши настройки в этой среде. Продолжить?",
2217
+ resetPackageSetSuccess: "Набор разрешений сброшен к исходному состоянию из пакета",
1522
2218
  deleteSuccess: "{{label}} успешно удалён",
1523
2219
  deleteFailed: "Не удалось удалить {{label}}",
1524
2220
  noRecordId: "ID записи не указан",
@@ -1683,6 +2379,7 @@ const ru = {
1683
2379
  },
1684
2380
  },
1685
2381
  organizations: {
2382
+ create: "Создать рабочее пространство",
1686
2383
  mine: "Мои организации",
1687
2384
  title: "Организации",
1688
2385
  heading: "Ваши организации",
@@ -1696,6 +2393,11 @@ const ru = {
1696
2393
  noMatches: "Нет организаций, соответствующих запросу.",
1697
2394
  },
1698
2395
  notifications: {
2396
+ regionLabel: "Уведомления",
2397
+ groupCount: "Уведомлений: {{count}}",
2398
+ groupUnread: "Непрочитанных: {{count}}",
2399
+ groupMarkRead: "Отметить прочитанными",
2400
+ groupMarkReadTitle: "Отметить прочитанными все этого типа",
1699
2401
  empty: "Нет уведомлений",
1700
2402
  markAllRead: "Отметить все как прочитанные",
1701
2403
  viewAll: "Показать все уведомления",
@@ -1814,7 +2516,103 @@ const ru = {
1814
2516
  done: 'Готово — скрыть',
1815
2517
  },
1816
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
+ },
1817
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
+ },
1818
2616
  title: "Маркетплейс приложений",
1819
2617
  subtitle: "Просматривайте одобренные приложения из каталога ObjectStack. Нажмите на приложение, чтобы увидеть подробности и установить его.",
1820
2618
  searchPlaceholder: "Поиск приложений по имени или ID манифеста…",
@@ -1866,6 +2664,7 @@ const ru = {
1866
2664
  updateAvailable: 'Доступно обновление',
1867
2665
  },
1868
2666
  action: {
2667
+ installed: "Установлено",
1869
2668
  install: "Установить",
1870
2669
  reinstall: "Переустановить",
1871
2670
  working: "Обработка…",
@@ -1936,6 +2735,14 @@ const ru = {
1936
2735
  yearsAgo: "{{count}} лет назад",
1937
2736
  },
1938
2737
  },
2738
+ approvals: {
2739
+ approve: 'Утвердить',
2740
+ reject: 'Отклонить',
2741
+ comment: 'Комментарий (необязательно)',
2742
+ approveSuccess: 'Утверждено',
2743
+ rejectSuccess: 'Отклонено',
2744
+ rejectConfirm: 'Отклонить этот запрос на согласование?',
2745
+ },
1939
2746
  approvalsInbox: {
1940
2747
  loadMore: 'Загрузить ещё',
1941
2748
  loadingMore: 'Загрузка…',
@@ -1960,13 +2767,28 @@ const ru = {
1960
2767
  slaRemaining: 'SLA: осталось {{dur}}',
1961
2768
  slaOverdue: 'SLA просрочен на {{dur}}',
1962
2769
  actReassign: 'Передано',
2770
+ reassignFromTo: 'от {{from}} к {{to}}',
1963
2771
  actRemind: 'Напоминание',
1964
2772
  actRequestInfo: 'Запрошены данные',
1965
2773
  actComment: 'Комментарий',
1966
2774
  stepProgress: 'Шаги согласования',
1967
2775
  prevRequest: 'Назад',
1968
2776
  nextRequest: 'Далее',
1969
- 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: 'Сумма (по убыванию)',
1970
2792
  quickPhrase1: 'Согласовано — соответствует требованиям.',
1971
2793
  quickPhrase2: 'Согласовано с условиями — следите за исполнением.',
1972
2794
  quickPhrase3: 'Дополните материалы и отправьте повторно.',
@@ -2095,6 +2917,10 @@ const ru = {
2095
2917
  retry: 'Повторить',
2096
2918
  },
2097
2919
  draftBar: {
2920
+ messageClean: "Предпросмотр черновика — неопубликованных изменений нет; всё здесь уже действует.",
2921
+ sampleDataTitle: "Примеры данных появятся после публикации",
2922
+ sampleDataBody: "Вы просматриваете структуру приложения. Опубликуйте его, чтобы загрузить примеры записей и запустить его.",
2923
+ publishCta: "Опубликовать и посмотреть",
2098
2924
  message: 'Предпросмотр черновика — вы видите неопубликованные изменения. Ничего не вступит в силу до публикации.',
2099
2925
  publish: 'Опубликовать',
2100
2926
  publishing: 'Публикация…',