@object-ui/i18n 17.6.0 → 18.0.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 (62) hide show
  1. package/CHANGELOG.md +5408 -0
  2. package/README.md +255 -13
  3. package/dist/LocalizationContext.d.ts +32 -9
  4. package/dist/LocalizationContext.js +32 -10
  5. package/dist/builtinAggregateLabels.d.ts +40 -0
  6. package/dist/builtinAggregateLabels.js +23 -0
  7. package/dist/currency.d.ts +27 -3
  8. package/dist/currency.js +28 -4
  9. package/dist/fallbackInterpolation.d.ts +79 -0
  10. package/dist/fallbackInterpolation.js +124 -0
  11. package/dist/i18n.d.ts +27 -1
  12. package/dist/i18n.js +99 -16
  13. package/dist/index.d.ts +8 -13
  14. package/dist/index.js +45 -17
  15. package/dist/locales/ar.d.ts +1504 -188
  16. package/dist/locales/ar.js +1711 -281
  17. package/dist/locales/de.d.ts +1080 -188
  18. package/dist/locales/de.js +1248 -261
  19. package/dist/locales/en.d.ts +1141 -249
  20. package/dist/locales/en.js +1714 -295
  21. package/dist/locales/es.d.ts +1186 -188
  22. package/dist/locales/es.js +1350 -255
  23. package/dist/locales/fr.d.ts +1186 -188
  24. package/dist/locales/fr.js +1351 -258
  25. package/dist/locales/index.d.ts +11940 -2033
  26. package/dist/locales/index.js +48 -9
  27. package/dist/locales/ja.d.ts +1080 -188
  28. package/dist/locales/ja.js +1240 -254
  29. package/dist/locales/ko.d.ts +1080 -188
  30. package/dist/locales/ko.js +1244 -258
  31. package/dist/locales/pt.d.ts +1186 -188
  32. package/dist/locales/pt.js +1350 -255
  33. package/dist/locales/registry.d.ts +102 -0
  34. package/dist/locales/registry.js +220 -0
  35. package/dist/locales/rtl.d.ts +24 -0
  36. package/dist/locales/rtl.js +26 -0
  37. package/dist/locales/ru.d.ts +1292 -188
  38. package/dist/locales/ru.js +1479 -272
  39. package/dist/locales/zh.d.ts +1144 -252
  40. package/dist/locales/zh.js +1245 -259
  41. package/dist/pickLocalized.d.ts +30 -0
  42. package/dist/pickLocalized.js +39 -0
  43. package/dist/provider.d.ts +101 -12
  44. package/dist/provider.js +335 -50
  45. package/dist/translateFn.d.ts +29 -0
  46. package/dist/translateFn.js +8 -0
  47. package/dist/useDisplayLocale.d.ts +11 -0
  48. package/dist/useDisplayLocale.js +11 -0
  49. package/dist/useObjectLabel.d.ts +143 -100
  50. package/dist/useObjectLabel.js +129 -82
  51. package/dist/useSafeTranslation.js +40 -42
  52. package/dist/utils/first-day-of-week.d.ts +71 -0
  53. package/dist/utils/first-day-of-week.js +61 -0
  54. package/dist/utils/formatting.d.ts +23 -1
  55. package/dist/utils/formatting.js +34 -5
  56. package/dist/utils/index.d.ts +1 -0
  57. package/dist/utils/index.js +1 -0
  58. package/dist/utils/spec-formatters.d.ts +13 -23
  59. package/dist/utils/spec-formatters.js +41 -2
  60. package/dist/utils/spec-translations.d.ts +16 -3
  61. package/dist/utils/spec-translations.js +52 -13
  62. package/package.json +12 -6
@@ -13,16 +13,19 @@ const ru = {
13
13
  notRestored: 'Сервер принял запрос, но не восстановил сеанс администратора — вы всё ещё работаете от имени {{user}}. Выйдите и войдите снова, чтобы завершить.',
14
14
  },
15
15
  },
16
- // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
16
+ // objectui#2600 B5 — capability picker scope group headers (labels come from the capability registry).
17
17
  capability: {
18
18
  label: {
19
19
  manage_users: "Управление пользователями",
20
20
  manage_org_users: "Управление пользователями организации",
21
21
  manage_metadata: "Управление метаданными",
22
+ manage_mailboxes: "Управление почтовыми ящиками",
22
23
  manage_platform_settings: "Управление настройками платформы",
23
24
  setup_access: "Доступ к настройке",
24
25
  setup_write: "Запись настроек",
25
26
  studio_access: "Доступ к Studio",
27
+ manage_sharing: "Управление общим доступом",
28
+ view_all_audit_log: "Просмотр всего журнала аудита",
26
29
  },
27
30
  group: {
28
31
  platform: 'Платформа',
@@ -30,32 +33,6 @@ const ru = {
30
33
  other: 'Другое',
31
34
  },
32
35
  },
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
- },
59
36
  lookup: {
60
37
  recentlyUsed: 'Недавние',
61
38
  allResults: 'Все результаты',
@@ -69,7 +46,10 @@ const ru = {
69
46
  selectFirst: 'Сначала выберите {{fields}}',
70
47
  selectRecord: 'Выбрать запись',
71
48
  recordCount: 'Записей: {{count}}',
72
- recordCountOne: '1 запись',
49
+ recordCount_one: '{{count}} запись',
50
+ recordCount_few: '{{count}} записи',
51
+ recordCount_many: '{{count}} записей',
52
+ recordCount_other: '{{count}} записи',
73
53
  pageOf: 'Страница {{current}} из {{total}}',
74
54
  filters: 'Фильтры',
75
55
  clear: 'Очистить',
@@ -121,15 +101,32 @@ const ru = {
121
101
  closeChat: "Закрыть чат",
122
102
  closePanel: "Закрыть панель",
123
103
  resizeDrawer: "Изменить ширину панели",
124
- itemCount: "{{count}} элементов",
125
- itemCountOne: "{{count}} элемент",
104
+ // objectui#11445 — a count family: each slot agrees the noun with the
105
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
106
+ // count-invariant form, answers a call made without a count.
107
+ itemCount: "Элементов: {{count}}",
108
+ itemCount_one: "{{count}} элемент",
109
+ itemCount_few: "{{count}} элемента",
110
+ itemCount_many: "{{count}} элементов",
111
+ itemCount_other: "{{count}} элемента",
126
112
  toggleSidebar: "Переключить боковую панель",
113
+ breadcrumb: "Навигационная цепочка",
127
114
  package: "Пакет",
128
115
  done: "Готово",
129
116
  editInStudio: "Редактировать в Studio",
130
117
  record: "Запись",
131
118
  retry: "Повторить",
132
119
  printDialogHint: "Открывает диалог печати браузера (это не экспорт в PDF)",
120
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
121
+ // there are two conditions: a reported `total` states the fact with BOTH
122
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
123
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
124
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
125
+ // headroom is deliberately NOT restated here — it moves on every
126
+ // re-baseline, and the figure that was here went stale.
127
+ // `pnpm check:eager-closure` prints it.
128
+ rowCeilingNote: "Показаны первые {{shown}} из {{total}} записей. Сузьте фильтр.",
129
+ rowCeilingNoteUnknownTotal: "Показаны первые {{shown}} записей. Сузьте фильтр.",
133
130
  },
134
131
  actions: {
135
132
  decisionOutput: {
@@ -141,6 +138,15 @@ const ru = {
141
138
  acknowledge: 'Я сохранил(а) это',
142
139
  copyAll: 'Копировать всё',
143
140
  },
141
+ notAvailableHere: '«{{action}}» недоступно на текущей странице.',
142
+ notAvailableForRecord: 'Недоступно для этой записи',
143
+ completedSuccessfully: 'Действие успешно выполнено',
144
+ failed: 'Действие не выполнено',
145
+ parallelFailed: 'Одно или несколько параллельных действий не выполнены',
146
+ undo: 'Отменить',
147
+ undone: 'Изменение отменено',
148
+ undoneOperation: 'Отменить: {{description}}',
149
+ redoneOperation: 'Повторить: {{description}}',
144
150
  },
145
151
  validation: {
146
152
  required: "Поле {{field}} обязательно для заполнения",
@@ -158,19 +164,47 @@ const ru = {
158
164
  },
159
165
  form: {
160
166
  noPermissionToSave: "У вас нет прав на сохранение этой записи.",
167
+ noPermissionToCreate: "У вас нет прав на создание записей «{{object}}». Поля доступны только для чтения.",
168
+ noPermissionToEdit: "У вас нет прав на редактирование записей «{{object}}». Поля доступны только для чтения.",
161
169
  submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
170
+ uploadInFlight: "Дождитесь завершения загрузки, прежде чем сохранять.",
171
+ clearedOnHide: "Очищено то, что больше не применимо к текущим значениям: {{fields}}",
172
+ visibleWhenFaulted: "Невозможно отправить: не удалось вычислить правило visibleWhen для {{fields}}. Правило нужно исправить, прежде чем эту форму можно будет отправить.",
162
173
  discardTitle: "Отменить изменения?",
163
174
  discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
164
175
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
165
176
  // description, used when the form declares no `description` of its own.
166
177
  dialogDescriptionFallback: "Заполните поля формы, затем отправьте или отмените.",
178
+ deniedDescription: "У вас нет прав на редактирование этого поля.",
179
+ serverDefaultHint: "Задаётся автоматически при сохранении.",
180
+ maxFileSize: "Максимальный размер: {{size}}",
181
+ masterDetail: {
182
+ loadingColumns: "Загрузка столбцов…",
183
+ subtotal: "Промежуточный итог",
184
+ tax: "Налог ({{rate}}%)",
185
+ total: "Итого",
186
+ lineItem: "Позиция",
187
+ rowTitle: "{{title}} — строка {{row}}",
188
+ applyRow: "Применить",
189
+ editorDescription: "Введите запись и её позиции, затем сохраните.",
190
+ noChildObject: "Для этой коллекции не настроен дочерний объект: укажите в {{property}} объект, строки которого она выводит.",
191
+ schemaUnavailable: "Не удалось загрузить схему {{object}}, поэтому у этой коллекции нет столбцов для отображения. Убедитесь, что объект существует и доступен для чтения, затем перезагрузите.",
192
+ noRelationshipField: "Не удалось определить, как {{object}} связан с {{parent}}: ни одно поле lookup или master_detail в нём не ссылается на родительский объект. Укажите в {{property}} этой коллекции поле, в котором хранится родительская запись.",
193
+ },
194
+ lineItems: {
195
+ title: "Позиции",
196
+ saveRecordFirst: "Сначала сохраните запись, чтобы добавить позиции.",
197
+ notLoaded: "Позиции этой записи не загружены.",
198
+ loadFailed: "Не удалось загрузить позиции",
199
+ saveFailed: "Не удалось сохранить позиции",
200
+ noChildObject: "Для этой панели не настроен дочерний объект: укажите в {{property}} объект, строки которого она выводит.",
201
+ },
167
202
  keepEditing: "Продолжить редактирование",
168
203
  discard: "Отменить",
169
204
  conflictTitle: "Конфликт сохранения",
170
205
  conflictMessage: "Пока вы редактировали, эту запись изменил другой пользователь. Перезапись заменит его изменения вашими.",
171
206
  conflictLatestVersion: "Его сохранение: {{time}}",
172
207
  conflictOverwrite: "Перезаписать",
173
- addItem: "Добавить элемент",
174
208
  removeItem: "Удалить элемент",
175
209
  fieldRequired: "Это поле обязательно",
176
210
  invalidFormat: "Неверный формат",
@@ -188,6 +222,12 @@ const ru = {
188
222
  createSuccess: "{{object}} создан",
189
223
  updateSuccess: "{{object}} обновлён",
190
224
  deleteSuccess: "{{object}} удалён",
225
+ created: "Создано",
226
+ saved: "Сохранено",
227
+ savedNamed: "{{title}} сохранён",
228
+ submitted: "Отправлено",
229
+ errorLoading: "Ошибка загрузки формы",
230
+ navigateRefused: "Цель `navigateOnSuccess`, объявленная для этой формы, была отклонена, поэтому переход не выполнен.",
191
231
  fullscreen: {
192
232
  title: "Изменить текст",
193
233
  description: "Измените полное текстовое значение, затем сохраните или отмените изменения.",
@@ -206,12 +246,20 @@ const ru = {
206
246
  remove: "Удалить изображение {{index}}",
207
247
  enlarge: "Увеличить {{name}}",
208
248
  preview: "Предпросмотр изображения",
249
+ cropPreview: "Предпросмотр обрезки изображения",
209
250
  previous: "Предыдущее изображение",
210
251
  next: "Следующее изображение",
211
252
  counter: "{{current}} / {{total}}",
212
253
  },
254
+ percent: {
255
+ slider: "Процент",
256
+ },
213
257
  relativeDate: {
214
258
  overdue: "Просрочено на {{count}} дн.",
259
+ overdue_one: "Просрочено на {{count}} дн.",
260
+ overdue_few: "Просрочено на {{count}} дн.",
261
+ overdue_many: "Просрочено на {{count}} дн.",
262
+ overdue_other: "Просрочено на {{count}} дн.",
215
263
  },
216
264
  file: {
217
265
  dragDropHere: 'Перетащите файлы сюда',
@@ -228,6 +276,9 @@ const ru = {
228
276
  remove: 'Удалить {{name}}',
229
277
  exceedsMaxSize: '«{{name}}» превышает максимальный размер ({{max}} МБ)',
230
278
  uploadFailed: 'Не удалось загрузить «{{name}}»: {{error}}',
279
+ uploadIncomplete: 'Загрузка «{{name}}» не завершена: идентификатор файла не получен, ничего не сохранено',
280
+ restricted: 'Файл с ограниченным доступом',
281
+ restrictedHint: 'У вас нет доступа к сведениям об этом файле',
231
282
  },
232
283
  richText: {
233
284
  format: "Формат: {{format}}",
@@ -244,6 +295,10 @@ const ru = {
244
295
  search: "Поиск объектов…",
245
296
  empty: "Объекты не найдены",
246
297
  },
298
+ registryRef: {
299
+ loadFailed: "Не удалось загрузить список. Имя можно ввести вручную.",
300
+ notFound: "{{name}} (не найдено)",
301
+ },
247
302
  recipient: {
248
303
  selectTypeFirst: "Сначала выберите тип получателя.",
249
304
  loading: "Загрузка…",
@@ -255,6 +310,9 @@ const ru = {
255
310
  selectBusinessUnit: "Выберите бизнес-подразделение",
256
311
  selectPosition: "Выберите должность",
257
312
  selectUnitAndSubordinates: "Выберите бизнес-подразделение",
313
+ selectField: "Выберите поле пользователя",
314
+ noUserFields: "В этом объекте нет полей пользователя",
315
+ fieldNotUserTyped: "{{name}} — не поле пользователя",
258
316
  },
259
317
  filterCondition: {
260
318
  selectObjectFirst: "Сначала выберите объект.",
@@ -265,6 +323,33 @@ const ru = {
265
323
  editAsJson: "Редактировать как JSON",
266
324
  useVisualBuilder: "Использовать визуальный конструктор",
267
325
  },
326
+ object: {
327
+ invalidJson: "Некорректный JSON",
328
+ },
329
+ location: {
330
+ refusedFormat: "Не сохранено: введите пару широта, долгота (например: 30.2741, 120.1551).",
331
+ refusedRange: "Не сохранено: {{detail}}",
332
+ latitude: "широта",
333
+ longitude: "долгота",
334
+ refusedResidueOne: "Не сохранено: {{name}} «{{text}}» — не число. Введите обычные десятичные дроби (например: 30.2741, 120.1551).",
335
+ refusedResidue: "Не сохранено: {{name}} «{{text}}» и {{otherName}} «{{otherText}}» — не числа. Введите обычные десятичные дроби (например: 30.2741, 120.1551).",
336
+ },
337
+ date: {
338
+ impossibleDay: "Сохранённое значение «{{value}}» — несуществующая дата. Выберите дату, чтобы заменить его.",
339
+ },
340
+ dateTime: {
341
+ impossibleDay: "Сохранённое значение «{{value}}» — несуществующая дата. Выберите дату и время, чтобы заменить его.",
342
+ },
343
+ datePicker: {
344
+ today: "Сегодня",
345
+ tomorrow: "Завтра",
346
+ clear: "Очистить дату",
347
+ openCalendar: "Открыть календарь",
348
+ invalid: "Не сохранено: «{{value}}» — не дата. Введите её в формате {{format}} или выберите в календаре.",
349
+ },
350
+ number: {
351
+ badInput: "Не сохранено: текст в этом поле — не число. Введите обычную десятичную дробь (например: {{example}}).",
352
+ },
268
353
  tags: {
269
354
  placeholder: "Введите и нажмите Enter, чтобы добавить…",
270
355
  },
@@ -276,10 +361,25 @@ const ru = {
276
361
  postalCode: "Почтовый индекс",
277
362
  country: "Страна",
278
363
  },
364
+ boolean: {
365
+ offBadge: "{{label}} — Выкл.",
366
+ completed: "Выполнено",
367
+ notCompleted: "Не выполнено",
368
+ },
279
369
  textarea: {
280
370
  characterCount: "Количество символов: {{count}} из {{max}}",
281
371
  charactersRemaining: "Осталось символов: {{count}}",
282
372
  },
373
+ grid: {
374
+ addLine: "Добавить строку",
375
+ noItems: "Нет элементов",
376
+ noItemsAddHint: "Пока нет элементов — нажмите «{{label}}», чтобы начать.",
377
+ optionalColumns: "Дополнительные столбцы",
378
+ computed: "Вычисляется",
379
+ openRow: "Открыть строку",
380
+ duplicateRow: "Дублировать строку",
381
+ removeRow: "Удалить строку",
382
+ },
283
383
  },
284
384
  table: {
285
385
  rowsPerPage: "Строк на странице",
@@ -295,10 +395,15 @@ const ru = {
295
395
  selectAllRows: "Выбрать все строки",
296
396
  expandRow: "Развернуть строку",
297
397
  collapseRow: "Свернуть строку",
398
+ rowActions: "Действия со строкой",
298
399
  hideColumn: "Скрыть столбец",
299
400
  freezeColumn: "Закрепить столбец",
300
401
  unfreezeColumn: "Открепить столбец",
301
402
  pageInfo: "Страница {{current}} из {{total}}",
403
+ firstPage: "Первая страница",
404
+ previousPage: "Предыдущая страница",
405
+ nextPage: "Следующая страница",
406
+ lastPage: "Последняя страница",
302
407
  totalRecords: "Всего {{count}}",
303
408
  noResults: "Результатов нет",
304
409
  noResultsHint: "Попробуйте изменить фильтры или поисковые запросы.",
@@ -308,23 +413,53 @@ const ru = {
308
413
  open: "Открыть",
309
414
  search: "Поиск…",
310
415
  modified: "{{count}} строк изменено",
416
+ modified_one: "Изменена {{count}} строка",
417
+ modified_few: "Изменено {{count}} строки",
418
+ modified_many: "Изменено {{count}} строк",
419
+ modified_other: "Изменено {{count}} строки",
420
+ saved: "{{count}} строк сохранено",
421
+ saved_one: "Сохранена {{count}} строка",
422
+ saved_few: "Сохранено {{count}} строки",
423
+ saved_many: "Сохранено {{count}} строк",
424
+ saved_other: "Сохранено {{count}} строки",
311
425
  saveFailed: 'Не удалось сохранить',
312
426
  selected: "{{count}} выбрано",
427
+ selected_one: "Выбрано: {{count}}",
428
+ selected_few: "Выбрано: {{count}}",
429
+ selected_many: "Выбрано: {{count}}",
430
+ selected_other: "Выбрано: {{count}}",
313
431
  edit: "Редактировать",
314
432
  delete: "Удалить",
315
433
  },
316
434
  grid: {
317
435
  bulkSelected: "Выбрано: {{count}}",
436
+ bulkSelected_one: "Выбрано: {{count}}",
437
+ bulkSelected_few: "Выбрано: {{count}}",
438
+ bulkSelected_many: "Выбрано: {{count}}",
439
+ bulkSelected_other: "Выбрано: {{count}}",
318
440
  bulkSelectedAllMatches: "Выбрано: {{count}} (все совпадения)",
319
441
  bulkClear: "Снять выделение",
320
442
  bulkAllOnPage: "Выбраны все {{count}} на этой странице.",
443
+ bulkAllOnPage_one: "Выбраны все записи на этой странице ({{count}}).",
444
+ bulkAllOnPage_few: "Выбраны все записи на этой странице ({{count}}).",
445
+ bulkAllOnPage_many: "Выбраны все записи на этой странице ({{count}}).",
446
+ bulkAllOnPage_other: "Выбраны все записи на этой странице ({{count}}).",
321
447
  bulkSelectAllMatching: "Выбрать все совпадения ({{count}})",
322
448
  bulkAllMatchingSelected: "Выбраны все подходящие записи ({{count}}).",
449
+ bulkActions: "Массовые действия",
323
450
  bulk: {
324
451
  confirmDefault: "Будет применено к записям: {{count}}.",
452
+ confirmDefault_one: "Будет применено к записям: {{count}}.",
453
+ confirmDefault_few: "Будет применено к записям: {{count}}.",
454
+ confirmDefault_many: "Будет применено к записям: {{count}}.",
455
+ confirmDefault_other: "Будет применено к записям: {{count}}.",
325
456
  overLimit: "Выбрано ({{count}}) больше лимита действия ({{limit}}). Уменьшите выбор, чтобы продолжить.",
326
457
  affectedRecords: "Затрагиваемые записи ({{count}}):",
327
458
  skippedIneligible: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
459
+ skippedIneligible_one: '{{count}} из выбранных записей не подходит для этого действия и будет пропущена.',
460
+ skippedIneligible_few: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
461
+ skippedIneligible_many: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
462
+ skippedIneligible_other: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
328
463
  rowFallback: "Строка {{index}}",
329
464
  andMore: "… и ещё {{count}}",
330
465
  processed: "Обработано {{count}} / {{total}}",
@@ -342,7 +477,6 @@ const ru = {
342
477
  undo: "Отменить",
343
478
  undoing: "Отмена…",
344
479
  done: "Готово",
345
- selectPlaceholder: "Выберите…",
346
480
  loading: "Загрузка…",
347
481
  },
348
482
  actions: "Действия",
@@ -355,17 +489,27 @@ const ru = {
355
489
  pullToRefresh: "Потяните для обновления",
356
490
  refreshing: "Обновление…",
357
491
  openRecord: "Открыть запись",
492
+ recordUnavailable: "{{object}} · запись недоступна",
358
493
  rowHeight: "Высота строки: {{mode}}",
359
494
  openMenu: "Открыть меню",
360
495
  empty: "Пусто",
361
496
  yes: "Да",
362
497
  no: "Нет",
363
498
  systemFields: "Система",
499
+ // objectui#10881 — the grouped grid's two refusals: over a data source
500
+ // that cannot answer the group header query, and over rows a host
501
+ // handed in while declaring them one page of more. `queryGroupHeaders`
502
+ // is the member's name and stays untranslated.
503
+ grouping: {
504
+ needsHeaderQuery: "Это представление сгруппировано, но его источник данных не реализует queryGroupHeaders, поэтому группы невозможно подсчитать. Уберите группировку, чтобы показать записи.",
505
+ needsWholeRows: "Для группировки нужны все записи, но этой таблице передана только одна их страница, поэтому группы невозможно подсчитать. Передайте все записи или позвольте таблице загрузить их из источника данных, который реализует queryGroupHeaders.",
506
+ },
364
507
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
365
508
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
366
509
  // pack controls its own separator and word order.
367
510
  summary: {
368
511
  pattern: "{{label}}: {{value}}",
512
+ pagePattern: "{{label}} (эта страница): {{value}}",
369
513
  count: "Количество",
370
514
  countEmpty: "Пустые",
371
515
  countFilled: "Заполненные",
@@ -387,10 +531,16 @@ const ru = {
387
531
  },
388
532
  import: {
389
533
  downloadTemplate: "Скачать шаблон",
390
- downloadTemplateHint: "Получите CSV с нужными столбцами (обязательные поля отмечены *).",
534
+ downloadTemplateHint: "Получите файл Excel со столбцами, которые можно импортировать (обязательные поля отмечены *), и инструкцией по заполнению.",
391
535
  templateFileName: "{{object}}-import-template",
536
+ templateDownloadFailed: "Не удалось скачать шаблон. Повторите попытку.",
537
+ templateNotPermitted: "У вас нет прав на создание записей этого объекта, поэтому шаблон импорта недоступен.",
392
538
  autoMatched: "Сопоставлено автоматически",
393
539
  autoMatchedSummary: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
540
+ autoMatchedSummary_one: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
541
+ autoMatchedSummary_few: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
542
+ autoMatchedSummary_many: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
543
+ autoMatchedSummary_other: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
394
544
  confidence: {
395
545
  high: "Высокая точность",
396
546
  medium: "Средняя точность",
@@ -403,8 +553,20 @@ const ru = {
403
553
  cancelImport: "Отменить импорт",
404
554
  importCancelled: "Импорт отменён",
405
555
  resultsTruncated: "Показаны результаты первых {{count}} строк (из {{total}}).",
556
+ resultsTruncated_one: "Показаны результаты первых строк: {{count}} (из {{total}}).",
557
+ resultsTruncated_few: "Показаны результаты первых строк: {{count}} (из {{total}}).",
558
+ resultsTruncated_many: "Показаны результаты первых строк: {{count}} (из {{total}}).",
559
+ resultsTruncated_other: "Показаны результаты первых строк: {{count}} (из {{total}}).",
406
560
  createdCount: "Создано: {{count}}",
561
+ createdCount_one: "Создано: {{count}}",
562
+ createdCount_few: "Создано: {{count}}",
563
+ createdCount_many: "Создано: {{count}}",
564
+ createdCount_other: "Создано: {{count}}",
407
565
  updatedCount: "Обновлено: {{count}}",
566
+ updatedCount_one: "Обновлено: {{count}}",
567
+ updatedCount_few: "Обновлено: {{count}}",
568
+ updatedCount_many: "Обновлено: {{count}}",
569
+ updatedCount_other: "Обновлено: {{count}}",
408
570
  downloadFailed: "Скачать строки с ошибками",
409
571
  options: "Параметры импорта",
410
572
  writeMode: "Если строка совпадает с существующей записью",
@@ -419,9 +581,6 @@ const ru = {
419
581
  needMatchFields: "Выберите хотя бы одно поле для сопоставления.",
420
582
  matchOnlyField: "(только сопоставление)",
421
583
  optCreateOptions: "Сохранять неизвестные значения списка",
422
- optRunAutomations: "Выполнять автоматизации и триггеры",
423
- optTreatHistorical: "Импортировать как исторические данные",
424
- optTreatHistoricalHint: "(импортирует завершённые записи как есть — пропускает проверки конечного автомата и сохраняет исходные отметки времени и автора вместо текущих)",
425
584
  optSkipBlankKey: "Пропускать строки с пустым значением сопоставления",
426
585
  optBackground: "Импортировать в фоновом режиме",
427
586
  optBackgroundHint: "(выполняется как отменяемая задача)",
@@ -436,6 +595,7 @@ const ru = {
436
595
  invalidBoolean: "«{{value}}» не является допустимым значением true/false",
437
596
  invalidNumber: "«{{value}}» не является допустимым числом",
438
597
  invalidDate: "«{{value}}» не является допустимой датой",
598
+ invalidTime: "«{{value}}» не является допустимым временем",
439
599
  invalidOption: "«{{value}}» не входит в число допустимых вариантов",
440
600
  requiredValue: "Это поле обязательно",
441
601
  matchAmbiguous: "Соответствует нескольким существующим записям — используйте уникальное значение или идентификатор записи",
@@ -452,10 +612,19 @@ const ru = {
452
612
  historyColResult: "Результат",
453
613
  historyColTime: "Когда",
454
614
  errorCount: "Ошибок: {{count}}",
615
+ errorCount_one: "Ошибок: {{count}}",
616
+ errorCount_few: "Ошибок: {{count}}",
617
+ errorCount_many: "Ошибок: {{count}}",
618
+ errorCount_other: "Ошибок: {{count}}",
455
619
  undoImport: "Отменить импорт",
456
620
  undoing: "Отмена…",
457
621
  undoConfirm: "Отменить этот импорт? Созданные им записи будут удалены, а обновлённые — восстановлены к прежним значениям.",
458
622
  reverted: "Отменён",
623
+ undoPartial: "Не удалось отменить {{count}} строк. Повторная отмена затронет только эти строки.",
624
+ undoPartial_one: "Не удалось отменить {{count}} строку. Повторная отмена затронет только эту строку.",
625
+ undoPartial_few: "Не удалось отменить {{count}} строки. Повторная отмена затронет только эти строки.",
626
+ undoPartial_many: "Не удалось отменить {{count}} строк. Повторная отмена затронет только эти строки.",
627
+ undoPartial_other: "Не удалось отменить {{count}} строки. Повторная отмена затронет только эти строки.",
459
628
  jobStatus: {
460
629
  pending: "Ожидает",
461
630
  running: "Выполняется",
@@ -512,19 +681,37 @@ const ru = {
512
681
  mapped: "Сопоставлено",
513
682
  skipped: "Пропущено",
514
683
  rowsWithErrors: "{{count}} строк с ошибками",
684
+ rowsWithErrors_one: "{{count}} строка с ошибками",
685
+ rowsWithErrors_few: "{{count}} строки с ошибками",
686
+ rowsWithErrors_many: "{{count}} строк с ошибками",
687
+ rowsWithErrors_other: "{{count}} строки с ошибками",
515
688
  rowsCorrected: "{{count}} строк исправлено",
689
+ rowsCorrected_one: "Исправлена {{count}} строка",
690
+ rowsCorrected_few: "Исправлено {{count}} строки",
691
+ rowsCorrected_many: "Исправлено {{count}} строк",
692
+ rowsCorrected_other: "Исправлено {{count}} строки",
516
693
  clickToFix: "— нажмите на выделенную ячейку для редактирования.",
517
694
  showingRows: "Отображено {{shown}} из {{total}} строк",
518
695
  importing: "Импорт… {{progress}}%",
519
696
  importComplete: "Импорт завершён",
697
+ importPartial: "Импорт завершён с ошибками",
698
+ importFailed: "Импорт не выполнен",
520
699
  imported: "{{count}} импортировано",
521
700
  skippedCount: "{{count}} пропущено",
522
701
  moreErrors: "…ещё {{count}} ошибок",
702
+ moreErrors_one: "…ещё {{count}} ошибка",
703
+ moreErrors_few: "…ещё {{count}} ошибки",
704
+ moreErrors_many: "…ещё {{count}} ошибок",
705
+ moreErrors_other: "…ещё {{count}} ошибки",
523
706
  cancel: "Отмена",
524
707
  back: "Назад",
525
708
  next: "Далее",
526
709
  close: "Закрыть",
527
710
  importNRows: "Импортировать {{count}} строк",
711
+ importNRows_one: "Импортировать {{count}} строку",
712
+ importNRows_few: "Импортировать {{count}} строки",
713
+ importNRows_many: "Импортировать {{count}} строк",
714
+ importNRows_other: "Импортировать {{count}} строки",
528
715
  importingProgress: "Импортируется…",
529
716
  requiredMark: "*",
530
717
  required: "Обязательно",
@@ -536,17 +723,46 @@ const ru = {
536
723
  month: "Месяц",
537
724
  week: "Неделя",
538
725
  day: "День",
539
- agenda: "Расписание",
540
726
  allDay: "Весь день",
541
- noEvents: "Нет событий",
542
727
  newEvent: "Новое событие",
543
728
  moreEvents: "+{{count}} ещё",
729
+ unscheduled: "Без даты ({{count}})",
730
+ loading: "Загрузка календаря…",
731
+ loadError: "Ошибка: {{message}}",
732
+ configRequired: "Требуется настройка календаря. Укажите startDateField — единственный обязательный ключ календаря; заголовок события определяется и без titleField.",
733
+ configRequiredHint: "Он относится к блоку calendar представления. У страницы интерфейса нет собственного слота календаря: укажите в её sourceView представление, которое его объявляет.",
734
+ eventDetails: "Сведения о событии",
735
+ pullToRefresh: "Потяните для обновления",
736
+ refreshing: "Обновление…",
737
+ onDate: "{{date}}",
738
+ eventTitle: "Название",
739
+ eventTitlePlaceholder: "О чём это событие?",
740
+ creating: "Создание…",
741
+ titleRequired: "Укажите название",
742
+ a11y: {
743
+ region: "Календарь",
744
+ grid: "Сетка календаря",
745
+ goToToday: "Перейти к сегодняшнему дню",
746
+ previousPeriod: "Предыдущий период",
747
+ nextPeriod: "Следующий период",
748
+ currentDate: "Текущая дата: {{date}}",
749
+ dayCell: "{{date}}, событий: {{count}}",
750
+ dayCell_one: "{{date}}, {{count}} событие",
751
+ dayCell_few: "{{date}}, {{count}} события",
752
+ dayCell_many: "{{date}}, {{count}} событий",
753
+ dayCell_other: "{{date}}, событий: {{count}}",
754
+ resizeEventEnd: "Изменить окончание события",
755
+ resizeEventEndHint: "Перетащите, чтобы изменить дату окончания",
756
+ resizeStart: "Изменить начало",
757
+ resizeEnd: "Изменить окончание",
758
+ },
544
759
  },
545
760
  list: {
546
761
  firstRunTitle: "Здесь пока пусто",
547
762
  firstRunMessage: "Создайте первую запись, чтобы начать.",
548
763
  noMatches: "Подходящих записей нет",
549
764
  noMatchesMessage: "Ни одна запись не соответствует текущим фильтрам или поиску. Измените или сбросьте их.",
765
+ viewFilterNoMatchesMessage: "Ни одна запись не соответствует фильтру этого представления.",
550
766
  loadErrorTitle: "Не удалось загрузить записи",
551
767
  loadErrorMessage: "При загрузке данных произошла ошибка. Проверьте соединение и попробуйте снова.",
552
768
  loadErrorForbiddenTitle: "Нет доступа",
@@ -582,18 +798,32 @@ const ru = {
582
798
  },
583
799
  refresh: "Обновить",
584
800
  loading: "Загрузка записей…",
585
- recordCount: "{{count}} записей",
586
- recordCountOne: "{{count}} запись",
801
+ // objectui#11445 — a count family: each slot agrees the noun with the
802
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
803
+ // count-invariant form, answers a call made without a count.
804
+ recordCount: "Записей: {{count}}",
805
+ recordCount_one: "{{count}} запись",
806
+ recordCount_few: "{{count}} записи",
807
+ recordCount_many: "{{count}} записей",
808
+ recordCount_other: "{{count}} записи",
587
809
  addRecord: "Добавить запись",
810
+ // objectui#12703 — the compact list's footer link to the object's list or the block's view.
811
+ viewAll: "Показать все",
588
812
  tabs: "Вкладки",
589
813
  allRecords: "Все записи",
590
814
  search: "Поиск",
591
815
  filter: "Фильтр",
592
816
  filterRecords: "Фильтр записей",
817
+ filterActive: "Фильтр, активных: {{count}}",
818
+ filterActive_one: "Фильтр, {{count}} активный",
819
+ filterActive_few: "Фильтр, {{count}} активных",
820
+ filterActive_many: "Фильтр, {{count}} активных",
821
+ filterActive_other: "Фильтр, активных: {{count}}",
593
822
  sort: "Сортировка",
594
823
  sortRecords: "Сортировка записей",
595
824
  sortByIdSuffix: "(по ID)",
596
825
  sortRelationalHint: "Столбцы, ссылающиеся на другую запись, здесь не показаны: их можно сортировать только по сохранённому ID, а не по имени, которое видно в ячейке. Чтобы сортировать по этому имени, денормализуйте его в этот объект — как сохраняемое поле, которое записывается при изменении источника, — и сортируйте по нему. Не поле-формула: она виртуальна, столбец для неё не хранится, и сервер отказывается сортировать по ней.",
826
+ sortRelationalPicked: "Связанный столбец сортируется по сохранённому ID, а не по отображаемому имени.",
597
827
  resetSortToDefault: "Сбросить к сортировке представления",
598
828
  group: "Группировка",
599
829
  groupBy: "Группировать по",
@@ -614,14 +844,15 @@ const ru = {
614
844
  print: "Печать",
615
845
  hideFieldsTitle: "Скрыть поля",
616
846
  dataLimitReached: "Отображаются первые {{limit}} записей. Возможно, есть ещё данные.",
617
- viewSettings: "Настройки представления",
618
- viewSettingsHint: "Группировка, цвет, плотность и отображаемые поля.",
847
+ display: "Отображение",
848
+ layout: "Макет",
849
+ rowNumbers: "Номера строк",
850
+ resetToViewDefault: "Сбросить к настройкам представления",
619
851
  addGroup: "Добавить поле группировки",
620
852
  collapsedByDefault: "Свёрнуто по умолчанию",
621
853
  removeGroup: "Удалить",
622
854
  inlineEditShort: "Встроенное редактирование",
623
855
  inlineEditLabel: "Редактировать записи в таблице (щёлкните ячейку для редактирования)",
624
- recordEditingTitle: "Редактирование записей",
625
856
  },
626
857
  managedByBadge: {
627
858
  systemWritable: {
@@ -652,6 +883,7 @@ const ru = {
652
883
  },
653
884
  kanban: {
654
885
  uncategorized: "Без категории",
886
+ loadMore: "Загрузить ещё",
655
887
  columns: "колонок",
656
888
  addCard: "Добавить карточку",
657
889
  addColumn: "Добавить колонку",
@@ -659,13 +891,28 @@ const ru = {
659
891
  deleteCard: "Удалить карточку",
660
892
  deleteColumn: "Удалить колонку",
661
893
  noCards: "Нет карточек",
894
+ columnCards: "Карточки в колонке {{column}}",
895
+ laneCards: "Карточки: {{column}} - {{lane}}",
662
896
  cardTitlePlaceholder: "Введите название карточки…",
663
897
  requiredFieldsTitle: "Заполните обязательные поля",
664
898
  requiredFieldsDescription: "Это перемещение делает поля ниже обязательными. Заполните их, чтобы продолжить.",
899
+ dnd: {
900
+ start: "Карточка {{card}} взята в колонке {{column}}.",
901
+ overCard: "Карточка {{card}} над карточкой {{target}} в колонке {{column}}.",
902
+ overColumn: "Карточка {{card}} над колонкой {{column}}.",
903
+ overNone: "Карточка {{card}} не находится ни над одной колонкой.",
904
+ moved: "Карточка {{card}} перемещена в колонку {{column}}.",
905
+ dropped: "Карточка {{card}} отпущена. Она остаётся в колонке {{column}}.",
906
+ cancelled: "Перетаскивание отменено. Карточка {{card}} остаётся в колонке {{column}}.",
907
+ untitledCard: "без названия",
908
+ unnamedColumn: "без названия",
909
+ instructions: "Чтобы переместить карточку в другую колонку, перетащите её мышью или касанием.",
910
+ dragging: "Перетаскивается карточка {{card}}",
911
+ },
665
912
  },
666
913
  timeline: {
667
914
  bucket: {
668
- overdue: "Просрочено",
915
+ earlier: "Ранее",
669
916
  today: "Сегодня",
670
917
  tomorrow: "Завтра",
671
918
  thisWeek: "На этой неделе",
@@ -680,6 +927,17 @@ const ru = {
680
927
  },
681
928
  gantt: {
682
929
  rowLabel: "Элементы",
930
+ unusableRange: {
931
+ malformedDate: "Непригодный диапазон дат гантта — {{path}} равно {{value}}, что не является корректной датой. Все даты гантта должны разбираться: startDate и endDate каждого элемента строки, а также minDate / maxDate, заданные в схеме.",
932
+ malformedRow: "Непригодные строки гантта — {{path}} равно {{value}}, что не является формой строки. Гантт читает items как список строк, каждую строку — как объект с label и собственными items, а items каждой строки — как список полос; null, число, строка или простой объект в любом из этих мест не могут быть отрисованы.",
933
+ inverted: "Непригодный диапазон дат гантта — minDate {{minDate}} позже maxDate {{maxDate}}. Заданные minDate / maxDate имеют приоритет над диапазоном, вычисленным по строкам, поэтому у этой оси нет столбцов и полосу разместить негде; поменяйте оба значения местами.",
934
+ },
935
+ },
936
+ unsupported: {
937
+ objectBoundGantt: "Неподдерживаемый вариант \"gantt\" — временная шкала, привязанная к объекту, отображает ленточные варианты ({{variants}}). Для гантта нужны литеральные строки, каждая со своим вложенным items, поэтому ось гантта (scale) здесь не действует.",
938
+ },
939
+ unconfigured: {
940
+ noDateAxis: "Требуется ось дат временной шкалы — это представление не объявляет ни одного поля даты, а временная шкала, привязанная к объекту, не придумывает его сама. Объявите одно из: {{fields}}. Первое — написание из спецификации, остальные — устаревшие псевдонимы.",
683
941
  },
684
942
  },
685
943
  gantt: {
@@ -697,6 +955,7 @@ const ru = {
697
955
  },
698
956
  aria: {
699
957
  taskList: "Список задач",
958
+ refreshing: "Обновление…",
700
959
  },
701
960
  tooltip: {
702
961
  days: "дн",
@@ -742,13 +1001,25 @@ const ru = {
742
1001
  conflict: {
743
1002
  title: "Конфликт расписания",
744
1003
  body: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
1004
+ body_one: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
1005
+ body_few: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
1006
+ body_many: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
1007
+ body_other: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
745
1008
  confirm: "Перепланировать автоматически",
746
1009
  cancel: "Оставить как есть",
747
1010
  },
748
1011
  autoScheduleDlg: {
749
1012
  title: "Автопланирование",
750
1013
  body: "Сдвинуть {{count}} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
1014
+ body_one: "Сдвинуть {{count}} задачу на более поздний срок, чтобы соблюсти связи зависимостей?",
1015
+ body_few: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
1016
+ body_many: "Сдвинуть {{count}} задач на более поздний срок, чтобы соблюсти связи зависимостей?",
1017
+ body_other: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
751
1018
  skipped: "{{count}} заблокированных задач(и) также нарушают связи и были пропущены.",
1019
+ skipped_one: "{{count}} заблокированная задача также нарушает связи и была пропущена.",
1020
+ skipped_few: "{{count}} заблокированные задачи также нарушают связи и были пропущены.",
1021
+ skipped_many: "{{count}} заблокированных задач также нарушают связи и были пропущены.",
1022
+ skipped_other: "{{count}} заблокированной задачи также нарушают связи и были пропущены.",
752
1023
  confirm: "Применить",
753
1024
  cancel: "Отмена",
754
1025
  none: "Все зависимости соблюдены — перепланировать нечего.",
@@ -827,10 +1098,14 @@ const ru = {
827
1098
  tabActionsFor: "Действия с представлением {{name}}",
828
1099
  readonlyAriaLabel: "Представление только для чтения",
829
1100
  readonlyTooltip: "Системное представление — определено в коде, только для чтения.",
1101
+ malformedFilter: "Фильтр этого представления некорректен, поэтому записи не отображаются: условие {{subject}} невозможно применить.",
1102
+ noObject: "Объект не указан: задайте {{property}} или dataSource.object.",
830
1103
  },
831
1104
  designer: {
832
1105
  undo: "Отменить",
833
1106
  redo: "Повторить",
1107
+ canvasMinimap: "Миникарта холста",
1108
+ versionHistory: "История версий",
834
1109
  },
835
1110
  detail: {
836
1111
  editInlineHint: "Дважды щёлкните для редактирования",
@@ -853,8 +1128,14 @@ const ru = {
853
1128
  addReaction: "Добавить реакцию",
854
1129
  pageHeaderActions: "Действия в заголовке страницы",
855
1130
  emojiPicker: "Выбор эмодзи",
856
- reactionCount: "{{emoji}} {{count}} реакций",
857
- reactionCountOne: "{{emoji}} {{count}} реакция",
1131
+ // objectui#11445 — a count family: each slot agrees the noun with the
1132
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
1133
+ // count-invariant form, answers a call made without a count.
1134
+ reactionCount: "{{emoji}} Реакций: {{count}}",
1135
+ reactionCount_one: "{{emoji}} {{count}} реакция",
1136
+ reactionCount_few: "{{emoji}} {{count}} реакции",
1137
+ reactionCount_many: "{{emoji}} {{count}} реакций",
1138
+ reactionCount_other: "{{emoji}} {{count}} реакции",
858
1139
  recordDetail: "Сведения о записи",
859
1140
  recordDetailWithLabel: "Сведения: {{label}}",
860
1141
  openAsFullPage: "Открыть на всю страницу",
@@ -881,7 +1162,6 @@ const ru = {
881
1162
  viewAll: "Показать все",
882
1163
  new: "Создать",
883
1164
  add: "Добавить",
884
- emptyValue: "—",
885
1165
  activity: "Активность",
886
1166
  editRow: "Редактировать",
887
1167
  deleteRow: "Удалить",
@@ -893,6 +1173,7 @@ const ru = {
893
1173
  sortBy: "Сортировать по",
894
1174
  filterPlaceholder: "Фильтр…",
895
1175
  highlightFields: "Ключевые поля",
1176
+ highlightsLabel: "Ключевые поля записи",
896
1177
  comments: "Комментарии",
897
1178
  searchComments: "Поиск комментариев…",
898
1179
  addCommentPlaceholder: "Добавить комментарий… (Ctrl+Enter для отправки)",
@@ -903,11 +1184,26 @@ const ru = {
903
1184
  unpin: "Открепить",
904
1185
  justNow: "только что",
905
1186
  minutesAgo: "{{count}} мин. назад",
1187
+ minutesAgo_one: "{{count}} мин. назад",
1188
+ minutesAgo_few: "{{count}} мин. назад",
1189
+ minutesAgo_many: "{{count}} мин. назад",
1190
+ minutesAgo_other: "{{count}} мин. назад",
906
1191
  hoursAgo: "{{count}} ч. назад",
1192
+ hoursAgo_one: "{{count}} ч. назад",
1193
+ hoursAgo_few: "{{count}} ч. назад",
1194
+ hoursAgo_many: "{{count}} ч. назад",
1195
+ hoursAgo_other: "{{count}} ч. назад",
907
1196
  daysAgo: "{{count}} дн. назад",
1197
+ daysAgo_one: "{{count}} дн. назад",
1198
+ daysAgo_few: "{{count}} дн. назад",
1199
+ daysAgo_many: "{{count}} дн. назад",
1200
+ daysAgo_other: "{{count}} дн. назад",
908
1201
  dropFilesToUpload: "Перетащите файлы сюда или нажмите для загрузки",
909
1202
  attachmentCount: "{{count}} вложение",
910
- attachmentCountPlural: "{{count}} вложений",
1203
+ attachmentCount_one: "{{count}} вложение",
1204
+ attachmentCount_few: "{{count}} вложения",
1205
+ attachmentCount_many: "{{count}} вложений",
1206
+ attachmentCount_other: "{{count}} вложения",
911
1207
  removeAttachment: "Удалить вложение",
912
1208
  // Record Attachments panel (enable.files, objectstack#4358)
913
1209
  attachments: "Вложения",
@@ -916,6 +1212,7 @@ const ru = {
916
1212
  noAttachments: "Вложений пока нет. Загрузите файл, чтобы начать.",
917
1213
  downloadAttachment: "Скачать",
918
1214
  deleteAttachment: "Удалить вложение",
1215
+ deleteAttachmentConfirm: "Вы уверены, что хотите удалить вложение \"{{name}}\"?",
919
1216
  attachmentDeleteDenied: "Удалить это вложение может только загрузивший его пользователь или тот, кто может редактировать эту запись.",
920
1217
  attachmentParentAccessDenied: "У вас нет доступа для прикрепления файлов к этой записи.",
921
1218
  attachmentDownloadDenied: "У вас нет доступа для скачивания этого вложения.",
@@ -925,11 +1222,6 @@ const ru = {
925
1222
  attachmentsLoadFailed: "Не удалось загрузить вложения этой записи.",
926
1223
  attachmentsApiUnavailable: "Список вложений недоступен для этого объекта.",
927
1224
  retryLoadAttachments: "Повторить",
928
- unifiedDiff: "Единое представление",
929
- sideBySideDiff: "Параллельное представление",
930
- noChanges: "Нет изменений",
931
- previousVersion: "Предыдущая",
932
- currentVersion: "Текущая",
933
1225
  discussion: "Обсуждение",
934
1226
  showDiscussion: "Показать обсуждение ({{count}})",
935
1227
  hideDiscussion: "Скрыть обсуждение",
@@ -944,25 +1236,37 @@ const ru = {
944
1236
  writeComment: "Написать комментарий…",
945
1237
  subscribedTooltip: "Подписаны — нажмите для отписки",
946
1238
  unsubscribedTooltip: "Подписаться на уведомления",
947
- firstRecord: "Первая запись (Home)",
948
- previousRecordKey: "Предыдущая запись (←)",
949
- nextRecordKey: "Следующая запись (→)",
950
- lastRecord: "Последняя запись (End)",
951
1239
  noRecords: "Нет записей",
952
- searchWhileNavigating: "Поиск при навигации",
953
- searchRecords: "Поиск записей…",
954
1240
  allActivity: "Вся активность",
955
1241
  commentsOnly: "Только комментарии",
956
1242
  fieldChangesFilter: "Изменения полей",
957
1243
  tasksOnly: "Только задачи",
958
1244
  leaveCommentPlaceholder: "Оставить комментарий… (Ctrl+Enter для отправки)",
959
1245
  noActivity: "Нет зарегистрированной активности",
1246
+ activityAccessDenied: "У вас нет разрешения на просмотр активности этой записи.",
1247
+ commentsAccessDenied: "У вас нет разрешения на просмотр комментариев к этой записи.",
1248
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1249
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1250
+ // sentences, which are assembled in code and so need interpolation holes.
1251
+ allFilter: 'Все',
1252
+ createsFilter: 'Создания',
1253
+ deletesFilter: 'Удаления',
1254
+ statusChangesFilter: 'Изменения статуса',
1255
+ activityEmptyValue: '(пусто)',
1256
+ activityFieldChanged: 'Изменено поле {{field}} с «{{old}}» на «{{new}}»',
1257
+ activityCreated: 'Создал эту запись',
1258
+ activityDeleted: 'Удалил эту запись',
1259
+ activityStatusChanged: 'Изменил статус на «{{value}}»',
1260
+ activityUpdated: 'Обновил запись',
960
1261
  loadMore: "Загрузить ещё",
961
1262
  edited: "(изменено)",
962
1263
  via: "через {{source}}",
963
1264
  viewSource: "Показать источник",
964
1265
  replyCount: "{{count}} ответ",
965
- replyCountPlural: "{{count}} ответов",
1266
+ replyCount_one: "{{count}} ответ",
1267
+ replyCount_few: "{{count}} ответа",
1268
+ replyCount_many: "{{count}} ответов",
1269
+ replyCount_other: "{{count}} ответа",
966
1270
  replyPlaceholder: "Ответить…",
967
1271
  filterActivity: "Фильтр активности",
968
1272
  openDiscussion: "Открыть панель обсуждения",
@@ -974,9 +1278,12 @@ const ru = {
974
1278
  lockedByApproval: "Заблокировано для согласования",
975
1279
  lockedTooltip: "У этой записи есть ожидающий запрос на согласование; редактирование заблокировано",
976
1280
  writeStrippedTitle: "Сохранено, но часть полей не применена",
1281
+ writeWarningsTitle: "Сохранено, но есть предупреждения",
977
1282
  writeStrippedReadonly: "Поля только для чтения, поэтому не применены: {{fields}}",
978
1283
  writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не применены: {{fields}}",
979
1284
  writeStrippedPrimaryKey: "Идентификатор записи нельзя изменить при сохранении, поэтому поля не применены: {{fields}}",
1285
+ writeStrippedComputed: "Поля вычисляются сервером по формуле, поэтому отправленные значения не применены: {{fields}}",
1286
+ writeStrippedStoredExpression: "Поля вычисляются из записи, поэтому вместо отправленных значений сохранены вычисленные: {{fields}}",
980
1287
  writeStrippedUnknownReason: "Не применены сервером: {{fields}}",
981
1288
  approvalPendingEditable: "На согласовании · редактирование доступно",
982
1289
  approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
@@ -998,6 +1305,13 @@ const ru = {
998
1305
  pathStageLostUpcoming: '{{stage}}, проигран, не достигнут',
999
1306
  pathStageWonUpcoming: '{{stage}}, целевой этап, не достигнут',
1000
1307
  linkCopied: "Ссылка скопирована в буфер обмена",
1308
+ commentFailed: "Комментарий не опубликован. Ничего не сохранено — попробуйте ещё раз.",
1309
+ reactionFailed: "Реакция не сохранена. Попробуйте ещё раз.",
1310
+ editComment: "Редактировать комментарий",
1311
+ deleteComment: "Удалить комментарий",
1312
+ deleteCommentConfirm: "Вы уверены, что хотите удалить этот комментарий?",
1313
+ commentEditFailed: "Изменения не сохранены. Комментарий сохраняет прежний текст.",
1314
+ commentDeleteFailed: "Комментарий не удалён. Попробуйте ещё раз.",
1001
1315
  linkCopyFailed: "Не удалось скопировать ссылку",
1002
1316
  cancel: "Отмена",
1003
1317
  cancelEdit: "Отменить изменения",
@@ -1018,39 +1332,70 @@ const ru = {
1018
1332
  deleteRowTitle: "Удалить запись",
1019
1333
  createdBy: "Создано",
1020
1334
  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/…
1335
+ // objectui#3863 — base key, answering only a call made without a count: since
1336
+ // objectui#11432 every ru category has its own slot — `_one` 1/21/31…, `_few`
1337
+ // 2-4/22-24… and `_many` 0/5-20… (genitive plural after the substantivised
1338
+ // adjective in both), `_other` fractions (genitive singular). The base keeps the
1339
+ // count-invariant «Существительное: {{count}}» form.
1027
1340
  showEmptyRelated: "+ Пустых: {{count}}",
1028
1341
  showEmptyRelated_one: "+ {{count}} пустое",
1029
- showEmptyRelated_other: "+ {{count}} пустых",
1342
+ showEmptyRelated_few: "+ {{count}} пустых",
1343
+ showEmptyRelated_many: "+ {{count}} пустых",
1344
+ showEmptyRelated_other: "+ {{count}} пустого",
1030
1345
  copyEmail: "Копировать email",
1031
1346
  copyPhone: "Копировать телефон",
1032
1347
  copyRecordId: "Копировать ID записи",
1033
1348
  showEmptyFields: "Показать {{count}} пустых полей",
1349
+ showEmptyFields_one: "Показать {{count}} пустое поле",
1350
+ showEmptyFields_few: "Показать {{count}} пустых поля",
1351
+ showEmptyFields_many: "Показать {{count}} пустых полей",
1352
+ showEmptyFields_other: "Показать {{count}} пустого поля",
1034
1353
  hideEmptyFields: "Скрыть пустые поля",
1035
1354
  noValue: "Нет значения",
1355
+ unresolvedReference: "Неразрешённая ссылка: {{value}} не удалось сопоставить с пользователем",
1356
+ unresolvedLookupReference: "Неразрешённая ссылка: {{value}} не удалось сопоставить с записью на этом экране",
1357
+ repeaterItemCount: "Элементов: {{count}}",
1358
+ repeaterItemCount_one: "{{count}} элемент",
1359
+ repeaterItemCount_few: "{{count}} элемента",
1360
+ repeaterItemCount_many: "{{count}} элементов",
1361
+ repeaterItemCount_other: "{{count}} элемента",
1362
+ fileCount: "Файлов: {{count}}",
1363
+ fileCount_one: "{{count}} файл",
1364
+ fileCount_few: "{{count}} файла",
1365
+ fileCount_many: "{{count}} файлов",
1366
+ fileCount_other: "{{count}} файла",
1036
1367
  },
1037
1368
  chart: {
1038
- noData: "Нет данных для графика",
1039
1369
  loading: "Загрузка графика…",
1370
+ refreshing: "Обновление…",
1040
1371
  nullCategory: "(Не указано)",
1041
- },
1042
- map: {
1043
- searchLocations: "Поиск местоположений…",
1044
- locationDetails: "Детали местоположения",
1045
- markersCount: "{{count}} маркеров",
1046
- invalidCoordinates: "{{count}} запись с отсутствующими или недействительными координатами исключена из карты.",
1047
- invalidCoordinatesPlural: "{{count}} записей с отсутствующими или недействительными координатами исключены из карты.",
1372
+ scatterOneMeasure: "Точечная диаграмма строит только одну меру. Оставьте один ряд:",
1373
+ unconfigured: {
1374
+ noCategoryAxis: "Требуется ось категорий диаграммы — диаграмма, привязанная к объекту, не придумывает её. Объявите одно из:",
1375
+ },
1048
1376
  },
1049
1377
  dashboard: {
1050
- noRows: "Нет строк",
1378
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1379
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1380
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1381
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1382
+ // read them. The copy here has to read as a state rather than a failure,
1383
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1384
+ // punctuation so the call site concatenates no separator (see
1385
+ // `WidgetEmptyState`).
1386
+ empty: {
1387
+ title: "Данных пока нет",
1388
+ message: "Виджет успешно загружен, но запрос пока не вернул ни одной записи.",
1389
+ sourceLabel: "Источник данных:",
1390
+ },
1051
1391
  loading: "Загрузка…",
1392
+ refreshing: "Обновление…",
1393
+ refreshAll: "Обновить все",
1394
+ refreshDashboard: "Обновить дашборд",
1052
1395
  pickMeasures: "Выберите меры (значения) для этого виджета набора данных.",
1053
1396
  datasetUnsupported: "Этот источник данных не поддерживает запросы к наборам данных.",
1397
+ widgetForbiddenTitle: "Нет доступа",
1398
+ widgetForbiddenMessage: "У вас нет прав на просмотр данных этого виджета.",
1054
1399
  details: "Подробности",
1055
1400
  exportCsv: "Экспорт в CSV",
1056
1401
  openInList: "Открыть в списке",
@@ -1078,12 +1423,10 @@ const ru = {
1078
1423
  },
1079
1424
  },
1080
1425
  addWidget: "Добавить виджет",
1081
- removeWidget: "Удалить виджет",
1082
1426
  editLayout: "Редактировать макет",
1083
1427
  saveLayout: "Сохранить макет",
1084
1428
  resetLayout: "Сбросить макет",
1085
1429
  total: "Итого",
1086
- noDataAvailable: "Данные недоступны",
1087
1430
  noDataSourceFor: "Нет источника данных для",
1088
1431
  config: {
1089
1432
  breadcrumb: {
@@ -1205,10 +1548,6 @@ const ru = {
1205
1548
  appDescription: "Описание",
1206
1549
  appIcon: "Значок",
1207
1550
  template: "Шаблон",
1208
- layout: "Макет",
1209
- layoutSidebar: "Боковая панель",
1210
- layoutHeader: "Заголовок",
1211
- layoutEmpty: "Пусто",
1212
1551
  selectObjects: "Выбрать объекты",
1213
1552
  searchObjects: "Поиск объектов…",
1214
1553
  selectAll: "Выбрать все",
@@ -1217,7 +1556,6 @@ const ru = {
1217
1556
  addGroup: "Добавить группу",
1218
1557
  addUrl: "Добавить URL",
1219
1558
  addSeparator: "Добавить разделитель",
1220
- noNavItems: "Элементов навигации пока нет.",
1221
1559
  logoUrl: "Logo URL",
1222
1560
  primaryColor: "Основной цвет",
1223
1561
  faviconUrl: "Favicon URL",
@@ -1244,13 +1582,12 @@ const ru = {
1244
1582
  appearance: "Внешний вид",
1245
1583
  rowHeight: "Высота строки",
1246
1584
  livePreview: "Предпросмотр в реальном времени",
1247
- stepBasicDesc: "Имя, заголовок и макет",
1585
+ stepBasicDesc: "Имя, заголовок и значок",
1248
1586
  stepObjectsDesc: "Выбрать бизнес-объекты",
1249
1587
  stepNavigationDesc: "Построить дерево навигации",
1250
1588
  stepBrandingDesc: "Логотип, цвета и фавикон",
1251
1589
  noObjectsFound: "Объекты не найдены.",
1252
1590
  noNavItemsHint: "Элементов навигации пока нет. Выберите объекты на предыдущем шаге или добавьте вручную.",
1253
- separator: "Разделитель",
1254
1591
  separatorLabel: "— Разделитель —",
1255
1592
  newGroup: "Новая группа",
1256
1593
  newLink: "Новая ссылка",
@@ -1284,6 +1621,7 @@ const ru = {
1284
1621
  navTypeSeparator: "Разделитель",
1285
1622
  navTypeAction: "Действие",
1286
1623
  navTypeComponent: "Компонент",
1624
+ navTypeDoc: "Документ",
1287
1625
  navEditIcon: "Редактировать значок",
1288
1626
  navToggleVisible: "Переключить видимость",
1289
1627
  navHidden: "Скрыто",
@@ -1361,11 +1699,8 @@ const ru = {
1361
1699
  defaultValue: "Значение по умолчанию",
1362
1700
  placeholder: "Заполнитель",
1363
1701
  referenceTo: "Ссылка на",
1364
- formula: "Формула",
1365
1702
  options: "Параметры",
1366
1703
  addOption: "Добавить параметр",
1367
- validationRules: "Правила валидации",
1368
- addRule: "Добавить правило",
1369
1704
  systemBadge: "Система",
1370
1705
  ungrouped: "Общее",
1371
1706
  deleteConfirmTitle: "Удалить поле?",
@@ -1384,16 +1719,35 @@ const ru = {
1384
1719
  },
1385
1720
  },
1386
1721
  console: {
1722
+ studio: {
1723
+ title: "Studio",
1724
+ accessRequired: "Чтобы открыть Studio, нужен доступ к Studio.",
1725
+ },
1387
1726
  saveAdvisoryTitle: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1727
+ saveAdvisoryTitle_one: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1728
+ saveAdvisoryTitle_few: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1729
+ saveAdvisoryTitle_many: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1730
+ saveAdvisoryTitle_other: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1731
+ publishAdvisoryTitle: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1732
+ publishAdvisoryTitle_one: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1733
+ publishAdvisoryTitle_few: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1734
+ publishAdvisoryTitle_many: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1735
+ publishAdvisoryTitle_other: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1736
+ importMappingsUnavailable: "Не удалось загрузить сохранённые сопоставления импорта для {{object}}",
1737
+ importMappingsRefused: "Сервер отклонил этот запрос, поэтому список пуст из-за того, что его не удалось прочитать, а не потому, что ничего не зарегистрировано. Войдите заново или запросите доступ у администратора.",
1738
+ importMappingsUnreadable: "Список пуст из-за того, что его не удалось прочитать, а не потому, что ничего не зарегистрировано. Повторите попытку и сообщите о проблеме, если она повторяется.",
1739
+ savedViewsUnavailable: "Не удалось загрузить сохранённые представления для {{object}}",
1740
+ savedViewsRefused: "Сервер отклонил этот запрос, поэтому список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Войдите заново или запросите доступ у администратора.",
1741
+ savedViewsUnreadable: "Список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Повторите попытку и сообщите о проблеме, если она повторяется.",
1388
1742
  settingsHub: {
1389
1743
  title: "Настройки",
1390
- subtitle: "Настройте рабочее пространство, интеграции и флаги функций.",
1744
+ subtitle: "Настройте систему, интеграции и флаги функций.",
1391
1745
  loadError: "Не удалось загрузить настройки",
1392
1746
  empty: "Настройки не зарегистрированы. Плагины могут регистрировать манифесты настроек через SettingsService.",
1393
1747
  settingsCount: "Настроек: {{n}}",
1394
1748
  beta: "Бета",
1395
1749
  categories: {
1396
- Workspace: "Рабочее пространство",
1750
+ Workspace: "Общие",
1397
1751
  Communication: "Коммуникации",
1398
1752
  Security: "Безопасность",
1399
1753
  Infrastructure: "Инфраструктура",
@@ -1440,13 +1794,22 @@ const ru = {
1440
1794
  },
1441
1795
  usage: {
1442
1796
  title: "Использование ИИ",
1443
- meterBuild: "Сборка",
1444
- meterAsk: "Вопрос",
1797
+ poolUsed: "Использовано {{percent}}",
1445
1798
  statusOk: "Осталось много",
1446
1799
  statusLow: "Заканчивается",
1447
1800
  statusFull: "Лимит исчерпан",
1448
1801
  resetsDaily: "Сбросится сегодня ночью",
1449
1802
  resetsMonthly: "Сбросится в следующем цикле",
1803
+ resetsWeeklyDays: "Сброс через {{count}} дней",
1804
+ resetsWeeklyDays_one: "Сброс через {{count}} день",
1805
+ resetsWeeklyDays_few: "Сброс через {{count}} дня",
1806
+ resetsWeeklyDays_many: "Сброс через {{count}} дней",
1807
+ resetsWeeklyDays_other: "Сброс через {{count}} дня",
1808
+ resetsWeeklyHours: "Сброс через {{count}} часов",
1809
+ resetsWeeklyHours_one: "Сброс через {{count}} час",
1810
+ resetsWeeklyHours_few: "Сброс через {{count}} часа",
1811
+ resetsWeeklyHours_many: "Сброс через {{count}} часов",
1812
+ resetsWeeklyHours_other: "Сброс через {{count}} часа",
1450
1813
  ctaUpgrade: "Повысьте тариф, чтобы продолжить",
1451
1814
  ctaTopUp: "Добавьте кредиты, чтобы продолжить",
1452
1815
  ariaLabel: "Использование ИИ: {{status}}",
@@ -1459,6 +1822,31 @@ const ru = {
1459
1822
  share: "Поделиться",
1460
1823
  shareTitle: "Поделиться этим диалогом",
1461
1824
  shareDisabledTitle: "Начните диалог, чтобы включить публикацию",
1825
+ buildDoctor: "Диагностика сборки",
1826
+ buildDoctorTitle: "Диагностика сборки — что на самом деле применено?",
1827
+ buildDoctorDisabledTitle: "Сначала отправьте сообщение",
1828
+ buildDoctorDrawer: {
1829
+ description: 'Что заявил агент и что на самом деле действует. Диагностика только для чтения.',
1830
+ reconciling: 'Сверка…',
1831
+ notAvailable: 'Недоступно — беседа не найдена или у вас нет доступа.',
1832
+ untitled: '(без названия)',
1833
+ summary: 'Ходов: {{turns}} · сообщений: {{messages}} · токенов: {{tokens}} · LLM: {{seconds}} с',
1834
+ allLive: 'Все попытки изменений ({{count}}) действуют — ничего не потерялось.',
1835
+ discrepancies: 'Расхождений: {{count}} — сказанное в чате не совпадает с тем, что действует.',
1836
+ orphanedTitle: 'Предложено, но не применено',
1837
+ orphanedHint: 'Карточку подтверждения, предложенную агентом, не применил ни один последующий ход — изменение незаметно потерялось.',
1838
+ missingTitle: 'Заявлено, но отсутствует',
1839
+ missingHint: 'Результат инструмента сообщил, что изменение применено, но артефакт не действует в sys_metadata.',
1840
+ toolErrorsTitle: 'Ошибки инструментов',
1841
+ toolErrorsHint: 'Вызовы инструментов, вернувшие ошибку во время сборки.',
1842
+ verifyTitle: 'Проверка сборки (verify_build)',
1843
+ yourApp: 'Ваше приложение:',
1844
+ noIssues: 'Проблем: 0',
1845
+ issueCount: 'Проблем: {{count}}',
1846
+ platformNoise: 'Скрыто находок платформы sys_*: {{count}}',
1847
+ pendingActions: 'Ожидающие действия',
1848
+ timeline: 'Хронология ({{count}})',
1849
+ },
1462
1850
  newChat: "Создать",
1463
1851
  searchChats: "Поиск по чатам…",
1464
1852
  noChatsYet: "Чатов пока нет",
@@ -1481,6 +1869,8 @@ const ru = {
1481
1869
  liveCanvasUnlisted: "Работающее приложение — {{app}} (скрыто до публикации)",
1482
1870
  loadingAgents: "Загрузка агентов…",
1483
1871
  askAnything: "Спросите о чём угодно…",
1872
+ askOrChangeApp: "Спросите о данных или попросите меня изменить это приложение…",
1873
+ describeAppToBuild: "Опишите приложение, которое хотите создать, или что изменить…",
1484
1874
  emptyTitle: "Начните диалог",
1485
1875
  emptyDescription: "Спросите о чём угодно — ассистент видит контекст вашего текущего приложения.",
1486
1876
  switchAssistant: "Сменить ассистента",
@@ -1488,7 +1878,7 @@ const ru = {
1488
1878
  empty: {
1489
1879
  build: {
1490
1880
  title: "Создать с помощью ИИ",
1491
- description: "Опишите приложение или процесс обычными словами — я подготовлю объекты, экраны и автоматизации, а вы проверите и опубликуете.",
1881
+ description: "Опишите приложение обычными словами — я подготовлю объекты, экраны и демонстрационные данные, а вы проверите и опубликуете.",
1492
1882
  },
1493
1883
  ask: {
1494
1884
  title: "Спросите свои данные",
@@ -1497,17 +1887,22 @@ const ru = {
1497
1887
  editApp: {
1498
1888
  title: "Редактирование «{{app}}»",
1499
1889
  titleGeneric: "Редактировать это приложение",
1500
- description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или автоматизацию либо скорректирую существующее.",
1890
+ description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или дашборд либо скорректирую существующее.",
1501
1891
  },
1502
1892
  },
1503
1893
  clearConversation: "Очистить",
1504
1894
  sendHint: "чтобы отправить",
1895
+ newlineHint: "для новой строки",
1505
1896
  agentActivity: "Активность агента",
1506
1897
  toolCompleted: "Завершено",
1507
1898
  toolRunning: "Выполняется",
1508
1899
  toolAwaitingApproval: "Ожидает подтверждения",
1509
1900
  toolFailed: "Ошибка",
1510
1901
  toolDetailsHidden: "Входные данные инструментов и необработанные результаты в этом режиме скрыты.",
1902
+ toolDenyReason: "Отклонено оператором в чате",
1903
+ builderHandoffTitle: "Создать в конструкторе",
1904
+ builderHandoffOpen: "Открыть в конструкторе →",
1905
+ builderHandoffSuperseded: "Есть более новый запрос",
1511
1906
  copy: "Копировать",
1512
1907
  copied: "Скопировано",
1513
1908
  regenerate: "Сгенерировать заново",
@@ -1522,7 +1917,7 @@ const ru = {
1522
1917
  publishOk: "Опубликовано — объекты активны.",
1523
1918
  seedWarn: "Опубликовано, но часть примеров данных загрузить не удалось.",
1524
1919
  openBuiltApp: "Открыть приложение",
1525
- designBuiltApp: "Открыть в Studio",
1920
+ viewBuiltAppInStudio: "Открыть в Studio",
1526
1921
  previewDraft: "Предпросмотр",
1527
1922
  previewApp: "Предпросмотр приложения",
1528
1923
  resizeSplit: "Изменить размер чата и предпросмотра",
@@ -1550,23 +1945,41 @@ const ru = {
1550
1945
  recentRecords: "Перечисли 5 последних созданных записей.",
1551
1946
  recordCounts: "Посчитай количество записей по каждому объекту.",
1552
1947
  },
1948
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1949
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1950
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1951
+ // wording that promises autonomous behaviour (alert / remind / notify /
1952
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1953
+ // the model silently degrades such a request into a board or a filtered
1954
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1955
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1553
1956
  metadataAssistant: {
1554
- buildCrm: "Создай CRM для продаж — клиенты, контакты и воронка сделок с итогами по этапам.",
1555
- buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам.",
1556
- buildFlow: "Спроектируй службу поддержки — заявки с приоритетом, процесс статусов и связи с клиентами.",
1557
- buildInventory: "Создай приложение для склада — товары, остатки, поставщики и индикация низких остатков.",
1558
- buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, этапы собеседований и заметки.",
1957
+ buildCrm: "Создай CRM для продаж — клиенты, контакты и сделки с полем этапа, а также дашборд с суммой сделок по этапам.",
1958
+ buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам и календарь сроков.",
1959
+ buildFlow: "Спроектируй службу поддержки — заявки с полями приоритета и статуса, доска по статусам и связи с клиентами.",
1960
+ buildInventory: "Создай приложение для склада — товары, остатки, поставщики и представление, отбирающее товары ниже точки заказа.",
1961
+ buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, поле этапа собеседования и доска по этапам.",
1559
1962
  },
1560
1963
  generic: {
1561
1964
  help: "Чем ты можешь мне помочь?",
1562
1965
  availableObjects: "Перечисли доступные объекты данных.",
1563
1966
  recentActivity: "Сделай сводку моей недавней активности.",
1564
1967
  },
1968
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1969
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1970
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1971
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1972
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1973
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1974
+ // no data is what an existing app most often lacks. REVERT: when
1975
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1976
+ // comes back as `addAutomation`; the retired string is pinned for every
1977
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1565
1978
  editApp: {
1566
1979
  addField: "Добавь поле в один из объектов.",
1567
1980
  addObject: "Добавь новый объект и свяжи его с существующим.",
1568
1981
  addDashboard: "Добавь дашборд с ключевыми показателями.",
1569
- addAutomation: "Добавь автоматизацию — согласование, процесс статусов или уведомление.",
1982
+ addSampleData: "Заполни существующие объекты правдоподобными демонстрационными записями, чтобы приложение можно было показать.",
1570
1983
  },
1571
1984
  },
1572
1985
  changesTitle: "Подтвердите изменения",
@@ -1631,6 +2044,7 @@ const ru = {
1631
2044
  collapse: "Свернуть чат",
1632
2045
  maximize: "Открыть на всю страницу",
1633
2046
  open: "Открыть ассистента",
2047
+ planAwaitingApproval: "Предложенный план ожидает вашего подтверждения",
1634
2048
  },
1635
2049
  group: {
1636
2050
  today: "Сегодня",
@@ -1641,13 +2055,17 @@ const ru = {
1641
2055
  },
1642
2056
  },
1643
2057
  title: "Консоль ObjectStack",
1644
- initializing: "Инициализация приложения…",
1645
- loadingHint: "Настройка нового окружения может занять некоторое время.",
2058
+ initializing: "Открытие консоли…",
2059
+ skipToContent: "Перейти к содержимому",
1646
2060
  breadcrumb: {
1647
- dashboards: "Панели",
1648
- pages: "Страницы",
1649
- reports: "Отчёты",
1650
2061
  system: "Система",
2062
+ marketplace: "Маркетплейс",
2063
+ settings: 'Настройки',
2064
+ apps: 'Приложения',
2065
+ profile: 'Профиль',
2066
+ approvals: 'Согласования',
2067
+ aiApprovals: 'Согласования ИИ',
2068
+ auditLog: 'Журнал аудита',
1651
2069
  },
1652
2070
  // objectui#4024 — the single-namespace settings screen. Its sibling
1653
2071
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1667,17 +2085,35 @@ const ru = {
1667
2085
  saveChanges: "Сохранить изменения",
1668
2086
  unsavedCount: "Несохранённых изменений: {{count}}",
1669
2087
  unsavedCount_one: "{{count}} несохранённое изменение",
1670
- unsavedCount_other: "{{count}} несохранённых изменений",
2088
+ unsavedCount_few: "{{count}} несохранённых изменения",
2089
+ unsavedCount_many: "{{count}} несохранённых изменений",
2090
+ unsavedCount_other: "{{count}} несохранённого изменения",
2091
+ fieldErrorsToast: "Настройки, требующие внимания ({{count}}): {{settings}}",
2092
+ fieldErrorsToast_one: "{{count}} настройка требует внимания: {{settings}}",
2093
+ fieldErrorsToast_few: "{{count}} настройки требуют внимания: {{settings}}",
2094
+ fieldErrorsToast_many: "{{count}} настроек требуют внимания: {{settings}}",
2095
+ fieldErrorsToast_other: "{{count}} настройки требуют внимания: {{settings}}",
1671
2096
  cryptoRefusalTitle: "Эта установка не может шифровать секреты",
1672
2097
  cryptoRefusalSubjectSuffix: "объявлен зашифрованным, поэтому ничего не было записано.",
1673
2098
  cryptoRefusalNoSubject: "Значение, объявленное зашифрованным, было отклонено, поэтому ничего не было записано.",
1674
2099
  cryptoRefusalToast: "Не удалось зашифровать секреты: {{subject}}",
1675
2100
  cryptoRefusalToastNoSubject: "Не удалось зашифровать секреты",
1676
- },
1677
- loadingSteps: {
1678
- connecting: "Подключение к источнику данных",
1679
- loadingConfig: "Загрузка конфигурации",
1680
- preparingWorkspace: "Подготовка рабочего пространства",
2101
+ sourceBadgeInherited: "Унаследовано: {{source}}",
2102
+ sourceBadgeOverrides: "Переопределяет: {{source}}",
2103
+ resetToDefault: "Сбросить к значению по умолчанию",
2104
+ envLockBadge: "Задано окружением",
2105
+ envLockBadgeTitle: "Закреплено переменной окружения — изменить в интерфейсе нельзя.",
2106
+ deprecatedBadge: "Устарело",
2107
+ deprecatedBadgeReplacedBy: "Устарело → {{replacedBy}}",
2108
+ unsupportedSpecifierType: "Неподдерживаемый тип настройки: {{type}}",
2109
+ },
2110
+ workspaceTimezonePrompt: {
2111
+ title: "Задайте часовой пояс системы",
2112
+ description: "В этой системе всё ещё используется часовой пояс платформы по умолчанию — {{current}}. Часовой пояс системы определяет, что означает «сегодня» в формулах, как отчёты группируют данные по датам и как отображаются дата и время, — для всех в системе. Ниже указан часовой пояс вашего браузера.",
2113
+ laterHint: "Его можно изменить в любое время на странице «Настройки».",
2114
+ decline: "Оставить по умолчанию",
2115
+ confirm: "Задать часовой пояс",
2116
+ saved: "Часовой пояс системы: {{zone}}",
1681
2117
  },
1682
2118
  error: {
1683
2119
  connectionFailed: "Не удаётся подключиться к серверу",
@@ -1702,27 +2138,28 @@ const ru = {
1702
2138
  groups: {
1703
2139
  general: "Общие",
1704
2140
  navigation: "Навигация",
1705
- dataViews: "Представления данных",
1706
2141
  aiChat: "Ассистент ИИ",
1707
- preferences: "Настройки",
1708
2142
  },
1709
2143
  openCommandPalette: "Открыть палитру команд",
1710
2144
  showShortcuts: "Показать горячие клавиши",
1711
2145
  closeDialog: "Закрыть диалог / панель",
1712
2146
  toggleSidebar: "Переключить боковую панель",
1713
- focusSearch: "Фокус на поиске",
1714
- createRecord: "Создать новую запись",
1715
- refreshData: "Обновить данные",
1716
- editRecord: "Редактировать выбранную запись",
1717
2147
  newChat: "Новый чат",
1718
2148
  toggleChatsList: "Переключить список чатов",
1719
- toggleDarkMode: "Переключить тёмный режим",
2149
+ goHome: "Вернуться на главную",
2150
+ },
2151
+ reportIndex: {
2152
+ title: "Отчёты",
2153
+ emptyTitle: "Нет отчётов",
2154
+ emptyDescription: "В этом приложении нет отчётов, которые вы можете открыть.",
1720
2155
  },
1721
2156
  commandPalette: {
1722
2157
  title: "Палитра команд",
1723
2158
  placeholder: "Введите команду или поиск…",
1724
2159
  noResults: "Результаты не найдены.",
1725
2160
  objects: "Объекты",
2161
+ packages: "Пакеты",
2162
+ flows: "Потоки",
1726
2163
  dashboards: "Панели мониторинга",
1727
2164
  pages: "Страницы",
1728
2165
  reports: "Отчёты",
@@ -1739,6 +2176,21 @@ const ru = {
1739
2176
  records: "Записи",
1740
2177
  recentRecords: "Недавно просмотренные",
1741
2178
  },
2179
+ // objectui#9954 — see the `en` pack for what raises each case.
2180
+ readRate: {
2181
+ ratioTitle: 'Необычный объём чтения в этой системе',
2182
+ ratio: 'На каждую записанную строку читается {{ratio}} строк. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.',
2183
+ noWritesTitle: 'Чтение вообще без записи в этой системе',
2184
+ noWrites: 'Строки читаются, но не записывается ни одной, поэтому у скорости чтения нет верхней границы. Это самый серьёзный показатель. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.',
2185
+ },
2186
+ // objectui#10439 — see the `en` pack for what raises each case.
2187
+ storageUsage: {
2188
+ warningTitle: 'Хранилище почти заполнено',
2189
+ warning: 'Использовано {{used}} МБ из {{limit}} МБ. Когда хранилище заполнится, загрузка файлов и импорт будут приостановлены.',
2190
+ blockedTitle: 'Хранилище заполнено: загрузка файлов и импорт приостановлены',
2191
+ blocked: 'Использовано {{used}} МБ из {{limit}} МБ. Существующие данные не затронуты; чтение, экспорт и редактирование отдельных записей по-прежнему работают.',
2192
+ upgrade: 'Повысьте тариф, чтобы продолжить',
2193
+ },
1742
2194
  errors: {
1743
2195
  somethingWentWrong: "Что-то пошло не так",
1744
2196
  unexpectedError: "При отображении этого представления произошла непредвиденная ошибка.",
@@ -1769,22 +2221,31 @@ const ru = {
1769
2221
  viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
1770
2222
  systemViewReadonly: "Системное представление определено в коде — только для чтения.",
1771
2223
  cannotEditMetaView: "Это встроенное представление, определённое в коде, — изменить его нельзя.",
2224
+ resetView: "Сбросить представление",
2225
+ resetViewTitle: "Вернуть сортировку, фильтры и ширину столбцов этого представления к его собственным настройкам. Изменятся только ваши настройки.",
1772
2226
  cannotDeleteMetaView: "Это встроенное представление, определённое в коде, — удалить его нельзя.",
1773
2227
  expandToPage: "Открыть на всю страницу",
1774
2228
  objectNotFound: "Объект не найден",
1775
2229
  objectNotFoundDescription: "Объект «{{objectName}}» не существует в текущей конфигурации.",
1776
2230
  objectNotFoundHint: "Проверьте настройки навигации приложения или выберите другой объект на боковой панели.",
2231
+ objectPackageDisabled: "Объект «{{objectName}}» принадлежит отключённому пакету, поэтому он не предоставляется.",
1777
2232
  filterOrNotSavable: "Этот фильтр объединяет условия через ИЛИ, что сохранённое представление пока не может хранить. Он по-прежнему применяется к этому списку — уберите группировку ИЛИ, чтобы сохранить его в представлении.",
1778
2233
  filterNestedNotSavable: "Этот фильтр использует вложенные группы условий, которые сохранённое представление не может хранить. Преобразуйте его в один список условий, чтобы сохранить в представлении.",
1779
2234
  allRecords: "Все записи",
1780
2235
  new: "Создать",
1781
2236
  configureView: "Настроить представление",
1782
- toolbar: "Панель инструментов",
1783
2237
  toolbarEnabledCount: "{{count}} из {{total}} включено",
1784
2238
  searchFields: "Поиск полей…",
1785
2239
  title: "Заголовок",
1786
2240
  viewType: "Тип представления",
1787
- recordCount: "{{count}} записей",
2241
+ // objectui#11445 — a count family: each slot agrees the noun with the
2242
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
2243
+ // count-invariant form, answers a call made without a count.
2244
+ recordCount: "Записей: {{count}}",
2245
+ recordCount_one: "{{count}} запись",
2246
+ recordCount_few: "{{count}} записи",
2247
+ recordCount_many: "{{count}} записей",
2248
+ recordCount_other: "{{count}} записи",
1788
2249
  save: "Сохранить",
1789
2250
  discard: "Отменить",
1790
2251
  createView: "Создать представление",
@@ -1796,11 +2257,14 @@ const ru = {
1796
2257
  longitudeField: "Поле долготы",
1797
2258
  imageField: "Поле изображения",
1798
2259
  selectField: "Выберите поле…",
1799
- groupBy: "Группировать по",
1800
2260
  endDateField: "Поле даты окончания",
1801
2261
  import: "Импорт",
1802
2262
  importTitle: "Импорт из CSV",
1803
2263
  importedToast: "{{count}} строк импортировано.",
2264
+ importedToast_one: "Импортирована {{count}} строка.",
2265
+ importedToast_few: "Импортировано {{count}} строки.",
2266
+ importedToast_many: "Импортировано {{count}} строк.",
2267
+ importedToast_other: "Импортировано {{count}} строки.",
1804
2268
  importedWithSkipped: "{{ok}} строк импортировано; {{skipped}} пропущено.",
1805
2269
  createViewDesc: "Выберите тип представления и задайте ему имя. Все настройки можно изменить позже.",
1806
2270
  cancel: "Отмена",
@@ -1809,6 +2273,10 @@ const ru = {
1809
2273
  deleteViewTitle: "Удалить представление",
1810
2274
  deleteViewConfirm: "Удалить представление \"{{name}}\"? Это действие нельзя отменить.",
1811
2275
  bulkDeleteConfirm: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2276
+ bulkDeleteConfirm_one: "Удалить {{count}} выбранную запись? Это действие нельзя отменить.",
2277
+ bulkDeleteConfirm_few: "Удалить {{count}} выбранные записи? Это действие нельзя отменить.",
2278
+ bulkDeleteConfirm_many: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2279
+ bulkDeleteConfirm_other: "Удалить {{count}} выбранной записи? Это действие нельзя отменить.",
1812
2280
  duplicateViewName: "Представление с таким именем уже существует.",
1813
2281
  viewTypeGrid: "Таблица",
1814
2282
  viewTypeGridDesc: "Таблица записей в стиле электронной таблицы.",
@@ -1845,14 +2313,22 @@ const ru = {
1845
2313
  chartTypePie: "Круговая",
1846
2314
  chartTypeArea: "Областная",
1847
2315
  chartTypeScatter: "Точечная",
1848
- xAxisField: "Поле оси X",
1849
- xAxisFieldHelp: "Категориальное или временное измерение.",
1850
- yAxisField: "Поле оси Y",
1851
- yAxisFieldHelp: "Числовое поле для агрегации.",
2316
+ dataset: "Набор данных",
2317
+ datasetHelp: "Диаграмма берёт значения из этого набора данных объекта.",
2318
+ chartMeasure: "Мера",
2319
+ chartMeasureHelp: "Мера набора данных, отображаемая на оси значений.",
2320
+ chartDimension: "Измерение",
2321
+ chartDimensionHelp: "Измерение набора данных, по которому группируются значения (необязательно).",
2322
+ viewTypeUnavailableDataset: "Этот объект не предоставляет набора данных для диаграммы.",
2323
+ noDatasetMeasure: "В этом наборе данных не объявлено ни одной меры для диаграммы.",
1852
2324
  ufTabs: "Вкладки",
1853
2325
  ufAddField: "+ Добавить поле фильтра…",
1854
2326
  ufShowAllRecords: "Показать вкладку \"Все записи\"",
1855
2327
  },
2328
+ runtimeDraft: {
2329
+ publishFailed: "Не удалось опубликовать",
2330
+ discardFailed: "Не удалось отменить черновик",
2331
+ },
1856
2332
  localeSwitcher: {
1857
2333
  label: "Язык",
1858
2334
  },
@@ -1860,14 +2336,22 @@ const ru = {
1860
2336
  nav: {
1861
2337
  pinItem: "Закрепить {{name}}",
1862
2338
  unpinItem: "Открепить {{name}}",
1863
- dragToReorder: "Перетащите для изменения порядка",
1864
2339
  favorites: "Избранное",
2340
+ launcherLabel: "Панель приложений",
2341
+ menuLabel: "Навигация приложения",
2342
+ menuEmpty: "В этом приложении нет доступных для открытия элементов навигации.",
2343
+ itemMenu: "Другие действия для {{name}}",
2344
+ openInNewTab: "Открыть в новой вкладке",
2345
+ copyLink: "Копировать ссылку",
2346
+ linkCopied: "Ссылка скопирована в буфер обмена",
2347
+ linkCopyFailed: "Не удалось скопировать ссылку",
2348
+ design: "Дизайн",
1865
2349
  },
1866
2350
  },
1867
2351
  auth: {
1868
2352
  setPassword: {
1869
2353
  title: "Задать резервный пароль",
1870
- description: "Вы вошли через единый вход. Задайте локальный пароль, чтобы входить в эту среду напрямую, если SSO станет недоступен.",
2354
+ description: "Вы вошли через единый вход. Задайте локальный пароль, чтобы входить напрямую, если SSO станет недоступен.",
1871
2355
  email: "Электронная почта",
1872
2356
  newPassword: "Новый пароль",
1873
2357
  confirmPassword: "Подтвердите пароль",
@@ -1883,9 +2367,8 @@ const ru = {
1883
2367
  signingIn: "Выполняется вход…",
1884
2368
  ssoHandoff: "Перейти к {{target}}",
1885
2369
  devAdminHint: {
1886
- title: "Среда разработки",
1887
- body: "Войдите под предустановленным администратором для разработки:",
1888
- dismiss: "Закрыть",
2370
+ title: "Локальная среда разработки",
2371
+ signIn: "Войти как администратор разработки",
1889
2372
  },
1890
2373
  title: "Войдите в свой аккаунт",
1891
2374
  description: "Введите электронную почту и пароль для продолжения",
@@ -1915,6 +2398,22 @@ const ru = {
1915
2398
  resendOtpCountdownText: "Отправить снова через {seconds} с",
1916
2399
  usePhoneOtpText: "Войти по коду подтверждения",
1917
2400
  usePasswordSignInText: "Войти с паролем",
2401
+ socialButton: "Продолжить через {provider}",
2402
+ orText: "или продолжите с электронной почтой",
2403
+ ssoButton: "Войти через SSO",
2404
+ ssoOnlyDescription: "Войдите через единый вход вашей организации",
2405
+ usePasswordText: "Использовать пароль",
2406
+ backToSsoText: "Вернуться к единому входу",
2407
+ // objectui#12600 — the console login card's own header, the password
2408
+ // field's reveal toggle, and the footer's legal links.
2409
+ welcomeTitle: "С возвращением",
2410
+ welcomeDescription: "Войдите, чтобы продолжить работу",
2411
+ showPasswordText: "Показать пароль",
2412
+ hidePasswordText: "Скрыть пароль",
2413
+ footer: {
2414
+ privacy: "Конфиденциальность",
2415
+ terms: "Условия",
2416
+ },
1918
2417
  },
1919
2418
  register: {
1920
2419
  title: "Создать аккаунт",
@@ -1933,8 +2432,12 @@ const ru = {
1933
2432
  submittingButton: "Создание аккаунта…",
1934
2433
  hasAccountText: "Уже есть аккаунт?",
1935
2434
  signInText: "Войти",
2435
+ socialButton: "Зарегистрироваться через {provider}",
2436
+ orText: "или продолжите с электронной почтой",
1936
2437
  errors: {
1937
2438
  userExists: "Аккаунт с таким email уже существует. Попробуйте войти.",
2439
+ selfRegistrationClosed: "Самостоятельная регистрация в этой системе закрыта. Обратитесь к администратору за приглашением.",
2440
+ emailDomainNotAllowed: "Регистрация с адресами этого домена здесь не разрешена. Используйте email вашей организации или обратитесь к администратору за приглашением.",
1938
2441
  },
1939
2442
  verifyInbox: {
1940
2443
  title: "Проверьте входящие",
@@ -2010,7 +2513,7 @@ const ru = {
2010
2513
  checkSpam: "Не получили письмо? Проверьте папку \"Спам\" или обратитесь в поддержку.",
2011
2514
  or: "Или",
2012
2515
  // objectui#3546 slice three.
2013
- resendUnavailable: "Возможно, отправка писем не настроена для этой среды. Если проблема повторяется, обратитесь в поддержку.",
2516
+ resendUnavailable: "Возможно, отправка писем не настроена для этой системы. Если проблема повторяется, обратитесь в поддержку.",
2014
2517
  },
2015
2518
  setup: {
2016
2519
  welcomeTitle: "Добро пожаловать в ObjectStack",
@@ -2054,7 +2557,7 @@ const ru = {
2054
2557
  disabledDescription: "В этой инсталляции авторизация устройств не включена, поэтому это устройство здесь одобрить нельзя.",
2055
2558
  },
2056
2559
  shell: {
2057
- tenantHostHint: "Вы входите в это рабочее пространство",
2560
+ tenantHostHint: "Вы входите в эту систему",
2058
2561
  },
2059
2562
  layout: {
2060
2563
  headline: "Создавайте мощные бизнес-приложения быстрее.",
@@ -2064,6 +2567,7 @@ const ru = {
2064
2567
  signOut: "Выйти из аккаунта",
2065
2568
  password: {
2066
2569
  title: "Срок действия пароля истёк",
2570
+ resetTitle: "Необходимо сменить пароль",
2067
2571
  fallbackMessage: "Задайте новый пароль, чтобы продолжить.",
2068
2572
  current: "Текущий пароль",
2069
2573
  next: "Новый пароль",
@@ -2089,6 +2593,11 @@ const ru = {
2089
2593
  verifying: "Проверка…",
2090
2594
  invalidCode: "Неверный код. Попробуйте ещё раз.",
2091
2595
  },
2596
+ impersonation: {
2597
+ passwordTitle: "Пользователь {{user}} должен сменить пароль",
2598
+ mfaTitle: "Пользователь {{user}} должен настроить двухфакторную аутентификацию",
2599
+ body: "Вы работаете от имени {{user}}, и сделать это может только сам пользователь. Прекратите работу от чужого имени, чтобы вернуться в свой аккаунт.",
2600
+ },
2092
2601
  },
2093
2602
  },
2094
2603
  // objectui#3546 slice three — the /oauth/consent screen.
@@ -2097,12 +2606,17 @@ const ru = {
2097
2606
  title: "{{appName}} запрашивает доступ к вашему аккаунту",
2098
2607
  request: "{{appName}} запрашивает разрешение{{suffix}}.",
2099
2608
  unknownApp: "приложение",
2609
+ unidentified: "Не удалось определить это приложение.",
2610
+ clientId: "ID клиента",
2100
2611
  willAllow: "Это приложение сможет:",
2101
2612
  scope: {
2102
2613
  openid: "Подтверждать вашу личность",
2103
2614
  profile: "Читать основной профиль (имя, фото)",
2104
2615
  email: "Читать ваш адрес электронной почты",
2105
2616
  offlineAccess: "Оставаться в системе (обновление доступа)",
2617
+ dataRead: "Читать записи (в пределах ваших собственных прав)",
2618
+ dataWrite: "Создавать, изменять и удалять записи (в пределах ваших собственных прав)",
2619
+ actionsExecute: "Выполнять действия от вашего имени (в пределах ваших собственных прав)",
2106
2620
  },
2107
2621
  deny: "Отклонить",
2108
2622
  authorize: "Разрешить",
@@ -2133,11 +2647,20 @@ const ru = {
2133
2647
  role: "Роль",
2134
2648
  save: "Сохранить изменения",
2135
2649
  },
2650
+ language: {
2651
+ title: "Язык",
2652
+ description: "Язык уведомлений и сообщений, которые отправляются вам. Язык интерфейса выбирается отдельно — в меню с глобусом.",
2653
+ label: "Предпочитаемый язык",
2654
+ systemDefault: "Использовать значение по умолчанию для развёртывания",
2655
+ save: "Сохранить",
2656
+ saved: "Языковые настройки обновлены.",
2657
+ readOnly: "Язык вашей учётной записи настраивает администратор.",
2658
+ },
2136
2659
  password: {
2137
2660
  changeTitle: "Изменить пароль",
2138
2661
  setTitle: "Задать локальный пароль",
2139
- changeDescription: "Обновите пароль, который вы используете для входа в эту среду.",
2140
- setDescription: "Вы вошли через единый вход (SSO). Задайте локальный пароль, чтобы также входить в эту среду по электронной почте и паролю.",
2662
+ changeDescription: "Обновите пароль, который вы используете для входа.",
2663
+ setDescription: "Вы вошли через единый вход (SSO). Задайте локальный пароль, чтобы также входить по электронной почте и паролю.",
2141
2664
  current: "Текущий пароль",
2142
2665
  new: "Новый пароль",
2143
2666
  password: "Пароль",
@@ -2146,7 +2669,7 @@ const ru = {
2146
2669
  mismatch: "Пароли не совпадают",
2147
2670
  enterCurrent: "Введите текущий пароль",
2148
2671
  changed: "Пароль изменён.",
2149
- localSet: "Локальный пароль задан. Теперь вы можете входить в эту среду по электронной почте и паролю.",
2672
+ localSet: "Локальный пароль задан. Теперь вы можете входить по электронной почте и паролю.",
2150
2673
  changeAction: "Изменить пароль",
2151
2674
  setAction: "Задать пароль",
2152
2675
  },
@@ -2161,22 +2684,21 @@ const ru = {
2161
2684
  unknown: "Произошла непредвиденная ошибка.",
2162
2685
  },
2163
2686
  workspace: {
2164
- label: "Рабочие пространства",
2165
- default: "Моё рабочее пространство",
2166
- switch: "Переключить рабочее пространство",
2167
- create: "Создать рабочее пространство",
2168
- createTitle: "Создать рабочее пространство",
2169
- createDescription: "Рабочее пространство — это общее место для совместной работы вашей команды.",
2170
- createButton: "Создать рабочее пространство",
2171
- nameLabel: "Имя рабочего пространства",
2687
+ label: "Организации",
2688
+ default: "Моя организация",
2689
+ switch: "Переключить организацию",
2690
+ createTitle: "Создать организацию",
2691
+ createDescription: "Организация — это общее место для совместной работы вашей команды.",
2692
+ createButton: "Создать организацию",
2693
+ nameLabel: "Название организации",
2172
2694
  namePlaceholder: "например, Acme Inc",
2173
2695
  slugLabel: "URL-слаг",
2174
2696
  slugHint: "Используется в URL. Только строчные буквы, цифры и дефисы.",
2175
2697
  invite: "Пригласить участника",
2176
2698
  members: "Участники",
2177
- settings: "Настройки рабочего пространства",
2699
+ settings: "Настройки организации",
2178
2700
  multiOrgDisabled: "Создание новых организаций отключено в этой среде.",
2179
- createFailed: 'Не удалось создать рабочее пространство',
2701
+ createFailed: 'Не удалось создать организацию',
2180
2702
  },
2181
2703
  help: {
2182
2704
  onThisPage: "На этой странице",
@@ -2184,12 +2706,17 @@ const ru = {
2184
2706
  appDocs: 'Документация приложения',
2185
2707
  allDocs: 'Вся документация',
2186
2708
  onlineDocs: 'Онлайн-документация',
2709
+ loadingDocumentation: 'Загрузка документации',
2710
+ about: 'О программе',
2711
+ aboutTitle: 'Об этой консоли',
2712
+ aboutDescription: 'Сборка, из которой скомпилирована эта консоль.',
2713
+ aboutBuild: 'Сборка консоли',
2714
+ aboutBuildUnknown: 'Неизвестная сборка (при сборке этой консоли версия не была задана)',
2187
2715
  },
2188
2716
  sidebar: {
2189
2717
  packageManagement: "Управление пакетами",
2190
2718
  searchNavigation: "Поиск по навигации…",
2191
2719
  settings: "Настройки",
2192
- help: "Помощь",
2193
2720
  helpTooltip: "Помощь и документация",
2194
2721
  activityFeed: "Лента активности",
2195
2722
  notifications: "Уведомления",
@@ -2199,18 +2726,16 @@ const ru = {
2199
2726
  area: "Область",
2200
2727
  scope: "Область",
2201
2728
  recent: "Недавние",
2202
- favorites: "Избранное",
2203
2729
  starred: "Отмеченные",
2204
2730
  removeFromFavorites: "Убрать {{name}} из избранного",
2731
+ allReports: "Все отчёты",
2205
2732
  },
2206
2733
  topbar: {
2207
2734
  openAssistant: "Открыть ассистента {{name}}",
2208
2735
  offline: "Не в сети",
2209
2736
  usersOnline: "Пользователи сейчас в сети",
2210
2737
  switchView: "Сменить представление",
2211
- switchObject: "Сменить объект",
2212
2738
  connection: {
2213
- connected: "Подключено",
2214
2739
  connecting: "Подключение…",
2215
2740
  reconnecting: "Переподключение…",
2216
2741
  disconnected: "Отключено",
@@ -2223,23 +2748,22 @@ const ru = {
2223
2748
  },
2224
2749
  aiAssistant: "ИИ-ассистент",
2225
2750
  designInStudio: "Дизайн в Studio",
2751
+ editApp: "Редактировать приложение",
2226
2752
  },
2227
2753
  home: {
2228
2754
  build: {
2229
2755
  title: "Создать приложение",
2230
- subtitle: "Начните с нуля — спроектируйте объекты, формы, автоматизации и интерфейсы.",
2231
- noCapability: "Создание приложений недоступно в этом рабочем пространстве — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.",
2756
+ noCapability: "Создание приложений недоступно в этой системе — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.",
2232
2757
  },
2233
2758
  template: {
2234
2759
  title: "Начать с шаблона",
2235
- subtitle: "Установите шаблонное приложение из маркетплейса и настройте его под себя.",
2236
2760
  marketplaceDisabled: "Для этого рантайма не настроен маркетплейс приложений, поэтому здесь нет шаблонов для установки.",
2237
2761
  },
2238
2762
  welcomeAdminDescription: "Опишите свой бизнес одним предложением — ИИ создаст объекты, экраны, API и инструменты агента. Либо настройте всё сами через меню слева.",
2239
2763
  welcomeAdminDescriptionNoBuild: "Настройте первое приложение через меню «Администрирование» слева. Когда появятся данные, ИИ-ассистент поможет их изучить.",
2240
2764
  welcomeAdminDescriptionNoAi: "Настройте первое приложение через меню «Администрирование» слева.",
2241
2765
  noAppsTitle: "Приложений пока нет",
2242
- noAppsDescription: "Ваше рабочее пространство настраивается — приложения, которыми поделится администратор, появятся здесь.",
2766
+ noAppsDescription: "Система настраивается — приложения, которыми поделится администратор, появятся здесь.",
2243
2767
  buildWithAI: "Создать с помощью ИИ",
2244
2768
  askAI: "Спросить ИИ",
2245
2769
  recoveryReminder: {
@@ -2248,7 +2772,17 @@ const ru = {
2248
2772
  dismiss: "Закрыть",
2249
2773
  },
2250
2774
  pendingDrafts: {
2251
- message: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2775
+ // objectui#12602 — the drafts row in Home's "My work" section: the
2776
+ // count, then the first draft names joined by `nameSeparator`, in
2777
+ // their package when they share one.
2778
+ title: "{{count}} неопубликованных изменений",
2779
+ title_one: "{{count}} неопубликованное изменение",
2780
+ title_few: "{{count}} неопубликованных изменения",
2781
+ title_many: "{{count}} неопубликованных изменений",
2782
+ title_other: "{{count}} неопубликованного изменения",
2783
+ inPackage: "{{names}} ожидают публикации в {{package}}",
2784
+ waiting: "{{names}} ожидают публикации",
2785
+ nameSeparator: ", ",
2252
2786
  cta: "Опубликовать",
2253
2787
  publishing: "Публикация…",
2254
2788
  published: "Опубликовано! Изменения вступили в силу.",
@@ -2264,20 +2798,24 @@ const ru = {
2264
2798
  capabilityWarn: "Проверка при создании — несуществующих ссылок на возможности: {{count}}.",
2265
2799
  },
2266
2800
  title: "Главная",
2267
- subtitle: "Панель вашего рабочего пространства",
2268
2801
  nav: "Главная",
2269
2802
  allApps: "Все приложения",
2270
2803
  yourApps: "Ваши приложения",
2271
2804
  showMoreApps: "Ещё",
2272
2805
  showLess: "Свернуть",
2273
2806
  continueEmpty: "Открытые вами элементы появятся здесь.",
2274
- actionCenter: {
2275
- title: "Требует вашего внимания",
2276
- empty: "Всё выполнено",
2807
+ // objectui#12602 — Home's "My work" section: its heading, the link to the
2808
+ // full inbox, each column's title, "view all" link and empty line.
2809
+ myWork: {
2810
+ title: "Моя работа",
2811
+ openInbox: "Открыть входящие",
2812
+ viewAll: "Показать все",
2813
+ approvals: "Ожидают одобрения",
2814
+ approvalsEmpty: "Нет заявок на одобрение",
2815
+ notifications: "Уведомления",
2816
+ notificationsEmpty: "Нет непрочитанных уведомлений",
2277
2817
  },
2278
- loading: "Загрузка рабочего пространства…",
2279
- recent: "Недавние",
2280
- starred: "Избранные",
2818
+ loading: "Загрузка…",
2281
2819
  welcome: "Добро пожаловать в ObjectUI",
2282
2820
  welcomeDescription: "Начните с создания вашего первого приложения или настройки системы.",
2283
2821
  createFirstApp: "Создайте первое приложение",
@@ -2285,12 +2823,10 @@ const ru = {
2285
2823
  browseMarketplace: "Обзор маркетплейса приложений",
2286
2824
  quickActions: {
2287
2825
  title: "Быстрые действия",
2288
- createApp: "Создать приложение",
2289
- createAppDesc: "Начните с нового приложения",
2290
2826
  manageObjects: "Управление объектами",
2291
2827
  manageObjectsDesc: "Настройте модели данных",
2292
2828
  systemSettings: "Системные настройки",
2293
- systemSettingsDesc: "Настройте рабочее пространство",
2829
+ systemSettingsDesc: "Настройте систему",
2294
2830
  },
2295
2831
  appCard: {
2296
2832
  noDescription: "Без описания",
@@ -2300,20 +2836,31 @@ const ru = {
2300
2836
  greetingAfternoon: "Добрый день",
2301
2837
  greetingEvening: "Добрый вечер",
2302
2838
  greetingNight: "Ночная смена",
2303
- heroTagline: "Продолжите с того места, где остановились, или откройте что-то новое.",
2839
+ greetingSeparator: ", ",
2840
+ greetingEnd: ".",
2841
+ search: "Поиск приложений, записей, страниц…",
2842
+ summary: {
2843
+ approvals: "Сегодня {{count}} запросов ждут вашего согласования",
2844
+ approvals_one: "Сегодня {{count}} запрос ждёт вашего согласования",
2845
+ approvals_few: "Сегодня {{count}} запроса ждут вашего согласования",
2846
+ approvals_many: "Сегодня {{count}} запросов ждут вашего согласования",
2847
+ approvals_other: "Сегодня {{count}} запроса ждут вашего согласования",
2848
+ none: "Сегодня ничего не ждёт вашего внимания",
2849
+ },
2850
+ addApp: "Добавить приложение",
2851
+ appOpened: "{{time}}",
2304
2852
  open: "Открыть",
2305
- stats: {
2306
- apps: "Приложения",
2307
- starred: "Отмеченные",
2308
- recent: "Недавние",
2309
- },
2310
2853
  recentApps: {
2311
2854
  title: "Недавно открытые",
2312
2855
  itemType: {
2313
2856
  object: "Объект",
2314
2857
  dashboard: "Панель",
2315
2858
  page: "Страница",
2859
+ report: "Отчёт",
2860
+ package: "Пакет",
2861
+ view: "Представление списка",
2316
2862
  record: "Запись",
2863
+ metadata: "Метаданные",
2317
2864
  },
2318
2865
  },
2319
2866
  starredApps: {
@@ -2335,7 +2882,6 @@ const ru = {
2335
2882
  organizations: "Организации",
2336
2883
  roles: "Роли",
2337
2884
  configuration: "Конфигурация",
2338
- createApp: "Создать приложение",
2339
2885
  administration: "Администрирование",
2340
2886
  datasources: "Источники данных",
2341
2887
  documentation: "Документация",
@@ -2350,16 +2896,23 @@ const ru = {
2350
2896
  manageAllApps: "Управление приложениями",
2351
2897
  systemConsole: "Системная консоль",
2352
2898
  noAppsConfigured: "Нет приложений",
2899
+ allApps: "Все приложения",
2900
+ editAppInStudio: "Редактировать {{app}} в Studio",
2901
+ backToHome: "Вернуться на главную",
2902
+ settings: "Настройки",
2903
+ productHome: "Главная {{product}}",
2353
2904
  },
2354
2905
  activityFeed: {
2355
2906
  title: "Последние действия",
2356
2907
  filter: "Фильтр",
2357
2908
  empty: "Нет действий",
2909
+ accessDenied: "У вас нет разрешения на просмотр активности.",
2358
2910
  ariaLabel: "Лента активности",
2359
2911
  typeCreate: "Создание",
2360
2912
  typeUpdate: "Обновление",
2361
2913
  typeDelete: "Удаление",
2362
2914
  typeComment: "Комментарий",
2915
+ typeSystem: "Система",
2363
2916
  relativeJustNow: "только что",
2364
2917
  relativeSecondsAgo: "{{count}} с назад",
2365
2918
  relativeMinutesAgo: "{{count}} м назад",
@@ -2381,8 +2934,18 @@ const ru = {
2381
2934
  placeholder: "Поиск объектов, панелей, страниц, отчётов…",
2382
2935
  inputAriaLabel: "Поиск объектов, панелей, страниц, отчётов",
2383
2936
  resultsCount: "{{count}} результат для \"{{query}}\"",
2384
- resultsCountPlural: "{{count}} результатов для \"{{query}}\"",
2937
+ resultsCount_one: "{{count}} результат по запросу \"{{query}}\"",
2938
+ resultsCount_few: "{{count}} результата по запросу \"{{query}}\"",
2939
+ resultsCount_many: "{{count}} результатов по запросу \"{{query}}\"",
2940
+ resultsCount_other: "{{count}} результата по запросу \"{{query}}\"",
2941
+ // objectui#11445 — a count family: each slot agrees the noun with the
2942
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
2943
+ // count-invariant form, answers a call made without a count.
2385
2944
  itemsAvailable: "{{count}} доступно",
2945
+ itemsAvailable_one: "{{count}} доступно",
2946
+ itemsAvailable_few: "{{count}} доступно",
2947
+ itemsAvailable_many: "{{count}} доступно",
2948
+ itemsAvailable_other: "{{count}} доступно",
2386
2949
  noResults: "Результатов не найдено",
2387
2950
  noResultsHint: "Попробуйте изменить поисковые запросы",
2388
2951
  typeObjects: "Объекты",
@@ -2407,26 +2970,38 @@ const ru = {
2407
2970
  noAppsConfigured: "Нет приложений",
2408
2971
  noAppsConfiguredDescription: "Нет зарегистрированных приложений. Создайте первое приложение или посетите системные настройки.",
2409
2972
  appNotAvailable: "Приложение недоступно",
2410
- appNotAvailableDescription: "Это приложение пока недоступно — возможно, публикация ещё идёт. Повторите попытку через мгновение.",
2973
+ appNotAvailableDescription: "Это приложение недоступно — повторите попытку через мгновение.",
2974
+ appNotFound: "Не удалось открыть это приложение",
2975
+ appNotFoundDescription: "Сервер не вернул это приложение для вашей учётной записи.",
2976
+ appUnreachable: "Не удалось связаться с сервером",
2977
+ appUnreachableDescription: "Не удалось проверить это приложение. Повторите попытку через мгновение.",
2411
2978
  appAccessDenied: "У вас нет доступа к этому приложению",
2412
2979
  appAccessDeniedDescription: "Это приложение существует, но у вашей учётной записи нет прав на его открытие. Обратитесь к администратору за доступом.",
2413
2980
  appAccessDeniedHome: "На главную",
2981
+ appNothingAvailable: "В {{app}} пока нет ничего доступного для вас",
2982
+ appNothingAvailableDescription: "В этом приложении нет страниц, которые может открыть ваша учётная запись. Обратитесь к администратору за доступом.",
2983
+ appNothingAvailableGrantDescription: "В этом приложении нет страниц, которые может открыть ваша учётная запись. Доступ можно предоставить в разделе настройки.",
2984
+ openSetup: "Открыть настройку",
2414
2985
  createFirstApp: "Создать приложение",
2415
2986
  systemSettings: "Системные настройки",
2416
2987
  back: "Назад",
2417
2988
  recordNotFound: "Запись не найдена",
2418
2989
  recordNotFoundDescription: "Искомая запись не существует или была удалена.",
2990
+ recordAccessDenied: "Нет доступа к записям «{{object}}»",
2991
+ recordAccessDeniedDescription: "У вас нет прав на просмотр записей этого типа. Обратитесь к администратору, если считаете, что доступ вам нужен.",
2992
+ recordLoadFailed: "Не удалось загрузить эту запись",
2993
+ recordLoadFailedDescription: "При загрузке произошла ошибка. Проверьте соединение и попробуйте снова.",
2419
2994
  },
2420
2995
  actionDialog: {
2421
2996
  title: "Параметры действия",
2422
2997
  description: "Введите необходимую информацию для продолжения.",
2423
2998
  selectPlaceholder: "Выбрать {{label}}",
2424
2999
  requiredError: "{{label}} обязательно",
3000
+ unresolvedParam: 'Этот параметр невозможно показать: поле, на котором он основан, отсутствует в метаданных объекта, поэтому нужный элемент управления нельзя построить. Попросите администратора исправить определение действия.',
3001
+ carryOverHint: 'Переносится без изменений (только чтение)',
2425
3002
  cancel: "Отмена",
2426
3003
  confirm: "Подтвердить",
2427
3004
  uploading: "Загрузка…",
2428
- defaultActionTitle: "Действие",
2429
- ok: "ОК",
2430
3005
  lookupPlaceholder: "ID записи для {{label}}",
2431
3006
  lookupHelpText: "Для этого параметра не настроен объект ссылки, поэтому выбор записи недоступен. Введите ID записи или попросите администратора исправить параметр действия.",
2432
3007
  },
@@ -2435,11 +3010,6 @@ const ru = {
2435
3010
  confirm: "Продолжить",
2436
3011
  cancel: "Отмена",
2437
3012
  },
2438
- rowAction: {
2439
- openMenu: "Открыть меню",
2440
- edit: "Редактировать",
2441
- delete: "Удалить",
2442
- },
2443
3013
  navigationSync: {
2444
3014
  addedPage: "Навигация обновлена: страница \"{{name}}\" добавлена",
2445
3015
  addedDashboard: "Навигация обновлена: панель \"{{name}}\" добавлена",
@@ -2453,13 +3023,22 @@ const ru = {
2453
3023
  updateFailed: "Не удалось обновить навигацию",
2454
3024
  },
2455
3025
  objectActions: {
2456
- resetPackageSetConfirm: "Этот набор разрешений поставляется с установленным пакетом и не может быть удалён. Удаление сбросит его к исходному состоянию из пакета и отменит ваши настройки в этой среде. Продолжить?",
2457
- resetPackageSetSuccess: "Набор разрешений сброшен к исходному состоянию из пакета",
2458
3026
  deleteSuccess: "{{label}} успешно удалён",
2459
3027
  deleteFailed: "Не удалось удалить {{label}}",
2460
3028
  noRecordId: "ID записи не указан",
2461
3029
  deleteConfirm: "Удалить эту запись?",
3030
+ deleteConfirmTitle: "Удалить {{label}} \"{{name}}\"?",
3031
+ bulkDeleteConfirmTitle: "Удалить {{count}} записей {{label}}?",
3032
+ bulkDeleteConfirmTitle_one: "Удалить {{count}} запись {{label}}?",
3033
+ bulkDeleteConfirmTitle_few: "Удалить {{count}} записи {{label}}?",
3034
+ bulkDeleteConfirmTitle_many: "Удалить {{count}} записей {{label}}?",
3035
+ bulkDeleteConfirmTitle_other: "Удалить {{count}} записи {{label}}?",
3036
+ deleteConfirmButton: "Удалить",
2462
3037
  bulkDeleteSuccess: "{{count}} записей {{label}} удалено",
3038
+ bulkDeleteSuccess_one: "Удалена {{count}} запись {{label}}",
3039
+ bulkDeleteSuccess_few: "Удалено {{count}} записи {{label}}",
3040
+ bulkDeleteSuccess_many: "Удалено {{count}} записей {{label}}",
3041
+ bulkDeleteSuccess_other: "Удалено {{count}} записи {{label}}",
2463
3042
  bulkDeletePartial: "{{succeeded}} удалено, {{failed}} не удалось",
2464
3043
  },
2465
3044
  objectViewActions: {
@@ -2471,15 +3050,6 @@ const ru = {
2471
3050
  exportFailed: "Ошибка экспорта: {{message}}",
2472
3051
  forecastSoon: "Прогнозное представление скоро будет",
2473
3052
  },
2474
- recordDetail: {
2475
- viewersTooltip: "Пользователи, просматривающие эту запись",
2476
- },
2477
- cellRender: {
2478
- empty: "Пусто",
2479
- yes: "Да",
2480
- no: "Нет",
2481
- systemFields: "Система",
2482
- },
2483
3053
  user: {
2484
3054
  profile: "Профиль",
2485
3055
  settings: "Настройки",
@@ -2501,6 +3071,7 @@ const ru = {
2501
3071
  loading: "Загрузка…",
2502
3072
  failedToLoad: "Не удалось загрузить матрицу: {{message}}",
2503
3073
  needsAcross: "Матричный отчёт требует хотя бы одно поле `groupingsAcross`.",
3074
+ forbiddenMessage: "У вас нет прав на просмотр данных этого отчёта.",
2504
3075
  aggregate: {
2505
3076
  count: "Количество",
2506
3077
  countDistinct: "Уникальные",
@@ -2515,18 +3086,18 @@ const ru = {
2515
3086
  },
2516
3087
  },
2517
3088
  organizations: {
2518
- create: "Создать рабочее пространство",
2519
- mine: "Мои рабочие пространства",
2520
- title: "Рабочие пространства",
2521
- heading: "Ваши рабочие пространства",
2522
- subtitle: "Выберите рабочее пространство, чтобы продолжить, или создайте новое.",
2523
- searchPlaceholder: "Поиск рабочего пространства",
2524
- new: "Новое рабочее пространство",
2525
- current: "Текущее рабочее пространство",
3089
+ create: "Создать организацию",
3090
+ mine: "Мои организации",
3091
+ title: "Организации",
3092
+ heading: "Ваши организации",
3093
+ subtitle: "Выберите организацию, чтобы продолжить, или создайте новую.",
3094
+ searchPlaceholder: "Поиск организации",
3095
+ new: "Новая организация",
3096
+ current: "Текущая организация",
2526
3097
  manage: "Управление",
2527
- emptyTitle: "Пока нет рабочих пространств",
2528
- emptyDescription: "Создайте своё первое рабочее пространство, чтобы начать.",
2529
- noMatches: "Нет рабочих пространств, соответствующих запросу.",
3098
+ emptyTitle: "Пока нет организаций",
3099
+ emptyDescription: "Создайте свою первую организацию, чтобы начать.",
3100
+ noMatches: "Нет организаций, соответствующих запросу.",
2530
3101
  },
2531
3102
  organization: {
2532
3103
  roles: {
@@ -2611,6 +3182,7 @@ const ru = {
2611
3182
  readOnlyNote: "Изменять настройки могут только владельцы.",
2612
3183
  nameLabel: "Название организации",
2613
3184
  slugLabel: "Слаг",
3185
+ slugLockedNote: "У этой организации есть активные окружения, поэтому её слаг нельзя изменить здесь: переименование также переносит их поддомены.",
2614
3186
  logoLabel: "Логотип",
2615
3187
  logoUpload: "Загрузить",
2616
3188
  logoReplace: "Заменить",
@@ -2669,18 +3241,49 @@ const ru = {
2669
3241
  regionLabel: "Уведомления",
2670
3242
  groupCount: "Уведомлений: {{count}}",
2671
3243
  groupUnread: "Непрочитанных: {{count}}",
3244
+ groupUnread_one: "Непрочитанных: {{count}}",
3245
+ groupUnread_few: "Непрочитанных: {{count}}",
3246
+ groupUnread_many: "Непрочитанных: {{count}}",
3247
+ groupUnread_other: "Непрочитанных: {{count}}",
2672
3248
  groupMarkRead: "Отметить прочитанными",
2673
3249
  groupMarkReadTitle: "Отметить прочитанными все этого типа",
2674
3250
  empty: "Нет уведомлений",
2675
3251
  markAllRead: "Отметить все как прочитанные",
2676
3252
  viewAll: "Показать все уведомления",
2677
3253
  approvalsPending: "{{count}} ожидающих утверждений",
3254
+ approvalsPending_one: "{{count}} ожидающее утверждение",
3255
+ approvalsPending_few: "{{count}} ожидающих утверждения",
3256
+ approvalsPending_many: "{{count}} ожидающих утверждений",
3257
+ approvalsPending_other: "{{count}} ожидающего утверждения",
2678
3258
  viewApprovals: "Показать утверждения",
2679
3259
  noPendingApprovals: "Нет ожидающих утверждений",
2680
3260
  openApprovalsInbox: "Открыть входящие утверждений",
2681
3261
  badgeTotal: "Всего: {{total}}",
2682
- badgeNotifications: "{{unread}} уведомлений",
2683
- badgeApprovals: "{{approvals}} ожидающих утверждений",
3262
+ badgeNotifications: "{{count}} уведомлений",
3263
+ badgeNotifications_one: "{{count}} уведомление",
3264
+ badgeNotifications_few: "{{count}} уведомления",
3265
+ badgeNotifications_many: "{{count}} уведомлений",
3266
+ badgeNotifications_other: "{{count}} уведомления",
3267
+ badgeApprovals: "{{count}} ожидающих утверждений",
3268
+ badgeApprovals_one: "{{count}} ожидающее утверждение",
3269
+ badgeApprovals_few: "{{count}} ожидающих утверждения",
3270
+ badgeApprovals_many: "{{count}} ожидающих утверждений",
3271
+ badgeApprovals_other: "{{count}} ожидающего утверждения",
3272
+ arrivalMany: "Новых сообщений: {{count}}",
3273
+ arrivalMany_one: "Новых сообщений: {{count}}",
3274
+ arrivalMany_few: "Новых сообщений: {{count}}",
3275
+ arrivalMany_many: "Новых сообщений: {{count}}",
3276
+ arrivalMany_other: "Новых сообщений: {{count}}",
3277
+ arrivalRepeats: "Новых сообщений по этой теме: {{count}}",
3278
+ arrivalRepeats_one: "Новых сообщений по этой теме: {{count}}",
3279
+ arrivalRepeats_few: "Новых сообщений по этой теме: {{count}}",
3280
+ arrivalRepeats_many: "Новых сообщений по этой теме: {{count}}",
3281
+ arrivalRepeats_other: "Новых сообщений по этой теме: {{count}}",
3282
+ arrivalOpen: "Открыть",
3283
+ toastEnabled: "Оповещения в приложении",
3284
+ desktopEnabled: "Уведомления на рабочем столе",
3285
+ desktopBlocked: "Заблокировано. Разрешите уведомления для этого сайта в настройках браузера.",
3286
+ desktopUnsupported: "Этот браузер не поддерживает уведомления на рабочем столе.",
2684
3287
  emptyUnread: "Всё прочитано",
2685
3288
  filterUnread: "Непрочитанные",
2686
3289
  filterAll: "Все",
@@ -2694,12 +3297,14 @@ const ru = {
2694
3297
  thankYouTitle: "Спасибо!",
2695
3298
  thankYouMessage: "Ваш ответ успешно получен.",
2696
3299
  redirecting: "Перенаправление через {{seconds}} с…",
3300
+ redirectPending: "Перенаправление…",
2697
3301
  unavailableTitle: "Форма недоступна",
2698
3302
  unavailableDescription: "По этому URL нет публичной формы. Убедитесь, что базовое представление имеет анонимный доступ.",
2699
3303
  tryDemo: "Попробовать демо",
2700
3304
  retry: "Повторить",
2701
3305
  loading: "Загрузка формы…",
2702
3306
  requiredHint: "* Обязательное поле",
3307
+ requiredFields: "Обязательные поля: {{fields}}",
2703
3308
  consentLabelDefault: "Я принимаю политику конфиденциальности и соглашаюсь на обработку моих данных.",
2704
3309
  consentLink: "Политика конфиденциальности",
2705
3310
  consentRequired: "Пожалуйста, примите политику конфиденциальности.",
@@ -2712,10 +3317,10 @@ const ru = {
2712
3317
  body: 'Поверхность MCP выключена (OS_MCP_SERVER_ENABLED=false). Попросите оператора включить её снова.',
2713
3318
  },
2714
3319
  url: {
2715
- title: 'MCP-эндпоинт этого окружения',
3320
+ title: 'MCP-эндпоинт этой системы',
2716
3321
  body: 'Любой ИИ-клиент с поддержкой MCP подключается по этому URL. Идентификация — самообслуживание: развертывание само является сервером авторизации OAuth 2.1 — вы входите под своим именем, и каждый вызов выполняется в рамках ваших прав и строковой безопасности.',
2717
3322
  downloadSkill: 'Скачать SKILL.md',
2718
- skillHint: 'Переносимый навык агента: учит любого совместимого агента работать с этим окружением.',
3323
+ skillHint: 'Переносимый навык агента: учит любого совместимого агента работать с этой системой.',
2719
3324
  },
2720
3325
  claude: {
2721
3326
  body: 'Настройки → Коннекторы → Добавить пользовательский коннектор, вставьте этот URL и войдите через браузер.',
@@ -2750,18 +3355,89 @@ const ru = {
2750
3355
  noImportableFields: "У этого объекта нет полей, доступных для импорта.",
2751
3356
  schemaReadFailed: "Не удалось прочитать схему объекта.",
2752
3357
  imported: "Импортировано строк: {{count}} в {{object}}.",
3358
+ imported_one: "Импортировано строк: {{count}} в {{object}}.",
3359
+ imported_few: "Импортировано строк: {{count}} в {{object}}.",
3360
+ imported_many: "Импортировано строк: {{count}} в {{object}}.",
3361
+ imported_other: "Импортировано строк: {{count}} в {{object}}.",
2753
3362
  importFrom: "Импортировать реальные строки из",
2754
3363
  into: "в",
2755
3364
  opening: "Открытие…",
2756
3365
  importAction: "Импорт",
2757
3366
  dismiss: "Скрыть",
2758
3367
  },
2759
- cloudOnboarding: {
2760
- hintCreate: "Создайте первое окружение — отдельное рабочее пространство со своим URL, базой данных и тарифом. Разработка ведётся внутри него.",
2761
- hintReady: "Продакшн-окружение готово. Откройте его, чтобы создавать и запускать приложения — всё происходит внутри окружения.",
2762
- createEnvironment: "Создать окружение",
2763
- openProduction: "Открыть продакшн",
2764
- manageEnvironments: "Управление окружениями",
3368
+ cloudWorkspaceTimezoneNotice: {
3369
+ seeded: "Часовой пояс окружения был задан по вашему браузеру при его создании: {{zone}}. Его можно изменить в разделе «Настройки → Локализация».",
3370
+ },
3371
+ ai: {
3372
+ nlQuery: {
3373
+ placeholder: "Задайте вопрос о своих данных…",
3374
+ ask: "Спросить",
3375
+ results: "Результаты",
3376
+ match: "Совпадение: {{percent}}",
3377
+ simulatedSummary: "Результаты по запросу: {{query}}",
3378
+ noResults: "Подходящие записи не найдены",
3379
+ recentQueries: "Недавние запросы",
3380
+ },
3381
+ formAssist: {
3382
+ title: "Предложения ИИ",
3383
+ suggestionCount: "Предложений: {{count}}",
3384
+ suggestionCount_one: "{{count}} предложение",
3385
+ suggestionCount_few: "{{count}} предложения",
3386
+ suggestionCount_many: "{{count}} предложений",
3387
+ suggestionCount_other: "{{count}} предложения",
3388
+ applyAll: "Применить все",
3389
+ confidence: "Уверенность: {{percent}}",
3390
+ appliedCount: "Применено предложений: {{count}}",
3391
+ appliedCount_one: "Применено {{count}} предложение",
3392
+ appliedCount_few: "Применено {{count}} предложения",
3393
+ appliedCount_many: "Применено {{count}} предложений",
3394
+ appliedCount_other: "Применено {{count}} предложения",
3395
+ },
3396
+ recommendations: {
3397
+ title: "Рекомендации",
3398
+ generating: "Формирование рекомендаций…",
3399
+ empty: "Нет доступных рекомендаций",
3400
+ },
3401
+ },
3402
+ aiApprovals: {
3403
+ title: "Согласования ИИ",
3404
+ description: "Действия, предложенные ИИ-агентом: перед выполнением их должен проверить человек.",
3405
+ tabPending: "Ожидают",
3406
+ tabDecided: "Обработанные",
3407
+ tabAll: "Все",
3408
+ statusPending: "Ожидает",
3409
+ statusApproved: "Согласовано",
3410
+ statusExecuted: "Выполнено",
3411
+ statusFailed: "Не выполнено",
3412
+ statusRejected: "Отклонено",
3413
+ colTool: "Инструмент",
3414
+ colAction: "Действие",
3415
+ colObject: "Объект",
3416
+ colStatus: "Статус",
3417
+ colProposed: "Предложено",
3418
+ colDecision: "Решение",
3419
+ emptyTitle: "Нет действий в ожидании",
3420
+ emptyDescription: "Когда ИИ предложит важное действие, оно появится здесь на проверку.",
3421
+ view: "Открыть",
3422
+ approve: "Согласовать",
3423
+ reject: "Отклонить",
3424
+ working: "Выполняется…",
3425
+ approveAndExecute: "Согласовать и выполнить",
3426
+ outcomeApprove: "Согласование {{id}}: {{message}}",
3427
+ outcomeReject: "Отклонение {{id}}: {{message}}",
3428
+ outcomeExecuteFailed: "Действие завершилось ошибкой при выполнении",
3429
+ drawerFallbackTitle: "Действие в ожидании",
3430
+ drawerSubtitle: "Инструмент {{tool}} для объекта {{object}}",
3431
+ fieldProposedBy: "Кто предложил",
3432
+ fieldDecidedBy: "Кто решил",
3433
+ fieldConversation: "Диалог",
3434
+ fieldToolInput: "Входные данные инструмента",
3435
+ fieldResult: "Результат",
3436
+ fieldError: "Ошибка",
3437
+ fieldRejectionReason: "Причина отклонения",
3438
+ rejectTitle: "Отклонить это действие?",
3439
+ rejectBody: "Причина возвращается ИИ, чтобы он скорректировал следующий ответ.",
3440
+ rejectPlaceholder: "Причина (необязательно), например: «Неверный идентификатор записи — сначала уточните у пользователя.»",
2765
3441
  },
2766
3442
  aiModelStatus: {
2767
3443
  summary: "Сборка / вопросы используют {{conversational}} ({{conversationalSource}}); структурированный вывод — {{structured}} ({{structuredSource}}).",
@@ -2771,8 +3447,8 @@ const ru = {
2771
3447
  rowConversational: "Модель Build / Ask",
2772
3448
  rowStructured: "Структурированный (blueprint / seed)",
2773
3449
  rowReasoning: "Интенсивность рассуждений",
2774
- readFailed: "Не удалось прочитать действующую модель ИИ. В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
2775
- readFailedWithStatus: "Не удалось прочитать действующую модель ИИ (HTTP {{status}}). В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
3450
+ readFailed: "Не удалось прочитать действующую модель ИИ. В этой системе может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
3451
+ readFailedWithStatus: "Не удалось прочитать действующую модель ИИ (HTTP {{status}}). В этой системе может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.",
2776
3452
  overridesInEffect: "Действующие переопределения: ",
2777
3453
  noOverrides: "нет — используются значения по умолчанию развёрнутого кода.",
2778
3454
  adapter: "Адаптер: ",
@@ -2780,6 +3456,188 @@ const ru = {
2780
3456
  sourceInherits: "как у build/ask",
2781
3457
  sourcePinned: "закреплено через {{source}}",
2782
3458
  },
3459
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3460
+ // English-only until this landed while every other string on the same screen
3461
+ // was translated:
3462
+ //
3463
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3464
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3465
+ // closed registry those runtimes are conformance-tested
3466
+ // against). `humanizeToolName` looks each up as
3467
+ // `chatbot.tool.<tool_name>` and falls back to its English
3468
+ // title-caser for a custom / third-party tool, so a name
3469
+ // missing here is degraded, never broken. Every value, `en`
3470
+ // included, is a short sentence in the pack's language
3471
+ // saying what the step does (cloud#2927 Target 3, ruled
3472
+ // 「同意」; objectui#12724): never the tool id, and never
3473
+ // the title-caser's output for it, which is how the step
3474
+ // reads for a tool the pack has no entry for.
3475
+ // `toolLabels-locale-parity-7481` holds both.
3476
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3477
+ // set for both surfaces (they used to carry separate
3478
+ // tables and disagreed on casing).
3479
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3480
+ // FAMILIES: one slot per CLDR category the pack's language
3481
+ // selects (objectui#11432), plus the base key for a call
3482
+ // made without a count. `all-locales-key-parity.test.ts`
3483
+ // derives the required slots from `Intl.PluralRules`.
3484
+ //
3485
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3486
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3487
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3488
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3489
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3490
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3491
+ // against the registry instead of against its own hand-held list.
3492
+ chatbot: {
3493
+ answer: {
3494
+ showFull: 'Показать ответ полностью',
3495
+ collapse: 'Свернуть',
3496
+ expandTable: 'Развернуть',
3497
+ exitExpandedTable: 'Закрыть',
3498
+ },
3499
+ tool: {
3500
+ aggregate_data: "Агрегировать данные",
3501
+ get_record: "Прочитать запись",
3502
+ query_data: "Запросить нужные данные",
3503
+ query_records: "Найти нужные записи",
3504
+ search_knowledge: "Поискать в базе знаний",
3505
+ visualize_data: "Показать данные на графике",
3506
+ add_field: "Добавить поле в объект",
3507
+ apply_blueprint: "Собрать приложение по плану",
3508
+ apply_edit: "Применить это изменение",
3509
+ create_metadata: "Создать элемент метаданных",
3510
+ create_object: "Создать новый объект",
3511
+ create_package: "Создать новый пакет",
3512
+ create_seed: "Сгенерировать примеры данных для объектов",
3513
+ delete_field: "Удалить одно поле",
3514
+ describe_metadata: "Изучить метаданные",
3515
+ describe_object: "Изучить структуру объекта",
3516
+ get_active_package: "Проверить активный пакет",
3517
+ get_authoring_rules: "Прочитать правила разработки",
3518
+ get_metadata_schema: "Изучить формат метаданных",
3519
+ get_package: "Посмотреть сведения о пакете",
3520
+ list_metadata: "Перечислить имеющиеся метаданные",
3521
+ list_objects: "Перечислить имеющиеся объекты",
3522
+ list_packages: "Перечислить имеющиеся пакеты",
3523
+ load_tools: "Загрузить другие инструменты",
3524
+ modify_field: "Изменить одно поле",
3525
+ open_record: "Открыть эту запись",
3526
+ propose_blueprint: "Составить план приложения",
3527
+ set_active_package: "Переключиться на нужный пакет",
3528
+ suggest_builder: "Предложить собрать с помощью ИИ",
3529
+ test_flow: "Пробно запустить процесс",
3530
+ todo_write: "Записать, что проверить позже",
3531
+ toggle_flow: "Включить или отключить процесс",
3532
+ update_metadata: "Обновить элемент метаданных",
3533
+ validate_expression: "Проверить корректность выражения",
3534
+ verify_build: "Сверить результат сборки",
3535
+ },
3536
+ toolState: {
3537
+ agentActivity: "Действия агента",
3538
+ pending: "Ожидание",
3539
+ running: "Выполняется",
3540
+ awaitingApproval: "Ожидает подтверждения",
3541
+ responded: "Отвечено",
3542
+ completed: "Завершено",
3543
+ error: "Ошибка",
3544
+ denied: "Отклонено",
3545
+ failed: "Ошибка выполнения",
3546
+ },
3547
+ phase: {
3548
+ build: "Сборка",
3549
+ design: "Проектирование плана",
3550
+ stepCount: "шагов: {{count}}",
3551
+ stepCount_one: "{{count}} шаг",
3552
+ stepCount_few: "{{count}} шага",
3553
+ stepCount_many: "{{count}} шагов",
3554
+ stepCount_other: "{{count}} шага",
3555
+ expand: "Показать шаги",
3556
+ collapse: "Скрыть шаги",
3557
+ },
3558
+ plan: {
3559
+ countObjects: "объектов: {{count}}",
3560
+ countObjects_one: "{{count}} объект",
3561
+ countObjects_few: "{{count}} объекта",
3562
+ countObjects_many: "{{count}} объектов",
3563
+ countObjects_other: "{{count}} объекта",
3564
+ countViews: "представлений: {{count}}",
3565
+ countViews_one: "{{count}} представление",
3566
+ countViews_few: "{{count}} представления",
3567
+ countViews_many: "{{count}} представлений",
3568
+ countViews_other: "{{count}} представления",
3569
+ countDashboards: "дашбордов: {{count}}",
3570
+ countDashboards_one: "{{count}} дашборд",
3571
+ countDashboards_few: "{{count}} дашборда",
3572
+ countDashboards_many: "{{count}} дашбордов",
3573
+ countDashboards_other: "{{count}} дашборда",
3574
+ countSeedData: "демоданные",
3575
+ extendTarget: "Добавление в существующее приложение: {{app}}",
3576
+ awaitingConfirm: "Ожидает подтверждения",
3577
+ objectsAndFields: "Объекты и поля",
3578
+ views: "Представления",
3579
+ suggestedField: "предложено",
3580
+ nameField: "Название: {{field}}",
3581
+ },
3582
+ build: {
3583
+ building: "Создание {{app}}…",
3584
+ built: "Создание {{app}} завершено",
3585
+ builtAndLive: "Создано и опубликовано · {{app}}",
3586
+ appFallback: "вашего приложения",
3587
+ addingSampleData: "добавление демоданных",
3588
+ group: {
3589
+ object: "Объекты",
3590
+ view: "Представления",
3591
+ dashboard: "Дашборды",
3592
+ app: "Приложение",
3593
+ seed: "Демоданные",
3594
+ },
3595
+ moreArtifacts: "ещё {{n}}",
3596
+ verifying: "Проверка изменения…",
3597
+ verifyStep: "шаг {{n}}",
3598
+ verified: "Изменение проверено",
3599
+ unknownPhase: "Неизвестный этап сборки",
3600
+ nextStepsLead: "Дальше можно сказать: {{steps}}",
3601
+ nextStepQuote: "«{{step}}»",
3602
+ draftPosture: "Дальнейшие изменения сохраняются как черновики, а публикуете их вы в Studio.",
3603
+ checksPassed: "Проверки пройдены {{passed}}/{{total}}",
3604
+ },
3605
+ changes: {
3606
+ planTitle: "План изменений · изменений: {{count}}",
3607
+ planTitle_one: "План изменений · {{count}} изменение",
3608
+ planTitle_few: "План изменений · {{count}} изменения",
3609
+ planTitle_many: "План изменений · {{count}} изменений",
3610
+ planTitle_other: "План изменений · {{count}} изменения",
3611
+ saveDraft: "Сохранить как черновик",
3612
+ reviewAndPublish: "Проверить изменения и опубликовать",
3613
+ undo: "Отменить",
3614
+ undoWithOthers: "Отменить (других черновиков: {{count}})",
3615
+ undoWithOthers_one: "Отменить (и ещё {{count}} черновик)",
3616
+ undoWithOthers_few: "Отменить (и ещё {{count}} черновика)",
3617
+ undoWithOthers_many: "Отменить (и ещё {{count}} черновиков)",
3618
+ undoWithOthers_other: "Отменить (и ещё {{count}} черновика)",
3619
+ undoConfirm: "Отмена удалит все неопубликованные черновики этого пакета ({{total}}), из них не относятся к этому изменению: {{count}}.",
3620
+ undoConfirm_one: "Отмена удалит все неопубликованные черновики этого пакета ({{total}}), из них {{count}} не относится к этому изменению.",
3621
+ undoConfirm_few: "Отмена удалит все неопубликованные черновики этого пакета ({{total}}), из них {{count}} не относятся к этому изменению.",
3622
+ undoConfirm_many: "Отмена удалит все неопубликованные черновики этого пакета ({{total}}), из них {{count}} не относятся к этому изменению.",
3623
+ undoConfirm_other: "Отмена удалит все неопубликованные черновики этого пакета ({{total}}), из них {{count}} не относятся к этому изменению.",
3624
+ undoConfirmUnknown: "Отмена удалит все неопубликованные черновики этого пакета, а не только это изменение.",
3625
+ undoConfirmAction: "Отменить всё",
3626
+ undoCancel: "Не отменять",
3627
+ undoing: "Отмена…",
3628
+ undone: "Отменено",
3629
+ undoFailed: "Не удалось отменить",
3630
+ kind: {
3631
+ field: "Поле",
3632
+ object: "Объект",
3633
+ view: "Представление",
3634
+ dashboard: "Дашборд",
3635
+ app: "Приложение",
3636
+ seed: "Демоданные",
3637
+ package: "Пакет приложения",
3638
+ },
3639
+ },
3640
+ },
2783
3641
  chatbotError: {
2784
3642
  title: "Ошибка ответа",
2785
3643
  fallbackDetail: "Что-то пошло не так. Попробуйте ещё раз.",
@@ -2793,10 +3651,13 @@ const ru = {
2793
3651
  buyCredits: "Купить пакет кредитов",
2794
3652
  upgradePlan: "Повысить тариф",
2795
3653
  },
3654
+ planTier: {
3655
+ teamAndUp: "Тариф Team и выше",
3656
+ },
2796
3657
  environment: {
2797
- addEnvironment: "Добавить окружение",
2798
3658
  setUpProduction: "Настройте продакшн-окружение",
2799
3659
  addDevelopment: "Добавить окружение разработки",
3660
+ developmentLocked: "Окружения разработки · {{tier}}",
2800
3661
  // Plan/capacity dialog (EnvironmentEntitlementDialog) — cloud#959.
2801
3662
  entitlement: {
2802
3663
  productionLimitTitle: "У вас уже есть продакшн-окружение",
@@ -2844,7 +3705,7 @@ const ru = {
2844
3705
  },
2845
3706
  unbound: {
2846
3707
  title: "Не подключено",
2847
- body: "Подключите эту среду выполнения к управляющему слою ObjectStack, чтобы просматривать приватные пакеты вашей организации и устанавливать их здесь. Подтверждение — один клик в вашей облачной учётной записи; никакие идентификаторы и учётные данные на этой странице не вводятся.",
3708
+ body: "Эта среда выполнения не подключена к управляющему слою. «Подключить» открывает вашу облачную учётную запись в новом окне, где подключение подтверждается одним кликом; никакие идентификаторы и учётные данные на этой странице не вводятся.",
2848
3709
  connect: "Подключить",
2849
3710
  },
2850
3711
  },
@@ -2857,10 +3718,17 @@ const ru = {
2857
3718
  dismiss: "Закрыть",
2858
3719
  confirmedToast: "«{{set}}» теперь предоставлен: {{anchor}}.",
2859
3720
  dismissedToast: "Предложение по «{{set}}» закрыто.",
3721
+ guestUnsupported: "Здесь предоставить нельзя: наборы позиции Guest не выводятся из принятых предложений.",
3722
+ acceptedState: "«{{set}}» принят для всех вошедших пользователей (позиция Everyone).",
3723
+ notInForceState: "«{{set}}» принят, но ещё не действует: этот запрос не изменил позицию Everyone. Причина указана в журнале сервера.",
3724
+ dismissedState: "«{{set}}» не предоставлен: предложение закрыто или отозвано.",
3725
+ revoke: "Отозвать",
3726
+ revoking: "Отзыв…",
3727
+ revokedToast: "Принятие «{{set}}» отозвано.",
2860
3728
  },
2861
3729
  title: "Маркетплейс приложений",
2862
3730
  subtitle: "Просматривайте одобренные приложения из каталога ObjectStack. Нажмите на приложение, чтобы увидеть подробности и установить его.",
2863
- searchPlaceholder: "Поиск приложений по имени или ID манифеста…",
3731
+ searchPlaceholder: 'Поиск приложений по имени или ID приложения…',
2864
3732
  searchAria: "Поиск в маркетплейсе",
2865
3733
  installed: "Установлено",
2866
3734
  installedCount: "Установлено ({{count}})",
@@ -2870,21 +3738,26 @@ const ru = {
2870
3738
  noMatchFilters: "Нет приложений, соответствующих фильтрам.",
2871
3739
  noDescription: "Описание отсутствует.",
2872
3740
  back: "Назад в маркетплейс",
2873
- installedTitle: "Установленные приложения",
2874
- installedSubtitle: "Пакеты маркетплейса, установленные в ядре этого рантайма.",
2875
- installedEmpty: "Пока нет установленных приложений.",
2876
3741
  browseLink: "Маркетплейс →",
2877
- installedAdditiveNote: "<strong>Примечание:</strong> API ядра только аддитивный — удаление убирает манифест с диска, чтобы пакет не загружался при следующем запуске, но работающее ядро держит приложение зарегистрированным до перезапуска.",
2878
- installedAt: "Установлено {{when}}",
2879
- installedBy: "пользователем {{user}}",
2880
- installedPackageId: "Пакет",
2881
- cachedAs: "Кэшировано как <code>{{path}}</code>",
3742
+ installedAdditiveNote: "Удаление сразу убирает приложение из работающего ядра вместе с его наборами разрешений и их назначениями, а также удаляет кэшированный манифест, чтобы пакет не загружался при следующем запуске. Записи, хранящиеся в его объектах, остаются в базе данных.",
2882
3743
  versionBadge: "v{{version}}",
2883
3744
  installedBadge: "Установлено v{{version}}",
3745
+ // objectui#11645 — an install-local entry this runtime refused to load at
3746
+ // startup (the listing's `notLoaded` marker), read on Installed Apps.
3747
+ notLoaded: {
3748
+ badge: "Не загружен",
3749
+ protocolIncompatible: "Рантайм не загрузил этот пакет: он рассчитан на протокол {{requiredRange}}, который этот рантайм не поддерживает.",
3750
+ otherReason: "Рантайм не загрузил этот пакет ({{code}}).",
3751
+ },
2884
3752
  load: {
2885
3753
  failed: "Не удалось загрузить маркетплейс",
2886
3754
  failedHintConfigured: "Этот рантайм обращается к маркетплейсу через control plane по адресу {{url}}. Убедитесь, что он доступен и достижим отсюда.",
2887
- failedHintSameOrigin: "Этот рантайм сам обслуживает каталог маркетплейса. Убедитесь, что рантайм онлайн.",
3755
+ failedHintSameOrigin: "Каталог маркетплейса доступен через этот рантайм. Убедитесь, что рантайм онлайн и имеет доступ к каталогу.",
3756
+ loading: "Загрузка каталога маркетплейса…",
3757
+ slow: "Всё ещё загружается — каталог маркетплейса медленно отвечает.",
3758
+ retry: "Повторить",
3759
+ unreachable: "Не удалось связаться с каталогом маркетплейса.",
3760
+ answeredError: "Каталог маркетплейса ответил ошибкой (HTTP {{status}}).",
2888
3761
  packageFailed: "Не удалось загрузить пакет",
2889
3762
  notFound: "Не найдено.",
2890
3763
  },
@@ -2908,10 +3781,19 @@ const ru = {
2908
3781
  purgeSampleData: 'Удалить демоданные',
2909
3782
  purgeConfirm: 'Удалить все демонстрационные записи, созданные этим пакетом? Записи, добавленные пользователем, НЕ будут затронуты.',
2910
3783
  purgeSuccess: 'Удалено демонстрационных записей: {{count}}.',
3784
+ purgeSuccess_one: 'Удалено демонстрационных записей: {{count}}.',
3785
+ purgeSuccess_few: 'Удалено демонстрационных записей: {{count}}.',
3786
+ purgeSuccess_many: 'Удалено демонстрационных записей: {{count}}.',
3787
+ purgeSuccess_other: 'Удалено демонстрационных записей: {{count}}.',
2911
3788
  purgeNoData: 'Демонстрационные записи для удаления не найдены.',
2912
3789
  reseedQueued: 'Демоданные будут перезагружены при следующем доступе к среде.',
2913
3790
  reseedLocalSuccess: 'Демоданные перезагружены: добавлено {{inserted}}, обновлено {{updated}}.',
2914
3791
  reseedPartialErrors: '(не удалось записать записей: {{count}})',
3792
+ reseedPartialErrors_one: '(не удалось записать записей: {{count}})',
3793
+ reseedPartialErrors_few: '(не удалось записать записей: {{count}})',
3794
+ reseedPartialErrors_many: '(не удалось записать записей: {{count}})',
3795
+ reseedPartialErrors_other: '(не удалось записать записей: {{count}})',
3796
+ sampleDataKernelUnavailable: 'У этой control plane нет ядра среды, поэтому здесь нельзя перезагрузить или удалить демоданные. Выполните это действие в собственном рантайме среды.',
2915
3797
  updateAvailable: 'Доступно обновление',
2916
3798
  },
2917
3799
  action: {
@@ -2921,6 +3803,7 @@ const ru = {
2921
3803
  working: "Обработка…",
2922
3804
  installToCloud: "Установить в облако…",
2923
3805
  installing: "Установка…",
3806
+ updating: "Обновление…",
2924
3807
  uninstall: "Удалить",
2925
3808
  uninstalling: "Удаление…",
2926
3809
  details: "Подробности",
@@ -2938,15 +3821,45 @@ const ru = {
2938
3821
  environmentPlaceholder: "Выбрать среду",
2939
3822
  includeSampleData: "Включить образцы данных",
2940
3823
  noEnvs: "В активной организации нет сред.",
2941
- noPermission: "Нет прав на установку. Только владельцы и администраторы могут устанавливать.",
3824
+ noPermission: "Нет прав на установку. Только владельцы и администраторы организации могут устанавливать — обратитесь к администратору вашей организации.",
2942
3825
  signInFirst: "Сначала войдите в ObjectStack Cloud.",
2943
3826
  success: "Установлено. Откройте среду, чтобы увидеть новое приложение.",
2944
3827
  localSuccess: "v{{version}} установлено. \"{{name}}\" должно появиться в переключателе.",
3828
+ localLoadsAtRestart: "v{{version}} установлено. \"{{name}}\" загрузится при следующем перезапуске среды выполнения и до этого не появится в переключателе.",
2945
3829
  localManifestConflict: "{{message}}\nПримечание: Локальное приложение уже имеет этот manifest_id. Сначала удалите его из objectstack.config.ts.",
2946
3830
  localUnauthorized: "Сначала войдите в этот рантайм.",
2947
3831
  localMarketplaceUnavailable: "OS_CLOUD_URL не настроен.",
2948
3832
  updateTo: "Обновить → v{{version}}",
2949
3833
  installedVersion: "Установлено v{{version}}",
3834
+ deploying: "Развёртывание приложения…",
3835
+ deployed: "Приложение развёрнуто и готово к работе.",
3836
+ openApp: "Открыть {{name}}",
3837
+ deployTimeout: "Установка записана, но эта среда пока не предоставляет приложение. Возможно, развёртывание ещё идёт — проверьте снова чуть позже. Если оно так и не появится, пакет мог не загрузиться, не содержать приложения или требовать разрешение, которого у вас нет.",
3838
+ checkAgain: "Проверить снова",
3839
+ // ADR-0131 D6 — the install modes a package's manifest permits, and
3840
+ // what an unmanaged install answers (MarketplacePackagePage).
3841
+ mode: {
3842
+ label: "Способ установки",
3843
+ managed: "Управляемая",
3844
+ managedHint: "Пакет остаётся источником истины: он регистрируется как код, получает свои обновления, а его элементы здесь не редактируются.",
3845
+ unmanaged: "Неуправляемая копия",
3846
+ unmanagedHint: "Однократно копируется в эту среду выполнения как её собственные метаданные: каждый элемент здесь можно редактировать, а копия не получает обновлений.",
3847
+ required: "Выберите способ установки, чтобы установить этот пакет.",
3848
+ },
3849
+ unmanagedSuccess: "v{{version}} пакета \"{{name}}\" скопирована в эту среду выполнения как её собственные метаданные, в базу {{base}}. Копию можно редактировать, обновлений она не получает.",
3850
+ unmanagedStrippedLocks: "Пакет блокировал эти элементы. Копию можно редактировать, поэтому их блокировки не скопированы:",
3851
+ unmanagedIgnored: "Эта среда выполнения не поддерживает неуправляемую установку, поэтому \"{{name}}\" установлен как управляемый (зарегистрирован как код), а не скопирован. Обновите среду выполнения, затем удалите пакет и установите его снова как неуправляемую копию.",
3852
+ },
3853
+ // objectui#12146 — the install dialog opened as an UPDATE of the copy
3854
+ // this environment holds (MarketplacePackagePage).
3855
+ update: {
3856
+ dialogTitle: "Обновить {{name}}",
3857
+ dialogDescCurrent: "Обновить копию, установленную в этой среде ({{host}}).",
3858
+ dialogDescPicker: "Выберите среду, в которой нужно обновить установленную копию. Требуется вход в ObjectStack Cloud.",
3859
+ majorNotice: "Это обновление основной версии (v{{fromMajor}} → v{{toMajor}}), оно может содержать несовместимые изменения.",
3860
+ releaseNotes: "Прочитать примечания к выпуску v{{version}}",
3861
+ success: "Обновлено до v{{version}}.",
3862
+ deployTimeout: "Обновление записано, но эта среда пока не предоставляет v{{version}}. Возможно, развёртывание ещё идёт — проверьте снова чуть позже.",
2950
3863
  },
2951
3864
  // objectui#3546 — the MarketplacePage "Your organization" strip.
2952
3865
  org: {
@@ -2964,7 +3877,8 @@ const ru = {
2964
3877
  reviewed: "Проверено и одобрено",
2965
3878
  unreviewed: "Ещё не проверено",
2966
3879
  signed: "Подписано",
2967
- grantsIntro: "При установке пакет получит:",
3880
+ grantsIntro: "Пакет запрашивает:",
3881
+ notEnforced: "Список записывается при установке и подтверждается заново, если более поздняя версия запросит больше, но среда выполнения пока не ограничивает пакет этим списком.",
2968
3882
  services: "Сервисы платформы",
2969
3883
  hooks: "Хуки жизненного цикла",
2970
3884
  network: "Доступ к сети",
@@ -2978,9 +3892,11 @@ const ru = {
2978
3892
  },
2979
3893
  },
2980
3894
  uninstall: {
2981
- confirm: "Удалить {{manifestId}} v{{version}}?\n\nКэшированный манифест будет удалён.",
2982
- successInList: "{{manifestId}} удалён. Перезапустите рантайм для полной выгрузки.",
2983
- successInDetail: "Кэшированный манифест {{manifestId}} удалён.",
3895
+ confirm: "Удалить {{manifestId}} v{{version}}?\n\nПриложение сразу будет убрано из работающего ядра вместе с его наборами разрешений и их назначениями, а кэшированный манифест будет удалён. Записи, хранящиеся в его объектах, остаются в базе данных.",
3896
+ successInList: "{{manifestId}} удалён: приложение убрано из работающего ядра вместе с его наборами разрешений и их назначениями. Записи, хранящиеся в его объектах, остаются в базе данных.",
3897
+ successInDetail: "{{manifestId}} и его кэшированный манифест удалены: приложение убрано из работающего ядра вместе с его наборами разрешений и их назначениями. Записи, хранящиеся в его объектах, остаются в базе данных.",
3898
+ confirmNotLoaded: "Удалить {{manifestId}} v{{version}}?\n\nКэшированный манифест будет удалён. Рантайм не загружал этот пакет, поэтому ничего из него не запущено.",
3899
+ successNotLoaded: "{{manifestId}} удалён. Пакет не был загружен, перезапуск не требуется.",
2984
3900
  },
2985
3901
  accessDenied: {
2986
3902
  title: "Только для администраторов",
@@ -3003,30 +3919,23 @@ const ru = {
3003
3919
  storage: "Хранилище",
3004
3920
  other: "Другое",
3005
3921
  },
3006
- pricing: {
3007
- free: "Бесплатно",
3008
- freemium: "Freemium",
3009
- paid: "Платно",
3010
- subscription: "Подписка",
3011
- "usage-based": "По использованию",
3012
- "contact-sales": "Связаться с продажами",
3013
- },
3014
3922
  relativeTime: {
3015
3923
  today: "сегодня",
3016
3924
  daysAgo: "{{count}} д назад",
3017
3925
  monthsAgo: "{{count}} мес назад",
3926
+ monthsAgo_one: "{{count}} мес назад",
3927
+ monthsAgo_few: "{{count}} мес назад",
3928
+ monthsAgo_many: "{{count}} мес назад",
3929
+ monthsAgo_other: "{{count}} мес назад",
3018
3930
  yearsAgo: "{{count}} лет назад",
3931
+ yearsAgo_one: "{{count}} год назад",
3932
+ yearsAgo_few: "{{count}} года назад",
3933
+ yearsAgo_many: "{{count}} лет назад",
3934
+ yearsAgo_other: "{{count}} года назад",
3019
3935
  },
3020
3936
  },
3021
- approvals: {
3022
- approve: 'Утвердить',
3023
- reject: 'Отклонить',
3024
- comment: 'Комментарий (необязательно)',
3025
- approveSuccess: 'Утверждено',
3026
- rejectSuccess: 'Отклонено',
3027
- rejectConfirm: 'Отклонить этот запрос на согласование?',
3028
- },
3029
3937
  approvalsInbox: {
3938
+ recordUnresolvable: 'Эту запись невозможно открыть',
3030
3939
  loadMore: 'Загрузить ещё',
3031
3940
  loadingMore: 'Загрузка…',
3032
3941
  loadedOf: 'Загружено {{loaded}} из {{total}}',
@@ -3045,6 +3954,10 @@ const ru = {
3045
3954
  requestInfoSent: 'Возвращено заявителю за дополнениями',
3046
3955
  remindBtn: 'Напомнить',
3047
3956
  remindSuccess: 'Напоминание отправлено: {{count}}',
3957
+ remindSuccess_one: 'Напоминание отправлено: {{count}}',
3958
+ remindSuccess_few: 'Напоминание отправлено: {{count}}',
3959
+ remindSuccess_many: 'Напоминание отправлено: {{count}}',
3960
+ remindSuccess_other: 'Напоминание отправлено: {{count}}',
3048
3961
  remindThrottled: 'Напоминание уже отправлялось недавно — попробуйте позже.',
3049
3962
  replyPlaceholder: 'Ответить по этому запросу…',
3050
3963
  slaRemaining: 'SLA: осталось {{dur}}',
@@ -3061,8 +3974,13 @@ const ru = {
3061
3974
  progressApprovals: 'Согласования — {{got}} из {{need}}',
3062
3975
  progressGroups: 'Ход визирования — {{got}} из {{need}} групп',
3063
3976
  progressEligible: 'Доступных согласующих: {{count}}',
3977
+ progressEligible_one: 'Доступных согласующих: {{count}}',
3978
+ progressEligible_few: 'Доступных согласующих: {{count}}',
3979
+ progressEligible_many: 'Доступных согласующих: {{count}}',
3980
+ progressEligible_other: 'Доступных согласующих: {{count}}',
3064
3981
  progressBar: 'Ход решения',
3065
3982
  declaredActions: 'Действия',
3983
+ decisionPanelOffRequestPage: 'Панель решения по согласованию работает только на страницах запросов на согласование.',
3066
3984
  attachmentChip: 'Вложение',
3067
3985
  attachmentOpenFailed: 'Не удалось открыть вложение — попробуйте ещё раз',
3068
3986
  approveOneTitle: 'Согласовать «{{title}}»?',
@@ -3092,6 +4010,10 @@ const ru = {
3092
4010
  filterCount: '{{shown}} из {{total}}',
3093
4011
  selected: 'выбрано',
3094
4012
  actionableCount: '({{count}} доступно)',
4013
+ actionableCount_one: '({{count}} доступно)',
4014
+ actionableCount_few: '({{count}} доступно)',
4015
+ actionableCount_many: '({{count}} доступно)',
4016
+ actionableCount_other: '({{count}} доступно)',
3095
4017
  selectAll: 'Выбрать все',
3096
4018
  selectRow: 'Выбрать запрос',
3097
4019
  colRequest: 'Запрос',
@@ -3126,6 +4048,11 @@ const ru = {
3126
4048
  emptyPending: 'Всё обработано — ничего не ожидает вашего решения.',
3127
4049
  emptyOther: 'Здесь пока пусто.',
3128
4050
  emptyViewAll: 'Все запросы',
4051
+ waitingOnOthers: "{{count}} запроса ожидают других согласующих",
4052
+ waitingOnOthers_one: "{{count}} запрос ожидает других согласующих",
4053
+ waitingOnOthers_few: "{{count}} запроса ожидают других согласующих",
4054
+ waitingOnOthers_many: "{{count}} запросов ожидают других согласующих",
4055
+ waitingOnOthers_other: "{{count}} запроса ожидают других согласующих",
3129
4056
  noMatches: 'Нет совпадений с текущими фильтрами.',
3130
4057
  keyboardHint: 'Клавиши: j/k перемещение · Enter открыть · x выбрать · a согласовать · r отклонить',
3131
4058
  drawerTitle: 'Запрос на согласование',
@@ -3143,12 +4070,12 @@ const ru = {
3143
4070
  overrideActionLabel: '{{action}} (по праву администратора)',
3144
4071
  overrideNotice: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а все согласующие, ещё не принявшие решение, будут пропущены. Решение будет записано как административное переопределение.',
3145
4072
  overrideNoticeWho: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а согласующие, ещё не принявшие решение, будут пропущены — {{who}}. Решение будет записано как административное переопределение.',
4073
+ overrideReassignNotice: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг перейдёт выбранному вами новому согласующему, а все согласующие, ещё не принявшие решение, будут заменены. Запрос останется в ожидании решения нового согласующего. Передача будет записана как административное переопределение.',
4074
+ overrideReassignNoticeWho: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг перейдёт выбранному вами новому согласующему, а согласующие, ещё не принявшие решение, будут заменены — {{who}}. Запрос останется в ожидании решения нового согласующего. Передача будет записана как административное переопределение.',
4075
+ overrideRecallNotice: 'Вы не отправляли этот запрос. Продолжив, вы воспользуетесь правом администратора: запрос будет отозван, согласующие, ещё не принявшие решение, больше не смогут по нему действовать, а запись будет разблокирована.',
4076
+ overrideRecallNoticeWho: 'Вы не отправляли этот запрос. Продолжив, вы воспользуетесь правом администратора: запрос будет отозван, запись будет разблокирована, а согласующие, ещё не принявшие решение, больше не смогут по нему действовать — {{who}}.',
3146
4077
  viaOverrideChip: 'Переопределение администратора',
3147
4078
  viaOverrideHint: 'У исполнителя не было места согласующего на этом шаге — допущен по пути административного переопределения.',
3148
- rawData: 'Исходные данные (JSON)',
3149
- copy: 'Копировать',
3150
- copied: 'Скопировано',
3151
- copyFailed: 'Не удалось скопировать',
3152
4079
  overrideActor: 'Действовать от другого имени (админ)',
3153
4080
  actor: 'Идентичность',
3154
4081
  auto: 'Авто',
@@ -3165,11 +4092,27 @@ const ru = {
3165
4092
  approveN: 'Согласовать {{count}}',
3166
4093
  rejectN: 'Отклонить {{count}}',
3167
4094
  bulkApproveTitle: 'Согласовать {{count}} запросов?',
4095
+ bulkApproveTitle_one: 'Согласовать {{count}} запрос?',
4096
+ bulkApproveTitle_few: 'Согласовать {{count}} запроса?',
4097
+ bulkApproveTitle_many: 'Согласовать {{count}} запросов?',
4098
+ bulkApproveTitle_other: 'Согласовать {{count}} запроса?',
3168
4099
  bulkApproveBody: 'Каждый запрос согласуется от вашего имени, и поток продолжится по ветке согласования.',
3169
4100
  bulkRejectTitle: 'Отклонить {{count}} запросов?',
4101
+ bulkRejectTitle_one: 'Отклонить {{count}} запрос?',
4102
+ bulkRejectTitle_few: 'Отклонить {{count}} запроса?',
4103
+ bulkRejectTitle_many: 'Отклонить {{count}} запросов?',
4104
+ bulkRejectTitle_other: 'Отклонить {{count}} запроса?',
3170
4105
  bulkRejectBody: 'Выбранные запросы будут отклонены, заявители получат уведомления.',
3171
4106
  bulkApproved: 'Согласовано запросов: {{count}}',
4107
+ bulkApproved_one: 'Согласовано запросов: {{count}}',
4108
+ bulkApproved_few: 'Согласовано запросов: {{count}}',
4109
+ bulkApproved_many: 'Согласовано запросов: {{count}}',
4110
+ bulkApproved_other: 'Согласовано запросов: {{count}}',
3172
4111
  bulkRejected: 'Отклонено запросов: {{count}}',
4112
+ bulkRejected_one: 'Отклонено запросов: {{count}}',
4113
+ bulkRejected_few: 'Отклонено запросов: {{count}}',
4114
+ bulkRejected_many: 'Отклонено запросов: {{count}}',
4115
+ bulkRejected_other: 'Отклонено запросов: {{count}}',
3173
4116
  bulkPartial: 'Успешно: {{ok}}, с ошибкой: {{fail}}: {{which}}',
3174
4117
  rejectOneTitle: 'Отклонить «{{title}}»?',
3175
4118
  rejectOneBody: 'Запрос будет отклонён, заявитель получит уведомление.',
@@ -3194,8 +4137,20 @@ const ru = {
3194
4137
  alreadyDecided: 'Этот запрос уже обработан. Обновите список.',
3195
4138
  justNow: 'только что',
3196
4139
  minutesAgo: '{{count}} мин назад',
4140
+ minutesAgo_one: '{{count}} мин назад',
4141
+ minutesAgo_few: '{{count}} мин назад',
4142
+ minutesAgo_many: '{{count}} мин назад',
4143
+ minutesAgo_other: '{{count}} мин назад',
3197
4144
  hoursAgo: '{{count}} ч назад',
4145
+ hoursAgo_one: '{{count}} ч назад',
4146
+ hoursAgo_few: '{{count}} ч назад',
4147
+ hoursAgo_many: '{{count}} ч назад',
4148
+ hoursAgo_other: '{{count}} ч назад',
3198
4149
  daysAgo: '{{count}} дн назад',
4150
+ daysAgo_one: '{{count}} дн назад',
4151
+ daysAgo_few: '{{count}} дн назад',
4152
+ daysAgo_many: '{{count}} дн назад',
4153
+ daysAgo_other: '{{count}} дн назад',
3199
4154
  },
3200
4155
  preview: {
3201
4156
  empty: {
@@ -3216,6 +4171,11 @@ const ru = {
3216
4171
  publishing: 'Публикация…',
3217
4172
  exit: 'Выйти из предпросмотра',
3218
4173
  changes: 'Изменения',
4174
+ pendingHere: 'Предпросмотр черновика · {{count}} неопубликованных изменений на этой странице',
4175
+ pendingHere_one: 'Предпросмотр черновика · {{count}} неопубликованное изменение на этой странице',
4176
+ pendingHere_few: 'Предпросмотр черновика · {{count}} неопубликованных изменения на этой странице',
4177
+ pendingHere_many: 'Предпросмотр черновика · {{count}} неопубликованных изменений на этой странице',
4178
+ pendingHere_other: 'Предпросмотр черновика · {{count}} неопубликованного изменения на этой странице',
3219
4179
  },
3220
4180
  changes: {
3221
4181
  title: 'Ожидающие изменения',
@@ -3230,11 +4190,97 @@ const ru = {
3230
4190
  detailNone: 'Различий не обнаружено — черновик совпадает с опубликованной версией.',
3231
4191
  detailChangedKeys: 'Также изменено:',
3232
4192
  confirmNote: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
4193
+ confirmNote_one: 'Публикация атомарно выпускает {{count}} ожидающий черновик этого пакета.',
4194
+ confirmNote_few: 'Публикация атомарно выпускает все {{count}} ожидающих черновика этого пакета.',
4195
+ confirmNote_many: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
4196
+ confirmNote_other: 'Публикация атомарно выпускает {{count}} ожидающего черновика этого пакета.',
4197
+ // objectui#11591 — the package-less sheet: no package to batch, so each
4198
+ // draft publishes by itself and one that fails stays pending.
4199
+ confirmNoteSeparate: 'Публикация выпускает {{count}} ожидающих черновиков по отдельности: черновик, который не удастся опубликовать, останется ожидающим, а остальные всё равно будут опубликованы.',
4200
+ confirmNoteSeparate_one: 'Публикация выпускает {{count}} ожидающий черновик по отдельности: тот, который не удастся опубликовать, останется ожидающим.',
4201
+ confirmNoteSeparate_few: 'Публикация выпускает {{count}} ожидающих черновика по отдельности: черновик, который не удастся опубликовать, останется ожидающим, а остальные всё равно будут опубликованы.',
4202
+ confirmNoteSeparate_many: 'Публикация выпускает {{count}} ожидающих черновиков по отдельности: черновик, который не удастся опубликовать, останется ожидающим, а остальные всё равно будут опубликованы.',
4203
+ confirmNoteSeparate_other: 'Публикация выпускает {{count}} ожидающего черновика по отдельности: черновик, который не удастся опубликовать, останется ожидающим, а остальные всё равно будут опубликованы.',
3233
4204
  publishConfirm: 'Опубликовать всё',
3234
- // [objectui#5418] Pre-publish security-posture findings, shown next to
4205
+ summaryItems: '{{count}} элементов',
4206
+ summaryItems_one: '{{count}} элемент',
4207
+ summaryItems_few: '{{count}} элемента',
4208
+ summaryItems_many: '{{count}} элементов',
4209
+ summaryItems_other: '{{count}} элемента',
4210
+ summaryType: '{{type}}: {{n}}',
4211
+ typeCount: {
4212
+ object: 'Объекты: {{count}}',
4213
+ object_one: 'Объект: {{count}}',
4214
+ object_few: 'Объекты: {{count}}',
4215
+ object_many: 'Объекты: {{count}}',
4216
+ object_other: 'Объекты: {{count}}',
4217
+ view: 'Представления: {{count}}',
4218
+ view_one: 'Представление: {{count}}',
4219
+ view_few: 'Представления: {{count}}',
4220
+ view_many: 'Представления: {{count}}',
4221
+ view_other: 'Представления: {{count}}',
4222
+ page: 'Страницы: {{count}}',
4223
+ page_one: 'Страница: {{count}}',
4224
+ page_few: 'Страницы: {{count}}',
4225
+ page_many: 'Страницы: {{count}}',
4226
+ page_other: 'Страницы: {{count}}',
4227
+ dashboard: 'Панели мониторинга: {{count}}',
4228
+ dashboard_one: 'Панель мониторинга: {{count}}',
4229
+ dashboard_few: 'Панели мониторинга: {{count}}',
4230
+ dashboard_many: 'Панели мониторинга: {{count}}',
4231
+ dashboard_other: 'Панели мониторинга: {{count}}',
4232
+ app: 'Приложения: {{count}}',
4233
+ app_one: 'Приложение: {{count}}',
4234
+ app_few: 'Приложения: {{count}}',
4235
+ app_many: 'Приложения: {{count}}',
4236
+ app_other: 'Приложения: {{count}}',
4237
+ action: 'Действия: {{count}}',
4238
+ action_one: 'Действие: {{count}}',
4239
+ action_few: 'Действия: {{count}}',
4240
+ action_many: 'Действия: {{count}}',
4241
+ action_other: 'Действия: {{count}}',
4242
+ report: 'Отчёты: {{count}}',
4243
+ report_one: 'Отчёт: {{count}}',
4244
+ report_few: 'Отчёты: {{count}}',
4245
+ report_many: 'Отчёты: {{count}}',
4246
+ report_other: 'Отчёты: {{count}}',
4247
+ flow: 'Потоки: {{count}}',
4248
+ flow_one: 'Поток: {{count}}',
4249
+ flow_few: 'Потоки: {{count}}',
4250
+ flow_many: 'Потоки: {{count}}',
4251
+ flow_other: 'Потоки: {{count}}',
4252
+ permission: 'Наборы разрешений: {{count}}',
4253
+ permission_one: 'Набор разрешений: {{count}}',
4254
+ permission_few: 'Наборы разрешений: {{count}}',
4255
+ permission_many: 'Наборы разрешений: {{count}}',
4256
+ permission_other: 'Наборы разрешений: {{count}}',
4257
+ agent: 'Агенты: {{count}}',
4258
+ agent_one: 'Агент: {{count}}',
4259
+ agent_few: 'Агенты: {{count}}',
4260
+ agent_many: 'Агенты: {{count}}',
4261
+ agent_other: 'Агенты: {{count}}',
4262
+ email_template: 'Шаблоны писем: {{count}}',
4263
+ email_template_one: 'Шаблон письма: {{count}}',
4264
+ email_template_few: 'Шаблоны писем: {{count}}',
4265
+ email_template_many: 'Шаблоны писем: {{count}}',
4266
+ email_template_other: 'Шаблоны писем: {{count}}',
4267
+ },
4268
+ // objectui#12929 — the unchecked choice under an added object field whose
4269
+ // literal default the batch publish can write into the existing records.
4270
+ backfillOption: 'Заполнить значением по умолчанию ({{count}} существующих записей)',
4271
+ backfillOption_one: 'Заполнить значением по умолчанию ({{count}} существующая запись)',
4272
+ backfillOption_few: 'Заполнить значением по умолчанию ({{count}} существующие записи)',
4273
+ backfillOption_many: 'Заполнить значением по умолчанию ({{count}} существующих записей)',
4274
+ backfillOption_other: 'Заполнить значением по умолчанию ({{count}} существующей записи)',
4275
+ backfillOptionNoCount: 'Заполнить значением по умолчанию',
4276
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3235
4277
  // the confirm button so a refusal the door would issue is read BEFORE
3236
4278
  // the click rather than as a toast after the batch rolled back.
3237
4279
  securityBlockTitle: 'Публикация будет отклонена — {{count}} элемент(ов) требуют решения',
4280
+ securityBlockTitle_one: 'Публикация будет отклонена — {{count}} элемент требует решения',
4281
+ securityBlockTitle_few: 'Публикация будет отклонена — {{count}} элемента требуют решения',
4282
+ securityBlockTitle_many: 'Публикация будет отклонена — {{count}} элементов требуют решения',
4283
+ securityBlockTitle_other: 'Публикация будет отклонена — {{count}} элемента требуют решения',
3238
4284
  securityBlockWhere: 'Исправьте это в объекте в разделе «Настройки → Общий доступ к записям» и опубликуйте снова.',
3239
4285
  },
3240
4286
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3259,7 +4305,7 @@ const ru = {
3259
4305
  revertLabel: 'Изменение отменено',
3260
4306
  applyLabel: 'Изменение сборки',
3261
4307
  revert: 'отмена',
3262
- items: 'элементов',
4308
+ items: 'Элементов: {{count}}',
3263
4309
  revertAction: 'Отменить',
3264
4310
  reverted: 'Отменено — изменение возвращено.',
3265
4311
  revertFailed: 'Не удалось отменить',
@@ -3288,28 +4334,32 @@ const ru = {
3288
4334
  rangeEnd: "До",
3289
4335
  operators: {
3290
4336
  equals: "Равно",
3291
- notEquals: "Не равно",
4337
+ not_equals: "Не равно",
3292
4338
  contains: "Содержит",
3293
- containsCaseInsensitive: "Содержит (без учёта регистра)",
3294
- notContains: "Не содержит",
3295
- isEmpty: "Пусто",
3296
- isNotEmpty: "Не пусто",
3297
- greaterThan: "Больше",
3298
- lessThan: "Меньше",
3299
- greaterOrEqual: "Больше или равно",
3300
- lessOrEqual: "Меньше или равно",
4339
+ icontains: "Содержит (без учёта регистра)",
4340
+ not_contains: "Не содержит",
4341
+ is_empty: "Пусто",
4342
+ is_not_empty: "Не пусто",
4343
+ greater_than: "Больше",
4344
+ less_than: "Меньше",
4345
+ greater_than_or_equal: "Больше или равно",
4346
+ less_than_or_equal: "Меньше или равно",
3301
4347
  before: "До",
3302
4348
  after: "После",
3303
4349
  between: "Между",
3304
4350
  in: "В списке",
3305
- notIn: "Не в списке",
3306
- startsWith: "Начинается с",
3307
- endsWith: "Заканчивается на",
3308
- isNull: "Равно null",
3309
- isNotNull: "Не равно null",
4351
+ not_in: "Не в списке",
4352
+ starts_with: "Начинается с",
4353
+ ends_with: "Заканчивается на",
4354
+ is_null: "Равно null",
4355
+ is_not_null: "Не равно null",
3310
4356
  exists: "Задано",
3311
4357
  notExists: "Не задано",
3312
4358
  },
4359
+ emptyCheckHint: {
4360
+ text: '«{{isEmpty}}» также находит пустой текст; «{{isNull}}» — только отсутствующее значение.',
4361
+ list: '«{{isEmpty}}» также находит пустой список; «{{isNull}}» — только отсутствующее значение.',
4362
+ },
3313
4363
  },
3314
4364
  sortBuilder: {
3315
4365
  sortBy: "Сортировать по",
@@ -3322,7 +4372,10 @@ const ru = {
3322
4372
  },
3323
4373
  collaboration: {
3324
4374
  commentCount: "Комментариев: {{count}}",
3325
- commentCountOne: "{{count}} комментарий",
4375
+ commentCount_one: "{{count}} комментарий",
4376
+ commentCount_few: "{{count}} комментария",
4377
+ commentCount_many: "{{count}} комментариев",
4378
+ commentCount_other: "{{count}} комментария",
3326
4379
  resolvedSuffix: " · Решено",
3327
4380
  sortComments: "Сортировка комментариев",
3328
4381
  sortOldest: "Сначала старые",
@@ -3331,11 +4384,26 @@ const ru = {
3331
4384
  reopen: "Открыть заново",
3332
4385
  justNow: "только что",
3333
4386
  minutesAgo: "{{count}} мин назад",
4387
+ minutesAgo_one: "{{count}} мин назад",
4388
+ minutesAgo_few: "{{count}} мин назад",
4389
+ minutesAgo_many: "{{count}} мин назад",
4390
+ minutesAgo_other: "{{count}} мин назад",
3334
4391
  hoursAgo: "{{count}} ч назад",
4392
+ hoursAgo_one: "{{count}} ч назад",
4393
+ hoursAgo_few: "{{count}} ч назад",
4394
+ hoursAgo_many: "{{count}} ч назад",
4395
+ hoursAgo_other: "{{count}} ч назад",
3335
4396
  daysAgo: "{{count}} д назад",
4397
+ daysAgo_one: "{{count}} д назад",
4398
+ daysAgo_few: "{{count}} д назад",
4399
+ daysAgo_many: "{{count}} д назад",
4400
+ daysAgo_other: "{{count}} д назад",
3336
4401
  edited: "(изменено)",
3337
4402
  reactionCount: "Реакций: {{count}}",
3338
- reactionCountOne: "{{count}} реакция",
4403
+ reactionCount_one: "{{count}} реакция",
4404
+ reactionCount_few: "{{count}} реакции",
4405
+ reactionCount_many: "{{count}} реакций",
4406
+ reactionCount_other: "{{count}} реакции",
3339
4407
  addThumbsUp: "Поставить лайк",
3340
4408
  reply: "Ответить",
3341
4409
  reactThumbsUp: "Отреагировать лайком",
@@ -3346,9 +4414,15 @@ const ru = {
3346
4414
  commentPlaceholder: "Добавьте комментарий… (@ — упоминание)",
3347
4415
  send: "Отправить",
3348
4416
  presentUserCount: "Присутствует пользователей: {{count}}",
3349
- presentUserCountOne: "Присутствует {{count}} пользователь",
4417
+ presentUserCount_one: "Присутствует {{count}} пользователь",
4418
+ presentUserCount_few: "Присутствуют {{count}} пользователя",
4419
+ presentUserCount_many: "Присутствует {{count}} пользователей",
4420
+ presentUserCount_other: "Присутствует {{count}} пользователя",
3350
4421
  moreUserCount: "Ещё пользователей: {{count}}",
3351
- moreUserCountOne: "Ещё {{count}} пользователь",
4422
+ moreUserCount_one: "Ещё {{count}} пользователь",
4423
+ moreUserCount_few: "Ещё {{count}} пользователя",
4424
+ moreUserCount_many: "Ещё {{count}} пользователей",
4425
+ moreUserCount_other: "Ещё {{count}} пользователя",
3352
4426
  userStatusTitle: "{{name}} ({{status}})",
3353
4427
  statusActive: "активен",
3354
4428
  statusIdle: "бездействует",
@@ -3356,6 +4430,11 @@ const ru = {
3356
4430
  },
3357
4431
  wizard: {
3358
4432
  missingRequired: "Заполните обязательные поля: {{fields}}",
4433
+ back: "Назад",
4434
+ submitting: "Отправка…",
4435
+ stepFallback: "Шаг {{n}}",
4436
+ progressLabel: "Прогресс",
4437
+ emptyStep: "Для этого шага не настроены поля",
3359
4438
  },
3360
4439
  flowRunner: {
3361
4440
  title: 'Ввод',
@@ -3405,6 +4484,8 @@ const ru = {
3405
4484
  setDefaultFailed: "Не удалось установить приложение по умолчанию: {{reason}}",
3406
4485
  appDeleted: "{{name}} удалено",
3407
4486
  deleteFailed: "Не удалось удалить приложение: {{reason}}",
4487
+ nothingToDelete: "Нечего удалять для {{name}}: {{reason}}",
4488
+ alreadyAtDefault: "оно уже соответствует значению по умолчанию из пакета",
3408
4489
  bulkEnabled: "Включено приложений: {{n}}",
3409
4490
  bulkDisabled: "Отключено приложений: {{n}}",
3410
4491
  bulkFailed: "Не удалось для {{n}}: {{details}}",
@@ -3413,5 +4494,131 @@ const ru = {
3413
4494
  bulkOperationFailed: "Массовая операция не выполнена: {{reason}}",
3414
4495
  },
3415
4496
  },
4497
+ // objectui#6301 — Настройка › Автоматизация из пакетов (ADR-0126 §7.4).
4498
+ // Терминология пакета: `common.package` = Пакет, `flowRunner.completed` =
4499
+ // Поток, кавычки «…». ⛔ Никаких формулировок о происхождении или
4500
+ // расхождении в этой группе (§9).
4501
+ packagedAutomation: {
4502
+ title: "Автоматизация из пакетов",
4503
+ subtitle: "Потоки и действия, поставляемые установленными пакетами. Отключите любой из них в этой установке или клонируйте поток под новым именем, чтобы настроить. Редактирование — в Studio.",
4504
+ refresh: "Обновить",
4505
+ flowsHeading: "Потоки из пакетов",
4506
+ actionsHeading: "Действия из пакетов",
4507
+ colFlow: "Поток",
4508
+ colActivation: "Активация",
4509
+ colActions: "Действия",
4510
+ toggleLabel: "Активация для {{label}}",
4511
+ on: "Вкл.",
4512
+ off: "Выкл.",
4513
+ notRunning: "Здесь не выполняется",
4514
+ clone: "Клонировать",
4515
+ cloneTitle: "Клонировать поток из пакета",
4516
+ cloneBody: "Копия сохраняет определение целиком и требует нового машинного имени и метки. Редактируйте копию в Studio.",
4517
+ cloneName: "Новое машинное имя",
4518
+ cloneLabel: "Новая метка",
4519
+ cancel: "Отмена",
4520
+ cloneConfirm: "Создать клон",
4521
+ cloneCreated: "Поток «{{name}}» создан.",
4522
+ cloneSwitchSourceOff: "Выключить «{{label}}»",
4523
+ cloneSourceOff: "Пакетный поток «{{label}}» выключен.",
4524
+ cloneOpen: "Открыть копию в Studio",
4525
+ emptyTitle: "Нет потоков из пакетов",
4526
+ emptyBody: "В этой установке ни один установленный пакет не поставляет поток автоматизации. Потоки, которые вы создаёте сами, находятся в Studio.",
4527
+ loadFailed: "Не удалось загрузить автоматизацию из пакетов.",
4528
+ toggleFailedHttp: "Не удалось изменить активацию (HTTP {{status}}).",
4529
+ toggleFailed: "Не удалось изменить активацию.",
4530
+ cloneFailedHttp: "Не удалось клонировать этот поток (HTTP {{status}}).",
4531
+ cloneFailed: "Не удалось клонировать этот поток.",
4532
+ reasonDetails: "Подробности",
4533
+ actionsSubtitle: "Действия, поставляемые установленными пакетами. Отключите действие в этой установке — и оно перестанет выполняться везде, где предлагается. Создать рядом собственное действие по-прежнему можно в Studio.",
4534
+ colAction: "Действие",
4535
+ colObject: "Объект",
4536
+ actionToggleLabel: "Активация для {{label}} на {{object}}",
4537
+ actionsEmptyTitle: "Нет действий из пакетов",
4538
+ actionsEmptyBody: "В этой установке ни один установленный пакет не объявляет действие. Действия, которые вы создаёте сами, находятся в Studio.",
4539
+ actionsLoadFailed: "Не удалось загрузить действия из пакетов.",
4540
+ },
4541
+ element: {
4542
+ number: {
4543
+ noObject: "Объект не указан: задайте dataSource.object.",
4544
+ sourceUnresolved: "Не удалось определить источник данных этого показателя",
4545
+ },
4546
+ image: {
4547
+ noSource: "Нет источника изображения",
4548
+ },
4549
+ recordPicker: {
4550
+ sourceUnresolved: "Не удалось определить источник данных этого выбора записи",
4551
+ },
4552
+ calendar: {
4553
+ sourceUnresolved: "Не удалось определить источник данных этого календаря",
4554
+ },
4555
+ chart: {
4556
+ sourceUnresolved: "Не удалось определить источник данных этой диаграммы",
4557
+ },
4558
+ pivotTable: {
4559
+ sourceUnresolved: "Не удалось определить источник данных этой сводной таблицы",
4560
+ },
4561
+ detailView: {
4562
+ sourceUnresolved: "Не удалось определить источник данных этого подробного представления",
4563
+ },
4564
+ relatedList: {
4565
+ sourceUnresolved: "Не удалось определить источник данных этого связанного списка",
4566
+ parentUnreadable: "Не удалось прочитать родительскую запись этого связанного списка",
4567
+ },
4568
+ form: {
4569
+ sourceUnresolved: "Не удалось определить источник данных этой формы",
4570
+ },
4571
+ lineItems: {
4572
+ sourceUnresolved: "Не удалось определить источник данных этой панели позиций",
4573
+ },
4574
+ gantt: {
4575
+ sourceUnresolved: "Не удалось определить источник данных этой диаграммы Ганта",
4576
+ },
4577
+ grid: {
4578
+ sourceUnresolved: "Не удалось определить источник данных этой сетки",
4579
+ },
4580
+ board: {
4581
+ sourceUnresolved: "Не удалось определить источник данных этой доски",
4582
+ },
4583
+ listView: {
4584
+ sourceUnresolved: "Не удалось определить источник данных этого представления списка",
4585
+ },
4586
+ map: {
4587
+ sourceUnresolved: "Не удалось определить источник данных этой карты",
4588
+ },
4589
+ timeline: {
4590
+ sourceUnresolved: "Не удалось определить источник данных этой временной шкалы",
4591
+ },
4592
+ component: {
4593
+ sourceUnresolved: "Не удалось определить источник данных этого компонента",
4594
+ noDataSource: "Источник данных не определён",
4595
+ apiRefused: "Источник данных API этого компонента отклонён",
4596
+ apiUnreadable: "Не удалось прочитать источник данных API этого компонента",
4597
+ },
4598
+ metadataViewer: {
4599
+ missingKey: "Для этого представления не задан {{key}}.",
4600
+ loading: "Загрузка {{name}}…",
4601
+ loadFailed: "Не удалось загрузить {{name}}: {{message}}",
4602
+ notFound: "{{name}} не найден.",
4603
+ stateMachine: "Конечный автомат",
4604
+ flow: "Процесс",
4605
+ permission: "Разрешение",
4606
+ noStateMachine: "На {{object}} нет конечного автомата.",
4607
+ noStateMachineNamed: "На {{object}} нет конечного автомата с именем «{{name}}».",
4608
+ lifecycle: "Жизненный цикл {{object}}",
4609
+ field: "поле {{field}}",
4610
+ initial: "начальное",
4611
+ final: "конечное",
4612
+ steps: "Шаги: {{count}}",
4613
+ noSteps: "Нет шагов для отображения.",
4614
+ untitledStep: "(шаг)",
4615
+ hiddenSteps: "Скрыто технических шагов: {{count}} · задайте {{setting}}, чтобы показать все",
4616
+ objectAccess: "Доступ к объектам: {{count}}",
4617
+ noPermissions: "Разрешения на объекты не объявлены.",
4618
+ object: "Объект",
4619
+ unknownType: "Неизвестный тип представления метаданных. Ожидается {{a}}, {{b}} или {{c}}.",
4620
+ unknownTypeNamed: "Неизвестный тип представления метаданных «{{type}}». Ожидается {{a}}, {{b}} или {{c}}.",
4621
+ },
4622
+ },
3416
4623
  };
3417
4624
  export default ru;