@object-ui/i18n 17.6.0 → 17.7.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 (56) hide show
  1. package/CHANGELOG.md +4320 -0
  2. package/README.md +192 -13
  3. package/dist/builtinAggregateLabels.d.ts +40 -0
  4. package/dist/builtinAggregateLabels.js +23 -0
  5. package/dist/currency.d.ts +27 -3
  6. package/dist/currency.js +28 -4
  7. package/dist/fallbackInterpolation.d.ts +79 -0
  8. package/dist/fallbackInterpolation.js +124 -0
  9. package/dist/i18n.d.ts +27 -1
  10. package/dist/i18n.js +99 -16
  11. package/dist/index.d.ts +7 -13
  12. package/dist/index.js +41 -17
  13. package/dist/locales/ar.d.ts +946 -113
  14. package/dist/locales/ar.js +1095 -161
  15. package/dist/locales/de.d.ts +618 -113
  16. package/dist/locales/de.js +715 -134
  17. package/dist/locales/en.d.ts +632 -127
  18. package/dist/locales/en.js +1044 -162
  19. package/dist/locales/es.d.ts +700 -113
  20. package/dist/locales/es.js +794 -130
  21. package/dist/locales/fr.d.ts +700 -113
  22. package/dist/locales/fr.js +795 -132
  23. package/dist/locales/index.d.ts +6990 -1169
  24. package/dist/locales/index.js +48 -9
  25. package/dist/locales/ja.d.ts +618 -113
  26. package/dist/locales/ja.js +708 -128
  27. package/dist/locales/ko.d.ts +618 -113
  28. package/dist/locales/ko.js +712 -132
  29. package/dist/locales/pt.d.ts +700 -113
  30. package/dist/locales/pt.js +794 -130
  31. package/dist/locales/registry.d.ts +102 -0
  32. package/dist/locales/registry.js +220 -0
  33. package/dist/locales/rtl.d.ts +24 -0
  34. package/dist/locales/rtl.js +26 -0
  35. package/dist/locales/ru.d.ts +782 -113
  36. package/dist/locales/ru.js +910 -152
  37. package/dist/locales/zh.d.ts +635 -130
  38. package/dist/locales/zh.js +725 -131
  39. package/dist/pickLocalized.d.ts +30 -0
  40. package/dist/pickLocalized.js +39 -0
  41. package/dist/provider.d.ts +101 -12
  42. package/dist/provider.js +335 -50
  43. package/dist/translateFn.d.ts +29 -0
  44. package/dist/translateFn.js +8 -0
  45. package/dist/useDisplayLocale.d.ts +11 -0
  46. package/dist/useDisplayLocale.js +11 -0
  47. package/dist/useObjectLabel.d.ts +40 -18
  48. package/dist/useObjectLabel.js +46 -14
  49. package/dist/useSafeTranslation.js +40 -42
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/spec-formatters.d.ts +13 -23
  53. package/dist/utils/spec-formatters.js +41 -2
  54. package/dist/utils/spec-translations.d.ts +16 -3
  55. package/dist/utils/spec-translations.js +52 -13
  56. package/package.json +12 -6
@@ -19,10 +19,12 @@ const ru = {
19
19
  manage_users: "Управление пользователями",
20
20
  manage_org_users: "Управление пользователями организации",
21
21
  manage_metadata: "Управление метаданными",
22
+ manage_org_presentation: "Управление представлением организации",
22
23
  manage_platform_settings: "Управление настройками платформы",
23
24
  setup_access: "Доступ к настройке",
24
25
  setup_write: "Запись настроек",
25
26
  studio_access: "Доступ к Studio",
27
+ manage_sharing: "Управление общим доступом",
26
28
  },
27
29
  group: {
28
30
  platform: 'Платформа',
@@ -30,27 +32,38 @@ const ru = {
30
32
  other: 'Другое',
31
33
  },
32
34
  },
33
- // objectui#3546 slice six — сводка шести граней авторизации в
34
- // PermissionFacetLink (только чтение) плюс ссылка в Studio.
35
+ // objectui#3546 slice six — the read-only summary of PermissionFacetLink's six
36
+ // authorization facets, plus the Studio link.
35
37
  //
36
- // Четыре счётных значения записаны как «Существительное: {{count}}» — этот
37
- // приём в паке уже применён 25 раз (lookup.recordCount, notifications.
38
- // groupCount, approvalsInbox.bulkApproved …) и он верен при ЛЮБОМ числе, так
39
- // что для категорий few/many, которых в паке нет, базовый ключ даёт
40
- // правильный русский, а не английский. Поэтому `_one` здесь совпадает с
41
- // базовым ключом — форма не зависит от числа.
38
+ // The four count labels carry one slot per ru CLDR category (objectui#11432):
39
+ // `_one` 1/21/31… (nominative singular), `_few` 2-4/22-24… (genitive singular),
40
+ // `_many` 0/5-20… (genitive plural), `_other` fractions (genitive singular).
41
+ // The base key keeps the count-invariant «Существительное: {{count}}» form for
42
+ // a call made without a count.
42
43
  perm: {
43
44
  facet: {
44
45
  none: "Нет",
45
46
  more: "+{{count}} ещё",
46
47
  objects: "Объектов: {{count}}",
47
- objects_one: "Объектов: {{count}}",
48
+ objects_one: "{{count}} объект",
49
+ objects_few: "{{count}} объекта",
50
+ objects_many: "{{count}} объектов",
51
+ objects_other: "{{count}} объекта",
48
52
  fields: "Правил для полей: {{count}}",
49
- fields_one: "Правил для полей: {{count}}",
53
+ fields_one: "{{count}} правило для полей",
54
+ fields_few: "{{count}} правила для полей",
55
+ fields_many: "{{count}} правил для полей",
56
+ fields_other: "{{count}} правила для полей",
50
57
  rls: "Политик RLS: {{count}}",
51
- rls_one: "Политик RLS: {{count}}",
58
+ rls_one: "{{count}} политика RLS",
59
+ rls_few: "{{count}} политики RLS",
60
+ rls_many: "{{count}} политик RLS",
61
+ rls_other: "{{count}} политики RLS",
52
62
  tabs: "Правил для вкладок: {{count}}",
53
- tabs_one: "Правил для вкладок: {{count}}",
63
+ tabs_one: "{{count}} правило для вкладок",
64
+ tabs_few: "{{count}} правила для вкладок",
65
+ tabs_many: "{{count}} правил для вкладок",
66
+ tabs_other: "{{count}} правила для вкладок",
54
67
  adminScope: "Делегированное администрирование настроено",
55
68
  designInStudio: "Дизайн в Studio →",
56
69
  designInStudioHint: "Дизайн в Studio",
@@ -69,7 +82,10 @@ const ru = {
69
82
  selectFirst: 'Сначала выберите {{fields}}',
70
83
  selectRecord: 'Выбрать запись',
71
84
  recordCount: 'Записей: {{count}}',
72
- recordCountOne: '1 запись',
85
+ recordCount_one: '{{count}} запись',
86
+ recordCount_few: '{{count}} записи',
87
+ recordCount_many: '{{count}} записей',
88
+ recordCount_other: '{{count}} записи',
73
89
  pageOf: 'Страница {{current}} из {{total}}',
74
90
  filters: 'Фильтры',
75
91
  clear: 'Очистить',
@@ -121,8 +137,14 @@ const ru = {
121
137
  closeChat: "Закрыть чат",
122
138
  closePanel: "Закрыть панель",
123
139
  resizeDrawer: "Изменить ширину панели",
124
- itemCount: "{{count}} элементов",
125
- itemCountOne: "{{count}} элемент",
140
+ // objectui#11445 — a count family: each slot agrees the noun with the
141
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
142
+ // count-invariant form, answers a call made without a count.
143
+ itemCount: "Элементов: {{count}}",
144
+ itemCount_one: "{{count}} элемент",
145
+ itemCount_few: "{{count}} элемента",
146
+ itemCount_many: "{{count}} элементов",
147
+ itemCount_other: "{{count}} элемента",
126
148
  toggleSidebar: "Переключить боковую панель",
127
149
  package: "Пакет",
128
150
  done: "Готово",
@@ -130,6 +152,16 @@ const ru = {
130
152
  record: "Запись",
131
153
  retry: "Повторить",
132
154
  printDialogHint: "Открывает диалог печати браузера (это не экспорт в PDF)",
155
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
156
+ // there are two conditions: a reported `total` states the fact with BOTH
157
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
158
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
159
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
160
+ // headroom is deliberately NOT restated here — it moves on every
161
+ // re-baseline, and the figure that was here went stale.
162
+ // `pnpm check:eager-closure` prints it.
163
+ rowCeilingNote: "Показаны первые {{shown}} из {{total}} записей. Сузьте фильтр.",
164
+ rowCeilingNoteUnknownTotal: "Показаны первые {{shown}} записей. Сузьте фильтр.",
133
165
  },
134
166
  actions: {
135
167
  decisionOutput: {
@@ -141,6 +173,14 @@ const ru = {
141
173
  acknowledge: 'Я сохранил(а) это',
142
174
  copyAll: 'Копировать всё',
143
175
  },
176
+ notAvailableHere: '«{{action}}» недоступно на текущей странице.',
177
+ completedSuccessfully: 'Действие успешно выполнено',
178
+ failed: 'Действие не выполнено',
179
+ parallelFailed: 'Одно или несколько параллельных действий не выполнены',
180
+ undo: 'Отменить',
181
+ undone: 'Изменение отменено',
182
+ undoneOperation: 'Отменить: {{description}}',
183
+ redoneOperation: 'Повторить: {{description}}',
144
184
  },
145
185
  validation: {
146
186
  required: "Поле {{field}} обязательно для заполнения",
@@ -158,19 +198,45 @@ const ru = {
158
198
  },
159
199
  form: {
160
200
  noPermissionToSave: "У вас нет прав на сохранение этой записи.",
201
+ noPermissionToCreate: "У вас нет прав на создание записей «{{object}}». Поля доступны только для чтения.",
202
+ noPermissionToEdit: "У вас нет прав на редактирование записей «{{object}}». Поля доступны только для чтения.",
161
203
  submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
204
+ uploadInFlight: "Дождитесь завершения загрузки, прежде чем сохранять.",
205
+ clearedOnHide: "Очищено то, что больше не применимо к текущим значениям: {{fields}}",
206
+ visibleWhenFaulted: "Невозможно отправить: не удалось вычислить правило visibleWhen для {{fields}}. Правило нужно исправить, прежде чем эту форму можно будет отправить.",
162
207
  discardTitle: "Отменить изменения?",
163
208
  discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
164
209
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
165
210
  // description, used when the form declares no `description` of its own.
166
211
  dialogDescriptionFallback: "Заполните поля формы, затем отправьте или отмените.",
212
+ deniedDescription: "У вас нет прав на редактирование этого поля.",
213
+ masterDetail: {
214
+ loadingColumns: "Загрузка столбцов…",
215
+ subtotal: "Промежуточный итог",
216
+ tax: "Налог ({{rate}}%)",
217
+ total: "Итого",
218
+ lineItem: "Позиция",
219
+ rowTitle: "{{title}} — строка {{row}}",
220
+ applyRow: "Применить",
221
+ editorDescription: "Введите запись и её позиции, затем сохраните.",
222
+ noChildObject: "Для этой коллекции не настроен дочерний объект: укажите в {{property}} объект, строки которого она выводит.",
223
+ schemaUnavailable: "Не удалось загрузить схему {{object}}, поэтому у этой коллекции нет столбцов для отображения. Убедитесь, что объект существует и доступен для чтения, затем перезагрузите.",
224
+ noRelationshipField: "Не удалось определить, как {{object}} связан с {{parent}}: ни одно поле lookup или master_detail в нём не ссылается на родительский объект. Укажите в {{property}} этой коллекции поле, в котором хранится родительская запись.",
225
+ },
226
+ lineItems: {
227
+ title: "Позиции",
228
+ saveRecordFirst: "Сначала сохраните запись, чтобы добавить позиции.",
229
+ notLoaded: "Позиции этой записи не загружены.",
230
+ loadFailed: "Не удалось загрузить позиции",
231
+ saveFailed: "Не удалось сохранить позиции",
232
+ noChildObject: "Для этой панели не настроен дочерний объект: укажите в {{property}} объект, строки которого она выводит.",
233
+ },
167
234
  keepEditing: "Продолжить редактирование",
168
235
  discard: "Отменить",
169
236
  conflictTitle: "Конфликт сохранения",
170
237
  conflictMessage: "Пока вы редактировали, эту запись изменил другой пользователь. Перезапись заменит его изменения вашими.",
171
238
  conflictLatestVersion: "Его сохранение: {{time}}",
172
239
  conflictOverwrite: "Перезаписать",
173
- addItem: "Добавить элемент",
174
240
  removeItem: "Удалить элемент",
175
241
  fieldRequired: "Это поле обязательно",
176
242
  invalidFormat: "Неверный формат",
@@ -188,6 +254,12 @@ const ru = {
188
254
  createSuccess: "{{object}} создан",
189
255
  updateSuccess: "{{object}} обновлён",
190
256
  deleteSuccess: "{{object}} удалён",
257
+ created: "Создано",
258
+ saved: "Сохранено",
259
+ savedNamed: "{{title}} сохранён",
260
+ submitted: "Отправлено",
261
+ errorLoading: "Ошибка загрузки формы",
262
+ navigateRefused: "Цель `navigateOnSuccess`, объявленная для этой формы, была отклонена, поэтому переход не выполнен.",
191
263
  fullscreen: {
192
264
  title: "Изменить текст",
193
265
  description: "Измените полное текстовое значение, затем сохраните или отмените изменения.",
@@ -212,6 +284,10 @@ const ru = {
212
284
  },
213
285
  relativeDate: {
214
286
  overdue: "Просрочено на {{count}} дн.",
287
+ overdue_one: "Просрочено на {{count}} дн.",
288
+ overdue_few: "Просрочено на {{count}} дн.",
289
+ overdue_many: "Просрочено на {{count}} дн.",
290
+ overdue_other: "Просрочено на {{count}} дн.",
215
291
  },
216
292
  file: {
217
293
  dragDropHere: 'Перетащите файлы сюда',
@@ -228,6 +304,7 @@ const ru = {
228
304
  remove: 'Удалить {{name}}',
229
305
  exceedsMaxSize: '«{{name}}» превышает максимальный размер ({{max}} МБ)',
230
306
  uploadFailed: 'Не удалось загрузить «{{name}}»: {{error}}',
307
+ uploadIncomplete: 'Загрузка «{{name}}» не завершена: идентификатор файла не получен, ничего не сохранено',
231
308
  },
232
309
  richText: {
233
310
  format: "Формат: {{format}}",
@@ -255,6 +332,9 @@ const ru = {
255
332
  selectBusinessUnit: "Выберите бизнес-подразделение",
256
333
  selectPosition: "Выберите должность",
257
334
  selectUnitAndSubordinates: "Выберите бизнес-подразделение",
335
+ selectField: "Выберите поле пользователя",
336
+ noUserFields: "В этом объекте нет полей пользователя",
337
+ fieldNotUserTyped: "{{name}} — не поле пользователя",
258
338
  },
259
339
  filterCondition: {
260
340
  selectObjectFirst: "Сначала выберите объект.",
@@ -265,6 +345,26 @@ const ru = {
265
345
  editAsJson: "Редактировать как JSON",
266
346
  useVisualBuilder: "Использовать визуальный конструктор",
267
347
  },
348
+ object: {
349
+ invalidJson: "Некорректный JSON",
350
+ },
351
+ location: {
352
+ refusedFormat: "Не сохранено: введите пару широта, долгота (например: 30.2741, 120.1551).",
353
+ refusedRange: "Не сохранено: {{detail}}",
354
+ latitude: "широта",
355
+ longitude: "долгота",
356
+ refusedResidueOne: "Не сохранено: {{name}} «{{text}}» — не число. Введите обычные десятичные дроби (например: 30.2741, 120.1551).",
357
+ refusedResidue: "Не сохранено: {{name}} «{{text}}» и {{otherName}} «{{otherText}}» — не числа. Введите обычные десятичные дроби (например: 30.2741, 120.1551).",
358
+ },
359
+ date: {
360
+ impossibleDay: "Сохранённое значение «{{value}}» — несуществующая дата. Выберите дату, чтобы заменить его.",
361
+ },
362
+ dateTime: {
363
+ impossibleDay: "Сохранённое значение «{{value}}» — несуществующая дата. Выберите дату и время, чтобы заменить его.",
364
+ },
365
+ number: {
366
+ badInput: "Не сохранено: текст в этом поле — не число. Введите обычную десятичную дробь (например: {{example}}).",
367
+ },
268
368
  tags: {
269
369
  placeholder: "Введите и нажмите Enter, чтобы добавить…",
270
370
  },
@@ -280,6 +380,16 @@ const ru = {
280
380
  characterCount: "Количество символов: {{count}} из {{max}}",
281
381
  charactersRemaining: "Осталось символов: {{count}}",
282
382
  },
383
+ grid: {
384
+ addLine: "Добавить строку",
385
+ noItems: "Нет элементов",
386
+ noItemsAddHint: "Пока нет элементов — нажмите «{{label}}», чтобы начать.",
387
+ optionalColumns: "Дополнительные столбцы",
388
+ computed: "Вычисляется",
389
+ openRow: "Открыть строку",
390
+ duplicateRow: "Дублировать строку",
391
+ removeRow: "Удалить строку",
392
+ },
283
393
  },
284
394
  table: {
285
395
  rowsPerPage: "Строк на странице",
@@ -308,23 +418,47 @@ const ru = {
308
418
  open: "Открыть",
309
419
  search: "Поиск…",
310
420
  modified: "{{count}} строк изменено",
421
+ modified_one: "Изменена {{count}} строка",
422
+ modified_few: "Изменено {{count}} строки",
423
+ modified_many: "Изменено {{count}} строк",
424
+ modified_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}}).",
323
449
  bulk: {
324
450
  confirmDefault: "Будет применено к записям: {{count}}.",
451
+ confirmDefault_one: "Будет применено к записям: {{count}}.",
452
+ confirmDefault_few: "Будет применено к записям: {{count}}.",
453
+ confirmDefault_many: "Будет применено к записям: {{count}}.",
454
+ confirmDefault_other: "Будет применено к записям: {{count}}.",
325
455
  overLimit: "Выбрано ({{count}}) больше лимита действия ({{limit}}). Уменьшите выбор, чтобы продолжить.",
326
456
  affectedRecords: "Затрагиваемые записи ({{count}}):",
327
457
  skippedIneligible: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
458
+ skippedIneligible_one: '{{count}} из выбранных записей не подходит для этого действия и будет пропущена.',
459
+ skippedIneligible_few: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
460
+ skippedIneligible_many: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
461
+ skippedIneligible_other: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
328
462
  rowFallback: "Строка {{index}}",
329
463
  andMore: "… и ещё {{count}}",
330
464
  processed: "Обработано {{count}} / {{total}}",
@@ -342,7 +476,6 @@ const ru = {
342
476
  undo: "Отменить",
343
477
  undoing: "Отмена…",
344
478
  done: "Готово",
345
- selectPlaceholder: "Выберите…",
346
479
  loading: "Загрузка…",
347
480
  },
348
481
  actions: "Действия",
@@ -361,6 +494,14 @@ const ru = {
361
494
  yes: "Да",
362
495
  no: "Нет",
363
496
  systemFields: "Система",
497
+ // objectui#10881 — the grouped grid's two refusals: over a data source
498
+ // that cannot answer the group header query, and over rows a host
499
+ // handed in while declaring them one page of more. `queryGroupHeaders`
500
+ // is the member's name and stays untranslated.
501
+ grouping: {
502
+ needsHeaderQuery: "Это представление сгруппировано, но его источник данных не реализует queryGroupHeaders, поэтому группы невозможно подсчитать. Уберите группировку, чтобы показать записи.",
503
+ needsWholeRows: "Для группировки нужны все записи, но этой таблице передана только одна их страница, поэтому группы невозможно подсчитать. Передайте все записи или позвольте таблице загрузить их из источника данных, который реализует queryGroupHeaders.",
504
+ },
364
505
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
365
506
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
366
507
  // pack controls its own separator and word order.
@@ -387,10 +528,16 @@ const ru = {
387
528
  },
388
529
  import: {
389
530
  downloadTemplate: "Скачать шаблон",
390
- downloadTemplateHint: "Получите CSV с нужными столбцами (обязательные поля отмечены *).",
531
+ downloadTemplateHint: "Получите файл Excel со столбцами, которые можно импортировать (обязательные поля отмечены *), и инструкцией по заполнению.",
391
532
  templateFileName: "{{object}}-import-template",
533
+ templateDownloadFailed: "Не удалось скачать шаблон. Повторите попытку.",
534
+ templateNotPermitted: "У вас нет прав на создание записей этого объекта, поэтому шаблон импорта недоступен.",
392
535
  autoMatched: "Сопоставлено автоматически",
393
536
  autoMatchedSummary: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
537
+ autoMatchedSummary_one: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
538
+ autoMatchedSummary_few: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
539
+ autoMatchedSummary_many: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
540
+ autoMatchedSummary_other: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
394
541
  confidence: {
395
542
  high: "Высокая точность",
396
543
  medium: "Средняя точность",
@@ -403,8 +550,20 @@ const ru = {
403
550
  cancelImport: "Отменить импорт",
404
551
  importCancelled: "Импорт отменён",
405
552
  resultsTruncated: "Показаны результаты первых {{count}} строк (из {{total}}).",
553
+ resultsTruncated_one: "Показаны результаты первых строк: {{count}} (из {{total}}).",
554
+ resultsTruncated_few: "Показаны результаты первых строк: {{count}} (из {{total}}).",
555
+ resultsTruncated_many: "Показаны результаты первых строк: {{count}} (из {{total}}).",
556
+ resultsTruncated_other: "Показаны результаты первых строк: {{count}} (из {{total}}).",
406
557
  createdCount: "Создано: {{count}}",
558
+ createdCount_one: "Создано: {{count}}",
559
+ createdCount_few: "Создано: {{count}}",
560
+ createdCount_many: "Создано: {{count}}",
561
+ createdCount_other: "Создано: {{count}}",
407
562
  updatedCount: "Обновлено: {{count}}",
563
+ updatedCount_one: "Обновлено: {{count}}",
564
+ updatedCount_few: "Обновлено: {{count}}",
565
+ updatedCount_many: "Обновлено: {{count}}",
566
+ updatedCount_other: "Обновлено: {{count}}",
408
567
  downloadFailed: "Скачать строки с ошибками",
409
568
  options: "Параметры импорта",
410
569
  writeMode: "Если строка совпадает с существующей записью",
@@ -452,6 +611,10 @@ const ru = {
452
611
  historyColResult: "Результат",
453
612
  historyColTime: "Когда",
454
613
  errorCount: "Ошибок: {{count}}",
614
+ errorCount_one: "Ошибок: {{count}}",
615
+ errorCount_few: "Ошибок: {{count}}",
616
+ errorCount_many: "Ошибок: {{count}}",
617
+ errorCount_other: "Ошибок: {{count}}",
455
618
  undoImport: "Отменить импорт",
456
619
  undoing: "Отмена…",
457
620
  undoConfirm: "Отменить этот импорт? Созданные им записи будут удалены, а обновлённые — восстановлены к прежним значениям.",
@@ -512,7 +675,15 @@ const ru = {
512
675
  mapped: "Сопоставлено",
513
676
  skipped: "Пропущено",
514
677
  rowsWithErrors: "{{count}} строк с ошибками",
678
+ rowsWithErrors_one: "{{count}} строка с ошибками",
679
+ rowsWithErrors_few: "{{count}} строки с ошибками",
680
+ rowsWithErrors_many: "{{count}} строк с ошибками",
681
+ rowsWithErrors_other: "{{count}} строки с ошибками",
515
682
  rowsCorrected: "{{count}} строк исправлено",
683
+ rowsCorrected_one: "Исправлена {{count}} строка",
684
+ rowsCorrected_few: "Исправлено {{count}} строки",
685
+ rowsCorrected_many: "Исправлено {{count}} строк",
686
+ rowsCorrected_other: "Исправлено {{count}} строки",
516
687
  clickToFix: "— нажмите на выделенную ячейку для редактирования.",
517
688
  showingRows: "Отображено {{shown}} из {{total}} строк",
518
689
  importing: "Импорт… {{progress}}%",
@@ -520,11 +691,19 @@ const ru = {
520
691
  imported: "{{count}} импортировано",
521
692
  skippedCount: "{{count}} пропущено",
522
693
  moreErrors: "…ещё {{count}} ошибок",
694
+ moreErrors_one: "…ещё {{count}} ошибка",
695
+ moreErrors_few: "…ещё {{count}} ошибки",
696
+ moreErrors_many: "…ещё {{count}} ошибок",
697
+ moreErrors_other: "…ещё {{count}} ошибки",
523
698
  cancel: "Отмена",
524
699
  back: "Назад",
525
700
  next: "Далее",
526
701
  close: "Закрыть",
527
702
  importNRows: "Импортировать {{count}} строк",
703
+ importNRows_one: "Импортировать {{count}} строку",
704
+ importNRows_few: "Импортировать {{count}} строки",
705
+ importNRows_many: "Импортировать {{count}} строк",
706
+ importNRows_other: "Импортировать {{count}} строки",
528
707
  importingProgress: "Импортируется…",
529
708
  requiredMark: "*",
530
709
  required: "Обязательно",
@@ -536,11 +715,39 @@ const ru = {
536
715
  month: "Месяц",
537
716
  week: "Неделя",
538
717
  day: "День",
539
- agenda: "Расписание",
540
718
  allDay: "Весь день",
541
- noEvents: "Нет событий",
542
719
  newEvent: "Новое событие",
543
720
  moreEvents: "+{{count}} ещё",
721
+ unscheduled: "Без даты ({{count}})",
722
+ loading: "Загрузка календаря…",
723
+ loadError: "Ошибка: {{message}}",
724
+ configRequired: "Требуется настройка календаря. Укажите startDateField — единственный обязательный ключ календаря; заголовок события определяется и без titleField.",
725
+ configRequiredHint: "Он относится к блоку calendar представления. У страницы интерфейса нет собственного слота календаря: укажите в её sourceView представление, которое его объявляет.",
726
+ eventDetails: "Сведения о событии",
727
+ pullToRefresh: "Потяните для обновления",
728
+ refreshing: "Обновление…",
729
+ onDate: "{{date}}",
730
+ eventTitle: "Название",
731
+ eventTitlePlaceholder: "О чём это событие?",
732
+ creating: "Создание…",
733
+ titleRequired: "Укажите название",
734
+ a11y: {
735
+ region: "Календарь",
736
+ grid: "Сетка календаря",
737
+ goToToday: "Перейти к сегодняшнему дню",
738
+ previousPeriod: "Предыдущий период",
739
+ nextPeriod: "Следующий период",
740
+ currentDate: "Текущая дата: {{date}}",
741
+ dayCell: "{{date}}, событий: {{count}}",
742
+ dayCell_one: "{{date}}, {{count}} событие",
743
+ dayCell_few: "{{date}}, {{count}} события",
744
+ dayCell_many: "{{date}}, {{count}} событий",
745
+ dayCell_other: "{{date}}, событий: {{count}}",
746
+ resizeEventEnd: "Изменить окончание события",
747
+ resizeEventEndHint: "Перетащите, чтобы изменить дату окончания",
748
+ resizeStart: "Изменить начало",
749
+ resizeEnd: "Изменить окончание",
750
+ },
544
751
  },
545
752
  list: {
546
753
  firstRunTitle: "Здесь пока пусто",
@@ -582,8 +789,14 @@ const ru = {
582
789
  },
583
790
  refresh: "Обновить",
584
791
  loading: "Загрузка записей…",
585
- recordCount: "{{count}} записей",
586
- recordCountOne: "{{count}} запись",
792
+ // objectui#11445 — a count family: each slot agrees the noun with the
793
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
794
+ // count-invariant form, answers a call made without a count.
795
+ recordCount: "Записей: {{count}}",
796
+ recordCount_one: "{{count}} запись",
797
+ recordCount_few: "{{count}} записи",
798
+ recordCount_many: "{{count}} записей",
799
+ recordCount_other: "{{count}} записи",
587
800
  addRecord: "Добавить запись",
588
801
  tabs: "Вкладки",
589
802
  allRecords: "Все записи",
@@ -615,7 +828,7 @@ const ru = {
615
828
  hideFieldsTitle: "Скрыть поля",
616
829
  dataLimitReached: "Отображаются первые {{limit}} записей. Возможно, есть ещё данные.",
617
830
  viewSettings: "Настройки представления",
618
- viewSettingsHint: "Группировка, цвет, плотность и отображаемые поля.",
831
+ viewSettingsHint: "Группировка, цвет, плотность и отображаемые поля. Применяется ко всем пользователям этого представления.",
619
832
  addGroup: "Добавить поле группировки",
620
833
  collapsedByDefault: "Свёрнуто по умолчанию",
621
834
  removeGroup: "Удалить",
@@ -680,6 +893,17 @@ const ru = {
680
893
  },
681
894
  gantt: {
682
895
  rowLabel: "Элементы",
896
+ unusableRange: {
897
+ malformedDate: "Непригодный диапазон дат гантта — {{path}} равно {{value}}, что не является корректной датой. Все даты гантта должны разбираться: startDate и endDate каждого элемента строки, а также minDate / maxDate, заданные в схеме.",
898
+ malformedRow: "Непригодные строки гантта — {{path}} равно {{value}}, что не является формой строки. Гантт читает items как список строк, каждую строку — как объект с label и собственными items, а items каждой строки — как список полос; null, число, строка или простой объект в любом из этих мест не могут быть отрисованы.",
899
+ inverted: "Непригодный диапазон дат гантта — minDate {{minDate}} позже maxDate {{maxDate}}. Заданные minDate / maxDate имеют приоритет над диапазоном, вычисленным по строкам, поэтому у этой оси нет столбцов и полосу разместить негде; поменяйте оба значения местами.",
900
+ },
901
+ },
902
+ unsupported: {
903
+ objectBoundGantt: "Неподдерживаемый вариант \"gantt\" — временная шкала, привязанная к объекту, отображает ленточные варианты ({{variants}}). Для гантта нужны литеральные строки, каждая со своим вложенным items, поэтому ось гантта (scale) здесь не действует.",
904
+ },
905
+ unconfigured: {
906
+ noDateAxis: "Требуется ось дат временной шкалы — это представление не объявляет ни одного поля даты, а временная шкала, привязанная к объекту, не придумывает его сама. Объявите одно из: {{fields}}. Первое — написание из спецификации, остальные — устаревшие псевдонимы.",
683
907
  },
684
908
  },
685
909
  gantt: {
@@ -697,6 +921,7 @@ const ru = {
697
921
  },
698
922
  aria: {
699
923
  taskList: "Список задач",
924
+ refreshing: "Обновление…",
700
925
  },
701
926
  tooltip: {
702
927
  days: "дн",
@@ -742,13 +967,25 @@ const ru = {
742
967
  conflict: {
743
968
  title: "Конфликт расписания",
744
969
  body: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
970
+ body_one: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
971
+ body_few: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
972
+ body_many: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
973
+ body_other: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
745
974
  confirm: "Перепланировать автоматически",
746
975
  cancel: "Оставить как есть",
747
976
  },
748
977
  autoScheduleDlg: {
749
978
  title: "Автопланирование",
750
979
  body: "Сдвинуть {{count}} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
980
+ body_one: "Сдвинуть {{count}} задачу на более поздний срок, чтобы соблюсти связи зависимостей?",
981
+ body_few: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
982
+ body_many: "Сдвинуть {{count}} задач на более поздний срок, чтобы соблюсти связи зависимостей?",
983
+ body_other: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
751
984
  skipped: "{{count}} заблокированных задач(и) также нарушают связи и были пропущены.",
985
+ skipped_one: "{{count}} заблокированная задача также нарушает связи и была пропущена.",
986
+ skipped_few: "{{count}} заблокированные задачи также нарушают связи и были пропущены.",
987
+ skipped_many: "{{count}} заблокированных задач также нарушают связи и были пропущены.",
988
+ skipped_other: "{{count}} заблокированной задачи также нарушают связи и были пропущены.",
752
989
  confirm: "Применить",
753
990
  cancel: "Отмена",
754
991
  none: "Все зависимости соблюдены — перепланировать нечего.",
@@ -827,6 +1064,7 @@ const ru = {
827
1064
  tabActionsFor: "Действия с представлением {{name}}",
828
1065
  readonlyAriaLabel: "Представление только для чтения",
829
1066
  readonlyTooltip: "Системное представление — определено в коде, только для чтения.",
1067
+ malformedFilter: "Фильтр этого представления некорректен, поэтому записи не отображаются: условие {{subject}} невозможно применить.",
830
1068
  },
831
1069
  designer: {
832
1070
  undo: "Отменить",
@@ -853,8 +1091,14 @@ const ru = {
853
1091
  addReaction: "Добавить реакцию",
854
1092
  pageHeaderActions: "Действия в заголовке страницы",
855
1093
  emojiPicker: "Выбор эмодзи",
856
- reactionCount: "{{emoji}} {{count}} реакций",
857
- reactionCountOne: "{{emoji}} {{count}} реакция",
1094
+ // objectui#11445 — a count family: each slot agrees the noun with the
1095
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
1096
+ // count-invariant form, answers a call made without a count.
1097
+ reactionCount: "{{emoji}} Реакций: {{count}}",
1098
+ reactionCount_one: "{{emoji}} {{count}} реакция",
1099
+ reactionCount_few: "{{emoji}} {{count}} реакции",
1100
+ reactionCount_many: "{{emoji}} {{count}} реакций",
1101
+ reactionCount_other: "{{emoji}} {{count}} реакции",
858
1102
  recordDetail: "Сведения о записи",
859
1103
  recordDetailWithLabel: "Сведения: {{label}}",
860
1104
  openAsFullPage: "Открыть на всю страницу",
@@ -881,7 +1125,6 @@ const ru = {
881
1125
  viewAll: "Показать все",
882
1126
  new: "Создать",
883
1127
  add: "Добавить",
884
- emptyValue: "—",
885
1128
  activity: "Активность",
886
1129
  editRow: "Редактировать",
887
1130
  deleteRow: "Удалить",
@@ -893,6 +1136,7 @@ const ru = {
893
1136
  sortBy: "Сортировать по",
894
1137
  filterPlaceholder: "Фильтр…",
895
1138
  highlightFields: "Ключевые поля",
1139
+ highlightsLabel: "Ключевые поля записи",
896
1140
  comments: "Комментарии",
897
1141
  searchComments: "Поиск комментариев…",
898
1142
  addCommentPlaceholder: "Добавить комментарий… (Ctrl+Enter для отправки)",
@@ -903,11 +1147,26 @@ const ru = {
903
1147
  unpin: "Открепить",
904
1148
  justNow: "только что",
905
1149
  minutesAgo: "{{count}} мин. назад",
1150
+ minutesAgo_one: "{{count}} мин. назад",
1151
+ minutesAgo_few: "{{count}} мин. назад",
1152
+ minutesAgo_many: "{{count}} мин. назад",
1153
+ minutesAgo_other: "{{count}} мин. назад",
906
1154
  hoursAgo: "{{count}} ч. назад",
1155
+ hoursAgo_one: "{{count}} ч. назад",
1156
+ hoursAgo_few: "{{count}} ч. назад",
1157
+ hoursAgo_many: "{{count}} ч. назад",
1158
+ hoursAgo_other: "{{count}} ч. назад",
907
1159
  daysAgo: "{{count}} дн. назад",
1160
+ daysAgo_one: "{{count}} дн. назад",
1161
+ daysAgo_few: "{{count}} дн. назад",
1162
+ daysAgo_many: "{{count}} дн. назад",
1163
+ daysAgo_other: "{{count}} дн. назад",
908
1164
  dropFilesToUpload: "Перетащите файлы сюда или нажмите для загрузки",
909
1165
  attachmentCount: "{{count}} вложение",
910
- attachmentCountPlural: "{{count}} вложений",
1166
+ attachmentCount_one: "{{count}} вложение",
1167
+ attachmentCount_few: "{{count}} вложения",
1168
+ attachmentCount_many: "{{count}} вложений",
1169
+ attachmentCount_other: "{{count}} вложения",
911
1170
  removeAttachment: "Удалить вложение",
912
1171
  // Record Attachments panel (enable.files, objectstack#4358)
913
1172
  attachments: "Вложения",
@@ -925,11 +1184,6 @@ const ru = {
925
1184
  attachmentsLoadFailed: "Не удалось загрузить вложения этой записи.",
926
1185
  attachmentsApiUnavailable: "Список вложений недоступен для этого объекта.",
927
1186
  retryLoadAttachments: "Повторить",
928
- unifiedDiff: "Единое представление",
929
- sideBySideDiff: "Параллельное представление",
930
- noChanges: "Нет изменений",
931
- previousVersion: "Предыдущая",
932
- currentVersion: "Текущая",
933
1187
  discussion: "Обсуждение",
934
1188
  showDiscussion: "Показать обсуждение ({{count}})",
935
1189
  hideDiscussion: "Скрыть обсуждение",
@@ -944,25 +1198,37 @@ const ru = {
944
1198
  writeComment: "Написать комментарий…",
945
1199
  subscribedTooltip: "Подписаны — нажмите для отписки",
946
1200
  unsubscribedTooltip: "Подписаться на уведомления",
947
- firstRecord: "Первая запись (Home)",
948
- previousRecordKey: "Предыдущая запись (←)",
949
- nextRecordKey: "Следующая запись (→)",
950
- lastRecord: "Последняя запись (End)",
951
1201
  noRecords: "Нет записей",
952
- searchWhileNavigating: "Поиск при навигации",
953
- searchRecords: "Поиск записей…",
954
1202
  allActivity: "Вся активность",
955
1203
  commentsOnly: "Только комментарии",
956
1204
  fieldChangesFilter: "Изменения полей",
957
1205
  tasksOnly: "Только задачи",
958
1206
  leaveCommentPlaceholder: "Оставить комментарий… (Ctrl+Enter для отправки)",
959
1207
  noActivity: "Нет зарегистрированной активности",
1208
+ activityAccessDenied: "У вас нет разрешения на просмотр активности этой записи.",
1209
+ commentsAccessDenied: "У вас нет разрешения на просмотр комментариев к этой записи.",
1210
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1211
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1212
+ // sentences, which are assembled in code and so need interpolation holes.
1213
+ allFilter: 'Все',
1214
+ createsFilter: 'Создания',
1215
+ deletesFilter: 'Удаления',
1216
+ statusChangesFilter: 'Изменения статуса',
1217
+ activityEmptyValue: '(пусто)',
1218
+ activityFieldChanged: 'Изменено поле {{field}} с «{{old}}» на «{{new}}»',
1219
+ activityCreated: 'Создал эту запись',
1220
+ activityDeleted: 'Удалил эту запись',
1221
+ activityStatusChanged: 'Изменил статус на «{{value}}»',
1222
+ activityUpdated: 'Обновил запись',
960
1223
  loadMore: "Загрузить ещё",
961
1224
  edited: "(изменено)",
962
1225
  via: "через {{source}}",
963
1226
  viewSource: "Показать источник",
964
1227
  replyCount: "{{count}} ответ",
965
- replyCountPlural: "{{count}} ответов",
1228
+ replyCount_one: "{{count}} ответ",
1229
+ replyCount_few: "{{count}} ответа",
1230
+ replyCount_many: "{{count}} ответов",
1231
+ replyCount_other: "{{count}} ответа",
966
1232
  replyPlaceholder: "Ответить…",
967
1233
  filterActivity: "Фильтр активности",
968
1234
  openDiscussion: "Открыть панель обсуждения",
@@ -977,6 +1243,7 @@ const ru = {
977
1243
  writeStrippedReadonly: "Поля только для чтения, поэтому не применены: {{fields}}",
978
1244
  writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не применены: {{fields}}",
979
1245
  writeStrippedPrimaryKey: "Идентификатор записи нельзя изменить при сохранении, поэтому поля не применены: {{fields}}",
1246
+ writeStrippedComputed: "Поля вычисляются сервером по формуле, поэтому отправленные значения не применены: {{fields}}",
980
1247
  writeStrippedUnknownReason: "Не применены сервером: {{fields}}",
981
1248
  approvalPendingEditable: "На согласовании · редактирование доступно",
982
1249
  approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
@@ -998,6 +1265,8 @@ const ru = {
998
1265
  pathStageLostUpcoming: '{{stage}}, проигран, не достигнут',
999
1266
  pathStageWonUpcoming: '{{stage}}, целевой этап, не достигнут',
1000
1267
  linkCopied: "Ссылка скопирована в буфер обмена",
1268
+ commentFailed: "Комментарий не опубликован. Ничего не сохранено — попробуйте ещё раз.",
1269
+ reactionFailed: "Реакция не сохранена. Попробуйте ещё раз.",
1001
1270
  linkCopyFailed: "Не удалось скопировать ссылку",
1002
1271
  cancel: "Отмена",
1003
1272
  cancelEdit: "Отменить изменения",
@@ -1018,39 +1287,70 @@ const ru = {
1018
1287
  deleteRowTitle: "Удалить запись",
1019
1288
  createdBy: "Создано",
1020
1289
  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/…
1290
+ // objectui#3863 — base key, answering only a call made without a count: since
1291
+ // objectui#11432 every ru category has its own slot — `_one` 1/21/31…, `_few`
1292
+ // 2-4/22-24… and `_many` 0/5-20… (genitive plural after the substantivised
1293
+ // adjective in both), `_other` fractions (genitive singular). The base keeps the
1294
+ // count-invariant «Существительное: {{count}}» form.
1027
1295
  showEmptyRelated: "+ Пустых: {{count}}",
1028
1296
  showEmptyRelated_one: "+ {{count}} пустое",
1029
- showEmptyRelated_other: "+ {{count}} пустых",
1297
+ showEmptyRelated_few: "+ {{count}} пустых",
1298
+ showEmptyRelated_many: "+ {{count}} пустых",
1299
+ showEmptyRelated_other: "+ {{count}} пустого",
1030
1300
  copyEmail: "Копировать email",
1031
1301
  copyPhone: "Копировать телефон",
1032
1302
  copyRecordId: "Копировать ID записи",
1033
1303
  showEmptyFields: "Показать {{count}} пустых полей",
1304
+ showEmptyFields_one: "Показать {{count}} пустое поле",
1305
+ showEmptyFields_few: "Показать {{count}} пустых поля",
1306
+ showEmptyFields_many: "Показать {{count}} пустых полей",
1307
+ showEmptyFields_other: "Показать {{count}} пустого поля",
1034
1308
  hideEmptyFields: "Скрыть пустые поля",
1035
1309
  noValue: "Нет значения",
1310
+ unresolvedReference: "Неразрешённая ссылка: {{value}} не удалось сопоставить с пользователем",
1311
+ unresolvedLookupReference: "Неразрешённая ссылка: {{value}} не удалось сопоставить с записью на этом экране",
1312
+ repeaterItemCount: "Элементов: {{count}}",
1313
+ repeaterItemCount_one: "{{count}} элемент",
1314
+ repeaterItemCount_few: "{{count}} элемента",
1315
+ repeaterItemCount_many: "{{count}} элементов",
1316
+ repeaterItemCount_other: "{{count}} элемента",
1317
+ fileCount: "Файлов: {{count}}",
1318
+ fileCount_one: "{{count}} файл",
1319
+ fileCount_few: "{{count}} файла",
1320
+ fileCount_many: "{{count}} файлов",
1321
+ fileCount_other: "{{count}} файла",
1036
1322
  },
1037
1323
  chart: {
1038
- noData: "Нет данных для графика",
1039
1324
  loading: "Загрузка графика…",
1325
+ refreshing: "Обновление…",
1040
1326
  nullCategory: "(Не указано)",
1041
- },
1042
- map: {
1043
- searchLocations: "Поиск местоположений…",
1044
- locationDetails: "Детали местоположения",
1045
- markersCount: "{{count}} маркеров",
1046
- invalidCoordinates: "{{count}} запись с отсутствующими или недействительными координатами исключена из карты.",
1047
- invalidCoordinatesPlural: "{{count}} записей с отсутствующими или недействительными координатами исключены из карты.",
1327
+ scatterOneMeasure: "Точечная диаграмма строит только одну меру. Оставьте один ряд:",
1328
+ unconfigured: {
1329
+ noCategoryAxis: "Требуется ось категорий диаграммы — диаграмма, привязанная к объекту, не придумывает её. Объявите одно из:",
1330
+ },
1048
1331
  },
1049
1332
  dashboard: {
1050
- noRows: "Нет строк",
1333
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1334
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1335
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1336
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1337
+ // read them. The copy here has to read as a state rather than a failure,
1338
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1339
+ // punctuation so the call site concatenates no separator (see
1340
+ // `WidgetEmptyState`).
1341
+ empty: {
1342
+ title: "Данных пока нет",
1343
+ message: "Виджет успешно загружен, но запрос пока не вернул ни одной записи.",
1344
+ sourceLabel: "Источник данных:",
1345
+ },
1051
1346
  loading: "Загрузка…",
1347
+ refreshing: "Обновление…",
1348
+ refreshAll: "Обновить все",
1349
+ refreshDashboard: "Обновить дашборд",
1052
1350
  pickMeasures: "Выберите меры (значения) для этого виджета набора данных.",
1053
1351
  datasetUnsupported: "Этот источник данных не поддерживает запросы к наборам данных.",
1352
+ widgetForbiddenTitle: "Нет доступа",
1353
+ widgetForbiddenMessage: "У вас нет прав на просмотр данных этого виджета.",
1054
1354
  details: "Подробности",
1055
1355
  exportCsv: "Экспорт в CSV",
1056
1356
  openInList: "Открыть в списке",
@@ -1078,12 +1378,10 @@ const ru = {
1078
1378
  },
1079
1379
  },
1080
1380
  addWidget: "Добавить виджет",
1081
- removeWidget: "Удалить виджет",
1082
1381
  editLayout: "Редактировать макет",
1083
1382
  saveLayout: "Сохранить макет",
1084
1383
  resetLayout: "Сбросить макет",
1085
1384
  total: "Итого",
1086
- noDataAvailable: "Данные недоступны",
1087
1385
  noDataSourceFor: "Нет источника данных для",
1088
1386
  config: {
1089
1387
  breadcrumb: {
@@ -1205,10 +1503,6 @@ const ru = {
1205
1503
  appDescription: "Описание",
1206
1504
  appIcon: "Значок",
1207
1505
  template: "Шаблон",
1208
- layout: "Макет",
1209
- layoutSidebar: "Боковая панель",
1210
- layoutHeader: "Заголовок",
1211
- layoutEmpty: "Пусто",
1212
1506
  selectObjects: "Выбрать объекты",
1213
1507
  searchObjects: "Поиск объектов…",
1214
1508
  selectAll: "Выбрать все",
@@ -1217,7 +1511,6 @@ const ru = {
1217
1511
  addGroup: "Добавить группу",
1218
1512
  addUrl: "Добавить URL",
1219
1513
  addSeparator: "Добавить разделитель",
1220
- noNavItems: "Элементов навигации пока нет.",
1221
1514
  logoUrl: "Logo URL",
1222
1515
  primaryColor: "Основной цвет",
1223
1516
  faviconUrl: "Favicon URL",
@@ -1244,13 +1537,12 @@ const ru = {
1244
1537
  appearance: "Внешний вид",
1245
1538
  rowHeight: "Высота строки",
1246
1539
  livePreview: "Предпросмотр в реальном времени",
1247
- stepBasicDesc: "Имя, заголовок и макет",
1540
+ stepBasicDesc: "Имя, заголовок и значок",
1248
1541
  stepObjectsDesc: "Выбрать бизнес-объекты",
1249
1542
  stepNavigationDesc: "Построить дерево навигации",
1250
1543
  stepBrandingDesc: "Логотип, цвета и фавикон",
1251
1544
  noObjectsFound: "Объекты не найдены.",
1252
1545
  noNavItemsHint: "Элементов навигации пока нет. Выберите объекты на предыдущем шаге или добавьте вручную.",
1253
- separator: "Разделитель",
1254
1546
  separatorLabel: "— Разделитель —",
1255
1547
  newGroup: "Новая группа",
1256
1548
  newLink: "Новая ссылка",
@@ -1284,6 +1576,7 @@ const ru = {
1284
1576
  navTypeSeparator: "Разделитель",
1285
1577
  navTypeAction: "Действие",
1286
1578
  navTypeComponent: "Компонент",
1579
+ navTypeDoc: "Документ",
1287
1580
  navEditIcon: "Редактировать значок",
1288
1581
  navToggleVisible: "Переключить видимость",
1289
1582
  navHidden: "Скрыто",
@@ -1361,11 +1654,8 @@ const ru = {
1361
1654
  defaultValue: "Значение по умолчанию",
1362
1655
  placeholder: "Заполнитель",
1363
1656
  referenceTo: "Ссылка на",
1364
- formula: "Формула",
1365
1657
  options: "Параметры",
1366
1658
  addOption: "Добавить параметр",
1367
- validationRules: "Правила валидации",
1368
- addRule: "Добавить правило",
1369
1659
  systemBadge: "Система",
1370
1660
  ungrouped: "Общее",
1371
1661
  deleteConfirmTitle: "Удалить поле?",
@@ -1384,7 +1674,25 @@ const ru = {
1384
1674
  },
1385
1675
  },
1386
1676
  console: {
1677
+ studio: {
1678
+ backToHome: "На главную",
1679
+ },
1387
1680
  saveAdvisoryTitle: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1681
+ saveAdvisoryTitle_one: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1682
+ saveAdvisoryTitle_few: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1683
+ saveAdvisoryTitle_many: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1684
+ saveAdvisoryTitle_other: "Сохранено — проверка авторинга выдала рекомендаций: {{count}}",
1685
+ publishAdvisoryTitle: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1686
+ publishAdvisoryTitle_one: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1687
+ publishAdvisoryTitle_few: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1688
+ publishAdvisoryTitle_many: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1689
+ publishAdvisoryTitle_other: "Опубликовано — проверка авторинга выдала рекомендаций: {{count}}",
1690
+ importMappingsUnavailable: "Не удалось загрузить сохранённые сопоставления импорта для {{object}}",
1691
+ importMappingsRefused: "Сервер отклонил этот запрос, поэтому список пуст из-за того, что его не удалось прочитать, а не потому, что ничего не зарегистрировано. Войдите заново или запросите доступ у администратора.",
1692
+ importMappingsUnreadable: "Список пуст из-за того, что его не удалось прочитать, а не потому, что ничего не зарегистрировано. Повторите попытку и сообщите о проблеме, если она повторяется.",
1693
+ savedViewsUnavailable: "Не удалось загрузить сохранённые представления для {{object}}",
1694
+ savedViewsRefused: "Сервер отклонил этот запрос, поэтому список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Войдите заново или запросите доступ у администратора.",
1695
+ savedViewsUnreadable: "Список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Повторите попытку и сообщите о проблеме, если она повторяется.",
1388
1696
  settingsHub: {
1389
1697
  title: "Настройки",
1390
1698
  subtitle: "Настройте рабочее пространство, интеграции и флаги функций.",
@@ -1447,9 +1755,20 @@ const ru = {
1447
1755
  statusFull: "Лимит исчерпан",
1448
1756
  resetsDaily: "Сбросится сегодня ночью",
1449
1757
  resetsMonthly: "Сбросится в следующем цикле",
1758
+ resetsWeeklyDays: "Сброс через {{count}} дней",
1759
+ resetsWeeklyDays_one: "Сброс через {{count}} день",
1760
+ resetsWeeklyDays_few: "Сброс через {{count}} дня",
1761
+ resetsWeeklyDays_many: "Сброс через {{count}} дней",
1762
+ resetsWeeklyDays_other: "Сброс через {{count}} дня",
1763
+ resetsWeeklyHours: "Сброс через {{count}} часов",
1764
+ resetsWeeklyHours_one: "Сброс через {{count}} час",
1765
+ resetsWeeklyHours_few: "Сброс через {{count}} часа",
1766
+ resetsWeeklyHours_many: "Сброс через {{count}} часов",
1767
+ resetsWeeklyHours_other: "Сброс через {{count}} часа",
1450
1768
  ctaUpgrade: "Повысьте тариф, чтобы продолжить",
1451
1769
  ctaTopUp: "Добавьте кредиты, чтобы продолжить",
1452
1770
  ariaLabel: "Использование ИИ: {{status}}",
1771
+ breakdownTitle: "Использовано на данный момент",
1453
1772
  },
1454
1773
  workspaceTitle: "Рабочее пространство ИИ",
1455
1774
  workspaceSubtitle: "Задавайте вопросы, изучайте и возвращайтесь к диалогам",
@@ -1459,6 +1778,31 @@ const ru = {
1459
1778
  share: "Поделиться",
1460
1779
  shareTitle: "Поделиться этим диалогом",
1461
1780
  shareDisabledTitle: "Начните диалог, чтобы включить публикацию",
1781
+ buildDoctor: "Диагностика сборки",
1782
+ buildDoctorTitle: "Диагностика сборки — что на самом деле применено?",
1783
+ buildDoctorDisabledTitle: "Сначала отправьте сообщение",
1784
+ buildDoctorDrawer: {
1785
+ description: 'Что заявил агент и что на самом деле действует. Диагностика только для чтения.',
1786
+ reconciling: 'Сверка…',
1787
+ notAvailable: 'Недоступно — беседа не найдена или у вас нет доступа.',
1788
+ untitled: '(без названия)',
1789
+ summary: 'Ходов: {{turns}} · сообщений: {{messages}} · токенов: {{tokens}} · LLM: {{seconds}} с',
1790
+ allLive: 'Все попытки изменений ({{count}}) действуют — ничего не потерялось.',
1791
+ discrepancies: 'Расхождений: {{count}} — сказанное в чате не совпадает с тем, что действует.',
1792
+ orphanedTitle: 'Предложено, но не применено',
1793
+ orphanedHint: 'Карточку подтверждения, предложенную агентом, не применил ни один последующий ход — изменение незаметно потерялось.',
1794
+ missingTitle: 'Заявлено, но отсутствует',
1795
+ missingHint: 'Результат инструмента сообщил, что изменение применено, но артефакт не действует в sys_metadata.',
1796
+ toolErrorsTitle: 'Ошибки инструментов',
1797
+ toolErrorsHint: 'Вызовы инструментов, вернувшие ошибку во время сборки.',
1798
+ verifyTitle: 'Проверка сборки (verify_build)',
1799
+ yourApp: 'Ваше приложение:',
1800
+ noIssues: 'Проблем: 0',
1801
+ issueCount: 'Проблем: {{count}}',
1802
+ platformNoise: 'Скрыто находок платформы sys_*: {{count}}',
1803
+ pendingActions: 'Ожидающие действия',
1804
+ timeline: 'Хронология ({{count}})',
1805
+ },
1462
1806
  newChat: "Создать",
1463
1807
  searchChats: "Поиск по чатам…",
1464
1808
  noChatsYet: "Чатов пока нет",
@@ -1488,7 +1832,7 @@ const ru = {
1488
1832
  empty: {
1489
1833
  build: {
1490
1834
  title: "Создать с помощью ИИ",
1491
- description: "Опишите приложение или процесс обычными словами — я подготовлю объекты, экраны и автоматизации, а вы проверите и опубликуете.",
1835
+ description: "Опишите приложение обычными словами — я подготовлю объекты, экраны и демонстрационные данные, а вы проверите и опубликуете.",
1492
1836
  },
1493
1837
  ask: {
1494
1838
  title: "Спросите свои данные",
@@ -1497,7 +1841,7 @@ const ru = {
1497
1841
  editApp: {
1498
1842
  title: "Редактирование «{{app}}»",
1499
1843
  titleGeneric: "Редактировать это приложение",
1500
- description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или автоматизацию либо скорректирую существующее.",
1844
+ description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или дашборд либо скорректирую существующее.",
1501
1845
  },
1502
1846
  },
1503
1847
  clearConversation: "Очистить",
@@ -1550,23 +1894,41 @@ const ru = {
1550
1894
  recentRecords: "Перечисли 5 последних созданных записей.",
1551
1895
  recordCounts: "Посчитай количество записей по каждому объекту.",
1552
1896
  },
1897
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1898
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1899
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1900
+ // wording that promises autonomous behaviour (alert / remind / notify /
1901
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1902
+ // the model silently degrades such a request into a board or a filtered
1903
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1904
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1553
1905
  metadataAssistant: {
1554
- buildCrm: "Создай CRM для продаж — клиенты, контакты и воронка сделок с итогами по этапам.",
1555
- buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам.",
1556
- buildFlow: "Спроектируй службу поддержки — заявки с приоритетом, процесс статусов и связи с клиентами.",
1557
- buildInventory: "Создай приложение для склада — товары, остатки, поставщики и индикация низких остатков.",
1558
- buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, этапы собеседований и заметки.",
1906
+ buildCrm: "Создай CRM для продаж — клиенты, контакты и сделки с полем этапа, а также дашборд с суммой сделок по этапам.",
1907
+ buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам и календарь сроков.",
1908
+ buildFlow: "Спроектируй службу поддержки — заявки с полями приоритета и статуса, доска по статусам и связи с клиентами.",
1909
+ buildInventory: "Создай приложение для склада — товары, остатки, поставщики и представление, отбирающее товары ниже точки заказа.",
1910
+ buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, поле этапа собеседования и доска по этапам.",
1559
1911
  },
1560
1912
  generic: {
1561
1913
  help: "Чем ты можешь мне помочь?",
1562
1914
  availableObjects: "Перечисли доступные объекты данных.",
1563
1915
  recentActivity: "Сделай сводку моей недавней активности.",
1564
1916
  },
1917
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1918
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1919
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1920
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1921
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1922
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1923
+ // no data is what an existing app most often lacks. REVERT: when
1924
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1925
+ // comes back as `addAutomation`; the retired string is pinned for every
1926
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1565
1927
  editApp: {
1566
1928
  addField: "Добавь поле в один из объектов.",
1567
1929
  addObject: "Добавь новый объект и свяжи его с существующим.",
1568
1930
  addDashboard: "Добавь дашборд с ключевыми показателями.",
1569
- addAutomation: "Добавь автоматизацию — согласование, процесс статусов или уведомление.",
1931
+ addSampleData: "Заполни существующие объекты правдоподобными демонстрационными записями, чтобы приложение можно было показать.",
1570
1932
  },
1571
1933
  },
1572
1934
  changesTitle: "Подтвердите изменения",
@@ -1648,6 +2010,13 @@ const ru = {
1648
2010
  pages: "Страницы",
1649
2011
  reports: "Отчёты",
1650
2012
  system: "Система",
2013
+ marketplace: "Маркетплейс",
2014
+ settings: 'Настройки',
2015
+ apps: 'Приложения',
2016
+ profile: 'Профиль',
2017
+ approvals: 'Согласования',
2018
+ aiApprovals: 'Согласования ИИ',
2019
+ auditLog: 'Журнал аудита',
1651
2020
  },
1652
2021
  // objectui#4024 — the single-namespace settings screen. Its sibling
1653
2022
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1667,7 +2036,9 @@ const ru = {
1667
2036
  saveChanges: "Сохранить изменения",
1668
2037
  unsavedCount: "Несохранённых изменений: {{count}}",
1669
2038
  unsavedCount_one: "{{count}} несохранённое изменение",
1670
- unsavedCount_other: "{{count}} несохранённых изменений",
2039
+ unsavedCount_few: "{{count}} несохранённых изменения",
2040
+ unsavedCount_many: "{{count}} несохранённых изменений",
2041
+ unsavedCount_other: "{{count}} несохранённого изменения",
1671
2042
  cryptoRefusalTitle: "Эта установка не может шифровать секреты",
1672
2043
  cryptoRefusalSubjectSuffix: "объявлен зашифрованным, поэтому ничего не было записано.",
1673
2044
  cryptoRefusalNoSubject: "Значение, объявленное зашифрованным, было отклонено, поэтому ничего не было записано.",
@@ -1739,6 +2110,21 @@ const ru = {
1739
2110
  records: "Записи",
1740
2111
  recentRecords: "Недавно просмотренные",
1741
2112
  },
2113
+ // objectui#9954 — see the `en` pack for what raises each case.
2114
+ readRate: {
2115
+ ratioTitle: 'Необычный объём чтения в этой среде',
2116
+ ratio: 'На каждую записанную строку читается {{ratio}} строк. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.',
2117
+ noWritesTitle: 'Чтение вообще без записи в этой среде',
2118
+ noWrites: 'Строки читаются, но не записывается ни одной, поэтому у скорости чтения нет верхней границы. Это самый серьёзный показатель. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.',
2119
+ },
2120
+ // objectui#10439 — see the `en` pack for what raises each case.
2121
+ storageUsage: {
2122
+ warningTitle: 'Хранилище почти заполнено',
2123
+ warning: 'Использовано {{used}} МБ из {{limit}} МБ. Когда хранилище заполнится, загрузка файлов и импорт будут приостановлены.',
2124
+ blockedTitle: 'Хранилище заполнено: загрузка файлов и импорт приостановлены',
2125
+ blocked: 'Использовано {{used}} МБ из {{limit}} МБ. Существующие данные не затронуты; чтение, экспорт и редактирование отдельных записей по-прежнему работают.',
2126
+ upgrade: 'Повысьте тариф, чтобы продолжить',
2127
+ },
1742
2128
  errors: {
1743
2129
  somethingWentWrong: "Что-то пошло не так",
1744
2130
  unexpectedError: "При отображении этого представления произошла непредвиденная ошибка.",
@@ -1769,6 +2155,7 @@ const ru = {
1769
2155
  viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
1770
2156
  systemViewReadonly: "Системное представление определено в коде — только для чтения.",
1771
2157
  cannotEditMetaView: "Это встроенное представление, определённое в коде, — изменить его нельзя.",
2158
+ viewConfigPermissionDenied: "Настройки представления применяются ко всем пользователям этого представления, поэтому их изменение требует разрешения «Управление метаданными». Обратитесь к администратору, чтобы внести это изменение.",
1772
2159
  cannotDeleteMetaView: "Это встроенное представление, определённое в коде, — удалить его нельзя.",
1773
2160
  expandToPage: "Открыть на всю страницу",
1774
2161
  objectNotFound: "Объект не найден",
@@ -1779,12 +2166,18 @@ const ru = {
1779
2166
  allRecords: "Все записи",
1780
2167
  new: "Создать",
1781
2168
  configureView: "Настроить представление",
1782
- toolbar: "Панель инструментов",
1783
2169
  toolbarEnabledCount: "{{count}} из {{total}} включено",
1784
2170
  searchFields: "Поиск полей…",
1785
2171
  title: "Заголовок",
1786
2172
  viewType: "Тип представления",
1787
- recordCount: "{{count}} записей",
2173
+ // objectui#11445 — a count family: each slot agrees the noun with the
2174
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
2175
+ // count-invariant form, answers a call made without a count.
2176
+ recordCount: "Записей: {{count}}",
2177
+ recordCount_one: "{{count}} запись",
2178
+ recordCount_few: "{{count}} записи",
2179
+ recordCount_many: "{{count}} записей",
2180
+ recordCount_other: "{{count}} записи",
1788
2181
  save: "Сохранить",
1789
2182
  discard: "Отменить",
1790
2183
  createView: "Создать представление",
@@ -1796,11 +2189,14 @@ const ru = {
1796
2189
  longitudeField: "Поле долготы",
1797
2190
  imageField: "Поле изображения",
1798
2191
  selectField: "Выберите поле…",
1799
- groupBy: "Группировать по",
1800
2192
  endDateField: "Поле даты окончания",
1801
2193
  import: "Импорт",
1802
2194
  importTitle: "Импорт из CSV",
1803
2195
  importedToast: "{{count}} строк импортировано.",
2196
+ importedToast_one: "Импортирована {{count}} строка.",
2197
+ importedToast_few: "Импортировано {{count}} строки.",
2198
+ importedToast_many: "Импортировано {{count}} строк.",
2199
+ importedToast_other: "Импортировано {{count}} строки.",
1804
2200
  importedWithSkipped: "{{ok}} строк импортировано; {{skipped}} пропущено.",
1805
2201
  createViewDesc: "Выберите тип представления и задайте ему имя. Все настройки можно изменить позже.",
1806
2202
  cancel: "Отмена",
@@ -1809,6 +2205,10 @@ const ru = {
1809
2205
  deleteViewTitle: "Удалить представление",
1810
2206
  deleteViewConfirm: "Удалить представление \"{{name}}\"? Это действие нельзя отменить.",
1811
2207
  bulkDeleteConfirm: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2208
+ bulkDeleteConfirm_one: "Удалить {{count}} выбранную запись? Это действие нельзя отменить.",
2209
+ bulkDeleteConfirm_few: "Удалить {{count}} выбранные записи? Это действие нельзя отменить.",
2210
+ bulkDeleteConfirm_many: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2211
+ bulkDeleteConfirm_other: "Удалить {{count}} выбранной записи? Это действие нельзя отменить.",
1812
2212
  duplicateViewName: "Представление с таким именем уже существует.",
1813
2213
  viewTypeGrid: "Таблица",
1814
2214
  viewTypeGridDesc: "Таблица записей в стиле электронной таблицы.",
@@ -1845,10 +2245,14 @@ const ru = {
1845
2245
  chartTypePie: "Круговая",
1846
2246
  chartTypeArea: "Областная",
1847
2247
  chartTypeScatter: "Точечная",
1848
- xAxisField: "Поле оси X",
1849
- xAxisFieldHelp: "Категориальное или временное измерение.",
1850
- yAxisField: "Поле оси Y",
1851
- yAxisFieldHelp: "Числовое поле для агрегации.",
2248
+ dataset: "Набор данных",
2249
+ datasetHelp: "Диаграмма берёт значения из этого набора данных объекта.",
2250
+ chartMeasure: "Мера",
2251
+ chartMeasureHelp: "Мера набора данных, отображаемая на оси значений.",
2252
+ chartDimension: "Измерение",
2253
+ chartDimensionHelp: "Измерение набора данных, по которому группируются значения (необязательно).",
2254
+ viewTypeUnavailableDataset: "Этот объект не предоставляет набора данных для диаграммы.",
2255
+ noDatasetMeasure: "В этом наборе данных не объявлено ни одной меры для диаграммы.",
1852
2256
  ufTabs: "Вкладки",
1853
2257
  ufAddField: "+ Добавить поле фильтра…",
1854
2258
  ufShowAllRecords: "Показать вкладку \"Все записи\"",
@@ -1862,6 +2266,9 @@ const ru = {
1862
2266
  unpinItem: "Открепить {{name}}",
1863
2267
  dragToReorder: "Перетащите для изменения порядка",
1864
2268
  favorites: "Избранное",
2269
+ launcherLabel: "Панель приложений",
2270
+ menuLabel: "Навигация приложения",
2271
+ menuEmpty: "В этом приложении нет доступных для открытия элементов навигации.",
1865
2272
  },
1866
2273
  },
1867
2274
  auth: {
@@ -1915,6 +2322,8 @@ const ru = {
1915
2322
  resendOtpCountdownText: "Отправить снова через {seconds} с",
1916
2323
  usePhoneOtpText: "Войти по коду подтверждения",
1917
2324
  usePasswordSignInText: "Войти с паролем",
2325
+ socialButton: "Продолжить через {provider}",
2326
+ orText: "или продолжите с электронной почтой",
1918
2327
  },
1919
2328
  register: {
1920
2329
  title: "Создать аккаунт",
@@ -1933,8 +2342,12 @@ const ru = {
1933
2342
  submittingButton: "Создание аккаунта…",
1934
2343
  hasAccountText: "Уже есть аккаунт?",
1935
2344
  signInText: "Войти",
2345
+ socialButton: "Зарегистрироваться через {provider}",
2346
+ orText: "или продолжите с электронной почтой",
1936
2347
  errors: {
1937
2348
  userExists: "Аккаунт с таким email уже существует. Попробуйте войти.",
2349
+ selfRegistrationClosed: "Самостоятельная регистрация в этой среде закрыта. Обратитесь к администратору за приглашением.",
2350
+ emailDomainNotAllowed: "Регистрация с адресами этого домена здесь не разрешена. Используйте email вашей организации или обратитесь к администратору за приглашением.",
1938
2351
  },
1939
2352
  verifyInbox: {
1940
2353
  title: "Проверьте входящие",
@@ -2133,6 +2546,15 @@ const ru = {
2133
2546
  role: "Роль",
2134
2547
  save: "Сохранить изменения",
2135
2548
  },
2549
+ language: {
2550
+ title: "Язык",
2551
+ description: "Язык уведомлений и сообщений, которые отправляются вам. Язык интерфейса выбирается отдельно — в меню с глобусом.",
2552
+ label: "Предпочитаемый язык",
2553
+ systemDefault: "Использовать значение по умолчанию для развёртывания",
2554
+ save: "Сохранить",
2555
+ saved: "Языковые настройки обновлены.",
2556
+ readOnly: "Язык вашей учётной записи настраивает администратор.",
2557
+ },
2136
2558
  password: {
2137
2559
  changeTitle: "Изменить пароль",
2138
2560
  setTitle: "Задать локальный пароль",
@@ -2164,7 +2586,6 @@ const ru = {
2164
2586
  label: "Рабочие пространства",
2165
2587
  default: "Моё рабочее пространство",
2166
2588
  switch: "Переключить рабочее пространство",
2167
- create: "Создать рабочее пространство",
2168
2589
  createTitle: "Создать рабочее пространство",
2169
2590
  createDescription: "Рабочее пространство — это общее место для совместной работы вашей команды.",
2170
2591
  createButton: "Создать рабочее пространство",
@@ -2189,7 +2610,6 @@ const ru = {
2189
2610
  packageManagement: "Управление пакетами",
2190
2611
  searchNavigation: "Поиск по навигации…",
2191
2612
  settings: "Настройки",
2192
- help: "Помощь",
2193
2613
  helpTooltip: "Помощь и документация",
2194
2614
  activityFeed: "Лента активности",
2195
2615
  notifications: "Уведомления",
@@ -2249,6 +2669,10 @@ const ru = {
2249
2669
  },
2250
2670
  pendingDrafts: {
2251
2671
  message: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2672
+ message_one: "У вас {{count}} неопубликованное изменение — опубликуйте его, чтобы оно вступило в силу.",
2673
+ message_few: "У вас {{count}} неопубликованных изменения — опубликуйте их, чтобы они вступили в силу.",
2674
+ message_many: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2675
+ message_other: "У вас {{count}} неопубликованного изменения — опубликуйте их, чтобы они вступили в силу.",
2252
2676
  cta: "Опубликовать",
2253
2677
  publishing: "Публикация…",
2254
2678
  published: "Опубликовано! Изменения вступили в силу.",
@@ -2264,7 +2688,6 @@ const ru = {
2264
2688
  capabilityWarn: "Проверка при создании — несуществующих ссылок на возможности: {{count}}.",
2265
2689
  },
2266
2690
  title: "Главная",
2267
- subtitle: "Панель вашего рабочего пространства",
2268
2691
  nav: "Главная",
2269
2692
  allApps: "Все приложения",
2270
2693
  yourApps: "Ваши приложения",
@@ -2276,8 +2699,6 @@ const ru = {
2276
2699
  empty: "Всё выполнено",
2277
2700
  },
2278
2701
  loading: "Загрузка рабочего пространства…",
2279
- recent: "Недавние",
2280
- starred: "Избранные",
2281
2702
  welcome: "Добро пожаловать в ObjectUI",
2282
2703
  welcomeDescription: "Начните с создания вашего первого приложения или настройки системы.",
2283
2704
  createFirstApp: "Создайте первое приложение",
@@ -2285,8 +2706,6 @@ const ru = {
2285
2706
  browseMarketplace: "Обзор маркетплейса приложений",
2286
2707
  quickActions: {
2287
2708
  title: "Быстрые действия",
2288
- createApp: "Создать приложение",
2289
- createAppDesc: "Начните с нового приложения",
2290
2709
  manageObjects: "Управление объектами",
2291
2710
  manageObjectsDesc: "Настройте модели данных",
2292
2711
  systemSettings: "Системные настройки",
@@ -2302,18 +2721,15 @@ const ru = {
2302
2721
  greetingNight: "Ночная смена",
2303
2722
  heroTagline: "Продолжите с того места, где остановились, или откройте что-то новое.",
2304
2723
  open: "Открыть",
2305
- stats: {
2306
- apps: "Приложения",
2307
- starred: "Отмеченные",
2308
- recent: "Недавние",
2309
- },
2310
2724
  recentApps: {
2311
2725
  title: "Недавно открытые",
2312
2726
  itemType: {
2313
2727
  object: "Объект",
2314
2728
  dashboard: "Панель",
2315
2729
  page: "Страница",
2730
+ report: "Отчёт",
2316
2731
  record: "Запись",
2732
+ metadata: "Метаданные",
2317
2733
  },
2318
2734
  },
2319
2735
  starredApps: {
@@ -2335,7 +2751,6 @@ const ru = {
2335
2751
  organizations: "Организации",
2336
2752
  roles: "Роли",
2337
2753
  configuration: "Конфигурация",
2338
- createApp: "Создать приложение",
2339
2754
  administration: "Администрирование",
2340
2755
  datasources: "Источники данных",
2341
2756
  documentation: "Документация",
@@ -2360,6 +2775,7 @@ const ru = {
2360
2775
  typeUpdate: "Обновление",
2361
2776
  typeDelete: "Удаление",
2362
2777
  typeComment: "Комментарий",
2778
+ typeSystem: "Система",
2363
2779
  relativeJustNow: "только что",
2364
2780
  relativeSecondsAgo: "{{count}} с назад",
2365
2781
  relativeMinutesAgo: "{{count}} м назад",
@@ -2381,8 +2797,18 @@ const ru = {
2381
2797
  placeholder: "Поиск объектов, панелей, страниц, отчётов…",
2382
2798
  inputAriaLabel: "Поиск объектов, панелей, страниц, отчётов",
2383
2799
  resultsCount: "{{count}} результат для \"{{query}}\"",
2384
- resultsCountPlural: "{{count}} результатов для \"{{query}}\"",
2800
+ resultsCount_one: "{{count}} результат по запросу \"{{query}}\"",
2801
+ resultsCount_few: "{{count}} результата по запросу \"{{query}}\"",
2802
+ resultsCount_many: "{{count}} результатов по запросу \"{{query}}\"",
2803
+ resultsCount_other: "{{count}} результата по запросу \"{{query}}\"",
2804
+ // objectui#11445 — a count family: each slot agrees the noun with the
2805
+ // number (one 1/21, few 2-4, many 5-20, other a fraction). The base key, a
2806
+ // count-invariant form, answers a call made without a count.
2385
2807
  itemsAvailable: "{{count}} доступно",
2808
+ itemsAvailable_one: "{{count}} доступно",
2809
+ itemsAvailable_few: "{{count}} доступно",
2810
+ itemsAvailable_many: "{{count}} доступно",
2811
+ itemsAvailable_other: "{{count}} доступно",
2386
2812
  noResults: "Результатов не найдено",
2387
2813
  noResultsHint: "Попробуйте изменить поисковые запросы",
2388
2814
  typeObjects: "Объекты",
@@ -2407,7 +2833,11 @@ const ru = {
2407
2833
  noAppsConfigured: "Нет приложений",
2408
2834
  noAppsConfiguredDescription: "Нет зарегистрированных приложений. Создайте первое приложение или посетите системные настройки.",
2409
2835
  appNotAvailable: "Приложение недоступно",
2410
- appNotAvailableDescription: "Это приложение пока недоступно — возможно, публикация ещё идёт. Повторите попытку через мгновение.",
2836
+ appNotAvailableDescription: "Это приложение недоступно — повторите попытку через мгновение.",
2837
+ appNotFound: "Не удалось открыть это приложение",
2838
+ appNotFoundDescription: "Сервер не вернул это приложение для вашей учётной записи.",
2839
+ appUnreachable: "Не удалось связаться с сервером",
2840
+ appUnreachableDescription: "Не удалось проверить это приложение. Повторите попытку через мгновение.",
2411
2841
  appAccessDenied: "У вас нет доступа к этому приложению",
2412
2842
  appAccessDeniedDescription: "Это приложение существует, но у вашей учётной записи нет прав на его открытие. Обратитесь к администратору за доступом.",
2413
2843
  appAccessDeniedHome: "На главную",
@@ -2422,11 +2852,11 @@ const ru = {
2422
2852
  description: "Введите необходимую информацию для продолжения.",
2423
2853
  selectPlaceholder: "Выбрать {{label}}",
2424
2854
  requiredError: "{{label}} обязательно",
2855
+ unresolvedParam: 'Этот параметр невозможно показать: поле, на котором он основан, отсутствует в метаданных объекта, поэтому нужный элемент управления нельзя построить. Попросите администратора исправить определение действия.',
2856
+ carryOverHint: 'Переносится без изменений (только чтение)',
2425
2857
  cancel: "Отмена",
2426
2858
  confirm: "Подтвердить",
2427
2859
  uploading: "Загрузка…",
2428
- defaultActionTitle: "Действие",
2429
- ok: "ОК",
2430
2860
  lookupPlaceholder: "ID записи для {{label}}",
2431
2861
  lookupHelpText: "Для этого параметра не настроен объект ссылки, поэтому выбор записи недоступен. Введите ID записи или попросите администратора исправить параметр действия.",
2432
2862
  },
@@ -2435,11 +2865,6 @@ const ru = {
2435
2865
  confirm: "Продолжить",
2436
2866
  cancel: "Отмена",
2437
2867
  },
2438
- rowAction: {
2439
- openMenu: "Открыть меню",
2440
- edit: "Редактировать",
2441
- delete: "Удалить",
2442
- },
2443
2868
  navigationSync: {
2444
2869
  addedPage: "Навигация обновлена: страница \"{{name}}\" добавлена",
2445
2870
  addedDashboard: "Навигация обновлена: панель \"{{name}}\" добавлена",
@@ -2460,6 +2885,10 @@ const ru = {
2460
2885
  noRecordId: "ID записи не указан",
2461
2886
  deleteConfirm: "Удалить эту запись?",
2462
2887
  bulkDeleteSuccess: "{{count}} записей {{label}} удалено",
2888
+ bulkDeleteSuccess_one: "Удалена {{count}} запись {{label}}",
2889
+ bulkDeleteSuccess_few: "Удалено {{count}} записи {{label}}",
2890
+ bulkDeleteSuccess_many: "Удалено {{count}} записей {{label}}",
2891
+ bulkDeleteSuccess_other: "Удалено {{count}} записи {{label}}",
2463
2892
  bulkDeletePartial: "{{succeeded}} удалено, {{failed}} не удалось",
2464
2893
  },
2465
2894
  objectViewActions: {
@@ -2471,15 +2900,6 @@ const ru = {
2471
2900
  exportFailed: "Ошибка экспорта: {{message}}",
2472
2901
  forecastSoon: "Прогнозное представление скоро будет",
2473
2902
  },
2474
- recordDetail: {
2475
- viewersTooltip: "Пользователи, просматривающие эту запись",
2476
- },
2477
- cellRender: {
2478
- empty: "Пусто",
2479
- yes: "Да",
2480
- no: "Нет",
2481
- systemFields: "Система",
2482
- },
2483
2903
  user: {
2484
2904
  profile: "Профиль",
2485
2905
  settings: "Настройки",
@@ -2669,18 +3089,41 @@ const ru = {
2669
3089
  regionLabel: "Уведомления",
2670
3090
  groupCount: "Уведомлений: {{count}}",
2671
3091
  groupUnread: "Непрочитанных: {{count}}",
3092
+ groupUnread_one: "Непрочитанных: {{count}}",
3093
+ groupUnread_few: "Непрочитанных: {{count}}",
3094
+ groupUnread_many: "Непрочитанных: {{count}}",
3095
+ groupUnread_other: "Непрочитанных: {{count}}",
2672
3096
  groupMarkRead: "Отметить прочитанными",
2673
3097
  groupMarkReadTitle: "Отметить прочитанными все этого типа",
2674
3098
  empty: "Нет уведомлений",
2675
3099
  markAllRead: "Отметить все как прочитанные",
2676
3100
  viewAll: "Показать все уведомления",
2677
3101
  approvalsPending: "{{count}} ожидающих утверждений",
3102
+ approvalsPending_one: "{{count}} ожидающее утверждение",
3103
+ approvalsPending_few: "{{count}} ожидающих утверждения",
3104
+ approvalsPending_many: "{{count}} ожидающих утверждений",
3105
+ approvalsPending_other: "{{count}} ожидающего утверждения",
2678
3106
  viewApprovals: "Показать утверждения",
2679
3107
  noPendingApprovals: "Нет ожидающих утверждений",
2680
3108
  openApprovalsInbox: "Открыть входящие утверждений",
2681
3109
  badgeTotal: "Всего: {{total}}",
2682
3110
  badgeNotifications: "{{unread}} уведомлений",
2683
3111
  badgeApprovals: "{{approvals}} ожидающих утверждений",
3112
+ arrivalMany: "Новых сообщений: {{count}}",
3113
+ arrivalMany_one: "Новых сообщений: {{count}}",
3114
+ arrivalMany_few: "Новых сообщений: {{count}}",
3115
+ arrivalMany_many: "Новых сообщений: {{count}}",
3116
+ arrivalMany_other: "Новых сообщений: {{count}}",
3117
+ arrivalRepeats: "Новых сообщений по этой теме: {{count}}",
3118
+ arrivalRepeats_one: "Новых сообщений по этой теме: {{count}}",
3119
+ arrivalRepeats_few: "Новых сообщений по этой теме: {{count}}",
3120
+ arrivalRepeats_many: "Новых сообщений по этой теме: {{count}}",
3121
+ arrivalRepeats_other: "Новых сообщений по этой теме: {{count}}",
3122
+ arrivalOpen: "Открыть",
3123
+ toastEnabled: "Оповещения в приложении",
3124
+ desktopEnabled: "Уведомления на рабочем столе",
3125
+ desktopBlocked: "Заблокировано. Разрешите уведомления для этого сайта в настройках браузера.",
3126
+ desktopUnsupported: "Этот браузер не поддерживает уведомления на рабочем столе.",
2684
3127
  emptyUnread: "Всё прочитано",
2685
3128
  filterUnread: "Непрочитанные",
2686
3129
  filterAll: "Все",
@@ -2694,12 +3137,14 @@ const ru = {
2694
3137
  thankYouTitle: "Спасибо!",
2695
3138
  thankYouMessage: "Ваш ответ успешно получен.",
2696
3139
  redirecting: "Перенаправление через {{seconds}} с…",
3140
+ redirectPending: "Перенаправление…",
2697
3141
  unavailableTitle: "Форма недоступна",
2698
3142
  unavailableDescription: "По этому URL нет публичной формы. Убедитесь, что базовое представление имеет анонимный доступ.",
2699
3143
  tryDemo: "Попробовать демо",
2700
3144
  retry: "Повторить",
2701
3145
  loading: "Загрузка формы…",
2702
3146
  requiredHint: "* Обязательное поле",
3147
+ requiredFields: "Обязательные поля: {{fields}}",
2703
3148
  consentLabelDefault: "Я принимаю политику конфиденциальности и соглашаюсь на обработку моих данных.",
2704
3149
  consentLink: "Политика конфиденциальности",
2705
3150
  consentRequired: "Пожалуйста, примите политику конфиденциальности.",
@@ -2750,6 +3195,10 @@ const ru = {
2750
3195
  noImportableFields: "У этого объекта нет полей, доступных для импорта.",
2751
3196
  schemaReadFailed: "Не удалось прочитать схему объекта.",
2752
3197
  imported: "Импортировано строк: {{count}} в {{object}}.",
3198
+ imported_one: "Импортировано строк: {{count}} в {{object}}.",
3199
+ imported_few: "Импортировано строк: {{count}} в {{object}}.",
3200
+ imported_many: "Импортировано строк: {{count}} в {{object}}.",
3201
+ imported_other: "Импортировано строк: {{count}} в {{object}}.",
2753
3202
  importFrom: "Импортировать реальные строки из",
2754
3203
  into: "в",
2755
3204
  opening: "Открытие…",
@@ -2763,6 +3212,80 @@ const ru = {
2763
3212
  openProduction: "Открыть продакшн",
2764
3213
  manageEnvironments: "Управление окружениями",
2765
3214
  },
3215
+ cloudPlanStatus: {
3216
+ current: "Текущий тариф",
3217
+ },
3218
+ ai: {
3219
+ nlQuery: {
3220
+ placeholder: "Задайте вопрос о своих данных…",
3221
+ ask: "Спросить",
3222
+ results: "Результаты",
3223
+ match: "Совпадение: {{percent}}",
3224
+ simulatedSummary: "Результаты по запросу: {{query}}",
3225
+ noResults: "Подходящие записи не найдены",
3226
+ recentQueries: "Недавние запросы",
3227
+ },
3228
+ formAssist: {
3229
+ title: "Предложения ИИ",
3230
+ suggestionCount: "Предложений: {{count}}",
3231
+ suggestionCount_one: "{{count}} предложение",
3232
+ suggestionCount_few: "{{count}} предложения",
3233
+ suggestionCount_many: "{{count}} предложений",
3234
+ suggestionCount_other: "{{count}} предложения",
3235
+ applyAll: "Применить все",
3236
+ confidence: "Уверенность: {{percent}}",
3237
+ appliedCount: "Применено предложений: {{count}}",
3238
+ appliedCount_one: "Применено {{count}} предложение",
3239
+ appliedCount_few: "Применено {{count}} предложения",
3240
+ appliedCount_many: "Применено {{count}} предложений",
3241
+ appliedCount_other: "Применено {{count}} предложения",
3242
+ },
3243
+ recommendations: {
3244
+ title: "Рекомендации",
3245
+ generating: "Формирование рекомендаций…",
3246
+ empty: "Нет доступных рекомендаций",
3247
+ },
3248
+ },
3249
+ aiApprovals: {
3250
+ title: "Согласования ИИ",
3251
+ description: "Действия, предложенные ИИ-агентом: перед выполнением их должен проверить человек.",
3252
+ tabPending: "Ожидают",
3253
+ tabDecided: "Обработанные",
3254
+ tabAll: "Все",
3255
+ statusPending: "Ожидает",
3256
+ statusApproved: "Согласовано",
3257
+ statusExecuted: "Выполнено",
3258
+ statusFailed: "Не выполнено",
3259
+ statusRejected: "Отклонено",
3260
+ colTool: "Инструмент",
3261
+ colAction: "Действие",
3262
+ colObject: "Объект",
3263
+ colStatus: "Статус",
3264
+ colProposed: "Предложено",
3265
+ colDecision: "Решение",
3266
+ emptyTitle: "Нет действий в ожидании",
3267
+ emptyDescription: "Когда ИИ предложит важное действие, оно появится здесь на проверку.",
3268
+ view: "Открыть",
3269
+ approve: "Согласовать",
3270
+ reject: "Отклонить",
3271
+ working: "Выполняется…",
3272
+ approveAndExecute: "Согласовать и выполнить",
3273
+ outcomeApprove: "Согласование {{id}}: {{message}}",
3274
+ outcomeReject: "Отклонение {{id}}: {{message}}",
3275
+ outcomeExecuteFailed: "Действие завершилось ошибкой при выполнении",
3276
+ drawerFallbackTitle: "Действие в ожидании",
3277
+ drawerSubtitle: "Инструмент {{tool}} для объекта {{object}}",
3278
+ fieldProposedBy: "Кто предложил",
3279
+ fieldDecidedBy: "Кто решил",
3280
+ fieldConversation: "Диалог",
3281
+ fieldToolInput: "Входные данные инструмента",
3282
+ fieldResult: "Результат",
3283
+ fieldError: "Ошибка",
3284
+ fieldRejectionReason: "Причина отклонения",
3285
+ rejectTitle: "Отклонить это действие?",
3286
+ rejectBody: "Причина возвращается ИИ, чтобы он скорректировал следующий ответ.",
3287
+ rejectPlaceholder: "Причина (необязательно), например: «Неверный идентификатор записи — сначала уточните у пользователя.»",
3288
+ },
2766
3289
  aiModelStatus: {
2767
3290
  summary: "Сборка / вопросы используют {{conversational}} ({{conversationalSource}}); структурированный вывод — {{structured}} ({{structuredSource}}).",
2768
3291
  summaryRouting: "Политика маршрутизации: бесплатные тарифы → {{free}}, платные тарифы → {{paid}}.",
@@ -2780,6 +3303,117 @@ const ru = {
2780
3303
  sourceInherits: "как у build/ask",
2781
3304
  sourcePinned: "закреплено через {{source}}",
2782
3305
  },
3306
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3307
+ // English-only until this landed while every other string on the same screen
3308
+ // was translated:
3309
+ //
3310
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3311
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3312
+ // closed registry those runtimes are conformance-tested
3313
+ // against). `humanizeToolName` looks each up as
3314
+ // `chatbot.tool.<tool_name>` and falls back to its English
3315
+ // title-caser for a custom / third-party tool, so a name
3316
+ // missing here is degraded, never broken. The `en` values
3317
+ // are deliberately EQUAL to what that title-caser produces:
3318
+ // adding the key must not silently reword the English UI.
3319
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3320
+ // set for both surfaces (they used to carry separate
3321
+ // tables and disagreed on casing).
3322
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3323
+ // FAMILIES: one slot per CLDR category the pack's language
3324
+ // selects (objectui#11432), plus the base key for a call
3325
+ // made without a count. `all-locales-key-parity.test.ts`
3326
+ // derives the required slots from `Intl.PluralRules`.
3327
+ //
3328
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3329
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3330
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3331
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3332
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3333
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3334
+ // against the registry instead of against its own hand-held list.
3335
+ chatbot: {
3336
+ tool: {
3337
+ aggregate_data: "Сводка данных",
3338
+ get_record: "Получить запись",
3339
+ query_data: "Запросить данные",
3340
+ query_records: "Запросить записи",
3341
+ search_knowledge: "Поиск по базе знаний",
3342
+ visualize_data: "Построить график",
3343
+ add_field: "Добавить поле",
3344
+ apply_blueprint: "Собрать приложение",
3345
+ apply_edit: "Применить изменения",
3346
+ create_metadata: "Создать метаданные",
3347
+ create_object: "Создать объект",
3348
+ create_package: "Создать пакет",
3349
+ create_seed: "Сгенерировать примеры данных",
3350
+ delete_field: "Удалить поле",
3351
+ describe_metadata: "Посмотреть метаданные",
3352
+ describe_object: "Посмотреть структуру объекта",
3353
+ get_active_package: "Получить активный пакет",
3354
+ get_authoring_rules: "Читать правила разработки",
3355
+ get_metadata_schema: "Получить схему метаданных",
3356
+ get_package: "Получить пакет",
3357
+ list_metadata: "Список метаданных",
3358
+ list_objects: "Список объектов",
3359
+ list_packages: "Список пакетов",
3360
+ load_tools: "Загрузить инструменты",
3361
+ modify_field: "Изменить поле",
3362
+ open_record: "Открыть запись",
3363
+ propose_blueprint: "Спроектировать приложение",
3364
+ set_active_package: "Сменить активный пакет",
3365
+ suggest_builder: "Предложить способ сборки",
3366
+ test_flow: "Проверить процесс",
3367
+ todo_write: "Записать задачи",
3368
+ toggle_flow: "Включить или выключить процесс",
3369
+ update_metadata: "Обновить метаданные",
3370
+ validate_expression: "Проверить выражение",
3371
+ verify_build: "Проверить сборку",
3372
+ },
3373
+ toolState: {
3374
+ agentActivity: "Действия агента",
3375
+ pending: "Ожидание",
3376
+ running: "Выполняется",
3377
+ awaitingApproval: "Ожидает подтверждения",
3378
+ responded: "Отвечено",
3379
+ completed: "Завершено",
3380
+ error: "Ошибка",
3381
+ denied: "Отклонено",
3382
+ failed: "Ошибка выполнения",
3383
+ },
3384
+ plan: {
3385
+ countObjects: "объектов: {{count}}",
3386
+ countObjects_one: "{{count}} объект",
3387
+ countObjects_few: "{{count}} объекта",
3388
+ countObjects_many: "{{count}} объектов",
3389
+ countObjects_other: "{{count}} объекта",
3390
+ countViews: "представлений: {{count}}",
3391
+ countViews_one: "{{count}} представление",
3392
+ countViews_few: "{{count}} представления",
3393
+ countViews_many: "{{count}} представлений",
3394
+ countViews_other: "{{count}} представления",
3395
+ countDashboards: "дашбордов: {{count}}",
3396
+ countDashboards_one: "{{count}} дашборд",
3397
+ countDashboards_few: "{{count}} дашборда",
3398
+ countDashboards_many: "{{count}} дашбордов",
3399
+ countDashboards_other: "{{count}} дашборда",
3400
+ countSeedData: "демоданные",
3401
+ },
3402
+ build: {
3403
+ building: "Создание {{app}}…",
3404
+ built: "Создание {{app}} завершено",
3405
+ appFallback: "вашего приложения",
3406
+ addingSampleData: "добавление демоданных",
3407
+ group: {
3408
+ object: "Объекты",
3409
+ view: "Представления",
3410
+ dashboard: "Дашборды",
3411
+ app: "Приложение",
3412
+ seed: "Демоданные",
3413
+ },
3414
+ moreArtifacts: "ещё {{n}}",
3415
+ },
3416
+ },
2783
3417
  chatbotError: {
2784
3418
  title: "Ошибка ответа",
2785
3419
  fallbackDetail: "Что-то пошло не так. Попробуйте ещё раз.",
@@ -2860,7 +3494,7 @@ const ru = {
2860
3494
  },
2861
3495
  title: "Маркетплейс приложений",
2862
3496
  subtitle: "Просматривайте одобренные приложения из каталога ObjectStack. Нажмите на приложение, чтобы увидеть подробности и установить его.",
2863
- searchPlaceholder: "Поиск приложений по имени или ID манифеста…",
3497
+ searchPlaceholder: 'Поиск приложений по имени или ID приложения…',
2864
3498
  searchAria: "Поиск в маркетплейсе",
2865
3499
  installed: "Установлено",
2866
3500
  installedCount: "Установлено ({{count}})",
@@ -2908,10 +3542,19 @@ const ru = {
2908
3542
  purgeSampleData: 'Удалить демоданные',
2909
3543
  purgeConfirm: 'Удалить все демонстрационные записи, созданные этим пакетом? Записи, добавленные пользователем, НЕ будут затронуты.',
2910
3544
  purgeSuccess: 'Удалено демонстрационных записей: {{count}}.',
3545
+ purgeSuccess_one: 'Удалено демонстрационных записей: {{count}}.',
3546
+ purgeSuccess_few: 'Удалено демонстрационных записей: {{count}}.',
3547
+ purgeSuccess_many: 'Удалено демонстрационных записей: {{count}}.',
3548
+ purgeSuccess_other: 'Удалено демонстрационных записей: {{count}}.',
2911
3549
  purgeNoData: 'Демонстрационные записи для удаления не найдены.',
2912
3550
  reseedQueued: 'Демоданные будут перезагружены при следующем доступе к среде.',
2913
3551
  reseedLocalSuccess: 'Демоданные перезагружены: добавлено {{inserted}}, обновлено {{updated}}.',
2914
3552
  reseedPartialErrors: '(не удалось записать записей: {{count}})',
3553
+ reseedPartialErrors_one: '(не удалось записать записей: {{count}})',
3554
+ reseedPartialErrors_few: '(не удалось записать записей: {{count}})',
3555
+ reseedPartialErrors_many: '(не удалось записать записей: {{count}})',
3556
+ reseedPartialErrors_other: '(не удалось записать записей: {{count}})',
3557
+ sampleDataKernelUnavailable: 'У этой control plane нет ядра среды, поэтому здесь нельзя перезагрузить или удалить демоданные. Выполните это действие в собственном рантайме среды.',
2915
3558
  updateAvailable: 'Доступно обновление',
2916
3559
  },
2917
3560
  action: {
@@ -2964,7 +3607,8 @@ const ru = {
2964
3607
  reviewed: "Проверено и одобрено",
2965
3608
  unreviewed: "Ещё не проверено",
2966
3609
  signed: "Подписано",
2967
- grantsIntro: "При установке пакет получит:",
3610
+ grantsIntro: "Пакет запрашивает:",
3611
+ notEnforced: "Список записывается при установке и подтверждается заново, если более поздняя версия запросит больше, но среда выполнения пока не ограничивает пакет этим списком.",
2968
3612
  services: "Сервисы платформы",
2969
3613
  hooks: "Хуки жизненного цикла",
2970
3614
  network: "Доступ к сети",
@@ -3003,30 +3647,23 @@ const ru = {
3003
3647
  storage: "Хранилище",
3004
3648
  other: "Другое",
3005
3649
  },
3006
- pricing: {
3007
- free: "Бесплатно",
3008
- freemium: "Freemium",
3009
- paid: "Платно",
3010
- subscription: "Подписка",
3011
- "usage-based": "По использованию",
3012
- "contact-sales": "Связаться с продажами",
3013
- },
3014
3650
  relativeTime: {
3015
3651
  today: "сегодня",
3016
3652
  daysAgo: "{{count}} д назад",
3017
3653
  monthsAgo: "{{count}} мес назад",
3654
+ monthsAgo_one: "{{count}} мес назад",
3655
+ monthsAgo_few: "{{count}} мес назад",
3656
+ monthsAgo_many: "{{count}} мес назад",
3657
+ monthsAgo_other: "{{count}} мес назад",
3018
3658
  yearsAgo: "{{count}} лет назад",
3659
+ yearsAgo_one: "{{count}} год назад",
3660
+ yearsAgo_few: "{{count}} года назад",
3661
+ yearsAgo_many: "{{count}} лет назад",
3662
+ yearsAgo_other: "{{count}} года назад",
3019
3663
  },
3020
3664
  },
3021
- approvals: {
3022
- approve: 'Утвердить',
3023
- reject: 'Отклонить',
3024
- comment: 'Комментарий (необязательно)',
3025
- approveSuccess: 'Утверждено',
3026
- rejectSuccess: 'Отклонено',
3027
- rejectConfirm: 'Отклонить этот запрос на согласование?',
3028
- },
3029
3665
  approvalsInbox: {
3666
+ recordUnresolvable: 'Эту запись невозможно открыть',
3030
3667
  loadMore: 'Загрузить ещё',
3031
3668
  loadingMore: 'Загрузка…',
3032
3669
  loadedOf: 'Загружено {{loaded}} из {{total}}',
@@ -3045,6 +3682,10 @@ const ru = {
3045
3682
  requestInfoSent: 'Возвращено заявителю за дополнениями',
3046
3683
  remindBtn: 'Напомнить',
3047
3684
  remindSuccess: 'Напоминание отправлено: {{count}}',
3685
+ remindSuccess_one: 'Напоминание отправлено: {{count}}',
3686
+ remindSuccess_few: 'Напоминание отправлено: {{count}}',
3687
+ remindSuccess_many: 'Напоминание отправлено: {{count}}',
3688
+ remindSuccess_other: 'Напоминание отправлено: {{count}}',
3048
3689
  remindThrottled: 'Напоминание уже отправлялось недавно — попробуйте позже.',
3049
3690
  replyPlaceholder: 'Ответить по этому запросу…',
3050
3691
  slaRemaining: 'SLA: осталось {{dur}}',
@@ -3061,6 +3702,10 @@ const ru = {
3061
3702
  progressApprovals: 'Согласования — {{got}} из {{need}}',
3062
3703
  progressGroups: 'Ход визирования — {{got}} из {{need}} групп',
3063
3704
  progressEligible: 'Доступных согласующих: {{count}}',
3705
+ progressEligible_one: 'Доступных согласующих: {{count}}',
3706
+ progressEligible_few: 'Доступных согласующих: {{count}}',
3707
+ progressEligible_many: 'Доступных согласующих: {{count}}',
3708
+ progressEligible_other: 'Доступных согласующих: {{count}}',
3064
3709
  progressBar: 'Ход решения',
3065
3710
  declaredActions: 'Действия',
3066
3711
  attachmentChip: 'Вложение',
@@ -3092,6 +3737,10 @@ const ru = {
3092
3737
  filterCount: '{{shown}} из {{total}}',
3093
3738
  selected: 'выбрано',
3094
3739
  actionableCount: '({{count}} доступно)',
3740
+ actionableCount_one: '({{count}} доступно)',
3741
+ actionableCount_few: '({{count}} доступно)',
3742
+ actionableCount_many: '({{count}} доступно)',
3743
+ actionableCount_other: '({{count}} доступно)',
3095
3744
  selectAll: 'Выбрать все',
3096
3745
  selectRow: 'Выбрать запрос',
3097
3746
  colRequest: 'Запрос',
@@ -3165,11 +3814,27 @@ const ru = {
3165
3814
  approveN: 'Согласовать {{count}}',
3166
3815
  rejectN: 'Отклонить {{count}}',
3167
3816
  bulkApproveTitle: 'Согласовать {{count}} запросов?',
3817
+ bulkApproveTitle_one: 'Согласовать {{count}} запрос?',
3818
+ bulkApproveTitle_few: 'Согласовать {{count}} запроса?',
3819
+ bulkApproveTitle_many: 'Согласовать {{count}} запросов?',
3820
+ bulkApproveTitle_other: 'Согласовать {{count}} запроса?',
3168
3821
  bulkApproveBody: 'Каждый запрос согласуется от вашего имени, и поток продолжится по ветке согласования.',
3169
3822
  bulkRejectTitle: 'Отклонить {{count}} запросов?',
3823
+ bulkRejectTitle_one: 'Отклонить {{count}} запрос?',
3824
+ bulkRejectTitle_few: 'Отклонить {{count}} запроса?',
3825
+ bulkRejectTitle_many: 'Отклонить {{count}} запросов?',
3826
+ bulkRejectTitle_other: 'Отклонить {{count}} запроса?',
3170
3827
  bulkRejectBody: 'Выбранные запросы будут отклонены, заявители получат уведомления.',
3171
3828
  bulkApproved: 'Согласовано запросов: {{count}}',
3829
+ bulkApproved_one: 'Согласовано запросов: {{count}}',
3830
+ bulkApproved_few: 'Согласовано запросов: {{count}}',
3831
+ bulkApproved_many: 'Согласовано запросов: {{count}}',
3832
+ bulkApproved_other: 'Согласовано запросов: {{count}}',
3172
3833
  bulkRejected: 'Отклонено запросов: {{count}}',
3834
+ bulkRejected_one: 'Отклонено запросов: {{count}}',
3835
+ bulkRejected_few: 'Отклонено запросов: {{count}}',
3836
+ bulkRejected_many: 'Отклонено запросов: {{count}}',
3837
+ bulkRejected_other: 'Отклонено запросов: {{count}}',
3173
3838
  bulkPartial: 'Успешно: {{ok}}, с ошибкой: {{fail}}: {{which}}',
3174
3839
  rejectOneTitle: 'Отклонить «{{title}}»?',
3175
3840
  rejectOneBody: 'Запрос будет отклонён, заявитель получит уведомление.',
@@ -3194,8 +3859,20 @@ const ru = {
3194
3859
  alreadyDecided: 'Этот запрос уже обработан. Обновите список.',
3195
3860
  justNow: 'только что',
3196
3861
  minutesAgo: '{{count}} мин назад',
3862
+ minutesAgo_one: '{{count}} мин назад',
3863
+ minutesAgo_few: '{{count}} мин назад',
3864
+ minutesAgo_many: '{{count}} мин назад',
3865
+ minutesAgo_other: '{{count}} мин назад',
3197
3866
  hoursAgo: '{{count}} ч назад',
3867
+ hoursAgo_one: '{{count}} ч назад',
3868
+ hoursAgo_few: '{{count}} ч назад',
3869
+ hoursAgo_many: '{{count}} ч назад',
3870
+ hoursAgo_other: '{{count}} ч назад',
3198
3871
  daysAgo: '{{count}} дн назад',
3872
+ daysAgo_one: '{{count}} дн назад',
3873
+ daysAgo_few: '{{count}} дн назад',
3874
+ daysAgo_many: '{{count}} дн назад',
3875
+ daysAgo_other: '{{count}} дн назад',
3199
3876
  },
3200
3877
  preview: {
3201
3878
  empty: {
@@ -3230,11 +3907,19 @@ const ru = {
3230
3907
  detailNone: 'Различий не обнаружено — черновик совпадает с опубликованной версией.',
3231
3908
  detailChangedKeys: 'Также изменено:',
3232
3909
  confirmNote: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
3910
+ confirmNote_one: 'Публикация атомарно выпускает {{count}} ожидающий черновик этого пакета.',
3911
+ confirmNote_few: 'Публикация атомарно выпускает все {{count}} ожидающих черновика этого пакета.',
3912
+ confirmNote_many: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
3913
+ confirmNote_other: 'Публикация атомарно выпускает {{count}} ожидающего черновика этого пакета.',
3233
3914
  publishConfirm: 'Опубликовать всё',
3234
- // [objectui#5418] Pre-publish security-posture findings, shown next to
3915
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3235
3916
  // the confirm button so a refusal the door would issue is read BEFORE
3236
3917
  // the click rather than as a toast after the batch rolled back.
3237
3918
  securityBlockTitle: 'Публикация будет отклонена — {{count}} элемент(ов) требуют решения',
3919
+ securityBlockTitle_one: 'Публикация будет отклонена — {{count}} элемент требует решения',
3920
+ securityBlockTitle_few: 'Публикация будет отклонена — {{count}} элемента требуют решения',
3921
+ securityBlockTitle_many: 'Публикация будет отклонена — {{count}} элементов требуют решения',
3922
+ securityBlockTitle_other: 'Публикация будет отклонена — {{count}} элемента требуют решения',
3238
3923
  securityBlockWhere: 'Исправьте это в объекте в разделе «Настройки → Общий доступ к записям» и опубликуйте снова.',
3239
3924
  },
3240
3925
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3259,7 +3944,7 @@ const ru = {
3259
3944
  revertLabel: 'Изменение отменено',
3260
3945
  applyLabel: 'Изменение сборки',
3261
3946
  revert: 'отмена',
3262
- items: 'элементов',
3947
+ items: 'Элементов: {{count}}',
3263
3948
  revertAction: 'Отменить',
3264
3949
  reverted: 'Отменено — изменение возвращено.',
3265
3950
  revertFailed: 'Не удалось отменить',
@@ -3288,25 +3973,25 @@ const ru = {
3288
3973
  rangeEnd: "До",
3289
3974
  operators: {
3290
3975
  equals: "Равно",
3291
- notEquals: "Не равно",
3976
+ not_equals: "Не равно",
3292
3977
  contains: "Содержит",
3293
- containsCaseInsensitive: "Содержит (без учёта регистра)",
3294
- notContains: "Не содержит",
3295
- isEmpty: "Пусто",
3296
- isNotEmpty: "Не пусто",
3297
- greaterThan: "Больше",
3298
- lessThan: "Меньше",
3299
- greaterOrEqual: "Больше или равно",
3300
- lessOrEqual: "Меньше или равно",
3978
+ icontains: "Содержит (без учёта регистра)",
3979
+ not_contains: "Не содержит",
3980
+ is_empty: "Пусто",
3981
+ is_not_empty: "Не пусто",
3982
+ greater_than: "Больше",
3983
+ less_than: "Меньше",
3984
+ greater_than_or_equal: "Больше или равно",
3985
+ less_than_or_equal: "Меньше или равно",
3301
3986
  before: "До",
3302
3987
  after: "После",
3303
3988
  between: "Между",
3304
3989
  in: "В списке",
3305
- notIn: "Не в списке",
3306
- startsWith: "Начинается с",
3307
- endsWith: "Заканчивается на",
3308
- isNull: "Равно null",
3309
- isNotNull: "Не равно null",
3990
+ not_in: "Не в списке",
3991
+ starts_with: "Начинается с",
3992
+ ends_with: "Заканчивается на",
3993
+ is_null: "Равно null",
3994
+ is_not_null: "Не равно null",
3310
3995
  exists: "Задано",
3311
3996
  notExists: "Не задано",
3312
3997
  },
@@ -3322,7 +4007,10 @@ const ru = {
3322
4007
  },
3323
4008
  collaboration: {
3324
4009
  commentCount: "Комментариев: {{count}}",
3325
- commentCountOne: "{{count}} комментарий",
4010
+ commentCount_one: "{{count}} комментарий",
4011
+ commentCount_few: "{{count}} комментария",
4012
+ commentCount_many: "{{count}} комментариев",
4013
+ commentCount_other: "{{count}} комментария",
3326
4014
  resolvedSuffix: " · Решено",
3327
4015
  sortComments: "Сортировка комментариев",
3328
4016
  sortOldest: "Сначала старые",
@@ -3331,11 +4019,26 @@ const ru = {
3331
4019
  reopen: "Открыть заново",
3332
4020
  justNow: "только что",
3333
4021
  minutesAgo: "{{count}} мин назад",
4022
+ minutesAgo_one: "{{count}} мин назад",
4023
+ minutesAgo_few: "{{count}} мин назад",
4024
+ minutesAgo_many: "{{count}} мин назад",
4025
+ minutesAgo_other: "{{count}} мин назад",
3334
4026
  hoursAgo: "{{count}} ч назад",
4027
+ hoursAgo_one: "{{count}} ч назад",
4028
+ hoursAgo_few: "{{count}} ч назад",
4029
+ hoursAgo_many: "{{count}} ч назад",
4030
+ hoursAgo_other: "{{count}} ч назад",
3335
4031
  daysAgo: "{{count}} д назад",
4032
+ daysAgo_one: "{{count}} д назад",
4033
+ daysAgo_few: "{{count}} д назад",
4034
+ daysAgo_many: "{{count}} д назад",
4035
+ daysAgo_other: "{{count}} д назад",
3336
4036
  edited: "(изменено)",
3337
4037
  reactionCount: "Реакций: {{count}}",
3338
- reactionCountOne: "{{count}} реакция",
4038
+ reactionCount_one: "{{count}} реакция",
4039
+ reactionCount_few: "{{count}} реакции",
4040
+ reactionCount_many: "{{count}} реакций",
4041
+ reactionCount_other: "{{count}} реакции",
3339
4042
  addThumbsUp: "Поставить лайк",
3340
4043
  reply: "Ответить",
3341
4044
  reactThumbsUp: "Отреагировать лайком",
@@ -3346,9 +4049,15 @@ const ru = {
3346
4049
  commentPlaceholder: "Добавьте комментарий… (@ — упоминание)",
3347
4050
  send: "Отправить",
3348
4051
  presentUserCount: "Присутствует пользователей: {{count}}",
3349
- presentUserCountOne: "Присутствует {{count}} пользователь",
4052
+ presentUserCount_one: "Присутствует {{count}} пользователь",
4053
+ presentUserCount_few: "Присутствуют {{count}} пользователя",
4054
+ presentUserCount_many: "Присутствует {{count}} пользователей",
4055
+ presentUserCount_other: "Присутствует {{count}} пользователя",
3350
4056
  moreUserCount: "Ещё пользователей: {{count}}",
3351
- moreUserCountOne: "Ещё {{count}} пользователь",
4057
+ moreUserCount_one: "Ещё {{count}} пользователь",
4058
+ moreUserCount_few: "Ещё {{count}} пользователя",
4059
+ moreUserCount_many: "Ещё {{count}} пользователей",
4060
+ moreUserCount_other: "Ещё {{count}} пользователя",
3352
4061
  userStatusTitle: "{{name}} ({{status}})",
3353
4062
  statusActive: "активен",
3354
4063
  statusIdle: "бездействует",
@@ -3356,6 +4065,11 @@ const ru = {
3356
4065
  },
3357
4066
  wizard: {
3358
4067
  missingRequired: "Заполните обязательные поля: {{fields}}",
4068
+ back: "Назад",
4069
+ submitting: "Отправка…",
4070
+ stepFallback: "Шаг {{n}}",
4071
+ progressLabel: "Прогресс",
4072
+ emptyStep: "Для этого шага не настроены поля",
3359
4073
  },
3360
4074
  flowRunner: {
3361
4075
  title: 'Ввод',
@@ -3413,5 +4127,49 @@ const ru = {
3413
4127
  bulkOperationFailed: "Массовая операция не выполнена: {{reason}}",
3414
4128
  },
3415
4129
  },
4130
+ // objectui#6301 — Настройка › Автоматизация из пакетов (ADR-0126 §7.4).
4131
+ // Терминология пакета: `common.package` = Пакет, `flowRunner.completed` =
4132
+ // Поток, кавычки «…». ⛔ Никаких формулировок о происхождении или
4133
+ // расхождении в этой группе (§9).
4134
+ packagedAutomation: {
4135
+ title: "Автоматизация из пакетов",
4136
+ subtitle: "Потоки и действия, поставляемые установленными пакетами. Отключите любой из них в этой установке или клонируйте поток под новым именем, чтобы настроить. Редактирование — в Studio.",
4137
+ refresh: "Обновить",
4138
+ flowsHeading: "Потоки из пакетов",
4139
+ actionsHeading: "Действия из пакетов",
4140
+ colFlow: "Поток",
4141
+ colActivation: "Активация",
4142
+ colActions: "Действия",
4143
+ toggleLabel: "Активация для {{label}}",
4144
+ on: "Вкл.",
4145
+ off: "Выкл.",
4146
+ clone: "Клонировать",
4147
+ cloneTitle: "Клонировать поток из пакета",
4148
+ cloneBody: "Копия сохраняет определение целиком и требует нового машинного имени и метки. Редактируйте копию в Studio.",
4149
+ cloneName: "Новое машинное имя",
4150
+ cloneLabel: "Новая метка",
4151
+ cancel: "Отмена",
4152
+ cloneConfirm: "Создать клон",
4153
+ cloneCreated: "Поток «{{name}}» создан.",
4154
+ emptyTitle: "Нет потоков из пакетов",
4155
+ emptyBody: "В этой установке ни один установленный пакет не поставляет поток автоматизации. Потоки, которые вы создаёте сами, находятся в Studio.",
4156
+ loadFailed: "Не удалось загрузить автоматизацию из пакетов.",
4157
+ toggleFailedHttp: "Не удалось изменить активацию (HTTP {{status}}).",
4158
+ toggleFailed: "Не удалось изменить активацию.",
4159
+ cloneFailedHttp: "Не удалось клонировать этот поток (HTTP {{status}}).",
4160
+ cloneFailed: "Не удалось клонировать этот поток.",
4161
+ actionsSubtitle: "Действия, поставляемые установленными пакетами. Отключите действие в этой установке — и оно перестанет выполняться везде, где предлагается. Создать рядом собственное действие по-прежнему можно в Studio.",
4162
+ colAction: "Действие",
4163
+ colObject: "Объект",
4164
+ actionToggleLabel: "Активация для {{label}} на {{object}}",
4165
+ actionsEmptyTitle: "Нет действий из пакетов",
4166
+ actionsEmptyBody: "В этой установке ни один установленный пакет не объявляет действие. Действия, которые вы создаёте сами, находятся в Studio.",
4167
+ actionsLoadFailed: "Не удалось загрузить действия из пакетов.",
4168
+ },
4169
+ element: {
4170
+ number: {
4171
+ noObject: "Объект не указан: задайте object или dataSource.object.",
4172
+ },
4173
+ },
3416
4174
  };
3417
4175
  export default ru;