@object-ui/i18n 17.6.0 → 18.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +5408 -0
  2. package/README.md +255 -13
  3. package/dist/LocalizationContext.d.ts +32 -9
  4. package/dist/LocalizationContext.js +32 -10
  5. package/dist/builtinAggregateLabels.d.ts +40 -0
  6. package/dist/builtinAggregateLabels.js +23 -0
  7. package/dist/currency.d.ts +27 -3
  8. package/dist/currency.js +28 -4
  9. package/dist/fallbackInterpolation.d.ts +79 -0
  10. package/dist/fallbackInterpolation.js +124 -0
  11. package/dist/i18n.d.ts +27 -1
  12. package/dist/i18n.js +99 -16
  13. package/dist/index.d.ts +8 -13
  14. package/dist/index.js +45 -17
  15. package/dist/locales/ar.d.ts +1504 -188
  16. package/dist/locales/ar.js +1711 -281
  17. package/dist/locales/de.d.ts +1080 -188
  18. package/dist/locales/de.js +1248 -261
  19. package/dist/locales/en.d.ts +1141 -249
  20. package/dist/locales/en.js +1714 -295
  21. package/dist/locales/es.d.ts +1186 -188
  22. package/dist/locales/es.js +1350 -255
  23. package/dist/locales/fr.d.ts +1186 -188
  24. package/dist/locales/fr.js +1351 -258
  25. package/dist/locales/index.d.ts +11940 -2033
  26. package/dist/locales/index.js +48 -9
  27. package/dist/locales/ja.d.ts +1080 -188
  28. package/dist/locales/ja.js +1240 -254
  29. package/dist/locales/ko.d.ts +1080 -188
  30. package/dist/locales/ko.js +1244 -258
  31. package/dist/locales/pt.d.ts +1186 -188
  32. package/dist/locales/pt.js +1350 -255
  33. package/dist/locales/registry.d.ts +102 -0
  34. package/dist/locales/registry.js +220 -0
  35. package/dist/locales/rtl.d.ts +24 -0
  36. package/dist/locales/rtl.js +26 -0
  37. package/dist/locales/ru.d.ts +1292 -188
  38. package/dist/locales/ru.js +1479 -272
  39. package/dist/locales/zh.d.ts +1144 -252
  40. package/dist/locales/zh.js +1245 -259
  41. package/dist/pickLocalized.d.ts +30 -0
  42. package/dist/pickLocalized.js +39 -0
  43. package/dist/provider.d.ts +101 -12
  44. package/dist/provider.js +335 -50
  45. package/dist/translateFn.d.ts +29 -0
  46. package/dist/translateFn.js +8 -0
  47. package/dist/useDisplayLocale.d.ts +11 -0
  48. package/dist/useDisplayLocale.js +11 -0
  49. package/dist/useObjectLabel.d.ts +143 -100
  50. package/dist/useObjectLabel.js +129 -82
  51. package/dist/useSafeTranslation.js +40 -42
  52. package/dist/utils/first-day-of-week.d.ts +71 -0
  53. package/dist/utils/first-day-of-week.js +61 -0
  54. package/dist/utils/formatting.d.ts +23 -1
  55. package/dist/utils/formatting.js +34 -5
  56. package/dist/utils/index.d.ts +1 -0
  57. package/dist/utils/index.js +1 -0
  58. package/dist/utils/spec-formatters.d.ts +13 -23
  59. package/dist/utils/spec-formatters.js +41 -2
  60. package/dist/utils/spec-translations.d.ts +16 -3
  61. package/dist/utils/spec-translations.js +52 -13
  62. package/package.json +12 -6
@@ -13,16 +13,19 @@ const ko = {
13
13
  notRestored: '서버가 요청을 받았지만 관리자 세션을 복원하지 않았습니다. 여전히 {{user}} 계정을 대행하고 있습니다. 로그아웃 후 다시 로그인하여 종료하세요.',
14
14
  },
15
15
  },
16
- // objectui#2600 B5 — capability picker scope group headers (labels come from the sys_capability registry).
16
+ // objectui#2600 B5 — capability picker scope group headers (labels come from the capability registry).
17
17
  capability: {
18
18
  label: {
19
19
  manage_users: "사용자 관리",
20
20
  manage_org_users: "조직 사용자 관리",
21
21
  manage_metadata: "메타데이터 관리",
22
+ manage_mailboxes: "메일함 관리",
22
23
  manage_platform_settings: "플랫폼 설정 관리",
23
24
  setup_access: "설정 접근",
24
25
  setup_write: "설정 쓰기",
25
26
  studio_access: "Studio 접근",
27
+ manage_sharing: "공유 관리",
28
+ view_all_audit_log: "모든 감사 로그 보기",
26
29
  },
27
30
  group: {
28
31
  platform: '플랫폼',
@@ -30,26 +33,6 @@ const ko = {
30
33
  other: '기타',
31
34
  },
32
35
  },
33
- // objectui#3546 slice six — PermissionFacetLink 의 권한 파셋 요약.
34
- // 수량 라벨은 appDesigner.objectManager.fieldCount 와 같은 "{{count}}개 + 단위" 형식.
35
- // 한국어에는 단수/복수 구분이 없어 `_one` 은 기본 키와 같은 값(의도적).
36
- perm: {
37
- facet: {
38
- none: "없음",
39
- more: "+{{count}} 더보기",
40
- objects: "{{count}}개 오브젝트",
41
- objects_one: "{{count}}개 오브젝트",
42
- fields: "{{count}}개 필드 규칙",
43
- fields_one: "{{count}}개 필드 규칙",
44
- rls: "{{count}}개 RLS 정책",
45
- rls_one: "{{count}}개 RLS 정책",
46
- tabs: "{{count}}개 탭 규칙",
47
- tabs_one: "{{count}}개 탭 규칙",
48
- adminScope: "위임 관리가 구성됨",
49
- designInStudio: "Studio에서 디자인 →",
50
- designInStudioHint: "Studio에서 디자인",
51
- },
52
- },
53
36
  lookup: {
54
37
  recentlyUsed: '최근 사용',
55
38
  allResults: '모든 결과',
@@ -63,7 +46,8 @@ const ko = {
63
46
  selectFirst: '먼저 {{fields}}을(를) 선택하세요',
64
47
  selectRecord: '레코드 선택',
65
48
  recordCount: '레코드 {{count}}개',
66
- recordCountOne: '레코드 1개',
49
+ recordCount_one: '레코드 {{count}}개',
50
+ recordCount_other: '레코드 {{count}}개',
67
51
  pageOf: '{{total}}페이지 중 {{current}}페이지',
68
52
  filters: '필터',
69
53
  clear: '지우기',
@@ -116,14 +100,26 @@ const ko = {
116
100
  closePanel: "패널 닫기",
117
101
  resizeDrawer: "패널 너비 조정",
118
102
  itemCount: "{{count}}개 항목",
119
- itemCountOne: "{{count}}개 항목",
103
+ itemCount_one: "{{count}}개 항목",
104
+ itemCount_other: "{{count}}개 항목",
120
105
  toggleSidebar: "사이드바 전환",
106
+ breadcrumb: "탐색 경로",
121
107
  package: "패키지",
122
108
  done: "완료",
123
109
  editInStudio: "Studio에서 편집",
124
110
  record: "레코드",
125
111
  retry: "다시 시도",
126
112
  printDialogHint: "브라우저의 인쇄 대화 상자를 엽니다(PDF 내보내기가 아닙니다)",
113
+ // The non-grid row ceiling's footnote (objectui#7210). Two keys because
114
+ // there are two conditions: a reported `total` states the fact with BOTH
115
+ // numbers, a missing one cannot name how many. Kept terse deliberately —
116
+ // this copy is eagerly loaded, and since objectui#7399 these bytes are
117
+ // budgeted by the `i18n-locales` chunk, not `framework`. ⛔ That ceiling's
118
+ // headroom is deliberately NOT restated here — it moves on every
119
+ // re-baseline, and the figure that was here went stale.
120
+ // `pnpm check:eager-closure` prints it.
121
+ rowCeilingNote: "전체 {{total}}개 중 처음 {{shown}}개를 표시합니다. 필터를 좁히세요.",
122
+ rowCeilingNoteUnknownTotal: "처음 {{shown}}개를 표시합니다. 필터를 좁히세요.",
127
123
  },
128
124
  actions: {
129
125
  decisionOutput: {
@@ -135,6 +131,15 @@ const ko = {
135
131
  acknowledge: '저장했습니다',
136
132
  copyAll: '모두 복사',
137
133
  },
134
+ notAvailableHere: '"{{action}}"은(는) 현재 페이지에서 사용할 수 없습니다.',
135
+ notAvailableForRecord: '이 레코드에서는 사용할 수 없습니다',
136
+ completedSuccessfully: '작업이 완료되었습니다',
137
+ failed: '작업 실패',
138
+ parallelFailed: '하나 이상의 병렬 작업이 실패했습니다',
139
+ undo: '실행 취소',
140
+ undone: '변경 실행 취소됨',
141
+ undoneOperation: '실행 취소: {{description}}',
142
+ redoneOperation: '다시 실행: {{description}}',
138
143
  },
139
144
  validation: {
140
145
  required: "{{field}}은(는) 필수입니다",
@@ -152,19 +157,47 @@ const ko = {
152
157
  },
153
158
  form: {
154
159
  noPermissionToSave: "이 레코드를 저장할 권한이 없습니다.",
160
+ noPermissionToCreate: "{{object}} 생성 권한이 없습니다. 필드는 읽기 전용입니다.",
161
+ noPermissionToEdit: "{{object}} 편집 권한이 없습니다. 필드는 읽기 전용입니다.",
155
162
  submitFailed: "저장하지 못했습니다. 다시 시도해 주세요.",
163
+ uploadInFlight: "업로드가 완료된 후에 저장하세요.",
164
+ clearedOnHide: "현재 값에 더 이상 해당하지 않는 항목을 비웠습니다: {{fields}}",
165
+ visibleWhenFaulted: "제출할 수 없습니다: {{fields}}의 visibleWhen 규칙을 평가할 수 없습니다. 이 양식을 제출하려면 먼저 규칙을 수정해야 합니다.",
156
166
  discardTitle: "변경 내용을 버릴까요?",
157
167
  discardMessage: "저장하지 않은 변경 내용이 있습니다. 지금 이 양식을 닫으면 편집 내용이 사라집니다.",
158
168
  // objectui#4024 — the create/edit dialog's `sr-only` accessible
159
169
  // description, used when the form declares no `description` of its own.
160
170
  dialogDescriptionFallback: "양식 필드를 작성한 다음 제출하거나 취소하세요.",
171
+ deniedDescription: "이 필드를 편집할 권한이 없습니다.",
172
+ serverDefaultHint: "저장 시 자동으로 설정됩니다.",
173
+ maxFileSize: "최대 크기: {{size}}",
174
+ masterDetail: {
175
+ loadingColumns: "열 로드 중…",
176
+ subtotal: "소계",
177
+ tax: "세금({{rate}}%)",
178
+ total: "합계",
179
+ lineItem: "라인 항목",
180
+ rowTitle: "{{title}} — {{row}}행",
181
+ applyRow: "적용",
182
+ editorDescription: "레코드와 라인 항목을 입력한 다음 저장하세요.",
183
+ noChildObject: "이 컬렉션에 하위 개체가 구성되지 않았습니다. {{property}}을(를) 행을 나열할 개체로 설정하세요.",
184
+ schemaUnavailable: "{{object}}의 스키마를 불러올 수 없어 이 컬렉션에 표시할 열이 없습니다. 개체가 존재하고 읽을 수 있는지 확인한 다음 다시 불러오세요.",
185
+ noRelationshipField: "{{object}}이(가) {{parent}}에 어떻게 연결되는지 확인할 수 없습니다. 부모를 참조하는 lookup 또는 master_detail 필드가 없습니다. 이 컬렉션의 {{property}}을(를) 부모 레코드를 보유한 필드로 설정하세요.",
186
+ },
187
+ lineItems: {
188
+ title: "라인 항목",
189
+ saveRecordFirst: "라인 항목을 추가하려면 먼저 레코드를 저장하세요.",
190
+ notLoaded: "이 레코드의 라인 항목을 불러오지 않았습니다.",
191
+ loadFailed: "라인 항목을 불러오지 못했습니다",
192
+ saveFailed: "라인 항목을 저장하지 못했습니다",
193
+ noChildObject: "이 패널에 하위 개체가 구성되지 않았습니다. {{property}}을(를) 행을 나열할 개체로 설정하세요.",
194
+ },
161
195
  keepEditing: "계속 편집",
162
196
  discard: "버리기",
163
197
  conflictTitle: "저장 충돌",
164
198
  conflictMessage: "편집하는 동안 다른 사용자가 이 레코드를 변경했습니다. 덮어쓰면 상대방의 변경 내용이 내 내용으로 대체됩니다.",
165
199
  conflictLatestVersion: "상대방 저장 시각: {{time}}",
166
200
  conflictOverwrite: "덮어쓰기",
167
- addItem: "항목 추가",
168
201
  removeItem: "항목 제거",
169
202
  fieldRequired: "이 필드는 필수입니다",
170
203
  invalidFormat: "형식이 올바르지 않습니다",
@@ -182,6 +215,12 @@ const ko = {
182
215
  createSuccess: "{{object}} 생성됨",
183
216
  updateSuccess: "{{object}} 업데이트됨",
184
217
  deleteSuccess: "{{object}} 삭제됨",
218
+ created: "생성됨",
219
+ saved: "저장됨",
220
+ savedNamed: "{{title}} 저장됨",
221
+ submitted: "제출됨",
222
+ errorLoading: "양식 로딩 오류",
223
+ navigateRefused: "이 양식에 선언된 `navigateOnSuccess` 대상이 거부되어 이동하지 않았습니다.",
185
224
  fullscreen: {
186
225
  title: "텍스트 편집",
187
226
  description: "전체 텍스트 값을 편집한 다음 변경 사항을 저장하거나 취소하세요.",
@@ -200,12 +239,18 @@ const ko = {
200
239
  remove: "이미지 {{index}} 삭제",
201
240
  enlarge: "{{name}} 확대",
202
241
  preview: "이미지 미리보기",
242
+ cropPreview: "이미지 자르기 미리보기",
203
243
  previous: "이전 이미지",
204
244
  next: "다음 이미지",
205
245
  counter: "{{current}} / {{total}}",
206
246
  },
247
+ percent: {
248
+ slider: "백분율",
249
+ },
207
250
  relativeDate: {
208
251
  overdue: "기한 초과 {{count}}일",
252
+ overdue_one: "기한 초과 {{count}}일",
253
+ overdue_other: "기한 초과 {{count}}일",
209
254
  },
210
255
  file: {
211
256
  dragDropHere: '파일을 여기로 끌어다 놓기',
@@ -222,6 +267,9 @@ const ko = {
222
267
  remove: '{{name}} 제거',
223
268
  exceedsMaxSize: '"{{name}}"이(가) 최대 크기({{max}} MB)를 초과합니다',
224
269
  uploadFailed: '"{{name}}" 업로드 실패: {{error}}',
270
+ uploadIncomplete: '"{{name}}" 업로드가 완료되지 않았습니다: 파일 ID가 반환되지 않아 저장된 내용이 없습니다',
271
+ restricted: '제한된 파일',
272
+ restrictedHint: '이 파일의 세부 정보에 접근할 권한이 없습니다',
225
273
  },
226
274
  richText: {
227
275
  format: "형식: {{format}}",
@@ -238,9 +286,13 @@ const ko = {
238
286
  search: "객체 검색…",
239
287
  empty: "객체를 찾을 수 없습니다",
240
288
  },
289
+ registryRef: {
290
+ loadFailed: "목록을 불러오지 못했습니다. 이름을 직접 입력할 수 있습니다.",
291
+ notFound: "{{name}} (찾을 수 없음)",
292
+ },
241
293
  recipient: {
242
294
  selectTypeFirst: "먼저 수신자 유형을 선택하세요.",
243
- loading: "불러오는 중…",
295
+ loading: "로딩 중…",
244
296
  search: "검색…",
245
297
  empty: "일치하는 항목 없음",
246
298
  select: "수신자 선택",
@@ -249,6 +301,9 @@ const ko = {
249
301
  selectBusinessUnit: "사업 단위 선택",
250
302
  selectPosition: "직위 선택",
251
303
  selectUnitAndSubordinates: "사업 단위 선택",
304
+ selectField: "사용자 필드 선택",
305
+ noUserFields: "이 객체에는 사용자 필드가 없습니다",
306
+ fieldNotUserTyped: "{{name}} — 사용자 필드가 아닙니다",
252
307
  },
253
308
  filterCondition: {
254
309
  selectObjectFirst: "먼저 객체를 선택하세요.",
@@ -259,6 +314,33 @@ const ko = {
259
314
  editAsJson: "JSON으로 편집",
260
315
  useVisualBuilder: "비주얼 빌더 사용",
261
316
  },
317
+ object: {
318
+ invalidJson: "잘못된 JSON",
319
+ },
320
+ location: {
321
+ refusedFormat: "저장되지 않았습니다: 위도, 경도 쌍으로 입력하세요(예: 30.2741, 120.1551).",
322
+ refusedRange: "저장되지 않았습니다: {{detail}}",
323
+ latitude: "위도",
324
+ longitude: "경도",
325
+ refusedResidueOne: "저장되지 않았습니다: {{name}} “{{text}}”은(는) 숫자가 아닙니다. 일반 소수로 입력하세요(예: 30.2741, 120.1551).",
326
+ refusedResidue: "저장되지 않았습니다: {{name}} “{{text}}”과(와) {{otherName}} “{{otherText}}”은(는) 숫자가 아닙니다. 일반 소수로 입력하세요(예: 30.2741, 120.1551).",
327
+ },
328
+ date: {
329
+ impossibleDay: "저장된 값 “{{value}}”은(는) 실제 날짜가 아닙니다. 바꾸려면 날짜를 선택하세요.",
330
+ },
331
+ dateTime: {
332
+ impossibleDay: "저장된 값 “{{value}}”은(는) 실제 날짜가 아닙니다. 바꾸려면 날짜와 시간을 선택하세요.",
333
+ },
334
+ datePicker: {
335
+ today: "오늘",
336
+ tomorrow: "내일",
337
+ clear: "날짜 지우기",
338
+ openCalendar: "달력 열기",
339
+ invalid: "저장되지 않음: “{{value}}”은(는) 날짜가 아닙니다. {{format}} 형식으로 입력하거나 달력에서 선택하세요.",
340
+ },
341
+ number: {
342
+ badInput: "저장되지 않았습니다: 이 입력란의 텍스트는 숫자가 아닙니다. 일반 소수로 입력하세요(예: {{example}}).",
343
+ },
262
344
  tags: {
263
345
  placeholder: "입력 후 Enter 키로 추가…",
264
346
  },
@@ -270,10 +352,25 @@ const ko = {
270
352
  postalCode: "우편번호",
271
353
  country: "국가",
272
354
  },
355
+ boolean: {
356
+ offBadge: "{{label}} — 꺼짐",
357
+ completed: "완료됨",
358
+ notCompleted: "완료되지 않음",
359
+ },
273
360
  textarea: {
274
361
  characterCount: "글자 수: {{max}}자 중 {{count}}자",
275
362
  charactersRemaining: "{{count}}자 남음",
276
363
  },
364
+ grid: {
365
+ addLine: "행 추가",
366
+ noItems: "항목 없음",
367
+ noItemsAddHint: "아직 항목이 없습니다. “{{label}}”을(를) 클릭하여 시작하세요.",
368
+ optionalColumns: "선택 열",
369
+ computed: "자동 계산",
370
+ openRow: "행 열기",
371
+ duplicateRow: "행 복제",
372
+ removeRow: "행 삭제",
373
+ },
277
374
  },
278
375
  table: {
279
376
  rowsPerPage: "페이지당 행 수",
@@ -289,10 +386,15 @@ const ko = {
289
386
  selectAllRows: "모든 행 선택",
290
387
  expandRow: "행 펼치기",
291
388
  collapseRow: "행 접기",
389
+ rowActions: "행 작업",
292
390
  hideColumn: "열 숨기기",
293
391
  freezeColumn: "열 고정",
294
392
  unfreezeColumn: "열 고정 해제",
295
393
  pageInfo: "{{total}} 페이지 중 {{current}} 페이지",
394
+ firstPage: "첫 페이지",
395
+ previousPage: "이전 페이지",
396
+ nextPage: "다음 페이지",
397
+ lastPage: "마지막 페이지",
296
398
  totalRecords: "총 {{count}}개",
297
399
  noResults: "결과 없음",
298
400
  noResultsHint: "필터 또는 검색어를 조정해 보세요.",
@@ -302,23 +404,39 @@ const ko = {
302
404
  open: "열기",
303
405
  search: "검색…",
304
406
  modified: "{{count}}개 행 수정됨",
407
+ modified_one: "{{count}}개 행 수정됨",
408
+ modified_other: "{{count}}개 행 수정됨",
409
+ saved: "{{count}}개 행 저장됨",
410
+ saved_one: "{{count}}개 행 저장됨",
411
+ saved_other: "{{count}}개 행 저장됨",
305
412
  saveFailed: '저장 실패',
306
413
  selected: "{{count}}개 선택됨",
414
+ selected_one: "{{count}}개 선택됨",
415
+ selected_other: "{{count}}개 선택됨",
307
416
  edit: "편집",
308
417
  delete: "삭제",
309
418
  },
310
419
  grid: {
311
420
  bulkSelected: "{{count}}건 선택됨",
421
+ bulkSelected_one: "{{count}}건 선택됨",
422
+ bulkSelected_other: "{{count}}건 선택됨",
312
423
  bulkSelectedAllMatches: "{{count}}건 선택됨(일치 항목 전체)",
313
424
  bulkClear: "선택 해제",
314
425
  bulkAllOnPage: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
426
+ bulkAllOnPage_one: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
427
+ bulkAllOnPage_other: "이 페이지의 {{count}}건이 모두 선택되었습니다.",
315
428
  bulkSelectAllMatching: "일치하는 {{count}}건 모두 선택",
316
429
  bulkAllMatchingSelected: "일치하는 레코드 {{count}}건이 모두 선택되었습니다.",
430
+ bulkActions: "일괄 작업",
317
431
  bulk: {
318
432
  confirmDefault: "레코드 {{count}}건에 적용됩니다.",
433
+ confirmDefault_one: "레코드 {{count}}건에 적용됩니다.",
434
+ confirmDefault_other: "레코드 {{count}}건에 적용됩니다.",
319
435
  overLimit: "선택 건수({{count}})가 작업 한도({{limit}})를 초과합니다. 선택을 줄여 주세요.",
320
436
  affectedRecords: "영향을 받는 레코드({{count}}):",
321
437
  skippedIneligible: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
438
+ skippedIneligible_one: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
439
+ skippedIneligible_other: "선택한 레코드 중 {{count}}건은 이 작업의 대상이 아니므로 건너뜁니다.",
322
440
  rowFallback: "{{index}}행",
323
441
  andMore: "… 외 {{count}}건",
324
442
  processed: "{{count}} / {{total}} 처리됨",
@@ -336,8 +454,7 @@ const ko = {
336
454
  undo: "되돌리기",
337
455
  undoing: "되돌리는 중…",
338
456
  done: "완료",
339
- selectPlaceholder: "선택…",
340
- loading: "불러오는 중…",
457
+ loading: "로딩 중…",
341
458
  },
342
459
  actions: "작업",
343
460
  edit: "편집",
@@ -349,17 +466,27 @@ const ko = {
349
466
  pullToRefresh: "당겨서 새로고침",
350
467
  refreshing: "새로고침 중…",
351
468
  openRecord: "레코드 열기",
469
+ recordUnavailable: "{{object}} · 레코드를 사용할 수 없음",
352
470
  rowHeight: "행 높이: {{mode}}",
353
471
  openMenu: "메뉴 열기",
354
472
  empty: "비어 있음",
355
473
  yes: "예",
356
474
  no: "아니요",
357
475
  systemFields: "시스템",
476
+ // objectui#10881 — the grouped grid's two refusals: over a data source
477
+ // that cannot answer the group header query, and over rows a host
478
+ // handed in while declaring them one page of more. `queryGroupHeaders`
479
+ // is the member's name and stays untranslated.
480
+ grouping: {
481
+ needsHeaderQuery: "이 뷰는 그룹화되어 있지만 데이터 소스가 queryGroupHeaders를 구현하지 않아 그룹 개수를 셀 수 없습니다. 레코드를 표시하려면 그룹화를 제거하세요.",
482
+ needsWholeRows: "그룹화에는 모든 레코드가 필요하지만 이 그리드에는 한 페이지만 전달되어 그룹 개수를 셀 수 없습니다. 모든 레코드를 전달하거나 queryGroupHeaders를 구현하는 데이터 소스에서 그리드가 불러오도록 하세요.",
483
+ },
358
484
  // objectui#4024 — column-footer aggregate prefixes, keyed by the spec's
359
485
  // `ColumnSummary` vocabulary. `pattern` owns the label/value join so this
360
486
  // pack controls its own separator and word order.
361
487
  summary: {
362
488
  pattern: "{{label}}: {{value}}",
489
+ pagePattern: "{{label}} (이 페이지): {{value}}",
363
490
  count: "개수",
364
491
  countEmpty: "빈 값",
365
492
  countFilled: "채워짐",
@@ -381,10 +508,14 @@ const ko = {
381
508
  },
382
509
  import: {
383
510
  downloadTemplate: "템플릿 다운로드",
384
- downloadTemplateHint: "올바른 열이 포함된 CSV를 받습니다(필수 필드에는 * 표시).",
511
+ downloadTemplateHint: "가져올 수 있는 열만 담은 Excel 파일을 받습니다(필수 필드에는 * 표시, 작성 안내 포함).",
385
512
  templateFileName: "{{object}}-import-template",
513
+ templateDownloadFailed: "템플릿을 다운로드할 수 없습니다. 다시 시도하세요.",
514
+ templateNotPermitted: "이 객체의 레코드를 생성할 권한이 없어 가져오기 템플릿을 사용할 수 없습니다.",
386
515
  autoMatched: "자동 매핑됨",
387
516
  autoMatchedSummary: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
517
+ autoMatchedSummary_one: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
518
+ autoMatchedSummary_other: "{{count}}개 열을 자동 매핑했습니다 — 아래에서 확인하고 조정하세요.",
388
519
  confidence: {
389
520
  high: "신뢰도 높음",
390
521
  medium: "신뢰도 보통",
@@ -397,8 +528,14 @@ const ko = {
397
528
  cancelImport: "가져오기 취소",
398
529
  importCancelled: "가져오기를 취소했습니다",
399
530
  resultsTruncated: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
531
+ resultsTruncated_one: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
532
+ resultsTruncated_other: "{{total}}행 중 처음 {{count}}행의 결과를 표시합니다.",
400
533
  createdCount: "{{count}}건 생성",
534
+ createdCount_one: "{{count}}건 생성",
535
+ createdCount_other: "{{count}}건 생성",
401
536
  updatedCount: "{{count}}건 업데이트",
537
+ updatedCount_one: "{{count}}건 업데이트",
538
+ updatedCount_other: "{{count}}건 업데이트",
402
539
  downloadFailed: "실패한 행 다운로드",
403
540
  options: "가져오기 옵션",
404
541
  writeMode: "기존 레코드와 일치하는 행의 처리",
@@ -413,9 +550,6 @@ const ko = {
413
550
  needMatchFields: "일치 기준 필드를 하나 이상 선택하세요.",
414
551
  matchOnlyField: "(일치 전용)",
415
552
  optCreateOptions: "알 수 없는 선택 값 유지",
416
- optRunAutomations: "자동화 및 트리거 실행",
417
- optTreatHistorical: "과거 데이터로 가져오기",
418
- optTreatHistoricalHint: "(완료된 레코드를 그대로 가져옵니다 — 상태 머신 검사를 건너뛰고 현재 시각을 찍는 대신 원래 타임스탬프와 작성자를 유지합니다)",
419
553
  optSkipBlankKey: "일치 값이 비어 있는 행 건너뛰기",
420
554
  optBackground: "백그라운드에서 가져오기",
421
555
  optBackgroundHint: "(되돌릴 수 있는 작업으로 실행됩니다)",
@@ -430,6 +564,7 @@ const ko = {
430
564
  invalidBoolean: "\"{{value}}\"은(는) 유효한 true/false 값이 아닙니다",
431
565
  invalidNumber: "\"{{value}}\"은(는) 유효한 숫자가 아닙니다",
432
566
  invalidDate: "\"{{value}}\"은(는) 유효한 날짜가 아닙니다",
567
+ invalidTime: "\"{{value}}\"은(는) 유효한 시간이 아닙니다",
433
568
  invalidOption: "\"{{value}}\"은(는) 허용된 선택지에 없습니다",
434
569
  requiredValue: "필수 필드입니다",
435
570
  matchAmbiguous: "기존 레코드 여러 건과 일치합니다 — 고유한 값이나 레코드 ID를 사용하세요",
@@ -438,7 +573,7 @@ const ko = {
438
573
  historyDescription: "이 객체의 최근 가져오기입니다.",
439
574
  historyHint: "백그라운드 가져오기 작업, 최신순.",
440
575
  historyRefresh: "새로고침",
441
- historyLoading: "불러오는 중…",
576
+ historyLoading: "로딩 중…",
442
577
  historyEmpty: "아직 가져오기가 없습니다.",
443
578
  historyUnsupported: "이 데이터 소스는 가져오기 기록을 지원하지 않습니다.",
444
579
  historyColStatus: "상태",
@@ -446,10 +581,15 @@ const ko = {
446
581
  historyColResult: "결과",
447
582
  historyColTime: "시각",
448
583
  errorCount: "오류 {{count}}건",
584
+ errorCount_one: "오류 {{count}}건",
585
+ errorCount_other: "오류 {{count}}건",
449
586
  undoImport: "가져오기 되돌리기",
450
587
  undoing: "되돌리는 중…",
451
588
  undoConfirm: "이 가져오기를 되돌릴까요? 생성된 레코드는 삭제되고 업데이트된 레코드는 이전 값으로 복원됩니다.",
452
589
  reverted: "되돌림",
590
+ undoPartial: "{{count}}개 행을 되돌리지 못했습니다. 다시 되돌리면 이 행만 다시 시도합니다.",
591
+ undoPartial_one: "{{count}}개 행을 되돌리지 못했습니다. 다시 되돌리면 이 행만 다시 시도합니다.",
592
+ undoPartial_other: "{{count}}개 행을 되돌리지 못했습니다. 다시 되돌리면 이 행만 다시 시도합니다.",
453
593
  jobStatus: {
454
594
  pending: "대기 중",
455
595
  running: "실행 중",
@@ -506,19 +646,29 @@ const ko = {
506
646
  mapped: "매핑됨",
507
647
  skipped: "건너뜀",
508
648
  rowsWithErrors: "오류가 있는 {{count}}개 행",
649
+ rowsWithErrors_one: "오류가 있는 {{count}}개 행",
650
+ rowsWithErrors_other: "오류가 있는 {{count}}개 행",
509
651
  rowsCorrected: "{{count}}개 행 수정됨",
652
+ rowsCorrected_one: "{{count}}개 행 수정됨",
653
+ rowsCorrected_other: "{{count}}개 행 수정됨",
510
654
  clickToFix: "— 강조 표시된 셀을 클릭하여 인라인 편집.",
511
655
  showingRows: "{{total}}개 중 {{shown}}개 행 표시",
512
656
  importing: "가져오는 중… {{progress}}%",
513
657
  importComplete: "가져오기 완료",
658
+ importPartial: "가져오기가 완료되었지만 오류가 있습니다",
659
+ importFailed: "가져오기에 실패했습니다",
514
660
  imported: "{{count}}개 가져옴",
515
661
  skippedCount: "{{count}}개 건너뜀",
516
662
  moreErrors: "…{{count}}개 오류 더",
663
+ moreErrors_one: "…{{count}}개 오류 더",
664
+ moreErrors_other: "…{{count}}개 오류 더",
517
665
  cancel: "취소",
518
666
  back: "뒤로",
519
667
  next: "다음",
520
668
  close: "닫기",
521
669
  importNRows: "{{count}}개 행 가져오기",
670
+ importNRows_one: "{{count}}개 행 가져오기",
671
+ importNRows_other: "{{count}}개 행 가져오기",
522
672
  importingProgress: "가져오는 중…",
523
673
  requiredMark: "*",
524
674
  required: "필수",
@@ -530,17 +680,44 @@ const ko = {
530
680
  month: "월",
531
681
  week: "주",
532
682
  day: "일",
533
- agenda: "일정",
534
683
  allDay: "종일",
535
- noEvents: "일정이 없습니다",
536
684
  newEvent: "새 일정",
537
685
  moreEvents: "+{{count}} 더보기",
686
+ unscheduled: "일정 없음 ({{count}})",
687
+ loading: "캘린더 로딩 중…",
688
+ loadError: "오류: {{message}}",
689
+ configRequired: "캘린더 설정이 필요합니다. startDateField를 지정하세요. 캘린더의 유일한 필수 키입니다. 일정 제목은 titleField 없이도 확인됩니다.",
690
+ configRequiredHint: "뷰의 calendar 블록에 속합니다. 인터페이스 페이지에는 자체 캘린더 슬롯이 없습니다. sourceView를 캘린더를 선언한 뷰로 지정하세요.",
691
+ eventDetails: "일정 세부 정보",
692
+ pullToRefresh: "당겨서 새로고침",
693
+ refreshing: "새로고침 중…",
694
+ onDate: "{{date}}",
695
+ eventTitle: "제목",
696
+ eventTitlePlaceholder: "이 일정은 어떤 내용인가요?",
697
+ creating: "생성 중…",
698
+ titleRequired: "제목을 입력하세요",
699
+ a11y: {
700
+ region: "캘린더",
701
+ grid: "캘린더 그리드",
702
+ goToToday: "오늘로 이동",
703
+ previousPeriod: "이전 기간",
704
+ nextPeriod: "다음 기간",
705
+ currentDate: "현재 날짜: {{date}}",
706
+ dayCell: "{{date}}, 일정 {{count}}개",
707
+ dayCell_one: "{{date}}, 일정 {{count}}개",
708
+ dayCell_other: "{{date}}, 일정 {{count}}개",
709
+ resizeEventEnd: "일정 종료 시점 조절",
710
+ resizeEventEndHint: "드래그하여 종료 날짜 변경",
711
+ resizeStart: "시작 시점 조절",
712
+ resizeEnd: "종료 시점 조절",
713
+ },
538
714
  },
539
715
  list: {
540
716
  firstRunTitle: "아직 아무것도 없습니다",
541
717
  firstRunMessage: "첫 레코드를 만들어 시작하세요.",
542
718
  noMatches: "일치하는 레코드가 없습니다",
543
719
  noMatchesMessage: "현재 필터나 검색어와 일치하는 레코드가 없습니다. 조건을 조정하거나 지워 보세요.",
720
+ viewFilterNoMatchesMessage: "이 뷰의 필터와 일치하는 레코드가 없습니다.",
544
721
  loadErrorTitle: "레코드를 불러오지 못했습니다",
545
722
  loadErrorMessage: "이 데이터를 불러오는 중 문제가 발생했습니다. 연결을 확인하고 다시 시도하세요.",
546
723
  loadErrorForbiddenTitle: "접근 권한이 없습니다",
@@ -577,17 +754,24 @@ const ko = {
577
754
  refresh: "새로고침",
578
755
  loading: "레코드 로딩 중…",
579
756
  recordCount: "{{count}}개 레코드",
580
- recordCountOne: "{{count}}개 레코드",
757
+ recordCount_one: "{{count}}개 레코드",
758
+ recordCount_other: "{{count}}개 레코드",
581
759
  addRecord: "레코드 추가",
760
+ // objectui#12703 — the compact list's footer link to the object's list or the block's view.
761
+ viewAll: "모두 보기",
582
762
  tabs: "탭",
583
763
  allRecords: "전체 레코드",
584
764
  search: "검색",
585
765
  filter: "필터",
586
766
  filterRecords: "레코드 필터",
767
+ filterActive: "필터, {{count}}개 적용됨",
768
+ filterActive_one: "필터, {{count}}개 적용됨",
769
+ filterActive_other: "필터, {{count}}개 적용됨",
587
770
  sort: "정렬",
588
771
  sortRecords: "레코드 정렬",
589
772
  sortByIdSuffix: "(ID 기준)",
590
773
  sortRelationalHint: "다른 레코드를 참조하는 열은 목록에 없습니다. 저장된 ID로만 정렬할 수 있고 셀에 표시되는 이름으로는 정렬할 수 없습니다. 그 이름으로 정렬하려면 이름을 이 오브젝트에 비정규화하여 원본이 변경될 때 기록되는 저장 필드로 만든 다음, 그 필드로 정렬하세요. 수식 필드는 안 됩니다. 수식은 가상이라 저장되는 열이 없어 서버가 정렬을 거부합니다.",
774
+ sortRelationalPicked: "연결된 열은 표시된 이름이 아니라 저장된 ID로 정렬됩니다.",
591
775
  resetSortToDefault: "뷰 기본 정렬로 재설정",
592
776
  group: "그룹",
593
777
  groupBy: "그룹 기준",
@@ -608,14 +792,15 @@ const ko = {
608
792
  print: "인쇄",
609
793
  hideFieldsTitle: "필드 숨기기",
610
794
  dataLimitReached: "처음 {{limit}}개 레코드를 표시합니다. 더 많은 데이터가 있을 수 있습니다.",
611
- viewSettings: "보기 설정",
612
- viewSettingsHint: "그룹화, 색상, 밀도 및 표시 필드.",
795
+ display: "표시",
796
+ layout: "레이아웃",
797
+ rowNumbers: "행 번호",
798
+ resetToViewDefault: "보기 기본값으로 재설정",
613
799
  addGroup: "그룹 필드 추가",
614
800
  collapsedByDefault: "기본적으로 접힘",
615
801
  removeGroup: "제거",
616
802
  inlineEditShort: "인라인 편집",
617
803
  inlineEditLabel: "레코드를 인라인으로 편집(셀을 클릭하여 편집)",
618
- recordEditingTitle: "레코드 편집",
619
804
  },
620
805
  managedByBadge: {
621
806
  systemWritable: {
@@ -646,6 +831,7 @@ const ko = {
646
831
  },
647
832
  kanban: {
648
833
  uncategorized: "미분류",
834
+ loadMore: "더 보기",
649
835
  columns: "열",
650
836
  addCard: "카드 추가",
651
837
  addColumn: "열 추가",
@@ -653,13 +839,28 @@ const ko = {
653
839
  deleteCard: "카드 삭제",
654
840
  deleteColumn: "열 삭제",
655
841
  noCards: "카드 없음",
842
+ columnCards: "{{column}} 열의 카드",
843
+ laneCards: "{{column}} - {{lane}}의 카드",
656
844
  cardTitlePlaceholder: "카드 제목 입력…",
657
845
  requiredFieldsTitle: "필수 항목 입력",
658
846
  requiredFieldsDescription: "이 이동으로 아래 항목이 필수가 됩니다. 입력한 후 계속하세요.",
847
+ dnd: {
848
+ start: "{{card}} 카드를 집었습니다. 현재 {{column}} 열에 있습니다.",
849
+ overCard: "{{card}} 카드를 {{column}} 열의 {{target}} 카드 위로 옮기는 중입니다.",
850
+ overColumn: "{{card}} 카드를 {{column}} 열 위로 옮기는 중입니다.",
851
+ overNone: "{{card}} 카드가 어느 열 위에도 있지 않습니다.",
852
+ moved: "{{card}} 카드를 {{column}} 열로 옮겼습니다.",
853
+ dropped: "{{card}} 카드를 놓았습니다. {{column}} 열에 그대로 있습니다.",
854
+ cancelled: "드래그를 취소했습니다. {{card}} 카드는 {{column}} 열에 그대로 있습니다.",
855
+ untitledCard: "제목 없는",
856
+ unnamedColumn: "이름 없는",
857
+ instructions: "이 카드를 다른 열로 옮기려면 마우스나 터치로 끌어 놓으세요.",
858
+ dragging: "{{card}} 카드를 끄는 중",
859
+ },
659
860
  },
660
861
  timeline: {
661
862
  bucket: {
662
- overdue: "기한 초과",
863
+ earlier: "이전",
663
864
  today: "오늘",
664
865
  tomorrow: "내일",
665
866
  thisWeek: "이번 주",
@@ -674,6 +875,17 @@ const ko = {
674
875
  },
675
876
  gantt: {
676
877
  rowLabel: "항목",
878
+ unusableRange: {
879
+ malformedDate: "사용할 수 없는 간트 날짜 범위 — {{path}}은(는) {{value}}이며 유효한 날짜가 아닙니다. 모든 간트 날짜는 파싱할 수 있어야 합니다: 각 행 항목의 startDate와 endDate, 그리고 스키마에 고정한 minDate / maxDate.",
880
+ malformedRow: "사용할 수 없는 간트 행 — {{path}}은(는) {{value}}이며 행의 형태가 아닙니다. 간트는 items를 행 목록으로, 각 행을 label과 자체 items를 가진 객체로, 각 행의 items를 막대 목록으로 읽습니다. 이 위치에 있는 null, 숫자, 문자열 또는 일반 객체는 그릴 수 없습니다.",
881
+ inverted: "사용할 수 없는 간트 날짜 범위 — minDate {{minDate}}이(가) maxDate {{maxDate}}보다 뒤입니다. 고정한 minDate / maxDate는 행에서 계산한 범위보다 우선하므로 이 축에는 열이 없고 막대를 배치할 수 없습니다. 두 값을 서로 바꾸세요.",
882
+ },
883
+ },
884
+ unsupported: {
885
+ objectBoundGantt: "지원되지 않는 variant \"gantt\" — 객체 바인딩 타임라인은 피드 variant({{variants}})를 렌더링합니다. 간트는 각각 중첩된 items를 가진 리터럴 행이 필요하므로 여기서는 간트 축(scale)이 적용되지 않습니다.",
886
+ },
887
+ unconfigured: {
888
+ noDateAxis: "타임라인 날짜 축이 필요합니다 — 이 뷰는 날짜 필드를 선언하지 않았으며, 객체 바인딩 타임라인은 날짜 필드를 지어내지 않습니다. 다음 중 하나를 선언하세요: {{fields}}. 첫 번째가 spec 표기이고 나머지는 레거시 별칭입니다.",
677
889
  },
678
890
  },
679
891
  gantt: {
@@ -691,6 +903,7 @@ const ko = {
691
903
  },
692
904
  aria: {
693
905
  taskList: "작업 목록",
906
+ refreshing: "새로고침 중…",
694
907
  },
695
908
  tooltip: {
696
909
  days: "일",
@@ -736,13 +949,19 @@ const ko = {
736
949
  conflict: {
737
950
  title: "일정 충돌",
738
951
  body: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
952
+ body_one: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
953
+ body_other: "이 이동은 종속성 제약과 충돌합니다. 영향을 받는 작업 {{count}}건의 일정을 자동으로 조정할까요?",
739
954
  confirm: "자동 일정 조정",
740
955
  cancel: "그대로 두기",
741
956
  },
742
957
  autoScheduleDlg: {
743
958
  title: "자동 일정 조정",
744
959
  body: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
960
+ body_one: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
961
+ body_other: "종속성 연결을 충족하도록 작업 {{count}}건을 뒤로 미룰까요?",
745
962
  skipped: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
963
+ skipped_one: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
964
+ skipped_other: "잠긴 작업 {{count}}건도 연결을 위반하지만 건너뛰었습니다.",
746
965
  confirm: "적용",
747
966
  cancel: "취소",
748
967
  none: "모든 종속성이 충족되었습니다 — 조정할 일정이 없습니다.",
@@ -821,10 +1040,14 @@ const ko = {
821
1040
  tabActionsFor: "{{name}}의 보기 작업",
822
1041
  readonlyAriaLabel: "읽기 전용 보기",
823
1042
  readonlyTooltip: "시스템 보기 — 코드에 정의되어 있으며 읽기 전용입니다.",
1043
+ malformedFilter: "이 뷰의 필터가 잘못되어 레코드를 표시하지 않습니다: {{subject}} 조건을 적용할 수 없습니다.",
1044
+ noObject: "개체가 지정되지 않았습니다. {{property}} 또는 dataSource.object를 설정하세요.",
824
1045
  },
825
1046
  designer: {
826
1047
  undo: "실행 취소",
827
1048
  redo: "다시 실행",
1049
+ canvasMinimap: "캔버스 미니맵",
1050
+ versionHistory: "버전 기록",
828
1051
  },
829
1052
  detail: {
830
1053
  editInlineHint: "더블클릭하여 편집",
@@ -846,7 +1069,8 @@ const ko = {
846
1069
  pageHeaderActions: "페이지 헤더 작업",
847
1070
  emojiPicker: "이모지 선택기",
848
1071
  reactionCount: "{{emoji}} 반응 {{count}}개",
849
- reactionCountOne: "{{emoji}} 반응 {{count}}개",
1072
+ reactionCount_one: "{{emoji}} 반응 {{count}}개",
1073
+ reactionCount_other: "{{emoji}} 반응 {{count}}개",
850
1074
  recordDetail: "레코드 세부 정보",
851
1075
  recordDetailWithLabel: "{{label}} 세부 정보",
852
1076
  openAsFullPage: "전체 페이지로 열기",
@@ -873,7 +1097,6 @@ const ko = {
873
1097
  viewAll: "모두 보기",
874
1098
  new: "새로 만들기",
875
1099
  add: "추가",
876
- emptyValue: "—",
877
1100
  comments: "댓글",
878
1101
  searchComments: "댓글 검색…",
879
1102
  addCommentPlaceholder: "댓글 추가… (Ctrl+Enter로 제출)",
@@ -884,11 +1107,18 @@ const ko = {
884
1107
  unpin: "고정 해제",
885
1108
  justNow: "방금",
886
1109
  minutesAgo: "{{count}}분 전",
1110
+ minutesAgo_one: "{{count}}분 전",
1111
+ minutesAgo_other: "{{count}}분 전",
887
1112
  hoursAgo: "{{count}}시간 전",
1113
+ hoursAgo_one: "{{count}}시간 전",
1114
+ hoursAgo_other: "{{count}}시간 전",
888
1115
  daysAgo: "{{count}}일 전",
1116
+ daysAgo_one: "{{count}}일 전",
1117
+ daysAgo_other: "{{count}}일 전",
889
1118
  dropFilesToUpload: "파일을 여기에 끌어놓거나 클릭하여 업로드",
890
1119
  attachmentCount: "첨부파일 {{count}}개",
891
- attachmentCountPlural: "첨부파일 {{count}}개",
1120
+ attachmentCount_one: "첨부파일 {{count}}개",
1121
+ attachmentCount_other: "첨부파일 {{count}}개",
892
1122
  removeAttachment: "첨부파일 제거",
893
1123
  // Record Attachments panel (enable.files, objectstack#4358)
894
1124
  attachments: "첨부파일",
@@ -897,6 +1127,7 @@ const ko = {
897
1127
  noAttachments: "아직 첨부파일이 없습니다. 파일을 업로드해 시작하세요.",
898
1128
  downloadAttachment: "다운로드",
899
1129
  deleteAttachment: "첨부파일 삭제",
1130
+ deleteAttachmentConfirm: "첨부파일 \"{{name}}\"을(를) 삭제하시겠습니까?",
900
1131
  attachmentDeleteDenied: "업로드한 사용자 또는 이 레코드를 편집할 수 있는 사용자만 이 첨부파일을 삭제할 수 있습니다.",
901
1132
  attachmentParentAccessDenied: "이 레코드에 파일을 첨부할 권한이 없습니다.",
902
1133
  attachmentDownloadDenied: "이 첨부파일을 다운로드할 권한이 없습니다.",
@@ -906,11 +1137,6 @@ const ko = {
906
1137
  attachmentsLoadFailed: "이 레코드의 첨부파일을 불러오지 못했습니다.",
907
1138
  attachmentsApiUnavailable: "이 객체에서는 첨부 파일 목록을 사용할 수 없습니다.",
908
1139
  retryLoadAttachments: "다시 시도",
909
- unifiedDiff: "통합 보기",
910
- sideBySideDiff: "나란히 보기",
911
- noChanges: "변경 없음",
912
- previousVersion: "이전 버전",
913
- currentVersion: "현재 버전",
914
1140
  discussion: "토론",
915
1141
  showDiscussion: "토론 보기 ({{count}})",
916
1142
  hideDiscussion: "토론 숨기기",
@@ -925,25 +1151,35 @@ const ko = {
925
1151
  writeComment: "댓글 작성…",
926
1152
  subscribedTooltip: "구독 중 — 클릭하여 구독 취소",
927
1153
  unsubscribedTooltip: "알림 구독",
928
- firstRecord: "첫 번째 레코드 (Home)",
929
- previousRecordKey: "이전 레코드 (←)",
930
- nextRecordKey: "다음 레코드 (→)",
931
- lastRecord: "마지막 레코드 (End)",
932
1154
  noRecords: "레코드 없음",
933
- searchWhileNavigating: "탐색 중 검색",
934
- searchRecords: "레코드 검색…",
935
1155
  allActivity: "모든 활동",
936
1156
  commentsOnly: "댓글만",
937
1157
  fieldChangesFilter: "필드 변경",
938
1158
  tasksOnly: "작업만",
939
1159
  leaveCommentPlaceholder: "댓글 남기기… (Ctrl+Enter로 제출)",
940
1160
  noActivity: "기록된 활동 없음",
1161
+ activityAccessDenied: "이 레코드의 활동을 볼 권한이 없습니다.",
1162
+ commentsAccessDenied: "이 레코드의 댓글을 볼 권한이 없습니다.",
1163
+ // objectui#7149 — the rest of `ActivityTimeline`. The four chip labels the
1164
+ // `detail.*` pack did not already name, and the `formatFieldChange`
1165
+ // sentences, which are assembled in code and so need interpolation holes.
1166
+ allFilter: '전체',
1167
+ createsFilter: '생성',
1168
+ deletesFilter: '삭제',
1169
+ statusChangesFilter: '상태 변경',
1170
+ activityEmptyValue: '(비어 있음)',
1171
+ activityFieldChanged: '{{field}}을(를) "{{old}}"에서 "{{new}}"(으)로 변경했습니다',
1172
+ activityCreated: '이 레코드를 만들었습니다',
1173
+ activityDeleted: '이 레코드를 삭제했습니다',
1174
+ activityStatusChanged: '상태를 "{{value}}"(으)로 변경했습니다',
1175
+ activityUpdated: '레코드를 업데이트했습니다',
941
1176
  loadMore: "더 보기",
942
1177
  edited: "(수정됨)",
943
1178
  via: "{{source}} 통해",
944
1179
  viewSource: "원본 보기",
945
1180
  replyCount: "답글 {{count}}개",
946
- replyCountPlural: "답글 {{count}}개",
1181
+ replyCount_one: "답글 {{count}}개",
1182
+ replyCount_other: "답글 {{count}}개",
947
1183
  replyPlaceholder: "답글…",
948
1184
  filterActivity: "활동 필터",
949
1185
  openDiscussion: "토론 패널 열기",
@@ -955,9 +1191,12 @@ const ko = {
955
1191
  lockedByApproval: "승인을 위해 잠김",
956
1192
  lockedTooltip: "이 레코드에 대기 중인 승인 요청이 있습니다. 편집이 잠겨 있습니다",
957
1193
  writeStrippedTitle: "저장되었지만 일부 필드는 적용되지 않았습니다",
1194
+ writeWarningsTitle: "저장되었지만 경고가 있습니다",
958
1195
  writeStrippedReadonly: "다음 필드는 읽기 전용이므로 적용되지 않았습니다: {{fields}}",
959
1196
  writeStrippedByState: "다음 필드는 이 레코드의 현재 상태에서 편집할 수 없으므로 적용되지 않았습니다: {{fields}}",
960
1197
  writeStrippedPrimaryKey: "다음 필드는 레코드의 식별자이며 저장으로 변경할 수 없으므로 적용되지 않았습니다: {{fields}}",
1198
+ writeStrippedComputed: "다음 필드는 서버가 수식으로 계산하므로 보낸 값이 적용되지 않았습니다: {{fields}}",
1199
+ writeStrippedStoredExpression: "다음 필드는 레코드에서 계산되므로 보낸 값 대신 계산된 값이 저장되었습니다: {{fields}}",
961
1200
  writeStrippedUnknownReason: "다음 필드는 서버에서 적용되지 않았습니다: {{fields}}",
962
1201
  approvalPendingEditable: "승인 진행 중 · 편집 가능",
963
1202
  approvalPendingTooltip: "이 레코드에 대기 중인 승인 요청이 있지만 이 단계에서는 편집할 수 있습니다",
@@ -979,6 +1218,13 @@ const ko = {
979
1218
  pathStageLostUpcoming: '{{stage}}, 실패, 도달하지 않음',
980
1219
  pathStageWonUpcoming: '{{stage}}, 목표 단계, 도달하지 않음',
981
1220
  linkCopied: "링크가 클립보드에 복사됨",
1221
+ commentFailed: "댓글이 게시되지 않았습니다. 아무것도 저장되지 않았습니다. 다시 시도해 주세요.",
1222
+ reactionFailed: "반응이 저장되지 않았습니다. 다시 시도해 주세요.",
1223
+ editComment: "댓글 편집",
1224
+ deleteComment: "댓글 삭제",
1225
+ deleteCommentConfirm: "이 댓글을 삭제하시겠습니까?",
1226
+ commentEditFailed: "수정 내용이 저장되지 않았습니다. 댓글은 이전 내용을 유지합니다.",
1227
+ commentDeleteFailed: "댓글이 삭제되지 않았습니다. 다시 시도해 주세요.",
982
1228
  linkCopyFailed: "링크 복사 실패",
983
1229
  cancel: "취소",
984
1230
  cancelEdit: "변경 사항 취소",
@@ -1008,6 +1254,7 @@ const ko = {
1008
1254
  sortBy: "정렬 기준",
1009
1255
  filterPlaceholder: "필터…",
1010
1256
  highlightFields: "주요 필드",
1257
+ highlightsLabel: "레코드 주요 필드",
1011
1258
  createdBy: "작성자",
1012
1259
  updatedBy: "업데이트한 사람",
1013
1260
  created: "작성됨",
@@ -1021,26 +1268,50 @@ const ko = {
1021
1268
  copyPhone: "전화번호 복사",
1022
1269
  copyRecordId: "레코드 ID 복사",
1023
1270
  showEmptyFields: "{{count}}개의 빈 필드 표시",
1271
+ showEmptyFields_one: "{{count}}개의 빈 필드 표시",
1272
+ showEmptyFields_other: "{{count}}개의 빈 필드 표시",
1024
1273
  hideEmptyFields: "빈 필드 숨기기",
1025
1274
  noValue: "값 없음",
1275
+ unresolvedReference: "확인되지 않은 참조: {{value}}을(를) 사용자로 확인하지 못했습니다",
1276
+ unresolvedLookupReference: "확인되지 않은 참조: {{value}}을(를) 이 화면에서 레코드로 확인하지 못했습니다",
1277
+ repeaterItemCount: "항목 {{count}}개",
1278
+ repeaterItemCount_one: "항목 {{count}}개",
1279
+ repeaterItemCount_other: "항목 {{count}}개",
1280
+ fileCount: "파일 {{count}}개",
1281
+ fileCount_one: "파일 {{count}}개",
1282
+ fileCount_other: "파일 {{count}}개",
1026
1283
  },
1027
1284
  chart: {
1028
- noData: "차트 데이터가 없습니다",
1029
1285
  loading: "차트 로딩 중…",
1286
+ refreshing: "새로고침 중…",
1030
1287
  nullCategory: "(미지정)",
1031
- },
1032
- map: {
1033
- searchLocations: "위치 검색…",
1034
- locationDetails: "위치 상세",
1035
- markersCount: "마커 {{count}}개",
1036
- invalidCoordinates: "좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.",
1037
- invalidCoordinatesPlural: "좌표가 누락되었거나 유효하지 않아 {{count}}개 레코드가 지도에서 제외되었습니다.",
1288
+ scatterOneMeasure: "산점도는 측정값 하나만 그립니다. 계열을 하나만 남기세요:",
1289
+ unconfigured: {
1290
+ noCategoryAxis: "차트 범주 축이 필요합니다 — 객체 바인딩 차트는 축을 임의로 만들지 않습니다. 다음 중 하나를 선언하세요:",
1291
+ },
1038
1292
  },
1039
1293
  dashboard: {
1040
- noRows: "행 없음",
1294
+ // objectui#7063 — the DEFAULT empty state every dashboard widget renders
1295
+ // when its query SUCCEEDED and returned nothing. It replaced the terse
1296
+ // per-widget `noRows` / `noDataAvailable` fragments at the render site;
1297
+ // objectui#7125 deleted those two keys from all ten packs once nothing
1298
+ // read them. The copy here has to read as a state rather than a failure,
1299
+ // which is why it says the widget loaded. `sourceLabel` carries its own
1300
+ // punctuation so the call site concatenates no separator (see
1301
+ // `WidgetEmptyState`).
1302
+ empty: {
1303
+ title: "아직 데이터가 없습니다",
1304
+ message: "이 위젯은 정상적으로 로드되었지만 쿼리가 아직 레코드를 반환하지 않았습니다.",
1305
+ sourceLabel: "데이터 소스:",
1306
+ },
1041
1307
  loading: "로딩 중…",
1308
+ refreshing: "새로고침 중…",
1309
+ refreshAll: "모두 새로고침",
1310
+ refreshDashboard: "대시보드 새로고침",
1042
1311
  pickMeasures: "이 데이터셋 위젯의 측정값(값)을 선택하세요.",
1043
1312
  datasetUnsupported: "이 데이터 소스는 데이터셋 쿼리를 지원하지 않습니다.",
1313
+ widgetForbiddenTitle: "접근 권한 없음",
1314
+ widgetForbiddenMessage: "이 위젯의 데이터를 볼 수 있는 권한이 없습니다.",
1044
1315
  details: "세부 정보",
1045
1316
  exportCsv: "CSV 내보내기",
1046
1317
  openInList: "목록에서 열기",
@@ -1068,12 +1339,10 @@ const ko = {
1068
1339
  },
1069
1340
  },
1070
1341
  addWidget: "위젯 추가",
1071
- removeWidget: "위젯 제거",
1072
1342
  editLayout: "레이아웃 편집",
1073
1343
  saveLayout: "레이아웃 저장",
1074
1344
  resetLayout: "레이아웃 초기화",
1075
1345
  total: "합계",
1076
- noDataAvailable: "사용 가능한 데이터 없음",
1077
1346
  noDataSourceFor: "데이터 소스 없음:",
1078
1347
  config: {
1079
1348
  breadcrumb: {
@@ -1195,10 +1464,6 @@ const ko = {
1195
1464
  appDescription: "설명",
1196
1465
  appIcon: "아이콘",
1197
1466
  template: "템플릿",
1198
- layout: "레이아웃",
1199
- layoutSidebar: "사이드바",
1200
- layoutHeader: "헤더",
1201
- layoutEmpty: "비어 있음",
1202
1467
  selectObjects: "오브젝트 선택",
1203
1468
  searchObjects: "오브젝트 검색…",
1204
1469
  selectAll: "모두 선택",
@@ -1207,7 +1472,6 @@ const ko = {
1207
1472
  addGroup: "그룹 추가",
1208
1473
  addUrl: "URL 추가",
1209
1474
  addSeparator: "구분선 추가",
1210
- noNavItems: "탐색 항목이 아직 없습니다.",
1211
1475
  logoUrl: "Logo URL",
1212
1476
  primaryColor: "기본 색상",
1213
1477
  faviconUrl: "Favicon URL",
@@ -1234,13 +1498,12 @@ const ko = {
1234
1498
  appearance: "외관",
1235
1499
  rowHeight: "행 높이",
1236
1500
  livePreview: "실시간 미리보기",
1237
- stepBasicDesc: "이름, 제목 및 레이아웃",
1501
+ stepBasicDesc: "이름, 제목 및 아이콘",
1238
1502
  stepObjectsDesc: "비즈니스 객체 선택",
1239
1503
  stepNavigationDesc: "네비게이션 트리 구성",
1240
1504
  stepBrandingDesc: "로고, 색상 및 파비콘",
1241
1505
  noObjectsFound: "객체를 찾을 수 없습니다.",
1242
1506
  noNavItemsHint: "네비게이션 항목이 없습니다. 이전 단계에서 객체를 선택하거나 수동으로 추가하세요.",
1243
- separator: "구분선",
1244
1507
  separatorLabel: "— 구분선 —",
1245
1508
  newGroup: "새 그룹",
1246
1509
  newLink: "새 링크",
@@ -1274,6 +1537,7 @@ const ko = {
1274
1537
  navTypeSeparator: "구분선",
1275
1538
  navTypeAction: "작업",
1276
1539
  navTypeComponent: "컴포넌트",
1540
+ navTypeDoc: "문서",
1277
1541
  navEditIcon: "아이콘 편집",
1278
1542
  navToggleVisible: "가시성 토글",
1279
1543
  navHidden: "숨김",
@@ -1351,11 +1615,8 @@ const ko = {
1351
1615
  defaultValue: "기본값",
1352
1616
  placeholder: "자리 표시자",
1353
1617
  referenceTo: "참조 대상",
1354
- formula: "수식",
1355
1618
  options: "옵션",
1356
1619
  addOption: "옵션 추가",
1357
- validationRules: "유효성 검사 규칙",
1358
- addRule: "규칙 추가",
1359
1620
  systemBadge: "시스템",
1360
1621
  ungrouped: "일반",
1361
1622
  deleteConfirmTitle: "필드를 삭제하시겠습니까?",
@@ -1374,16 +1635,31 @@ const ko = {
1374
1635
  },
1375
1636
  },
1376
1637
  console: {
1638
+ studio: {
1639
+ title: "Studio",
1640
+ accessRequired: "Studio를 열려면 Studio 접근 권한이 필요합니다.",
1641
+ },
1377
1642
  saveAdvisoryTitle: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1643
+ saveAdvisoryTitle_one: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1644
+ saveAdvisoryTitle_other: "저장되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1645
+ publishAdvisoryTitle: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1646
+ publishAdvisoryTitle_one: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1647
+ publishAdvisoryTitle_other: "게시되었습니다 — 작성 검사에서 {{count}}건의 권장 사항이 발견되었습니다",
1648
+ importMappingsUnavailable: "{{object}}의 저장된 가져오기 매핑을 불러오지 못했습니다",
1649
+ importMappingsRefused: "서버가 이 요청을 거부했습니다. 따라서 이 목록이 비어 있는 것은 읽지 못했기 때문이며, 등록된 항목이 없어서가 아닙니다. 다시 로그인하거나 관리자에게 접근 권한을 요청하세요.",
1650
+ importMappingsUnreadable: "이 목록이 비어 있는 것은 읽지 못했기 때문이며, 등록된 항목이 없어서가 아닙니다. 다시 시도하고, 계속 발생하면 문제를 보고하세요.",
1651
+ savedViewsUnavailable: "{{object}}의 저장된 보기를 불러오지 못했습니다",
1652
+ savedViewsRefused: "서버가 이 요청을 거부했습니다. 따라서 이 목록이 비어 있는 것은 읽지 못했기 때문이며, 이 오브젝트에 저장된 보기가 없어서가 아닙니다. 다시 로그인하거나 관리자에게 접근 권한을 요청하세요.",
1653
+ savedViewsUnreadable: "이 목록이 비어 있는 것은 읽지 못했기 때문이며, 이 오브젝트에 저장된 보기가 없어서가 아닙니다. 다시 시도하고, 계속 발생하면 문제를 보고하세요.",
1378
1654
  settingsHub: {
1379
1655
  title: "설정",
1380
- subtitle: "워크스페이스, 연동, 기능 플래그를 구성합니다.",
1656
+ subtitle: "시스템, 연동, 기능 플래그를 구성합니다.",
1381
1657
  loadError: "설정을 불러오지 못했습니다",
1382
1658
  empty: "등록된 설정이 없습니다. 플러그인은 SettingsService를 통해 설정 매니페스트를 등록할 수 있습니다.",
1383
1659
  settingsCount: "설정 {{n}}개",
1384
1660
  beta: "베타",
1385
1661
  categories: {
1386
- Workspace: "워크스페이스",
1662
+ Workspace: "일반",
1387
1663
  Communication: "커뮤니케이션",
1388
1664
  Security: "보안",
1389
1665
  Infrastructure: "인프라",
@@ -1428,13 +1704,18 @@ const ko = {
1428
1704
  },
1429
1705
  usage: {
1430
1706
  title: "AI 사용량",
1431
- meterBuild: "빌드",
1432
- meterAsk: "질문",
1707
+ poolUsed: "{{percent}} 사용됨",
1433
1708
  statusOk: "여유가 충분합니다",
1434
1709
  statusLow: "얼마 남지 않았습니다",
1435
1710
  statusFull: "한도에 도달했습니다",
1436
1711
  resetsDaily: "오늘 밤 초기화됩니다",
1437
1712
  resetsMonthly: "다음 주기에 초기화됩니다",
1713
+ resetsWeeklyDays: "{{count}}일 후 초기화됩니다",
1714
+ resetsWeeklyDays_one: "{{count}}일 후 초기화됩니다",
1715
+ resetsWeeklyDays_other: "{{count}}일 후 초기화됩니다",
1716
+ resetsWeeklyHours: "{{count}}시간 후 초기화됩니다",
1717
+ resetsWeeklyHours_one: "{{count}}시간 후 초기화됩니다",
1718
+ resetsWeeklyHours_other: "{{count}}시간 후 초기화됩니다",
1438
1719
  ctaUpgrade: "업그레이드하고 계속하기",
1439
1720
  ctaTopUp: "크레딧을 추가하고 계속하기",
1440
1721
  ariaLabel: "AI 사용량: {{status}}",
@@ -1447,6 +1728,31 @@ const ko = {
1447
1728
  share: "공유",
1448
1729
  shareTitle: "이 대화 공유",
1449
1730
  shareDisabledTitle: "공유하려면 먼저 대화를 시작하세요",
1731
+ buildDoctor: "빌드 진단",
1732
+ buildDoctorTitle: "빌드 진단 — 실제로 반영된 내용은?",
1733
+ buildDoctorDisabledTitle: "먼저 메시지를 보내세요",
1734
+ buildDoctorDrawer: {
1735
+ description: '에이전트가 주장한 내용과 실제로 반영된 내용을 비교합니다. 읽기 전용 진단입니다.',
1736
+ reconciling: '대조 중…',
1737
+ notAvailable: '사용할 수 없음 — 대화를 찾을 수 없거나 접근 권한이 없습니다.',
1738
+ untitled: '(제목 없음)',
1739
+ summary: '{{turns}}턴 · 메시지 {{messages}}개 · {{tokens}} tok · LLM {{seconds}}초',
1740
+ allLive: '시도한 변경 {{count}}개가 모두 반영되었습니다 — 사라진 것은 없습니다.',
1741
+ discrepancies: '불일치 {{count}}건 — 채팅에서 말한 내용과 실제로 반영된 내용이 다릅니다.',
1742
+ orphanedTitle: '제안되었지만 적용되지 않음',
1743
+ orphanedHint: '에이전트가 제안한 확인 카드를 이후 어떤 턴에서도 적용하지 않아 변경이 조용히 사라졌습니다.',
1744
+ missingTitle: '적용되었다고 했지만 없음',
1745
+ missingHint: '도구 결과는 적용되었다고 했지만 아티팩트가 sys_metadata에 반영되어 있지 않습니다.',
1746
+ toolErrorsTitle: '도구 오류',
1747
+ toolErrorsHint: '빌드 중 오류를 반환한 도구 호출입니다.',
1748
+ verifyTitle: '빌드 검사 (verify_build)',
1749
+ yourApp: '내 앱:',
1750
+ noIssues: '문제 0개',
1751
+ issueCount: '문제 {{count}}개',
1752
+ platformNoise: '플랫폼 sys_* 발견 {{count}}건 숨김',
1753
+ pendingActions: '대기 중인 작업',
1754
+ timeline: '타임라인 ({{count}})',
1755
+ },
1450
1756
  newChat: "새로 만들기",
1451
1757
  searchChats: "채팅 검색…",
1452
1758
  noChatsYet: "아직 채팅이 없습니다",
@@ -1469,6 +1775,8 @@ const ko = {
1469
1775
  liveCanvasUnlisted: "실시간 앱 — {{app}}(게시 전까지 비공개)",
1470
1776
  loadingAgents: "에이전트를 불러오는 중…",
1471
1777
  askAnything: "무엇이든 물어보세요…",
1778
+ askOrChangeApp: "데이터에 대해 묻거나 이 앱을 바꿔 달라고 요청하세요…",
1779
+ describeAppToBuild: "만들고 싶은 앱이나 바꿀 부분을 설명하세요…",
1472
1780
  emptyTitle: "대화 시작하기",
1473
1781
  emptyDescription: "무엇이든 물어보세요 — 어시스턴트는 현재 앱 컨텍스트에 접근할 수 있습니다.",
1474
1782
  switchAssistant: "어시스턴트 전환",
@@ -1476,7 +1784,7 @@ const ko = {
1476
1784
  empty: {
1477
1785
  build: {
1478
1786
  title: "AI로 빌드",
1479
- description: "앱이나 워크플로를 일상 언어로 설명해 주세요 — 객체, 화면, 자동화를 초안으로 만들어 드리면 검토 후 게시하시면 됩니다.",
1787
+ description: "앱을 일상 언어로 설명해 주세요 — 객체, 화면, 샘플 데이터를 초안으로 만들어 드리면 검토 후 게시하시면 됩니다.",
1480
1788
  },
1481
1789
  ask: {
1482
1790
  title: "데이터에 질문하기",
@@ -1485,17 +1793,22 @@ const ko = {
1485
1793
  editApp: {
1486
1794
  title: "“{{app}}” 편집 중",
1487
1795
  titleGeneric: "이 앱 편집",
1488
- description: "무엇을 바꿀까요? 이 앱을 그 자리에서 수정합니다 — 필드, 객체, 뷰, 자동화를 추가하거나 기존 내용을 조정할 수 있습니다.",
1796
+ description: "무엇을 바꿀까요? 이 앱을 그 자리에서 수정합니다 — 필드, 객체, 뷰, 대시보드를 추가하거나 기존 내용을 조정할 수 있습니다.",
1489
1797
  },
1490
1798
  },
1491
1799
  clearConversation: "지우기",
1492
1800
  sendHint: "눌러 전송",
1801
+ newlineHint: "눌러 줄바꿈",
1493
1802
  agentActivity: "에이전트 활동",
1494
1803
  toolCompleted: "완료됨",
1495
1804
  toolRunning: "실행 중",
1496
1805
  toolAwaitingApproval: "승인 대기 중",
1497
1806
  toolFailed: "실패",
1498
1807
  toolDetailsHidden: "이 보기에서는 도구 입력과 원본 결과가 숨겨집니다.",
1808
+ toolDenyReason: "운영자가 채팅에서 거부함",
1809
+ builderHandoffTitle: "빌더에서 만들기",
1810
+ builderHandoffOpen: "빌더에서 열기 →",
1811
+ builderHandoffSuperseded: "더 최근의 요청이 있습니다",
1499
1812
  copy: "복사",
1500
1813
  copied: "복사됨",
1501
1814
  regenerate: "다시 생성",
@@ -1510,7 +1823,7 @@ const ko = {
1510
1823
  publishOk: "게시했습니다 — 객체가 이제 활성화되었습니다.",
1511
1824
  seedWarn: "게시했지만 일부 샘플 데이터를 불러오지 못했습니다.",
1512
1825
  openBuiltApp: "앱 열기",
1513
- designBuiltApp: "Studio에서 디자인",
1826
+ viewBuiltAppInStudio: "Studio에서 보기",
1514
1827
  previewDraft: "미리보기",
1515
1828
  previewApp: "앱 미리보기",
1516
1829
  resizeSplit: "채팅과 미리보기 크기 조정",
@@ -1538,23 +1851,41 @@ const ko = {
1538
1851
  recentRecords: "가장 최근에 생성된 레코드 5건을 보여 주세요.",
1539
1852
  recordCounts: "객체별 레코드 수를 세어 주세요.",
1540
1853
  },
1854
+ // cloud#1984 — these five chips are the maker's own recommendations, so
1855
+ // they may only ask for what ADR-0112 v1 BUILDS: objects, fields, views
1856
+ // (grid/kanban/calendar/gallery), pages, dashboards and sample data. No
1857
+ // wording that promises autonomous behaviour (alert / remind / notify /
1858
+ // automate / status workflow) — v1 has no flows, actions or schedules, and
1859
+ // the model silently degrades such a request into a board or a filtered
1860
+ // view, so the chip would promise an alert and deliver a page. REVERT to
1861
+ // the automation wording when ADR-0112 v2 re-adds flows and actions.
1541
1862
  metadataAssistant: {
1542
- buildCrm: "영업 CRM을 만들어 줘 — 고객, 담당자, 단계별로 합계를 낼 수 있는 거래 파이프라인.",
1543
- buildApp: "프로젝트 트래커를 만들어 줘 — 프로젝트, 담당자와 마감일이 있는 작업, 상태별 보드.",
1544
- buildFlow: "고객 지원 데스크를 설계해 줘 — 우선순위가 있는 티켓, 상태 워크플로, 고객 연결.",
1545
- buildInventory: "재고 앱을 만들어 줘 — 제품, 재고 수량, 공급업체, 재고 부족 표시.",
1546
- buildRecruiting: "채용 트래커를 만들어 줘 — 지원자, 채용 중인 직무, 면접 단계, 메모.",
1863
+ buildCrm: "영업 CRM을 만들어 줘 — 고객, 담당자, 단계 필드가 있는 거래, 단계별 금액을 합산하는 대시보드.",
1864
+ buildApp: "프로젝트 트래커를 만들어 줘 — 프로젝트, 담당자와 마감일이 있는 작업, 상태별 보드, 마감일 캘린더.",
1865
+ buildFlow: "고객 지원 데스크를 설계해 줘 — 우선순위와 상태 필드가 있는 티켓, 상태별 보드, 고객 연결.",
1866
+ buildInventory: "재고 앱을 만들어 줘 — 제품, 재고 수량, 공급업체, 재주문점 미만 제품을 걸러내는 뷰.",
1867
+ buildRecruiting: "채용 트래커를 만들어 줘 — 지원자, 채용 중인 직무, 면접 단계 필드, 단계별 보드.",
1547
1868
  },
1548
1869
  generic: {
1549
1870
  help: "무엇을 도와줄 수 있나요?",
1550
1871
  availableObjects: "사용 가능한 데이터 객체를 나열해 주세요.",
1551
1872
  recentActivity: "내 최근 활동을 요약해 주세요.",
1552
1873
  },
1874
+ // objectui#7709 — the edit-mode starters, shown when the maker is bound
1875
+ // to an EXISTING app (`?package=`). Same rule as the five above: they
1876
+ // may only ask for what ADR-0112 v1 BUILDS. The fourth chip used to be
1877
+ // `addAutomation` ("an approval, a status flow, or a notification") and
1878
+ // every capability it named is refused by v1 (cloud#1956 / PR #1970), so
1879
+ // it now asks for sample data — `seed` IS on v1's whitelist, and having
1880
+ // no data is what an existing app most often lacks. REVERT: when
1881
+ // ADR-0112 v2 re-adds flows and actions, THIS chip's automation wording
1882
+ // comes back as `addAutomation`; the retired string is pinned for every
1883
+ // pack in `packages/i18n/src/__tests__/makerEditChips-v1-scope-7709.test.ts`.
1553
1884
  editApp: {
1554
1885
  addField: "객체 중 하나에 필드를 추가해 주세요.",
1555
1886
  addObject: "새 객체를 추가하고 기존 객체와 연결해 주세요.",
1556
1887
  addDashboard: "핵심 지표를 위한 대시보드를 추가해 주세요.",
1557
- addAutomation: "자동화를 추가해 주세요 — 승인, 상태 흐름 또는 알림.",
1888
+ addSampleData: "기존 객체에 데모에서 보여 줄 만한 현실적인 샘플 데이터를 채워 주세요.",
1558
1889
  },
1559
1890
  },
1560
1891
  changesTitle: "변경 확인",
@@ -1619,6 +1950,7 @@ const ko = {
1619
1950
  collapse: "채팅 접기",
1620
1951
  maximize: "전체 페이지로 열기",
1621
1952
  open: "어시스턴트 열기",
1953
+ planAwaitingApproval: "제안된 계획이 승인을 기다리고 있습니다",
1622
1954
  },
1623
1955
  group: {
1624
1956
  today: "오늘",
@@ -1629,13 +1961,17 @@ const ko = {
1629
1961
  },
1630
1962
  },
1631
1963
  title: "ObjectStack 콘솔",
1632
- initializing: "애플리케이션 초기화 중…",
1633
- loadingHint: "새 환경을 설정하는 데 시간이 조금 걸릴 수 있습니다.",
1964
+ initializing: "콘솔을 여는 중…",
1965
+ skipToContent: "본문으로 건너뛰기",
1634
1966
  breadcrumb: {
1635
- dashboards: "대시보드",
1636
- pages: "페이지",
1637
- reports: "보고서",
1638
1967
  system: "시스템",
1968
+ marketplace: "마켓플레이스",
1969
+ settings: '설정',
1970
+ apps: '앱',
1971
+ profile: '프로필',
1972
+ approvals: '승인',
1973
+ aiApprovals: 'AI 승인',
1974
+ auditLog: '감사 로그',
1639
1975
  },
1640
1976
  // objectui#4024 — the single-namespace settings screen. Its sibling
1641
1977
  // `settingsHub` above already resolved through this pack; the view was the
@@ -1656,16 +1992,30 @@ const ko = {
1656
1992
  unsavedCount: "저장되지 않은 변경 {{count}}개",
1657
1993
  unsavedCount_one: "저장되지 않은 변경 {{count}}개",
1658
1994
  unsavedCount_other: "저장되지 않은 변경 {{count}}개",
1995
+ fieldErrorsToast: "확인이 필요한 설정 {{count}}개: {{settings}}",
1996
+ fieldErrorsToast_one: "확인이 필요한 설정 {{count}}개: {{settings}}",
1997
+ fieldErrorsToast_other: "확인이 필요한 설정 {{count}}개: {{settings}}",
1659
1998
  cryptoRefusalTitle: "이 배포는 시크릿을 암호화할 수 없습니다",
1660
1999
  cryptoRefusalSubjectSuffix: "은(는) 암호화 대상으로 선언되어 아무것도 기록되지 않았습니다.",
1661
2000
  cryptoRefusalNoSubject: "암호화 대상으로 선언된 값이 거부되어 아무것도 기록되지 않았습니다.",
1662
2001
  cryptoRefusalToast: "시크릿을 암호화할 수 없습니다: {{subject}}",
1663
2002
  cryptoRefusalToastNoSubject: "시크릿을 암호화할 수 없습니다",
1664
- },
1665
- loadingSteps: {
1666
- connecting: "데이터 소스에 연결 중",
1667
- loadingConfig: "설정 로드 중",
1668
- preparingWorkspace: "워크스페이스 준비 중",
2003
+ sourceBadgeInherited: "{{source}}에서 상속됨",
2004
+ sourceBadgeOverrides: "{{source}} 재정의",
2005
+ resetToDefault: "기본값으로 재설정",
2006
+ envLockBadge: "환경 변수로 잠김",
2007
+ envLockBadgeTitle: "환경 변수로 고정되어 UI에서 편집할 수 없습니다.",
2008
+ deprecatedBadge: "지원 중단됨",
2009
+ deprecatedBadgeReplacedBy: "지원 중단됨 → {{replacedBy}}",
2010
+ unsupportedSpecifierType: "지원되지 않는 설정 항목 유형: {{type}}",
2011
+ },
2012
+ workspaceTimezonePrompt: {
2013
+ title: "시스템 시간대 설정",
2014
+ description: "이 시스템은 아직 플랫폼 기본 시간대({{current}})를 사용하고 있습니다. 시스템 시간대는 수식에서 \"오늘\"의 의미, 보고서의 날짜별 그룹화, 날짜와 시간의 표시 방식을 결정하며 시스템의 모든 사용자에게 적용됩니다. 아래에 브라우저 시간대가 입력되어 있습니다.",
2015
+ laterHint: "설정 페이지에서 언제든지 변경할 수 있습니다.",
2016
+ decline: "기본값 유지",
2017
+ confirm: "시간대 설정",
2018
+ saved: "시스템 시간대를 {{zone}}(으)로 설정했습니다",
1669
2019
  },
1670
2020
  error: {
1671
2021
  connectionFailed: "서버에 연결할 수 없습니다",
@@ -1690,27 +2040,28 @@ const ko = {
1690
2040
  groups: {
1691
2041
  general: "일반",
1692
2042
  navigation: "탐색",
1693
- dataViews: "데이터 뷰",
1694
2043
  aiChat: "AI 어시스턴트",
1695
- preferences: "환경설정",
1696
2044
  },
1697
2045
  openCommandPalette: "명령 팔레트 열기",
1698
2046
  showShortcuts: "키보드 단축키 표시",
1699
2047
  closeDialog: "대화상자 / 패널 닫기",
1700
2048
  toggleSidebar: "사이드바 전환",
1701
- focusSearch: "검색에 포커스",
1702
- createRecord: "새 레코드 생성",
1703
- refreshData: "데이터 새로고침",
1704
- editRecord: "선택한 레코드 편집",
1705
2049
  newChat: "새 채팅",
1706
2050
  toggleChatsList: "채팅 목록 전환",
1707
- toggleDarkMode: "다크 모드 전환",
2051
+ goHome: "홈으로 돌아가기",
2052
+ },
2053
+ reportIndex: {
2054
+ title: "보고서",
2055
+ emptyTitle: "보고서 없음",
2056
+ emptyDescription: "이 앱에는 열 수 있는 보고서가 없습니다.",
1708
2057
  },
1709
2058
  commandPalette: {
1710
2059
  title: "명령 팔레트",
1711
2060
  placeholder: "명령어를 입력하거나 검색…",
1712
2061
  noResults: "결과를 찾을 수 없습니다.",
1713
2062
  objects: "객체",
2063
+ packages: "패키지",
2064
+ flows: "플로우",
1714
2065
  dashboards: "대시보드",
1715
2066
  pages: "페이지",
1716
2067
  reports: "보고서",
@@ -1727,6 +2078,21 @@ const ko = {
1727
2078
  records: "레코드",
1728
2079
  recentRecords: "최근 본 항목",
1729
2080
  },
2081
+ // objectui#9954 — see the `en` pack for what raises each case.
2082
+ readRate: {
2083
+ ratioTitle: '이 시스템의 읽기 양이 비정상적입니다',
2084
+ ratio: '쓰기 1행당 {{ratio}}행을 읽고 있습니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.',
2085
+ noWritesTitle: '이 시스템은 읽기만 있고 쓰기가 전혀 없습니다',
2086
+ noWrites: '행을 읽고 있지만 쓰기가 전혀 없어 읽기 비율에 상한이 없습니다. 가장 심각한 수치입니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.',
2087
+ },
2088
+ // objectui#10439 — see the `en` pack for what raises each case.
2089
+ storageUsage: {
2090
+ warningTitle: '저장 공간이 거의 가득 찼습니다',
2091
+ warning: '{{limit}} MB 중 {{used}} MB 사용 중입니다. 저장 공간이 가득 차면 업로드와 가져오기가 일시 중지됩니다.',
2092
+ blockedTitle: '저장 공간이 가득 찼습니다: 업로드와 가져오기가 일시 중지되었습니다',
2093
+ blocked: '{{limit}} MB 중 {{used}} MB 사용 중입니다. 기존 데이터는 그대로 유지되며, 읽기, 내보내기, 개별 레코드 편집은 계속 사용할 수 있습니다.',
2094
+ upgrade: '업그레이드하고 계속하기',
2095
+ },
1730
2096
  errors: {
1731
2097
  somethingWentWrong: "문제가 발생했습니다",
1732
2098
  unexpectedError: "이 뷰를 렌더링하는 중 예기치 않은 오류가 발생했습니다.",
@@ -1757,22 +2123,26 @@ const ko = {
1757
2123
  viewNameInvalid: "소문자, 숫자, 밑줄을 사용하고 문자 또는 밑줄로 시작하세요.",
1758
2124
  systemViewReadonly: "시스템 보기는 코드에 정의되어 있어 읽기 전용입니다.",
1759
2125
  cannotEditMetaView: "이 보기는 코드에 정의된 기본 제공 보기이므로 변경할 수 없습니다.",
2126
+ resetView: "보기 재설정",
2127
+ resetViewTitle: "이 보기의 정렬, 필터, 열 너비를 보기 자체의 설정으로 되돌립니다. 본인의 설정만 변경됩니다.",
1760
2128
  cannotDeleteMetaView: "이 보기는 코드에 정의된 기본 제공 보기이므로 삭제할 수 없습니다.",
1761
2129
  expandToPage: "전체 페이지로 열기",
1762
2130
  objectNotFound: "객체를 찾을 수 없음",
1763
2131
  objectNotFoundDescription: "객체 \"{{objectName}}\"이(가) 현재 구성에 존재하지 않습니다.",
1764
2132
  objectNotFoundHint: "앱 탐색 설정을 확인하거나 사이드바에서 다른 객체를 선택하세요.",
2133
+ objectPackageDisabled: "객체 \"{{objectName}}\"이(가) 속한 패키지가 비활성화되어 있어 제공되지 않습니다.",
1765
2134
  filterOrNotSavable: "이 필터는 조건 사이에 OR을 사용하며, 저장된 뷰에는 아직 저장할 수 없습니다. 현재 목록에는 계속 적용됩니다. 뷰에 저장하려면 OR 그룹을 해제하세요.",
1766
2135
  filterNestedNotSavable: "이 필터는 중첩된 조건 그룹을 사용하며, 저장된 뷰에는 저장할 수 없습니다. 뷰에 저장하려면 단일 조건 목록으로 펼치세요.",
1767
2136
  allRecords: "모든 레코드",
1768
2137
  new: "새로 만들기",
1769
2138
  configureView: "뷰 구성",
1770
- toolbar: "도구 모음",
1771
2139
  toolbarEnabledCount: "{{total}}개 중 {{count}}개 활성화",
1772
2140
  searchFields: "필드 검색…",
1773
2141
  title: "제목",
1774
2142
  viewType: "뷰 유형",
1775
2143
  recordCount: "{{count}}개 레코드",
2144
+ recordCount_one: "{{count}}개 레코드",
2145
+ recordCount_other: "{{count}}개 레코드",
1776
2146
  save: "저장",
1777
2147
  discard: "취소",
1778
2148
  createView: "뷰 생성",
@@ -1784,11 +2154,12 @@ const ko = {
1784
2154
  longitudeField: "경도 필드",
1785
2155
  imageField: "이미지 필드",
1786
2156
  selectField: "필드 선택…",
1787
- groupBy: "그룹화 기준",
1788
2157
  endDateField: "종료 날짜 필드",
1789
2158
  import: "가져오기",
1790
2159
  importTitle: "CSV에서 가져오기",
1791
2160
  importedToast: "{{count}}개 행 가져옴.",
2161
+ importedToast_one: "{{count}}개 행 가져옴.",
2162
+ importedToast_other: "{{count}}개 행 가져옴.",
1792
2163
  importedWithSkipped: "{{ok}}개 행 가져옴; {{skipped}}개 건너뜀.",
1793
2164
  createViewDesc: "보기 유형을 선택하고 이름을 지정하세요. 모든 설정은 나중에 변경할 수 있습니다.",
1794
2165
  cancel: "취소",
@@ -1797,6 +2168,8 @@ const ko = {
1797
2168
  deleteViewTitle: "보기 삭제",
1798
2169
  deleteViewConfirm: "\"{{name}}\" 보기를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
1799
2170
  bulkDeleteConfirm: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
2171
+ bulkDeleteConfirm_one: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
2172
+ bulkDeleteConfirm_other: "선택한 {{count}}개 레코드를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
1800
2173
  duplicateViewName: "해당 이름의 보기가 이미 존재합니다.",
1801
2174
  viewTypeGrid: "그리드",
1802
2175
  viewTypeGridDesc: "레코드의 스프레드시트 형식 테이블.",
@@ -1833,14 +2206,22 @@ const ko = {
1833
2206
  chartTypePie: "원형 차트",
1834
2207
  chartTypeArea: "영역 차트",
1835
2208
  chartTypeScatter: "분산형 차트",
1836
- xAxisField: "X축 필드",
1837
- xAxisFieldHelp: "범주형 또는 시간 차원.",
1838
- yAxisField: "Y축 필드",
1839
- yAxisFieldHelp: "집계할 숫자 필드.",
2209
+ dataset: "데이터 세트",
2210
+ datasetHelp: "차트는 이 객체의 데이터 세트에서 숫자를 읽습니다.",
2211
+ chartMeasure: "측정값",
2212
+ chartMeasureHelp: "값 축에 표시할 데이터 세트의 측정값입니다.",
2213
+ chartDimension: "차원",
2214
+ chartDimensionHelp: "값을 그룹화할 데이터 세트의 차원입니다(선택 사항).",
2215
+ viewTypeUnavailableDataset: "이 객체에는 차트에 사용할 데이터 세트가 없습니다.",
2216
+ noDatasetMeasure: "이 데이터 세트에는 차트에 사용할 측정값이 선언되어 있지 않습니다.",
1840
2217
  ufTabs: "탭",
1841
2218
  ufAddField: "+ 필터 필드 추가…",
1842
2219
  ufShowAllRecords: "\"모든 레코드\" 탭 표시",
1843
2220
  },
2221
+ runtimeDraft: {
2222
+ publishFailed: "게시에 실패했습니다",
2223
+ discardFailed: "초안 버리기에 실패했습니다",
2224
+ },
1844
2225
  localeSwitcher: {
1845
2226
  label: "언어",
1846
2227
  },
@@ -1848,14 +2229,22 @@ const ko = {
1848
2229
  nav: {
1849
2230
  pinItem: "{{name}} 고정",
1850
2231
  unpinItem: "{{name}} 고정 해제",
1851
- dragToReorder: "드래그하여 순서 변경",
1852
2232
  favorites: "즐겨찾기",
2233
+ launcherLabel: "앱 런처",
2234
+ menuLabel: "앱 탐색",
2235
+ menuEmpty: "이 앱에는 열 수 있는 탐색 항목이 없습니다.",
2236
+ itemMenu: "{{name}} 더 많은 작업",
2237
+ openInNewTab: "새 탭에서 열기",
2238
+ copyLink: "링크 복사",
2239
+ linkCopied: "링크가 클립보드에 복사됨",
2240
+ linkCopyFailed: "링크 복사 실패",
2241
+ design: "디자인",
1853
2242
  },
1854
2243
  },
1855
2244
  auth: {
1856
2245
  setPassword: {
1857
2246
  title: "복구 비밀번호 설정",
1858
- description: "싱글 사인온으로 로그인했습니다. SSO를 사용할 수 없게 되더라도 이 환경에 직접 로그인할 수 있도록 로컬 비밀번호를 설정하세요.",
2247
+ description: "싱글 사인온으로 로그인했습니다. SSO를 사용할 수 없게 되더라도 직접 로그인할 수 있도록 로컬 비밀번호를 설정하세요.",
1859
2248
  email: "이메일",
1860
2249
  newPassword: "새 비밀번호",
1861
2250
  confirmPassword: "비밀번호 확인",
@@ -1871,9 +2260,8 @@ const ko = {
1871
2260
  signingIn: "로그인하는 중…",
1872
2261
  ssoHandoff: "{{target}}(으)로 계속",
1873
2262
  devAdminHint: {
1874
- title: "개발 인스턴스",
1875
- body: "시드된 개발용 관리자 계정으로 로그인하세요:",
1876
- dismiss: "닫기",
2263
+ title: "로컬 개발 인스턴스",
2264
+ signIn: "개발용 관리자로 로그인",
1877
2265
  },
1878
2266
  title: "계정에 로그인",
1879
2267
  description: "이메일과 비밀번호를 입력하세요",
@@ -1903,6 +2291,22 @@ const ko = {
1903
2291
  resendOtpCountdownText: "{seconds}초 후 재전송",
1904
2292
  usePhoneOtpText: "인증 코드로 로그인",
1905
2293
  usePasswordSignInText: "비밀번호로 로그인하기",
2294
+ socialButton: "{provider} 계정으로 계속",
2295
+ orText: "또는 이메일로 계속",
2296
+ ssoButton: "SSO로 로그인",
2297
+ ssoOnlyDescription: "소속 조직의 싱글 사인온으로 로그인하세요",
2298
+ usePasswordText: "비밀번호 사용하기",
2299
+ backToSsoText: "싱글 사인온으로 돌아가기",
2300
+ // objectui#12600 — the console login card's own header, the password
2301
+ // field's reveal toggle, and the footer's legal links.
2302
+ welcomeTitle: "다시 오신 것을 환영합니다",
2303
+ welcomeDescription: "로그인하고 작업을 계속하세요",
2304
+ showPasswordText: "비밀번호 표시",
2305
+ hidePasswordText: "비밀번호 숨기기",
2306
+ footer: {
2307
+ privacy: "개인정보처리방침",
2308
+ terms: "이용약관",
2309
+ },
1906
2310
  },
1907
2311
  register: {
1908
2312
  title: "계정 만들기",
@@ -1921,8 +2325,12 @@ const ko = {
1921
2325
  submittingButton: "계정 생성 중…",
1922
2326
  hasAccountText: "이미 계정이 있으신가요?",
1923
2327
  signInText: "로그인",
2328
+ socialButton: "{provider} 계정으로 가입",
2329
+ orText: "또는 이메일로 계속",
1924
2330
  errors: {
1925
2331
  userExists: "해당 이메일로 이미 계정이 존재합니다. 로그인해 보세요.",
2332
+ selfRegistrationClosed: "이 시스템에서는 직접 가입을 받지 않습니다. 관리자에게 초대를 요청하세요.",
2333
+ emailDomainNotAllowed: "이 이메일의 도메인으로는 여기에서 가입할 수 없습니다. 조직 이메일을 사용하거나 관리자에게 초대를 요청하세요.",
1926
2334
  },
1927
2335
  verifyInbox: {
1928
2336
  title: "받은 편지함을 확인하세요",
@@ -1998,7 +2406,7 @@ const ko = {
1998
2406
  checkSpam: "이메일을 받지 못하셨나요? 스팸 폴더를 확인하거나 지원팀에 문의하세요.",
1999
2407
  or: "또는",
2000
2408
  // objectui#3546 slice three.
2001
- resendUnavailable: "이 환경에서는 이메일 발송이 구성되지 않았을 수 있습니다. 문제가 계속되면 지원팀에 문의하세요.",
2409
+ resendUnavailable: "이 시스템에서는 이메일 발송이 구성되지 않았을 수 있습니다. 문제가 계속되면 지원팀에 문의하세요.",
2002
2410
  },
2003
2411
  setup: {
2004
2412
  welcomeTitle: "ObjectStack에 오신 것을 환영합니다",
@@ -2042,7 +2450,7 @@ const ko = {
2042
2450
  disabledDescription: "이 배포에는 장치 승인이 활성화되어 있지 않으므로 여기에서 이 장치를 승인할 수 없습니다.",
2043
2451
  },
2044
2452
  shell: {
2045
- tenantHostHint: "이 작업 공간에 로그인하는 중입니다",
2453
+ tenantHostHint: "이 시스템에 로그인하는 중입니다",
2046
2454
  },
2047
2455
  layout: {
2048
2456
  headline: "강력한 비즈니스 애플리케이션을 더 빠르게.",
@@ -2052,6 +2460,7 @@ const ko = {
2052
2460
  signOut: "대신 로그아웃",
2053
2461
  password: {
2054
2462
  title: "비밀번호가 만료되었습니다",
2463
+ resetTitle: "비밀번호를 변경해야 합니다",
2055
2464
  fallbackMessage: "계속하려면 새 비밀번호를 설정하세요.",
2056
2465
  current: "현재 비밀번호",
2057
2466
  next: "새 비밀번호",
@@ -2077,6 +2486,11 @@ const ko = {
2077
2486
  verifying: "확인 중…",
2078
2487
  invalidCode: "코드가 올바르지 않습니다. 다시 시도하세요.",
2079
2488
  },
2489
+ impersonation: {
2490
+ passwordTitle: "{{user}} 님이 비밀번호를 변경해야 합니다",
2491
+ mfaTitle: "{{user}} 님이 2단계 인증을 설정해야 합니다",
2492
+ body: "{{user}} 계정을 대행하고 있습니다. 이 작업은 해당 사용자 본인만 할 수 있습니다. 대행을 종료하고 본인 계정으로 돌아가세요.",
2493
+ },
2080
2494
  },
2081
2495
  },
2082
2496
  // objectui#3546 slice three — the /oauth/consent screen.
@@ -2085,12 +2499,17 @@ const ko = {
2085
2499
  title: "{{appName}}이(가) 계정에 액세스하려고 합니다",
2086
2500
  request: "{{appName}}이(가) 권한을 요청합니다{{suffix}}.",
2087
2501
  unknownApp: "어떤 애플리케이션",
2502
+ unidentified: "이 애플리케이션을 식별할 수 없습니다.",
2503
+ clientId: "클라이언트 ID",
2088
2504
  willAllow: "이 앱은 다음을 할 수 있습니다:",
2089
2505
  scope: {
2090
2506
  openid: "본인 확인",
2091
2507
  profile: "기본 프로필(이름, 사진) 읽기",
2092
2508
  email: "이메일 주소 읽기",
2093
2509
  offlineAccess: "로그인 상태 유지(액세스 갱신)",
2510
+ dataRead: "레코드 읽기(본인 권한 범위 내)",
2511
+ dataWrite: "레코드 생성, 변경 및 삭제(본인 권한 범위 내)",
2512
+ actionsExecute: "사용자를 대신하여 작업 실행(본인 권한 범위 내)",
2094
2513
  },
2095
2514
  deny: "거부",
2096
2515
  authorize: "허용",
@@ -2121,11 +2540,20 @@ const ko = {
2121
2540
  role: "역할",
2122
2541
  save: "변경 사항 저장",
2123
2542
  },
2543
+ language: {
2544
+ title: "언어",
2545
+ description: "회원님에게 발송되는 알림과 메시지에 사용되는 언어입니다. 화면 표시 언어는 지구본 메뉴에서 따로 변경합니다.",
2546
+ label: "선호 언어",
2547
+ systemDefault: "배포 기본값 사용",
2548
+ save: "저장",
2549
+ saved: "언어 설정을 업데이트했습니다.",
2550
+ readOnly: "이 계정의 언어는 관리자가 관리합니다.",
2551
+ },
2124
2552
  password: {
2125
2553
  changeTitle: "비밀번호 변경",
2126
2554
  setTitle: "로컬 비밀번호 설정",
2127
- changeDescription: "이 환경에 로그인할 때 사용하는 비밀번호를 업데이트하세요.",
2128
- setDescription: "통합 인증(SSO)으로 로그인하셨습니다. 로컬 비밀번호를 설정하면 이 환경에서 이메일과 비밀번호로도 로그인할 수 있습니다.",
2555
+ changeDescription: "로그인할 때 사용하는 비밀번호를 업데이트하세요.",
2556
+ setDescription: "통합 인증(SSO)으로 로그인하셨습니다. 로컬 비밀번호를 설정하면 이메일과 비밀번호로도 로그인할 수 있습니다.",
2129
2557
  current: "현재 비밀번호",
2130
2558
  new: "새 비밀번호",
2131
2559
  password: "비밀번호",
@@ -2134,7 +2562,7 @@ const ko = {
2134
2562
  mismatch: "비밀번호가 일치하지 않습니다",
2135
2563
  enterCurrent: "현재 비밀번호를 입력하세요",
2136
2564
  changed: "비밀번호가 변경되었습니다.",
2137
- localSet: "로컬 비밀번호가 설정되었습니다. 이제 이 환경에서 이메일과 비밀번호로 로그인할 수 있습니다.",
2565
+ localSet: "로컬 비밀번호가 설정되었습니다. 이제 이메일과 비밀번호로 로그인할 수 있습니다.",
2138
2566
  changeAction: "비밀번호 변경",
2139
2567
  setAction: "비밀번호 설정",
2140
2568
  },
@@ -2149,22 +2577,21 @@ const ko = {
2149
2577
  unknown: "예기치 않은 오류가 발생했습니다.",
2150
2578
  },
2151
2579
  workspace: {
2152
- label: "워크스페이스",
2153
- default: "내 워크스페이스",
2154
- switch: "워크스페이스 전환",
2155
- create: "워크스페이스 생성",
2156
- createTitle: "워크스페이스 만들기",
2157
- createDescription: "워크스페이스는 팀이 협업할 수 있는 공유 공간입니다.",
2158
- createButton: "워크스페이스 생성",
2159
- nameLabel: "워크스페이스 이름",
2580
+ label: "조직",
2581
+ default: "내 조직",
2582
+ switch: "조직 전환",
2583
+ createTitle: "조직 만들기",
2584
+ createDescription: "조직은 팀이 협업할 수 있는 공유 공간입니다.",
2585
+ createButton: "조직 생성",
2586
+ nameLabel: "조직 이름",
2160
2587
  namePlaceholder: "예: Acme Inc",
2161
2588
  slugLabel: "URL 슬러그",
2162
2589
  slugHint: "URL에 사용됩니다. 소문자, 숫자, 하이픈만 사용 가능합니다.",
2163
2590
  invite: "구성원 초대",
2164
2591
  members: "구성원",
2165
- settings: "워크스페이스 설정",
2592
+ settings: "조직 설정",
2166
2593
  multiOrgDisabled: "이 인스턴스에서는 새 조직을 만들 수 없습니다.",
2167
- createFailed: '워크스페이스를 만들지 못했습니다',
2594
+ createFailed: '조직을 만들지 못했습니다',
2168
2595
  },
2169
2596
  help: {
2170
2597
  onThisPage: "이 페이지에서",
@@ -2172,12 +2599,17 @@ const ko = {
2172
2599
  appDocs: '이 앱의 문서',
2173
2600
  allDocs: '전체 문서',
2174
2601
  onlineDocs: '온라인 문서',
2602
+ loadingDocumentation: '문서 로딩 중',
2603
+ about: '정보',
2604
+ aboutTitle: '이 콘솔 정보',
2605
+ aboutDescription: '이 콘솔이 컴파일된 빌드입니다.',
2606
+ aboutBuild: '콘솔 빌드',
2607
+ aboutBuildUnknown: '알 수 없는 빌드(이 콘솔을 빌드할 때 버전이 설정되지 않음)',
2175
2608
  },
2176
2609
  sidebar: {
2177
2610
  packageManagement: "패키지 관리",
2178
2611
  searchNavigation: "내비게이션 검색…",
2179
2612
  settings: "설정",
2180
- help: "도움말",
2181
2613
  helpTooltip: "도움말 및 문서",
2182
2614
  activityFeed: "활동 피드",
2183
2615
  notifications: "알림",
@@ -2187,18 +2619,16 @@ const ko = {
2187
2619
  area: "영역",
2188
2620
  scope: "범위",
2189
2621
  recent: "최근",
2190
- favorites: "즐겨찾기",
2191
2622
  starred: "즐겨찾기",
2192
2623
  removeFromFavorites: "즐겨찾기에서 {{name}} 제거",
2624
+ allReports: "모든 보고서",
2193
2625
  },
2194
2626
  topbar: {
2195
2627
  openAssistant: "{{name}} 어시스턴트 열기",
2196
2628
  offline: "오프라인",
2197
2629
  usersOnline: "현재 접속 중인 사용자",
2198
2630
  switchView: "뷰 전환",
2199
- switchObject: "객체 전환",
2200
2631
  connection: {
2201
- connected: "연결됨",
2202
2632
  connecting: "연결 중…",
2203
2633
  reconnecting: "다시 연결 중…",
2204
2634
  disconnected: "연결 끊김",
@@ -2211,23 +2641,22 @@ const ko = {
2211
2641
  },
2212
2642
  aiAssistant: "AI 어시스턴트",
2213
2643
  designInStudio: "Studio에서 디자인",
2644
+ editApp: "앱 편집",
2214
2645
  },
2215
2646
  home: {
2216
2647
  build: {
2217
2648
  title: "앱 만들기",
2218
- subtitle: "처음부터 시작 — 객체, 폼, 자동화, 인터페이스를 설계합니다.",
2219
- noCapability: "이 워크스페이스에서는 앱 만들기를 사용할 수 없습니다 — ‘메타데이터 관리’ 권한이 필요하지만 계정에 해당 권한이 없습니다.",
2649
+ noCapability: "이 시스템에서는 앱 만들기를 사용할 수 없습니다 — ‘메타데이터 관리’ 권한이 필요하지만 계정에 해당 권한이 없습니다.",
2220
2650
  },
2221
2651
  template: {
2222
2652
  title: "템플릿으로 시작",
2223
- subtitle: "마켓플레이스에서 템플릿 앱을 설치하고 원하는 대로 바꾸세요.",
2224
2653
  marketplaceDisabled: "이 런타임에는 앱 마켓플레이스가 구성되어 있지 않아 여기에서 설치할 템플릿이 없습니다.",
2225
2654
  },
2226
2655
  welcomeAdminDescription: "비즈니스를 한 문장으로 설명해 주세요 — AI가 객체, 화면, API, 에이전트 도구를 생성합니다. 왼쪽 메뉴에서 직접 설정할 수도 있습니다.",
2227
2656
  welcomeAdminDescriptionNoBuild: "왼쪽 관리 메뉴에서 첫 애플리케이션을 설정하세요. 데이터가 쌓이면 AI 어시스턴트가 살펴보는 것을 도와줍니다.",
2228
2657
  welcomeAdminDescriptionNoAi: "왼쪽 관리 메뉴에서 첫 애플리케이션을 설정하세요.",
2229
2658
  noAppsTitle: "아직 애플리케이션이 없습니다",
2230
- noAppsDescription: "워크스페이스를 준비하고 있습니다 — 관리자가 공유한 앱이 여기에 표시됩니다.",
2659
+ noAppsDescription: "시스템을 준비하고 있습니다 — 관리자가 공유한 앱이 여기에 표시됩니다.",
2231
2660
  buildWithAI: "AI로 빌드",
2232
2661
  askAI: "AI에게 질문",
2233
2662
  recoveryReminder: {
@@ -2236,7 +2665,15 @@ const ko = {
2236
2665
  dismiss: "닫기",
2237
2666
  },
2238
2667
  pendingDrafts: {
2239
- message: "게시되지 않은 변경이 {{count}}건 있습니다 — 게시하면 반영됩니다.",
2668
+ // objectui#12602 — the drafts row in Home's "My work" section: the
2669
+ // count, then the first draft names joined by `nameSeparator`, in
2670
+ // their package when they share one.
2671
+ title: "게시되지 않은 변경 {{count}}개",
2672
+ title_one: "게시되지 않은 변경 {{count}}개",
2673
+ title_other: "게시되지 않은 변경 {{count}}개",
2674
+ inPackage: "{{names}} · {{package}}에서 게시 대기 중",
2675
+ waiting: "{{names}} · 게시 대기 중",
2676
+ nameSeparator: ", ",
2240
2677
  cta: "게시",
2241
2678
  publishing: "게시하는 중…",
2242
2679
  published: "게시했습니다! 변경 사항이 반영되었습니다.",
@@ -2250,20 +2687,24 @@ const ko = {
2250
2687
  capabilityWarn: "작성 검사: 기능 권한 참조 {{count}}개가 아무것도 가리키지 않습니다.",
2251
2688
  },
2252
2689
  title: "홈",
2253
- subtitle: "워크스페이스 대시보드",
2254
2690
  nav: "홈",
2255
2691
  allApps: "모든 애플리케이션",
2256
2692
  yourApps: "내 앱",
2257
2693
  showMoreApps: "더 보기",
2258
2694
  showLess: "간략히",
2259
2695
  continueEmpty: "열어본 항목이 여기에 표시됩니다.",
2260
- actionCenter: {
2261
- title: "확인이 필요한 항목",
2262
- empty: "모두 처리했습니다",
2696
+ // objectui#12602 — Home's "My work" section: its heading, the link to the
2697
+ // full inbox, each column's title, "view all" link and empty line.
2698
+ myWork: {
2699
+ title: "내 작업",
2700
+ openInbox: "받은 편지함 열기",
2701
+ viewAll: "모두 보기",
2702
+ approvals: "승인 대기",
2703
+ approvalsEmpty: "승인 대기 중인 항목이 없습니다",
2704
+ notifications: "알림",
2705
+ notificationsEmpty: "읽지 않은 알림이 없습니다",
2263
2706
  },
2264
- loading: "워크스페이스 로드 중…",
2265
- recent: "최근",
2266
- starred: "즐겨찾기",
2707
+ loading: "로딩 중…",
2267
2708
  welcome: "ObjectUI에 오신 것을 환영합니다",
2268
2709
  welcomeDescription: "첫 애플리케이션을 만들거나 시스템 설정을 구성하여 시작하세요.",
2269
2710
  createFirstApp: "첫 앱 만들기",
@@ -2271,12 +2712,10 @@ const ko = {
2271
2712
  browseMarketplace: "앱 마켓플레이스 탐색",
2272
2713
  quickActions: {
2273
2714
  title: "빠른 작업",
2274
- createApp: "앱 생성",
2275
- createAppDesc: "새 애플리케이션으로 시작",
2276
2715
  manageObjects: "객체 관리",
2277
2716
  manageObjectsDesc: "데이터 모델 구성",
2278
2717
  systemSettings: "시스템 설정",
2279
- systemSettingsDesc: "워크스페이스 구성",
2718
+ systemSettingsDesc: "시스템 구성",
2280
2719
  },
2281
2720
  appCard: {
2282
2721
  noDescription: "설명 없음",
@@ -2286,20 +2725,29 @@ const ko = {
2286
2725
  greetingAfternoon: "좋은 오후에요",
2287
2726
  greetingEvening: "좋은 저녁이에요",
2288
2727
  greetingNight: "야간 작업 중",
2289
- heroTagline: "마지막으로 중단한 곳에서 이어서 하거나 새로운 것을 발견해 보세요.",
2290
- open: "열기",
2291
- stats: {
2292
- apps: "앱",
2293
- starred: "즐겨찾기",
2294
- recent: "최근",
2728
+ greetingSeparator: ", ",
2729
+ greetingEnd: ".",
2730
+ search: "앱, 레코드, 페이지 검색…",
2731
+ summary: {
2732
+ approvals: "오늘 승인 대기 중인 항목이 {{count}}건 있습니다",
2733
+ approvals_one: "오늘 승인 대기 중인 항목이 {{count}}건 있습니다",
2734
+ approvals_other: "오늘 승인 대기 중인 항목이 {{count}}건 있습니다",
2735
+ none: "오늘은 처리할 일이 없습니다",
2295
2736
  },
2737
+ addApp: "앱 추가",
2738
+ appOpened: "{{time}}에 열람",
2739
+ open: "열기",
2296
2740
  recentApps: {
2297
2741
  title: "최근 열린 항목",
2298
2742
  itemType: {
2299
2743
  object: "오브젝트",
2300
2744
  dashboard: "대시보드",
2301
2745
  page: "페이지",
2746
+ report: "보고서",
2747
+ package: "패키지",
2748
+ view: "목록 보기",
2302
2749
  record: "레코드",
2750
+ metadata: "메타데이터",
2303
2751
  },
2304
2752
  },
2305
2753
  starredApps: {
@@ -2321,7 +2769,6 @@ const ko = {
2321
2769
  organizations: "조직",
2322
2770
  roles: "역할",
2323
2771
  configuration: "구성",
2324
- createApp: "앱 만들기",
2325
2772
  administration: "관리",
2326
2773
  datasources: "데이터 소스",
2327
2774
  documentation: "문서",
@@ -2336,16 +2783,23 @@ const ko = {
2336
2783
  manageAllApps: "모든 앱 관리",
2337
2784
  systemConsole: "시스템 콘솔",
2338
2785
  noAppsConfigured: "구성된 앱 없음",
2786
+ allApps: "모든 앱",
2787
+ editAppInStudio: "Studio에서 {{app}} 편집",
2788
+ backToHome: "홈으로 돌아가기",
2789
+ settings: "시스템 설정",
2790
+ productHome: "{{product}} 홈",
2339
2791
  },
2340
2792
  activityFeed: {
2341
2793
  title: "최근 활동",
2342
2794
  filter: "필터",
2343
2795
  empty: "최근 활동 없음",
2796
+ accessDenied: "활동을 볼 권한이 없습니다.",
2344
2797
  ariaLabel: "활동 피드",
2345
2798
  typeCreate: "생성",
2346
2799
  typeUpdate: "업데이트",
2347
2800
  typeDelete: "삭제",
2348
2801
  typeComment: "댓글",
2802
+ typeSystem: "시스템",
2349
2803
  relativeJustNow: "방금 전",
2350
2804
  relativeSecondsAgo: "{{count}}초 전",
2351
2805
  relativeMinutesAgo: "{{count}}분 전",
@@ -2367,8 +2821,11 @@ const ko = {
2367
2821
  placeholder: "오브젝트, 대시보드, 페이지, 보고서 검색…",
2368
2822
  inputAriaLabel: "오브젝트, 대시보드, 페이지, 보고서 검색",
2369
2823
  resultsCount: "\"{{query}}\"에 대한 {{count}}개 결과",
2370
- resultsCountPlural: "\"{{query}}\"에 대한 {{count}}개 결과",
2824
+ resultsCount_one: "\"{{query}}\"에 대한 {{count}}개 결과",
2825
+ resultsCount_other: "\"{{query}}\"에 대한 {{count}}개 결과",
2371
2826
  itemsAvailable: "{{count}}개 항목 사용 가능",
2827
+ itemsAvailable_one: "{{count}}개 항목 사용 가능",
2828
+ itemsAvailable_other: "{{count}}개 항목 사용 가능",
2372
2829
  noResults: "결과를 찾을 수 없습니다",
2373
2830
  noResultsHint: "검색어를 조정해 보세요",
2374
2831
  typeObjects: "오브젝트",
@@ -2393,26 +2850,38 @@ const ko = {
2393
2850
  noAppsConfigured: "구성된 앱 없음",
2394
2851
  noAppsConfiguredDescription: "등록된 앱이 없습니다. 첫 번째 앱을 만들거나 시스템 설정을 방문하세요.",
2395
2852
  appNotAvailable: "앱을 사용할 수 없습니다",
2396
- appNotAvailableDescription: "이 앱을 아직 사용할 수 없습니다 — 아직 게시 중일 수 있습니다. 잠시 후 다시 시도하세요.",
2853
+ appNotAvailableDescription: "이 앱을 사용할 수 없습니다 — 잠시 후 다시 시도하세요.",
2854
+ appNotFound: "이 앱을 열 수 없습니다",
2855
+ appNotFoundDescription: "서버가 회원님의 계정에 대해 이 앱을 반환하지 않았습니다.",
2856
+ appUnreachable: "서버에 연결할 수 없습니다",
2857
+ appUnreachableDescription: "이 앱을 확인할 수 없습니다. 잠시 후 다시 시도하세요.",
2397
2858
  appAccessDenied: "이 앱에 접근할 권한이 없습니다",
2398
2859
  appAccessDeniedDescription: "이 앱은 존재하지만 계정에 여는 권한이 없습니다. 관리자에게 접근 권한을 요청하세요.",
2399
2860
  appAccessDeniedHome: "홈으로 돌아가기",
2861
+ appNothingAvailable: "{{app}}에서 아직 사용할 수 있는 항목이 없습니다",
2862
+ appNothingAvailableDescription: "이 앱에는 계정으로 열 수 있는 페이지가 없습니다. 관리자에게 접근 권한을 요청하세요.",
2863
+ appNothingAvailableGrantDescription: "이 앱에는 계정으로 열 수 있는 페이지가 없습니다. 설정에서 접근 권한을 부여할 수 있습니다.",
2864
+ openSetup: "설정 열기",
2400
2865
  createFirstApp: "첫 번째 앱 만들기",
2401
2866
  systemSettings: "시스템 설정",
2402
2867
  back: "뒤로",
2403
2868
  recordNotFound: "레코드를 찾을 수 없습니다",
2404
2869
  recordNotFoundDescription: "찾고 있는 레코드가 존재하지 않거나 삭제되었을 수 있습니다.",
2870
+ recordAccessDenied: "{{object}} 레코드에 접근할 권한이 없습니다",
2871
+ recordAccessDeniedDescription: "이 유형의 레코드를 볼 권한이 없습니다. 접근이 필요하면 관리자에게 문의하세요.",
2872
+ recordLoadFailed: "이 레코드를 불러오지 못했습니다",
2873
+ recordLoadFailedDescription: "불러오는 중 문제가 발생했습니다. 연결을 확인하고 다시 시도하세요.",
2405
2874
  },
2406
2875
  actionDialog: {
2407
2876
  title: "작업 매개변수",
2408
2877
  description: "계속하려면 필요한 정보를 입력하세요.",
2409
2878
  selectPlaceholder: "{{label}} 선택",
2410
2879
  requiredError: "{{label}}은(는) 필수입니다",
2880
+ unresolvedParam: '이 매개변수는 표시할 수 없습니다. 기반이 되는 필드가 개체 메타데이터에 없어 필요한 컨트롤을 만들 수 없습니다. 관리자에게 작업 정의를 수정하도록 요청하세요.',
2881
+ carryOverHint: '그대로 전달됨(읽기 전용)',
2411
2882
  cancel: "취소",
2412
2883
  confirm: "확인",
2413
2884
  uploading: "업로드 중…",
2414
- defaultActionTitle: "작업",
2415
- ok: "확인",
2416
2885
  lookupPlaceholder: "{{label}}의 레코드 ID",
2417
2886
  lookupHelpText: "이 매개변수에 참조 개체가 설정되어 있지 않아 레코드 선택기를 사용할 수 없습니다. 레코드 ID를 직접 입력하거나 관리자에게 작업 매개변수 수정을 요청하세요.",
2418
2887
  },
@@ -2421,11 +2890,6 @@ const ko = {
2421
2890
  confirm: "계속",
2422
2891
  cancel: "취소",
2423
2892
  },
2424
- rowAction: {
2425
- openMenu: "메뉴 열기",
2426
- edit: "편집",
2427
- delete: "삭제",
2428
- },
2429
2893
  navigationSync: {
2430
2894
  addedPage: "탐색 업데이트: 페이지 \"{{name}}\" 추가됨",
2431
2895
  addedDashboard: "탐색 업데이트: 대시보드 \"{{name}}\" 추가됨",
@@ -2439,13 +2903,18 @@ const ko = {
2439
2903
  updateFailed: "탐색을 업데이트할 수 없습니다",
2440
2904
  },
2441
2905
  objectActions: {
2442
- resetPackageSetConfirm: "이 권한 세트는 설치된 패키지에 포함되어 있어 제거할 수 없습니다. 삭제하면 패키지 기본 상태로 초기화되며 이 환경의 커스터마이징은 폐기됩니다. 계속할까요?",
2443
- resetPackageSetSuccess: "권한 세트를 패키지 기본 상태로 초기화했습니다",
2444
2906
  deleteSuccess: "{{label}} 삭제 성공",
2445
2907
  deleteFailed: "{{label}} 삭제 실패",
2446
2908
  noRecordId: "레코드 ID가 없습니다",
2447
2909
  deleteConfirm: "이 레코드를 삭제하시겠습니까?",
2910
+ deleteConfirmTitle: "{{label}} \"{{name}}\"을(를) 삭제하시겠습니까?",
2911
+ bulkDeleteConfirmTitle: "{{count}}개의 {{label}} 레코드를 삭제하시겠습니까?",
2912
+ bulkDeleteConfirmTitle_one: "{{count}}개의 {{label}} 레코드를 삭제하시겠습니까?",
2913
+ bulkDeleteConfirmTitle_other: "{{count}}개의 {{label}} 레코드를 삭제하시겠습니까?",
2914
+ deleteConfirmButton: "삭제",
2448
2915
  bulkDeleteSuccess: "{{count}}개의 {{label}} 레코드 삭제됨",
2916
+ bulkDeleteSuccess_one: "{{count}}개의 {{label}} 레코드 삭제됨",
2917
+ bulkDeleteSuccess_other: "{{count}}개의 {{label}} 레코드 삭제됨",
2449
2918
  bulkDeletePartial: "{{succeeded}}개 삭제됨, {{failed}}개 실패",
2450
2919
  },
2451
2920
  objectViewActions: {
@@ -2457,15 +2926,6 @@ const ko = {
2457
2926
  exportFailed: "내보내기 실패: {{message}}",
2458
2927
  forecastSoon: "예측 보기가 곧 출시됩니다",
2459
2928
  },
2460
- recordDetail: {
2461
- viewersTooltip: "현재 이 레코드를 보고 있는 사용자",
2462
- },
2463
- cellRender: {
2464
- empty: "비어 있음",
2465
- yes: "예",
2466
- no: "아니요",
2467
- systemFields: "시스템",
2468
- },
2469
2929
  user: {
2470
2930
  profile: "프로필",
2471
2931
  settings: "설정",
@@ -2487,6 +2947,7 @@ const ko = {
2487
2947
  loading: "로딩 중…",
2488
2948
  failedToLoad: "매트릭스 로드 실패: {{message}}",
2489
2949
  needsAcross: "매트릭스 보고서에는 하나 이상의 `groupingsAcross` 필드가 필요합니다.",
2950
+ forbiddenMessage: "이 보고서의 데이터를 볼 수 있는 권한이 없습니다.",
2490
2951
  aggregate: {
2491
2952
  count: "개수",
2492
2953
  countDistinct: "고유 개수",
@@ -2501,18 +2962,18 @@ const ko = {
2501
2962
  },
2502
2963
  },
2503
2964
  organizations: {
2504
- create: "워크스페이스 만들기",
2505
- mine: "내 워크스페이스",
2506
- title: "워크스페이스",
2507
- heading: "내 워크스페이스",
2508
- subtitle: "계속할 워크스페이스를 선택하거나 새 워크스페이스를 만드세요.",
2509
- searchPlaceholder: "워크스페이스 검색",
2510
- new: "새 워크스페이스",
2511
- current: "현재 워크스페이스",
2965
+ create: "조직 만들기",
2966
+ mine: "내 조직",
2967
+ title: "조직",
2968
+ heading: "내 조직",
2969
+ subtitle: "계속할 조직을 선택하거나 새 조직을 만드세요.",
2970
+ searchPlaceholder: "조직 검색",
2971
+ new: "새 조직",
2972
+ current: "현재 조직",
2512
2973
  manage: "관리",
2513
- emptyTitle: "아직 워크스페이스가 없습니다",
2514
- emptyDescription: "시작하려면 첫 번째 워크스페이스를 만드세요.",
2515
- noMatches: "검색과 일치하는 워크스페이스가 없습니다.",
2974
+ emptyTitle: "아직 조직이 없습니다",
2975
+ emptyDescription: "시작하려면 첫 번째 조직을 만드세요.",
2976
+ noMatches: "검색과 일치하는 조직이 없습니다.",
2516
2977
  },
2517
2978
  organization: {
2518
2979
  roles: {
@@ -2597,6 +3058,7 @@ const ko = {
2597
3058
  readOnlyNote: "소유자만 설정을 변경할 수 있습니다.",
2598
3059
  nameLabel: "조직 이름",
2599
3060
  slugLabel: "슬러그",
3061
+ slugLockedNote: "이 조직에는 활성 환경이 있어 여기에서 슬러그를 변경할 수 없습니다. 이름을 바꾸면 해당 환경의 하위 도메인도 함께 이동합니다.",
2600
3062
  logoLabel: "로고",
2601
3063
  logoUpload: "업로드",
2602
3064
  logoReplace: "변경",
@@ -2655,18 +3117,37 @@ const ko = {
2655
3117
  regionLabel: "알림",
2656
3118
  groupCount: "알림 {{count}}건",
2657
3119
  groupUnread: "읽지 않음 {{count}}건",
3120
+ groupUnread_one: "읽지 않음 {{count}}건",
3121
+ groupUnread_other: "읽지 않음 {{count}}건",
2658
3122
  groupMarkRead: "읽음 표시",
2659
3123
  groupMarkReadTitle: "이 유형 전체를 읽음으로 표시",
2660
3124
  empty: "알림 없음",
2661
3125
  markAllRead: "모두 읽음으로 표시",
2662
3126
  viewAll: "모든 알림 보기",
2663
3127
  approvalsPending: "{{count}}건의 승인 대기 중",
3128
+ approvalsPending_one: "{{count}}건의 승인 대기 중",
3129
+ approvalsPending_other: "{{count}}건의 승인 대기 중",
2664
3130
  viewApprovals: "승인 보기",
2665
3131
  noPendingApprovals: "대기 중인 승인 없음",
2666
3132
  openApprovalsInbox: "승인 보관함 열기",
2667
3133
  badgeTotal: "총 {{total}}건",
2668
- badgeNotifications: "알림 {{unread}}건",
2669
- badgeApprovals: "승인 대기 {{approvals}}건",
3134
+ badgeNotifications: "알림 {{count}}건",
3135
+ badgeNotifications_one: "알림 {{count}}건",
3136
+ badgeNotifications_other: "알림 {{count}}건",
3137
+ badgeApprovals: "승인 대기 {{count}}건",
3138
+ badgeApprovals_one: "승인 대기 {{count}}건",
3139
+ badgeApprovals_other: "승인 대기 {{count}}건",
3140
+ arrivalMany: "새 메시지 {{count}}건",
3141
+ arrivalMany_one: "새 메시지 {{count}}건",
3142
+ arrivalMany_other: "새 메시지 {{count}}건",
3143
+ arrivalRepeats: "이 주제의 새 메시지 {{count}}건",
3144
+ arrivalRepeats_one: "이 주제의 새 메시지 {{count}}건",
3145
+ arrivalRepeats_other: "이 주제의 새 메시지 {{count}}건",
3146
+ arrivalOpen: "보기",
3147
+ toastEnabled: "앱 내 알림",
3148
+ desktopEnabled: "데스크톱 알림",
3149
+ desktopBlocked: "차단됨. 브라우저 설정에서 이 사이트의 알림을 허용하세요.",
3150
+ desktopUnsupported: "이 브라우저는 데스크톱 알림을 지원하지 않습니다.",
2670
3151
  emptyUnread: "모두 읽음",
2671
3152
  filterUnread: "읽지 않음",
2672
3153
  filterAll: "전체",
@@ -2680,12 +3161,14 @@ const ko = {
2680
3161
  thankYouTitle: "감사합니다!",
2681
3162
  thankYouMessage: "제출이 성공적으로 수신되었습니다.",
2682
3163
  redirecting: "{{seconds}}초 후 리디렉션됩니다…",
3164
+ redirectPending: "리디렉션 중…",
2683
3165
  unavailableTitle: "양식을 사용할 수 없습니다",
2684
3166
  unavailableDescription: "이 URL에서 사용 가능한 공개 양식이 없습니다. 기본 보기에서 익명 공유가 활성화되어 있는지 확인하세요.",
2685
3167
  tryDemo: "데모 시도",
2686
3168
  retry: "다시 시도",
2687
3169
  loading: "양식 로딩 중…",
2688
3170
  requiredHint: "* 필수 필드",
3171
+ requiredFields: "필수 항목: {{fields}}",
2689
3172
  consentLabelDefault: "개인정보 처리방침에 동의하며 이 요청을 위해 내 데이터 처리에 동의합니다.",
2690
3173
  consentLink: "개인정보 처리방침",
2691
3174
  consentRequired: "계속하려면 개인정보 처리방침에 동의하세요.",
@@ -2698,10 +3181,10 @@ const ko = {
2698
3181
  body: 'MCP 서비스가 꺼져 있습니다(OS_MCP_SERVER_ENABLED=false). 운영자에게 다시 활성화를 요청하세요.',
2699
3182
  },
2700
3183
  url: {
2701
- title: '이 환경의 MCP 엔드포인트',
3184
+ title: '이 시스템의 MCP 엔드포인트',
2702
3185
  body: 'MCP를 지원하는 모든 AI 클라이언트가 이 URL로 연결합니다. 인증은 셀프서비스입니다. 배포 자체가 OAuth 2.1 인가 서버이므로 브라우저 로그인만 하면 되고, 모든 호출은 본인의 권한과 행 수준 보안 아래 실행됩니다.',
2703
3186
  downloadSkill: 'SKILL.md 다운로드',
2704
- skillHint: '이식 가능한 에이전트 스킬: 스킬을 지원하는 에이전트에게 이 환경 사용법을 알려줍니다.',
3187
+ skillHint: '이식 가능한 에이전트 스킬: 스킬을 지원하는 에이전트에게 이 시스템 사용법을 알려줍니다.',
2705
3188
  },
2706
3189
  claude: {
2707
3190
  body: '설정 → 커넥터 → 사용자 지정 커넥터 추가에서 이 URL을 붙여넣고 브라우저에서 로그인하세요.',
@@ -2736,18 +3219,83 @@ const ko = {
2736
3219
  noImportableFields: "해당 오브젝트에는 가져올 수 있는 필드가 없습니다.",
2737
3220
  schemaReadFailed: "오브젝트 스키마를 읽을 수 없습니다.",
2738
3221
  imported: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
3222
+ imported_one: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
3223
+ imported_other: "{{count}}개 행을 {{object}}(으)로 가져왔습니다.",
2739
3224
  importFrom: "실제 데이터 가져오기 원본",
2740
3225
  into: "→",
2741
3226
  opening: "여는 중…",
2742
3227
  importAction: "가져오기",
2743
3228
  dismiss: "닫기",
2744
3229
  },
2745
- cloudOnboarding: {
2746
- hintCreate: "첫 환경을 만들어 보세요. 고유한 URL과 데이터베이스, 요금제를 갖춘 전용 작업 공간이며 앱 구축은 그 안에서 이루어집니다.",
2747
- hintReady: "프로덕션 환경이 준비되었습니다. 열어서 앱을 만들고 실행하세요. 모두 환경 안에서 이루어집니다.",
2748
- createEnvironment: "환경 만들기",
2749
- openProduction: "프로덕션 열기",
2750
- manageEnvironments: "환경 관리",
3230
+ cloudWorkspaceTimezoneNotice: {
3231
+ seeded: "환경 시간대는 생성 시 브라우저에 맞춰 {{zone}}(으)로 설정되었습니다. 설정 → 현지화에서 변경할 수 있습니다.",
3232
+ },
3233
+ ai: {
3234
+ nlQuery: {
3235
+ placeholder: "데이터에 대해 질문하세요…",
3236
+ ask: "질문",
3237
+ results: "결과",
3238
+ match: "일치도 {{percent}}",
3239
+ simulatedSummary: "검색 결과: {{query}}",
3240
+ noResults: "일치하는 레코드가 없습니다",
3241
+ recentQueries: "최근 쿼리",
3242
+ },
3243
+ formAssist: {
3244
+ title: "AI 제안",
3245
+ suggestionCount: "제안 {{count}}개",
3246
+ suggestionCount_one: "제안 {{count}}개",
3247
+ suggestionCount_other: "제안 {{count}}개",
3248
+ applyAll: "모두 적용",
3249
+ confidence: "신뢰도 {{percent}}",
3250
+ appliedCount: "제안 {{count}}개 적용됨",
3251
+ appliedCount_one: "제안 {{count}}개 적용됨",
3252
+ appliedCount_other: "제안 {{count}}개 적용됨",
3253
+ },
3254
+ recommendations: {
3255
+ title: "추천",
3256
+ generating: "추천을 생성하는 중…",
3257
+ empty: "추천 항목이 없습니다",
3258
+ },
3259
+ },
3260
+ aiApprovals: {
3261
+ title: "AI 승인",
3262
+ description: "AI 에이전트가 제안한 작업으로, 실행 전에 사람의 검토가 필요합니다.",
3263
+ tabPending: "대기 중",
3264
+ tabDecided: "처리됨",
3265
+ tabAll: "전체",
3266
+ statusPending: "대기 중",
3267
+ statusApproved: "승인됨",
3268
+ statusExecuted: "실행됨",
3269
+ statusFailed: "실패",
3270
+ statusRejected: "거부됨",
3271
+ colTool: "도구",
3272
+ colAction: "작업",
3273
+ colObject: "객체",
3274
+ colStatus: "상태",
3275
+ colProposed: "제안 시각",
3276
+ colDecision: "결정",
3277
+ emptyTitle: "대기 중인 작업 없음",
3278
+ emptyDescription: "AI가 민감한 작업을 제안하면 검토를 위해 여기에 표시됩니다.",
3279
+ view: "보기",
3280
+ approve: "승인",
3281
+ reject: "거부",
3282
+ working: "처리 중…",
3283
+ approveAndExecute: "승인 후 실행",
3284
+ outcomeApprove: "{{id}} 승인: {{message}}",
3285
+ outcomeReject: "{{id}} 거부: {{message}}",
3286
+ outcomeExecuteFailed: "실행 중 작업이 실패했습니다",
3287
+ drawerFallbackTitle: "대기 중인 작업",
3288
+ drawerSubtitle: "{{object}}에 대한 도구 {{tool}}",
3289
+ fieldProposedBy: "제안자",
3290
+ fieldDecidedBy: "결정자",
3291
+ fieldConversation: "대화",
3292
+ fieldToolInput: "도구 입력",
3293
+ fieldResult: "결과",
3294
+ fieldError: "오류",
3295
+ fieldRejectionReason: "거부 사유",
3296
+ rejectTitle: "이 작업을 거부할까요?",
3297
+ rejectBody: "사유는 AI에 전달되어 다음 응답을 조정하는 데 사용됩니다.",
3298
+ rejectPlaceholder: "사유(선택). 예: ‘레코드 ID가 잘못되었습니다 — 사용자에게 먼저 확인하세요.’",
2751
3299
  },
2752
3300
  aiModelStatus: {
2753
3301
  summary: "빌드 / 질문은 {{conversational}}({{conversationalSource}}), 구조화 출력은 {{structured}}({{structuredSource}})을(를) 사용합니다.",
@@ -2757,8 +3305,8 @@ const ko = {
2757
3305
  rowConversational: "Build / Ask 모델",
2758
3306
  rowStructured: "구조화(블루프린트 / 시드)",
2759
3307
  rowReasoning: "추론 강도",
2760
- readFailed: "유효한 AI 모델을 읽을 수 없습니다. 이 환경에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.",
2761
- readFailedWithStatus: "유효한 AI 모델을 읽을 수 없습니다(HTTP {{status}}). 이 환경에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.",
3308
+ readFailed: "유효한 AI 모델을 읽을 수 없습니다. 이 시스템에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.",
3309
+ readFailedWithStatus: "유효한 AI 모델을 읽을 수 없습니다(HTTP {{status}}). 이 시스템에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.",
2762
3310
  overridesInEffect: "적용 중인 재정의: ",
2763
3311
  noOverrides: "없음 — 배포된 코드의 기본값으로 실행 중입니다.",
2764
3312
  adapter: "어댑터: ",
@@ -2766,6 +3314,174 @@ const ko = {
2766
3314
  sourceInherits: "build/ask와 동일",
2767
3315
  sourcePinned: "{{source}}에 의해 고정됨",
2768
3316
  },
3317
+ // objectui#7254 — the AI copilot's tool cards. Three families, all of them
3318
+ // English-only until this landed while every other string on the same screen
3319
+ // was translated:
3320
+ //
3321
+ // `tool.*` — one entry per PLATFORM-PROVIDED tool name
3322
+ // (@objectstack/spec `PLATFORM_TOOLS_BY_PACKAGE`, the
3323
+ // closed registry those runtimes are conformance-tested
3324
+ // against). `humanizeToolName` looks each up as
3325
+ // `chatbot.tool.<tool_name>` and falls back to its English
3326
+ // title-caser for a custom / third-party tool, so a name
3327
+ // missing here is degraded, never broken. Every value, `en`
3328
+ // included, is a short sentence in the pack's language
3329
+ // saying what the step does (cloud#2927 Target 3, ruled
3330
+ // 「同意」; objectui#12724): never the tool id, and never
3331
+ // the title-caser's output for it, which is how the step
3332
+ // reads for a tool the pack has no entry for.
3333
+ // `toolLabels-locale-parity-7481` holds both.
3334
+ // `toolState.*` — the card-header badge + activity-chip vocabulary. ONE
3335
+ // set for both surfaces (they used to carry separate
3336
+ // tables and disagreed on casing).
3337
+ // `plan.*` — the "N objects · N views · N dashboards" strip. Plural
3338
+ // FAMILIES: one slot per CLDR category the pack's language
3339
+ // selects (objectui#11432), plus the base key for a call
3340
+ // made without a count. `all-locales-key-parity.test.ts`
3341
+ // derives the required slots from `Intl.PluralRules`.
3342
+ //
3343
+ // objectui#7481 — five `tool.*` entries are NEWER than the registry above:
3344
+ // `get_authoring_rules` (cloud#1837), `load_tools`, `open_record`, `test_flow`
3345
+ // and `toggle_flow` are registered by cloud `service-ai-studio` but the pinned
3346
+ // `@objectstack/spec` snapshot does not list them yet. They are kept here on
3347
+ // purpose: a step label the user reads must not wait on a pin bump. When the
3348
+ // pin advances, `chatbotToolLabels-locale-parity-7481` starts checking them
3349
+ // against the registry instead of against its own hand-held list.
3350
+ chatbot: {
3351
+ answer: {
3352
+ showFull: '전체 답변 보기',
3353
+ collapse: '접기',
3354
+ expandTable: '펼치기',
3355
+ exitExpandedTable: '닫기',
3356
+ },
3357
+ tool: {
3358
+ aggregate_data: "관련 데이터 집계하기",
3359
+ get_record: "이 레코드 읽기",
3360
+ query_data: "필요한 데이터 조회하기",
3361
+ query_records: "해당 레코드 찾기",
3362
+ search_knowledge: "지식 베이스에서 찾아보기",
3363
+ visualize_data: "데이터를 차트로 그리기",
3364
+ add_field: "오브젝트에 필드 추가하기",
3365
+ apply_blueprint: "설계안대로 앱 만들기",
3366
+ apply_edit: "이번 변경 적용하기",
3367
+ create_metadata: "메타데이터 새로 만들기",
3368
+ create_object: "오브젝트 새로 만들기",
3369
+ create_package: "패키지 새로 만들기",
3370
+ create_seed: "오브젝트 샘플 데이터 만들기",
3371
+ delete_field: "필드 삭제하기",
3372
+ describe_metadata: "메타데이터 내용 확인하기",
3373
+ describe_object: "오브젝트 구조 살펴보기",
3374
+ get_active_package: "현재 패키지 확인하기",
3375
+ get_authoring_rules: "작성 규칙 읽기",
3376
+ get_metadata_schema: "메타데이터 형식 살펴보기",
3377
+ get_package: "패키지 정보 확인하기",
3378
+ list_metadata: "기존 메타데이터 나열하기",
3379
+ list_objects: "기존 오브젝트 나열하기",
3380
+ list_packages: "기존 패키지 나열하기",
3381
+ load_tools: "다른 도구 불러오기",
3382
+ modify_field: "필드 수정하기",
3383
+ open_record: "이 레코드 열기",
3384
+ propose_blueprint: "앱 설계안 정리하기",
3385
+ set_active_package: "대상 패키지로 전환하기",
3386
+ suggest_builder: "AI로 만들기 제안하기",
3387
+ test_flow: "플로우 시험 실행하기",
3388
+ todo_write: "나중에 확인할 항목 적어 두기",
3389
+ toggle_flow: "플로우 켜거나 끄기",
3390
+ update_metadata: "메타데이터 업데이트하기",
3391
+ validate_expression: "표현식이 맞는지 확인하기",
3392
+ verify_build: "빌드 결과 대조하기",
3393
+ },
3394
+ toolState: {
3395
+ agentActivity: "에이전트 활동",
3396
+ pending: "대기 중",
3397
+ running: "실행 중",
3398
+ awaitingApproval: "승인 대기",
3399
+ responded: "응답함",
3400
+ completed: "완료",
3401
+ error: "오류",
3402
+ denied: "거부됨",
3403
+ failed: "실패",
3404
+ },
3405
+ phase: {
3406
+ build: "빌드",
3407
+ design: "계획 설계",
3408
+ stepCount: "{{count}}단계",
3409
+ stepCount_one: "{{count}}단계",
3410
+ stepCount_other: "{{count}}단계",
3411
+ expand: "단계 보기",
3412
+ collapse: "단계 숨기기",
3413
+ },
3414
+ plan: {
3415
+ countObjects: "오브젝트 {{count}}개",
3416
+ countObjects_one: "오브젝트 {{count}}개",
3417
+ countObjects_other: "오브젝트 {{count}}개",
3418
+ countViews: "뷰 {{count}}개",
3419
+ countViews_one: "뷰 {{count}}개",
3420
+ countViews_other: "뷰 {{count}}개",
3421
+ countDashboards: "대시보드 {{count}}개",
3422
+ countDashboards_one: "대시보드 {{count}}개",
3423
+ countDashboards_other: "대시보드 {{count}}개",
3424
+ countSeedData: "샘플 데이터",
3425
+ extendTarget: "기존 앱에 추가: {{app}}",
3426
+ awaitingConfirm: "확인 대기 중",
3427
+ objectsAndFields: "개체 및 필드",
3428
+ views: "뷰",
3429
+ suggestedField: "추가 제안",
3430
+ nameField: "이름: {{field}}",
3431
+ },
3432
+ build: {
3433
+ building: "{{app}} 빌드 중…",
3434
+ built: "{{app}} 빌드 완료",
3435
+ builtAndLive: "빌드 및 게시 완료 · {{app}}",
3436
+ appFallback: "앱",
3437
+ addingSampleData: "샘플 데이터 추가 중",
3438
+ group: {
3439
+ object: "오브젝트",
3440
+ view: "뷰",
3441
+ dashboard: "대시보드",
3442
+ app: "앱",
3443
+ seed: "샘플 데이터",
3444
+ },
3445
+ moreArtifacts: "외 {{n}}개",
3446
+ verifying: "변경 사항 확인 중…",
3447
+ verifyStep: "{{n}}단계",
3448
+ verified: "변경 사항 확인 완료",
3449
+ unknownPhase: "알 수 없는 빌드 단계",
3450
+ nextStepsLead: "다음으로 이렇게 말할 수 있습니다: {{steps}}",
3451
+ nextStepQuote: "“{{step}}”",
3452
+ draftPosture: "이후 변경 사항은 초안으로 저장되며, Studio에서 직접 게시합니다.",
3453
+ checksPassed: "검증 통과 {{passed}}/{{total}}",
3454
+ },
3455
+ changes: {
3456
+ planTitle: "변경안 · {{count}}개",
3457
+ planTitle_one: "변경안 · {{count}}개",
3458
+ planTitle_other: "변경안 · {{count}}개",
3459
+ saveDraft: "초안으로 저장",
3460
+ reviewAndPublish: "변경 사항 확인 후 게시",
3461
+ undo: "되돌리기",
3462
+ undoWithOthers: "되돌리기(다른 초안 {{count}}개 포함)",
3463
+ undoWithOthers_one: "되돌리기(다른 초안 {{count}}개 포함)",
3464
+ undoWithOthers_other: "되돌리기(다른 초안 {{count}}개 포함)",
3465
+ undoConfirm: "되돌리면 이 앱 패키지의 게시되지 않은 초안 {{total}}개가 모두 폐기되며, 그중 {{count}}개는 이번 변경이 아닙니다.",
3466
+ undoConfirm_one: "되돌리면 이 앱 패키지의 게시되지 않은 초안 {{total}}개가 모두 폐기되며, 그중 {{count}}개는 이번 변경이 아닙니다.",
3467
+ undoConfirm_other: "되돌리면 이 앱 패키지의 게시되지 않은 초안 {{total}}개가 모두 폐기되며, 그중 {{count}}개는 이번 변경이 아닙니다.",
3468
+ undoConfirmUnknown: "되돌리면 이번 변경뿐 아니라 이 앱 패키지의 게시되지 않은 초안이 모두 폐기됩니다.",
3469
+ undoConfirmAction: "모두 되돌리기",
3470
+ undoCancel: "취소",
3471
+ undoing: "되돌리는 중…",
3472
+ undone: "되돌림",
3473
+ undoFailed: "되돌리지 못했습니다",
3474
+ kind: {
3475
+ field: "필드",
3476
+ object: "오브젝트",
3477
+ view: "뷰",
3478
+ dashboard: "대시보드",
3479
+ app: "앱",
3480
+ seed: "샘플 데이터",
3481
+ package: "앱 패키지",
3482
+ },
3483
+ },
3484
+ },
2769
3485
  chatbotError: {
2770
3486
  title: "응답 실패",
2771
3487
  fallbackDetail: "문제가 발생했습니다. 다시 시도해 주세요.",
@@ -2779,10 +3495,13 @@ const ko = {
2779
3495
  buyCredits: "크레딧 팩 구매",
2780
3496
  upgradePlan: "요금제 업그레이드",
2781
3497
  },
3498
+ planTier: {
3499
+ teamAndUp: "Team 요금제 이상",
3500
+ },
2782
3501
  environment: {
2783
- addEnvironment: "환경 추가",
2784
3502
  setUpProduction: "프로덕션 환경 설정",
2785
3503
  addDevelopment: "개발 환경 추가",
3504
+ developmentLocked: "개발 환경 · {{tier}}",
2786
3505
  // Plan/capacity dialog (EnvironmentEntitlementDialog) — cloud#959.
2787
3506
  entitlement: {
2788
3507
  productionLimitTitle: "이미 프로덕션 환경이 있습니다",
@@ -2830,7 +3549,7 @@ const ko = {
2830
3549
  },
2831
3550
  unbound: {
2832
3551
  title: "연결되지 않음",
2833
- body: "이 런타임을 ObjectStack 컨트롤 플레인에 연결하면 조직의 비공개 패키지를 탐색하고 여기에 설치할 수 있습니다. 승인은 클라우드 계정에서 한 번만 클릭하면 되며, 이 페이지에 ID나 자격 증명을 입력할 필요가 없습니다.",
3552
+ body: "이 런타임은 컨트롤 플레인에 연결되어 있지 않습니다. '연결'을 누르면 새 창에서 클라우드 계정이 열리고, 한 번의 클릭으로 연결을 승인할 수 있습니다. 이 페이지에 ID나 자격 증명을 입력할 필요가 없습니다.",
2834
3553
  connect: "연결",
2835
3554
  },
2836
3555
  },
@@ -2843,10 +3562,17 @@ const ko = {
2843
3562
  dismiss: "닫기",
2844
3563
  confirmedToast: "\"{{set}}\"이(가) 이제 {{anchor}}에 부여되었습니다.",
2845
3564
  dismissedToast: "\"{{set}}\" 제안을 닫았습니다.",
3565
+ guestUnsupported: "여기서는 부여할 수 없습니다. Guest 위치의 세트는 승인된 제안에서 파생되지 않습니다.",
3566
+ acceptedState: "\"{{set}}\"이(가) 로그인한 모든 사용자(Everyone 위치)에 대해 승인되었습니다.",
3567
+ notInForceState: "\"{{set}}\"이(가) 승인되었지만 아직 적용되지 않았습니다. 이 요청으로 Everyone 위치가 변경되지 않았습니다. 이유는 서버 로그에 기록되어 있습니다.",
3568
+ dismissedState: "\"{{set}}\"은(는) 부여되지 않았습니다. 제안이 닫혔거나 취소되었습니다.",
3569
+ revoke: "취소",
3570
+ revoking: "취소하는 중…",
3571
+ revokedToast: "\"{{set}}\" 승인을 취소했습니다.",
2846
3572
  },
2847
3573
  title: "앱 마켓플레이스",
2848
3574
  subtitle: "ObjectStack 카탈로그에 게시된 승인된 앱을 탐색하세요. 앱을 클릭하여 세부 정보를 보고 환경 중 하나에 설치하세요.",
2849
- searchPlaceholder: "이름 또는 매니페스트 ID로 앱 검색…",
3575
+ searchPlaceholder: '이름 또는 앱 ID로 앱 검색…',
2850
3576
  searchAria: "마켓플레이스 앱 검색",
2851
3577
  installed: "설치됨",
2852
3578
  installedCount: "설치됨 ({{count}})",
@@ -2856,21 +3582,26 @@ const ko = {
2856
3582
  noMatchFilters: "필터와 일치하는 앱이 없습니다.",
2857
3583
  noDescription: "사용 가능한 설명이 없습니다.",
2858
3584
  back: "마켓플레이스로 돌아가기",
2859
- installedTitle: "설치된 앱",
2860
- installedSubtitle: "이 런타임의 커널에 현재 설치된 마켓플레이스 패키지.",
2861
- installedEmpty: "아직 이 런타임에 마켓플레이스 앱이 설치되지 않았습니다.",
2862
3585
  browseLink: "마켓플레이스 탐색 →",
2863
- installedAdditiveNote: "<strong>참고:</strong> 커널 API는 추가 전용입니다 — 제거하면 디스크에서 매니페스트가 삭제되어 다음 시작 시 패키지가 로드되지 않지만, 실행 중인 커널은 재시작될 때까지 앱을 등록된 상태로 유지합니다.",
2864
- installedAt: "{{when}} 설치됨",
2865
- installedBy: "{{user}}에 의해",
2866
- installedPackageId: "패키지",
2867
- cachedAs: "<code>{{path}}</code>로 캐시됨",
3586
+ installedAdditiveNote: "제거하면 앱이 실행 중인 커널에서 즉시 제거되며, 앱의 권한 세트와 그 부여 내역도 함께 제거됩니다. 캐시된 매니페스트도 삭제되므로 다음 시작 시 패키지가 로드되지 않습니다. 앱의 객체에 저장된 레코드는 데이터베이스에 남습니다.",
2868
3587
  versionBadge: "v{{version}}",
2869
3588
  installedBadge: "v{{version}} 설치됨",
3589
+ // objectui#11645 — an install-local entry this runtime refused to load at
3590
+ // startup (the listing's `notLoaded` marker), read on Installed Apps.
3591
+ notLoaded: {
3592
+ badge: "로드되지 않음",
3593
+ protocolIncompatible: "이 런타임은 이 패키지를 로드하지 않았습니다. 이 패키지는 프로토콜 {{requiredRange}}을(를) 대상으로 하지만 이 런타임은 해당 프로토콜을 지원하지 않습니다.",
3594
+ otherReason: "이 런타임은 이 패키지를 로드하지 않았습니다({{code}}).",
3595
+ },
2870
3596
  load: {
2871
3597
  failed: "마켓플레이스를 로드할 수 없습니다",
2872
3598
  failedHintConfigured: "이 런타임은 {{url}} 의 컨트롤 플레인을 통해 마켓플레이스에 접속합니다. 해당 주소가 온라인이고 여기에서 접근 가능한지 확인하세요.",
2873
- failedHintSameOrigin: "이 런타임이 마켓플레이스 카탈로그를 직접 제공합니다. 런타임이 온라인인지 확인하세요.",
3599
+ failedHintSameOrigin: "마켓플레이스 카탈로그는 이 런타임을 통해 접근합니다. 런타임이 온라인이고 카탈로그에 접근할 수 있는지 확인하세요.",
3600
+ loading: "마켓플레이스 카탈로그를 불러오는 중…",
3601
+ slow: "아직 불러오는 중입니다 — 마켓플레이스 카탈로그의 응답이 느립니다.",
3602
+ retry: "다시 시도",
3603
+ unreachable: "마켓플레이스 카탈로그에 연결할 수 없습니다.",
3604
+ answeredError: "마켓플레이스 카탈로그가 오류로 응답했습니다(HTTP {{status}}).",
2874
3605
  packageFailed: "패키지를 로드할 수 없습니다",
2875
3606
  notFound: "찾을 수 없습니다.",
2876
3607
  },
@@ -2894,10 +3625,15 @@ const ko = {
2894
3625
  purgeSampleData: '샘플 데이터 삭제',
2895
3626
  purgeConfirm: '이 패키지가 생성한 모든 샘플 레코드를 삭제하시겠습니까? 사용자가 추가한 레코드는 삭제되지 않습니다.',
2896
3627
  purgeSuccess: '샘플 레코드 {{count}}개를 삭제했습니다.',
3628
+ purgeSuccess_one: '샘플 레코드 {{count}}개를 삭제했습니다.',
3629
+ purgeSuccess_other: '샘플 레코드 {{count}}개를 삭제했습니다.',
2897
3630
  purgeNoData: '삭제할 샘플 레코드가 없습니다.',
2898
3631
  reseedQueued: '샘플 데이터는 다음 환경 접속 시 다시 적재됩니다.',
2899
3632
  reseedLocalSuccess: '샘플 데이터를 다시 적재했습니다: {{inserted}}개 추가, {{updated}}개 업데이트.',
2900
3633
  reseedPartialErrors: '({{count}}개 레코드 쓰기 실패)',
3634
+ reseedPartialErrors_one: '({{count}}개 레코드 쓰기 실패)',
3635
+ reseedPartialErrors_other: '({{count}}개 레코드 쓰기 실패)',
3636
+ sampleDataKernelUnavailable: '이 컨트롤 플레인에는 환경 커널이 없어 여기서는 샘플 데이터를 다시 적재하거나 삭제할 수 없습니다. 해당 환경 자체의 런타임에서 실행하세요.',
2901
3637
  updateAvailable: '업데이트 가능',
2902
3638
  },
2903
3639
  action: {
@@ -2907,6 +3643,7 @@ const ko = {
2907
3643
  working: "처리 중…",
2908
3644
  installToCloud: "클라우드에 설치…",
2909
3645
  installing: "설치 중…",
3646
+ updating: "업데이트 중…",
2910
3647
  uninstall: "제거",
2911
3648
  uninstalling: "제거 중…",
2912
3649
  details: "세부 정보",
@@ -2924,15 +3661,45 @@ const ko = {
2924
3661
  environmentPlaceholder: "환경 선택",
2925
3662
  includeSampleData: "샘플 데이터 포함",
2926
3663
  noEnvs: "활성 조직에서 환경을 찾을 수 없습니다.",
2927
- noPermission: "환경에 앱을 설치할 권한이 없습니다. 조직 소유자 및 관리자만 설치할 수 있습니다.",
3664
+ noPermission: "환경에 앱을 설치할 권한이 없습니다. 조직 소유자 및 관리자만 설치할 수 있습니다 — 조직 관리자에게 문의하세요.",
2928
3665
  signInFirst: "먼저 ObjectStack Cloud에 로그인해야 합니다.",
2929
3666
  success: "설치 성공. 환경을 열어 새 앱을 확인하세요.",
2930
3667
  localSuccess: "이 런타임에 v{{version}} 설치됨. \"{{name}}\"이(가) 이제 앱 전환기에 표시됩니다.",
3668
+ localLoadsAtRestart: "이 런타임에 v{{version}} 설치됨. \"{{name}}\"은(는) 런타임이 다음에 다시 시작될 때 로드되며, 그때까지는 앱 전환기에 표시되지 않습니다.",
2931
3669
  localManifestConflict: "{{message}}\n참고: 로컬 앱이 이미 이 manifest_id를 가지고 있습니다. 먼저 objectstack.config.ts에서 제거하세요.",
2932
3670
  localUnauthorized: "먼저 이 런타임에 로그인하세요.",
2933
3671
  localMarketplaceUnavailable: "이 런타임에 OS_CLOUD_URL이 구성되지 않았습니다.",
2934
3672
  updateTo: "업데이트 → v{{version}}",
2935
3673
  installedVersion: "v{{version}} 설치됨",
3674
+ deploying: "앱을 배포하는 중…",
3675
+ deployed: "앱이 배포되어 사용할 준비가 되었습니다.",
3676
+ openApp: "{{name}} 열기",
3677
+ deployTimeout: "설치는 기록되었지만 이 환경에서 아직 앱을 제공하지 않습니다. 아직 배포 중일 수 있으니 잠시 후 다시 확인하세요. 계속 나타나지 않으면 패키지가 로드되지 않았거나, 앱이 포함되어 있지 않거나, 앱에 사용자에게 없는 권한이 필요할 수 있습니다.",
3678
+ checkAgain: "다시 확인",
3679
+ // ADR-0131 D6 — the install modes a package's manifest permits, and
3680
+ // what an unmanaged install answers (MarketplacePackagePage).
3681
+ mode: {
3682
+ label: "설치 방식",
3683
+ managed: "관리형",
3684
+ managedHint: "패키지가 계속 원본으로 남습니다. 코드로 등록되고 업그레이드를 받으며, 항목은 여기에서 편집하지 않습니다.",
3685
+ unmanaged: "비관리형 사본",
3686
+ unmanagedHint: "이 런타임의 자체 메타데이터로 한 번 복사됩니다. 모든 항목을 여기에서 편집할 수 있으며, 사본은 업그레이드를 받지 않습니다.",
3687
+ required: "이 패키지를 설치하려면 설치 방식을 선택하세요.",
3688
+ },
3689
+ unmanagedSuccess: "\"{{name}}\" v{{version}}을(를) 이 런타임의 자체 메타데이터로 베이스 {{base}}에 복사했습니다. 사본은 편집할 수 있으며 업그레이드를 받지 않습니다.",
3690
+ unmanagedStrippedLocks: "패키지가 이 항목들을 잠갔습니다. 사본은 편집할 수 있으므로 잠금은 복사되지 않았습니다:",
3691
+ unmanagedIgnored: "이 런타임은 비관리형 설치를 지원하지 않으므로 \"{{name}}\"이(가) 복사되지 않고 관리형(코드로 등록)으로 설치되었습니다. 런타임을 업그레이드한 다음 패키지를 제거하고 비관리형 사본으로 다시 설치하세요.",
3692
+ },
3693
+ // objectui#12146 — the install dialog opened as an UPDATE of the copy
3694
+ // this environment holds (MarketplacePackagePage).
3695
+ update: {
3696
+ dialogTitle: "{{name}} 업데이트",
3697
+ dialogDescCurrent: "이 환경({{host}})에 설치된 앱을 업데이트합니다.",
3698
+ dialogDescPicker: "설치된 앱을 업데이트할 환경을 선택하세요. ObjectStack Cloud에 로그인되어 있어야 합니다.",
3699
+ majorNotice: "메이저 버전 업데이트입니다(v{{fromMajor}} → v{{toMajor}}). 호환되지 않는 변경이 포함될 수 있습니다.",
3700
+ releaseNotes: "v{{version}} 릴리스 노트 읽기",
3701
+ success: "v{{version}}(으)로 업데이트했습니다.",
3702
+ deployTimeout: "업데이트는 기록되었지만 이 환경에서 아직 v{{version}}을(를) 제공하지 않습니다. 아직 배포 중일 수 있으니 잠시 후 다시 확인하세요.",
2936
3703
  },
2937
3704
  // objectui#3546 — the MarketplacePage "Your organization" strip.
2938
3705
  org: {
@@ -2950,7 +3717,8 @@ const ko = {
2950
3717
  reviewed: "검토 및 승인됨",
2951
3718
  unreviewed: "아직 검토되지 않음",
2952
3719
  signed: "서명됨",
2953
- grantsIntro: "설치하면 이 패키지에 다음 권한이 부여됩니다:",
3720
+ grantsIntro: "이 패키지가 요청하는 권한:",
3721
+ notEnforced: "이 목록은 설치 시 기록되며 이후 버전이 더 많은 권한을 요청하면 다시 확인합니다. 다만 런타임은 아직 패키지를 이 목록으로 제한하지 않습니다.",
2954
3722
  services: "플랫폼 서비스",
2955
3723
  hooks: "라이프사이클 후크",
2956
3724
  network: "네트워크 액세스",
@@ -2964,9 +3732,11 @@ const ko = {
2964
3732
  },
2965
3733
  },
2966
3734
  uninstall: {
2967
- confirm: "이 런타임에서 {{manifestId}} v{{version}}을(를) 제거하시겠습니까?\n\n캐시된 매니페스트가 삭제됩니다.",
2968
- successInList: "{{manifestId}} 제거됨. 완전히 언로드하려면 런타임을 재시작하세요.",
2969
- successInDetail: "{{manifestId}}의 캐시된 매니페스트 제거됨.",
3735
+ confirm: "이 런타임에서 {{manifestId}} v{{version}}을(를) 제거하시겠습니까?\n\n앱이 실행 중인 커널에서 즉시 제거되며, 앱의 권한 세트와 그 부여 내역도 함께 제거됩니다. 캐시된 매니페스트도 삭제됩니다. 앱의 객체에 저장된 레코드는 데이터베이스에 남습니다.",
3736
+ successInList: "{{manifestId}} 제거됨. 앱이 실행 중인 커널에서 제거되었으며, 권한 세트와 그 부여 내역도 함께 제거되었습니다. 앱의 객체에 저장된 레코드는 데이터베이스에 남습니다.",
3737
+ successInDetail: "{{manifestId}} 및 캐시된 매니페스트 제거됨. 앱이 실행 중인 커널에서 제거되었으며, 권한 세트와 그 부여 내역도 함께 제거되었습니다. 앱의 객체에 저장된 레코드는 데이터베이스에 남습니다.",
3738
+ confirmNotLoaded: "이 런타임에서 {{manifestId}} v{{version}}을(를) 제거하시겠습니까?\n\n캐시된 매니페스트가 삭제됩니다. 이 런타임은 이 패키지를 로드하지 않았으므로 실행 중인 부분이 없습니다.",
3739
+ successNotLoaded: "{{manifestId}} 제거됨. 로드되지 않았으므로 재시작할 필요가 없습니다.",
2970
3740
  },
2971
3741
  accessDenied: {
2972
3742
  title: "관리자 전용 앱 마켓플레이스",
@@ -2989,32 +3759,21 @@ const ko = {
2989
3759
  storage: "스토리지",
2990
3760
  other: "기타",
2991
3761
  },
2992
- pricing: {
2993
- free: "무료",
2994
- freemium: "프리미엄",
2995
- paid: "유료",
2996
- subscription: "구독",
2997
- "usage-based": "사용량 기반",
2998
- "contact-sales": "영업팀 문의",
2999
- },
3000
3762
  relativeTime: {
3001
3763
  today: "오늘",
3002
3764
  daysAgo: "{{count}}일 전",
3003
3765
  monthsAgo: "{{count}}개월 전",
3766
+ monthsAgo_one: "{{count}}개월 전",
3767
+ monthsAgo_other: "{{count}}개월 전",
3004
3768
  yearsAgo: "{{count}}년 전",
3769
+ yearsAgo_one: "{{count}}년 전",
3770
+ yearsAgo_other: "{{count}}년 전",
3005
3771
  },
3006
3772
  },
3007
- approvals: {
3008
- approve: '승인',
3009
- reject: '반려',
3010
- comment: '의견(선택 사항)',
3011
- approveSuccess: '승인됨',
3012
- rejectSuccess: '반려됨',
3013
- rejectConfirm: '이 승인 요청을 반려하시겠습니까?',
3014
- },
3015
3773
  approvalsInbox: {
3774
+ recordUnresolvable: '이 레코드를 열 수 없습니다',
3016
3775
  loadMore: '더 보기',
3017
- loadingMore: '불러오는 중…',
3776
+ loadingMore: '로딩 중…',
3018
3777
  loadedOf: '{{total}}개 중 {{loaded}}개 로드됨',
3019
3778
  actEscalate: 'SLA 에스컬레이션',
3020
3779
  systemSlaActor: '시스템(SLA)',
@@ -3031,6 +3790,8 @@ const ko = {
3031
3790
  requestInfoSent: '추가 정보 요청을 보냈습니다',
3032
3791
  remindBtn: '독촉',
3033
3792
  remindSuccess: '승인자 {{count}}명에게 알렸습니다',
3793
+ remindSuccess_one: '승인자 {{count}}명에게 알렸습니다',
3794
+ remindSuccess_other: '승인자 {{count}}명에게 알렸습니다',
3034
3795
  remindThrottled: '최근에 이미 독촉했습니다. 잠시 후 다시 시도하세요.',
3035
3796
  replyPlaceholder: '이 요청에 답하기…',
3036
3797
  slaRemaining: 'SLA {{dur}} 남음',
@@ -3047,8 +3808,11 @@ const ko = {
3047
3808
  progressApprovals: '승인 — {{got}} / {{need}}',
3048
3809
  progressGroups: '그룹 승인 — {{got}} / {{need}} 그룹',
3049
3810
  progressEligible: '승인 가능자 {{count}}명',
3811
+ progressEligible_one: '승인 가능자 {{count}}명',
3812
+ progressEligible_other: '승인 가능자 {{count}}명',
3050
3813
  progressBar: '결정 진행 상황',
3051
3814
  declaredActions: '작업',
3815
+ decisionPanelOffRequestPage: '승인 결정 패널은 승인 요청 페이지에서만 작동합니다.',
3052
3816
  attachmentChip: '첨부 파일',
3053
3817
  attachmentOpenFailed: '첨부 파일을 열 수 없습니다. 다시 시도해 주세요',
3054
3818
  approveOneTitle: '"{{title}}"을(를) 승인할까요?',
@@ -3078,6 +3842,8 @@ const ko = {
3078
3842
  filterCount: '{{total}}개 중 {{shown}}개',
3079
3843
  selected: '선택됨',
3080
3844
  actionableCount: '({{count}}개 처리 가능)',
3845
+ actionableCount_one: '({{count}}개 처리 가능)',
3846
+ actionableCount_other: '({{count}}개 처리 가능)',
3081
3847
  selectAll: '전체 선택',
3082
3848
  selectRow: '이 요청 선택',
3083
3849
  colRequest: '승인 항목',
@@ -3112,6 +3878,9 @@ const ko = {
3112
3878
  emptyPending: '모두 처리했습니다. 승인 대기 항목이 없습니다.',
3113
3879
  emptyOther: '아직 아무것도 없습니다.',
3114
3880
  emptyViewAll: '전체 요청 보기',
3881
+ waitingOnOthers: "{{count}}건의 요청이 다른 승인자를 기다리고 있습니다",
3882
+ waitingOnOthers_one: "{{count}}건의 요청이 다른 승인자를 기다리고 있습니다",
3883
+ waitingOnOthers_other: "{{count}}건의 요청이 다른 승인자를 기다리고 있습니다",
3115
3884
  noMatches: '현재 필터와 일치하는 항목이 없습니다.',
3116
3885
  keyboardHint: '단축키: j/k 이동 · Enter 열기 · x 선택 · a 승인 · r 거부',
3117
3886
  drawerTitle: '승인 요청',
@@ -3129,12 +3898,12 @@ const ko = {
3129
3898
  overrideActionLabel: '{{action}}(관리자 권한)',
3130
3899
  overrideNotice: '이 단계의 승인자 자리가 없습니다. 계속하면 관리자 재정의가 사용되어 단계가 즉시 확정되고, 아직 처리하지 않은 승인자는 모두 건너뜁니다. 이 결정은 관리자 재정의로 기록됩니다.',
3131
3900
  overrideNoticeWho: '이 단계의 승인자 자리가 없습니다. 계속하면 관리자 재정의가 사용되어 단계가 즉시 확정되고, 아직 처리하지 않은 승인자 — {{who}} — 를 건너뜁니다. 이 결정은 관리자 재정의로 기록됩니다.',
3901
+ overrideReassignNotice: '이 단계의 승인자 자리가 없습니다. 계속하면 관리자 재정의가 사용되어 단계가 선택한 새 승인자에게 재할당되고, 아직 처리하지 않은 승인자는 모두 교체됩니다. 요청은 대기 상태로 유지되며 새 승인자의 처리를 기다립니다. 이 재할당은 관리자 재정의로 기록됩니다.',
3902
+ overrideReassignNoticeWho: '이 단계의 승인자 자리가 없습니다. 계속하면 관리자 재정의가 사용되어 단계가 선택한 새 승인자에게 재할당되고, 아직 처리하지 않은 승인자 — {{who}} — 는 교체됩니다. 요청은 대기 상태로 유지되며 새 승인자의 처리를 기다립니다. 이 재할당은 관리자 재정의로 기록됩니다.',
3903
+ overrideRecallNotice: '내가 제출한 요청이 아닙니다. 계속하면 관리자 재정의가 사용되어 요청이 회수되고, 아직 처리하지 않은 승인자는 모두 더 이상 처리할 수 없으며, 레코드 잠금이 해제됩니다.',
3904
+ overrideRecallNoticeWho: '내가 제출한 요청이 아닙니다. 계속하면 관리자 재정의가 사용되어 요청이 회수되고 레코드 잠금이 해제되며, 아직 처리하지 않은 승인자 — {{who}} — 는 더 이상 처리할 수 없습니다.',
3132
3905
  viaOverrideChip: '관리자 재정의',
3133
3906
  viaOverrideHint: '실행자는 이 단계의 승인자 자리가 없으며 관리자 재정의 경로로 처리했습니다.',
3134
- rawData: '원본 데이터(JSON)',
3135
- copy: '복사',
3136
- copied: '복사됨',
3137
- copyFailed: '복사 실패',
3138
3907
  overrideActor: '다른 ID로 작업(관리자)',
3139
3908
  actor: '작업 ID',
3140
3909
  auto: '자동',
@@ -3151,11 +3920,19 @@ const ko = {
3151
3920
  approveN: '{{count}}개 승인',
3152
3921
  rejectN: '{{count}}개 거부',
3153
3922
  bulkApproveTitle: '{{count}}개 요청을 승인할까요?',
3923
+ bulkApproveTitle_one: '{{count}}개 요청을 승인할까요?',
3924
+ bulkApproveTitle_other: '{{count}}개 요청을 승인할까요?',
3154
3925
  bulkApproveBody: '각 요청은 내 ID로 승인되며 해당 플로우는 승인 분기로 진행됩니다.',
3155
3926
  bulkRejectTitle: '{{count}}개 요청을 거부할까요?',
3927
+ bulkRejectTitle_one: '{{count}}개 요청을 거부할까요?',
3928
+ bulkRejectTitle_other: '{{count}}개 요청을 거부할까요?',
3156
3929
  bulkRejectBody: '선택한 요청을 거부하고 신청자에게 알립니다.',
3157
3930
  bulkApproved: '{{count}}개 요청을 승인했습니다',
3931
+ bulkApproved_one: '{{count}}개 요청을 승인했습니다',
3932
+ bulkApproved_other: '{{count}}개 요청을 승인했습니다',
3158
3933
  bulkRejected: '{{count}}개 요청을 거부했습니다',
3934
+ bulkRejected_one: '{{count}}개 요청을 거부했습니다',
3935
+ bulkRejected_other: '{{count}}개 요청을 거부했습니다',
3159
3936
  bulkPartial: '{{ok}}개 성공, {{fail}}개 실패: {{which}}',
3160
3937
  rejectOneTitle: '"{{title}}"을(를) 거부할까요?',
3161
3938
  rejectOneBody: '요청을 거부하고 신청자에게 알립니다.',
@@ -3180,8 +3957,14 @@ const ko = {
3180
3957
  alreadyDecided: '이미 처리된 요청입니다. 목록을 새로고침하세요.',
3181
3958
  justNow: '방금 전',
3182
3959
  minutesAgo: '{{count}}분 전',
3960
+ minutesAgo_one: '{{count}}분 전',
3961
+ minutesAgo_other: '{{count}}분 전',
3183
3962
  hoursAgo: '{{count}}시간 전',
3963
+ hoursAgo_one: '{{count}}시간 전',
3964
+ hoursAgo_other: '{{count}}시간 전',
3184
3965
  daysAgo: '{{count}}일 전',
3966
+ daysAgo_one: '{{count}}일 전',
3967
+ daysAgo_other: '{{count}}일 전',
3185
3968
  },
3186
3969
  preview: {
3187
3970
  empty: {
@@ -3202,6 +3985,9 @@ const ko = {
3202
3985
  publishing: '게시 중…',
3203
3986
  exit: '미리보기 종료',
3204
3987
  changes: '변경 사항',
3988
+ pendingHere: '초안 미리보기 · 이 페이지의 게시되지 않은 변경 {{count}}개',
3989
+ pendingHere_one: '초안 미리보기 · 이 페이지의 게시되지 않은 변경 {{count}}개',
3990
+ pendingHere_other: '초안 미리보기 · 이 페이지의 게시되지 않은 변경 {{count}}개',
3205
3991
  },
3206
3992
  changes: {
3207
3993
  title: '대기 중인 변경 사항',
@@ -3216,11 +4002,65 @@ const ko = {
3216
4002
  detailNone: '차이가 감지되지 않았습니다 — 초안이 게시된 버전과 일치합니다.',
3217
4003
  detailChangedKeys: '기타 변경:',
3218
4004
  confirmNote: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
4005
+ confirmNote_one: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
4006
+ confirmNote_other: '게시하면 이 패키지의 대기 중인 초안 {{count}}개가 한 번에(원자적으로) 게시됩니다.',
4007
+ // objectui#11591 — the package-less sheet: no package to batch, so each
4008
+ // draft publishes by itself and one that fails stays pending.
4009
+ confirmNoteSeparate: '게시하면 대기 중인 초안 {{count}}개가 하나씩 따로 게시됩니다. 게시에 실패한 초안은 대기 상태로 남고, 나머지는 그대로 게시됩니다.',
4010
+ confirmNoteSeparate_one: '게시하면 대기 중인 초안 {{count}}개가 하나씩 따로 게시됩니다. 게시에 실패한 초안은 대기 상태로 남고, 나머지는 그대로 게시됩니다.',
4011
+ confirmNoteSeparate_other: '게시하면 대기 중인 초안 {{count}}개가 하나씩 따로 게시됩니다. 게시에 실패한 초안은 대기 상태로 남고, 나머지는 그대로 게시됩니다.',
3219
4012
  publishConfirm: '모두 게시',
3220
- // [objectui#5418] Pre-publish security-posture findings, shown next to
4013
+ summaryItems: '{{count}}개 항목',
4014
+ summaryItems_one: '{{count}}개 항목',
4015
+ summaryItems_other: '{{count}}개 항목',
4016
+ summaryType: '{{type}} {{n}}',
4017
+ typeCount: {
4018
+ object: '객체 {{count}}',
4019
+ object_one: '객체 {{count}}',
4020
+ object_other: '객체 {{count}}',
4021
+ view: '뷰 {{count}}',
4022
+ view_one: '뷰 {{count}}',
4023
+ view_other: '뷰 {{count}}',
4024
+ page: '페이지 {{count}}',
4025
+ page_one: '페이지 {{count}}',
4026
+ page_other: '페이지 {{count}}',
4027
+ dashboard: '대시보드 {{count}}',
4028
+ dashboard_one: '대시보드 {{count}}',
4029
+ dashboard_other: '대시보드 {{count}}',
4030
+ app: '앱 {{count}}',
4031
+ app_one: '앱 {{count}}',
4032
+ app_other: '앱 {{count}}',
4033
+ action: '작업 {{count}}',
4034
+ action_one: '작업 {{count}}',
4035
+ action_other: '작업 {{count}}',
4036
+ report: '보고서 {{count}}',
4037
+ report_one: '보고서 {{count}}',
4038
+ report_other: '보고서 {{count}}',
4039
+ flow: '플로우 {{count}}',
4040
+ flow_one: '플로우 {{count}}',
4041
+ flow_other: '플로우 {{count}}',
4042
+ permission: '권한 세트 {{count}}',
4043
+ permission_one: '권한 세트 {{count}}',
4044
+ permission_other: '권한 세트 {{count}}',
4045
+ agent: '에이전트 {{count}}',
4046
+ agent_one: '에이전트 {{count}}',
4047
+ agent_other: '에이전트 {{count}}',
4048
+ email_template: '이메일 템플릿 {{count}}',
4049
+ email_template_one: '이메일 템플릿 {{count}}',
4050
+ email_template_other: '이메일 템플릿 {{count}}',
4051
+ },
4052
+ // objectui#12929 — the unchecked choice under an added object field whose
4053
+ // literal default the batch publish can write into the existing records.
4054
+ backfillOption: '기본값 채우기(기존 레코드 {{count}}개)',
4055
+ backfillOption_one: '기본값 채우기(기존 레코드 {{count}}개)',
4056
+ backfillOption_other: '기본값 채우기(기존 레코드 {{count}}개)',
4057
+ backfillOptionNoCount: '기본값 채우기',
4058
+ // [`7a90afdf9`] Pre-publish security-posture findings, shown next to
3221
4059
  // the confirm button so a refusal the door would issue is read BEFORE
3222
4060
  // the click rather than as a toast after the batch rolled back.
3223
4061
  securityBlockTitle: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
4062
+ securityBlockTitle_one: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
4063
+ securityBlockTitle_other: '게시가 거부됩니다 — {{count}}개 항목에 먼저 결정이 필요합니다',
3224
4064
  securityBlockWhere: '객체의 설정 → 레코드 공유에서 수정한 후 다시 게시하세요.',
3225
4065
  },
3226
4066
  // ADR-0045 — the materialized-but-unlisted app banner
@@ -3245,7 +4085,7 @@ const ko = {
3245
4085
  revertLabel: '변경을 되돌렸습니다',
3246
4086
  applyLabel: '빌드 변경',
3247
4087
  revert: '되돌림',
3248
- items: '항목',
4088
+ items: '{{count}} 항목',
3249
4089
  revertAction: '되돌리기',
3250
4090
  reverted: '되돌렸습니다 — 변경이 취소되었습니다.',
3251
4091
  revertFailed: '되돌리기 실패',
@@ -3274,28 +4114,32 @@ const ko = {
3274
4114
  rangeEnd: "끝",
3275
4115
  operators: {
3276
4116
  equals: "같음",
3277
- notEquals: "같지 않음",
4117
+ not_equals: "같지 않음",
3278
4118
  contains: "포함",
3279
- containsCaseInsensitive: "포함 (대소문자 무시)",
3280
- notContains: "포함하지 않음",
3281
- isEmpty: "비어 있음",
3282
- isNotEmpty: "비어 있지 않음",
3283
- greaterThan: "보다 큼",
3284
- lessThan: "보다 작음",
3285
- greaterOrEqual: "크거나 같음",
3286
- lessOrEqual: "작거나 같음",
4119
+ icontains: "포함 (대소문자 무시)",
4120
+ not_contains: "포함하지 않음",
4121
+ is_empty: "비어 있음",
4122
+ is_not_empty: "비어 있지 않음",
4123
+ greater_than: "보다 큼",
4124
+ less_than: "보다 작음",
4125
+ greater_than_or_equal: "크거나 같음",
4126
+ less_than_or_equal: "작거나 같음",
3287
4127
  before: "이전",
3288
4128
  after: "이후",
3289
4129
  between: "사이",
3290
4130
  in: "포함됨",
3291
- notIn: "포함되지 않음",
3292
- startsWith: "다음으로 시작",
3293
- endsWith: "다음으로 끝남",
3294
- isNull: "null임",
3295
- isNotNull: "null이 아님",
4131
+ not_in: "포함되지 않음",
4132
+ starts_with: "다음으로 시작",
4133
+ ends_with: "다음으로 끝남",
4134
+ is_null: "null임",
4135
+ is_not_null: "null이 아님",
3296
4136
  exists: "설정됨",
3297
4137
  notExists: "설정되지 않음",
3298
4138
  },
4139
+ emptyCheckHint: {
4140
+ text: '"{{isEmpty}}"은(는) 빈 텍스트도 포함합니다. "{{isNull}}"은(는) 값이 없는 경우만 포함합니다.',
4141
+ list: '"{{isEmpty}}"은(는) 빈 목록도 포함합니다. "{{isNull}}"은(는) 값이 없는 경우만 포함합니다.',
4142
+ },
3299
4143
  },
3300
4144
  sortBuilder: {
3301
4145
  sortBy: "정렬 기준",
@@ -3308,7 +4152,8 @@ const ko = {
3308
4152
  },
3309
4153
  collaboration: {
3310
4154
  commentCount: "댓글 {{count}}개",
3311
- commentCountOne: "댓글 {{count}}개",
4155
+ commentCount_one: "댓글 {{count}}개",
4156
+ commentCount_other: "댓글 {{count}}개",
3312
4157
  resolvedSuffix: " · 해결됨",
3313
4158
  sortComments: "댓글 정렬",
3314
4159
  sortOldest: "오래된 순",
@@ -3317,11 +4162,18 @@ const ko = {
3317
4162
  reopen: "다시 열기",
3318
4163
  justNow: "방금",
3319
4164
  minutesAgo: "{{count}}분 전",
4165
+ minutesAgo_one: "{{count}}분 전",
4166
+ minutesAgo_other: "{{count}}분 전",
3320
4167
  hoursAgo: "{{count}}시간 전",
4168
+ hoursAgo_one: "{{count}}시간 전",
4169
+ hoursAgo_other: "{{count}}시간 전",
3321
4170
  daysAgo: "{{count}}일 전",
4171
+ daysAgo_one: "{{count}}일 전",
4172
+ daysAgo_other: "{{count}}일 전",
3322
4173
  edited: "(수정됨)",
3323
4174
  reactionCount: "반응 {{count}}개",
3324
- reactionCountOne: "반응 {{count}}개",
4175
+ reactionCount_one: "반응 {{count}}개",
4176
+ reactionCount_other: "반응 {{count}}개",
3325
4177
  addThumbsUp: "좋아요 추가",
3326
4178
  reply: "답글",
3327
4179
  reactThumbsUp: "좋아요로 반응",
@@ -3332,9 +4184,11 @@ const ko = {
3332
4184
  commentPlaceholder: "댓글 추가…(@로 멘션)",
3333
4185
  send: "보내기",
3334
4186
  presentUserCount: "{{count}}명 접속 중",
3335
- presentUserCountOne: "{{count}}명 접속 중",
4187
+ presentUserCount_one: "{{count}}명 접속 중",
4188
+ presentUserCount_other: "{{count}}명 접속 중",
3336
4189
  moreUserCount: "외 {{count}}명",
3337
- moreUserCountOne: "외 {{count}}명",
4190
+ moreUserCount_one: "외 {{count}}명",
4191
+ moreUserCount_other: "외 {{count}}명",
3338
4192
  userStatusTitle: "{{name}}({{status}})",
3339
4193
  statusActive: "활성",
3340
4194
  statusIdle: "유휴",
@@ -3342,6 +4196,11 @@ const ko = {
3342
4196
  },
3343
4197
  wizard: {
3344
4198
  missingRequired: "필수 항목을 입력하세요: {{fields}}",
4199
+ back: "뒤로",
4200
+ submitting: "제출 중…",
4201
+ stepFallback: "{{n}}단계",
4202
+ progressLabel: "진행 상황",
4203
+ emptyStep: "이 단계에 구성된 필드가 없습니다",
3345
4204
  },
3346
4205
  flowRunner: {
3347
4206
  title: '입력',
@@ -3391,6 +4250,8 @@ const ko = {
3391
4250
  setDefaultFailed: "기본 앱 설정 실패: {{reason}}",
3392
4251
  appDeleted: "{{name}}을(를) 삭제했습니다",
3393
4252
  deleteFailed: "앱 삭제 실패: {{reason}}",
4253
+ nothingToDelete: "{{name}}에 삭제할 항목이 없습니다: {{reason}}",
4254
+ alreadyAtDefault: "이미 패키지 기본 상태입니다",
3394
4255
  bulkEnabled: "앱 {{n}}개를 활성화했습니다",
3395
4256
  bulkDisabled: "앱 {{n}}개를 비활성화했습니다",
3396
4257
  bulkFailed: "{{n}}개 실패: {{details}}",
@@ -3399,5 +4260,130 @@ const ko = {
3399
4260
  bulkOperationFailed: "일괄 작업 실패: {{reason}}",
3400
4261
  },
3401
4262
  },
4263
+ // objectui#6301 — 설정 › 패키지 자동화 (ADR-0126 §7.4). 용어는 기존 번역을
4264
+ // 따릅니다: `common.package` = 패키지, `flowRunner.completed` = 플로우,
4265
+ // 인용부호는 「」. ⛔ 계보·드리프트를 나타내는 표현은 이 그룹에 두지 않습니다 (§9).
4266
+ packagedAutomation: {
4267
+ title: "패키지 자동화",
4268
+ subtitle: "설치된 패키지가 제공하는 플로우와 액션입니다. 이 배포에서 끌 수 있으며, 플로우는 새 이름으로 복제해 사용자 지정할 수도 있습니다. 편집은 Studio에서 합니다.",
4269
+ refresh: "새로고침",
4270
+ flowsHeading: "패키지 플로우",
4271
+ actionsHeading: "패키지 액션",
4272
+ colFlow: "플로우",
4273
+ colActivation: "활성화 상태",
4274
+ colActions: "작업",
4275
+ toggleLabel: "{{label}}의 활성화 상태",
4276
+ on: "켜짐",
4277
+ off: "꺼짐",
4278
+ notRunning: "여기서 실행되지 않음",
4279
+ clone: "복제",
4280
+ cloneTitle: "패키지 플로우 복제",
4281
+ cloneBody: "사본은 정의 전체를 그대로 가져가며 새 머신 이름과 레이블이 필요합니다. 사본은 Studio에서 편집하세요.",
4282
+ cloneName: "새 머신 이름",
4283
+ cloneLabel: "새 레이블",
4284
+ cancel: "취소",
4285
+ cloneConfirm: "복제본 만들기",
4286
+ cloneCreated: "플로우 「{{name}}」을(를) 만들었습니다.",
4287
+ cloneSwitchSourceOff: "「{{label}}」 끄기",
4288
+ cloneSourceOff: "패키지 플로우 「{{label}}」이(가) 꺼져 있습니다.",
4289
+ cloneOpen: "Studio에서 복사본 열기",
4290
+ emptyTitle: "패키지 플로우 없음",
4291
+ emptyBody: "이 배포에는 자동화 플로우를 제공하는 설치된 패키지가 없습니다. 직접 작성한 플로우는 Studio에 있습니다.",
4292
+ loadFailed: "패키지 자동화를 불러오지 못했습니다.",
4293
+ toggleFailedHttp: "활성화 상태를 변경하지 못했습니다 (HTTP {{status}}).",
4294
+ toggleFailed: "활성화 상태를 변경하지 못했습니다.",
4295
+ cloneFailedHttp: "이 플로우를 복제하지 못했습니다 (HTTP {{status}}).",
4296
+ cloneFailed: "이 플로우를 복제하지 못했습니다.",
4297
+ reasonDetails: "세부 정보",
4298
+ actionsSubtitle: "설치된 패키지가 제공하는 액션입니다. 이 배포에서 끄면 액션이 제공되는 모든 곳에서 실행되지 않습니다. Studio에서 직접 액션을 따로 작성하는 것은 계속 가능합니다.",
4299
+ colAction: "액션",
4300
+ colObject: "오브젝트",
4301
+ actionToggleLabel: "{{object}}의 {{label}} 활성화 상태",
4302
+ actionsEmptyTitle: "패키지 액션 없음",
4303
+ actionsEmptyBody: "이 배포에는 액션을 선언하는 설치된 패키지가 없습니다. 직접 작성한 액션은 Studio에 있습니다.",
4304
+ actionsLoadFailed: "패키지 액션을 불러오지 못했습니다.",
4305
+ },
4306
+ element: {
4307
+ number: {
4308
+ noObject: "개체가 지정되지 않았습니다. dataSource.object를 설정하세요.",
4309
+ sourceUnresolved: "이 지표의 데이터 소스를 확인할 수 없습니다",
4310
+ },
4311
+ image: {
4312
+ noSource: "이미지 소스 없음",
4313
+ },
4314
+ recordPicker: {
4315
+ sourceUnresolved: "이 레코드 선택기의 데이터 소스를 확인할 수 없습니다",
4316
+ },
4317
+ calendar: {
4318
+ sourceUnresolved: "이 캘린더의 데이터 소스를 확인할 수 없습니다",
4319
+ },
4320
+ chart: {
4321
+ sourceUnresolved: "이 차트의 데이터 소스를 확인할 수 없습니다",
4322
+ },
4323
+ pivotTable: {
4324
+ sourceUnresolved: "이 피벗 테이블의 데이터 소스를 확인할 수 없습니다",
4325
+ },
4326
+ detailView: {
4327
+ sourceUnresolved: "이 상세 보기의 데이터 소스를 확인할 수 없습니다",
4328
+ },
4329
+ relatedList: {
4330
+ sourceUnresolved: "이 관련 목록의 데이터 소스를 확인할 수 없습니다",
4331
+ parentUnreadable: "이 관련 목록의 상위 레코드를 읽을 수 없습니다",
4332
+ },
4333
+ form: {
4334
+ sourceUnresolved: "이 양식의 데이터 소스를 확인할 수 없습니다",
4335
+ },
4336
+ lineItems: {
4337
+ sourceUnresolved: "이 품목 패널의 데이터 소스를 확인할 수 없습니다",
4338
+ },
4339
+ gantt: {
4340
+ sourceUnresolved: "이 간트 차트의 데이터 소스를 확인할 수 없습니다",
4341
+ },
4342
+ grid: {
4343
+ sourceUnresolved: "이 그리드의 데이터 소스를 확인할 수 없습니다",
4344
+ },
4345
+ board: {
4346
+ sourceUnresolved: "이 보드의 데이터 소스를 확인할 수 없습니다",
4347
+ },
4348
+ listView: {
4349
+ sourceUnresolved: "이 목록 보기의 데이터 소스를 확인할 수 없습니다",
4350
+ },
4351
+ map: {
4352
+ sourceUnresolved: "이 지도의 데이터 소스를 확인할 수 없습니다",
4353
+ },
4354
+ timeline: {
4355
+ sourceUnresolved: "이 타임라인의 데이터 소스를 확인할 수 없습니다",
4356
+ },
4357
+ component: {
4358
+ sourceUnresolved: "이 구성 요소의 데이터 소스를 확인할 수 없습니다",
4359
+ noDataSource: "확인된 데이터 소스가 없습니다",
4360
+ apiRefused: "이 구성 요소의 API 데이터 소스가 거부되었습니다",
4361
+ apiUnreadable: "이 구성 요소의 API 데이터 소스를 읽을 수 없습니다",
4362
+ },
4363
+ metadataViewer: {
4364
+ missingKey: "이 보기에 {{key}}이(가) 없습니다.",
4365
+ loading: "{{name}} 로딩 중…",
4366
+ loadFailed: "{{name}}을(를) 불러오지 못했습니다: {{message}}",
4367
+ notFound: "{{name}}을(를) 찾을 수 없습니다.",
4368
+ stateMachine: "상태 머신",
4369
+ flow: "플로우",
4370
+ permission: "권한",
4371
+ noStateMachine: "{{object}}에 상태 머신이 없습니다.",
4372
+ noStateMachineNamed: "{{object}}에 “{{name}}”(이)라는 상태 머신이 없습니다.",
4373
+ lifecycle: "{{object}}의 수명 주기",
4374
+ field: "필드 {{field}}",
4375
+ initial: "초기",
4376
+ final: "최종",
4377
+ steps: "단계: {{count}}",
4378
+ noSteps: "표시할 단계가 없습니다.",
4379
+ untitledStep: "(단계)",
4380
+ hiddenSteps: "숨겨진 기술 단계: {{count}} · 모두 표시하려면 {{setting}} 설정",
4381
+ objectAccess: "개체 액세스: {{count}}",
4382
+ noPermissions: "선언된 개체 권한이 없습니다.",
4383
+ object: "개체",
4384
+ unknownType: "알 수 없는 메타데이터 보기 유형입니다. {{a}}, {{b}} 또는 {{c}}이어야 합니다.",
4385
+ unknownTypeNamed: "알 수 없는 메타데이터 보기 유형 “{{type}}”입니다. {{a}}, {{b}} 또는 {{c}}이어야 합니다.",
4386
+ },
4387
+ },
3402
4388
  };
3403
4389
  export default ko;