@g1cloud/entity-modeler-next 5.0.0-alpha.24 → 5.0.0-alpha.26

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.
@@ -0,0 +1,3 @@
1
+ import { MessageKey } from './ko';
2
+ /** UI 크롬 메시지 — 영어. 키 누락 시 컴파일 에러(Record<MessageKey>). */
3
+ export declare const en: Record<MessageKey, string>;
@@ -0,0 +1,17 @@
1
+ import { en } from './en';
2
+ import { ja } from './ja';
3
+ import { ko, MessageKey } from './ko';
4
+ export type { MessageKey };
5
+ /** UI 크롬 언어. 콘텐츠 `LangCode`의 부분집합(zh 미포함). */
6
+ export type UiLocale = 'ko' | 'en' | 'ja';
7
+ /** UI에서 선택 가능한 로케일 목록(순서 = 표시 순서). */
8
+ export declare const UI_LOCALES: readonly UiLocale[];
9
+ export type MessageParams = Record<string, string | number>;
10
+ /** `t()` 시그니처 — controller가 노출하고 뷰가 소비. */
11
+ export type Translator = (key: MessageKey, params?: MessageParams) => string;
12
+ /**
13
+ * 키 → 로케일 문자열. `{name}` 형태 파라미터를 치환한다.
14
+ * 폴백: 로케일에 키 없음 → ko → 키 원문(누락 시각화, 렌더 깨짐 방지).
15
+ */
16
+ export declare function translate(locale: UiLocale, key: MessageKey, params?: MessageParams): string;
17
+ export { ko, en, ja };
@@ -0,0 +1,3 @@
1
+ import { MessageKey } from './ko';
2
+ /** UI 크롬 메시지 — 일본어. 키 누락 시 컴파일 에러(Record<MessageKey>). */
3
+ export declare const ja: Record<MessageKey, string>;
@@ -0,0 +1,338 @@
1
+ /**
2
+ * UI 크롬(툴 사용자용) 메시지 카탈로그 — 한국어(단일 진실 소스).
3
+ *
4
+ * 콘텐츠 다국어(MultiLangText: 엔티티/속성 논리명·설명)와는 **별개 축**이다.
5
+ * 이건 툴 자체의 버튼/라벨/툴팁/검증 메시지를 쓰는 사람의 언어로 보여주기 위한 것.
6
+ *
7
+ * `ko`가 키 집합의 SoT — `en`/`ja`는 `Record<MessageKey>`로 선언되어 키 누락이 컴파일 에러가 된다.
8
+ * 새 문자열은 여기에 키를 먼저 추가하고 en/ja를 채운다.
9
+ *
10
+ * 키 규약: `em.area.item`(camelCase). `em.` 프리픽스로 lib 소유 키를 네임스페이싱(CSS `em-`·`EmIcon`
11
+ * 등 코드베이스 전면 컨벤션과 일관 + 번역 관리 시 호스트 키와 그룹 구분). 파라미터는 `{name}` 형태 삽입.
12
+ */
13
+ export declare const ko: {
14
+ readonly 'em.mode.view': "조회";
15
+ readonly 'em.mode.edit': "편집";
16
+ readonly 'em.mode.frozen': "편집 잠김 (충돌)";
17
+ readonly 'em.mode.frozenTitle': "동시편집 충돌로 편집이 잠겼습니다. 최신 내용을 다시 불러오는 중입니다.";
18
+ readonly 'em.mode.readonlyTitle': "이 다이어그램은 조회 전용입니다";
19
+ readonly 'em.toolbar.undo': "실행 취소";
20
+ readonly 'em.toolbar.redo': "다시 실행";
21
+ readonly 'em.toolbar.displayLabel': "표시";
22
+ readonly 'em.toolbar.routingToggle': "연결선 모드 전환";
23
+ readonly 'em.toolbar.routingOrthogonal': "직각";
24
+ readonly 'em.toolbar.routingStraight': "직선";
25
+ readonly 'em.toolbar.grid': "그리드";
26
+ readonly 'em.toolbar.gridOn': "그리드 켜기";
27
+ readonly 'em.toolbar.gridOff': "그리드 끄기";
28
+ readonly 'em.toolbar.minimap': "미니맵";
29
+ readonly 'em.toolbar.minimapOn': "미니맵 켜기";
30
+ readonly 'em.toolbar.minimapOff': "미니맵 끄기";
31
+ readonly 'em.toolbar.exportText': "내보내기 (텍스트 · Mermaid)";
32
+ readonly 'em.toolbar.exportSvg': "SVG 내보내기";
33
+ readonly 'em.toolbar.exportPng': "PNG 내보내기";
34
+ readonly 'em.toolbar.history': "이력";
35
+ readonly 'em.toolbar.historyOpen': "변경 이력 열기";
36
+ readonly 'em.toolbar.historyClose': "변경 이력 닫기";
37
+ readonly 'em.toolbar.shortcuts': "키보드 단축키 (?)";
38
+ readonly 'em.displayMode.logical': "논리";
39
+ readonly 'em.displayMode.physical': "물리";
40
+ readonly 'em.displayMode.logicalPhysical': "논리·물리";
41
+ readonly 'em.displayMode.class': "클래스";
42
+ readonly 'em.panel.resizeWidth': "너비 조절";
43
+ readonly 'em.panel.collapse': "접기";
44
+ readonly 'em.panel.expand': "펼치기";
45
+ readonly 'em.panel.collapseAll': "모두 접기";
46
+ readonly 'em.panel.expandAll': "모두 펼치기";
47
+ readonly 'em.panel.lockedBanner': "편집 잠김 — 이동·수정·삭제 차단";
48
+ readonly 'em.panel.openNamed': "{name} 열기";
49
+ readonly 'em.validation.title': "검증";
50
+ readonly 'em.validation.noIssues': "검증 이슈가 없습니다.";
51
+ readonly 'em.validation.noVisibleIssues': "표시할 이슈가 없습니다 (필터 적용 중).";
52
+ readonly 'em.validation.checkOrphanEntities': "관계 없는 엔티티 검사";
53
+ readonly 'em.validation.nameless': "(이름 없음)";
54
+ readonly 'em.validation.severityError': "오류";
55
+ readonly 'em.validation.severityWarning': "경고";
56
+ readonly 'em.validation.severityInfo': "정보";
57
+ readonly 'em.validation.hideSeverity': "{label} 숨기기";
58
+ readonly 'em.validation.showSeverity': "{label} 표시";
59
+ readonly 'em.validation.expandPanel': "검증 패널 펼치기";
60
+ readonly 'em.common.close': "닫기";
61
+ readonly 'em.common.save': "저장";
62
+ readonly 'em.export.title': "내보내기";
63
+ readonly 'em.export.formatText': "논리 모델 텍스트";
64
+ readonly 'em.export.formatMermaidEr': "Mermaid (ER)";
65
+ readonly 'em.export.formatMermaidClass': "Mermaid (클래스)";
66
+ readonly 'em.export.copy': "복사";
67
+ readonly 'em.export.download': "다운로드";
68
+ readonly 'em.export.copied': "클립보드에 복사되었습니다.";
69
+ readonly 'em.export.copyFailed': "복사에 실패했습니다.";
70
+ readonly 'em.shortcuts.title': "키보드 단축키";
71
+ readonly 'em.shortcuts.groupEdit': "편집";
72
+ readonly 'em.shortcuts.groupMove': "이동 · 정렬";
73
+ readonly 'em.shortcuts.groupOther': "기타";
74
+ readonly 'em.shortcuts.keyArrows': "방향키";
75
+ readonly 'em.shortcuts.keyRightClick': "우클릭";
76
+ readonly 'em.shortcuts.descUndo': "실행 취소";
77
+ readonly 'em.shortcuts.descRedo': "다시 실행";
78
+ readonly 'em.shortcuts.descCopy': "선택 복사";
79
+ readonly 'em.shortcuts.descPaste': "붙여넣기";
80
+ readonly 'em.shortcuts.descDelete': "선택 항목 삭제 (Backspace 동일)";
81
+ readonly 'em.shortcuts.descMove1': "선택 노드 1px 이동";
82
+ readonly 'em.shortcuts.descMove10': "선택 노드 10px 이동";
83
+ readonly 'em.shortcuts.descAttrFocus': "속성 선택 시 포커스 이동";
84
+ readonly 'em.shortcuts.descAttrReorder': "속성 순서 위/아래로";
85
+ readonly 'em.shortcuts.descContextMenu': "컨텍스트 메뉴 (엔티티·노트 추가 등)";
86
+ readonly 'em.shortcuts.descInlineConfirm': "인라인 편집 확정";
87
+ readonly 'em.shortcuts.descCloseEdit': "편집·메뉴 닫기";
88
+ readonly 'em.shortcuts.descOpenHelp': "이 도움말 열기";
89
+ readonly 'em.opSource.title': "본문 — {name}()";
90
+ readonly 'em.opSource.placeholder': "// Java 구현 코드";
91
+ readonly 'em.entity.name': "이름";
92
+ readonly 'em.entity.stereotype': "스테레오타입";
93
+ readonly 'em.entity.package': "패키지";
94
+ readonly 'em.panel.unlock': "잠금 해제";
95
+ readonly 'em.entity.fallback': "엔티티";
96
+ readonly 'em.group.fallback': "그룹";
97
+ readonly 'em.common.description': "설명";
98
+ readonly 'em.common.memo': "메모";
99
+ readonly 'em.common.color': "색상";
100
+ readonly 'em.common.add': "추가";
101
+ readonly 'em.common.inherit': "기본(따름)";
102
+ readonly 'em.common.noneParen': "(없음)";
103
+ readonly 'em.swatch.none': "없음";
104
+ readonly 'em.inspector.ctxEntityAttrs': "엔티티 · {name} › 속성 · {n}개";
105
+ readonly 'em.inspector.ctxEntityDivider': "엔티티 · {name} › 구분선";
106
+ readonly 'em.inspector.ctxEntityAttr': "엔티티 · {name} › 속성 · {attr}";
107
+ readonly 'em.inspector.ctxEntity': "엔티티 · {name}";
108
+ readonly 'em.inspector.ctxAssoc': "관계 · {a} — {b}";
109
+ readonly 'em.inspector.ctxGroup': "그룹 · {name}";
110
+ readonly 'em.inspector.ctxNote': "노트";
111
+ readonly 'em.inspector.ctxNone': "선택된 항목 없음";
112
+ readonly 'em.assoc.identifying': "identifying (식별 관계)";
113
+ readonly 'em.assoc.selfNoIdentifying': "셀프 연관은 식별 관계로 둘 수 없습니다 (비식별 FK 강제).";
114
+ readonly 'em.assoc.embedNoIdentifying': "임베드(@Embedded/@ElementCollection)는 식별 관계로 둘 수 없습니다 (임베더블은 독립 식별자가 없음).";
115
+ readonly 'em.assoc.multiplicity': "다중성";
116
+ readonly 'em.assoc.cascadeAllNote': "ALL이 개별 cascade를 모두 포함합니다 (CHK-JPA-5).";
117
+ readonly 'em.assoc.orphanRemovalNote': "반대편이 컬렉션(@ManyToOne/@ManyToMany)이라 orphanRemoval이 무효입니다 (CHK-JPA-14).";
118
+ readonly 'em.assoc.orderByPlaceholder': "예: name ASC";
119
+ readonly 'em.assoc.jpaDetails': "JPA 상세";
120
+ readonly 'em.embed.legend': "임베드";
121
+ readonly 'em.embed.cardinality': "카디널리티";
122
+ readonly 'em.embed.card1': "1 (필수 @Embedded)";
123
+ readonly 'em.embed.card01': "0..1 (선택 @Embedded)";
124
+ readonly 'em.embed.card0N': "0..* (컬렉션 @ElementCollection)";
125
+ readonly 'em.embed.collectionTablePlaceholder': "미지정 시 코드젠 폴백";
126
+ readonly 'em.embed.orderColumnPlaceholder': "미지정 시 순서 비보존";
127
+ readonly 'em.embed.ownerFixedNote': "임베더블은 소유자에 평탄화되므로 소유자 쪽 end(다중성·navigable·composition)는 구조적으로 고정이라 표시하지 않습니다.";
128
+ readonly 'em.group.nameLegend': "그룹명";
129
+ readonly 'em.group.excludeDDL': "DDL 생성 제외";
130
+ readonly 'em.group.members': "멤버 엔티티 {n}개";
131
+ readonly 'em.entity.classLegend': "클래스";
132
+ readonly 'em.entity.superClass': "부모 클래스";
133
+ readonly 'em.entity.superClassPlaceholder': "예: BaseEntity";
134
+ readonly 'em.entity.interfaces': "구현 인터페이스";
135
+ readonly 'em.entity.interfacesPlaceholder': "콤마로 구분 (예: Serializable, Cloneable)";
136
+ readonly 'em.entity.abstractClass': "추상 클래스";
137
+ readonly 'em.entity.tablePhysical': "테이블(물리)";
138
+ readonly 'em.entity.schema': "스키마";
139
+ readonly 'em.entity.schemaPlaceholder': "예: sales, master";
140
+ readonly 'em.entity.tableLogicalLegend': "테이블 논리명";
141
+ readonly 'em.entity.discColumn': "Discriminator 컬럼명";
142
+ readonly 'em.entity.discColumnPlaceholder': "예: DTYPE";
143
+ readonly 'em.entity.discType': "Discriminator 타입";
144
+ readonly 'em.entity.discLength': "Discriminator 길이";
145
+ readonly 'em.entity.hasPersonalInfo': "개인정보 포함 (hasPersonalInfo)";
146
+ readonly 'em.entity.headerColor': "헤더 색상";
147
+ readonly 'em.attr.section': "속성 ({n})";
148
+ readonly 'em.attr.addEmbeddable': "임베더블 추가";
149
+ readonly 'em.attr.nameless': "(이름 없음)";
150
+ readonly 'em.attr.selectHint': "위 목록에서 속성을 선택하면 편집 폼이 표시됩니다.";
151
+ readonly 'em.attr.namePlaceholder': "이름";
152
+ readonly 'em.attr.typePlaceholder': "타입";
153
+ readonly 'em.attr.customTypePlaceholder': "커스텀 타입명";
154
+ readonly 'em.attr.logicalPlaceholder': "논리명";
155
+ readonly 'em.attr.columnPlaceholder': "컬럼";
156
+ readonly 'em.attr.defaultValue': "기본값";
157
+ readonly 'em.attr.codeGroup': "코드그룹";
158
+ readonly 'em.attr.currencyColumn': "통화 컬럼";
159
+ readonly 'em.attr.pii': "개인정보";
160
+ readonly 'em.attr.colFallback': "컬럼 {n}";
161
+ readonly 'em.attr.sharedOwn': "전용 컬럼(OWN)";
162
+ readonly 'em.attr.sharedRef': "↗ {owner}{physical} ({mode})";
163
+ readonly 'em.attr.currencyMode': "통화";
164
+ readonly 'em.attr.sharedMode': "공유";
165
+ readonly 'em.attr.batchHint': "선택 {n}개 일괄";
166
+ readonly 'em.attr.fkDeleteHint': "외래키는 연관관계에서 파생됩니다 — 연관관계선을 삭제하세요";
167
+ readonly 'em.op.section': "오퍼레이션 ({n})";
168
+ readonly 'em.op.namePlaceholder': "오퍼레이션명";
169
+ readonly 'em.op.editBodyDirty': "본문 편집 ●";
170
+ readonly 'em.op.editBody': "본문 편집";
171
+ readonly 'em.index.section': "인덱스 ({n})";
172
+ readonly 'em.index.inherited': "{field} (상속)";
173
+ readonly 'em.index.namePlaceholder': "인덱스명";
174
+ readonly 'em.index.addColumn': "컬럼";
175
+ readonly 'em.index.condition': "조건 (partial index)";
176
+ readonly 'em.index.conditionPlaceholder': "예: WHERE status = 'A'";
177
+ readonly 'em.groupCode.searchPlaceholder': "코드그룹 검색/선택";
178
+ readonly 'em.groupCode.noMatch': "일치하는 코드그룹 없음";
179
+ readonly 'em.detail.tabBasics': "기본";
180
+ readonly 'em.detail.tabColumns': "속성";
181
+ readonly 'em.detail.tabIndexes': "인덱스";
182
+ readonly 'em.detail.tabOperations': "오퍼레이션";
183
+ readonly 'em.detail.title': "엔티티 — {name}";
184
+ readonly 'em.attr.addDivider': "구분선";
185
+ readonly 'em.attr.columnPhysical': "컬럼(물리)";
186
+ readonly 'em.attr.constraints': "제약";
187
+ readonly 'em.attr.dividerLabelPlaceholder': "구분선 라벨(선택)";
188
+ readonly 'em.attr.dividerNote': "── 시각 구획 ──";
189
+ readonly 'em.attr.detailCollapse': "상세 접기";
190
+ readonly 'em.attr.detailExpand': "상세 펼치기";
191
+ readonly 'em.attr.semanticLegend': "의미";
192
+ readonly 'em.attr.embedChildCols': "임베더블 — 하위 컬럼 {n}개";
193
+ readonly 'em.attr.overrideCollapse': "오버라이드 접기";
194
+ readonly 'em.attr.overrideExpand': "오버라이드 펼치기";
195
+ readonly 'em.attr.overrideLegend': "컬럼 오버라이드";
196
+ readonly 'em.attr.empty': "속성 없음 — '추가'로 생성";
197
+ readonly 'em.op.body': "본문";
198
+ readonly 'em.op.bodyDirty': "본문 ●";
199
+ readonly 'em.op.descPlaceholderKo': "설명(ko)";
200
+ readonly 'em.op.empty': "오퍼레이션 없음 — '추가'로 생성";
201
+ readonly 'em.index.delete': "인덱스 삭제";
202
+ readonly 'em.index.empty': "인덱스 없음 — '추가'로 생성";
203
+ readonly 'em.index.conditionPlaceholderWide': "예: WHERE status = 'A' AND deleted = false";
204
+ readonly 'em.index.inheritedColTitle': "슈퍼클래스 상속 컬럼";
205
+ readonly 'em.index.inheritedBadge': "상속";
206
+ readonly 'em.index.availColumns': "가용 컬럼 ({n})";
207
+ readonly 'em.index.indexColumns': "인덱스 컬럼 ({n})";
208
+ readonly 'em.index.allColumnsUsed': "모든 컬럼 사용됨";
209
+ readonly 'em.index.addArrow': "추가 →";
210
+ readonly 'em.index.moveUp': "위로";
211
+ readonly 'em.index.moveDown': "아래로";
212
+ readonly 'em.index.removeColumn': "제거";
213
+ readonly 'em.index.noColumns': "컬럼 없음 — 좌측에서 추가";
214
+ readonly 'em.index.selectPrompt': "인덱스를 선택하거나 추가하세요.";
215
+ readonly 'em.palette.autoLayout': "자동 배치";
216
+ readonly 'em.canvas.emptyTitle': "빈 다이어그램입니다";
217
+ readonly 'em.canvas.emptyHint': "캔버스를 <strong>우클릭</strong>하거나 좌하단 <strong>+</strong> 버튼으로 첫 엔티티를 추가하세요.";
218
+ readonly 'em.canvas.emptyShortcutHint': "단축키 도움말은 <kbd>?</kbd> 키";
219
+ readonly 'em.canvas.emptyReadonly': "표시할 엔티티가 없습니다";
220
+ readonly 'em.ctx.addEntity': "엔티티 추가";
221
+ readonly 'em.ctx.addNote': "노트 추가";
222
+ readonly 'em.ctx.addGroup': "그룹 추가";
223
+ readonly 'em.ctx.paste': "붙여넣기";
224
+ readonly 'em.ctx.copy': "복사";
225
+ readonly 'em.ctx.copyN': "복사 ({n})";
226
+ readonly 'em.ctx.editDetail': "상세 편집…";
227
+ readonly 'em.ctx.viewDetail': "상세 보기…";
228
+ readonly 'em.ctx.lock': "잠금";
229
+ readonly 'em.ctx.ungroup': "그룹 해제";
230
+ readonly 'em.ctx.deleteNote': "노트 삭제";
231
+ readonly 'em.ctx.addAttr': "속성 추가";
232
+ readonly 'em.ctx.colorN': "색상 ({n})";
233
+ readonly 'em.ctx.pasteAttr': "속성 붙여넣기";
234
+ readonly 'em.ctx.pasteAttrN': "속성 붙여넣기 ({n})";
235
+ readonly 'em.ctx.deleteAttr': "속성 삭제";
236
+ readonly 'em.ctx.deleteAttrN': "속성 삭제 ({n})";
237
+ readonly 'em.ctx.addOperation': "오퍼레이션 추가";
238
+ readonly 'em.ctx.deleteOperation': "오퍼레이션 삭제";
239
+ readonly 'em.ctx.addMethod': "메서드 추가";
240
+ readonly 'em.ctx.groupInto': "그룹으로 묶기";
241
+ readonly 'em.ctx.addSelfAssoc': "셀프 연관 추가";
242
+ readonly 'em.ctx.addEmbeddableNamed': "임베더블 추가: {label}";
243
+ readonly 'em.ctx.ungroupEntity': "그룹에서 빼기";
244
+ readonly 'em.ctx.deleteEntity': "엔티티 삭제";
245
+ readonly 'em.ctx.clearWaypoints': "꺾은선 풀기";
246
+ readonly 'em.ctx.deleteConnection': "연결 삭제";
247
+ readonly 'em.ctx.deleteAssociation': "관계 삭제";
248
+ readonly 'em.node.keyPfk': "PFK (식별 외래키)";
249
+ readonly 'em.node.keyPk': "PK (기본키)";
250
+ readonly 'em.node.keyFk': "FK (외래키)";
251
+ readonly 'em.node.required': "필수 (NOT NULL)";
252
+ readonly 'em.node.logicalMissing': "(논리명)";
253
+ readonly 'em.node.editLock': "편집 잠금";
254
+ readonly 'em.node.opsSummaryTitle': "오퍼레이션 {n}개 — 클래스 표시 모드에서 펼쳐 보입니다";
255
+ readonly 'em.node.opsSummary': "오퍼레이션 {n}개";
256
+ readonly 'em.node.addAttr': "+ 속성";
257
+ readonly 'em.node.addDivider': "+ 구분선";
258
+ readonly 'em.group.ddlExcludeBadge': "DDL 제외";
259
+ readonly 'em.explorer.groupFallback': "(그룹)";
260
+ readonly 'em.explorer.associations': "관계 ({n})";
261
+ readonly 'em.explorer.notes': "노트 ({n})";
262
+ readonly 'em.explorer.emptyNote': "(빈 노트)";
263
+ readonly 'em.explorer.diagram': "다이어그램";
264
+ readonly 'em.explorer.searchPlaceholder': "엔티티·속성 검색 ( / )";
265
+ readonly 'em.explorer.searchAria': "엔티티·속성 검색";
266
+ readonly 'em.explorer.clearSearchAria': "검색어 지우기";
267
+ readonly 'em.explorer.clearSearchTitle': "지우기 (Esc)";
268
+ readonly 'em.explorer.noMatches': "일치하는 엔티티·속성이 없습니다";
269
+ readonly 'em.history.title': "변경 이력";
270
+ readonly 'em.history.refresh': "새로고침";
271
+ readonly 'em.history.loading': "이력을 불러오는 중…";
272
+ readonly 'em.history.loadError': "이력을 불러오지 못했습니다.";
273
+ readonly 'em.history.emptyLoaded': "표시할 변경 이력이 없습니다.";
274
+ readonly 'em.history.emptyNotLoaded': "이력을 불러오세요.";
275
+ readonly 'em.history.filterAll': "전체";
276
+ readonly 'em.history.kindEdit': "편집";
277
+ readonly 'em.history.kindRestore': "복원";
278
+ readonly 'em.history.verbAdd': "추가";
279
+ readonly 'em.history.verbUpdate': "수정";
280
+ readonly 'em.history.verbRemove': "삭제";
281
+ readonly 'em.history.assocFallback': "연관";
282
+ readonly 'em.history.groupSubject': "그룹 {name}";
283
+ readonly 'em.history.emptyValue': "(비움)";
284
+ readonly 'em.history.noChange': "변경 없음";
285
+ readonly 'em.history.summaryAdd': "{name} 추가";
286
+ readonly 'em.history.summaryRemove': "{name} 삭제";
287
+ readonly 'em.history.summaryFields': "{name} {n}개 변경";
288
+ readonly 'em.history.summaryMore': "{summary} 외 {n}건";
289
+ readonly 'em.history.restoreFailed': "복원 실패: {reason}";
290
+ readonly 'em.history.unknown': "알 수 없음";
291
+ readonly 'em.history.confirmRestore': "이 시점으로 되돌립니다.";
292
+ readonly 'em.history.doRestore': "복원";
293
+ readonly 'em.history.cancel': "취소";
294
+ readonly 'em.history.restoreToHere': "이 시점으로 복원";
295
+ readonly 'em.check.catName': "이름";
296
+ readonly 'em.check.catJpa': "JPA";
297
+ readonly 'em.check.catType': "타입";
298
+ readonly 'em.check.catDsn': "설계";
299
+ readonly 'em.check.name1': "속성 이름이 중복됩니다: \"{name}\"";
300
+ readonly 'em.check.name2': "컬럼 물리명이 중복됩니다: \"{name}\"";
301
+ readonly 'em.check.name3': "엔티티 이름이 중복됩니다: \"{name}\"";
302
+ readonly 'em.check.name4Entity': "엔티티 이름이 비어 있습니다";
303
+ readonly 'em.check.name4Attr': "속성 이름이 비어 있습니다";
304
+ readonly 'em.check.name5': "물리명이 {max}자를 초과했습니다 ({len}자) — 일부 DB에서 잘릴 수 있습니다";
305
+ readonly 'em.check.name6Column': "컬럼 물리명이 SQL 예약어입니다: \"{name}\"";
306
+ readonly 'em.check.name6Table': "테이블 물리명이 SQL 예약어입니다: \"{name}\"";
307
+ readonly 'em.check.name6Index': "인덱스 이름이 SQL 예약어입니다: \"{name}\"";
308
+ readonly 'em.check.jpa1': "JPA 엔티티에 식별자(PK) 속성이 없습니다";
309
+ readonly 'em.check.jpa2': "임베더블 타입은 식별자 속성을 가질 수 없습니다: \"{name}\"";
310
+ readonly 'em.check.jpa4': "식별 관계 사이클입니다 (PK 무한 의존): {path}";
311
+ readonly 'em.check.jpa5': "{which}: cascade ALL이 개별 cascade와 중복됩니다 (ALL이 모두 포함)";
312
+ readonly 'em.check.jpa6': "{which}: orphanRemoval이 cascade {cascade}와 의미가 겹칩니다";
313
+ readonly 'em.check.jpa7': "{which}: 컬렉션(to-many) 연관에 EAGER 페치는 성능 위험이 있습니다";
314
+ readonly 'em.check.jpa8': "JPA 엔티티에 테이블 물리명이 설정되지 않았습니다";
315
+ readonly 'em.check.jpa9': "{which}: 단일(to-one) 연관에 컬렉션 메타(collectionType/collectionTable/orderColumn)는 무의미합니다 — @ElementCollection은 컬렉션에서만 적용됩니다";
316
+ readonly 'em.check.jpa10': "{which}: SET 컬렉션은 순서를 보존하지 않아 orderColumn(@OrderColumn)이 무의미합니다";
317
+ readonly 'em.check.jpa11': "임베드(@Embedded/@ElementCollection)는 식별 관계로 둘 수 없습니다 — 임베더블은 독립 식별자가 없습니다";
318
+ readonly 'em.check.jpa12': "식별자(@Id) 속성은 transient(@Transient)일 수 없습니다: \"{name}\"";
319
+ readonly 'em.check.jpa13AutoIncrement': "채번(auto increment)은 식별자(@Id) 속성에만 쓸 수 있습니다 — 비식별 속성 \"{name}\"에 설정되어 있습니다";
320
+ readonly 'em.check.jpa13Sequence': "채번(시퀀스 \"{seq}\")은 식별자(@Id) 속성에만 쓸 수 있습니다 — 비식별 속성 \"{name}\"에 설정되어 있습니다";
321
+ readonly 'em.check.jpa14': "{which}: orphanRemoval은 @ManyToOne/@ManyToMany(반대편이 컬렉션) 연관에는 적용할 수 없습니다 — @OneToOne·@OneToMany에서만 유효합니다";
322
+ readonly 'em.check.jpa15': "식별자(@Id) 속성은 자연키(@NaturalId)일 수 없습니다 — 자연키는 PK와 별개의 비즈니스 키입니다: \"{name}\"";
323
+ readonly 'em.check.jpa16': "자연키(@NaturalId) 속성은 transient(@Transient)일 수 없습니다: \"{name}\"";
324
+ readonly 'em.check.jpa17': "자연키(@NaturalId) 속성은 not null이 권장됩니다(비즈니스 키는 non-null이 원칙): \"{name}\"";
325
+ readonly 'em.check.type1': "타겟 DB가 지원하지 않는 컬럼 타입입니다: \"{dataType}\"";
326
+ readonly 'em.check.type2': "{dataType} 타입에 length가 지정되지 않았습니다";
327
+ readonly 'em.check.type3': "공유 대상 컬럼의 타입({targetType})이 {metaName} 정의({metaType})와 다릅니다";
328
+ readonly 'em.check.type4': "다중값(Multi-Value) 속성은 GroupCodeEnum + VARCHAR 조합에서만 컨버터가 자동 생성됩니다 — 현재({type} / {dataType})에서는 Set<…> 필드만 생성되어 매핑이 불완전할 수 있습니다";
329
+ readonly 'em.check.dsn1': "both-many(M:N) 관계를 조인 엔티티 없이 직접 연결했습니다 — 연관 엔티티 도입을 검토하세요";
330
+ readonly 'em.check.dsn2': "속성이 하나도 없는 엔티티입니다";
331
+ readonly 'em.check.dsn3': "모델링된 관계가 없습니다 (연관·상속·임베딩 미참여 — 의도적 생략이면 무시)";
332
+ readonly 'em.check.dsn4': "속성이 {count}개로 많습니다 (임계치 {threshold} 초과) — 분해를 검토하세요";
333
+ readonly 'em.check.dsn5Inherited': "인덱스 \"{name}\"가 참조하는 상속 컬럼을 슈퍼클래스 카탈로그에서 찾을 수 없습니다({field}).";
334
+ readonly 'em.check.dsn5Missing': "인덱스 \"{name}\"가 존재하지 않는 컬럼을 참조합니다.";
335
+ readonly 'em.check.unspecified': "미지정";
336
+ };
337
+ /** 메시지 키 — `ko` 카탈로그의 키 집합(단일 진실 소스). */
338
+ export type MessageKey = keyof typeof ko;
package/dist/index.d.ts CHANGED
@@ -39,4 +39,5 @@ export { default as EditModeToggle } from './view/EditModeToggle.vue';
39
39
  export { default as PropertyPanel } from './view/PropertyPanel.vue';
40
40
  export { default as EntityModeler } from './view/EntityModeler.vue';
41
41
  export { buildDiagramSvg, exportDiagramSvg, exportDiagramPng } from './view/exportImage';
42
+ export { translate, UI_LOCALES, ko as uiMessagesKo, en as uiMessagesEn, ja as uiMessagesJa, type UiLocale, type MessageKey, type Translator, type MessageParams } from './i18n';
42
43
  export { createEditorController, emptyState, EDITOR, type EditorController, type HistoryTransport, type RestoreTransport, type RestoreOutcome, } from './editor/controller';
@@ -1,7 +1,9 @@
1
+ import { UiLocale } from '../i18n';
1
2
  type __VLS_Props = {
2
3
  editable: boolean;
3
4
  opMode: boolean;
4
5
  frozen?: boolean;
6
+ locale?: UiLocale;
5
7
  };
6
8
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
9
  toggle: () => any;
@@ -1,3 +1,4 @@
1
+ import { UiLocale } from '../i18n';
1
2
  import { SwatchToken } from './swatches';
2
3
  /**
3
4
  * 캔버스 우클릭 메뉴 항목 모델 — 호스트(bluesea) BSContextMenu 의존을 끊고 다이어그램 토큰(--em-*)
@@ -19,8 +20,12 @@ export type EmMenuItem = {
19
20
  current: SwatchToken | null;
20
21
  onPick: (token: SwatchToken | null) => void;
21
22
  };
22
- declare const _default: import('vue').DefineComponent<{}, {
23
+ declare const _default: import('vue').DefineComponent<{
24
+ locale?: UiLocale;
25
+ }, {
23
26
  open: (event: MouseEvent, menuItems: EmMenuItem[]) => Promise<void>;
24
27
  close: () => void;
25
- }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
28
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
29
+ locale?: UiLocale;
30
+ }> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
26
31
  export default _default;
@@ -1,7 +1,9 @@
1
1
  import { GroupCodeCatalogEntry } from '../core/types';
2
+ import { UiLocale } from '../i18n';
2
3
  type __VLS_Props = {
3
4
  modelValue: string | undefined;
4
5
  items: GroupCodeCatalogEntry[];
6
+ locale?: UiLocale;
5
7
  };
6
8
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
9
  "update:modelValue": (args_0: string | undefined) => any;
@@ -1,7 +1,9 @@
1
+ import { UiLocale } from '../i18n';
1
2
  type __VLS_Props = {
2
3
  operationName: string;
3
4
  sourceCode: string;
4
5
  onSave: (code: string) => void;
6
+ locale?: UiLocale;
5
7
  };
6
8
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
9
  export default _default;
@@ -1,2 +1,6 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
1
+ import { UiLocale } from '../i18n';
2
+ type __VLS_Props = {
3
+ locale?: UiLocale;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
2
6
  export default _default;
@@ -1,3 +1,4 @@
1
+ import { UiLocale } from '../i18n';
1
2
  /** 내보내기 포맷 하나 — 탭 라벨·표시 내용·다운로드 파일명. */
2
3
  export interface ExportFormat {
3
4
  key: string;
@@ -8,6 +9,7 @@ export interface ExportFormat {
8
9
  type __VLS_Props = {
9
10
  formats: ExportFormat[];
10
11
  title?: string;
12
+ locale?: UiLocale;
11
13
  };
12
14
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
13
15
  export default _default;
@@ -1,7 +1,19 @@
1
1
  import { ModelId } from '../core/types';
2
2
  import { ValidationIssue } from '../core/validation';
3
- /** ruleId('CHK-NAME-3') 분류 라벨('이름'). 형식 불명 입력은 원문 폴백. */
4
- export declare function issueCategoryLabel(ruleId: string): string;
3
+ import { MessageKey, Translator } from '../i18n';
4
+ /**
5
+ * ruleId 네임스페이스(CHK-<NS>-n의 NS) → 비개발자용 분류 카테고리 i18n 키. ruleId 원본('CHK-NAME-3')은
6
+ * 코드라 일반 사용자가 못 알아보므로 패널은 이 라벨만 노출하고 원 ruleId는 title 툴팁으로만 보존한다.
7
+ * 미등록 네임스페이스는 null(호출부가 NS 토큰 원문으로 폴백 — 신규 규칙 추가 시 무라벨이 아니라 식별 가능).
8
+ */
9
+ export declare function issueCategoryKey(ruleId: string): MessageKey | null;
10
+ /** ruleId → 분류 라벨(로컬라이즈). 미등록 NS는 NS 토큰 원문, 형식 불명은 ruleId 원문 폴백. */
11
+ export declare function issueCategoryLabel(t: Translator, ruleId: string): string;
12
+ /**
13
+ * 이슈 → 로컬라이즈된 메시지. 뷰(패널·인라인 배지)의 단일 진입점. CHK-TYPE-4의 빈 type/dataType은
14
+ * 표시 폴백('(미지정)')으로 치환한다(core는 빈 문자열만 전달 — 폴백 어휘는 표시 계층 소유).
15
+ */
16
+ export declare function localizeIssue(t: Translator, issue: ValidationIssue): string;
5
17
  /**
6
18
  * 이슈가 가리키는 소속 엔티티의 modelId — 패널이 엔티티명 칩을 붙일 대상. targetKind가 entity면
7
19
  * targetRef가 곧 엔티티이고, attribute/column/index면 contextRef가 소속 엔티티다(엔진이 그 용도로
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@g1cloud/entity-modeler-next",
3
3
  "private": false,
4
- "version": "5.0.0-alpha.24",
4
+ "version": "5.0.0-alpha.26",
5
5
  "description": "Vue 3 visual entity-modeling / class-diagram editor",
6
6
  "type": "module",
7
7
  "files": [