@object-ui/i18n 17.6.0 → 17.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +4320 -0
  2. package/README.md +192 -13
  3. package/dist/builtinAggregateLabels.d.ts +40 -0
  4. package/dist/builtinAggregateLabels.js +23 -0
  5. package/dist/currency.d.ts +27 -3
  6. package/dist/currency.js +28 -4
  7. package/dist/fallbackInterpolation.d.ts +79 -0
  8. package/dist/fallbackInterpolation.js +124 -0
  9. package/dist/i18n.d.ts +27 -1
  10. package/dist/i18n.js +99 -16
  11. package/dist/index.d.ts +7 -13
  12. package/dist/index.js +41 -17
  13. package/dist/locales/ar.d.ts +946 -113
  14. package/dist/locales/ar.js +1095 -161
  15. package/dist/locales/de.d.ts +618 -113
  16. package/dist/locales/de.js +715 -134
  17. package/dist/locales/en.d.ts +632 -127
  18. package/dist/locales/en.js +1044 -162
  19. package/dist/locales/es.d.ts +700 -113
  20. package/dist/locales/es.js +794 -130
  21. package/dist/locales/fr.d.ts +700 -113
  22. package/dist/locales/fr.js +795 -132
  23. package/dist/locales/index.d.ts +6990 -1169
  24. package/dist/locales/index.js +48 -9
  25. package/dist/locales/ja.d.ts +618 -113
  26. package/dist/locales/ja.js +708 -128
  27. package/dist/locales/ko.d.ts +618 -113
  28. package/dist/locales/ko.js +712 -132
  29. package/dist/locales/pt.d.ts +700 -113
  30. package/dist/locales/pt.js +794 -130
  31. package/dist/locales/registry.d.ts +102 -0
  32. package/dist/locales/registry.js +220 -0
  33. package/dist/locales/rtl.d.ts +24 -0
  34. package/dist/locales/rtl.js +26 -0
  35. package/dist/locales/ru.d.ts +782 -113
  36. package/dist/locales/ru.js +910 -152
  37. package/dist/locales/zh.d.ts +635 -130
  38. package/dist/locales/zh.js +725 -131
  39. package/dist/pickLocalized.d.ts +30 -0
  40. package/dist/pickLocalized.js +39 -0
  41. package/dist/provider.d.ts +101 -12
  42. package/dist/provider.js +335 -50
  43. package/dist/translateFn.d.ts +29 -0
  44. package/dist/translateFn.js +8 -0
  45. package/dist/useDisplayLocale.d.ts +11 -0
  46. package/dist/useDisplayLocale.js +11 -0
  47. package/dist/useObjectLabel.d.ts +40 -18
  48. package/dist/useObjectLabel.js +46 -14
  49. package/dist/useSafeTranslation.js +40 -42
  50. package/dist/utils/formatting.d.ts +16 -0
  51. package/dist/utils/formatting.js +23 -3
  52. package/dist/utils/spec-formatters.d.ts +13 -23
  53. package/dist/utils/spec-formatters.js +41 -2
  54. package/dist/utils/spec-translations.d.ts +16 -3
  55. package/dist/utils/spec-translations.js +52 -13
  56. package/package.json +12 -6
@@ -19,10 +19,12 @@ const ko = {
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: '플랫폼',
@@ -39,12 +41,16 @@ const ko = {
39
41
  more: "+{{count}} 더보기",
40
42
  objects: "{{count}}개 오브젝트",
41
43
  objects_one: "{{count}}개 오브젝트",
44
+ objects_other: "{{count}}개 오브젝트",
42
45
  fields: "{{count}}개 필드 규칙",
43
46
  fields_one: "{{count}}개 필드 규칙",
47
+ fields_other: "{{count}}개 필드 규칙",
44
48
  rls: "{{count}}개 RLS 정책",
45
49
  rls_one: "{{count}}개 RLS 정책",
50
+ rls_other: "{{count}}개 RLS 정책",
46
51
  tabs: "{{count}}개 탭 규칙",
47
52
  tabs_one: "{{count}}개 탭 규칙",
53
+ tabs_other: "{{count}}개 탭 규칙",
48
54
  adminScope: "위임 관리가 구성됨",
49
55
  designInStudio: "Studio에서 디자인 →",
50
56
  designInStudioHint: "Studio에서 디자인",
@@ -63,7 +69,8 @@ const ko = {
63
69
  selectFirst: '먼저 {{fields}}을(를) 선택하세요',
64
70
  selectRecord: '레코드 선택',
65
71
  recordCount: '레코드 {{count}}개',
66
- recordCountOne: '레코드 1개',
72
+ recordCount_one: '레코드 {{count}}개',
73
+ recordCount_other: '레코드 {{count}}개',
67
74
  pageOf: '{{total}}페이지 중 {{current}}페이지',
68
75
  filters: '필터',
69
76
  clear: '지우기',
@@ -116,7 +123,8 @@ const ko = {
116
123
  closePanel: "패널 닫기",
117
124
  resizeDrawer: "패널 너비 조정",
118
125
  itemCount: "{{count}}개 항목",
119
- itemCountOne: "{{count}}개 항목",
126
+ itemCount_one: "{{count}}개 항목",
127
+ itemCount_other: "{{count}}개 항목",
120
128
  toggleSidebar: "사이드바 전환",
121
129
  package: "패키지",
122
130
  done: "완료",
@@ -124,6 +132,16 @@ const ko = {
124
132
  record: "레코드",
125
133
  retry: "다시 시도",
126
134
  printDialogHint: "브라우저의 인쇄 대화 상자를 엽니다(PDF 내보내기가 아닙니다)",
135
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
136
+ // there are two conditions: a reported `total` states the fact with BOTH
137
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
138
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
139
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
140
+ // headroom is deliberately NOT restated here — it moves on every
141
+ // re-baseline, and the figure that was here went stale.
142
+ // `pnpm check:eager-closure` prints it.
143
+ rowCeilingNote: "전체 {{total}}개 중 처음 {{shown}}개를 표시합니다. 필터를 좁히세요.",
144
+ rowCeilingNoteUnknownTotal: "처음 {{shown}}개를 표시합니다. 필터를 좁히세요.",
127
145
  },
128
146
  actions: {
129
147
  decisionOutput: {
@@ -135,6 +153,14 @@ const ko = {
135
153
  acknowledge: '저장했습니다',
136
154
  copyAll: '모두 복사',
137
155
  },
156
+ notAvailableHere: '"{{action}}"은(는) 현재 페이지에서 사용할 수 없습니다.',
157
+ completedSuccessfully: '작업이 완료되었습니다',
158
+ failed: '작업 실패',
159
+ parallelFailed: '하나 이상의 병렬 작업이 실패했습니다',
160
+ undo: '실행 취소',
161
+ undone: '변경 실행 취소됨',
162
+ undoneOperation: '실행 취소: {{description}}',
163
+ redoneOperation: '다시 실행: {{description}}',
138
164
  },
139
165
  validation: {
140
166
  required: "{{field}}은(는) 필수입니다",
@@ -152,19 +178,45 @@ const ko = {
152
178
  },
153
179
  form: {
154
180
  noPermissionToSave: "이 레코드를 저장할 권한이 없습니다.",
181
+ noPermissionToCreate: "{{object}} 생성 권한이 없습니다. 필드는 읽기 전용입니다.",
182
+ noPermissionToEdit: "{{object}} 편집 권한이 없습니다. 필드는 읽기 전용입니다.",
155
183
  submitFailed: "저장하지 못했습니다. 다시 시도해 주세요.",
184
+ uploadInFlight: "업로드가 완료된 후에 저장하세요.",
185
+ clearedOnHide: "현재 값에 더 이상 해당하지 않는 항목을 비웠습니다: {{fields}}",
186
+ visibleWhenFaulted: "제출할 수 없습니다: {{fields}}의 visibleWhen 규칙을 평가할 수 없습니다. 이 양식을 제출하려면 먼저 규칙을 수정해야 합니다.",
156
187
  discardTitle: "변경 내용을 버릴까요?",
157
188
  discardMessage: "저장하지 않은 변경 내용이 있습니다. 지금 이 양식을 닫으면 편집 내용이 사라집니다.",
158
189
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
159
190
  // description, used when the form declares no `description` of its own.
160
191
  dialogDescriptionFallback: "양식 필드를 작성한 다음 제출하거나 취소하세요.",
192
+ deniedDescription: "이 필드를 편집할 권한이 없습니다.",
193
+ masterDetail: {
194
+ loadingColumns: "열 로드 중…",
195
+ subtotal: "소계",
196
+ tax: "세금({{rate}}%)",
197
+ total: "합계",
198
+ lineItem: "라인 항목",
199
+ rowTitle: "{{title}} — {{row}}행",
200
+ applyRow: "적용",
201
+ editorDescription: "레코드와 라인 항목을 입력한 다음 저장하세요.",
202
+ noChildObject: "이 컬렉션에 하위 개체가 구성되지 않았습니다. {{property}}을(를) 행을 나열할 개체로 설정하세요.",
203
+ schemaUnavailable: "{{object}}의 스키마를 불러올 수 없어 이 컬렉션에 표시할 열이 없습니다. 개체가 존재하고 읽을 수 있는지 확인한 다음 다시 불러오세요.",
204
+ noRelationshipField: "{{object}}이(가) {{parent}}에 어떻게 연결되는지 확인할 수 없습니다. 부모를 참조하는 lookup 또는 master_detail 필드가 없습니다. 이 컬렉션의 {{property}}을(를) 부모 레코드를 보유한 필드로 설정하세요.",
205
+ },
206
+ lineItems: {
207
+ title: "라인 항목",
208
+ saveRecordFirst: "라인 항목을 추가하려면 먼저 레코드를 저장하세요.",
209
+ notLoaded: "이 레코드의 라인 항목을 불러오지 않았습니다.",
210
+ loadFailed: "라인 항목을 불러오지 못했습니다",
211
+ saveFailed: "라인 항목을 저장하지 못했습니다",
212
+ noChildObject: "이 패널에 하위 개체가 구성되지 않았습니다. {{property}}을(를) 행을 나열할 개체로 설정하세요.",
213
+ },
161
214
  keepEditing: "계속 편집",
162
215
  discard: "버리기",
163
216
  conflictTitle: "저장 충돌",
164
217
  conflictMessage: "편집하는 동안 다른 사용자가 이 레코드를 변경했습니다. 덮어쓰면 상대방의 변경 내용이 내 내용으로 대체됩니다.",
165
218
  conflictLatestVersion: "상대방 저장 시각: {{time}}",
166
219
  conflictOverwrite: "덮어쓰기",
167
- addItem: "항목 추가",
168
220
  removeItem: "항목 제거",
169
221
  fieldRequired: "이 필드는 필수입니다",
170
222
  invalidFormat: "형식이 올바르지 않습니다",
@@ -182,6 +234,12 @@ const ko = {
182
234
  createSuccess: "{{object}} 생성됨",
183
235
  updateSuccess: "{{object}} 업데이트됨",
184
236
  deleteSuccess: "{{object}} 삭제됨",
237
+ created: "생성됨",
238
+ saved: "저장됨",
239
+ savedNamed: "{{title}} 저장됨",
240
+ submitted: "제출됨",
241
+ errorLoading: "양식 로딩 오류",
242
+ navigateRefused: "이 양식에 선언된 `navigateOnSuccess` 대상이 거부되어 이동하지 않았습니다.",
185
243
  fullscreen: {
186
244
  title: "텍스트 편집",
187
245
  description: "전체 텍스트 값을 편집한 다음 변경 사항을 저장하거나 취소하세요.",
@@ -206,6 +264,8 @@ const ko = {
206
264
  },
207
265
  relativeDate: {
208
266
  overdue: "기한 초과 {{count}}일",
267
+ overdue_one: "기한 초과 {{count}}일",
268
+ overdue_other: "기한 초과 {{count}}일",
209
269
  },
210
270
  file: {
211
271
  dragDropHere: '파일을 여기로 끌어다 놓기',
@@ -222,6 +282,7 @@ const ko = {
222
282
  remove: '{{name}} 제거',
223
283
  exceedsMaxSize: '"{{name}}"이(가) 최대 크기({{max}} MB)를 초과합니다',
224
284
  uploadFailed: '"{{name}}" 업로드 실패: {{error}}',
285
+ uploadIncomplete: '"{{name}}" 업로드가 완료되지 않았습니다: 파일 ID가 반환되지 않아 저장된 내용이 없습니다',
225
286
  },
226
287
  richText: {
227
288
  format: "형식: {{format}}",
@@ -240,7 +301,7 @@ const ko = {
240
301
  },
241
302
  recipient: {
242
303
  selectTypeFirst: "먼저 수신자 유형을 선택하세요.",
243
- loading: "불러오는 중…",
304
+ loading: "로딩 중…",
244
305
  search: "검색…",
245
306
  empty: "일치하는 항목 없음",
246
307
  select: "수신자 선택",
@@ -249,6 +310,9 @@ const ko = {
249
310
  selectBusinessUnit: "사업 단위 선택",
250
311
  selectPosition: "직위 선택",
251
312
  selectUnitAndSubordinates: "사업 단위 선택",
313
+ selectField: "사용자 필드 선택",
314
+ noUserFields: "이 객체에는 사용자 필드가 없습니다",
315
+ fieldNotUserTyped: "{{name}} — 사용자 필드가 아닙니다",
252
316
  },
253
317
  filterCondition: {
254
318
  selectObjectFirst: "먼저 객체를 선택하세요.",
@@ -259,6 +323,26 @@ const ko = {
259
323
  editAsJson: "JSON으로 편집",
260
324
  useVisualBuilder: "비주얼 빌더 사용",
261
325
  },
326
+ object: {
327
+ invalidJson: "잘못된 JSON",
328
+ },
329
+ location: {
330
+ refusedFormat: "저장되지 않았습니다: 위도, 경도 쌍으로 입력하세요(예: 30.2741, 120.1551).",
331
+ refusedRange: "저장되지 않았습니다: {{detail}}",
332
+ latitude: "위도",
333
+ longitude: "경도",
334
+ refusedResidueOne: "저장되지 않았습니다: {{name}} “{{text}}”은(는) 숫자가 아닙니다. 일반 소수로 입력하세요(예: 30.2741, 120.1551).",
335
+ refusedResidue: "저장되지 않았습니다: {{name}} “{{text}}”과(와) {{otherName}} “{{otherText}}”은(는) 숫자가 아닙니다. 일반 소수로 입력하세요(예: 30.2741, 120.1551).",
336
+ },
337
+ date: {
338
+ impossibleDay: "저장된 값 “{{value}}”은(는) 실제 날짜가 아닙니다. 바꾸려면 날짜를 선택하세요.",
339
+ },
340
+ dateTime: {
341
+ impossibleDay: "저장된 값 “{{value}}”은(는) 실제 날짜가 아닙니다. 바꾸려면 날짜와 시간을 선택하세요.",
342
+ },
343
+ number: {
344
+ badInput: "저장되지 않았습니다: 이 입력란의 텍스트는 숫자가 아닙니다. 일반 소수로 입력하세요(예: {{example}}).",
345
+ },
262
346
  tags: {
263
347
  placeholder: "입력 후 Enter 키로 추가…",
264
348
  },
@@ -274,6 +358,16 @@ const ko = {
274
358
  characterCount: "글자 수: {{max}}자 중 {{count}}자",
275
359
  charactersRemaining: "{{count}}자 남음",
276
360
  },
361
+ grid: {
362
+ addLine: "행 추가",
363
+ noItems: "항목 없음",
364
+ noItemsAddHint: "아직 항목이 없습니다. “{{label}}”을(를) 클릭하여 시작하세요.",
365
+ optionalColumns: "선택 열",
366
+ computed: "자동 계산",
367
+ openRow: "행 열기",
368
+ duplicateRow: "행 복제",
369
+ removeRow: "행 삭제",
370
+ },
277
371
  },
278
372
  table: {
279
373
  rowsPerPage: "페이지당 행 수",
@@ -302,23 +396,35 @@ const ko = {
302
396
  open: "열기",
303
397
  search: "검색…",
304
398
  modified: "{{count}}개 행 수정됨",
399
+ modified_one: "{{count}}개 행 수정됨",
400
+ modified_other: "{{count}}개 행 수정됨",
305
401
  saveFailed: '저장 실패',
306
402
  selected: "{{count}}개 선택됨",
403
+ selected_one: "{{count}}개 선택됨",
404
+ selected_other: "{{count}}개 선택됨",
307
405
  edit: "편집",
308
406
  delete: "삭제",
309
407
  },
310
408
  grid: {
311
409
  bulkSelected: "{{count}}건 선택됨",
410
+ bulkSelected_one: "{{count}}건 선택됨",
411
+ bulkSelected_other: "{{count}}건 선택됨",
312
412
  bulkSelectedAllMatches: "{{count}}건 선택됨(일치 항목 전체)",
313
413
  bulkClear: "선택 해제",
314
414
  bulkAllOnPage: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
415
+ bulkAllOnPage_one: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
416
+ bulkAllOnPage_other: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
315
417
  bulkSelectAllMatching: "일치하는 {{count}}건 모두 선택",
316
418
  bulkAllMatchingSelected: "일치하는 레코드 {{count}}건이 모두 선택되었습니다.",
317
419
  bulk: {
318
420
  confirmDefault: "레코드 {{count}}건에 적용됩니다.",
421
+ confirmDefault_one: "레코드 {{count}}건에 적용됩니다.",
422
+ confirmDefault_other: "레코드 {{count}}건에 적용됩니다.",
319
423
  overLimit: "선택 건수({{count}})가 작업 한도({{limit}})를 초과합니다. 선택을 줄여 주세요.",
320
424
  affectedRecords: "영향을 받는 레코드({{count}}):",
321
425
  skippedIneligible: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
426
+ skippedIneligible_one: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
427
+ skippedIneligible_other: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
322
428
  rowFallback: "{{index}}행",
323
429
  andMore: "… 외 {{count}}건",
324
430
  processed: "{{count}} / {{total}} 처리됨",
@@ -336,8 +442,7 @@ const ko = {
336
442
  undo: "되돌리기",
337
443
  undoing: "되돌리는 중…",
338
444
  done: "완료",
339
- selectPlaceholder: "선택…",
340
- loading: "불러오는 중…",
445
+ loading: "로딩 중…",
341
446
  },
342
447
  actions: "작업",
343
448
  edit: "편집",
@@ -355,6 +460,14 @@ const ko = {
355
460
  yes: "예",
356
461
  no: "아니요",
357
462
  systemFields: "시스템",
463
+ // objectui#10881 — the grouped grid's two refusals: over a data source
464
+ // that cannot answer the group header query, and over rows a host
465
+ // handed in while declaring them one page of more. `queryGroupHeaders`
466
+ // is the member's name and stays untranslated.
467
+ grouping: {
468
+ needsHeaderQuery: "이 뷰는 그룹화되어 있지만 데이터 소스가 queryGroupHeaders를 구현하지 않아 그룹 개수를 셀 수 없습니다. 레코드를 표시하려면 그룹화를 제거하세요.",
469
+ needsWholeRows: "그룹화에는 모든 레코드가 필요하지만 이 그리드에는 한 페이지만 전달되어 그룹 개수를 셀 수 없습니다. 모든 레코드를 전달하거나 queryGroupHeaders를 구현하는 데이터 소스에서 그리드가 불러오도록 하세요.",
470
+ },
358
471
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
359
472
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
360
473
  // pack controls its own separator and word order.
@@ -381,10 +494,14 @@ const ko = {
381
494
  },
382
495
  import: {
383
496
  downloadTemplate: "템플릿 다운로드",
384
- downloadTemplateHint: "올바른 열이 포함된 CSV를 받습니다(필수 필드에는 * 표시).",
497
+ downloadTemplateHint: "가져올 수 있는 열만 담은 Excel 파일을 받습니다(필수 필드에는 * 표시, 작성 안내 포함).",
385
498
  templateFileName: "{{object}}-import-template",
499
+ templateDownloadFailed: "템플릿을 다운로드할 수 없습니다. 다시 시도하세요.",
500
+ templateNotPermitted: "이 객체의 레코드를 생성할 권한이 없어 가져오기 템플릿을 사용할 수 없습니다.",
386
501
  autoMatched: "자동 매핑됨",
387
502
  autoMatchedSummary: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
503
+ autoMatchedSummary_one: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
504
+ autoMatchedSummary_other: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
388
505
  confidence: {
389
506
  high: "신뢰도 높음",
390
507
  medium: "신뢰도 보통",
@@ -397,8 +514,14 @@ const ko = {
397
514
  cancelImport: "가져오기 취소",
398
515
  importCancelled: "가져오기를 취소했습니다",
399
516
  resultsTruncated: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
517
+ resultsTruncated_one: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
518
+ resultsTruncated_other: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
400
519
  createdCount: "{{count}}건 생성",
520
+ createdCount_one: "{{count}}건 생성",
521
+ createdCount_other: "{{count}}건 생성",
401
522
  updatedCount: "{{count}}건 업데이트",
523
+ updatedCount_one: "{{count}}건 업데이트",
524
+ updatedCount_other: "{{count}}건 업데이트",
402
525
  downloadFailed: "실패한 행 다운로드",
403
526
  options: "가져오기 옵션",
404
527
  writeMode: "기존 레코드와 일치하는 행의 처리",
@@ -438,7 +561,7 @@ const ko = {
438
561
  historyDescription: "이 객체의 최근 가져오기입니다.",
439
562
  historyHint: "백그라운드 가져오기 작업, 최신순.",
440
563
  historyRefresh: "새로고침",
441
- historyLoading: "불러오는 중…",
564
+ historyLoading: "로딩 중…",
442
565
  historyEmpty: "아직 가져오기가 없습니다.",
443
566
  historyUnsupported: "이 데이터 소스는 가져오기 기록을 지원하지 않습니다.",
444
567
  historyColStatus: "상태",
@@ -446,6 +569,8 @@ const ko = {
446
569
  historyColResult: "결과",
447
570
  historyColTime: "시각",
448
571
  errorCount: "오류 {{count}}건",
572
+ errorCount_one: "오류 {{count}}건",
573
+ errorCount_other: "오류 {{count}}건",
449
574
  undoImport: "가져오기 되돌리기",
450
575
  undoing: "되돌리는 중…",
451
576
  undoConfirm: "이 가져오기를 되돌릴까요? 생성된 레코드는 삭제되고 업데이트된 레코드는 이전 값으로 복원됩니다.",
@@ -506,7 +631,11 @@ const ko = {
506
631
  mapped: "매핑됨",
507
632
  skipped: "건너뜀",
508
633
  rowsWithErrors: "오류가 있는 {{count}}개 행",
634
+ rowsWithErrors_one: "오류가 있는 {{count}}개 행",
635
+ rowsWithErrors_other: "오류가 있는 {{count}}개 행",
509
636
  rowsCorrected: "{{count}}개 행 수정됨",
637
+ rowsCorrected_one: "{{count}}개 행 수정됨",
638
+ rowsCorrected_other: "{{count}}개 행 수정됨",
510
639
  clickToFix: "— 강조 표시된 셀을 클릭하여 인라인 편집.",
511
640
  showingRows: "{{total}}개 중 {{shown}}개 행 표시",
512
641
  importing: "가져오는 중… {{progress}}%",
@@ -514,11 +643,15 @@ const ko = {
514
643
  imported: "{{count}}개 가져옴",
515
644
  skippedCount: "{{count}}개 건너뜀",
516
645
  moreErrors: "…{{count}}개 오류 더",
646
+ moreErrors_one: "…{{count}}개 오류 더",
647
+ moreErrors_other: "…{{count}}개 오류 더",
517
648
  cancel: "취소",
518
649
  back: "뒤로",
519
650
  next: "다음",
520
651
  close: "닫기",
521
652
  importNRows: "{{count}}개 행 가져오기",
653
+ importNRows_one: "{{count}}개 행 가져오기",
654
+ importNRows_other: "{{count}}개 행 가져오기",
522
655
  importingProgress: "가져오는 중…",
523
656
  requiredMark: "*",
524
657
  required: "필수",
@@ -530,11 +663,37 @@ const ko = {
530
663
  month: "월",
531
664
  week: "주",
532
665
  day: "일",
533
- agenda: "일정",
534
666
  allDay: "종일",
535
- noEvents: "일정이 없습니다",
536
667
  newEvent: "새 일정",
537
668
  moreEvents: "+{{count}} 더보기",
669
+ unscheduled: "일정 없음 ({{count}})",
670
+ loading: "캘린더 로딩 중…",
671
+ loadError: "오류: {{message}}",
672
+ configRequired: "캘린더 설정이 필요합니다. startDateField를 지정하세요. 캘린더의 유일한 필수 키입니다. 일정 제목은 titleField 없이도 확인됩니다.",
673
+ configRequiredHint: "뷰의 calendar 블록에 속합니다. 인터페이스 페이지에는 자체 캘린더 슬롯이 없습니다. sourceView를 캘린더를 선언한 뷰로 지정하세요.",
674
+ eventDetails: "일정 세부 정보",
675
+ pullToRefresh: "당겨서 새로고침",
676
+ refreshing: "새로고침 중…",
677
+ onDate: "{{date}}",
678
+ eventTitle: "제목",
679
+ eventTitlePlaceholder: "이 일정은 어떤 내용인가요?",
680
+ creating: "생성 중…",
681
+ titleRequired: "제목을 입력하세요",
682
+ a11y: {
683
+ region: "캘린더",
684
+ grid: "캘린더 그리드",
685
+ goToToday: "오늘로 이동",
686
+ previousPeriod: "이전 기간",
687
+ nextPeriod: "다음 기간",
688
+ currentDate: "현재 날짜: {{date}}",
689
+ dayCell: "{{date}}, 일정 {{count}}개",
690
+ dayCell_one: "{{date}}, 일정 {{count}}개",
691
+ dayCell_other: "{{date}}, 일정 {{count}}개",
692
+ resizeEventEnd: "일정 종료 시점 조절",
693
+ resizeEventEndHint: "드래그하여 종료 날짜 변경",
694
+ resizeStart: "시작 시점 조절",
695
+ resizeEnd: "종료 시점 조절",
696
+ },
538
697
  },
539
698
  list: {
540
699
  firstRunTitle: "아직 아무것도 없습니다",
@@ -577,7 +736,8 @@ const ko = {
577
736
  refresh: "새로고침",
578
737
  loading: "레코드 로딩 중…",
579
738
  recordCount: "{{count}}개 레코드",
580
- recordCountOne: "{{count}}개 레코드",
739
+ recordCount_one: "{{count}}개 레코드",
740
+ recordCount_other: "{{count}}개 레코드",
581
741
  addRecord: "레코드 추가",
582
742
  tabs: "탭",
583
743
  allRecords: "전체 레코드",
@@ -609,7 +769,7 @@ const ko = {
609
769
  hideFieldsTitle: "필드 숨기기",
610
770
  dataLimitReached: "처음 {{limit}}개 레코드를 표시합니다. 더 많은 데이터가 있을 수 있습니다.",
611
771
  viewSettings: "보기 설정",
612
- viewSettingsHint: "그룹화, 색상, 밀도 및 표시 필드.",
772
+ viewSettingsHint: "그룹화, 색상, 밀도 및 표시 필드. 이 보기를 사용하는 모든 사용자에게 적용됩니다.",
613
773
  addGroup: "그룹 필드 추가",
614
774
  collapsedByDefault: "기본적으로 접힘",
615
775
  removeGroup: "제거",
@@ -674,6 +834,17 @@ const ko = {
674
834
  },
675
835
  gantt: {
676
836
  rowLabel: "항목",
837
+ unusableRange: {
838
+ malformedDate: "사용할 수 없는 간트 날짜 범위 — {{path}}은(는) {{value}}이며 유효한 날짜가 아닙니다. 모든 간트 날짜는 파싱할 수 있어야 합니다: 각 행 항목의 startDate와 endDate, 그리고 스키마에 고정한 minDate / maxDate.",
839
+ malformedRow: "사용할 수 없는 간트 행 — {{path}}은(는) {{value}}이며 행의 형태가 아닙니다. 간트는 items를 행 목록으로, 각 행을 label과 자체 items를 가진 객체로, 각 행의 items를 막대 목록으로 읽습니다. 이 위치에 있는 null, 숫자, 문자열 또는 일반 객체는 그릴 수 없습니다.",
840
+ inverted: "사용할 수 없는 간트 날짜 범위 — minDate {{minDate}}이(가) maxDate {{maxDate}}보다 뒤입니다. 고정한 minDate / maxDate는 행에서 계산한 범위보다 우선하므로 이 축에는 열이 없고 막대를 배치할 수 없습니다. 두 값을 서로 바꾸세요.",
841
+ },
842
+ },
843
+ unsupported: {
844
+ objectBoundGantt: "지원되지 않는 variant \"gantt\" — 객체 바인딩 타임라인은 피드 variant({{variants}})를 렌더링합니다. 간트는 각각 중첩된 items를 가진 리터럴 행이 필요하므로 여기서는 간트 축(scale)이 적용되지 않습니다.",
845
+ },
846
+ unconfigured: {
847
+ noDateAxis: "타임라인 날짜 축이 필요합니다 — 이 뷰는 날짜 필드를 선언하지 않았으며, 객체 바인딩 타임라인은 날짜 필드를 지어내지 않습니다. 다음 중 하나를 선언하세요: {{fields}}. 첫 번째가 spec 표기이고 나머지는 레거시 별칭입니다.",
677
848
  },
678
849
  },
679
850
  gantt: {
@@ -691,6 +862,7 @@ const ko = {
691
862
  },
692
863
  aria: {
693
864
  taskList: "작업 목록",
865
+ refreshing: "새로고침 중…",
694
866
  },
695
867
  tooltip: {
696
868
  days: "일",
@@ -736,13 +908,19 @@ const ko = {
736
908
  conflict: {
737
909
  title: "일정 충돌",
738
910
  body: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
911
+ body_one: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
912
+ body_other: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
739
913
  confirm: "자동 일정 조정",
740
914
  cancel: "그대로 두기",
741
915
  },
742
916
  autoScheduleDlg: {
743
917
  title: "자동 일정 조정",
744
918
  body: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
919
+ body_one: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
920
+ body_other: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
745
921
  skipped: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
922
+ skipped_one: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
923
+ skipped_other: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
746
924
  confirm: "적용",
747
925
  cancel: "취소",
748
926
  none: "모든 종속성이 충족되었습니다 — 조정할 일정이 없습니다.",
@@ -821,6 +999,7 @@ const ko = {
821
999
  tabActionsFor: "{{name}}의 보기 작업",
822
1000
  readonlyAriaLabel: "읽기 전용 보기",
823
1001
  readonlyTooltip: "시스템 보기 — 코드에 정의되어 있으며 읽기 전용입니다.",
1002
+ malformedFilter: "이 뷰의 필터가 잘못되어 레코드를 표시하지 않습니다: {{subject}} 조건을 적용할 수 없습니다.",
824
1003
  },
825
1004
  designer: {
826
1005
  undo: "실행 취소",
@@ -846,7 +1025,8 @@ const ko = {
846
1025
  pageHeaderActions: "페이지 헤더 작업",
847
1026
  emojiPicker: "이모지 선택기",
848
1027
  reactionCount: "{{emoji}} 반응 {{count}}개",
849
- reactionCountOne: "{{emoji}} 반응 {{count}}개",
1028
+ reactionCount_one: "{{emoji}} 반응 {{count}}개",
1029
+ reactionCount_other: "{{emoji}} 반응 {{count}}개",
850
1030
  recordDetail: "레코드 세부 정보",
851
1031
  recordDetailWithLabel: "{{label}} 세부 정보",
852
1032
  openAsFullPage: "전체 페이지로 열기",
@@ -873,7 +1053,6 @@ const ko = {
873
1053
  viewAll: "모두 보기",
874
1054
  new: "새로 만들기",
875
1055
  add: "추가",
876
- emptyValue: "—",
877
1056
  comments: "댓글",
878
1057
  searchComments: "댓글 검색…",
879
1058
  addCommentPlaceholder: "댓글 추가… (Ctrl+Enter로 제출)",
@@ -884,11 +1063,18 @@ const ko = {
884
1063
  unpin: "고정 해제",
885
1064
  justNow: "방금",
886
1065
  minutesAgo: "{{count}}분 전",
1066
+ minutesAgo_one: "{{count}}분 전",
1067
+ minutesAgo_other: "{{count}}분 전",
887
1068
  hoursAgo: "{{count}}시간 전",
1069
+ hoursAgo_one: "{{count}}시간 전",
1070
+ hoursAgo_other: "{{count}}시간 전",
888
1071
  daysAgo: "{{count}}일 전",
1072
+ daysAgo_one: "{{count}}일 전",
1073
+ daysAgo_other: "{{count}}일 전",
889
1074
  dropFilesToUpload: "파일을 여기에 끌어놓거나 클릭하여 업로드",
890
1075
  attachmentCount: "첨부파일 {{count}}개",
891
- attachmentCountPlural: "첨부파일 {{count}}개",
1076
+ attachmentCount_one: "첨부파일 {{count}}개",
1077
+ attachmentCount_other: "첨부파일 {{count}}개",
892
1078
  removeAttachment: "첨부파일 제거",
893
1079
  // Record Attachments panel (enable.files, objectstack#4358)
894
1080
  attachments: "첨부파일",
@@ -906,11 +1092,6 @@ const ko = {
906
1092
  attachmentsLoadFailed: "이 레코드의 첨부파일을 불러오지 못했습니다.",
907
1093
  attachmentsApiUnavailable: "이 객체에서는 첨부 파일 목록을 사용할 수 없습니다.",
908
1094
  retryLoadAttachments: "다시 시도",
909
- unifiedDiff: "통합 보기",
910
- sideBySideDiff: "나란히 보기",
911
- noChanges: "변경 없음",
912
- previousVersion: "이전 버전",
913
- currentVersion: "현재 버전",
914
1095
  discussion: "토론",
915
1096
  showDiscussion: "토론 보기 ({{count}})",
916
1097
  hideDiscussion: "토론 숨기기",
@@ -925,25 +1106,35 @@ const ko = {
925
1106
  writeComment: "댓글 작성…",
926
1107
  subscribedTooltip: "구독 중 — 클릭하여 구독 취소",
927
1108
  unsubscribedTooltip: "알림 구독",
928
- firstRecord: "첫 번째 레코드 (Home)",
929
- previousRecordKey: "이전 레코드 (←)",
930
- nextRecordKey: "다음 레코드 (→)",
931
- lastRecord: "마지막 레코드 (End)",
932
1109
  noRecords: "레코드 없음",
933
- searchWhileNavigating: "탐색 중 검색",
934
- searchRecords: "레코드 검색…",
935
1110
  allActivity: "모든 활동",
936
1111
  commentsOnly: "댓글만",
937
1112
  fieldChangesFilter: "필드 변경",
938
1113
  tasksOnly: "작업만",
939
1114
  leaveCommentPlaceholder: "댓글 남기기… (Ctrl+Enter로 제출)",
940
1115
  noActivity: "기록된 활동 없음",
1116
+ activityAccessDenied: "이 레코드의 활동을 볼 권한이 없습니다.",
1117
+ commentsAccessDenied: "이 레코드의 댓글을 볼 권한이 없습니다.",
1118
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1119
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1120
+ // sentences, which are assembled in code and so need interpolation holes.
1121
+ allFilter: '전체',
1122
+ createsFilter: '생성',
1123
+ deletesFilter: '삭제',
1124
+ statusChangesFilter: '상태 변경',
1125
+ activityEmptyValue: '(비어 있음)',
1126
+ activityFieldChanged: '{{field}}을(를) "{{old}}"에서 "{{new}}"(으)로 변경했습니다',
1127
+ activityCreated: '이 레코드를 만들었습니다',
1128
+ activityDeleted: '이 레코드를 삭제했습니다',
1129
+ activityStatusChanged: '상태를 "{{value}}"(으)로 변경했습니다',
1130
+ activityUpdated: '레코드를 업데이트했습니다',
941
1131
  loadMore: "더 보기",
942
1132
  edited: "(수정됨)",
943
1133
  via: "{{source}} 통해",
944
1134
  viewSource: "원본 보기",
945
1135
  replyCount: "답글 {{count}}개",
946
- replyCountPlural: "답글 {{count}}개",
1136
+ replyCount_one: "답글 {{count}}개",
1137
+ replyCount_other: "답글 {{count}}개",
947
1138
  replyPlaceholder: "답글…",
948
1139
  filterActivity: "활동 필터",
949
1140
  openDiscussion: "토론 패널 열기",
@@ -958,6 +1149,7 @@ const ko = {
958
1149
  writeStrippedReadonly: "다음 필드는 읽기 전용이므로 적용되지 않았습니다: {{fields}}",
959
1150
  writeStrippedByState: "다음 필드는 이 레코드의 현재 상태에서 편집할 수 없으므로 적용되지 않았습니다: {{fields}}",
960
1151
  writeStrippedPrimaryKey: "다음 필드는 레코드의 식별자이며 저장으로 변경할 수 없으므로 적용되지 않았습니다: {{fields}}",
1152
+ writeStrippedComputed: "다음 필드는 서버가 수식으로 계산하므로 보낸 값이 적용되지 않았습니다: {{fields}}",
961
1153
  writeStrippedUnknownReason: "다음 필드는 서버에서 적용되지 않았습니다: {{fields}}",
962
1154
  approvalPendingEditable: "승인 진행 중 · 편집 가능",
963
1155
  approvalPendingTooltip: "이 레코드에 대기 중인 승인 요청이 있지만 이 단계에서는 편집할 수 있습니다",
@@ -979,6 +1171,8 @@ const ko = {
979
1171
  pathStageLostUpcoming: '{{stage}}, 실패, 도달하지 않음',
980
1172
  pathStageWonUpcoming: '{{stage}}, 목표 단계, 도달하지 않음',
981
1173
  linkCopied: "링크가 클립보드에 복사됨",
1174
+ commentFailed: "댓글이 게시되지 않았습니다. 아무것도 저장되지 않았습니다. 다시 시도해 주세요.",
1175
+ reactionFailed: "반응이 저장되지 않았습니다. 다시 시도해 주세요.",
982
1176
  linkCopyFailed: "링크 복사 실패",
983
1177
  cancel: "취소",
984
1178
  cancelEdit: "변경 사항 취소",
@@ -1008,6 +1202,7 @@ const ko = {
1008
1202
  sortBy: "정렬 기준",
1009
1203
  filterPlaceholder: "필터…",
1010
1204
  highlightFields: "주요 필드",
1205
+ highlightsLabel: "레코드 주요 필드",
1011
1206
  createdBy: "작성자",
1012
1207
  updatedBy: "업데이트한 사람",
1013
1208
  created: "작성됨",
@@ -1021,26 +1216,50 @@ const ko = {
1021
1216
  copyPhone: "전화번호 복사",
1022
1217
  copyRecordId: "레코드 ID 복사",
1023
1218
  showEmptyFields: "{{count}}개의 빈 필드 표시",
1219
+ showEmptyFields_one: "{{count}}개의 빈 필드 표시",
1220
+ showEmptyFields_other: "{{count}}개의 빈 필드 표시",
1024
1221
  hideEmptyFields: "빈 필드 숨기기",
1025
1222
  noValue: "값 없음",
1223
+ unresolvedReference: "확인되지 않은 참조: {{value}}을(를) 사용자로 확인하지 못했습니다",
1224
+ unresolvedLookupReference: "확인되지 않은 참조: {{value}}을(를) 이 화면에서 레코드로 확인하지 못했습니다",
1225
+ repeaterItemCount: "항목 {{count}}개",
1226
+ repeaterItemCount_one: "항목 {{count}}개",
1227
+ repeaterItemCount_other: "항목 {{count}}개",
1228
+ fileCount: "파일 {{count}}개",
1229
+ fileCount_one: "파일 {{count}}개",
1230
+ fileCount_other: "파일 {{count}}개",
1026
1231
  },
1027
1232
  chart: {
1028
- noData: "차트 데이터가 없습니다",
1029
1233
  loading: "차트 로딩 중…",
1234
+ refreshing: "새로고침 중…",
1030
1235
  nullCategory: "(미지정)",
1031
- },
1032
- map: {
1033
- searchLocations: "위치 검색…",
1034
- locationDetails: "위치 상세",
1035
- markersCount: "마커 {{count}}개",
1036
- invalidCoordinates: "좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.",
1037
- invalidCoordinatesPlural: "좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.",
1236
+ scatterOneMeasure: "산점도는 측정값 하나만 그립니다. 계열을 하나만 남기세요:",
1237
+ unconfigured: {
1238
+ noCategoryAxis: "차트 범주 축이 필요합니다 — 객체 바인딩 차트는 축을 임의로 만들지 않습니다. 다음 중 하나를 선언하세요:",
1239
+ },
1038
1240
  },
1039
1241
  dashboard: {
1040
- noRows: "행 없음",
1242
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1243
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1244
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1245
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1246
+ // read them. The copy here has to read as a state rather than a failure,
1247
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1248
+ // punctuation so the call site concatenates no separator (see
1249
+ // `WidgetEmptyState`).
1250
+ empty: {
1251
+ title: "아직 데이터가 없습니다",
1252
+ message: "이 위젯은 정상적으로 로드되었지만 쿼리가 아직 레코드를 반환하지 않았습니다.",
1253
+ sourceLabel: "데이터 소스:",
1254
+ },
1041
1255
  loading: "로딩 중…",
1256
+ refreshing: "새로고침 중…",
1257
+ refreshAll: "모두 새로고침",
1258
+ refreshDashboard: "대시보드 새로고침",
1042
1259
  pickMeasures: "이 데이터셋 위젯의 측정값(값)을 선택하세요.",
1043
1260
  datasetUnsupported: "이 데이터 소스는 데이터셋 쿼리를 지원하지 않습니다.",
1261
+ widgetForbiddenTitle: "접근 권한 없음",
1262
+ widgetForbiddenMessage: "이 위젯의 데이터를 볼 수 있는 권한이 없습니다.",
1044
1263
  details: "세부 정보",
1045
1264
  exportCsv: "CSV 내보내기",
1046
1265
  openInList: "목록에서 열기",
@@ -1068,12 +1287,10 @@ const ko = {
1068
1287
  },
1069
1288
  },
1070
1289
  addWidget: "위젯 추가",
1071
- removeWidget: "위젯 제거",
1072
1290
  editLayout: "레이아웃 편집",
1073
1291
  saveLayout: "레이아웃 저장",
1074
1292
  resetLayout: "레이아웃 초기화",
1075
1293
  total: "합계",
1076
- noDataAvailable: "사용 가능한 데이터 없음",
1077
1294
  noDataSourceFor: "데이터 소스 없음:",
1078
1295
  config: {
1079
1296
  breadcrumb: {
@@ -1195,10 +1412,6 @@ const ko = {
1195
1412
  appDescription: "설명",
1196
1413
  appIcon: "아이콘",
1197
1414
  template: "템플릿",
1198
- layout: "레이아웃",
1199
- layoutSidebar: "사이드바",
1200
- layoutHeader: "헤더",
1201
- layoutEmpty: "비어 있음",
1202
1415
  selectObjects: "오브젝트 선택",
1203
1416
  searchObjects: "오브젝트 검색…",
1204
1417
  selectAll: "모두 선택",
@@ -1207,7 +1420,6 @@ const ko = {
1207
1420
  addGroup: "그룹 추가",
1208
1421
  addUrl: "URL 추가",
1209
1422
  addSeparator: "구분선 추가",
1210
- noNavItems: "탐색 항목이 아직 없습니다.",
1211
1423
  logoUrl: "Logo URL",
1212
1424
  primaryColor: "기본 색상",
1213
1425
  faviconUrl: "Favicon URL",
@@ -1234,13 +1446,12 @@ const ko = {
1234
1446
  appearance: "외관",
1235
1447
  rowHeight: "행 높이",
1236
1448
  livePreview: "실시간 미리보기",
1237
- stepBasicDesc: "이름, 제목 및 레이아웃",
1449
+ stepBasicDesc: "이름, 제목 및 아이콘",
1238
1450
  stepObjectsDesc: "비즈니스 객체 선택",
1239
1451
  stepNavigationDesc: "네비게이션 트리 구성",
1240
1452
  stepBrandingDesc: "로고, 색상 및 파비콘",
1241
1453
  noObjectsFound: "객체를 찾을 수 없습니다.",
1242
1454
  noNavItemsHint: "네비게이션 항목이 없습니다. 이전 단계에서 객체를 선택하거나 수동으로 추가하세요.",
1243
- separator: "구분선",
1244
1455
  separatorLabel: "— 구분선 —",
1245
1456
  newGroup: "새 그룹",
1246
1457
  newLink: "새 링크",
@@ -1274,6 +1485,7 @@ const ko = {
1274
1485
  navTypeSeparator: "구분선",
1275
1486
  navTypeAction: "작업",
1276
1487
  navTypeComponent: "컴포넌트",
1488
+ navTypeDoc: "문서",
1277
1489
  navEditIcon: "아이콘 편집",
1278
1490
  navToggleVisible: "가시성 토글",
1279
1491
  navHidden: "숨김",
@@ -1351,11 +1563,8 @@ const ko = {
1351
1563
  defaultValue: "기본값",
1352
1564
  placeholder: "자리 표시자",
1353
1565
  referenceTo: "참조 대상",
1354
- formula: "수식",
1355
1566
  options: "옵션",
1356
1567
  addOption: "옵션 추가",
1357
- validationRules: "유효성 검사 규칙",
1358
- addRule: "규칙 추가",
1359
1568
  systemBadge: "시스템",
1360
1569
  ungrouped: "일반",
1361
1570
  deleteConfirmTitle: "필드를 삭제하시겠습니까?",
@@ -1374,7 +1583,21 @@ const ko = {
1374
1583
  },
1375
1584
  },
1376
1585
  console: {
1586
+ studio: {
1587
+ backToHome: "홈으로 돌아가기",
1588
+ },
1377
1589
  saveAdvisoryTitle: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1590
+ saveAdvisoryTitle_one: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1591
+ saveAdvisoryTitle_other: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1592
+ publishAdvisoryTitle: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1593
+ publishAdvisoryTitle_one: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1594
+ publishAdvisoryTitle_other: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1595
+ importMappingsUnavailable: "{{object}}의 저장된 가져오기 매핑을 불러오지 못했습니다",
1596
+ importMappingsRefused: "서버가 이 요청을 거부했습니다. 따라서 이 목록이 비어 있는 것은 읽지 못했기 때문이며, 등록된 항목이 없어서가 아닙니다. 다시 로그인하거나 관리자에게 접근 권한을 요청하세요.",
1597
+ importMappingsUnreadable: "이 목록이 비어 있는 것은 읽지 못했기 때문이며, 등록된 항목이 없어서가 아닙니다. 다시 시도하고, 계속 발생하면 문제를 보고하세요.",
1598
+ savedViewsUnavailable: "{{object}}의 저장된 보기를 불러오지 못했습니다",
1599
+ savedViewsRefused: "서버가 이 요청을 거부했습니다. 따라서 이 목록이 비어 있는 것은 읽지 못했기 때문이며, 이 오브젝트에 저장된 보기가 없어서가 아닙니다. 다시 로그인하거나 관리자에게 접근 권한을 요청하세요.",
1600
+ savedViewsUnreadable: "이 목록이 비어 있는 것은 읽지 못했기 때문이며, 이 오브젝트에 저장된 보기가 없어서가 아닙니다. 다시 시도하고, 계속 발생하면 문제를 보고하세요.",
1378
1601
  settingsHub: {
1379
1602
  title: "설정",
1380
1603
  subtitle: "워크스페이스, 연동, 기능 플래그를 구성합니다.",
@@ -1435,9 +1658,16 @@ const ko = {
1435
1658
  statusFull: "한도에 도달했습니다",
1436
1659
  resetsDaily: "오늘 밤 초기화됩니다",
1437
1660
  resetsMonthly: "다음 주기에 초기화됩니다",
1661
+ resetsWeeklyDays: "{{count}}일 후 초기화됩니다",
1662
+ resetsWeeklyDays_one: "{{count}}일 후 초기화됩니다",
1663
+ resetsWeeklyDays_other: "{{count}}일 후 초기화됩니다",
1664
+ resetsWeeklyHours: "{{count}}시간 후 초기화됩니다",
1665
+ resetsWeeklyHours_one: "{{count}}시간 후 초기화됩니다",
1666
+ resetsWeeklyHours_other: "{{count}}시간 후 초기화됩니다",
1438
1667
  ctaUpgrade: "업그레이드하고 계속하기",
1439
1668
  ctaTopUp: "크레딧을 추가하고 계속하기",
1440
1669
  ariaLabel: "AI 사용량: {{status}}",
1670
+ breakdownTitle: "지금까지 사용 내역",
1441
1671
  },
1442
1672
  workspaceTitle: "AI 워크스페이스",
1443
1673
  workspaceSubtitle: "질문하고, 살펴보고, 대화를 이어가세요",
@@ -1447,6 +1677,31 @@ const ko = {
1447
1677
  share: "공유",
1448
1678
  shareTitle: "이 대화 공유",
1449
1679
  shareDisabledTitle: "공유하려면 먼저 대화를 시작하세요",
1680
+ buildDoctor: "빌드 진단",
1681
+ buildDoctorTitle: "빌드 진단 — 실제로 반영된 내용은?",
1682
+ buildDoctorDisabledTitle: "먼저 메시지를 보내세요",
1683
+ buildDoctorDrawer: {
1684
+ description: '에이전트가 주장한 내용과 실제로 반영된 내용을 비교합니다. 읽기 전용 진단입니다.',
1685
+ reconciling: '대조 중…',
1686
+ notAvailable: '사용할 수 없음 — 대화를 찾을 수 없거나 접근 권한이 없습니다.',
1687
+ untitled: '(제목 없음)',
1688
+ summary: '{{turns}}턴 · 메시지 {{messages}}개 · {{tokens}} tok · LLM {{seconds}}초',
1689
+ allLive: '시도한 변경 {{count}}개가 모두 반영되었습니다 — 사라진 것은 없습니다.',
1690
+ discrepancies: '불일치 {{count}}건 — 채팅에서 말한 내용과 실제로 반영된 내용이 다릅니다.',
1691
+ orphanedTitle: '제안되었지만 적용되지 않음',
1692
+ orphanedHint: '에이전트가 제안한 확인 카드를 이후 어떤 턴에서도 적용하지 않아 변경이 조용히 사라졌습니다.',
1693
+ missingTitle: '적용되었다고 했지만 없음',
1694
+ missingHint: '도구 결과는 적용되었다고 했지만 아티팩트가 sys_metadata에 반영되어 있지 않습니다.',
1695
+ toolErrorsTitle: '도구 오류',
1696
+ toolErrorsHint: '빌드 중 오류를 반환한 도구 호출입니다.',
1697
+ verifyTitle: '빌드 검사 (verify_build)',
1698
+ yourApp: '내 앱:',
1699
+ noIssues: '문제 0개',
1700
+ issueCount: '문제 {{count}}개',
1701
+ platformNoise: '플랫폼 sys_* 발견 {{count}}건 숨김',
1702
+ pendingActions: '대기 중인 작업',
1703
+ timeline: '타임라인 ({{count}})',
1704
+ },
1450
1705
  newChat: "새로 만들기",
1451
1706
  searchChats: "채팅 검색…",
1452
1707
  noChatsYet: "아직 채팅이 없습니다",
@@ -1476,7 +1731,7 @@ const ko = {
1476
1731
  empty: {
1477
1732
  build: {
1478
1733
  title: "AI로 빌드",
1479
- description: "앱이나 워크플로를 일상 언어로 설명해 주세요 — 객체, 화면, 자동화를 초안으로 만들어 드리면 검토 후 게시하시면 됩니다.",
1734
+ description: "앱을 일상 언어로 설명해 주세요 — 객체, 화면, 샘플 데이터를 초안으로 만들어 드리면 검토 후 게시하시면 됩니다.",
1480
1735
  },
1481
1736
  ask: {
1482
1737
  title: "데이터에 질문하기",
@@ -1485,7 +1740,7 @@ const ko = {
1485
1740
  editApp: {
1486
1741
  title: "“{{app}}” 편집 중",
1487
1742
  titleGeneric: "이 앱 편집",
1488
- description: "무엇을 바꿀까요? 이 앱을 그 자리에서 수정합니다 — 필드, 객체, 뷰, 자동화를 추가하거나 기존 내용을 조정할 수 있습니다.",
1743
+ description: "무엇을 바꿀까요? 이 앱을 그 자리에서 수정합니다 — 필드, 객체, 뷰, 대시보드를 추가하거나 기존 내용을 조정할 수 있습니다.",
1489
1744
  },
1490
1745
  },
1491
1746
  clearConversation: "지우기",
@@ -1538,23 +1793,41 @@ const ko = {
1538
1793
  recentRecords: "가장 최근에 생성된 레코드 5건을 보여 주세요.",
1539
1794
  recordCounts: "객체별 레코드 수를 세어 주세요.",
1540
1795
  },
1796
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1797
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1798
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1799
+ // wording that promises autonomous behaviour (alert / remind / notify /
1800
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1801
+ // the model silently degrades such a request into a board or a filtered
1802
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1803
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1541
1804
  metadataAssistant: {
1542
- buildCrm: "영업 CRM을 만들어 줘 — 고객, 담당자, 단계별로 합계를 낼 수 있는 거래 파이프라인.",
1543
- buildApp: "프로젝트 트래커를 만들어 줘 — 프로젝트, 담당자와 마감일이 있는 작업, 상태별 보드.",
1544
- buildFlow: "고객 지원 데스크를 설계해 줘 — 우선순위가 있는 티켓, 상태 워크플로, 고객 연결.",
1545
- buildInventory: "재고 앱을 만들어 줘 — 제품, 재고 수량, 공급업체, 재고 부족 표시.",
1546
- buildRecruiting: "채용 트래커를 만들어 줘 — 지원자, 채용 중인 직무, 면접 단계, 메모.",
1805
+ buildCrm: "영업 CRM을 만들어 줘 — 고객, 담당자, 단계 필드가 있는 거래, 단계별 금액을 합산하는 대시보드.",
1806
+ buildApp: "프로젝트 트래커를 만들어 줘 — 프로젝트, 담당자와 마감일이 있는 작업, 상태별 보드, 마감일 캘린더.",
1807
+ buildFlow: "고객 지원 데스크를 설계해 줘 — 우선순위와 상태 필드가 있는 티켓, 상태별 보드, 고객 연결.",
1808
+ buildInventory: "재고 앱을 만들어 줘 — 제품, 재고 수량, 공급업체, 재주문점 미만 제품을 걸러내는 뷰.",
1809
+ buildRecruiting: "채용 트래커를 만들어 줘 — 지원자, 채용 중인 직무, 면접 단계 필드, 단계별 보드.",
1547
1810
  },
1548
1811
  generic: {
1549
1812
  help: "무엇을 도와줄 수 있나요?",
1550
1813
  availableObjects: "사용 가능한 데이터 객체를 나열해 주세요.",
1551
1814
  recentActivity: "내 최근 활동을 요약해 주세요.",
1552
1815
  },
1816
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1817
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1818
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1819
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1820
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1821
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1822
+ // no data is what an existing app most often lacks. REVERT: when
1823
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1824
+ // comes back as `addAutomation`; the retired string is pinned for every
1825
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1553
1826
  editApp: {
1554
1827
  addField: "객체 중 하나에 필드를 추가해 주세요.",
1555
1828
  addObject: "새 객체를 추가하고 기존 객체와 연결해 주세요.",
1556
1829
  addDashboard: "핵심 지표를 위한 대시보드를 추가해 주세요.",
1557
- addAutomation: "자동화를 추가해 주세요 — 승인, 상태 흐름 또는 알림.",
1830
+ addSampleData: "기존 객체에 데모에서 보여 줄 만한 현실적인 샘플 데이터를 채워 주세요.",
1558
1831
  },
1559
1832
  },
1560
1833
  changesTitle: "변경 확인",
@@ -1636,6 +1909,13 @@ const ko = {
1636
1909
  pages: "페이지",
1637
1910
  reports: "보고서",
1638
1911
  system: "시스템",
1912
+ marketplace: "마켓플레이스",
1913
+ settings: '설정',
1914
+ apps: '앱',
1915
+ profile: '프로필',
1916
+ approvals: '승인',
1917
+ aiApprovals: 'AI 승인',
1918
+ auditLog: '감사 로그',
1639
1919
  },
1640
1920
  // objectui#4024 — the single-namespace settings screen. Its sibling
1641
1921
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1727,6 +2007,21 @@ const ko = {
1727
2007
  records: "레코드",
1728
2008
  recentRecords: "최근 본 항목",
1729
2009
  },
2010
+ // objectui#9954 — see the `en` pack for what raises each case.
2011
+ readRate: {
2012
+ ratioTitle: '이 환경의 읽기 양이 비정상적입니다',
2013
+ ratio: '쓰기 1행당 {{ratio}}행을 읽고 있습니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.',
2014
+ noWritesTitle: '이 환경은 읽기만 있고 쓰기가 전혀 없습니다',
2015
+ noWrites: '행을 읽고 있지만 쓰기가 전혀 없어 읽기 비율에 상한이 없습니다. 가장 심각한 수치입니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.',
2016
+ },
2017
+ // objectui#10439 — see the `en` pack for what raises each case.
2018
+ storageUsage: {
2019
+ warningTitle: '저장 공간이 거의 가득 찼습니다',
2020
+ warning: '{{limit}} MB 중 {{used}} MB 사용 중입니다. 저장 공간이 가득 차면 업로드와 가져오기가 일시 중지됩니다.',
2021
+ blockedTitle: '저장 공간이 가득 찼습니다: 업로드와 가져오기가 일시 중지되었습니다',
2022
+ blocked: '{{limit}} MB 중 {{used}} MB 사용 중입니다. 기존 데이터는 그대로 유지되며, 읽기, 내보내기, 개별 레코드 편집은 계속 사용할 수 있습니다.',
2023
+ upgrade: '업그레이드하고 계속하기',
2024
+ },
1730
2025
  errors: {
1731
2026
  somethingWentWrong: "문제가 발생했습니다",
1732
2027
  unexpectedError: "이 뷰를 렌더링하는 중 예기치 않은 오류가 발생했습니다.",
@@ -1757,6 +2052,7 @@ const ko = {
1757
2052
  viewNameInvalid: "소문자, 숫자, 밑줄을 사용하고 문자 또는 밑줄로 시작하세요.",
1758
2053
  systemViewReadonly: "시스템 보기는 코드에 정의되어 있어 읽기 전용입니다.",
1759
2054
  cannotEditMetaView: "이 보기는 코드에 정의된 기본 제공 보기이므로 변경할 수 없습니다.",
2055
+ viewConfigPermissionDenied: "보기 설정은 이 보기를 사용하는 모든 사용자에게 적용되므로 변경하려면 '메타데이터 관리' 권한이 필요합니다. 관리자에게 변경을 요청하세요.",
1760
2056
  cannotDeleteMetaView: "이 보기는 코드에 정의된 기본 제공 보기이므로 삭제할 수 없습니다.",
1761
2057
  expandToPage: "전체 페이지로 열기",
1762
2058
  objectNotFound: "객체를 찾을 수 없음",
@@ -1767,12 +2063,13 @@ const ko = {
1767
2063
  allRecords: "모든 레코드",
1768
2064
  new: "새로 만들기",
1769
2065
  configureView: "뷰 구성",
1770
- toolbar: "도구 모음",
1771
2066
  toolbarEnabledCount: "{{total}}개 중 {{count}}개 활성화",
1772
2067
  searchFields: "필드 검색…",
1773
2068
  title: "제목",
1774
2069
  viewType: "뷰 유형",
1775
2070
  recordCount: "{{count}}개 레코드",
2071
+ recordCount_one: "{{count}}개 레코드",
2072
+ recordCount_other: "{{count}}개 레코드",
1776
2073
  save: "저장",
1777
2074
  discard: "취소",
1778
2075
  createView: "뷰 생성",
@@ -1784,11 +2081,12 @@ const ko = {
1784
2081
  longitudeField: "경도 필드",
1785
2082
  imageField: "이미지 필드",
1786
2083
  selectField: "필드 선택…",
1787
- groupBy: "그룹화 기준",
1788
2084
  endDateField: "종료 날짜 필드",
1789
2085
  import: "가져오기",
1790
2086
  importTitle: "CSV에서 가져오기",
1791
2087
  importedToast: "{{count}}개 행 가져옴.",
2088
+ importedToast_one: "{{count}}개 행 가져옴.",
2089
+ importedToast_other: "{{count}}개 행 가져옴.",
1792
2090
  importedWithSkipped: "{{ok}}개 행 가져옴; {{skipped}}개 건너뜀.",
1793
2091
  createViewDesc: "보기 유형을 선택하고 이름을 지정하세요. 모든 설정은 나중에 변경할 수 있습니다.",
1794
2092
  cancel: "취소",
@@ -1797,6 +2095,8 @@ const ko = {
1797
2095
  deleteViewTitle: "보기 삭제",
1798
2096
  deleteViewConfirm: "\"{{name}}\" 보기를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
1799
2097
  bulkDeleteConfirm: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
2098
+ bulkDeleteConfirm_one: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
2099
+ bulkDeleteConfirm_other: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
1800
2100
  duplicateViewName: "해당 이름의 보기가 이미 존재합니다.",
1801
2101
  viewTypeGrid: "그리드",
1802
2102
  viewTypeGridDesc: "레코드의 스프레드시트 형식 테이블.",
@@ -1833,10 +2133,14 @@ const ko = {
1833
2133
  chartTypePie: "원형 차트",
1834
2134
  chartTypeArea: "영역 차트",
1835
2135
  chartTypeScatter: "분산형 차트",
1836
- xAxisField: "X축 필드",
1837
- xAxisFieldHelp: "범주형 또는 시간 차원.",
1838
- yAxisField: "Y축 필드",
1839
- yAxisFieldHelp: "집계할 숫자 필드.",
2136
+ dataset: "데이터 세트",
2137
+ datasetHelp: "차트는 이 객체의 데이터 세트에서 숫자를 읽습니다.",
2138
+ chartMeasure: "측정값",
2139
+ chartMeasureHelp: "값 축에 표시할 데이터 세트의 측정값입니다.",
2140
+ chartDimension: "차원",
2141
+ chartDimensionHelp: "값을 그룹화할 데이터 세트의 차원입니다(선택 사항).",
2142
+ viewTypeUnavailableDataset: "이 객체에는 차트에 사용할 데이터 세트가 없습니다.",
2143
+ noDatasetMeasure: "이 데이터 세트에는 차트에 사용할 측정값이 선언되어 있지 않습니다.",
1840
2144
  ufTabs: "탭",
1841
2145
  ufAddField: "+ 필터 필드 추가…",
1842
2146
  ufShowAllRecords: "\"모든 레코드\" 탭 표시",
@@ -1850,6 +2154,9 @@ const ko = {
1850
2154
  unpinItem: "{{name}} 고정 해제",
1851
2155
  dragToReorder: "드래그하여 순서 변경",
1852
2156
  favorites: "즐겨찾기",
2157
+ launcherLabel: "앱 런처",
2158
+ menuLabel: "앱 탐색",
2159
+ menuEmpty: "이 앱에는 열 수 있는 탐색 항목이 없습니다.",
1853
2160
  },
1854
2161
  },
1855
2162
  auth: {
@@ -1903,6 +2210,8 @@ const ko = {
1903
2210
  resendOtpCountdownText: "{seconds}초 후 재전송",
1904
2211
  usePhoneOtpText: "인증 코드로 로그인",
1905
2212
  usePasswordSignInText: "비밀번호로 로그인하기",
2213
+ socialButton: "{provider} 계정으로 계속",
2214
+ orText: "또는 이메일로 계속",
1906
2215
  },
1907
2216
  register: {
1908
2217
  title: "계정 만들기",
@@ -1921,8 +2230,12 @@ const ko = {
1921
2230
  submittingButton: "계정 생성 중…",
1922
2231
  hasAccountText: "이미 계정이 있으신가요?",
1923
2232
  signInText: "로그인",
2233
+ socialButton: "{provider} 계정으로 가입",
2234
+ orText: "또는 이메일로 계속",
1924
2235
  errors: {
1925
2236
  userExists: "해당 이메일로 이미 계정이 존재합니다. 로그인해 보세요.",
2237
+ selfRegistrationClosed: "이 환경에서는 직접 가입을 받지 않습니다. 관리자에게 초대를 요청하세요.",
2238
+ emailDomainNotAllowed: "이 이메일의 도메인으로는 여기에서 가입할 수 없습니다. 조직 이메일을 사용하거나 관리자에게 초대를 요청하세요.",
1926
2239
  },
1927
2240
  verifyInbox: {
1928
2241
  title: "받은 편지함을 확인하세요",
@@ -2121,6 +2434,15 @@ const ko = {
2121
2434
  role: "역할",
2122
2435
  save: "변경 사항 저장",
2123
2436
  },
2437
+ language: {
2438
+ title: "언어",
2439
+ description: "회원님에게 발송되는 알림과 메시지에 사용되는 언어입니다. 화면 표시 언어는 지구본 메뉴에서 따로 변경합니다.",
2440
+ label: "선호 언어",
2441
+ systemDefault: "배포 기본값 사용",
2442
+ save: "저장",
2443
+ saved: "언어 설정을 업데이트했습니다.",
2444
+ readOnly: "이 계정의 언어는 관리자가 관리합니다.",
2445
+ },
2124
2446
  password: {
2125
2447
  changeTitle: "비밀번호 변경",
2126
2448
  setTitle: "로컬 비밀번호 설정",
@@ -2152,7 +2474,6 @@ const ko = {
2152
2474
  label: "워크스페이스",
2153
2475
  default: "내 워크스페이스",
2154
2476
  switch: "워크스페이스 전환",
2155
- create: "워크스페이스 생성",
2156
2477
  createTitle: "워크스페이스 만들기",
2157
2478
  createDescription: "워크스페이스는 팀이 협업할 수 있는 공유 공간입니다.",
2158
2479
  createButton: "워크스페이스 생성",
@@ -2177,7 +2498,6 @@ const ko = {
2177
2498
  packageManagement: "패키지 관리",
2178
2499
  searchNavigation: "내비게이션 검색…",
2179
2500
  settings: "설정",
2180
- help: "도움말",
2181
2501
  helpTooltip: "도움말 및 문서",
2182
2502
  activityFeed: "활동 피드",
2183
2503
  notifications: "알림",
@@ -2237,6 +2557,8 @@ const ko = {
2237
2557
  },
2238
2558
  pendingDrafts: {
2239
2559
  message: "게시되지 않은 변경이 {{count}}건 있습니다 — 게시하면 반영됩니다.",
2560
+ message_one: "게시되지 않은 변경이 {{count}}건 있습니다 — 게시하면 반영됩니다.",
2561
+ message_other: "게시되지 않은 변경이 {{count}}건 있습니다 — 게시하면 반영됩니다.",
2240
2562
  cta: "게시",
2241
2563
  publishing: "게시하는 중…",
2242
2564
  published: "게시했습니다! 변경 사항이 반영되었습니다.",
@@ -2250,7 +2572,6 @@ const ko = {
2250
2572
  capabilityWarn: "작성 검사: 기능 권한 참조 {{count}}개가 아무것도 가리키지 않습니다.",
2251
2573
  },
2252
2574
  title: "홈",
2253
- subtitle: "워크스페이스 대시보드",
2254
2575
  nav: "홈",
2255
2576
  allApps: "모든 애플리케이션",
2256
2577
  yourApps: "내 앱",
@@ -2262,8 +2583,6 @@ const ko = {
2262
2583
  empty: "모두 처리했습니다",
2263
2584
  },
2264
2585
  loading: "워크스페이스 로드 중…",
2265
- recent: "최근",
2266
- starred: "즐겨찾기",
2267
2586
  welcome: "ObjectUI에 오신 것을 환영합니다",
2268
2587
  welcomeDescription: "첫 애플리케이션을 만들거나 시스템 설정을 구성하여 시작하세요.",
2269
2588
  createFirstApp: "첫 앱 만들기",
@@ -2271,8 +2590,6 @@ const ko = {
2271
2590
  browseMarketplace: "앱 마켓플레이스 탐색",
2272
2591
  quickActions: {
2273
2592
  title: "빠른 작업",
2274
- createApp: "앱 생성",
2275
- createAppDesc: "새 애플리케이션으로 시작",
2276
2593
  manageObjects: "객체 관리",
2277
2594
  manageObjectsDesc: "데이터 모델 구성",
2278
2595
  systemSettings: "시스템 설정",
@@ -2288,18 +2605,15 @@ const ko = {
2288
2605
  greetingNight: "야간 작업 중",
2289
2606
  heroTagline: "마지막으로 중단한 곳에서 이어서 하거나 새로운 것을 발견해 보세요.",
2290
2607
  open: "열기",
2291
- stats: {
2292
- apps: "앱",
2293
- starred: "즐겨찾기",
2294
- recent: "최근",
2295
- },
2296
2608
  recentApps: {
2297
2609
  title: "최근 열린 항목",
2298
2610
  itemType: {
2299
2611
  object: "오브젝트",
2300
2612
  dashboard: "대시보드",
2301
2613
  page: "페이지",
2614
+ report: "보고서",
2302
2615
  record: "레코드",
2616
+ metadata: "메타데이터",
2303
2617
  },
2304
2618
  },
2305
2619
  starredApps: {
@@ -2321,7 +2635,6 @@ const ko = {
2321
2635
  organizations: "조직",
2322
2636
  roles: "역할",
2323
2637
  configuration: "구성",
2324
- createApp: "앱 만들기",
2325
2638
  administration: "관리",
2326
2639
  datasources: "데이터 소스",
2327
2640
  documentation: "문서",
@@ -2346,6 +2659,7 @@ const ko = {
2346
2659
  typeUpdate: "업데이트",
2347
2660
  typeDelete: "삭제",
2348
2661
  typeComment: "댓글",
2662
+ typeSystem: "시스템",
2349
2663
  relativeJustNow: "방금 전",
2350
2664
  relativeSecondsAgo: "{{count}}초 전",
2351
2665
  relativeMinutesAgo: "{{count}}분 전",
@@ -2367,8 +2681,11 @@ const ko = {
2367
2681
  placeholder: "오브젝트, 대시보드, 페이지, 보고서 검색…",
2368
2682
  inputAriaLabel: "오브젝트, 대시보드, 페이지, 보고서 검색",
2369
2683
  resultsCount: "\"{{query}}\"에 대한 {{count}}개 결과",
2370
- resultsCountPlural: "\"{{query}}\"에 대한 {{count}}개 결과",
2684
+ resultsCount_one: "\"{{query}}\"에 대한 {{count}}개 결과",
2685
+ resultsCount_other: "\"{{query}}\"에 대한 {{count}}개 결과",
2371
2686
  itemsAvailable: "{{count}}개 항목 사용 가능",
2687
+ itemsAvailable_one: "{{count}}개 항목 사용 가능",
2688
+ itemsAvailable_other: "{{count}}개 항목 사용 가능",
2372
2689
  noResults: "결과를 찾을 수 없습니다",
2373
2690
  noResultsHint: "검색어를 조정해 보세요",
2374
2691
  typeObjects: "오브젝트",
@@ -2393,7 +2710,11 @@ const ko = {
2393
2710
  noAppsConfigured: "구성된 앱 없음",
2394
2711
  noAppsConfiguredDescription: "등록된 앱이 없습니다. 첫 번째 앱을 만들거나 시스템 설정을 방문하세요.",
2395
2712
  appNotAvailable: "앱을 사용할 수 없습니다",
2396
- appNotAvailableDescription: "이 앱을 아직 사용할 수 없습니다 — 아직 게시 중일 수 있습니다. 잠시 후 다시 시도하세요.",
2713
+ appNotAvailableDescription: "이 앱을 사용할 수 없습니다 — 잠시 후 다시 시도하세요.",
2714
+ appNotFound: "이 앱을 열 수 없습니다",
2715
+ appNotFoundDescription: "서버가 회원님의 계정에 대해 이 앱을 반환하지 않았습니다.",
2716
+ appUnreachable: "서버에 연결할 수 없습니다",
2717
+ appUnreachableDescription: "이 앱을 확인할 수 없습니다. 잠시 후 다시 시도하세요.",
2397
2718
  appAccessDenied: "이 앱에 접근할 권한이 없습니다",
2398
2719
  appAccessDeniedDescription: "이 앱은 존재하지만 계정에 여는 권한이 없습니다. 관리자에게 접근 권한을 요청하세요.",
2399
2720
  appAccessDeniedHome: "홈으로 돌아가기",
@@ -2408,11 +2729,11 @@ const ko = {
2408
2729
  description: "계속하려면 필요한 정보를 입력하세요.",
2409
2730
  selectPlaceholder: "{{label}} 선택",
2410
2731
  requiredError: "{{label}}은(는) 필수입니다",
2732
+ unresolvedParam: '이 매개변수는 표시할 수 없습니다. 기반이 되는 필드가 개체 메타데이터에 없어 필요한 컨트롤을 만들 수 없습니다. 관리자에게 작업 정의를 수정하도록 요청하세요.',
2733
+ carryOverHint: '그대로 전달됨(읽기 전용)',
2411
2734
  cancel: "취소",
2412
2735
  confirm: "확인",
2413
2736
  uploading: "업로드 중…",
2414
- defaultActionTitle: "작업",
2415
- ok: "확인",
2416
2737
  lookupPlaceholder: "{{label}}의 레코드 ID",
2417
2738
  lookupHelpText: "이 매개변수에 참조 개체가 설정되어 있지 않아 레코드 선택기를 사용할 수 없습니다. 레코드 ID를 직접 입력하거나 관리자에게 작업 매개변수 수정을 요청하세요.",
2418
2739
  },
@@ -2421,11 +2742,6 @@ const ko = {
2421
2742
  confirm: "계속",
2422
2743
  cancel: "취소",
2423
2744
  },
2424
- rowAction: {
2425
- openMenu: "메뉴 열기",
2426
- edit: "편집",
2427
- delete: "삭제",
2428
- },
2429
2745
  navigationSync: {
2430
2746
  addedPage: "탐색 업데이트: 페이지 \"{{name}}\" 추가됨",
2431
2747
  addedDashboard: "탐색 업데이트: 대시보드 \"{{name}}\" 추가됨",
@@ -2446,6 +2762,8 @@ const ko = {
2446
2762
  noRecordId: "레코드 ID가 없습니다",
2447
2763
  deleteConfirm: "이 레코드를 삭제하시겠습니까?",
2448
2764
  bulkDeleteSuccess: "{{count}}개의 {{label}} 레코드 삭제됨",
2765
+ bulkDeleteSuccess_one: "{{count}}개의 {{label}} 레코드 삭제됨",
2766
+ bulkDeleteSuccess_other: "{{count}}개의 {{label}} 레코드 삭제됨",
2449
2767
  bulkDeletePartial: "{{succeeded}}개 삭제됨, {{failed}}개 실패",
2450
2768
  },
2451
2769
  objectViewActions: {
@@ -2457,15 +2775,6 @@ const ko = {
2457
2775
  exportFailed: "내보내기 실패: {{message}}",
2458
2776
  forecastSoon: "예측 보기가 곧 출시됩니다",
2459
2777
  },
2460
- recordDetail: {
2461
- viewersTooltip: "현재 이 레코드를 보고 있는 사용자",
2462
- },
2463
- cellRender: {
2464
- empty: "비어 있음",
2465
- yes: "예",
2466
- no: "아니요",
2467
- systemFields: "시스템",
2468
- },
2469
2778
  user: {
2470
2779
  profile: "프로필",
2471
2780
  settings: "설정",
@@ -2655,18 +2964,33 @@ const ko = {
2655
2964
  regionLabel: "알림",
2656
2965
  groupCount: "알림 {{count}}건",
2657
2966
  groupUnread: "읽지 않음 {{count}}건",
2967
+ groupUnread_one: "읽지 않음 {{count}}건",
2968
+ groupUnread_other: "읽지 않음 {{count}}건",
2658
2969
  groupMarkRead: "읽음 표시",
2659
2970
  groupMarkReadTitle: "이 유형 전체를 읽음으로 표시",
2660
2971
  empty: "알림 없음",
2661
2972
  markAllRead: "모두 읽음으로 표시",
2662
2973
  viewAll: "모든 알림 보기",
2663
2974
  approvalsPending: "{{count}}건의 승인 대기 중",
2975
+ approvalsPending_one: "{{count}}건의 승인 대기 중",
2976
+ approvalsPending_other: "{{count}}건의 승인 대기 중",
2664
2977
  viewApprovals: "승인 보기",
2665
2978
  noPendingApprovals: "대기 중인 승인 없음",
2666
2979
  openApprovalsInbox: "승인 보관함 열기",
2667
2980
  badgeTotal: "총 {{total}}건",
2668
2981
  badgeNotifications: "알림 {{unread}}건",
2669
2982
  badgeApprovals: "승인 대기 {{approvals}}건",
2983
+ arrivalMany: "새 메시지 {{count}}건",
2984
+ arrivalMany_one: "새 메시지 {{count}}건",
2985
+ arrivalMany_other: "새 메시지 {{count}}건",
2986
+ arrivalRepeats: "이 주제의 새 메시지 {{count}}건",
2987
+ arrivalRepeats_one: "이 주제의 새 메시지 {{count}}건",
2988
+ arrivalRepeats_other: "이 주제의 새 메시지 {{count}}건",
2989
+ arrivalOpen: "보기",
2990
+ toastEnabled: "앱 내 알림",
2991
+ desktopEnabled: "데스크톱 알림",
2992
+ desktopBlocked: "차단됨. 브라우저 설정에서 이 사이트의 알림을 허용하세요.",
2993
+ desktopUnsupported: "이 브라우저는 데스크톱 알림을 지원하지 않습니다.",
2670
2994
  emptyUnread: "모두 읽음",
2671
2995
  filterUnread: "읽지 않음",
2672
2996
  filterAll: "전체",
@@ -2680,12 +3004,14 @@ const ko = {
2680
3004
  thankYouTitle: "감사합니다!",
2681
3005
  thankYouMessage: "제출이 성공적으로 수신되었습니다.",
2682
3006
  redirecting: "{{seconds}}초 후 리디렉션됩니다…",
3007
+ redirectPending: "리디렉션 중…",
2683
3008
  unavailableTitle: "양식을 사용할 수 없습니다",
2684
3009
  unavailableDescription: "이 URL에서 사용 가능한 공개 양식이 없습니다. 기본 보기에서 익명 공유가 활성화되어 있는지 확인하세요.",
2685
3010
  tryDemo: "데모 시도",
2686
3011
  retry: "다시 시도",
2687
3012
  loading: "양식 로딩 중…",
2688
3013
  requiredHint: "* 필수 필드",
3014
+ requiredFields: "필수 항목: {{fields}}",
2689
3015
  consentLabelDefault: "개인정보 처리방침에 동의하며 이 요청을 위해 내 데이터 처리에 동의합니다.",
2690
3016
  consentLink: "개인정보 처리방침",
2691
3017
  consentRequired: "계속하려면 개인정보 처리방침에 동의하세요.",
@@ -2736,6 +3062,8 @@ const ko = {
2736
3062
  noImportableFields: "해당 오브젝트에는 가져올 수 있는 필드가 없습니다.",
2737
3063
  schemaReadFailed: "오브젝트 스키마를 읽을 수 없습니다.",
2738
3064
  imported: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
3065
+ imported_one: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
3066
+ imported_other: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
2739
3067
  importFrom: "실제 데이터 가져오기 원본",
2740
3068
  into: "→",
2741
3069
  opening: "여는 중…",
@@ -2749,6 +3077,76 @@ const ko = {
2749
3077
  openProduction: "프로덕션 열기",
2750
3078
  manageEnvironments: "환경 관리",
2751
3079
  },
3080
+ cloudPlanStatus: {
3081
+ current: "현재 요금제",
3082
+ },
3083
+ ai: {
3084
+ nlQuery: {
3085
+ placeholder: "데이터에 대해 질문하세요…",
3086
+ ask: "질문",
3087
+ results: "결과",
3088
+ match: "일치도 {{percent}}",
3089
+ simulatedSummary: "검색 결과: {{query}}",
3090
+ noResults: "일치하는 레코드가 없습니다",
3091
+ recentQueries: "최근 쿼리",
3092
+ },
3093
+ formAssist: {
3094
+ title: "AI 제안",
3095
+ suggestionCount: "제안 {{count}}개",
3096
+ suggestionCount_one: "제안 {{count}}개",
3097
+ suggestionCount_other: "제안 {{count}}개",
3098
+ applyAll: "모두 적용",
3099
+ confidence: "신뢰도 {{percent}}",
3100
+ appliedCount: "제안 {{count}}개 적용됨",
3101
+ appliedCount_one: "제안 {{count}}개 적용됨",
3102
+ appliedCount_other: "제안 {{count}}개 적용됨",
3103
+ },
3104
+ recommendations: {
3105
+ title: "추천",
3106
+ generating: "추천을 생성하는 중…",
3107
+ empty: "추천 항목이 없습니다",
3108
+ },
3109
+ },
3110
+ aiApprovals: {
3111
+ title: "AI 승인",
3112
+ description: "AI 에이전트가 제안한 작업으로, 실행 전에 사람의 검토가 필요합니다.",
3113
+ tabPending: "대기 중",
3114
+ tabDecided: "처리됨",
3115
+ tabAll: "전체",
3116
+ statusPending: "대기 중",
3117
+ statusApproved: "승인됨",
3118
+ statusExecuted: "실행됨",
3119
+ statusFailed: "실패",
3120
+ statusRejected: "거부됨",
3121
+ colTool: "도구",
3122
+ colAction: "작업",
3123
+ colObject: "객체",
3124
+ colStatus: "상태",
3125
+ colProposed: "제안 시각",
3126
+ colDecision: "결정",
3127
+ emptyTitle: "대기 중인 작업 없음",
3128
+ emptyDescription: "AI가 민감한 작업을 제안하면 검토를 위해 여기에 표시됩니다.",
3129
+ view: "보기",
3130
+ approve: "승인",
3131
+ reject: "거부",
3132
+ working: "처리 중…",
3133
+ approveAndExecute: "승인 후 실행",
3134
+ outcomeApprove: "{{id}} 승인: {{message}}",
3135
+ outcomeReject: "{{id}} 거부: {{message}}",
3136
+ outcomeExecuteFailed: "실행 중 작업이 실패했습니다",
3137
+ drawerFallbackTitle: "대기 중인 작업",
3138
+ drawerSubtitle: "{{object}}에 대한 도구 {{tool}}",
3139
+ fieldProposedBy: "제안자",
3140
+ fieldDecidedBy: "결정자",
3141
+ fieldConversation: "대화",
3142
+ fieldToolInput: "도구 입력",
3143
+ fieldResult: "결과",
3144
+ fieldError: "오류",
3145
+ fieldRejectionReason: "거부 사유",
3146
+ rejectTitle: "이 작업을 거부할까요?",
3147
+ rejectBody: "사유는 AI에 전달되어 다음 응답을 조정하는 데 사용됩니다.",
3148
+ rejectPlaceholder: "사유(선택). 예: ‘레코드 ID가 잘못되었습니다 — 사용자에게 먼저 확인하세요.’",
3149
+ },
2752
3150
  aiModelStatus: {
2753
3151
  summary: "빌드 / 질문은 {{conversational}}({{conversationalSource}}), 구조화 출력은 {{structured}}({{structuredSource}})을(를) 사용합니다.",
2754
3152
  summaryRouting: "라우팅 정책: 무료 요금제 → {{free}}, 유료 요금제 → {{paid}}.",
@@ -2766,6 +3164,111 @@ const ko = {
2766
3164
  sourceInherits: "build/ask와 동일",
2767
3165
  sourcePinned: "{{source}}에 의해 고정됨",
2768
3166
  },
3167
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3168
+ // English-only until this landed while every other string on the same screen
3169
+ // was translated:
3170
+ //
3171
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3172
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3173
+ // closed registry those runtimes are conformance-tested
3174
+ // against). `humanizeToolName` looks each up as
3175
+ // `chatbot.tool.<tool_name>` and falls back to its English
3176
+ // title-caser for a custom / third-party tool, so a name
3177
+ // missing here is degraded, never broken. The `en` values
3178
+ // are deliberately EQUAL to what that title-caser produces:
3179
+ // adding the key must not silently reword the English UI.
3180
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3181
+ // set for both surfaces (they used to carry separate
3182
+ // tables and disagreed on casing).
3183
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3184
+ // FAMILIES: one slot per CLDR category the pack's language
3185
+ // selects (objectui#11432), plus the base key for a call
3186
+ // made without a count. `all-locales-key-parity.test.ts`
3187
+ // derives the required slots from `Intl.PluralRules`.
3188
+ //
3189
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3190
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3191
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3192
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3193
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3194
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3195
+ // against the registry instead of against its own hand-held list.
3196
+ chatbot: {
3197
+ tool: {
3198
+ aggregate_data: "데이터 집계",
3199
+ get_record: "레코드 가져오기",
3200
+ query_data: "데이터 조회",
3201
+ query_records: "레코드 조회",
3202
+ search_knowledge: "지식 검색",
3203
+ visualize_data: "차트 생성",
3204
+ add_field: "필드 추가",
3205
+ apply_blueprint: "앱 생성",
3206
+ apply_edit: "변경 사항 적용",
3207
+ create_metadata: "메타데이터 생성",
3208
+ create_object: "오브젝트 생성",
3209
+ create_package: "패키지 생성",
3210
+ create_seed: "샘플 데이터 생성",
3211
+ delete_field: "필드 삭제",
3212
+ describe_metadata: "메타데이터 확인",
3213
+ describe_object: "오브젝트 구조 확인",
3214
+ get_active_package: "현재 패키지 가져오기",
3215
+ get_authoring_rules: "작성 규칙 가져오기",
3216
+ get_metadata_schema: "메타데이터 구조 가져오기",
3217
+ get_package: "패키지 가져오기",
3218
+ list_metadata: "메타데이터 목록",
3219
+ list_objects: "오브젝트 목록",
3220
+ list_packages: "패키지 목록",
3221
+ load_tools: "도구 불러오기",
3222
+ modify_field: "필드 수정",
3223
+ open_record: "레코드 열기",
3224
+ propose_blueprint: "앱 설계안 작성",
3225
+ set_active_package: "현재 패키지 전환",
3226
+ suggest_builder: "구축 방법 제안",
3227
+ test_flow: "플로우 테스트",
3228
+ todo_write: "할 일 기록",
3229
+ toggle_flow: "플로우 켜기·끄기",
3230
+ update_metadata: "메타데이터 업데이트",
3231
+ validate_expression: "표현식 검증",
3232
+ verify_build: "빌드 검증",
3233
+ },
3234
+ toolState: {
3235
+ agentActivity: "에이전트 활동",
3236
+ pending: "대기 중",
3237
+ running: "실행 중",
3238
+ awaitingApproval: "승인 대기",
3239
+ responded: "응답함",
3240
+ completed: "완료",
3241
+ error: "오류",
3242
+ denied: "거부됨",
3243
+ failed: "실패",
3244
+ },
3245
+ plan: {
3246
+ countObjects: "오브젝트 {{count}}개",
3247
+ countObjects_one: "오브젝트 {{count}}개",
3248
+ countObjects_other: "오브젝트 {{count}}개",
3249
+ countViews: "뷰 {{count}}개",
3250
+ countViews_one: "뷰 {{count}}개",
3251
+ countViews_other: "뷰 {{count}}개",
3252
+ countDashboards: "대시보드 {{count}}개",
3253
+ countDashboards_one: "대시보드 {{count}}개",
3254
+ countDashboards_other: "대시보드 {{count}}개",
3255
+ countSeedData: "샘플 데이터",
3256
+ },
3257
+ build: {
3258
+ building: "{{app}} 빌드 중…",
3259
+ built: "{{app}} 빌드 완료",
3260
+ appFallback: "앱",
3261
+ addingSampleData: "샘플 데이터 추가 중",
3262
+ group: {
3263
+ object: "오브젝트",
3264
+ view: "뷰",
3265
+ dashboard: "대시보드",
3266
+ app: "앱",
3267
+ seed: "샘플 데이터",
3268
+ },
3269
+ moreArtifacts: "외 {{n}}개",
3270
+ },
3271
+ },
2769
3272
  chatbotError: {
2770
3273
  title: "응답 실패",
2771
3274
  fallbackDetail: "문제가 발생했습니다. 다시 시도해 주세요.",
@@ -2846,7 +3349,7 @@ const ko = {
2846
3349
  },
2847
3350
  title: "앱 마켓플레이스",
2848
3351
  subtitle: "ObjectStack 카탈로그에 게시된 승인된 앱을 탐색하세요. 앱을 클릭하여 세부 정보를 보고 환경 중 하나에 설치하세요.",
2849
- searchPlaceholder: "이름 또는 매니페스트 ID로 앱 검색…",
3352
+ searchPlaceholder: '이름 또는 앱 ID로 앱 검색…',
2850
3353
  searchAria: "마켓플레이스 앱 검색",
2851
3354
  installed: "설치됨",
2852
3355
  installedCount: "설치됨 ({{count}})",
@@ -2894,10 +3397,15 @@ const ko = {
2894
3397
  purgeSampleData: '샘플 데이터 삭제',
2895
3398
  purgeConfirm: '이 패키지가 생성한 모든 샘플 레코드를 삭제하시겠습니까? 사용자가 추가한 레코드는 삭제되지 않습니다.',
2896
3399
  purgeSuccess: '샘플 레코드 {{count}}개를 삭제했습니다.',
3400
+ purgeSuccess_one: '샘플 레코드 {{count}}개를 삭제했습니다.',
3401
+ purgeSuccess_other: '샘플 레코드 {{count}}개를 삭제했습니다.',
2897
3402
  purgeNoData: '삭제할 샘플 레코드가 없습니다.',
2898
3403
  reseedQueued: '샘플 데이터는 다음 환경 접속 시 다시 적재됩니다.',
2899
3404
  reseedLocalSuccess: '샘플 데이터를 다시 적재했습니다: {{inserted}}개 추가, {{updated}}개 업데이트.',
2900
3405
  reseedPartialErrors: '({{count}}개 레코드 쓰기 실패)',
3406
+ reseedPartialErrors_one: '({{count}}개 레코드 쓰기 실패)',
3407
+ reseedPartialErrors_other: '({{count}}개 레코드 쓰기 실패)',
3408
+ sampleDataKernelUnavailable: '이 컨트롤 플레인에는 환경 커널이 없어 여기서는 샘플 데이터를 다시 적재하거나 삭제할 수 없습니다. 해당 환경 자체의 런타임에서 실행하세요.',
2901
3409
  updateAvailable: '업데이트 가능',
2902
3410
  },
2903
3411
  action: {
@@ -2950,7 +3458,8 @@ const ko = {
2950
3458
  reviewed: "검토 및 승인됨",
2951
3459
  unreviewed: "아직 검토되지 않음",
2952
3460
  signed: "서명됨",
2953
- grantsIntro: "설치하면 이 패키지에 다음 권한이 부여됩니다:",
3461
+ grantsIntro: "이 패키지가 요청하는 권한:",
3462
+ notEnforced: "이 목록은 설치 시 기록되며 이후 버전이 더 많은 권한을 요청하면 다시 확인합니다. 다만 런타임은 아직 패키지를 이 목록으로 제한하지 않습니다.",
2954
3463
  services: "플랫폼 서비스",
2955
3464
  hooks: "라이프사이클 후크",
2956
3465
  network: "네트워크 액세스",
@@ -2989,32 +3498,21 @@ const ko = {
2989
3498
  storage: "스토리지",
2990
3499
  other: "기타",
2991
3500
  },
2992
- pricing: {
2993
- free: "무료",
2994
- freemium: "프리미엄",
2995
- paid: "유료",
2996
- subscription: "구독",
2997
- "usage-based": "사용량 기반",
2998
- "contact-sales": "영업팀 문의",
2999
- },
3000
3501
  relativeTime: {
3001
3502
  today: "오늘",
3002
3503
  daysAgo: "{{count}}일 전",
3003
3504
  monthsAgo: "{{count}}개월 전",
3505
+ monthsAgo_one: "{{count}}개월 전",
3506
+ monthsAgo_other: "{{count}}개월 전",
3004
3507
  yearsAgo: "{{count}}년 전",
3508
+ yearsAgo_one: "{{count}}년 전",
3509
+ yearsAgo_other: "{{count}}년 전",
3005
3510
  },
3006
3511
  },
3007
- approvals: {
3008
- approve: '승인',
3009
- reject: '반려',
3010
- comment: '의견(선택 사항)',
3011
- approveSuccess: '승인됨',
3012
- rejectSuccess: '반려됨',
3013
- rejectConfirm: '이 승인 요청을 반려하시겠습니까?',
3014
- },
3015
3512
  approvalsInbox: {
3513
+ recordUnresolvable: '이 레코드를 열 수 없습니다',
3016
3514
  loadMore: '더 보기',
3017
- loadingMore: '불러오는 중…',
3515
+ loadingMore: '로딩 중…',
3018
3516
  loadedOf: '{{total}}개 중 {{loaded}}개 로드됨',
3019
3517
  actEscalate: 'SLA 에스컬레이션',
3020
3518
  systemSlaActor: '시스템(SLA)',
@@ -3031,6 +3529,8 @@ const ko = {
3031
3529
  requestInfoSent: '추가 정보 요청을 보냈습니다',
3032
3530
  remindBtn: '독촉',
3033
3531
  remindSuccess: '승인자 {{count}}명에게 알렸습니다',
3532
+ remindSuccess_one: '승인자 {{count}}명에게 알렸습니다',
3533
+ remindSuccess_other: '승인자 {{count}}명에게 알렸습니다',
3034
3534
  remindThrottled: '최근에 이미 독촉했습니다. 잠시 후 다시 시도하세요.',
3035
3535
  replyPlaceholder: '이 요청에 답하기…',
3036
3536
  slaRemaining: 'SLA {{dur}} 남음',
@@ -3047,6 +3547,8 @@ const ko = {
3047
3547
  progressApprovals: '승인 — {{got}} / {{need}}',
3048
3548
  progressGroups: '그룹 승인 — {{got}} / {{need}} 그룹',
3049
3549
  progressEligible: '승인 가능자 {{count}}명',
3550
+ progressEligible_one: '승인 가능자 {{count}}명',
3551
+ progressEligible_other: '승인 가능자 {{count}}명',
3050
3552
  progressBar: '결정 진행 상황',
3051
3553
  declaredActions: '작업',
3052
3554
  attachmentChip: '첨부 파일',
@@ -3078,6 +3580,8 @@ const ko = {
3078
3580
  filterCount: '{{total}}개 중 {{shown}}개',
3079
3581
  selected: '선택됨',
3080
3582
  actionableCount: '({{count}}개 처리 가능)',
3583
+ actionableCount_one: '({{count}}개 처리 가능)',
3584
+ actionableCount_other: '({{count}}개 처리 가능)',
3081
3585
  selectAll: '전체 선택',
3082
3586
  selectRow: '이 요청 선택',
3083
3587
  colRequest: '승인 항목',
@@ -3151,11 +3655,19 @@ const ko = {
3151
3655
  approveN: '{{count}}개 승인',
3152
3656
  rejectN: '{{count}}개 거부',
3153
3657
  bulkApproveTitle: '{{count}}개 요청을 승인할까요?',
3658
+ bulkApproveTitle_one: '{{count}}개 요청을 승인할까요?',
3659
+ bulkApproveTitle_other: '{{count}}개 요청을 승인할까요?',
3154
3660
  bulkApproveBody: '각 요청은 내 ID로 승인되며 해당 플로우는 승인 분기로 진행됩니다.',
3155
3661
  bulkRejectTitle: '{{count}}개 요청을 거부할까요?',
3662
+ bulkRejectTitle_one: '{{count}}개 요청을 거부할까요?',
3663
+ bulkRejectTitle_other: '{{count}}개 요청을 거부할까요?',
3156
3664
  bulkRejectBody: '선택한 요청을 거부하고 신청자에게 알립니다.',
3157
3665
  bulkApproved: '{{count}}개 요청을 승인했습니다',
3666
+ bulkApproved_one: '{{count}}개 요청을 승인했습니다',
3667
+ bulkApproved_other: '{{count}}개 요청을 승인했습니다',
3158
3668
  bulkRejected: '{{count}}개 요청을 거부했습니다',
3669
+ bulkRejected_one: '{{count}}개 요청을 거부했습니다',
3670
+ bulkRejected_other: '{{count}}개 요청을 거부했습니다',
3159
3671
  bulkPartial: '{{ok}}개 성공, {{fail}}개 실패: {{which}}',
3160
3672
  rejectOneTitle: '"{{title}}"을(를) 거부할까요?',
3161
3673
  rejectOneBody: '요청을 거부하고 신청자에게 알립니다.',
@@ -3180,8 +3692,14 @@ const ko = {
3180
3692
  alreadyDecided: '이미 처리된 요청입니다. 목록을 새로고침하세요.',
3181
3693
  justNow: '방금 전',
3182
3694
  minutesAgo: '{{count}}분 전',
3695
+ minutesAgo_one: '{{count}}분 전',
3696
+ minutesAgo_other: '{{count}}분 전',
3183
3697
  hoursAgo: '{{count}}시간 전',
3698
+ hoursAgo_one: '{{count}}시간 전',
3699
+ hoursAgo_other: '{{count}}시간 전',
3184
3700
  daysAgo: '{{count}}일 전',
3701
+ daysAgo_one: '{{count}}일 전',
3702
+ daysAgo_other: '{{count}}일 전',
3185
3703
  },
3186
3704
  preview: {
3187
3705
  empty: {
@@ -3216,11 +3734,15 @@ const ko = {
3216
3734
  detailNone: '차이가 감지되지 않았습니다 — 초안이 게시된 버전과 일치합니다.',
3217
3735
  detailChangedKeys: '기타 변경:',
3218
3736
  confirmNote: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
3737
+ confirmNote_one: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
3738
+ confirmNote_other: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
3219
3739
  publishConfirm: '모두 게시',
3220
- // [objectui#5418] Pre-publish security-posture findings, shown next to
3740
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3221
3741
  // the confirm button so a refusal the door would issue is read BEFORE
3222
3742
  // the click rather than as a toast after the batch rolled back.
3223
3743
  securityBlockTitle: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
3744
+ securityBlockTitle_one: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
3745
+ securityBlockTitle_other: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
3224
3746
  securityBlockWhere: '객체의 설정 → 레코드 공유에서 수정한 후 다시 게시하세요.',
3225
3747
  },
3226
3748
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3245,7 +3767,7 @@ const ko = {
3245
3767
  revertLabel: '변경을 되돌렸습니다',
3246
3768
  applyLabel: '빌드 변경',
3247
3769
  revert: '되돌림',
3248
- items: '항목',
3770
+ items: '{{count}} 항목',
3249
3771
  revertAction: '되돌리기',
3250
3772
  reverted: '되돌렸습니다 — 변경이 취소되었습니다.',
3251
3773
  revertFailed: '되돌리기 실패',
@@ -3274,25 +3796,25 @@ const ko = {
3274
3796
  rangeEnd: "끝",
3275
3797
  operators: {
3276
3798
  equals: "같음",
3277
- notEquals: "같지 않음",
3799
+ not_equals: "같지 않음",
3278
3800
  contains: "포함",
3279
- containsCaseInsensitive: "포함 (대소문자 무시)",
3280
- notContains: "포함하지 않음",
3281
- isEmpty: "비어 있음",
3282
- isNotEmpty: "비어 있지 않음",
3283
- greaterThan: "보다 큼",
3284
- lessThan: "보다 작음",
3285
- greaterOrEqual: "크거나 같음",
3286
- lessOrEqual: "작거나 같음",
3801
+ icontains: "포함 (대소문자 무시)",
3802
+ not_contains: "포함하지 않음",
3803
+ is_empty: "비어 있음",
3804
+ is_not_empty: "비어 있지 않음",
3805
+ greater_than: "보다 큼",
3806
+ less_than: "보다 작음",
3807
+ greater_than_or_equal: "크거나 같음",
3808
+ less_than_or_equal: "작거나 같음",
3287
3809
  before: "이전",
3288
3810
  after: "이후",
3289
3811
  between: "사이",
3290
3812
  in: "포함됨",
3291
- notIn: "포함되지 않음",
3292
- startsWith: "다음으로 시작",
3293
- endsWith: "다음으로 끝남",
3294
- isNull: "null임",
3295
- isNotNull: "null이 아님",
3813
+ not_in: "포함되지 않음",
3814
+ starts_with: "다음으로 시작",
3815
+ ends_with: "다음으로 끝남",
3816
+ is_null: "null임",
3817
+ is_not_null: "null이 아님",
3296
3818
  exists: "설정됨",
3297
3819
  notExists: "설정되지 않음",
3298
3820
  },
@@ -3308,7 +3830,8 @@ const ko = {
3308
3830
  },
3309
3831
  collaboration: {
3310
3832
  commentCount: "댓글 {{count}}개",
3311
- commentCountOne: "댓글 {{count}}개",
3833
+ commentCount_one: "댓글 {{count}}개",
3834
+ commentCount_other: "댓글 {{count}}개",
3312
3835
  resolvedSuffix: " · 해결됨",
3313
3836
  sortComments: "댓글 정렬",
3314
3837
  sortOldest: "오래된 순",
@@ -3317,11 +3840,18 @@ const ko = {
3317
3840
  reopen: "다시 열기",
3318
3841
  justNow: "방금",
3319
3842
  minutesAgo: "{{count}}분 전",
3843
+ minutesAgo_one: "{{count}}분 전",
3844
+ minutesAgo_other: "{{count}}분 전",
3320
3845
  hoursAgo: "{{count}}시간 전",
3846
+ hoursAgo_one: "{{count}}시간 전",
3847
+ hoursAgo_other: "{{count}}시간 전",
3321
3848
  daysAgo: "{{count}}일 전",
3849
+ daysAgo_one: "{{count}}일 전",
3850
+ daysAgo_other: "{{count}}일 전",
3322
3851
  edited: "(수정됨)",
3323
3852
  reactionCount: "반응 {{count}}개",
3324
- reactionCountOne: "반응 {{count}}개",
3853
+ reactionCount_one: "반응 {{count}}개",
3854
+ reactionCount_other: "반응 {{count}}개",
3325
3855
  addThumbsUp: "좋아요 추가",
3326
3856
  reply: "답글",
3327
3857
  reactThumbsUp: "좋아요로 반응",
@@ -3332,9 +3862,11 @@ const ko = {
3332
3862
  commentPlaceholder: "댓글 추가…(@로 멘션)",
3333
3863
  send: "보내기",
3334
3864
  presentUserCount: "{{count}}명 접속 중",
3335
- presentUserCountOne: "{{count}}명 접속 중",
3865
+ presentUserCount_one: "{{count}}명 접속 중",
3866
+ presentUserCount_other: "{{count}}명 접속 중",
3336
3867
  moreUserCount: "외 {{count}}명",
3337
- moreUserCountOne: "외 {{count}}명",
3868
+ moreUserCount_one: "외 {{count}}명",
3869
+ moreUserCount_other: "외 {{count}}명",
3338
3870
  userStatusTitle: "{{name}}({{status}})",
3339
3871
  statusActive: "활성",
3340
3872
  statusIdle: "유휴",
@@ -3342,6 +3874,11 @@ const ko = {
3342
3874
  },
3343
3875
  wizard: {
3344
3876
  missingRequired: "필수 항목을 입력하세요: {{fields}}",
3877
+ back: "뒤로",
3878
+ submitting: "제출 중…",
3879
+ stepFallback: "{{n}}단계",
3880
+ progressLabel: "진행 상황",
3881
+ emptyStep: "이 단계에 구성된 필드가 없습니다",
3345
3882
  },
3346
3883
  flowRunner: {
3347
3884
  title: '입력',
@@ -3399,5 +3936,48 @@ const ko = {
3399
3936
  bulkOperationFailed: "일괄 작업 실패: {{reason}}",
3400
3937
  },
3401
3938
  },
3939
+ // objectui#6301 — 설정 › 패키지 자동화 (ADR-0126 §7.4). 용어는 기존 번역을
3940
+ // 따릅니다: `common.package` = 패키지, `flowRunner.completed` = 플로우,
3941
+ // 인용부호는 「」. ⛔ 계보·드리프트를 나타내는 표현은 이 그룹에 두지 않습니다 (§9).
3942
+ packagedAutomation: {
3943
+ title: "패키지 자동화",
3944
+ subtitle: "설치된 패키지가 제공하는 플로우와 액션입니다. 이 배포에서 끌 수 있으며, 플로우는 새 이름으로 복제해 사용자 지정할 수도 있습니다. 편집은 Studio에서 합니다.",
3945
+ refresh: "새로고침",
3946
+ flowsHeading: "패키지 플로우",
3947
+ actionsHeading: "패키지 액션",
3948
+ colFlow: "플로우",
3949
+ colActivation: "활성화 상태",
3950
+ colActions: "작업",
3951
+ toggleLabel: "{{label}}의 활성화 상태",
3952
+ on: "켜짐",
3953
+ off: "꺼짐",
3954
+ clone: "복제",
3955
+ cloneTitle: "패키지 플로우 복제",
3956
+ cloneBody: "사본은 정의 전체를 그대로 가져가며 새 머신 이름과 레이블이 필요합니다. 사본은 Studio에서 편집하세요.",
3957
+ cloneName: "새 머신 이름",
3958
+ cloneLabel: "새 레이블",
3959
+ cancel: "취소",
3960
+ cloneConfirm: "복제본 만들기",
3961
+ cloneCreated: "플로우 「{{name}}」을(를) 만들었습니다.",
3962
+ emptyTitle: "패키지 플로우 없음",
3963
+ emptyBody: "이 배포에는 자동화 플로우를 제공하는 설치된 패키지가 없습니다. 직접 작성한 플로우는 Studio에 있습니다.",
3964
+ loadFailed: "패키지 자동화를 불러오지 못했습니다.",
3965
+ toggleFailedHttp: "활성화 상태를 변경하지 못했습니다 (HTTP {{status}}).",
3966
+ toggleFailed: "활성화 상태를 변경하지 못했습니다.",
3967
+ cloneFailedHttp: "이 플로우를 복제하지 못했습니다 (HTTP {{status}}).",
3968
+ cloneFailed: "이 플로우를 복제하지 못했습니다.",
3969
+ actionsSubtitle: "설치된 패키지가 제공하는 액션입니다. 이 배포에서 끄면 액션이 제공되는 모든 곳에서 실행되지 않습니다. Studio에서 직접 액션을 따로 작성하는 것은 계속 가능합니다.",
3970
+ colAction: "액션",
3971
+ colObject: "오브젝트",
3972
+ actionToggleLabel: "{{object}}의 {{label}} 활성화 상태",
3973
+ actionsEmptyTitle: "패키지 액션 없음",
3974
+ actionsEmptyBody: "이 배포에는 액션을 선언하는 설치된 패키지가 없습니다. 직접 작성한 액션은 Studio에 있습니다.",
3975
+ actionsLoadFailed: "패키지 액션을 불러오지 못했습니다.",
3976
+ },
3977
+ element: {
3978
+ number: {
3979
+ noObject: "개체가 지정되지 않았습니다. object 또는 dataSource.object를 설정하세요.",
3980
+ },
3981
+ },
3402
3982
  };
3403
3983
  export default ko;