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,321 @@
1
+ /**
2
+ * fr.js - Français (French) locale
3
+ * Seules les clés différentes de en.js sont définies ici.
4
+ * Les clés manquantes sont complétées par en.js via deep-merge dans resolveLocale.
5
+ */
6
+
7
+ /** @type {Partial<import('../../../types/index.js').AsnLocale>} */
8
+ export const fr = {
9
+ toolbar: {
10
+ bold: 'Gras (Ctrl+B)',
11
+ italic: 'Italique (Ctrl+I)',
12
+ underline: 'Souligné (Ctrl+U)',
13
+ strikethrough: 'Barré',
14
+ superscript: 'Exposant',
15
+ subscript: 'Indice',
16
+ alignLeft: 'Aligner à gauche',
17
+ alignCenter: 'Centrer',
18
+ alignRight: 'Aligner à droite',
19
+ alignJustify: 'Justifier',
20
+ ul: 'Liste à puces',
21
+ ol: 'Liste numérotée',
22
+ checklist: 'Liste de tâches',
23
+ indent: 'Augmenter le retrait',
24
+ outdent: 'Diminuer le retrait',
25
+ undo: 'Annuler (Ctrl+Z)',
26
+ redo: 'Rétablir (Ctrl+Y)',
27
+ hr: 'Ligne horizontale',
28
+ link: 'Insérer un lien',
29
+ image: 'Insérer une image',
30
+ video: 'Insérer une vidéo',
31
+ emoji: 'Insérer un emoji',
32
+ icon: 'Insérer une icône FA',
33
+ table: 'Insérer un tableau',
34
+ fontSize: 'Taille de police',
35
+ fontSizePlaceholder: 'Taille',
36
+ removeFormat: 'Effacer la mise en forme',
37
+ direction: 'Basculer la direction du texte (LTR / RTL)',
38
+ fontFamily: 'Police',
39
+ paragraphStyle: 'Style de paragraphe',
40
+ paragraphStylePlaceholder: 'Style',
41
+ lineHeight: 'Interligne',
42
+ lineHeightPlaceholder: '\u2195 Ligne',
43
+ codeview: 'Afficher le code HTML',
44
+ fullscreen: 'Plein écran',
45
+ shortcuts: 'Raccourcis clavier (Ctrl+Shift+/)',
46
+ find: 'Rechercher (Ctrl+F)',
47
+ findReplace: 'Rechercher et remplacer (Ctrl+H)',
48
+ inlineCode: 'Code inline (Ctrl+`)',
49
+ print: 'Imprimer',
50
+ foreColor: 'Couleur du texte',
51
+ backColor: 'Couleur de surbrillance',
52
+ chooseTextColor: 'Choisir la couleur du texte',
53
+ chooseHighlightColor: 'Choisir la couleur de surbrillance',
54
+ customColor: 'Couleur personnalisée',
55
+ insertTableLabel: 'Insérer un tableau',
56
+ paragraphItems: {
57
+ p: 'Normal',
58
+ blockquote: 'Citation',
59
+ pre: 'Code',
60
+ },
61
+ },
62
+
63
+ linkDialog: {
64
+ ariaLabel: 'Insérer un lien',
65
+ title: 'Insérer un lien',
66
+ url: 'URL',
67
+ urlPlaceholder: 'https://',
68
+ displayText: 'Texte affiché',
69
+ textPlaceholder: 'Texte du lien',
70
+ openInNewTab: 'Ouvrir dans un nouvel onglet',
71
+ insertBtn: 'Insérer',
72
+ cancelBtn: 'Annuler',
73
+ },
74
+
75
+ imageDialog: {
76
+ ariaLabel: 'Insérer une image',
77
+ title: 'Insérer une image',
78
+ imageUrl: 'URL de l\'image',
79
+ urlPlaceholder: 'https://example.com/image.png',
80
+ altText: 'Texte alternatif',
81
+ altPlaceholder: 'Description de l\'image',
82
+ alignment: 'Alignement',
83
+ alignNone: 'Aucun',
84
+ alignLeft: 'Gauche',
85
+ alignCenter: 'Centre',
86
+ alignRight: 'Droite',
87
+ uploadLabel: 'Ou téléverser un fichier',
88
+ insertBtn: 'Insérer',
89
+ cancelBtn: 'Annuler',
90
+ },
91
+
92
+ videoDialog: {
93
+ ariaLabel: 'Insérer une vidéo',
94
+ title: 'Insérer une vidéo',
95
+ videoUrl: 'URL de la vidéo',
96
+ urlPlaceholder: 'YouTube, Vimeo ou URL .mp4 directe',
97
+ widthLabel: 'Largeur (px)',
98
+ widthPlaceholder: '560',
99
+ insertBtn: 'Insérer',
100
+ cancelBtn: 'Annuler',
101
+ detected: (type) => `Détecté\u00a0: ${type}`,
102
+ unknownFormat: 'Format inconnu \u2014 tentative d\'intégration directe',
103
+ invalidUrl: 'URL invalide \u2014 veuillez saisir un lien vidéo valide.',
104
+ },
105
+
106
+ emojiDialog: {
107
+ ariaLabel: 'Insérer un emoji',
108
+ title: 'Insérer un emoji',
109
+ searchPlaceholder: 'Rechercher des emojis\u2026',
110
+ all: 'Tout',
111
+ cancelBtn: 'Annuler',
112
+ close: 'Fermer',
113
+ categories: {
114
+ smileys: 'Smileys',
115
+ people: 'Personnes',
116
+ animals: 'Animaux',
117
+ food: 'Nourriture',
118
+ travel: 'Voyage',
119
+ objects: 'Objets',
120
+ symbols: 'Symboles',
121
+ },
122
+ },
123
+
124
+ iconDialog: {
125
+ ariaLabel: 'Insérer une icône FA',
126
+ title: 'Insérer une icône FA',
127
+ searchPlaceholder: 'Rechercher des icônes\u2026',
128
+ all: 'Tout',
129
+ style: 'Style',
130
+ size: 'Taille',
131
+ color: 'Couleur',
132
+ useColor: ' Utiliser la couleur',
133
+ selectHint: 'Sélectionner une icône',
134
+ insertBtn: 'Insérer une icône FA',
135
+ cancelBtn: 'Annuler',
136
+ close: 'Fermer',
137
+ categories: {
138
+ popular: 'Populaire',
139
+ interface: 'Interface',
140
+ navigation: 'Navigation',
141
+ media: 'Média',
142
+ communication: 'Communication',
143
+ files: 'Fichiers',
144
+ people: 'Personnes',
145
+ objects: 'Objets',
146
+ },
147
+ },
148
+
149
+ findReplace: {
150
+ findTitle: 'Rechercher',
151
+ findReplaceTitle: 'Rechercher et remplacer',
152
+ findPlaceholder: 'Rechercher\u2026',
153
+ searchAriaLabel: 'Texte à rechercher',
154
+ caseSensitive: '\u00a0Respecter la casse',
155
+ prevBtn: '\u2190 Préc.',
156
+ nextBtn: 'Suiv. \u2192',
157
+ replacePlaceholder: 'Remplacer par\u2026',
158
+ replaceAriaLabel: 'Remplacer par',
159
+ replaceBtn: 'Remplacer',
160
+ replaceAllBtn: 'Tout remplacer',
161
+ close: '\u00d7',
162
+ },
163
+
164
+ shortcutsDialog: {
165
+ title: 'Raccourcis clavier',
166
+ ariaLabel: 'Raccourcis clavier',
167
+ close: 'Fermer',
168
+ shortcuts: [
169
+ {
170
+ category: 'Mise en forme du texte',
171
+ items: [
172
+ { keys: 'Ctrl + B', action: 'Gras' },
173
+ { keys: 'Ctrl + I', action: 'Italique' },
174
+ { keys: 'Ctrl + U', action: 'Souligné' },
175
+ { keys: 'Ctrl + K', action: 'Insérer / modifier un lien' },
176
+ ],
177
+ },
178
+ {
179
+ category: 'Historique',
180
+ items: [
181
+ { keys: 'Ctrl + Z', action: 'Annuler' },
182
+ { keys: 'Ctrl + Y / Ctrl + Shift + Z', action: 'Rétablir' },
183
+ ],
184
+ },
185
+ {
186
+ category: 'Sélection et navigation',
187
+ items: [
188
+ { keys: 'Ctrl + A', action: 'Tout sélectionner' },
189
+ { keys: 'Tab', action: 'Augmenter le retrait / insérer des espaces' },
190
+ { keys: 'Shift + Tab', action: 'Diminuer le retrait' },
191
+ ],
192
+ },
193
+ {
194
+ category: 'Presse-papiers',
195
+ items: [
196
+ { keys: 'Ctrl + Shift + V', action: 'Coller en texte brut' },
197
+ ],
198
+ },
199
+ {
200
+ category: 'Rechercher et remplacer',
201
+ items: [
202
+ { keys: 'Ctrl + F', action: 'Rechercher dans le document' },
203
+ { keys: 'Ctrl + H', action: 'Rechercher et remplacer' },
204
+ ],
205
+ },
206
+ {
207
+ category: 'Éditeur',
208
+ items: [
209
+ { keys: 'Ctrl + Shift + /', action: 'Afficher les raccourcis clavier' },
210
+ ],
211
+ },
212
+ ],
213
+ },
214
+
215
+ contextMenu: {
216
+ cut: 'Couper',
217
+ copy: 'Copier',
218
+ paste: 'Coller',
219
+ bold: 'Gras',
220
+ italic: 'Italique',
221
+ underline: 'Souligné',
222
+ textColor: 'Couleur du texte',
223
+ highlightColor: 'Couleur de surbrillance',
224
+ copyFormat: 'Copier la mise en forme',
225
+ pasteFormat: 'Coller la mise en forme',
226
+ removeFormat: 'Effacer la mise en forme',
227
+ link: 'Insérer un lien',
228
+ image: 'Insérer une image',
229
+ video: 'Insérer une vidéo',
230
+ table: 'Insérer un tableau',
231
+ back: 'Retour',
232
+ noHighlight: 'Sans surbrillance',
233
+ customColor: 'Couleur personnalisée',
234
+ customColorLabel: 'Personnaliser\u2026',
235
+ },
236
+
237
+ statusbar: {
238
+ resizeHandle: 'Faire glisser pour redimensionner',
239
+ words: (n) => `Mots\u00a0: ${n}`,
240
+ wordsLimit: (n, max) => `Mots\u00a0: ${n}/${max}`,
241
+ chars: (n) => `Caractères\u00a0: ${n}`,
242
+ charsLimit: (n, max) => `Caractères\u00a0: ${n}/${max}`,
243
+ },
244
+
245
+ tooltips: {
246
+ link: {
247
+ ariaLabel: 'Actions du lien',
248
+ openLink: 'Ouvrir le lien',
249
+ copyUrl: 'Copier l\'URL',
250
+ editLink: 'Modifier le lien',
251
+ removeLink: 'Supprimer le lien',
252
+ },
253
+ image: {
254
+ ariaLabel: 'Actions de l\'image',
255
+ label: 'Image',
256
+ floatLeft: 'Flottant à gauche',
257
+ noFloat: 'Sans flottant',
258
+ alignCenter: 'Centré',
259
+ floatRight: 'Flottant à droite',
260
+ originalSize: 'Taille originale',
261
+ rotateLeft: 'Rotation à gauche',
262
+ rotateRight: 'Rotation à droite',
263
+ cropImage: 'Recadrer l\'image',
264
+ addCaption: 'Ajouter / modifier la légende',
265
+ deleteImage: 'Supprimer l\'image',
266
+ },
267
+ code: {
268
+ ariaLabel: 'Actions du bloc de code',
269
+ label: 'Code',
270
+ syntaxLanguage: 'Langage de syntaxe',
271
+ syntaxAriaLabel: 'Langage de syntaxe',
272
+ copyCode: 'Copier le code',
273
+ toggleWordWrap: 'Activer/désactiver le retour à la ligne',
274
+ enableWordWrap: 'Activer le retour à la ligne',
275
+ disableWordWrap: 'Désactiver le retour à la ligne',
276
+ convertToParagraph: 'Convertir en paragraphe',
277
+ deleteCodeBlock: 'Supprimer le bloc de code',
278
+ },
279
+ table: {
280
+ ariaLabel: 'Actions du tableau',
281
+ label: 'Tableau',
282
+ selectCells: 'Sélectionner des cellules',
283
+ addRowAbove: 'Ajouter une ligne au-dessus',
284
+ addRowBelow: 'Ajouter une ligne en-dessous',
285
+ deleteRow: 'Supprimer la ligne',
286
+ addColumnLeft: 'Ajouter une colonne à gauche',
287
+ addColumnRight: 'Ajouter une colonne à droite',
288
+ deleteColumn: 'Supprimer la colonne',
289
+ mergeCells: 'Fusionner les cellules',
290
+ unmergeCells: 'Scinder les cellules',
291
+ columnWidth: 'Largeur de colonne',
292
+ rowHeight: 'Hauteur de ligne',
293
+ tableBorderWidth: 'Épaisseur des bordures',
294
+ deleteTable: 'Supprimer le tableau',
295
+ columnWidthPx: 'Largeur de colonne (px)',
296
+ rowHeightPx: 'Hauteur de ligne (px)',
297
+ tableBorderWidthPx: 'Épaisseur des bordures (px)',
298
+ cancelBtn: 'Annuler',
299
+ applyBtn: 'Appliquer',
300
+ },
301
+ video: {
302
+ ariaLabel: 'Actions de la vidéo',
303
+ label: 'Vidéo',
304
+ floatLeft: 'Flottant à gauche',
305
+ noFloat: 'Sans flottant',
306
+ alignCenter: 'Centré',
307
+ floatRight: 'Flottant à droite',
308
+ originalSize: 'Taille originale',
309
+ previewVideo: 'Aperçu',
310
+ exitPreview: 'Quitter l\'aperçu',
311
+ deleteVideo: 'Supprimer la vidéo',
312
+ },
313
+ },
314
+
315
+ errors: {
316
+ imageFormat: (type) =>
317
+ `Le format "${type}" n'est pas pris en charge par le navigateur. Veuillez le convertir en JPEG, PNG ou WebP.`,
318
+ imageSize: (maxSize) =>
319
+ `Le fichier image est trop volumineux. La taille maximale autorisée est de ${maxSize}\u00a0Mo.`,
320
+ },
321
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * i18n/index.js — Locale registry and resolver for autumn-note-ce.
3
+ *
4
+ * Usage:
5
+ * lang: 'en' → built-in English (default)
6
+ * lang: 'vi' → built-in Vietnamese
7
+ * lang: 'ja' → built-in Japanese
8
+ * lang: 'zh' → built-in Simplified Chinese
9
+ * lang: 'fr' → built-in French
10
+ * lang: 'de' → built-in German
11
+ * lang: 'es' → built-in Spanish
12
+ * lang: 'ko' → built-in Korean
13
+ * lang: { ... } → custom locale object, deep-merged over English
14
+ */
15
+
16
+ import { mergeDeep } from '../core/func.js';
17
+ import { en } from './en.js';
18
+ import { vi } from './vi.js';
19
+ import { ja } from './ja.js';
20
+ import { zh } from './zh.js';
21
+ import { fr } from './fr.js';
22
+ import { de } from './de.js';
23
+ import { es } from './es.js';
24
+ import { ko } from './ko.js';
25
+
26
+ /**
27
+ * All built-in locales keyed by their language code.
28
+ * @type {Record<string, Partial<AsnLocale>>}
29
+ */
30
+ export const locales = { en, vi, ja, zh, fr, de, es, ko };
31
+
32
+ /**
33
+ * Resolve a locale object from a lang option value.
34
+ *
35
+ * @param {string | Partial<AsnLocale> | null | undefined} lang
36
+ * @returns {AsnLocale} A fully-populated locale (always contains every key from en.js).
37
+ */
38
+ export function resolveLocale(lang) {
39
+ // Default / English shortcut (no merge needed)
40
+ if (!lang || lang === 'en') return en;
41
+
42
+ if (typeof lang === 'string') {
43
+ const partial = locales[lang];
44
+ // Unknown language code → fall back to English
45
+ if (!partial) return en;
46
+ return mergeDeep(mergeDeep({}, en), partial);
47
+ }
48
+
49
+ if (typeof lang === 'object') {
50
+ // Custom locale object supplied directly by the user
51
+ return mergeDeep(mergeDeep({}, en), lang);
52
+ }
53
+
54
+ return en;
55
+ }
56
+
57
+ /**
58
+ * @typedef {Object} AsnLocale (see types/index.d.ts for the full definition)
59
+ */
@@ -0,0 +1,321 @@
1
+ /**
2
+ * ja.js - 日本語ロケール (Japanese)
3
+ * en.js をベースに上書きするキーのみ定義します。
4
+ * 未定義のキーは resolveLocale による deep-merge で en.js から補完されます。
5
+ */
6
+
7
+ /** @type {Partial<import('../../../types/index.js').AsnLocale>} */
8
+ export const ja = {
9
+ toolbar: {
10
+ bold: '太字 (Ctrl+B)',
11
+ italic: '斜体 (Ctrl+I)',
12
+ underline: '下線 (Ctrl+U)',
13
+ strikethrough: '取り消し線',
14
+ superscript: '上付き文字',
15
+ subscript: '下付き文字',
16
+ alignLeft: '左揃え',
17
+ alignCenter: '中央揃え',
18
+ alignRight: '右揃え',
19
+ alignJustify: '両端揃え',
20
+ ul: '箇条書きリスト',
21
+ ol: '番号付きリスト',
22
+ checklist: 'チェックリスト',
23
+ indent: 'インデントを増やす',
24
+ outdent: 'インデントを減らす',
25
+ undo: '元に戻す (Ctrl+Z)',
26
+ redo: 'やり直す (Ctrl+Y)',
27
+ hr: '水平線',
28
+ link: 'リンクを挿入',
29
+ image: '画像を挿入',
30
+ video: '動画を挿入',
31
+ emoji: '絵文字を挿入',
32
+ icon: 'FAアイコンを挿入',
33
+ table: 'テーブルを挿入',
34
+ fontSize: 'フォントサイズ',
35
+ fontSizePlaceholder: 'サイズ',
36
+ removeFormat: '書式をリセット',
37
+ direction: '文字方向を切り替え (LTR / RTL)',
38
+ fontFamily: 'フォント',
39
+ paragraphStyle: '段落スタイル',
40
+ paragraphStylePlaceholder: 'スタイル',
41
+ lineHeight: '行の高さ',
42
+ lineHeightPlaceholder: '\u2195 行間',
43
+ codeview: 'HTMLソースを表示',
44
+ fullscreen: '全画面表示',
45
+ shortcuts: 'キーボードショートカット (Ctrl+Shift+/)',
46
+ find: '検索 (Ctrl+F)',
47
+ findReplace: '検索と置換 (Ctrl+H)',
48
+ inlineCode: 'インラインコード (Ctrl+`)',
49
+ print: '印刷',
50
+ foreColor: '文字色',
51
+ backColor: 'ハイライト色',
52
+ chooseTextColor: '文字色を選択',
53
+ chooseHighlightColor: 'ハイライト色を選択',
54
+ customColor: 'カスタムカラー',
55
+ insertTableLabel: 'テーブルを挿入',
56
+ paragraphItems: {
57
+ p: '標準',
58
+ blockquote: '引用',
59
+ pre: 'コード',
60
+ },
61
+ },
62
+
63
+ linkDialog: {
64
+ ariaLabel: 'リンクを挿入',
65
+ title: 'リンクを挿入',
66
+ url: 'URL',
67
+ urlPlaceholder: 'https://',
68
+ displayText: '表示テキスト',
69
+ textPlaceholder: 'リンクテキスト',
70
+ openInNewTab: '新しいタブで開く',
71
+ insertBtn: '挿入',
72
+ cancelBtn: 'キャンセル',
73
+ },
74
+
75
+ imageDialog: {
76
+ ariaLabel: '画像を挿入',
77
+ title: '画像を挿入',
78
+ imageUrl: '画像URL',
79
+ urlPlaceholder: 'https://example.com/image.png',
80
+ altText: '代替テキスト',
81
+ altPlaceholder: '画像の説明',
82
+ alignment: '配置',
83
+ alignNone: 'なし',
84
+ alignLeft: '左',
85
+ alignCenter: '中央',
86
+ alignRight: '右',
87
+ uploadLabel: 'ファイルをアップロード',
88
+ insertBtn: '挿入',
89
+ cancelBtn: 'キャンセル',
90
+ },
91
+
92
+ videoDialog: {
93
+ ariaLabel: '動画を挿入',
94
+ title: '動画を挿入',
95
+ videoUrl: '動画URL',
96
+ urlPlaceholder: 'YouTube、Vimeo、または直接動画URL',
97
+ widthLabel: '幅 (px)',
98
+ widthPlaceholder: '560',
99
+ insertBtn: '挿入',
100
+ cancelBtn: 'キャンセル',
101
+ detected: (type) => `検出: ${type}`,
102
+ unknownFormat: '不明な形式 \u2014 直接動画埋め込みを試みます',
103
+ invalidUrl: 'URLが無効です \u2014 有効な動画URLを入力してください。',
104
+ },
105
+
106
+ emojiDialog: {
107
+ ariaLabel: '絵文字を挿入',
108
+ title: '絵文字を挿入',
109
+ searchPlaceholder: '絵文字を検索\u2026',
110
+ all: 'すべて',
111
+ cancelBtn: 'キャンセル',
112
+ close: '閉じる',
113
+ categories: {
114
+ smileys: '顔文字',
115
+ people: '人物',
116
+ animals: '動物',
117
+ food: '食べ物',
118
+ travel: '旅行',
119
+ objects: 'モノ',
120
+ symbols: '記号',
121
+ },
122
+ },
123
+
124
+ iconDialog: {
125
+ ariaLabel: 'FAアイコンを挿入',
126
+ title: 'FAアイコンを挿入',
127
+ searchPlaceholder: 'アイコンを検索\u2026',
128
+ all: 'すべて',
129
+ style: 'スタイル',
130
+ size: 'サイズ',
131
+ color: 'カラー',
132
+ useColor: ' カラーを使用',
133
+ selectHint: 'アイコンを選択してください',
134
+ insertBtn: 'FAアイコンを挿入',
135
+ cancelBtn: 'キャンセル',
136
+ close: '閉じる',
137
+ categories: {
138
+ popular: '人気',
139
+ interface: 'インターフェース',
140
+ navigation: 'ナビゲーション',
141
+ media: 'メディア',
142
+ communication: '通信',
143
+ files: 'ファイル',
144
+ people: '人物',
145
+ objects: 'モノ',
146
+ },
147
+ },
148
+
149
+ findReplace: {
150
+ findTitle: '検索',
151
+ findReplaceTitle: '検索と置換',
152
+ findPlaceholder: '検索\u2026',
153
+ searchAriaLabel: '検索テキスト',
154
+ caseSensitive: '\u00a0大文字/小文字を区別',
155
+ prevBtn: '\u2190 前へ',
156
+ nextBtn: '次へ \u2192',
157
+ replacePlaceholder: '置換後\u2026',
158
+ replaceAriaLabel: '置換後のテキスト',
159
+ replaceBtn: '置換',
160
+ replaceAllBtn: 'すべて置換',
161
+ close: '\u00d7',
162
+ },
163
+
164
+ shortcutsDialog: {
165
+ title: 'キーボードショートカット',
166
+ ariaLabel: 'キーボードショートカット',
167
+ close: '閉じる',
168
+ shortcuts: [
169
+ {
170
+ category: 'テキスト書式',
171
+ items: [
172
+ { keys: 'Ctrl + B', action: '太字' },
173
+ { keys: 'Ctrl + I', action: '斜体' },
174
+ { keys: 'Ctrl + U', action: '下線' },
175
+ { keys: 'Ctrl + K', action: 'リンクの挿入 / 編集' },
176
+ ],
177
+ },
178
+ {
179
+ category: '履歴',
180
+ items: [
181
+ { keys: 'Ctrl + Z', action: '元に戻す' },
182
+ { keys: 'Ctrl + Y / Ctrl + Shift + Z', action: 'やり直す' },
183
+ ],
184
+ },
185
+ {
186
+ category: '選択と移動',
187
+ items: [
188
+ { keys: 'Ctrl + A', action: 'すべて選択' },
189
+ { keys: 'Tab', action: 'インデント増加 / スペース挿入' },
190
+ { keys: 'Shift + Tab', action: 'インデント減少' },
191
+ ],
192
+ },
193
+ {
194
+ category: 'クリップボード',
195
+ items: [
196
+ { keys: 'Ctrl + Shift + V', action: 'プレーンテキストとして貼り付け' },
197
+ ],
198
+ },
199
+ {
200
+ category: '検索と置換',
201
+ items: [
202
+ { keys: 'Ctrl + F', action: '文書内を検索' },
203
+ { keys: 'Ctrl + H', action: '検索と置換' },
204
+ ],
205
+ },
206
+ {
207
+ category: 'エディター',
208
+ items: [
209
+ { keys: 'Ctrl + Shift + /', action: 'ショートカットダイアログを表示' },
210
+ ],
211
+ },
212
+ ],
213
+ },
214
+
215
+ contextMenu: {
216
+ cut: '切り取り',
217
+ copy: 'コピー',
218
+ paste: '貼り付け',
219
+ bold: '太字',
220
+ italic: '斜体',
221
+ underline: '下線',
222
+ textColor: '文字色',
223
+ highlightColor: 'ハイライト色',
224
+ copyFormat: '書式をコピー',
225
+ pasteFormat: '書式を貼り付け',
226
+ removeFormat: '書式をリセット',
227
+ link: 'リンクを挿入',
228
+ image: '画像を挿入',
229
+ video: '動画を挿入',
230
+ table: 'テーブルを挿入',
231
+ back: '戻る',
232
+ noHighlight: 'ハイライトなし',
233
+ customColor: 'カスタムカラー',
234
+ customColorLabel: 'カスタム\u2026',
235
+ },
236
+
237
+ statusbar: {
238
+ resizeHandle: 'ドラッグしてリサイズ',
239
+ words: (n) => `単語数: ${n}`,
240
+ wordsLimit: (n, max) => `単語数: ${n}/${max}`,
241
+ chars: (n) => `文字数: ${n}`,
242
+ charsLimit: (n, max) => `文字数: ${n}/${max}`,
243
+ },
244
+
245
+ tooltips: {
246
+ link: {
247
+ ariaLabel: 'リンク操作',
248
+ openLink: 'リンクを開く',
249
+ copyUrl: 'URLをコピー',
250
+ editLink: 'リンクを編集',
251
+ removeLink: 'リンクを削除',
252
+ },
253
+ image: {
254
+ ariaLabel: '画像操作',
255
+ label: '画像',
256
+ floatLeft: '左に回り込み',
257
+ noFloat: '回り込みなし',
258
+ alignCenter: '中央揃え',
259
+ floatRight: '右に回り込み',
260
+ originalSize: '元のサイズ',
261
+ rotateLeft: '左に回転',
262
+ rotateRight: '右に回転',
263
+ cropImage: '画像をトリミング',
264
+ addCaption: 'キャプションを追加 / 編集',
265
+ deleteImage: '画像を削除',
266
+ },
267
+ code: {
268
+ ariaLabel: 'コードブロック操作',
269
+ label: 'コード',
270
+ syntaxLanguage: '言語',
271
+ syntaxAriaLabel: '構文言語',
272
+ copyCode: 'コードをコピー',
273
+ toggleWordWrap: '折り返しを切り替え',
274
+ enableWordWrap: '折り返しを有効にする',
275
+ disableWordWrap: '折り返しを無効にする',
276
+ convertToParagraph: '段落に変換',
277
+ deleteCodeBlock: 'コードブロックを削除',
278
+ },
279
+ table: {
280
+ ariaLabel: 'テーブル操作',
281
+ label: 'テーブル',
282
+ selectCells: 'セルを選択',
283
+ addRowAbove: '上に行を追加',
284
+ addRowBelow: '下に行を追加',
285
+ deleteRow: '行を削除',
286
+ addColumnLeft: '左に列を追加',
287
+ addColumnRight: '右に列を追加',
288
+ deleteColumn: '列を削除',
289
+ mergeCells: 'セルを結合',
290
+ unmergeCells: 'セルの結合を解除',
291
+ columnWidth: '列幅',
292
+ rowHeight: '行の高さ',
293
+ tableBorderWidth: 'テーブルの枠幅',
294
+ deleteTable: 'テーブルを削除',
295
+ columnWidthPx: '列幅 (px)',
296
+ rowHeightPx: '行の高さ (px)',
297
+ tableBorderWidthPx: 'テーブルの枠幅 (px)',
298
+ cancelBtn: 'キャンセル',
299
+ applyBtn: '適用',
300
+ },
301
+ video: {
302
+ ariaLabel: '動画操作',
303
+ label: '動画',
304
+ floatLeft: '左に回り込み',
305
+ noFloat: '回り込みなし',
306
+ alignCenter: '中央揃え',
307
+ floatRight: '右に回り込み',
308
+ originalSize: '元のサイズ',
309
+ previewVideo: 'プレビュー',
310
+ exitPreview: 'プレビューを終了',
311
+ deleteVideo: '動画を削除',
312
+ },
313
+ },
314
+
315
+ errors: {
316
+ imageFormat: (type) =>
317
+ `形式 "${type}" はブラウザでの表示をサポートしていません。JPEG、PNG、または WebP に変換してください。`,
318
+ imageSize: (maxSize) =>
319
+ `画像ファイルが大きすぎます。最大許容サイズは ${maxSize} MB です。`,
320
+ },
321
+ };