autumnnote 1.0.7 → 1.0.9

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 (40) hide show
  1. package/README.md +332 -638
  2. package/dist/autumnnote.css +40 -4
  3. package/dist/autumnnote.es.js +3375 -262
  4. package/dist/autumnnote.es.js.map +1 -1
  5. package/dist/autumnnote.umd.js +3374 -261
  6. package/dist/autumnnote.umd.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/js/Context.js +4 -0
  9. package/src/js/editing/Style.js +195 -44
  10. package/src/js/editing/Typing.js +2 -2
  11. package/src/js/i18n/de.js +320 -0
  12. package/src/js/i18n/en.js +328 -0
  13. package/src/js/i18n/es.js +320 -0
  14. package/src/js/i18n/fr.js +321 -0
  15. package/src/js/i18n/index.js +59 -0
  16. package/src/js/i18n/ja.js +321 -0
  17. package/src/js/i18n/ko.js +320 -0
  18. package/src/js/i18n/vi.js +321 -0
  19. package/src/js/i18n/zh.js +321 -0
  20. package/src/js/index.js +2 -1
  21. package/src/js/module/CodeTooltip.js +12 -9
  22. package/src/js/module/ContextMenu.js +13 -11
  23. package/src/js/module/Editor.js +14 -3
  24. package/src/js/module/EmojiDialog.js +19 -7
  25. package/src/js/module/FindReplace.js +14 -13
  26. package/src/js/module/IconDialog.js +25 -13
  27. package/src/js/module/ImageDialog.js +25 -20
  28. package/src/js/module/ImageTooltip.js +13 -12
  29. package/src/js/module/LinkDialog.js +10 -9
  30. package/src/js/module/LinkTooltip.js +6 -5
  31. package/src/js/module/Placeholder.js +6 -1
  32. package/src/js/module/ShortcutsDialog.js +5 -4
  33. package/src/js/module/Statusbar.js +6 -5
  34. package/src/js/module/TableTooltip.js +412 -102
  35. package/src/js/module/Toolbar.js +21 -15
  36. package/src/js/module/VideoDialog.js +10 -9
  37. package/src/js/module/VideoTooltip.js +12 -11
  38. package/src/js/settings.js +4 -0
  39. package/src/styles/autumnnote.scss +50 -5
  40. package/types/index.d.ts +58 -1
@@ -0,0 +1,320 @@
1
+ /**
2
+ * ko.js - Korean locale
3
+ * Deep-merged over en.js; only keys that differ from English are listed.
4
+ */
5
+
6
+ /** @type {Partial<import('../../../types/index.js').AsnLocale>} */
7
+ export const ko = {
8
+ toolbar: {
9
+ bold: '굵게 (Ctrl+B)',
10
+ italic: '기울임꼴 (Ctrl+I)',
11
+ underline: '밑줄 (Ctrl+U)',
12
+ strikethrough: '취소선',
13
+ superscript: '위 첨자',
14
+ subscript: '아래 첨자',
15
+ alignLeft: '왼쪽 정렬',
16
+ alignCenter: '가운데 정렬',
17
+ alignRight: '오른쪽 정렬',
18
+ alignJustify: '양쪽 정렬',
19
+ ul: '순서 없는 목록',
20
+ ol: '순서 있는 목록',
21
+ checklist: '체크리스트',
22
+ indent: '들여쓰기',
23
+ outdent: '내어쓰기',
24
+ undo: '실행 취소 (Ctrl+Z)',
25
+ redo: '다시 실행 (Ctrl+Y)',
26
+ hr: '수평선',
27
+ link: '링크 삽입',
28
+ image: '이미지 삽입',
29
+ video: '동영상 삽입',
30
+ emoji: '이모지 삽입',
31
+ icon: 'FA 아이콘 삽입',
32
+ table: '표 삽입',
33
+ fontSize: '글꼴 크기',
34
+ fontSizePlaceholder: '크기',
35
+ removeFormat: '서식 제거',
36
+ direction: '텍스트 방향 전환 (LTR / RTL)',
37
+ fontFamily: '글꼴',
38
+ paragraphStyle: '단락 스타일',
39
+ paragraphStylePlaceholder: '스타일',
40
+ lineHeight: '줄 간격',
41
+ lineHeightPlaceholder: '↕ 줄',
42
+ codeview: 'HTML 코드 보기',
43
+ fullscreen: '전체 화면',
44
+ shortcuts: '키보드 단축키 (Ctrl+Shift+/)',
45
+ find: '찾기 (Ctrl+F)',
46
+ findReplace: '찾기 및 바꾸기 (Ctrl+H)',
47
+ inlineCode: '인라인 코드 (Ctrl+`)',
48
+ print: '인쇄',
49
+ foreColor: '글자 색',
50
+ backColor: '강조 색',
51
+ chooseTextColor: '글자 색 선택',
52
+ chooseHighlightColor: '강조 색 선택',
53
+ customColor: '사용자 지정 색',
54
+ insertTableLabel: '표 삽입',
55
+ paragraphItems: {
56
+ p: '기본',
57
+ blockquote: '인용',
58
+ pre: '코드',
59
+ },
60
+ },
61
+
62
+ linkDialog: {
63
+ ariaLabel: '링크 삽입',
64
+ title: '링크 삽입',
65
+ url: 'URL',
66
+ urlPlaceholder: 'https://',
67
+ displayText: '표시 텍스트',
68
+ textPlaceholder: '링크 텍스트',
69
+ openInNewTab: '새 탭에서 열기',
70
+ insertBtn: '삽입',
71
+ cancelBtn: '취소',
72
+ },
73
+
74
+ imageDialog: {
75
+ ariaLabel: '이미지 삽입',
76
+ title: '이미지 삽입',
77
+ imageUrl: '이미지 URL',
78
+ urlPlaceholder: 'https://example.com/image.png',
79
+ altText: '대체 텍스트',
80
+ altPlaceholder: '이미지 설명',
81
+ alignment: '정렬',
82
+ alignNone: '없음',
83
+ alignLeft: '왼쪽',
84
+ alignCenter: '가운데',
85
+ alignRight: '오른쪽',
86
+ uploadLabel: '또는 파일 업로드',
87
+ insertBtn: '삽입',
88
+ cancelBtn: '취소',
89
+ },
90
+
91
+ videoDialog: {
92
+ ariaLabel: '동영상 삽입',
93
+ title: '동영상 삽입',
94
+ videoUrl: '동영상 URL',
95
+ urlPlaceholder: 'YouTube, Vimeo 또는 직접 .mp4 URL',
96
+ widthLabel: '너비 (px)',
97
+ widthPlaceholder: '560',
98
+ insertBtn: '삽입',
99
+ cancelBtn: '취소',
100
+ detected: (type) => `감지됨: ${type}`,
101
+ unknownFormat: '알 수 없는 형식 — 직접 동영상 임베드를 시도합니다',
102
+ invalidUrl: '유효하지 않은 URL — 올바른 동영상 링크를 입력하세요.',
103
+ },
104
+
105
+ emojiDialog: {
106
+ ariaLabel: '이모지 삽입',
107
+ title: '이모지 삽입',
108
+ searchPlaceholder: '이모지 검색…',
109
+ all: '전체',
110
+ cancelBtn: '취소',
111
+ close: '닫기',
112
+ categories: {
113
+ smileys: '스마일',
114
+ people: '사람',
115
+ animals: '동물',
116
+ food: '음식',
117
+ travel: '여행',
118
+ objects: '사물',
119
+ symbols: '기호',
120
+ },
121
+ },
122
+
123
+ iconDialog: {
124
+ ariaLabel: 'FA 아이콘 삽입',
125
+ title: 'FA 아이콘 삽입',
126
+ searchPlaceholder: '아이콘 검색…',
127
+ all: '전체',
128
+ style: '스타일',
129
+ size: '크기',
130
+ color: '색상',
131
+ useColor: ' 색상 사용',
132
+ selectHint: '아이콘을 선택하세요',
133
+ insertBtn: 'FA 아이콘 삽입',
134
+ cancelBtn: '취소',
135
+ close: '닫기',
136
+ categories: {
137
+ popular: '인기',
138
+ interface: '인터페이스',
139
+ navigation: '탐색',
140
+ media: '미디어',
141
+ communication: '커뮤니케이션',
142
+ files: '파일',
143
+ people: '사람',
144
+ objects: '사물',
145
+ },
146
+ },
147
+
148
+ findReplace: {
149
+ findTitle: '찾기',
150
+ findReplaceTitle: '찾기 및 바꾸기',
151
+ findPlaceholder: '찾기…',
152
+ searchAriaLabel: '검색 텍스트',
153
+ caseSensitive: '\u00a0대소문자 구분',
154
+ prevBtn: '← 이전',
155
+ nextBtn: '다음 →',
156
+ replacePlaceholder: '바꿀 내용…',
157
+ replaceAriaLabel: '바꿀 내용',
158
+ replaceBtn: '바꾸기',
159
+ replaceAllBtn: '모두 바꾸기',
160
+ close: '×',
161
+ },
162
+
163
+ shortcutsDialog: {
164
+ title: '키보드 단축키',
165
+ ariaLabel: '키보드 단축키',
166
+ close: '닫기',
167
+ shortcuts: [
168
+ {
169
+ category: '텍스트 서식',
170
+ items: [
171
+ { keys: 'Ctrl + B', action: '굵게' },
172
+ { keys: 'Ctrl + I', action: '기울임꼴' },
173
+ { keys: 'Ctrl + U', action: '밑줄' },
174
+ { keys: 'Ctrl + K', action: '링크 삽입 / 편집' },
175
+ ],
176
+ },
177
+ {
178
+ category: '실행 기록',
179
+ items: [
180
+ { keys: 'Ctrl + Z', action: '실행 취소' },
181
+ { keys: 'Ctrl + Y / Ctrl + Shift + Z', action: '다시 실행' },
182
+ ],
183
+ },
184
+ {
185
+ category: '선택 및 탐색',
186
+ items: [
187
+ { keys: 'Ctrl + A', action: '전체 선택' },
188
+ { keys: 'Tab', action: '목록 들여쓰기 / 공백 삽입' },
189
+ { keys: 'Shift + Tab', action: '목록 내어쓰기' },
190
+ ],
191
+ },
192
+ {
193
+ category: '클립보드',
194
+ items: [
195
+ { keys: 'Ctrl + Shift + V', action: '일반 텍스트로 붙여넣기' },
196
+ ],
197
+ },
198
+ {
199
+ category: '찾기 및 바꾸기',
200
+ items: [
201
+ { keys: 'Ctrl + F', action: '문서에서 찾기' },
202
+ { keys: 'Ctrl + H', action: '찾기 및 바꾸기' },
203
+ ],
204
+ },
205
+ {
206
+ category: '편집기',
207
+ items: [
208
+ { keys: 'Ctrl + Shift + /', action: '이 단축키 대화상자 표시' },
209
+ ],
210
+ },
211
+ ],
212
+ },
213
+
214
+ contextMenu: {
215
+ cut: '잘라내기',
216
+ copy: '복사',
217
+ paste: '붙여넣기',
218
+ bold: '굵게',
219
+ italic: '기울임꼴',
220
+ underline: '밑줄',
221
+ textColor: '글자 색',
222
+ highlightColor: '강조 색',
223
+ copyFormat: '서식 복사',
224
+ pasteFormat: '서식 붙여넣기',
225
+ removeFormat: '서식 제거',
226
+ link: '링크 삽입',
227
+ image: '이미지 삽입',
228
+ video: '동영상 삽입',
229
+ table: '표 삽입',
230
+ back: '뒤로',
231
+ noHighlight: '강조 없음',
232
+ customColor: '사용자 지정 색',
233
+ customColorLabel: '사용자 지정…',
234
+ },
235
+
236
+ statusbar: {
237
+ resizeHandle: '편집기 크기 조정',
238
+ words: (n) => `단어: ${n}`,
239
+ wordsLimit: (n, max) => `단어: ${n}/${max}`,
240
+ chars: (n) => `글자: ${n}`,
241
+ charsLimit: (n, max) => `글자: ${n}/${max}`,
242
+ },
243
+
244
+ tooltips: {
245
+ link: {
246
+ ariaLabel: '링크 작업',
247
+ openLink: '링크 열기',
248
+ copyUrl: 'URL 복사',
249
+ editLink: '링크 편집',
250
+ removeLink: '링크 제거',
251
+ },
252
+ image: {
253
+ ariaLabel: '이미지 작업',
254
+ label: '이미지',
255
+ floatLeft: '왼쪽 배치',
256
+ noFloat: '배치 없음',
257
+ alignCenter: '가운데 정렬',
258
+ floatRight: '오른쪽 배치',
259
+ originalSize: '원본 크기',
260
+ rotateLeft: '왼쪽 회전',
261
+ rotateRight: '오른쪽 회전',
262
+ cropImage: '이미지 자르기',
263
+ addCaption: '캡션 추가 / 편집',
264
+ deleteImage: '이미지 삭제',
265
+ },
266
+ code: {
267
+ ariaLabel: '코드 블록 작업',
268
+ label: '코드',
269
+ syntaxLanguage: '구문 언어',
270
+ syntaxAriaLabel: '구문 언어',
271
+ copyCode: '코드 복사',
272
+ toggleWordWrap: '줄 바꿈 전환',
273
+ enableWordWrap: '줄 바꿈 사용',
274
+ disableWordWrap: '줄 바꿈 해제',
275
+ convertToParagraph: '단락으로 변환',
276
+ deleteCodeBlock: '코드 블록 삭제',
277
+ },
278
+ table: {
279
+ ariaLabel: '표 작업',
280
+ label: '표',
281
+ selectCells: '셀 선택',
282
+ addRowAbove: '위에 행 추가',
283
+ addRowBelow: '아래에 행 추가',
284
+ deleteRow: '행 삭제',
285
+ addColumnLeft: '왼쪽에 열 추가',
286
+ addColumnRight: '오른쪽에 열 추가',
287
+ deleteColumn: '열 삭제',
288
+ mergeCells: '셀 병합',
289
+ unmergeCells: '셀 분할',
290
+ columnWidth: '열 너비',
291
+ rowHeight: '행 높이',
292
+ tableBorderWidth: '표 테두리 너비',
293
+ deleteTable: '표 삭제',
294
+ columnWidthPx: '열 너비 (px)',
295
+ rowHeightPx: '행 높이 (px)',
296
+ tableBorderWidthPx: '표 테두리 너비 (px)',
297
+ cancelBtn: '취소',
298
+ applyBtn: '적용',
299
+ },
300
+ video: {
301
+ ariaLabel: '동영상 작업',
302
+ label: '동영상',
303
+ floatLeft: '왼쪽 배치',
304
+ noFloat: '배치 없음',
305
+ alignCenter: '가운데 정렬',
306
+ floatRight: '오른쪽 배치',
307
+ originalSize: '원본 크기',
308
+ previewVideo: '동영상 미리보기',
309
+ exitPreview: '미리보기 종료',
310
+ deleteVideo: '동영상 삭제',
311
+ },
312
+ },
313
+
314
+ errors: {
315
+ imageFormat: (type) =>
316
+ `"${type}" 형식은 웹 브라우저에서 지원되지 않습니다. JPEG, PNG 또는 WebP로 변환해 주세요.`,
317
+ imageSize: (maxSize) =>
318
+ `이미지 파일이 너무 큽니다. 최대 허용 크기는 ${maxSize} MB입니다.`,
319
+ },
320
+ };
@@ -0,0 +1,321 @@
1
+ /**
2
+ * vi.js - Tiếng Việt locale
3
+ * Chỉ cần khai báo các key khác với tiếng Anh (en.js).
4
+ * Các key còn lại sẽ được lấy từ en.js qua deep-merge.
5
+ */
6
+
7
+ /** @type {Partial<import('../../../types/index.js').AsnLocale>} */
8
+ export const vi = {
9
+ toolbar: {
10
+ bold: 'Đậm (Ctrl+B)',
11
+ italic: 'Nghiêng (Ctrl+I)',
12
+ underline: 'Gạch chân (Ctrl+U)',
13
+ strikethrough: 'Gạch ngang',
14
+ superscript: 'Chỉ số trên',
15
+ subscript: 'Chỉ số dưới',
16
+ alignLeft: 'Căn trái',
17
+ alignCenter: 'Căn giữa',
18
+ alignRight: 'Căn phải',
19
+ alignJustify: 'Căn đều',
20
+ ul: 'Danh sách không thứ tự',
21
+ ol: 'Danh sách có thứ tự',
22
+ checklist: 'Danh sách kiểm tra',
23
+ indent: 'Tăng thụt đầu dòng',
24
+ outdent: 'Giảm thụt đầu dòng',
25
+ undo: 'Hoàn tác (Ctrl+Z)',
26
+ redo: 'Làm lại (Ctrl+Y)',
27
+ hr: 'Đường kẻ ngang',
28
+ link: 'Chèn liên kết',
29
+ image: 'Chèn hình ảnh',
30
+ video: 'Chèn video',
31
+ emoji: 'Chèn biểu tượng cảm xúc',
32
+ icon: 'Chèn biểu tượng FA',
33
+ table: 'Chèn bảng',
34
+ fontSize: 'Cỡ chữ',
35
+ fontSizePlaceholder: 'Cỡ',
36
+ removeFormat: 'Xóa định dạng',
37
+ direction: 'Chuyển hướng văn bản (LTR / RTL)',
38
+ fontFamily: 'Phông chữ',
39
+ paragraphStyle: 'Kiểu đoạn văn',
40
+ paragraphStylePlaceholder: 'Kiểu',
41
+ lineHeight: 'Khoảng cách dòng',
42
+ lineHeightPlaceholder: '\u2195 Dòng',
43
+ codeview: 'Xem mã HTML',
44
+ fullscreen: 'Toàn màn hình',
45
+ shortcuts: 'Phím tắt (Ctrl+Shift+/)',
46
+ find: 'Tìm kiếm (Ctrl+F)',
47
+ findReplace: 'Tìm & Thay thế (Ctrl+H)',
48
+ inlineCode: 'Mã nội tuyến (Ctrl+`)',
49
+ print: 'In',
50
+ foreColor: 'Màu chữ',
51
+ backColor: 'Màu nền chữ',
52
+ chooseTextColor: 'Chọn màu chữ',
53
+ chooseHighlightColor: 'Chọn màu nền',
54
+ customColor: 'Màu tùy chỉnh',
55
+ insertTableLabel: 'Chèn bảng',
56
+ paragraphItems: {
57
+ p: 'Bình thường',
58
+ blockquote: 'Trích dẫn',
59
+ pre: 'Mã',
60
+ },
61
+ },
62
+
63
+ linkDialog: {
64
+ ariaLabel: 'Chèn liên kết',
65
+ title: 'Chèn liên kết',
66
+ url: 'Địa chỉ URL',
67
+ urlPlaceholder: 'https://',
68
+ displayText: 'Văn bản hiển thị',
69
+ textPlaceholder: 'Nội dung liên kết',
70
+ openInNewTab: 'Mở trong tab mới',
71
+ insertBtn: 'Chèn',
72
+ cancelBtn: 'Hủy',
73
+ },
74
+
75
+ imageDialog: {
76
+ ariaLabel: 'Chèn hình ảnh',
77
+ title: 'Chèn hình ảnh',
78
+ imageUrl: 'URL hình ảnh',
79
+ urlPlaceholder: 'https://example.com/anh.png',
80
+ altText: 'Văn bản thay thế',
81
+ altPlaceholder: 'Mô tả hình ảnh',
82
+ alignment: 'Căn chỉnh',
83
+ alignNone: 'Không',
84
+ alignLeft: 'Trái',
85
+ alignCenter: 'Giữa',
86
+ alignRight: 'Phải',
87
+ uploadLabel: 'Hoặc tải lên tệp',
88
+ insertBtn: 'Chèn',
89
+ cancelBtn: 'Hủy',
90
+ },
91
+
92
+ videoDialog: {
93
+ ariaLabel: 'Chèn video',
94
+ title: 'Chèn video',
95
+ videoUrl: 'URL video',
96
+ urlPlaceholder: 'YouTube, Vimeo, hoặc URL .mp4 trực tiếp',
97
+ widthLabel: 'Chiều rộng (px)',
98
+ widthPlaceholder: '560',
99
+ insertBtn: 'Chèn',
100
+ cancelBtn: 'Hủy',
101
+ detected: (type) => `Đã phát hiện: ${type}`,
102
+ unknownFormat: 'Định dạng không xác định \u2014 sẽ thử nhúng video trực tiếp',
103
+ invalidUrl: 'URL không hợp lệ \u2014 vui lòng nhập đường dẫn video hợp lệ.',
104
+ },
105
+
106
+ emojiDialog: {
107
+ ariaLabel: 'Chèn biểu tượng cảm xúc',
108
+ title: 'Chèn biểu tượng cảm xúc',
109
+ searchPlaceholder: 'Tìm kiếm biểu tượng\u2026',
110
+ all: 'Tất cả',
111
+ cancelBtn: 'Hủy',
112
+ close: 'Đóng',
113
+ categories: {
114
+ smileys: 'Mặt cười',
115
+ people: 'Con người',
116
+ animals: 'Động vật',
117
+ food: 'Thức ăn',
118
+ travel: 'Du lịch',
119
+ objects: 'Đồ vật',
120
+ symbols: 'Ký hiệu',
121
+ },
122
+ },
123
+
124
+ iconDialog: {
125
+ ariaLabel: 'Chèn biểu tượng FA',
126
+ title: 'Chèn biểu tượng FA',
127
+ searchPlaceholder: 'Tìm kiếm biểu tượng\u2026',
128
+ all: 'Tất cả',
129
+ style: 'Kiểu',
130
+ size: 'Kích thước',
131
+ color: 'Màu sắc',
132
+ useColor: ' Dùng màu',
133
+ selectHint: 'Chọn một biểu tượng',
134
+ insertBtn: 'Chèn biểu tượng FA',
135
+ cancelBtn: 'Hủy',
136
+ close: 'Đóng',
137
+ categories: {
138
+ popular: 'Phổ biến',
139
+ interface: 'Giao diện',
140
+ navigation: 'Điều hướng',
141
+ media: 'Phương tiện',
142
+ communication: 'Liên lạc',
143
+ files: 'Tệp tin',
144
+ people: 'Con người',
145
+ objects: 'Đồ vật',
146
+ },
147
+ },
148
+
149
+ findReplace: {
150
+ findTitle: 'Tìm kiếm',
151
+ findReplaceTitle: 'Tìm & Thay thế',
152
+ findPlaceholder: 'Tìm\u2026',
153
+ searchAriaLabel: 'Văn bản tìm kiếm',
154
+ caseSensitive: '\u00a0Phân biệt hoa thường',
155
+ prevBtn: '\u2190 Trước',
156
+ nextBtn: 'Tiếp \u2192',
157
+ replacePlaceholder: 'Thay thế bằng\u2026',
158
+ replaceAriaLabel: 'Thay thế bằng',
159
+ replaceBtn: 'Thay thế',
160
+ replaceAllBtn: 'Thay thế tất cả',
161
+ close: '\u00d7',
162
+ },
163
+
164
+ shortcutsDialog: {
165
+ title: 'Phím tắt bàn phím',
166
+ ariaLabel: 'Phím tắt bàn phím',
167
+ close: 'Đóng',
168
+ shortcuts: [
169
+ {
170
+ category: 'Định dạng văn bản',
171
+ items: [
172
+ { keys: 'Ctrl + B', action: 'Đậm' },
173
+ { keys: 'Ctrl + I', action: 'Nghiêng' },
174
+ { keys: 'Ctrl + U', action: 'Gạch chân' },
175
+ { keys: 'Ctrl + K', action: 'Chèn / sửa liên kết' },
176
+ ],
177
+ },
178
+ {
179
+ category: 'Lịch sử',
180
+ items: [
181
+ { keys: 'Ctrl + Z', action: 'Hoàn tác' },
182
+ { keys: 'Ctrl + Y / Ctrl + Shift + Z', action: 'Làm lại' },
183
+ ],
184
+ },
185
+ {
186
+ category: 'Chọn & Điều hướng',
187
+ items: [
188
+ { keys: 'Ctrl + A', action: 'Chọn tất cả' },
189
+ { keys: 'Tab', action: 'Tăng thụt đầu dòng / chèn khoảng trắng' },
190
+ { keys: 'Shift + Tab', action: 'Giảm thụt đầu dòng' },
191
+ ],
192
+ },
193
+ {
194
+ category: 'Bảng nhớ tạm',
195
+ items: [
196
+ { keys: 'Ctrl + Shift + V', action: 'Dán dưới dạng văn bản thuần' },
197
+ ],
198
+ },
199
+ {
200
+ category: 'Tìm & Thay thế',
201
+ items: [
202
+ { keys: 'Ctrl + F', action: 'Tìm trong tài liệu' },
203
+ { keys: 'Ctrl + H', action: 'Tìm & Thay thế' },
204
+ ],
205
+ },
206
+ {
207
+ category: 'Trình soạn thảo',
208
+ items: [
209
+ { keys: 'Ctrl + Shift + /', action: 'Hiện hộp thoại phím tắt' },
210
+ ],
211
+ },
212
+ ],
213
+ },
214
+
215
+ contextMenu: {
216
+ cut: 'Cắt',
217
+ copy: 'Sao chép',
218
+ paste: 'Dán',
219
+ bold: 'Đậm',
220
+ italic: 'Nghiêng',
221
+ underline: 'Gạch chân',
222
+ textColor: 'Màu chữ',
223
+ highlightColor: 'Màu nền chữ',
224
+ copyFormat: 'Sao chép định dạng',
225
+ pasteFormat: 'Dán định dạng',
226
+ removeFormat: 'Xóa định dạng',
227
+ link: 'Chèn liên kết',
228
+ image: 'Chèn hình ảnh',
229
+ video: 'Chèn video',
230
+ table: 'Chèn bảng',
231
+ back: 'Quay lại',
232
+ noHighlight: 'Không tô màu',
233
+ customColor: 'Màu tùy chỉnh',
234
+ customColorLabel: 'Tùy ch\u1ec9nh\u2026',
235
+ },
236
+
237
+ statusbar: {
238
+ resizeHandle: 'Kéo để thay đổi kích thước',
239
+ words: (n) => `Từ: ${n}`,
240
+ wordsLimit: (n, max) => `Từ: ${n}/${max}`,
241
+ chars: (n) => `Ký tự: ${n}`,
242
+ charsLimit: (n, max) => `Ký tự: ${n}/${max}`,
243
+ },
244
+
245
+ tooltips: {
246
+ link: {
247
+ ariaLabel: 'Hành động liên kết',
248
+ openLink: 'Mở liên kết',
249
+ copyUrl: 'Sao chép URL',
250
+ editLink: 'Sửa liên kết',
251
+ removeLink: 'Xóa liên kết',
252
+ },
253
+ image: {
254
+ ariaLabel: 'Hành động hình ảnh',
255
+ label: 'Hình ảnh',
256
+ floatLeft: 'Nổi trái',
257
+ noFloat: 'Không nổi',
258
+ alignCenter: 'Căn giữa',
259
+ floatRight: 'Nổi phải',
260
+ originalSize: 'Kích thước gốc',
261
+ rotateLeft: 'Xoay trái',
262
+ rotateRight: 'Xoay phải',
263
+ cropImage: 'Cắt ảnh',
264
+ addCaption: 'Thêm / Sửa chú thích',
265
+ deleteImage: 'Xóa hình ảnh',
266
+ },
267
+ code: {
268
+ ariaLabel: 'Hành động khối mã',
269
+ label: 'Mã',
270
+ syntaxLanguage: 'Ngôn ngữ cú pháp',
271
+ syntaxAriaLabel: 'Ngôn ngữ cú pháp',
272
+ copyCode: 'Sao chép mã',
273
+ toggleWordWrap: 'Chuyển đổi xuống dòng',
274
+ enableWordWrap: 'Bật xuống dòng',
275
+ disableWordWrap: 'Tắt xuống dòng',
276
+ convertToParagraph: 'Chuyển thành đoạn văn',
277
+ deleteCodeBlock: 'Xóa khối mã',
278
+ },
279
+ table: {
280
+ ariaLabel: 'Hành động bảng',
281
+ label: 'Bảng',
282
+ selectCells: 'Chọn ô',
283
+ addRowAbove: 'Thêm hàng phía trên',
284
+ addRowBelow: 'Thêm hàng phía dưới',
285
+ deleteRow: 'Xóa hàng',
286
+ addColumnLeft: 'Thêm cột bên trái',
287
+ addColumnRight: 'Thêm cột bên phải',
288
+ deleteColumn: 'Xóa cột',
289
+ mergeCells: 'Gộp ô',
290
+ unmergeCells: 'Tách ô',
291
+ columnWidth: 'Chiều rộng cột',
292
+ rowHeight: 'Chiều cao hàng',
293
+ tableBorderWidth: 'Độ rộng viền bảng',
294
+ deleteTable: 'Xóa bảng',
295
+ columnWidthPx: 'Chiều rộng cột (px)',
296
+ rowHeightPx: 'Chiều cao hàng (px)',
297
+ tableBorderWidthPx: 'Độ rộng viền bảng (px)',
298
+ cancelBtn: 'Hủy',
299
+ applyBtn: 'Áp dụng',
300
+ },
301
+ video: {
302
+ ariaLabel: 'Hành động video',
303
+ label: 'Video',
304
+ floatLeft: 'Nổi trái',
305
+ noFloat: 'Không nổi',
306
+ alignCenter: 'Căn giữa',
307
+ floatRight: 'Nổi phải',
308
+ originalSize: 'Kích thước gốc',
309
+ previewVideo: 'Xem trước',
310
+ exitPreview: 'Thoát xem trước',
311
+ deleteVideo: 'Xóa video',
312
+ },
313
+ },
314
+
315
+ errors: {
316
+ imageFormat: (type) =>
317
+ `Định dạng "${type}" không được hỗ trợ hiển thị trên trình duyệt. Vui lòng chuyển đổi sang JPEG, PNG hoặc WebP.`,
318
+ imageSize: (maxSize) =>
319
+ `Tệp hình ảnh quá lớn. Kích thước tối đa cho phép là ${maxSize} MB.`,
320
+ },
321
+ };