@object-ui/i18n 17.5.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 (58) hide show
  1. package/CHANGELOG.md +4954 -0
  2. package/README.md +234 -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 +28 -2
  10. package/dist/i18n.js +99 -17
  11. package/dist/index.d.ts +17 -23
  12. package/dist/index.js +51 -27
  13. package/dist/locales/ar.d.ts +1113 -370
  14. package/dist/locales/ar.js +1276 -428
  15. package/dist/locales/de.d.ts +785 -370
  16. package/dist/locales/de.js +896 -401
  17. package/dist/locales/en.d.ts +800 -385
  18. package/dist/locales/en.js +1261 -419
  19. package/dist/locales/es.d.ts +867 -370
  20. package/dist/locales/es.js +976 -398
  21. package/dist/locales/fr.d.ts +867 -370
  22. package/dist/locales/fr.js +976 -399
  23. package/dist/locales/index.d.ts +8682 -3761
  24. package/dist/locales/index.js +68 -29
  25. package/dist/locales/ja.d.ts +785 -370
  26. package/dist/locales/ja.js +891 -395
  27. package/dist/locales/ko.d.ts +785 -370
  28. package/dist/locales/ko.js +893 -399
  29. package/dist/locales/pt.d.ts +867 -370
  30. package/dist/locales/pt.js +975 -397
  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 +949 -370
  36. package/dist/locales/ru.js +1093 -419
  37. package/dist/locales/zh.d.ts +803 -388
  38. package/dist/locales/zh.js +899 -388
  39. package/dist/pickLocalized.d.ts +67 -0
  40. package/dist/pickLocalized.js +114 -0
  41. package/dist/provider.d.ts +102 -13
  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 +13 -2
  47. package/dist/useObjectLabel.d.ts +118 -22
  48. package/dist/useObjectLabel.js +148 -23
  49. package/dist/useSafeTranslation.js +41 -43
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/index.d.ts +4 -4
  53. package/dist/utils/index.js +4 -4
  54. package/dist/utils/spec-formatters.d.ts +13 -23
  55. package/dist/utils/spec-formatters.js +41 -2
  56. package/dist/utils/spec-translations.d.ts +16 -3
  57. package/dist/utils/spec-translations.js +52 -13
  58. 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: 'Очистить',
@@ -88,6 +104,7 @@ const ru = {
88
104
  removeFromFavorites: "Удалить из избранного",
89
105
  loading: "Загрузка…",
90
106
  save: "Сохранить",
107
+ discard: "Отменить",
91
108
  cancel: "Отмена",
92
109
  delete: "Удалить",
93
110
  edit: "Редактировать",
@@ -120,8 +137,14 @@ const ru = {
120
137
  closeChat: "Закрыть чат",
121
138
  closePanel: "Закрыть панель",
122
139
  resizeDrawer: "Изменить ширину панели",
123
- itemCount: "{{count}} элементов",
124
- 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}} элемента",
125
148
  toggleSidebar: "Переключить боковую панель",
126
149
  package: "Пакет",
127
150
  done: "Готово",
@@ -129,6 +152,16 @@ const ru = {
129
152
  record: "Запись",
130
153
  retry: "Повторить",
131
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}} записей. Сузьте фильтр.",
132
165
  },
133
166
  actions: {
134
167
  decisionOutput: {
@@ -140,6 +173,14 @@ const ru = {
140
173
  acknowledge: 'Я сохранил(а) это',
141
174
  copyAll: 'Копировать всё',
142
175
  },
176
+ notAvailableHere: '«{{action}}» недоступно на текущей странице.',
177
+ completedSuccessfully: 'Действие успешно выполнено',
178
+ failed: 'Действие не выполнено',
179
+ parallelFailed: 'Одно или несколько параллельных действий не выполнены',
180
+ undo: 'Отменить',
181
+ undone: 'Изменение отменено',
182
+ undoneOperation: 'Отменить: {{description}}',
183
+ redoneOperation: 'Повторить: {{description}}',
143
184
  },
144
185
  validation: {
145
186
  required: "Поле {{field}} обязательно для заполнения",
@@ -157,19 +198,45 @@ const ru = {
157
198
  },
158
199
  form: {
159
200
  noPermissionToSave: "У вас нет прав на сохранение этой записи.",
201
+ noPermissionToCreate: "У вас нет прав на создание записей «{{object}}». Поля доступны только для чтения.",
202
+ noPermissionToEdit: "У вас нет прав на редактирование записей «{{object}}». Поля доступны только для чтения.",
160
203
  submitFailed: "Не удалось сохранить. Попробуйте ещё раз.",
204
+ uploadInFlight: "Дождитесь завершения загрузки, прежде чем сохранять.",
205
+ clearedOnHide: "Очищено то, что больше не применимо к текущим значениям: {{fields}}",
206
+ visibleWhenFaulted: "Невозможно отправить: не удалось вычислить правило visibleWhen для {{fields}}. Правило нужно исправить, прежде чем эту форму можно будет отправить.",
161
207
  discardTitle: "Отменить изменения?",
162
208
  discardMessage: "Есть несохранённые изменения. Если закрыть форму сейчас, правки будут потеряны.",
163
209
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
164
210
  // description, used when the form declares no `description` of its own.
165
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
+ },
166
234
  keepEditing: "Продолжить редактирование",
167
235
  discard: "Отменить",
168
236
  conflictTitle: "Конфликт сохранения",
169
237
  conflictMessage: "Пока вы редактировали, эту запись изменил другой пользователь. Перезапись заменит его изменения вашими.",
170
238
  conflictLatestVersion: "Его сохранение: {{time}}",
171
239
  conflictOverwrite: "Перезаписать",
172
- addItem: "Добавить элемент",
173
240
  removeItem: "Удалить элемент",
174
241
  fieldRequired: "Это поле обязательно",
175
242
  invalidFormat: "Неверный формат",
@@ -187,6 +254,12 @@ const ru = {
187
254
  createSuccess: "{{object}} создан",
188
255
  updateSuccess: "{{object}} обновлён",
189
256
  deleteSuccess: "{{object}} удалён",
257
+ created: "Создано",
258
+ saved: "Сохранено",
259
+ savedNamed: "{{title}} сохранён",
260
+ submitted: "Отправлено",
261
+ errorLoading: "Ошибка загрузки формы",
262
+ navigateRefused: "Цель `navigateOnSuccess`, объявленная для этой формы, была отклонена, поэтому переход не выполнен.",
190
263
  fullscreen: {
191
264
  title: "Изменить текст",
192
265
  description: "Измените полное текстовое значение, затем сохраните или отмените изменения.",
@@ -211,6 +284,10 @@ const ru = {
211
284
  },
212
285
  relativeDate: {
213
286
  overdue: "Просрочено на {{count}} дн.",
287
+ overdue_one: "Просрочено на {{count}} дн.",
288
+ overdue_few: "Просрочено на {{count}} дн.",
289
+ overdue_many: "Просрочено на {{count}} дн.",
290
+ overdue_other: "Просрочено на {{count}} дн.",
214
291
  },
215
292
  file: {
216
293
  dragDropHere: 'Перетащите файлы сюда',
@@ -227,6 +304,7 @@ const ru = {
227
304
  remove: 'Удалить {{name}}',
228
305
  exceedsMaxSize: '«{{name}}» превышает максимальный размер ({{max}} МБ)',
229
306
  uploadFailed: 'Не удалось загрузить «{{name}}»: {{error}}',
307
+ uploadIncomplete: 'Загрузка «{{name}}» не завершена: идентификатор файла не получен, ничего не сохранено',
230
308
  },
231
309
  richText: {
232
310
  format: "Формат: {{format}}",
@@ -254,6 +332,9 @@ const ru = {
254
332
  selectBusinessUnit: "Выберите бизнес-подразделение",
255
333
  selectPosition: "Выберите должность",
256
334
  selectUnitAndSubordinates: "Выберите бизнес-подразделение",
335
+ selectField: "Выберите поле пользователя",
336
+ noUserFields: "В этом объекте нет полей пользователя",
337
+ fieldNotUserTyped: "{{name}} — не поле пользователя",
257
338
  },
258
339
  filterCondition: {
259
340
  selectObjectFirst: "Сначала выберите объект.",
@@ -264,13 +345,51 @@ const ru = {
264
345
  editAsJson: "Редактировать как JSON",
265
346
  useVisualBuilder: "Использовать визуальный конструктор",
266
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
+ },
267
368
  tags: {
268
369
  placeholder: "Введите и нажмите Enter, чтобы добавить…",
269
370
  },
371
+ // objectui#4028 — `AddressField`'s five sub-labels.
372
+ address: {
373
+ street: "Улица и дом",
374
+ city: "Город",
375
+ state: "Область / штат",
376
+ postalCode: "Почтовый индекс",
377
+ country: "Страна",
378
+ },
270
379
  textarea: {
271
380
  characterCount: "Количество символов: {{count}} из {{max}}",
272
381
  charactersRemaining: "Осталось символов: {{count}}",
273
382
  },
383
+ grid: {
384
+ addLine: "Добавить строку",
385
+ noItems: "Нет элементов",
386
+ noItemsAddHint: "Пока нет элементов — нажмите «{{label}}», чтобы начать.",
387
+ optionalColumns: "Дополнительные столбцы",
388
+ computed: "Вычисляется",
389
+ openRow: "Открыть строку",
390
+ duplicateRow: "Дублировать строку",
391
+ removeRow: "Удалить строку",
392
+ },
274
393
  },
275
394
  table: {
276
395
  rowsPerPage: "Строк на странице",
@@ -299,23 +418,47 @@ const ru = {
299
418
  open: "Открыть",
300
419
  search: "Поиск…",
301
420
  modified: "{{count}} строк изменено",
421
+ modified_one: "Изменена {{count}} строка",
422
+ modified_few: "Изменено {{count}} строки",
423
+ modified_many: "Изменено {{count}} строк",
424
+ modified_other: "Изменено {{count}} строки",
302
425
  saveFailed: 'Не удалось сохранить',
303
426
  selected: "{{count}} выбрано",
427
+ selected_one: "Выбрано: {{count}}",
428
+ selected_few: "Выбрано: {{count}}",
429
+ selected_many: "Выбрано: {{count}}",
430
+ selected_other: "Выбрано: {{count}}",
304
431
  edit: "Редактировать",
305
432
  delete: "Удалить",
306
433
  },
307
434
  grid: {
308
435
  bulkSelected: "Выбрано: {{count}}",
436
+ bulkSelected_one: "Выбрано: {{count}}",
437
+ bulkSelected_few: "Выбрано: {{count}}",
438
+ bulkSelected_many: "Выбрано: {{count}}",
439
+ bulkSelected_other: "Выбрано: {{count}}",
309
440
  bulkSelectedAllMatches: "Выбрано: {{count}} (все совпадения)",
310
441
  bulkClear: "Снять выделение",
311
442
  bulkAllOnPage: "Выбраны все {{count}} на этой странице.",
443
+ bulkAllOnPage_one: "Выбраны все записи на этой странице ({{count}}).",
444
+ bulkAllOnPage_few: "Выбраны все записи на этой странице ({{count}}).",
445
+ bulkAllOnPage_many: "Выбраны все записи на этой странице ({{count}}).",
446
+ bulkAllOnPage_other: "Выбраны все записи на этой странице ({{count}}).",
312
447
  bulkSelectAllMatching: "Выбрать все совпадения ({{count}})",
313
448
  bulkAllMatchingSelected: "Выбраны все подходящие записи ({{count}}).",
314
449
  bulk: {
315
450
  confirmDefault: "Будет применено к записям: {{count}}.",
451
+ confirmDefault_one: "Будет применено к записям: {{count}}.",
452
+ confirmDefault_few: "Будет применено к записям: {{count}}.",
453
+ confirmDefault_many: "Будет применено к записям: {{count}}.",
454
+ confirmDefault_other: "Будет применено к записям: {{count}}.",
316
455
  overLimit: "Выбрано ({{count}}) больше лимита действия ({{limit}}). Уменьшите выбор, чтобы продолжить.",
317
456
  affectedRecords: "Затрагиваемые записи ({{count}}):",
318
457
  skippedIneligible: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
458
+ skippedIneligible_one: '{{count}} из выбранных записей не подходит для этого действия и будет пропущена.',
459
+ skippedIneligible_few: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
460
+ skippedIneligible_many: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
461
+ skippedIneligible_other: '{{count}} из выбранных записей не подходят для этого действия и будут пропущены.',
319
462
  rowFallback: "Строка {{index}}",
320
463
  andMore: "… и ещё {{count}}",
321
464
  processed: "Обработано {{count}} / {{total}}",
@@ -333,7 +476,6 @@ const ru = {
333
476
  undo: "Отменить",
334
477
  undoing: "Отмена…",
335
478
  done: "Готово",
336
- selectPlaceholder: "Выберите…",
337
479
  loading: "Загрузка…",
338
480
  },
339
481
  actions: "Действия",
@@ -352,6 +494,14 @@ const ru = {
352
494
  yes: "Да",
353
495
  no: "Нет",
354
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
+ },
355
505
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
356
506
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
357
507
  // pack controls its own separator and word order.
@@ -378,10 +528,16 @@ const ru = {
378
528
  },
379
529
  import: {
380
530
  downloadTemplate: "Скачать шаблон",
381
- downloadTemplateHint: "Получите CSV с нужными столбцами (обязательные поля отмечены *).",
531
+ downloadTemplateHint: "Получите файл Excel со столбцами, которые можно импортировать (обязательные поля отмечены *), и инструкцией по заполнению.",
382
532
  templateFileName: "{{object}}-import-template",
533
+ templateDownloadFailed: "Не удалось скачать шаблон. Повторите попытку.",
534
+ templateNotPermitted: "У вас нет прав на создание записей этого объекта, поэтому шаблон импорта недоступен.",
383
535
  autoMatched: "Сопоставлено автоматически",
384
536
  autoMatchedSummary: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
537
+ autoMatchedSummary_one: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
538
+ autoMatchedSummary_few: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
539
+ autoMatchedSummary_many: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
540
+ autoMatchedSummary_other: "Автоматически сопоставлено столбцов: {{count}} — проверьте и скорректируйте ниже.",
385
541
  confidence: {
386
542
  high: "Высокая точность",
387
543
  medium: "Средняя точность",
@@ -394,8 +550,20 @@ const ru = {
394
550
  cancelImport: "Отменить импорт",
395
551
  importCancelled: "Импорт отменён",
396
552
  resultsTruncated: "Показаны результаты первых {{count}} строк (из {{total}}).",
553
+ resultsTruncated_one: "Показаны результаты первых строк: {{count}} (из {{total}}).",
554
+ resultsTruncated_few: "Показаны результаты первых строк: {{count}} (из {{total}}).",
555
+ resultsTruncated_many: "Показаны результаты первых строк: {{count}} (из {{total}}).",
556
+ resultsTruncated_other: "Показаны результаты первых строк: {{count}} (из {{total}}).",
397
557
  createdCount: "Создано: {{count}}",
558
+ createdCount_one: "Создано: {{count}}",
559
+ createdCount_few: "Создано: {{count}}",
560
+ createdCount_many: "Создано: {{count}}",
561
+ createdCount_other: "Создано: {{count}}",
398
562
  updatedCount: "Обновлено: {{count}}",
563
+ updatedCount_one: "Обновлено: {{count}}",
564
+ updatedCount_few: "Обновлено: {{count}}",
565
+ updatedCount_many: "Обновлено: {{count}}",
566
+ updatedCount_other: "Обновлено: {{count}}",
399
567
  downloadFailed: "Скачать строки с ошибками",
400
568
  options: "Параметры импорта",
401
569
  writeMode: "Если строка совпадает с существующей записью",
@@ -443,6 +611,10 @@ const ru = {
443
611
  historyColResult: "Результат",
444
612
  historyColTime: "Когда",
445
613
  errorCount: "Ошибок: {{count}}",
614
+ errorCount_one: "Ошибок: {{count}}",
615
+ errorCount_few: "Ошибок: {{count}}",
616
+ errorCount_many: "Ошибок: {{count}}",
617
+ errorCount_other: "Ошибок: {{count}}",
446
618
  undoImport: "Отменить импорт",
447
619
  undoing: "Отмена…",
448
620
  undoConfirm: "Отменить этот импорт? Созданные им записи будут удалены, а обновлённые — восстановлены к прежним значениям.",
@@ -503,7 +675,15 @@ const ru = {
503
675
  mapped: "Сопоставлено",
504
676
  skipped: "Пропущено",
505
677
  rowsWithErrors: "{{count}} строк с ошибками",
678
+ rowsWithErrors_one: "{{count}} строка с ошибками",
679
+ rowsWithErrors_few: "{{count}} строки с ошибками",
680
+ rowsWithErrors_many: "{{count}} строк с ошибками",
681
+ rowsWithErrors_other: "{{count}} строки с ошибками",
506
682
  rowsCorrected: "{{count}} строк исправлено",
683
+ rowsCorrected_one: "Исправлена {{count}} строка",
684
+ rowsCorrected_few: "Исправлено {{count}} строки",
685
+ rowsCorrected_many: "Исправлено {{count}} строк",
686
+ rowsCorrected_other: "Исправлено {{count}} строки",
507
687
  clickToFix: "— нажмите на выделенную ячейку для редактирования.",
508
688
  showingRows: "Отображено {{shown}} из {{total}} строк",
509
689
  importing: "Импорт… {{progress}}%",
@@ -511,11 +691,19 @@ const ru = {
511
691
  imported: "{{count}} импортировано",
512
692
  skippedCount: "{{count}} пропущено",
513
693
  moreErrors: "…ещё {{count}} ошибок",
694
+ moreErrors_one: "…ещё {{count}} ошибка",
695
+ moreErrors_few: "…ещё {{count}} ошибки",
696
+ moreErrors_many: "…ещё {{count}} ошибок",
697
+ moreErrors_other: "…ещё {{count}} ошибки",
514
698
  cancel: "Отмена",
515
699
  back: "Назад",
516
700
  next: "Далее",
517
701
  close: "Закрыть",
518
702
  importNRows: "Импортировать {{count}} строк",
703
+ importNRows_one: "Импортировать {{count}} строку",
704
+ importNRows_few: "Импортировать {{count}} строки",
705
+ importNRows_many: "Импортировать {{count}} строк",
706
+ importNRows_other: "Импортировать {{count}} строки",
519
707
  importingProgress: "Импортируется…",
520
708
  requiredMark: "*",
521
709
  required: "Обязательно",
@@ -527,11 +715,39 @@ const ru = {
527
715
  month: "Месяц",
528
716
  week: "Неделя",
529
717
  day: "День",
530
- agenda: "Расписание",
531
718
  allDay: "Весь день",
532
- noEvents: "Нет событий",
533
719
  newEvent: "Новое событие",
534
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
+ },
535
751
  },
536
752
  list: {
537
753
  firstRunTitle: "Здесь пока пусто",
@@ -573,8 +789,14 @@ const ru = {
573
789
  },
574
790
  refresh: "Обновить",
575
791
  loading: "Загрузка записей…",
576
- recordCount: "{{count}} записей",
577
- 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}} записи",
578
800
  addRecord: "Добавить запись",
579
801
  tabs: "Вкладки",
580
802
  allRecords: "Все записи",
@@ -606,7 +828,7 @@ const ru = {
606
828
  hideFieldsTitle: "Скрыть поля",
607
829
  dataLimitReached: "Отображаются первые {{limit}} записей. Возможно, есть ещё данные.",
608
830
  viewSettings: "Настройки представления",
609
- viewSettingsHint: "Группировка, цвет, плотность и отображаемые поля.",
831
+ viewSettingsHint: "Группировка, цвет, плотность и отображаемые поля. Применяется ко всем пользователям этого представления.",
610
832
  addGroup: "Добавить поле группировки",
611
833
  collapsedByDefault: "Свёрнуто по умолчанию",
612
834
  removeGroup: "Удалить",
@@ -671,6 +893,17 @@ const ru = {
671
893
  },
672
894
  gantt: {
673
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}}. Первое — написание из спецификации, остальные — устаревшие псевдонимы.",
674
907
  },
675
908
  },
676
909
  gantt: {
@@ -688,6 +921,7 @@ const ru = {
688
921
  },
689
922
  aria: {
690
923
  taskList: "Список задач",
924
+ refreshing: "Обновление…",
691
925
  },
692
926
  tooltip: {
693
927
  days: "дн",
@@ -733,13 +967,25 @@ const ru = {
733
967
  conflict: {
734
968
  title: "Конфликт расписания",
735
969
  body: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
970
+ body_one: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
971
+ body_few: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
972
+ body_many: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
973
+ body_other: "Это перемещение противоречит ограничениям зависимостей. Автоматически перепланировать затронутые задачи ({{count}})?",
736
974
  confirm: "Перепланировать автоматически",
737
975
  cancel: "Оставить как есть",
738
976
  },
739
977
  autoScheduleDlg: {
740
978
  title: "Автопланирование",
741
979
  body: "Сдвинуть {{count}} задач(и) на более поздний срок, чтобы соблюсти связи зависимостей?",
980
+ body_one: "Сдвинуть {{count}} задачу на более поздний срок, чтобы соблюсти связи зависимостей?",
981
+ body_few: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
982
+ body_many: "Сдвинуть {{count}} задач на более поздний срок, чтобы соблюсти связи зависимостей?",
983
+ body_other: "Сдвинуть {{count}} задачи на более поздний срок, чтобы соблюсти связи зависимостей?",
742
984
  skipped: "{{count}} заблокированных задач(и) также нарушают связи и были пропущены.",
985
+ skipped_one: "{{count}} заблокированная задача также нарушает связи и была пропущена.",
986
+ skipped_few: "{{count}} заблокированные задачи также нарушают связи и были пропущены.",
987
+ skipped_many: "{{count}} заблокированных задач также нарушают связи и были пропущены.",
988
+ skipped_other: "{{count}} заблокированной задачи также нарушают связи и были пропущены.",
743
989
  confirm: "Применить",
744
990
  cancel: "Отмена",
745
991
  none: "Все зависимости соблюдены — перепланировать нечего.",
@@ -818,6 +1064,7 @@ const ru = {
818
1064
  tabActionsFor: "Действия с представлением {{name}}",
819
1065
  readonlyAriaLabel: "Представление только для чтения",
820
1066
  readonlyTooltip: "Системное представление — определено в коде, только для чтения.",
1067
+ malformedFilter: "Фильтр этого представления некорректен, поэтому записи не отображаются: условие {{subject}} невозможно применить.",
821
1068
  },
822
1069
  designer: {
823
1070
  undo: "Отменить",
@@ -844,8 +1091,14 @@ const ru = {
844
1091
  addReaction: "Добавить реакцию",
845
1092
  pageHeaderActions: "Действия в заголовке страницы",
846
1093
  emojiPicker: "Выбор эмодзи",
847
- reactionCount: "{{emoji}} {{count}} реакций",
848
- 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}} реакции",
849
1102
  recordDetail: "Сведения о записи",
850
1103
  recordDetailWithLabel: "Сведения: {{label}}",
851
1104
  openAsFullPage: "Открыть на всю страницу",
@@ -872,7 +1125,6 @@ const ru = {
872
1125
  viewAll: "Показать все",
873
1126
  new: "Создать",
874
1127
  add: "Добавить",
875
- emptyValue: "—",
876
1128
  activity: "Активность",
877
1129
  editRow: "Редактировать",
878
1130
  deleteRow: "Удалить",
@@ -884,6 +1136,7 @@ const ru = {
884
1136
  sortBy: "Сортировать по",
885
1137
  filterPlaceholder: "Фильтр…",
886
1138
  highlightFields: "Ключевые поля",
1139
+ highlightsLabel: "Ключевые поля записи",
887
1140
  comments: "Комментарии",
888
1141
  searchComments: "Поиск комментариев…",
889
1142
  addCommentPlaceholder: "Добавить комментарий… (Ctrl+Enter для отправки)",
@@ -894,11 +1147,26 @@ const ru = {
894
1147
  unpin: "Открепить",
895
1148
  justNow: "только что",
896
1149
  minutesAgo: "{{count}} мин. назад",
1150
+ minutesAgo_one: "{{count}} мин. назад",
1151
+ minutesAgo_few: "{{count}} мин. назад",
1152
+ minutesAgo_many: "{{count}} мин. назад",
1153
+ minutesAgo_other: "{{count}} мин. назад",
897
1154
  hoursAgo: "{{count}} ч. назад",
1155
+ hoursAgo_one: "{{count}} ч. назад",
1156
+ hoursAgo_few: "{{count}} ч. назад",
1157
+ hoursAgo_many: "{{count}} ч. назад",
1158
+ hoursAgo_other: "{{count}} ч. назад",
898
1159
  daysAgo: "{{count}} дн. назад",
1160
+ daysAgo_one: "{{count}} дн. назад",
1161
+ daysAgo_few: "{{count}} дн. назад",
1162
+ daysAgo_many: "{{count}} дн. назад",
1163
+ daysAgo_other: "{{count}} дн. назад",
899
1164
  dropFilesToUpload: "Перетащите файлы сюда или нажмите для загрузки",
900
1165
  attachmentCount: "{{count}} вложение",
901
- attachmentCountPlural: "{{count}} вложений",
1166
+ attachmentCount_one: "{{count}} вложение",
1167
+ attachmentCount_few: "{{count}} вложения",
1168
+ attachmentCount_many: "{{count}} вложений",
1169
+ attachmentCount_other: "{{count}} вложения",
902
1170
  removeAttachment: "Удалить вложение",
903
1171
  // Record Attachments panel (enable.files, objectstack#4358)
904
1172
  attachments: "Вложения",
@@ -912,11 +1180,10 @@ const ru = {
912
1180
  attachmentDownloadDenied: "У вас нет доступа для скачивания этого вложения.",
913
1181
  attachmentAuthRequired: "Войдите в систему, чтобы скачать это вложение.",
914
1182
  attachmentPermissionDenied: "У вас нет разрешения на это действие.",
915
- unifiedDiff: "Единое представление",
916
- sideBySideDiff: "Параллельное представление",
917
- noChanges: "Нет изменений",
918
- previousVersion: "Предыдущая",
919
- currentVersion: "Текущая",
1183
+ attachmentsAccessDenied: "У вас нет доступа к этим вложениям.",
1184
+ attachmentsLoadFailed: "Не удалось загрузить вложения этой записи.",
1185
+ attachmentsApiUnavailable: "Список вложений недоступен для этого объекта.",
1186
+ retryLoadAttachments: "Повторить",
920
1187
  discussion: "Обсуждение",
921
1188
  showDiscussion: "Показать обсуждение ({{count}})",
922
1189
  hideDiscussion: "Скрыть обсуждение",
@@ -931,25 +1198,37 @@ const ru = {
931
1198
  writeComment: "Написать комментарий…",
932
1199
  subscribedTooltip: "Подписаны — нажмите для отписки",
933
1200
  unsubscribedTooltip: "Подписаться на уведомления",
934
- firstRecord: "Первая запись (Home)",
935
- previousRecordKey: "Предыдущая запись (←)",
936
- nextRecordKey: "Следующая запись (→)",
937
- lastRecord: "Последняя запись (End)",
938
1201
  noRecords: "Нет записей",
939
- searchWhileNavigating: "Поиск при навигации",
940
- searchRecords: "Поиск записей…",
941
1202
  allActivity: "Вся активность",
942
1203
  commentsOnly: "Только комментарии",
943
1204
  fieldChangesFilter: "Изменения полей",
944
1205
  tasksOnly: "Только задачи",
945
1206
  leaveCommentPlaceholder: "Оставить комментарий… (Ctrl+Enter для отправки)",
946
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: 'Обновил запись',
947
1223
  loadMore: "Загрузить ещё",
948
1224
  edited: "(изменено)",
949
1225
  via: "через {{source}}",
950
1226
  viewSource: "Показать источник",
951
1227
  replyCount: "{{count}} ответ",
952
- replyCountPlural: "{{count}} ответов",
1228
+ replyCount_one: "{{count}} ответ",
1229
+ replyCount_few: "{{count}} ответа",
1230
+ replyCount_many: "{{count}} ответов",
1231
+ replyCount_other: "{{count}} ответа",
953
1232
  replyPlaceholder: "Ответить…",
954
1233
  filterActivity: "Фильтр активности",
955
1234
  openDiscussion: "Открыть панель обсуждения",
@@ -963,6 +1242,9 @@ const ru = {
963
1242
  writeStrippedTitle: "Сохранено, но часть полей не применена",
964
1243
  writeStrippedReadonly: "Поля только для чтения, поэтому не применены: {{fields}}",
965
1244
  writeStrippedByState: "Поля недоступны для редактирования в текущем состоянии записи, поэтому не применены: {{fields}}",
1245
+ writeStrippedPrimaryKey: "Идентификатор записи нельзя изменить при сохранении, поэтому поля не применены: {{fields}}",
1246
+ writeStrippedComputed: "Поля вычисляются сервером по формуле, поэтому отправленные значения не применены: {{fields}}",
1247
+ writeStrippedUnknownReason: "Не применены сервером: {{fields}}",
966
1248
  approvalPendingEditable: "На согласовании · редактирование доступно",
967
1249
  approvalPendingTooltip: "У этой записи есть ожидающий запрос на согласование, но этот шаг всё ещё разрешает редактирование",
968
1250
  approvalProgress: "Согласования — {{got}} из {{need}}",
@@ -975,7 +1257,16 @@ const ru = {
975
1257
  cancelApprovalTooltipUnlocked: "Отменить ожидающий запрос на согласование",
976
1258
  cancelApprovalFailed: "Не удалось отменить согласование",
977
1259
  cancelApprovalUnavailable: "Отмена согласований не поддерживается этим источником данных",
1260
+ pathLabel: 'Путь записи',
1261
+ pathStageCompleted: '{{stage}}, завершён',
1262
+ pathStageCurrent: '{{stage}}, текущий этап',
1263
+ pathStageUpcoming: '{{stage}}, предстоит',
1264
+ pathStageLostCurrent: '{{stage}}, проигран, текущий этап',
1265
+ pathStageLostUpcoming: '{{stage}}, проигран, не достигнут',
1266
+ pathStageWonUpcoming: '{{stage}}, целевой этап, не достигнут',
978
1267
  linkCopied: "Ссылка скопирована в буфер обмена",
1268
+ commentFailed: "Комментарий не опубликован. Ничего не сохранено — попробуйте ещё раз.",
1269
+ reactionFailed: "Реакция не сохранена. Попробуйте ещё раз.",
979
1270
  linkCopyFailed: "Не удалось скопировать ссылку",
980
1271
  cancel: "Отмена",
981
1272
  cancelEdit: "Отменить изменения",
@@ -996,99 +1287,70 @@ const ru = {
996
1287
  deleteRowTitle: "Удалить запись",
997
1288
  createdBy: "Создано",
998
1289
  updatedBy: "Обновлено",
999
- // objectui#3863 — base key, and in ru this is the slot users actually hit: `few`
1000
- // (2-4) and `many` (5-20, 25-30, …) are unenumerated, so before this key those
1001
- // counts rendered ENGLISH. The value therefore cannot agree with the numeral —
1002
- // it uses the «Существительное: {{count}}» form this pack already writes 22 times
1003
- // (lookup.recordCount `Записей: {{count}}`, notifications.groupCount), which is
1004
- // 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.
1005
1295
  showEmptyRelated: "+ Пустых: {{count}}",
1006
1296
  showEmptyRelated_one: "+ {{count}} пустое",
1007
- showEmptyRelated_other: "+ {{count}} пустых",
1297
+ showEmptyRelated_few: "+ {{count}} пустых",
1298
+ showEmptyRelated_many: "+ {{count}} пустых",
1299
+ showEmptyRelated_other: "+ {{count}} пустого",
1008
1300
  copyEmail: "Копировать email",
1009
1301
  copyPhone: "Копировать телефон",
1010
1302
  copyRecordId: "Копировать ID записи",
1011
1303
  showEmptyFields: "Показать {{count}} пустых полей",
1304
+ showEmptyFields_one: "Показать {{count}} пустое поле",
1305
+ showEmptyFields_few: "Показать {{count}} пустых поля",
1306
+ showEmptyFields_many: "Показать {{count}} пустых полей",
1307
+ showEmptyFields_other: "Показать {{count}} пустого поля",
1012
1308
  hideEmptyFields: "Скрыть пустые поля",
1013
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}} файла",
1014
1322
  },
1015
1323
  chart: {
1016
- noData: "Нет данных для графика",
1017
1324
  loading: "Загрузка графика…",
1325
+ refreshing: "Обновление…",
1018
1326
  nullCategory: "(Не указано)",
1019
- },
1020
- map: {
1021
- searchLocations: "Поиск местоположений…",
1022
- locationDetails: "Детали местоположения",
1023
- markersCount: "{{count}} маркеров",
1024
- invalidCoordinates: "{{count}} запись с отсутствующими или недействительными координатами исключена из карты.",
1025
- invalidCoordinatesPlural: "{{count}} записей с отсутствующими или недействительными координатами исключены из карты.",
1026
- },
1027
- workflow: {
1028
- draft: "Черновик",
1029
- active: "Активный",
1030
- paused: "Приостановлен",
1031
- completed: "Завершён",
1032
- cancelled: "Отменён",
1033
- save: "Сохранить",
1034
- publish: "Опубликовать",
1035
- addNode: "Добавить узел",
1036
- workflowFlow: "Рабочий процесс",
1037
- properties: "Свойства",
1038
- connections: "Соединения",
1039
- quickConnect: "Быстрое соединение",
1040
- fromPlaceholder: "От…",
1041
- toPlaceholder: "К…",
1042
- connect: "Соединить",
1043
- label: "Метка",
1044
- type: "Тип",
1045
- description: "Описание",
1046
- assignee: "Ответственный",
1047
- assigneeType: "Тип ответственного",
1048
- user: "Пользователь",
1049
- role: "Роль",
1050
- group: "Группа",
1051
- expression: "Выражение",
1052
- timeoutMinutes: "Тайм-аут (минуты)",
1053
- selectNodeToEdit: "Выберите узел для редактирования его свойств",
1054
- workflowTitle: "Название рабочего процесса",
1055
- newWorkflow: "Новый рабочий процесс",
1056
- outConnections: "{{count}} выходов",
1057
- start: "Начало",
1058
- end: "Конец",
1059
- task: "Задача",
1060
- userTask: "Задача пользователя",
1061
- serviceTask: "Сервисная задача",
1062
- scriptTask: "Скриптовая задача",
1063
- approval: "Одобрение",
1064
- condition: "Условие",
1065
- parallelGateway: "Параллельный шлюз",
1066
- joinGateway: "Шлюз объединения",
1067
- boundaryEvent: "Граничное событие",
1068
- delay: "Задержка",
1069
- notification: "Уведомление",
1070
- webhook: "Webhook",
1071
- allowConcurrency: "Разрешить (параллельное выполнение)",
1072
- forbidConcurrency: "Запретить (пропустить новые)",
1073
- replaceConcurrency: "Заменить (отменить текущие)",
1074
- queueConcurrency: "Очередь (выполнить после текущего)",
1075
- conditionEvent: "Условие",
1076
- manualEvent: "Ручной",
1077
- webhookEvent: "Webhook",
1078
- timerEvent: "Таймер",
1079
- signalEvent: "Сигнал",
1080
- versionHistory: "История версий",
1081
- importBpmn: "Импорт BPMN",
1082
- exportBpmn: "Экспорт BPMN",
1083
- undo: "Отменить",
1084
- redo: "Повторить",
1085
- resetZoom: "Сбросить масштаб",
1327
+ scatterOneMeasure: "Точечная диаграмма строит только одну меру. Оставьте один ряд:",
1328
+ unconfigured: {
1329
+ noCategoryAxis: "Требуется ось категорий диаграммы — диаграмма, привязанная к объекту, не придумывает её. Объявите одно из:",
1330
+ },
1086
1331
  },
1087
1332
  dashboard: {
1088
- 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
+ },
1089
1346
  loading: "Загрузка…",
1347
+ refreshing: "Обновление…",
1348
+ refreshAll: "Обновить все",
1349
+ refreshDashboard: "Обновить дашборд",
1090
1350
  pickMeasures: "Выберите меры (значения) для этого виджета набора данных.",
1091
1351
  datasetUnsupported: "Этот источник данных не поддерживает запросы к наборам данных.",
1352
+ widgetForbiddenTitle: "Нет доступа",
1353
+ widgetForbiddenMessage: "У вас нет прав на просмотр данных этого виджета.",
1092
1354
  details: "Подробности",
1093
1355
  exportCsv: "Экспорт в CSV",
1094
1356
  openInList: "Открыть в списке",
@@ -1116,13 +1378,110 @@ const ru = {
1116
1378
  },
1117
1379
  },
1118
1380
  addWidget: "Добавить виджет",
1119
- removeWidget: "Удалить виджет",
1120
1381
  editLayout: "Редактировать макет",
1121
1382
  saveLayout: "Сохранить макет",
1122
1383
  resetLayout: "Сбросить макет",
1123
1384
  total: "Итого",
1124
- noDataAvailable: "Данные недоступны",
1125
1385
  noDataSourceFor: "Нет источника данных для",
1386
+ config: {
1387
+ breadcrumb: {
1388
+ dashboard: "Дашборд",
1389
+ configuration: "Конфигурация",
1390
+ widget: "Виджет",
1391
+ chart: "Диаграмма",
1392
+ table: "Таблица",
1393
+ pivotTable: "Сводная таблица",
1394
+ },
1395
+ section: {
1396
+ general: "Основные",
1397
+ layout: "Макет",
1398
+ data: "Данные",
1399
+ dataBinding: "Привязка данных",
1400
+ appearance: "Внешний вид",
1401
+ },
1402
+ field: {
1403
+ title: "Заголовок",
1404
+ description: "Описание",
1405
+ columns: "Столбцы",
1406
+ gap: "Отступ",
1407
+ rowHeight: "Высота строки (px)",
1408
+ autoRefresh: "Автообновление",
1409
+ showDescription: "Показать описание",
1410
+ theme: "Тема",
1411
+ widgetType: "Тип виджета",
1412
+ colorVariant: "Вариант цвета",
1413
+ dataset: "Набор данных",
1414
+ dimensions: "Измерения",
1415
+ values: "Значения",
1416
+ width: "Ширина (столбцы)",
1417
+ height: "Высота (строки)",
1418
+ },
1419
+ placeholder: {
1420
+ dashboardTitle: "Заголовок дашборда",
1421
+ dashboardDescription: "Краткое описание под заголовком",
1422
+ widgetTitle: "Заголовок виджета",
1423
+ widgetDescription: "Описание виджета",
1424
+ datasetName: "Имя набора данных",
1425
+ selectDataset: "Выберите набор данных…",
1426
+ searchDatasets: "Поиск наборов данных…",
1427
+ addDimension: "Добавить измерение…",
1428
+ addMeasure: "Добавить меру…",
1429
+ searchMembers: "Поиск…",
1430
+ },
1431
+ empty: {
1432
+ datasets: "Наборы данных не найдены.",
1433
+ dimensions: "Измерения не выбраны.",
1434
+ measures: "Меры не выбраны.",
1435
+ nothingToAdd: "Больше нечего добавить.",
1436
+ },
1437
+ help: {
1438
+ dataset: "Набор данных семантического слоя, к которому привязан этот виджет (ADR-0021).",
1439
+ dimensions: "Группировать/разделять значения по этим измерениям набора данных.",
1440
+ dimensionsPivot: "Поля группировки/разделения. Последнее измерение разворачивается по столбцам.",
1441
+ values: "Меры из набора данных для отображения (хотя бы одна).",
1442
+ },
1443
+ action: {
1444
+ add: "Добавить",
1445
+ remove: "Удалить {{name}}",
1446
+ },
1447
+ refresh: {
1448
+ off: "Выкл.",
1449
+ every30s: "Каждые 30 с",
1450
+ every1m: "Каждую 1 мин",
1451
+ every5m: "Каждые 5 мин",
1452
+ every15m: "Каждые 15 мин",
1453
+ every30m: "Каждые 30 мин",
1454
+ every1h: "Каждый 1 час",
1455
+ },
1456
+ themeOption: {
1457
+ light: "Светлая",
1458
+ dark: "Тёмная",
1459
+ auto: "Авто",
1460
+ },
1461
+ widgetType: {
1462
+ metric: "Метрика",
1463
+ bar: "Столбчатая диаграмма",
1464
+ horizontalBar: "Горизонтальная гистограмма",
1465
+ line: "Линейная диаграмма",
1466
+ pie: "Круговая диаграмма",
1467
+ donut: "Кольцевая диаграмма",
1468
+ area: "Диаграмма с областями",
1469
+ scatter: "Точечная диаграмма",
1470
+ funnel: "Воронка",
1471
+ table: "Таблица",
1472
+ pivot: "Сводная таблица",
1473
+ },
1474
+ color: {
1475
+ default: "По умолчанию",
1476
+ blue: "Синий",
1477
+ teal: "Бирюзовый",
1478
+ orange: "Оранжевый",
1479
+ purple: "Фиолетовый",
1480
+ success: "Успех",
1481
+ warning: "Предупреждение",
1482
+ danger: "Опасность",
1483
+ },
1484
+ },
1126
1485
  trend: {
1127
1486
  vsLastQuarter: "пред. квартал",
1128
1487
  vsLastMonth: "пред. месяц",
@@ -1132,24 +1491,6 @@ const ru = {
1132
1491
  vsPreviousPeriod: "пред. период",
1133
1492
  },
1134
1493
  },
1135
- configPanel: {
1136
- save: "Сохранить",
1137
- discard: "Отменить",
1138
- close: "Закрыть",
1139
- layout: "Макет",
1140
- columns: "Столбцы",
1141
- gap: "Отступ",
1142
- rowHeight: "Высота строки",
1143
- data: "Данные",
1144
- refreshInterval: "Интервал обновления",
1145
- appearance: "Внешний вид",
1146
- title: "Заголовок",
1147
- showDescription: "Показать описание",
1148
- theme: "Тема",
1149
- configuration: "Конфигурация",
1150
- general: "Основные",
1151
- advanced: "Дополнительно",
1152
- },
1153
1494
  appDesigner: {
1154
1495
  createApp: "Создать приложение",
1155
1496
  editApp: "Редактировать приложение",
@@ -1162,10 +1503,6 @@ const ru = {
1162
1503
  appDescription: "Описание",
1163
1504
  appIcon: "Значок",
1164
1505
  template: "Шаблон",
1165
- layout: "Макет",
1166
- layoutSidebar: "Боковая панель",
1167
- layoutHeader: "Заголовок",
1168
- layoutEmpty: "Пусто",
1169
1506
  selectObjects: "Выбрать объекты",
1170
1507
  searchObjects: "Поиск объектов…",
1171
1508
  selectAll: "Выбрать все",
@@ -1174,7 +1511,6 @@ const ru = {
1174
1511
  addGroup: "Добавить группу",
1175
1512
  addUrl: "Добавить URL",
1176
1513
  addSeparator: "Добавить разделитель",
1177
- noNavItems: "Элементов навигации пока нет.",
1178
1514
  logoUrl: "Logo URL",
1179
1515
  primaryColor: "Основной цвет",
1180
1516
  faviconUrl: "Favicon URL",
@@ -1200,16 +1536,13 @@ const ru = {
1200
1536
  showSort: "Показать сортировку",
1201
1537
  appearance: "Внешний вид",
1202
1538
  rowHeight: "Высота строки",
1203
- stripedRows: "Чередующиеся строки",
1204
- bordered: "С рамкой",
1205
1539
  livePreview: "Предпросмотр в реальном времени",
1206
- stepBasicDesc: "Имя, заголовок и макет",
1540
+ stepBasicDesc: "Имя, заголовок и значок",
1207
1541
  stepObjectsDesc: "Выбрать бизнес-объекты",
1208
1542
  stepNavigationDesc: "Построить дерево навигации",
1209
1543
  stepBrandingDesc: "Логотип, цвета и фавикон",
1210
1544
  noObjectsFound: "Объекты не найдены.",
1211
1545
  noNavItemsHint: "Элементов навигации пока нет. Выберите объекты на предыдущем шаге или добавьте вручную.",
1212
- separator: "Разделитель",
1213
1546
  separatorLabel: "— Разделитель —",
1214
1547
  newGroup: "Новая группа",
1215
1548
  newLink: "Новая ссылка",
@@ -1243,6 +1576,7 @@ const ru = {
1243
1576
  navTypeSeparator: "Разделитель",
1244
1577
  navTypeAction: "Действие",
1245
1578
  navTypeComponent: "Компонент",
1579
+ navTypeDoc: "Документ",
1246
1580
  navEditIcon: "Редактировать значок",
1247
1581
  navToggleVisible: "Переключить видимость",
1248
1582
  navHidden: "Скрыто",
@@ -1315,17 +1649,13 @@ const ru = {
1315
1649
  unique: "Уникальное",
1316
1650
  readOnly: "Только чтение",
1317
1651
  hidden: "Скрытое",
1318
- indexed: "Индексированное",
1319
1652
  externalId: "Внешний ID",
1320
1653
  trackHistory: "Отслеживать историю",
1321
1654
  defaultValue: "Значение по умолчанию",
1322
1655
  placeholder: "Заполнитель",
1323
1656
  referenceTo: "Ссылка на",
1324
- formula: "Формула",
1325
1657
  options: "Параметры",
1326
1658
  addOption: "Добавить параметр",
1327
- validationRules: "Правила валидации",
1328
- addRule: "Добавить правило",
1329
1659
  systemBadge: "Система",
1330
1660
  ungrouped: "Общее",
1331
1661
  deleteConfirmTitle: "Удалить поле?",
@@ -1344,7 +1674,25 @@ const ru = {
1344
1674
  },
1345
1675
  },
1346
1676
  console: {
1677
+ studio: {
1678
+ backToHome: "На главную",
1679
+ },
1347
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: "Список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Повторите попытку и сообщите о проблеме, если она повторяется.",
1348
1696
  settingsHub: {
1349
1697
  title: "Настройки",
1350
1698
  subtitle: "Настройте рабочее пространство, интеграции и флаги функций.",
@@ -1389,6 +1737,15 @@ const ru = {
1389
1737
  passwordsDownload: "Скачать CSV",
1390
1738
  },
1391
1739
  ai: {
1740
+ pendingDrafts: {
1741
+ // Число вынесено в конец («…: {{count}}») — так этот пак пишет
1742
+ // количества, как в home.pendingDrafts.publishedVerified.
1743
+ count: "Ещё не опубликовано изменений: {{count}} — пользователи их не видят.",
1744
+ publish: "Опубликовать",
1745
+ published: "Все ожидающие изменения вступили в силу.",
1746
+ failed: "Не удалось опубликовать.",
1747
+ publishedWithFindings: "Опубликовано, но проверки среды выполнения выявили проблемы: {{detail}}",
1748
+ },
1392
1749
  usage: {
1393
1750
  title: "Использование ИИ",
1394
1751
  meterBuild: "Сборка",
@@ -1398,9 +1755,20 @@ const ru = {
1398
1755
  statusFull: "Лимит исчерпан",
1399
1756
  resetsDaily: "Сбросится сегодня ночью",
1400
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}} часа",
1401
1768
  ctaUpgrade: "Повысьте тариф, чтобы продолжить",
1402
1769
  ctaTopUp: "Добавьте кредиты, чтобы продолжить",
1403
1770
  ariaLabel: "Использование ИИ: {{status}}",
1771
+ breakdownTitle: "Использовано на данный момент",
1404
1772
  },
1405
1773
  workspaceTitle: "Рабочее пространство ИИ",
1406
1774
  workspaceSubtitle: "Задавайте вопросы, изучайте и возвращайтесь к диалогам",
@@ -1410,6 +1778,31 @@ const ru = {
1410
1778
  share: "Поделиться",
1411
1779
  shareTitle: "Поделиться этим диалогом",
1412
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
+ },
1413
1806
  newChat: "Создать",
1414
1807
  searchChats: "Поиск по чатам…",
1415
1808
  noChatsYet: "Чатов пока нет",
@@ -1439,7 +1832,7 @@ const ru = {
1439
1832
  empty: {
1440
1833
  build: {
1441
1834
  title: "Создать с помощью ИИ",
1442
- description: "Опишите приложение или процесс обычными словами — я подготовлю объекты, экраны и автоматизации, а вы проверите и опубликуете.",
1835
+ description: "Опишите приложение обычными словами — я подготовлю объекты, экраны и демонстрационные данные, а вы проверите и опубликуете.",
1443
1836
  },
1444
1837
  ask: {
1445
1838
  title: "Спросите свои данные",
@@ -1448,7 +1841,7 @@ const ru = {
1448
1841
  editApp: {
1449
1842
  title: "Редактирование «{{app}}»",
1450
1843
  titleGeneric: "Редактировать это приложение",
1451
- description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или автоматизацию либо скорректирую существующее.",
1844
+ description: "Что нужно изменить? Я изменю это приложение на месте — добавлю поле, объект, представление или дашборд либо скорректирую существующее.",
1452
1845
  },
1453
1846
  },
1454
1847
  clearConversation: "Очистить",
@@ -1501,29 +1894,52 @@ const ru = {
1501
1894
  recentRecords: "Перечисли 5 последних созданных записей.",
1502
1895
  recordCounts: "Посчитай количество записей по каждому объекту.",
1503
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.
1504
1905
  metadataAssistant: {
1505
- buildCrm: "Создай CRM для продаж — клиенты, контакты и воронка сделок с итогами по этапам.",
1506
- buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам.",
1507
- buildFlow: "Спроектируй службу поддержки — заявки с приоритетом, процесс статусов и связи с клиентами.",
1508
- buildInventory: "Создай приложение для склада — товары, остатки, поставщики и индикация низких остатков.",
1509
- buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, этапы собеседований и заметки.",
1906
+ buildCrm: "Создай CRM для продаж — клиенты, контакты и сделки с полем этапа, а также дашборд с суммой сделок по этапам.",
1907
+ buildApp: "Создай трекер проектов — проекты, задачи с ответственными и сроками, доска по статусам и календарь сроков.",
1908
+ buildFlow: "Спроектируй службу поддержки — заявки с полями приоритета и статуса, доска по статусам и связи с клиентами.",
1909
+ buildInventory: "Создай приложение для склада — товары, остатки, поставщики и представление, отбирающее товары ниже точки заказа.",
1910
+ buildRecruiting: "Создай трекер кандидатов — кандидаты, открытые вакансии, поле этапа собеседования и доска по этапам.",
1510
1911
  },
1511
1912
  generic: {
1512
1913
  help: "Чем ты можешь мне помочь?",
1513
1914
  availableObjects: "Перечисли доступные объекты данных.",
1514
1915
  recentActivity: "Сделай сводку моей недавней активности.",
1515
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`.
1516
1927
  editApp: {
1517
1928
  addField: "Добавь поле в один из объектов.",
1518
1929
  addObject: "Добавь новый объект и свяжи его с существующим.",
1519
1930
  addDashboard: "Добавь дашборд с ключевыми показателями.",
1520
- addAutomation: "Добавь автоматизацию — согласование, процесс статусов или уведомление.",
1931
+ addSampleData: "Заполни существующие объекты правдоподобными демонстрационными записями, чтобы приложение можно было показать.",
1521
1932
  },
1522
1933
  },
1523
1934
  changesTitle: "Подтвердите изменения",
1524
1935
  changesConfirmed: "Подтверждено",
1525
1936
  changesConfirm: "Подтвердить",
1526
1937
  changesConfirmHint: "Ответьте, чтобы подтвердить или скорректировать это изменение.",
1938
+ changesApplying: "Применение…",
1939
+ changesApplied: "Применено",
1940
+ changesDrafted: "Сохранено как черновик",
1941
+ changesFailed: "Не применено",
1942
+ discussing: "Обсуждается: {{target}}",
1527
1943
  changeVerb: {
1528
1944
  createObject: "Создать объект",
1529
1945
  addField: "Добавить поле",
@@ -1594,6 +2010,13 @@ const ru = {
1594
2010
  pages: "Страницы",
1595
2011
  reports: "Отчёты",
1596
2012
  system: "Система",
2013
+ marketplace: "Маркетплейс",
2014
+ settings: 'Настройки',
2015
+ apps: 'Приложения',
2016
+ profile: 'Профиль',
2017
+ approvals: 'Согласования',
2018
+ aiApprovals: 'Согласования ИИ',
2019
+ auditLog: 'Журнал аудита',
1597
2020
  },
1598
2021
  // objectui#4024 — the single-namespace settings screen. Its sibling
1599
2022
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1613,7 +2036,9 @@ const ru = {
1613
2036
  saveChanges: "Сохранить изменения",
1614
2037
  unsavedCount: "Несохранённых изменений: {{count}}",
1615
2038
  unsavedCount_one: "{{count}} несохранённое изменение",
1616
- unsavedCount_other: "{{count}} несохранённых изменений",
2039
+ unsavedCount_few: "{{count}} несохранённых изменения",
2040
+ unsavedCount_many: "{{count}} несохранённых изменений",
2041
+ unsavedCount_other: "{{count}} несохранённого изменения",
1617
2042
  cryptoRefusalTitle: "Эта установка не может шифровать секреты",
1618
2043
  cryptoRefusalSubjectSuffix: "объявлен зашифрованным, поэтому ничего не было записано.",
1619
2044
  cryptoRefusalNoSubject: "Значение, объявленное зашифрованным, было отклонено, поэтому ничего не было записано.",
@@ -1685,6 +2110,21 @@ const ru = {
1685
2110
  records: "Записи",
1686
2111
  recentRecords: "Недавно просмотренные",
1687
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
+ },
1688
2128
  errors: {
1689
2129
  somethingWentWrong: "Что-то пошло не так",
1690
2130
  unexpectedError: "При отображении этого представления произошла непредвиденная ошибка.",
@@ -1715,6 +2155,7 @@ const ru = {
1715
2155
  viewNameInvalid: "Используйте строчные латинские буквы, цифры и подчёркивания; начните с буквы или подчёркивания.",
1716
2156
  systemViewReadonly: "Системное представление определено в коде — только для чтения.",
1717
2157
  cannotEditMetaView: "Это встроенное представление, определённое в коде, — изменить его нельзя.",
2158
+ viewConfigPermissionDenied: "Настройки представления применяются ко всем пользователям этого представления, поэтому их изменение требует разрешения «Управление метаданными». Обратитесь к администратору, чтобы внести это изменение.",
1718
2159
  cannotDeleteMetaView: "Это встроенное представление, определённое в коде, — удалить его нельзя.",
1719
2160
  expandToPage: "Открыть на всю страницу",
1720
2161
  objectNotFound: "Объект не найден",
@@ -1723,101 +2164,40 @@ const ru = {
1723
2164
  filterOrNotSavable: "Этот фильтр объединяет условия через ИЛИ, что сохранённое представление пока не может хранить. Он по-прежнему применяется к этому списку — уберите группировку ИЛИ, чтобы сохранить его в представлении.",
1724
2165
  filterNestedNotSavable: "Этот фильтр использует вложенные группы условий, которые сохранённое представление не может хранить. Преобразуйте его в один список условий, чтобы сохранить в представлении.",
1725
2166
  allRecords: "Все записи",
1726
- exitDesignMode: "Выйти из режима дизайна",
1727
- enterDesignMode: "Войти в режим дизайна",
1728
- metadataInspector: "Инспектор метаданных",
1729
- editView: "Редактировать представление",
1730
- addView: "Добавить представление",
1731
- designTools: "Инструменты дизайна",
1732
2167
  new: "Создать",
1733
2168
  configureView: "Настроить представление",
1734
- closePanel: "Закрыть панель",
1735
- page: "Страница",
1736
- pageConfigHint: "Панель инструментов, навигация и настройки оболочки представления",
1737
- listConfigHint: "Отрисовка данных, столбцы и внешний вид для этого типа списка",
1738
- general: "Общие",
1739
- generalHint: "Название, описание и тип представления",
1740
- toolbar: "Панель инструментов",
1741
- toolbarHint: "Поиск, фильтр, сортировка, группировка и переключение плотности",
1742
2169
  toolbarEnabledCount: "{{count}} из {{total}} включено",
1743
- navigationSection: "Навигация",
1744
- navigationHint: "Поведение при нажатии на строку и настройки детального представления",
1745
- records: "Записи",
1746
- recordsHint: "Режим выбора, добавление записи и встроенное редактирование",
1747
- exportPrint: "Экспорт и печать",
1748
- exportPrintHint: "Форматы экспорта, печать и отображение количества записей",
1749
- showAllFields: "Показать все",
1750
- hideAllFields: "Скрыть все",
1751
2170
  searchFields: "Поиск полей…",
1752
2171
  title: "Заголовок",
1753
- description: "Описание",
1754
- data: "Данные",
1755
- source: "Источник",
1756
- columns: "Столбцы",
1757
- filterBy: "Фильтр по",
1758
- sortBy: "Сортировка по",
1759
- appearance: "Внешний вид",
1760
- showDescription: "Показать описание",
1761
2172
  viewType: "Тип представления",
1762
- userFilters: "Фильтры пользователя",
1763
- enableSearch: "Включить поиск",
1764
- enableFilter: "Включить фильтр",
1765
- enableSort: "Включить сортировку",
1766
- enableHideFields: "Включить скрытие полей",
1767
- enableGroup: "Включить группировку",
1768
- enableColor: "Включить цвет",
1769
- enableDensity: "Включить плотность",
1770
- userActions: "Действия пользователя",
1771
- addRecordViaForm: "Добавить записи через форму",
1772
- advanced: "Расширенные",
1773
- allowExport: "Разрешить экспорт",
1774
- recordCount: "{{count}} записей",
1775
- noDescription: "Нет описания",
1776
- none: "Нет",
1777
- columnsConfigured: "{{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}} записи",
1778
2181
  save: "Сохранить",
1779
2182
  discard: "Отменить",
1780
2183
  createView: "Создать представление",
1781
2184
  newView: "Новое представление",
1782
- typeOptions: "Параметры типа",
1783
2185
  groupByField: "Поле группировки",
1784
2186
  startDateField: "Поле даты начала",
1785
2187
  titleField: "Поле заголовка",
1786
2188
  latitudeField: "Поле широты",
1787
2189
  longitudeField: "Поле долготы",
1788
2190
  imageField: "Поле изображения",
1789
- dateField: "Поле даты",
1790
2191
  selectField: "Выберите поле…",
1791
- gridOptionsHint: "Представление таблицы использует столбцы, настроенные выше.",
1792
- groupBy: "Группировать по",
1793
- prefixField: "Поле префикса",
1794
- fields: "Поля",
1795
- fieldsVisible: "{{count}} видимых",
1796
- sortsCount: "{{count}} сортировок",
1797
- filtersCount: "{{count}} фильтров",
1798
2192
  endDateField: "Поле даты окончания",
1799
- color: "Цвет",
1800
- fieldTextColor: "Цвет текста поля",
1801
- rowHeight: "Высота строки",
1802
- wrapHeaders: "Перенос заголовков",
1803
- showFieldDescriptions: "Показать описания полей",
1804
- collapseAllByDefault: "Свернуть всё по умолчанию",
1805
- striped: "Полосатые строки",
1806
- bordered: "Ячейки с границами",
1807
- inlineEdit: "Редактировать записи встроенно",
1808
- addDeleteRecordsInline: "Добавлять/удалять записи встроенно",
1809
- clickIntoRecordDetails: "Нажмите для просмотра деталей записи",
1810
- navigationMode: "Режим навигации",
1811
- navigationWidth: "Ширина навигации",
1812
- navigationWidthHint: "Доступно для режимов навигации: выдвижная панель, модальное окно и разделённый вид",
1813
- openNewTab: "Открыть в новой вкладке",
1814
- openNewTabHint: "Доступно для режимов навигации: страница и новое окно",
1815
2193
  import: "Импорт",
1816
2194
  importTitle: "Импорт из CSV",
1817
2195
  importedToast: "{{count}} строк импортировано.",
2196
+ importedToast_one: "Импортирована {{count}} строка.",
2197
+ importedToast_few: "Импортировано {{count}} строки.",
2198
+ importedToast_many: "Импортировано {{count}} строк.",
2199
+ importedToast_other: "Импортировано {{count}} строки.",
1818
2200
  importedWithSkipped: "{{ok}} строк импортировано; {{skipped}} пропущено.",
1819
- showAdvancedSettings: "Показать расширенные настройки",
1820
- showFewerSettings: "Меньше настроек",
1821
2201
  createViewDesc: "Выберите тип представления и задайте ему имя. Все настройки можно изменить позже.",
1822
2202
  cancel: "Отмена",
1823
2203
  create: "Создать",
@@ -1825,6 +2205,10 @@ const ru = {
1825
2205
  deleteViewTitle: "Удалить представление",
1826
2206
  deleteViewConfirm: "Удалить представление \"{{name}}\"? Это действие нельзя отменить.",
1827
2207
  bulkDeleteConfirm: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2208
+ bulkDeleteConfirm_one: "Удалить {{count}} выбранную запись? Это действие нельзя отменить.",
2209
+ bulkDeleteConfirm_few: "Удалить {{count}} выбранные записи? Это действие нельзя отменить.",
2210
+ bulkDeleteConfirm_many: "Удалить {{count}} выбранных записей? Это действие нельзя отменить.",
2211
+ bulkDeleteConfirm_other: "Удалить {{count}} выбранной записи? Это действие нельзя отменить.",
1828
2212
  duplicateViewName: "Представление с таким именем уже существует.",
1829
2213
  viewTypeGrid: "Таблица",
1830
2214
  viewTypeGridDesc: "Таблица записей в стиле электронной таблицы.",
@@ -1861,62 +2245,17 @@ const ru = {
1861
2245
  chartTypePie: "Круговая",
1862
2246
  chartTypeArea: "Областная",
1863
2247
  chartTypeScatter: "Точечная",
1864
- xAxisField: "Поле оси X",
1865
- xAxisFieldHelp: "Категориальное или временное измерение.",
1866
- yAxisField: "Поле оси Y",
1867
- yAxisFieldHelp: "Числовое поле для агрегации.",
1868
- selectionMode: "Режим выбора",
1869
- selectionNone: "Нет",
1870
- selectionSingle: "Одиночный",
1871
- selectionMultiple: "Множественный",
1872
- pageSize: "Размер страницы",
1873
- pageSizeOptions: "Варианты размера страницы",
1874
- exportFormats: "Форматы экспорта",
1875
- exportMaxRecords: "Макс. записей",
1876
- exportIncludeHeaders: "Включить заголовки",
1877
- exportFileNamePrefix: "Префикс имени файла",
1878
- searchableFields: "Поля для поиска",
1879
- filterableFields: "Поля для фильтрации",
1880
- resizableColumns: "Изменяемые столбцы",
1881
- densityCompact: "Компактный",
1882
- densityComfortable: "Обычный",
1883
- densitySpacious: "Просторный",
1884
- densityMode: "Режим плотности",
1885
- hiddenFields: "Скрытые поля",
1886
- rowActions: "Действия строки",
1887
- bulkActions: "Массовые действия",
1888
- sharing: "Общий доступ",
1889
- sharingEnabled: "Общий доступ включён",
1890
- sharingVisibility: "Видимость",
1891
- addRecordEnabled: "Добавление записей включено",
1892
- addRecordPosition: "Позиция",
1893
- addRecordMode: "Режим",
1894
- addRecordFormView: "Представление формы",
1895
- conditionalFormatting: "Условное форматирование",
1896
- addRule: "Добавить правило",
1897
- quickFilters: "Быстрые фильтры",
1898
- addQuickFilter: "Добавить быстрый фильтр",
1899
- ufElements: "Элементы",
1900
- ufDropdown: "Выпадающий список",
2248
+ dataset: "Набор данных",
2249
+ datasetHelp: "Диаграмма берёт значения из этого набора данных объекта.",
2250
+ chartMeasure: "Мера",
2251
+ chartMeasureHelp: "Мера набора данных, отображаемая на оси значений.",
2252
+ chartDimension: "Измерение",
2253
+ chartDimensionHelp: "Измерение набора данных, по которому группируются значения (необязательно).",
2254
+ viewTypeUnavailableDataset: "Этот объект не предоставляет набора данных для диаграммы.",
2255
+ noDatasetMeasure: "В этом наборе данных не объявлено ни одной меры для диаграммы.",
1901
2256
  ufTabs: "Вкладки",
1902
- ufToggle: "Переключатель",
1903
2257
  ufAddField: "+ Добавить поле фильтра…",
1904
- ufNoFields: "Поля недоступны",
1905
- ufAddTab: "+ Добавить вкладку",
1906
- ufTabLabel: "Метка",
1907
2258
  ufShowAllRecords: "Показать вкладку \"Все записи\"",
1908
- ufAllowAddTab: "Разрешить добавление вкладок",
1909
- showRecordCount: "Показать количество записей",
1910
- allowPrinting: "Разрешить печать",
1911
- virtualScroll: "Виртуальная прокрутка",
1912
- emptyStateTitle: "Заголовок пустого состояния",
1913
- emptyStateMessage: "Сообщение пустого состояния",
1914
- emptyStateIcon: "Значок пустого состояния",
1915
- ariaLabel: "Метка ARIA",
1916
- ariaDescribedBy: "Описано ARIA",
1917
- ariaLive: "ARIA Live",
1918
- accessibility: "Доступность",
1919
- viewTabs: "Вкладки представлений",
1920
2259
  },
1921
2260
  localeSwitcher: {
1922
2261
  label: "Язык",
@@ -1927,6 +2266,9 @@ const ru = {
1927
2266
  unpinItem: "Открепить {{name}}",
1928
2267
  dragToReorder: "Перетащите для изменения порядка",
1929
2268
  favorites: "Избранное",
2269
+ launcherLabel: "Панель приложений",
2270
+ menuLabel: "Навигация приложения",
2271
+ menuEmpty: "В этом приложении нет доступных для открытия элементов навигации.",
1930
2272
  },
1931
2273
  },
1932
2274
  auth: {
@@ -1980,6 +2322,8 @@ const ru = {
1980
2322
  resendOtpCountdownText: "Отправить снова через {seconds} с",
1981
2323
  usePhoneOtpText: "Войти по коду подтверждения",
1982
2324
  usePasswordSignInText: "Войти с паролем",
2325
+ socialButton: "Продолжить через {provider}",
2326
+ orText: "или продолжите с электронной почтой",
1983
2327
  },
1984
2328
  register: {
1985
2329
  title: "Создать аккаунт",
@@ -1998,8 +2342,12 @@ const ru = {
1998
2342
  submittingButton: "Создание аккаунта…",
1999
2343
  hasAccountText: "Уже есть аккаунт?",
2000
2344
  signInText: "Войти",
2345
+ socialButton: "Зарегистрироваться через {provider}",
2346
+ orText: "или продолжите с электронной почтой",
2001
2347
  errors: {
2002
2348
  userExists: "Аккаунт с таким email уже существует. Попробуйте войти.",
2349
+ selfRegistrationClosed: "Самостоятельная регистрация в этой среде закрыта. Обратитесь к администратору за приглашением.",
2350
+ emailDomainNotAllowed: "Регистрация с адресами этого домена здесь не разрешена. Используйте email вашей организации или обратитесь к администратору за приглашением.",
2003
2351
  },
2004
2352
  verifyInbox: {
2005
2353
  title: "Проверьте входящие",
@@ -2018,7 +2366,7 @@ const ru = {
2018
2366
  submitButton: "Отправить ссылку для сброса",
2019
2367
  submittingButton: "Отправка…",
2020
2368
  successTitle: "Проверьте почту",
2021
- successDescription: "Мы отправили ссылку для сброса пароля на {{email}}. Пожалуйста, проверьте свою почту.",
2369
+ successDescription: "Мы отправили ссылку для сброса пароля на {email}. Пожалуйста, проверьте свою почту.",
2022
2370
  backToSignInText: "Вернуться к входу",
2023
2371
  rememberPasswordText: "Помните свой пароль?",
2024
2372
  signInText: "Войти",
@@ -2198,6 +2546,15 @@ const ru = {
2198
2546
  role: "Роль",
2199
2547
  save: "Сохранить изменения",
2200
2548
  },
2549
+ language: {
2550
+ title: "Язык",
2551
+ description: "Язык уведомлений и сообщений, которые отправляются вам. Язык интерфейса выбирается отдельно — в меню с глобусом.",
2552
+ label: "Предпочитаемый язык",
2553
+ systemDefault: "Использовать значение по умолчанию для развёртывания",
2554
+ save: "Сохранить",
2555
+ saved: "Языковые настройки обновлены.",
2556
+ readOnly: "Язык вашей учётной записи настраивает администратор.",
2557
+ },
2201
2558
  password: {
2202
2559
  changeTitle: "Изменить пароль",
2203
2560
  setTitle: "Задать локальный пароль",
@@ -2229,7 +2586,6 @@ const ru = {
2229
2586
  label: "Рабочие пространства",
2230
2587
  default: "Моё рабочее пространство",
2231
2588
  switch: "Переключить рабочее пространство",
2232
- create: "Создать рабочее пространство",
2233
2589
  createTitle: "Создать рабочее пространство",
2234
2590
  createDescription: "Рабочее пространство — это общее место для совместной работы вашей команды.",
2235
2591
  createButton: "Создать рабочее пространство",
@@ -2254,7 +2610,6 @@ const ru = {
2254
2610
  packageManagement: "Управление пакетами",
2255
2611
  searchNavigation: "Поиск по навигации…",
2256
2612
  settings: "Настройки",
2257
- help: "Помощь",
2258
2613
  helpTooltip: "Помощь и документация",
2259
2614
  activityFeed: "Лента активности",
2260
2615
  notifications: "Уведомления",
@@ -2293,10 +2648,12 @@ const ru = {
2293
2648
  build: {
2294
2649
  title: "Создать приложение",
2295
2650
  subtitle: "Начните с нуля — спроектируйте объекты, формы, автоматизации и интерфейсы.",
2651
+ noCapability: "Создание приложений недоступно в этом рабочем пространстве — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.",
2296
2652
  },
2297
2653
  template: {
2298
2654
  title: "Начать с шаблона",
2299
2655
  subtitle: "Установите шаблонное приложение из маркетплейса и настройте его под себя.",
2656
+ marketplaceDisabled: "Для этого рантайма не настроен маркетплейс приложений, поэтому здесь нет шаблонов для установки.",
2300
2657
  },
2301
2658
  welcomeAdminDescription: "Опишите свой бизнес одним предложением — ИИ создаст объекты, экраны, API и инструменты агента. Либо настройте всё сами через меню слева.",
2302
2659
  welcomeAdminDescriptionNoBuild: "Настройте первое приложение через меню «Администрирование» слева. Когда появятся данные, ИИ-ассистент поможет их изучить.",
@@ -2312,6 +2669,10 @@ const ru = {
2312
2669
  },
2313
2670
  pendingDrafts: {
2314
2671
  message: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2672
+ message_one: "У вас {{count}} неопубликованное изменение — опубликуйте его, чтобы оно вступило в силу.",
2673
+ message_few: "У вас {{count}} неопубликованных изменения — опубликуйте их, чтобы они вступили в силу.",
2674
+ message_many: "У вас {{count}} неопубликованных изменений — опубликуйте их, чтобы они вступили в силу.",
2675
+ message_other: "У вас {{count}} неопубликованного изменения — опубликуйте их, чтобы они вступили в силу.",
2315
2676
  cta: "Опубликовать",
2316
2677
  publishing: "Публикация…",
2317
2678
  published: "Опубликовано! Изменения вступили в силу.",
@@ -2327,7 +2688,6 @@ const ru = {
2327
2688
  capabilityWarn: "Проверка при создании — несуществующих ссылок на возможности: {{count}}.",
2328
2689
  },
2329
2690
  title: "Главная",
2330
- subtitle: "Панель вашего рабочего пространства",
2331
2691
  nav: "Главная",
2332
2692
  allApps: "Все приложения",
2333
2693
  yourApps: "Ваши приложения",
@@ -2339,8 +2699,6 @@ const ru = {
2339
2699
  empty: "Всё выполнено",
2340
2700
  },
2341
2701
  loading: "Загрузка рабочего пространства…",
2342
- recent: "Недавние",
2343
- starred: "Избранные",
2344
2702
  welcome: "Добро пожаловать в ObjectUI",
2345
2703
  welcomeDescription: "Начните с создания вашего первого приложения или настройки системы.",
2346
2704
  createFirstApp: "Создайте первое приложение",
@@ -2348,8 +2706,6 @@ const ru = {
2348
2706
  browseMarketplace: "Обзор маркетплейса приложений",
2349
2707
  quickActions: {
2350
2708
  title: "Быстрые действия",
2351
- createApp: "Создать приложение",
2352
- createAppDesc: "Начните с нового приложения",
2353
2709
  manageObjects: "Управление объектами",
2354
2710
  manageObjectsDesc: "Настройте модели данных",
2355
2711
  systemSettings: "Системные настройки",
@@ -2365,18 +2721,15 @@ const ru = {
2365
2721
  greetingNight: "Ночная смена",
2366
2722
  heroTagline: "Продолжите с того места, где остановились, или откройте что-то новое.",
2367
2723
  open: "Открыть",
2368
- stats: {
2369
- apps: "Приложения",
2370
- starred: "Отмеченные",
2371
- recent: "Недавние",
2372
- },
2373
2724
  recentApps: {
2374
2725
  title: "Недавно открытые",
2375
2726
  itemType: {
2376
2727
  object: "Объект",
2377
2728
  dashboard: "Панель",
2378
2729
  page: "Страница",
2730
+ report: "Отчёт",
2379
2731
  record: "Запись",
2732
+ metadata: "Метаданные",
2380
2733
  },
2381
2734
  },
2382
2735
  starredApps: {
@@ -2398,7 +2751,6 @@ const ru = {
2398
2751
  organizations: "Организации",
2399
2752
  roles: "Роли",
2400
2753
  configuration: "Конфигурация",
2401
- createApp: "Создать приложение",
2402
2754
  administration: "Администрирование",
2403
2755
  datasources: "Источники данных",
2404
2756
  documentation: "Документация",
@@ -2423,6 +2775,7 @@ const ru = {
2423
2775
  typeUpdate: "Обновление",
2424
2776
  typeDelete: "Удаление",
2425
2777
  typeComment: "Комментарий",
2778
+ typeSystem: "Система",
2426
2779
  relativeJustNow: "только что",
2427
2780
  relativeSecondsAgo: "{{count}} с назад",
2428
2781
  relativeMinutesAgo: "{{count}} м назад",
@@ -2444,8 +2797,18 @@ const ru = {
2444
2797
  placeholder: "Поиск объектов, панелей, страниц, отчётов…",
2445
2798
  inputAriaLabel: "Поиск объектов, панелей, страниц, отчётов",
2446
2799
  resultsCount: "{{count}} результат для \"{{query}}\"",
2447
- 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.
2448
2807
  itemsAvailable: "{{count}} доступно",
2808
+ itemsAvailable_one: "{{count}} доступно",
2809
+ itemsAvailable_few: "{{count}} доступно",
2810
+ itemsAvailable_many: "{{count}} доступно",
2811
+ itemsAvailable_other: "{{count}} доступно",
2449
2812
  noResults: "Результатов не найдено",
2450
2813
  noResultsHint: "Попробуйте изменить поисковые запросы",
2451
2814
  typeObjects: "Объекты",
@@ -2470,7 +2833,11 @@ const ru = {
2470
2833
  noAppsConfigured: "Нет приложений",
2471
2834
  noAppsConfiguredDescription: "Нет зарегистрированных приложений. Создайте первое приложение или посетите системные настройки.",
2472
2835
  appNotAvailable: "Приложение недоступно",
2473
- appNotAvailableDescription: "Это приложение пока недоступно — возможно, публикация ещё идёт. Повторите попытку через мгновение.",
2836
+ appNotAvailableDescription: "Это приложение недоступно — повторите попытку через мгновение.",
2837
+ appNotFound: "Не удалось открыть это приложение",
2838
+ appNotFoundDescription: "Сервер не вернул это приложение для вашей учётной записи.",
2839
+ appUnreachable: "Не удалось связаться с сервером",
2840
+ appUnreachableDescription: "Не удалось проверить это приложение. Повторите попытку через мгновение.",
2474
2841
  appAccessDenied: "У вас нет доступа к этому приложению",
2475
2842
  appAccessDeniedDescription: "Это приложение существует, но у вашей учётной записи нет прав на его открытие. Обратитесь к администратору за доступом.",
2476
2843
  appAccessDeniedHome: "На главную",
@@ -2480,31 +2847,16 @@ const ru = {
2480
2847
  recordNotFound: "Запись не найдена",
2481
2848
  recordNotFoundDescription: "Искомая запись не существует или была удалена.",
2482
2849
  },
2483
- renderer: {
2484
- noPageSchema: "Схема страницы не указана",
2485
- noFormSchema: "Схема формы не указана",
2486
- noDashboardSchema: "Схема панели не указана",
2487
- pageRendering: "Рендеринг страницы: {{name}}",
2488
- dashboardRendering: "Рендеринг панели: {{name}}",
2489
- formRenderingMode: "Форма в режиме {{mode}}",
2490
- formRenderingFor: "для записи {{id}}",
2491
- createRecord: "Создать запись",
2492
- editRecord: "Редактировать запись",
2493
- page: "Страница",
2494
- dashboard: "Панель",
2495
- save: "Сохранить",
2496
- cancel: "Отмена",
2497
- },
2498
2850
  actionDialog: {
2499
2851
  title: "Параметры действия",
2500
2852
  description: "Введите необходимую информацию для продолжения.",
2501
2853
  selectPlaceholder: "Выбрать {{label}}",
2502
2854
  requiredError: "{{label}} обязательно",
2855
+ unresolvedParam: 'Этот параметр невозможно показать: поле, на котором он основан, отсутствует в метаданных объекта, поэтому нужный элемент управления нельзя построить. Попросите администратора исправить определение действия.',
2856
+ carryOverHint: 'Переносится без изменений (только чтение)',
2503
2857
  cancel: "Отмена",
2504
2858
  confirm: "Подтвердить",
2505
2859
  uploading: "Загрузка…",
2506
- defaultActionTitle: "Действие",
2507
- ok: "ОК",
2508
2860
  lookupPlaceholder: "ID записи для {{label}}",
2509
2861
  lookupHelpText: "Для этого параметра не настроен объект ссылки, поэтому выбор записи недоступен. Введите ID записи или попросите администратора исправить параметр действия.",
2510
2862
  },
@@ -2513,11 +2865,6 @@ const ru = {
2513
2865
  confirm: "Продолжить",
2514
2866
  cancel: "Отмена",
2515
2867
  },
2516
- rowAction: {
2517
- openMenu: "Открыть меню",
2518
- edit: "Редактировать",
2519
- delete: "Удалить",
2520
- },
2521
2868
  navigationSync: {
2522
2869
  addedPage: "Навигация обновлена: страница \"{{name}}\" добавлена",
2523
2870
  addedDashboard: "Навигация обновлена: панель \"{{name}}\" добавлена",
@@ -2538,6 +2885,10 @@ const ru = {
2538
2885
  noRecordId: "ID записи не указан",
2539
2886
  deleteConfirm: "Удалить эту запись?",
2540
2887
  bulkDeleteSuccess: "{{count}} записей {{label}} удалено",
2888
+ bulkDeleteSuccess_one: "Удалена {{count}} запись {{label}}",
2889
+ bulkDeleteSuccess_few: "Удалено {{count}} записи {{label}}",
2890
+ bulkDeleteSuccess_many: "Удалено {{count}} записей {{label}}",
2891
+ bulkDeleteSuccess_other: "Удалено {{count}} записи {{label}}",
2541
2892
  bulkDeletePartial: "{{succeeded}} удалено, {{failed}} не удалось",
2542
2893
  },
2543
2894
  objectViewActions: {
@@ -2549,15 +2900,6 @@ const ru = {
2549
2900
  exportFailed: "Ошибка экспорта: {{message}}",
2550
2901
  forecastSoon: "Прогнозное представление скоро будет",
2551
2902
  },
2552
- recordDetail: {
2553
- viewersTooltip: "Пользователи, просматривающие эту запись",
2554
- },
2555
- cellRender: {
2556
- empty: "Пусто",
2557
- yes: "Да",
2558
- no: "Нет",
2559
- systemFields: "Система",
2560
- },
2561
2903
  user: {
2562
2904
  profile: "Профиль",
2563
2905
  settings: "Настройки",
@@ -2594,17 +2936,17 @@ const ru = {
2594
2936
  },
2595
2937
  organizations: {
2596
2938
  create: "Создать рабочее пространство",
2597
- mine: "Мои организации",
2598
- title: "Организации",
2599
- heading: "Ваши организации",
2600
- subtitle: "Выберите организацию, чтобы продолжить, или создайте новую.",
2601
- searchPlaceholder: "Поиск организации",
2602
- new: "Новая организация",
2603
- current: "Текущая организация",
2939
+ mine: "Мои рабочие пространства",
2940
+ title: "Рабочие пространства",
2941
+ heading: "Ваши рабочие пространства",
2942
+ subtitle: "Выберите рабочее пространство, чтобы продолжить, или создайте новое.",
2943
+ searchPlaceholder: "Поиск рабочего пространства",
2944
+ new: "Новое рабочее пространство",
2945
+ current: "Текущее рабочее пространство",
2604
2946
  manage: "Управление",
2605
- emptyTitle: "Пока нет организаций",
2606
- emptyDescription: "Создайте свою первую организацию, чтобы начать.",
2607
- noMatches: "Нет организаций, соответствующих запросу.",
2947
+ emptyTitle: "Пока нет рабочих пространств",
2948
+ emptyDescription: "Создайте своё первое рабочее пространство, чтобы начать.",
2949
+ noMatches: "Нет рабочих пространств, соответствующих запросу.",
2608
2950
  },
2609
2951
  organization: {
2610
2952
  roles: {
@@ -2733,6 +3075,9 @@ const ru = {
2733
3075
  declined: "Приглашение отклонено",
2734
3076
  declineFailed: "Не удалось отклонить приглашение",
2735
3077
  },
3078
+ current: {
3079
+ label: "Текущая организация",
3080
+ },
2736
3081
  switcher: {
2737
3082
  label: "Переключить организацию",
2738
3083
  groupLabel: "Рабочая организация",
@@ -2744,18 +3089,41 @@ const ru = {
2744
3089
  regionLabel: "Уведомления",
2745
3090
  groupCount: "Уведомлений: {{count}}",
2746
3091
  groupUnread: "Непрочитанных: {{count}}",
3092
+ groupUnread_one: "Непрочитанных: {{count}}",
3093
+ groupUnread_few: "Непрочитанных: {{count}}",
3094
+ groupUnread_many: "Непрочитанных: {{count}}",
3095
+ groupUnread_other: "Непрочитанных: {{count}}",
2747
3096
  groupMarkRead: "Отметить прочитанными",
2748
3097
  groupMarkReadTitle: "Отметить прочитанными все этого типа",
2749
3098
  empty: "Нет уведомлений",
2750
3099
  markAllRead: "Отметить все как прочитанные",
2751
3100
  viewAll: "Показать все уведомления",
2752
3101
  approvalsPending: "{{count}} ожидающих утверждений",
3102
+ approvalsPending_one: "{{count}} ожидающее утверждение",
3103
+ approvalsPending_few: "{{count}} ожидающих утверждения",
3104
+ approvalsPending_many: "{{count}} ожидающих утверждений",
3105
+ approvalsPending_other: "{{count}} ожидающего утверждения",
2753
3106
  viewApprovals: "Показать утверждения",
2754
3107
  noPendingApprovals: "Нет ожидающих утверждений",
2755
3108
  openApprovalsInbox: "Открыть входящие утверждений",
2756
3109
  badgeTotal: "Всего: {{total}}",
2757
3110
  badgeNotifications: "{{unread}} уведомлений",
2758
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: "Этот браузер не поддерживает уведомления на рабочем столе.",
2759
3127
  emptyUnread: "Всё прочитано",
2760
3128
  filterUnread: "Непрочитанные",
2761
3129
  filterAll: "Все",
@@ -2769,63 +3137,19 @@ const ru = {
2769
3137
  thankYouTitle: "Спасибо!",
2770
3138
  thankYouMessage: "Ваш ответ успешно получен.",
2771
3139
  redirecting: "Перенаправление через {{seconds}} с…",
3140
+ redirectPending: "Перенаправление…",
2772
3141
  unavailableTitle: "Форма недоступна",
2773
3142
  unavailableDescription: "По этому URL нет публичной формы. Убедитесь, что базовое представление имеет анонимный доступ.",
2774
3143
  tryDemo: "Попробовать демо",
2775
3144
  retry: "Повторить",
2776
3145
  loading: "Загрузка формы…",
2777
3146
  requiredHint: "* Обязательное поле",
3147
+ requiredFields: "Обязательные поля: {{fields}}",
2778
3148
  consentLabelDefault: "Я принимаю политику конфиденциальности и соглашаюсь на обработку моих данных.",
2779
3149
  consentLink: "Политика конфиденциальности",
2780
3150
  consentRequired: "Пожалуйста, примите политику конфиденциальности.",
2781
3151
  rateLimited: "Проверьте ответы перед отправкой.",
2782
3152
  redirectBlocked: "Ответ принят, но URL перенаправления заблокирован по соображениям безопасности.",
2783
- demo: {
2784
- contactTitle: "Связаться с нами",
2785
- contactDescription: "Расскажите о вашем проекте, и наш менеджер свяжется с вами в течение рабочего дня.",
2786
- supportTitle: "Отправить запрос в поддержку",
2787
- supportDescription: "Опишите проблему — наша команда ответит в течение рабочего дня.",
2788
- thankYouSalesTitle: "Спасибо — мы получили ваше сообщение!",
2789
- thankYouSalesMessage: "Наш менеджер свяжется с вами в течение рабочего дня.",
2790
- thankYouSupportTitle: "Готово — ваш запрос в очереди.",
2791
- thankYouSupportMessage: "Инженер поддержки скоро свяжется с вами. Сохраните эту страницу, если у вас есть скриншоты.",
2792
- field: {
2793
- firstName: "Имя",
2794
- lastName: "Фамилия",
2795
- email: "Рабочий email",
2796
- phone: "Телефон",
2797
- jobTitle: "Должность",
2798
- company: "Компания",
2799
- website: "Сайт",
2800
- industry: "Отрасль",
2801
- companySize: "Размер компании",
2802
- howCanWeHelp: "Как мы можем помочь?",
2803
- subject: "Тема",
2804
- description: "Описание",
2805
- issueType: "Тип проблемы",
2806
- priority: "Приоритет",
2807
- },
2808
- industry: {
2809
- technology: "Технологии",
2810
- software: "Программное обеспечение / SaaS",
2811
- finance: "Финансы",
2812
- healthcare: "Здравоохранение",
2813
- retail: "Розница",
2814
- other: "Другое",
2815
- },
2816
- issueType: {
2817
- question: "Вопрос",
2818
- problem: "Проблема",
2819
- bug: "Ошибка",
2820
- feature_request: "Пожелание",
2821
- },
2822
- priority: {
2823
- low: "Низкий",
2824
- medium: "Средний",
2825
- high: "Высокий",
2826
- critical: "Критический",
2827
- },
2828
- },
2829
3153
  },
2830
3154
  connectAgent: {
2831
3155
  disabled: {
@@ -2871,6 +3195,10 @@ const ru = {
2871
3195
  noImportableFields: "У этого объекта нет полей, доступных для импорта.",
2872
3196
  schemaReadFailed: "Не удалось прочитать схему объекта.",
2873
3197
  imported: "Импортировано строк: {{count}} в {{object}}.",
3198
+ imported_one: "Импортировано строк: {{count}} в {{object}}.",
3199
+ imported_few: "Импортировано строк: {{count}} в {{object}}.",
3200
+ imported_many: "Импортировано строк: {{count}} в {{object}}.",
3201
+ imported_other: "Импортировано строк: {{count}} в {{object}}.",
2874
3202
  importFrom: "Импортировать реальные строки из",
2875
3203
  into: "в",
2876
3204
  opening: "Открытие…",
@@ -2884,6 +3212,80 @@ const ru = {
2884
3212
  openProduction: "Открыть продакшн",
2885
3213
  manageEnvironments: "Управление окружениями",
2886
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
+ },
2887
3289
  aiModelStatus: {
2888
3290
  summary: "Сборка / вопросы используют {{conversational}} ({{conversationalSource}}); структурированный вывод — {{structured}} ({{structuredSource}}).",
2889
3291
  summaryRouting: "Политика маршрутизации: бесплатные тарифы → {{free}}, платные тарифы → {{paid}}.",
@@ -2901,6 +3303,117 @@ const ru = {
2901
3303
  sourceInherits: "как у build/ask",
2902
3304
  sourcePinned: "закреплено через {{source}}",
2903
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
+ },
2904
3417
  chatbotError: {
2905
3418
  title: "Ошибка ответа",
2906
3419
  fallbackDetail: "Что-то пошло не так. Попробуйте ещё раз.",
@@ -2938,6 +3451,7 @@ const ru = {
2938
3451
  retry: "Повторить",
2939
3452
  errors: {
2940
3453
  expired: "Срок действия запроса истёк до подтверждения. Начните заново.",
3454
+ accessDenied: "Запрос на подключение отклонён. Начните заново.",
2941
3455
  bindFailed: "Не удалось выполнить привязку.",
2942
3456
  deviceCodeFailed: "Не удалось запросить код устройства.",
2943
3457
  },
@@ -2980,7 +3494,7 @@ const ru = {
2980
3494
  },
2981
3495
  title: "Маркетплейс приложений",
2982
3496
  subtitle: "Просматривайте одобренные приложения из каталога ObjectStack. Нажмите на приложение, чтобы увидеть подробности и установить его.",
2983
- searchPlaceholder: "Поиск приложений по имени или ID манифеста…",
3497
+ searchPlaceholder: 'Поиск приложений по имени или ID приложения…',
2984
3498
  searchAria: "Поиск в маркетплейсе",
2985
3499
  installed: "Установлено",
2986
3500
  installedCount: "Установлено ({{count}})",
@@ -3003,10 +3517,16 @@ const ru = {
3003
3517
  installedBadge: "Установлено v{{version}}",
3004
3518
  load: {
3005
3519
  failed: "Не удалось загрузить маркетплейс",
3006
- failedHint: "По умолчанию этот рантайм указывает на публичное облако ObjectStack. Убедитесь, что рантайм онлайн.",
3520
+ failedHintConfigured: "Этот рантайм обращается к маркетплейсу через control plane по адресу {{url}}. Убедитесь, что он доступен и достижим отсюда.",
3521
+ failedHintSameOrigin: "Этот рантайм сам обслуживает каталог маркетплейса. Убедитесь, что рантайм онлайн.",
3007
3522
  packageFailed: "Не удалось загрузить пакет",
3008
3523
  notFound: "Не найдено.",
3009
3524
  },
3525
+ disabled: {
3526
+ title: "Маркетплейс приложений отключён",
3527
+ description: "Для этого рантайма не настроен маркетплейс, поэтому здесь нечего просматривать или устанавливать.",
3528
+ hint: "Это ожидаемое состояние, когда рантайм запущен с <code>OS_CLOUD_URL=off</code> (или <code>none</code>, <code>local</code>, <code>disabled</code>). Чтобы включить маркетплейс, укажите в <code>OS_CLOUD_URL</code> адрес control plane и перезапустите рантайм.",
3529
+ },
3010
3530
  detail: {
3011
3531
  homepage: "Сайт",
3012
3532
  installedV: "Установлено · v{{version}}",
@@ -3022,10 +3542,19 @@ const ru = {
3022
3542
  purgeSampleData: 'Удалить демоданные',
3023
3543
  purgeConfirm: 'Удалить все демонстрационные записи, созданные этим пакетом? Записи, добавленные пользователем, НЕ будут затронуты.',
3024
3544
  purgeSuccess: 'Удалено демонстрационных записей: {{count}}.',
3545
+ purgeSuccess_one: 'Удалено демонстрационных записей: {{count}}.',
3546
+ purgeSuccess_few: 'Удалено демонстрационных записей: {{count}}.',
3547
+ purgeSuccess_many: 'Удалено демонстрационных записей: {{count}}.',
3548
+ purgeSuccess_other: 'Удалено демонстрационных записей: {{count}}.',
3025
3549
  purgeNoData: 'Демонстрационные записи для удаления не найдены.',
3026
3550
  reseedQueued: 'Демоданные будут перезагружены при следующем доступе к среде.',
3027
3551
  reseedLocalSuccess: 'Демоданные перезагружены: добавлено {{inserted}}, обновлено {{updated}}.',
3028
3552
  reseedPartialErrors: '(не удалось записать записей: {{count}})',
3553
+ reseedPartialErrors_one: '(не удалось записать записей: {{count}})',
3554
+ reseedPartialErrors_few: '(не удалось записать записей: {{count}})',
3555
+ reseedPartialErrors_many: '(не удалось записать записей: {{count}})',
3556
+ reseedPartialErrors_other: '(не удалось записать записей: {{count}})',
3557
+ sampleDataKernelUnavailable: 'У этой control plane нет ядра среды, поэтому здесь нельзя перезагрузить или удалить демоданные. Выполните это действие в собственном рантайме среды.',
3029
3558
  updateAvailable: 'Доступно обновление',
3030
3559
  },
3031
3560
  action: {
@@ -3078,7 +3607,8 @@ const ru = {
3078
3607
  reviewed: "Проверено и одобрено",
3079
3608
  unreviewed: "Ещё не проверено",
3080
3609
  signed: "Подписано",
3081
- grantsIntro: "При установке пакет получит:",
3610
+ grantsIntro: "Пакет запрашивает:",
3611
+ notEnforced: "Список записывается при установке и подтверждается заново, если более поздняя версия запросит больше, но среда выполнения пока не ограничивает пакет этим списком.",
3082
3612
  services: "Сервисы платформы",
3083
3613
  hooks: "Хуки жизненного цикла",
3084
3614
  network: "Доступ к сети",
@@ -3117,30 +3647,23 @@ const ru = {
3117
3647
  storage: "Хранилище",
3118
3648
  other: "Другое",
3119
3649
  },
3120
- pricing: {
3121
- free: "Бесплатно",
3122
- freemium: "Freemium",
3123
- paid: "Платно",
3124
- subscription: "Подписка",
3125
- "usage-based": "По использованию",
3126
- "contact-sales": "Связаться с продажами",
3127
- },
3128
3650
  relativeTime: {
3129
3651
  today: "сегодня",
3130
3652
  daysAgo: "{{count}} д назад",
3131
3653
  monthsAgo: "{{count}} мес назад",
3654
+ monthsAgo_one: "{{count}} мес назад",
3655
+ monthsAgo_few: "{{count}} мес назад",
3656
+ monthsAgo_many: "{{count}} мес назад",
3657
+ monthsAgo_other: "{{count}} мес назад",
3132
3658
  yearsAgo: "{{count}} лет назад",
3659
+ yearsAgo_one: "{{count}} год назад",
3660
+ yearsAgo_few: "{{count}} года назад",
3661
+ yearsAgo_many: "{{count}} лет назад",
3662
+ yearsAgo_other: "{{count}} года назад",
3133
3663
  },
3134
3664
  },
3135
- approvals: {
3136
- approve: 'Утвердить',
3137
- reject: 'Отклонить',
3138
- comment: 'Комментарий (необязательно)',
3139
- approveSuccess: 'Утверждено',
3140
- rejectSuccess: 'Отклонено',
3141
- rejectConfirm: 'Отклонить этот запрос на согласование?',
3142
- },
3143
3665
  approvalsInbox: {
3666
+ recordUnresolvable: 'Эту запись невозможно открыть',
3144
3667
  loadMore: 'Загрузить ещё',
3145
3668
  loadingMore: 'Загрузка…',
3146
3669
  loadedOf: 'Загружено {{loaded}} из {{total}}',
@@ -3159,6 +3682,10 @@ const ru = {
3159
3682
  requestInfoSent: 'Возвращено заявителю за дополнениями',
3160
3683
  remindBtn: 'Напомнить',
3161
3684
  remindSuccess: 'Напоминание отправлено: {{count}}',
3685
+ remindSuccess_one: 'Напоминание отправлено: {{count}}',
3686
+ remindSuccess_few: 'Напоминание отправлено: {{count}}',
3687
+ remindSuccess_many: 'Напоминание отправлено: {{count}}',
3688
+ remindSuccess_other: 'Напоминание отправлено: {{count}}',
3162
3689
  remindThrottled: 'Напоминание уже отправлялось недавно — попробуйте позже.',
3163
3690
  replyPlaceholder: 'Ответить по этому запросу…',
3164
3691
  slaRemaining: 'SLA: осталось {{dur}}',
@@ -3175,6 +3702,10 @@ const ru = {
3175
3702
  progressApprovals: 'Согласования — {{got}} из {{need}}',
3176
3703
  progressGroups: 'Ход визирования — {{got}} из {{need}} групп',
3177
3704
  progressEligible: 'Доступных согласующих: {{count}}',
3705
+ progressEligible_one: 'Доступных согласующих: {{count}}',
3706
+ progressEligible_few: 'Доступных согласующих: {{count}}',
3707
+ progressEligible_many: 'Доступных согласующих: {{count}}',
3708
+ progressEligible_other: 'Доступных согласующих: {{count}}',
3178
3709
  progressBar: 'Ход решения',
3179
3710
  declaredActions: 'Действия',
3180
3711
  attachmentChip: 'Вложение',
@@ -3206,6 +3737,10 @@ const ru = {
3206
3737
  filterCount: '{{shown}} из {{total}}',
3207
3738
  selected: 'выбрано',
3208
3739
  actionableCount: '({{count}} доступно)',
3740
+ actionableCount_one: '({{count}} доступно)',
3741
+ actionableCount_few: '({{count}} доступно)',
3742
+ actionableCount_many: '({{count}} доступно)',
3743
+ actionableCount_other: '({{count}} доступно)',
3209
3744
  selectAll: 'Выбрать все',
3210
3745
  selectRow: 'Выбрать запрос',
3211
3746
  colRequest: 'Запрос',
@@ -3246,12 +3781,19 @@ const ru = {
3246
3781
  submittedAgo: 'Отправлен {{when}}',
3247
3782
  completedAt: 'Завершён {{when}}',
3248
3783
  waitingOn: 'Ожидает решения',
3784
+ approverNameSeparator: ', ',
3785
+ approverUnstaffed: '{{seat}} (сейчас не занята)',
3249
3786
  history: 'История',
3250
3787
  noActions: 'Действий пока нет.',
3251
3788
  actSubmit: 'Отправлен',
3252
3789
  actApprove: 'Согласован',
3253
3790
  actReject: 'Отклонён',
3254
3791
  actRecall: 'Отозван',
3792
+ overrideActionLabel: '{{action}} (по праву администратора)',
3793
+ overrideNotice: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а все согласующие, ещё не принявшие решение, будут пропущены. Решение будет записано как административное переопределение.',
3794
+ overrideNoticeWho: 'У вас нет места согласующего на этом шаге. Продолжив, вы воспользуетесь правом администратора: шаг будет немедленно завершён, а согласующие, ещё не принявшие решение, будут пропущены — {{who}}. Решение будет записано как административное переопределение.',
3795
+ viaOverrideChip: 'Переопределение администратора',
3796
+ viaOverrideHint: 'У исполнителя не было места согласующего на этом шаге — допущен по пути административного переопределения.',
3255
3797
  rawData: 'Исходные данные (JSON)',
3256
3798
  copy: 'Копировать',
3257
3799
  copied: 'Скопировано',
@@ -3272,11 +3814,27 @@ const ru = {
3272
3814
  approveN: 'Согласовать {{count}}',
3273
3815
  rejectN: 'Отклонить {{count}}',
3274
3816
  bulkApproveTitle: 'Согласовать {{count}} запросов?',
3817
+ bulkApproveTitle_one: 'Согласовать {{count}} запрос?',
3818
+ bulkApproveTitle_few: 'Согласовать {{count}} запроса?',
3819
+ bulkApproveTitle_many: 'Согласовать {{count}} запросов?',
3820
+ bulkApproveTitle_other: 'Согласовать {{count}} запроса?',
3275
3821
  bulkApproveBody: 'Каждый запрос согласуется от вашего имени, и поток продолжится по ветке согласования.',
3276
3822
  bulkRejectTitle: 'Отклонить {{count}} запросов?',
3823
+ bulkRejectTitle_one: 'Отклонить {{count}} запрос?',
3824
+ bulkRejectTitle_few: 'Отклонить {{count}} запроса?',
3825
+ bulkRejectTitle_many: 'Отклонить {{count}} запросов?',
3826
+ bulkRejectTitle_other: 'Отклонить {{count}} запроса?',
3277
3827
  bulkRejectBody: 'Выбранные запросы будут отклонены, заявители получат уведомления.',
3278
3828
  bulkApproved: 'Согласовано запросов: {{count}}',
3829
+ bulkApproved_one: 'Согласовано запросов: {{count}}',
3830
+ bulkApproved_few: 'Согласовано запросов: {{count}}',
3831
+ bulkApproved_many: 'Согласовано запросов: {{count}}',
3832
+ bulkApproved_other: 'Согласовано запросов: {{count}}',
3279
3833
  bulkRejected: 'Отклонено запросов: {{count}}',
3834
+ bulkRejected_one: 'Отклонено запросов: {{count}}',
3835
+ bulkRejected_few: 'Отклонено запросов: {{count}}',
3836
+ bulkRejected_many: 'Отклонено запросов: {{count}}',
3837
+ bulkRejected_other: 'Отклонено запросов: {{count}}',
3280
3838
  bulkPartial: 'Успешно: {{ok}}, с ошибкой: {{fail}}: {{which}}',
3281
3839
  rejectOneTitle: 'Отклонить «{{title}}»?',
3282
3840
  rejectOneBody: 'Запрос будет отклонён, заявитель получит уведомление.',
@@ -3301,8 +3859,20 @@ const ru = {
3301
3859
  alreadyDecided: 'Этот запрос уже обработан. Обновите список.',
3302
3860
  justNow: 'только что',
3303
3861
  minutesAgo: '{{count}} мин назад',
3862
+ minutesAgo_one: '{{count}} мин назад',
3863
+ minutesAgo_few: '{{count}} мин назад',
3864
+ minutesAgo_many: '{{count}} мин назад',
3865
+ minutesAgo_other: '{{count}} мин назад',
3304
3866
  hoursAgo: '{{count}} ч назад',
3867
+ hoursAgo_one: '{{count}} ч назад',
3868
+ hoursAgo_few: '{{count}} ч назад',
3869
+ hoursAgo_many: '{{count}} ч назад',
3870
+ hoursAgo_other: '{{count}} ч назад',
3305
3871
  daysAgo: '{{count}} дн назад',
3872
+ daysAgo_one: '{{count}} дн назад',
3873
+ daysAgo_few: '{{count}} дн назад',
3874
+ daysAgo_many: '{{count}} дн назад',
3875
+ daysAgo_other: '{{count}} дн назад',
3306
3876
  },
3307
3877
  preview: {
3308
3878
  empty: {
@@ -3337,7 +3907,20 @@ const ru = {
3337
3907
  detailNone: 'Различий не обнаружено — черновик совпадает с опубликованной версией.',
3338
3908
  detailChangedKeys: 'Также изменено:',
3339
3909
  confirmNote: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
3910
+ confirmNote_one: 'Публикация атомарно выпускает {{count}} ожидающий черновик этого пакета.',
3911
+ confirmNote_few: 'Публикация атомарно выпускает все {{count}} ожидающих черновика этого пакета.',
3912
+ confirmNote_many: 'Публикация атомарно выпускает все {{count}} ожидающих черновиков этого пакета.',
3913
+ confirmNote_other: 'Публикация атомарно выпускает {{count}} ожидающего черновика этого пакета.',
3340
3914
  publishConfirm: 'Опубликовать всё',
3915
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3916
+ // the confirm button so a refusal the door would issue is read BEFORE
3917
+ // the click rather than as a toast after the batch rolled back.
3918
+ securityBlockTitle: 'Публикация будет отклонена — {{count}} элемент(ов) требуют решения',
3919
+ securityBlockTitle_one: 'Публикация будет отклонена — {{count}} элемент требует решения',
3920
+ securityBlockTitle_few: 'Публикация будет отклонена — {{count}} элемента требуют решения',
3921
+ securityBlockTitle_many: 'Публикация будет отклонена — {{count}} элементов требуют решения',
3922
+ securityBlockTitle_other: 'Публикация будет отклонена — {{count}} элемента требуют решения',
3923
+ securityBlockWhere: 'Исправьте это в объекте в разделе «Настройки → Общий доступ к записям» и опубликуйте снова.',
3341
3924
  },
3342
3925
  // ADR-0045 — the materialized-but-unlisted app banner
3343
3926
  // (UnpublishedAppBar.tsx), sibling of draftBar above.
@@ -3361,7 +3944,7 @@ const ru = {
3361
3944
  revertLabel: 'Изменение отменено',
3362
3945
  applyLabel: 'Изменение сборки',
3363
3946
  revert: 'отмена',
3364
- items: 'элементов',
3947
+ items: 'Элементов: {{count}}',
3365
3948
  revertAction: 'Отменить',
3366
3949
  reverted: 'Отменено — изменение возвращено.',
3367
3950
  revertFailed: 'Не удалось отменить',
@@ -3384,22 +3967,33 @@ const ru = {
3384
3967
  noResults: "Нет результатов",
3385
3968
  searchField: "Поиск {{label}}…",
3386
3969
  enterId: "Введите ID {{label}}",
3970
+ addValue: "Введите значение и нажмите Enter",
3971
+ removeValue: "Удалить {{value}}",
3972
+ rangeStart: "От",
3973
+ rangeEnd: "До",
3387
3974
  operators: {
3388
3975
  equals: "Равно",
3389
- notEquals: "Не равно",
3976
+ not_equals: "Не равно",
3390
3977
  contains: "Содержит",
3391
- notContains: "Не содержит",
3392
- isEmpty: "Пусто",
3393
- isNotEmpty: "Не пусто",
3394
- greaterThan: "Больше",
3395
- lessThan: "Меньше",
3396
- greaterOrEqual: "Больше или равно",
3397
- 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: "Меньше или равно",
3398
3986
  before: "До",
3399
3987
  after: "После",
3400
3988
  between: "Между",
3401
3989
  in: "В списке",
3402
- notIn: "Не в списке",
3990
+ not_in: "Не в списке",
3991
+ starts_with: "Начинается с",
3992
+ ends_with: "Заканчивается на",
3993
+ is_null: "Равно null",
3994
+ is_not_null: "Не равно null",
3995
+ exists: "Задано",
3996
+ notExists: "Не задано",
3403
3997
  },
3404
3998
  },
3405
3999
  sortBuilder: {
@@ -3413,7 +4007,10 @@ const ru = {
3413
4007
  },
3414
4008
  collaboration: {
3415
4009
  commentCount: "Комментариев: {{count}}",
3416
- commentCountOne: "{{count}} комментарий",
4010
+ commentCount_one: "{{count}} комментарий",
4011
+ commentCount_few: "{{count}} комментария",
4012
+ commentCount_many: "{{count}} комментариев",
4013
+ commentCount_other: "{{count}} комментария",
3417
4014
  resolvedSuffix: " · Решено",
3418
4015
  sortComments: "Сортировка комментариев",
3419
4016
  sortOldest: "Сначала старые",
@@ -3422,11 +4019,26 @@ const ru = {
3422
4019
  reopen: "Открыть заново",
3423
4020
  justNow: "только что",
3424
4021
  minutesAgo: "{{count}} мин назад",
4022
+ minutesAgo_one: "{{count}} мин назад",
4023
+ minutesAgo_few: "{{count}} мин назад",
4024
+ minutesAgo_many: "{{count}} мин назад",
4025
+ minutesAgo_other: "{{count}} мин назад",
3425
4026
  hoursAgo: "{{count}} ч назад",
4027
+ hoursAgo_one: "{{count}} ч назад",
4028
+ hoursAgo_few: "{{count}} ч назад",
4029
+ hoursAgo_many: "{{count}} ч назад",
4030
+ hoursAgo_other: "{{count}} ч назад",
3426
4031
  daysAgo: "{{count}} д назад",
4032
+ daysAgo_one: "{{count}} д назад",
4033
+ daysAgo_few: "{{count}} д назад",
4034
+ daysAgo_many: "{{count}} д назад",
4035
+ daysAgo_other: "{{count}} д назад",
3427
4036
  edited: "(изменено)",
3428
4037
  reactionCount: "Реакций: {{count}}",
3429
- reactionCountOne: "{{count}} реакция",
4038
+ reactionCount_one: "{{count}} реакция",
4039
+ reactionCount_few: "{{count}} реакции",
4040
+ reactionCount_many: "{{count}} реакций",
4041
+ reactionCount_other: "{{count}} реакции",
3430
4042
  addThumbsUp: "Поставить лайк",
3431
4043
  reply: "Ответить",
3432
4044
  reactThumbsUp: "Отреагировать лайком",
@@ -3437,9 +4049,15 @@ const ru = {
3437
4049
  commentPlaceholder: "Добавьте комментарий… (@ — упоминание)",
3438
4050
  send: "Отправить",
3439
4051
  presentUserCount: "Присутствует пользователей: {{count}}",
3440
- presentUserCountOne: "Присутствует {{count}} пользователь",
4052
+ presentUserCount_one: "Присутствует {{count}} пользователь",
4053
+ presentUserCount_few: "Присутствуют {{count}} пользователя",
4054
+ presentUserCount_many: "Присутствует {{count}} пользователей",
4055
+ presentUserCount_other: "Присутствует {{count}} пользователя",
3441
4056
  moreUserCount: "Ещё пользователей: {{count}}",
3442
- moreUserCountOne: "Ещё {{count}} пользователь",
4057
+ moreUserCount_one: "Ещё {{count}} пользователь",
4058
+ moreUserCount_few: "Ещё {{count}} пользователя",
4059
+ moreUserCount_many: "Ещё {{count}} пользователей",
4060
+ moreUserCount_other: "Ещё {{count}} пользователя",
3443
4061
  userStatusTitle: "{{name}} ({{status}})",
3444
4062
  statusActive: "активен",
3445
4063
  statusIdle: "бездействует",
@@ -3447,6 +4065,18 @@ const ru = {
3447
4065
  },
3448
4066
  wizard: {
3449
4067
  missingRequired: "Заполните обязательные поля: {{fields}}",
4068
+ back: "Назад",
4069
+ submitting: "Отправка…",
4070
+ stepFallback: "Шаг {{n}}",
4071
+ progressLabel: "Прогресс",
4072
+ emptyStep: "Для этого шага не настроены поля",
4073
+ },
4074
+ flowRunner: {
4075
+ title: 'Ввод',
4076
+ submitting: 'Отправка…',
4077
+ saveAndContinue: 'Сохранить и продолжить',
4078
+ nextStep: 'Сохранено — следующий шаг',
4079
+ completed: 'Поток «{{flow}}» завершён',
3450
4080
  },
3451
4081
  appManagement: {
3452
4082
  title: "Приложения",
@@ -3497,5 +4127,49 @@ const ru = {
3497
4127
  bulkOperationFailed: "Массовая операция не выполнена: {{reason}}",
3498
4128
  },
3499
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
+ },
3500
4174
  };
3501
4175
  export default ru;