autumnnote 1.0.8 → 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.
@@ -1443,9 +1443,2699 @@ var defaultOptions = {
1443
1443
  onDestroy: null,
1444
1444
  onCharLimitReached: null,
1445
1445
  onWordLimitReached: null,
1446
- focusColor: null
1446
+ focusColor: null,
1447
+ lang: "en"
1447
1448
  };
1448
1449
  //#endregion
1450
+ //#region src/js/i18n/en.js
1451
+ /**
1452
+ * en.js - English locale (canonical reference)
1453
+ * All other locales deep-merge against this to fill missing keys.
1454
+ */
1455
+ /** @type {import('../../../types/index.js').AsnLocale} */
1456
+ var en = {
1457
+ toolbar: {
1458
+ bold: "Bold (Ctrl+B)",
1459
+ italic: "Italic (Ctrl+I)",
1460
+ underline: "Underline (Ctrl+U)",
1461
+ strikethrough: "Strikethrough",
1462
+ superscript: "Superscript",
1463
+ subscript: "Subscript",
1464
+ alignLeft: "Align Left",
1465
+ alignCenter: "Align Center",
1466
+ alignRight: "Align Right",
1467
+ alignJustify: "Justify",
1468
+ ul: "Unordered List",
1469
+ ol: "Ordered List",
1470
+ checklist: "Checklist",
1471
+ indent: "Indent",
1472
+ outdent: "Outdent",
1473
+ undo: "Undo (Ctrl+Z)",
1474
+ redo: "Redo (Ctrl+Y)",
1475
+ hr: "Horizontal Rule",
1476
+ link: "Insert Link",
1477
+ image: "Insert Image",
1478
+ video: "Insert Video",
1479
+ emoji: "Insert Emoji",
1480
+ icon: "Insert FA Icon",
1481
+ table: "Insert Table",
1482
+ fontSize: "Font Size",
1483
+ fontSizePlaceholder: "Size",
1484
+ removeFormat: "Remove Format",
1485
+ direction: "Toggle Text Direction (LTR / RTL)",
1486
+ fontFamily: "Font Family",
1487
+ paragraphStyle: "Paragraph Style",
1488
+ paragraphStylePlaceholder: "Style",
1489
+ lineHeight: "Line Height",
1490
+ lineHeightPlaceholder: "↕ Line",
1491
+ codeview: "HTML Code View",
1492
+ fullscreen: "Fullscreen",
1493
+ shortcuts: "Keyboard Shortcuts (Ctrl+Shift+/)",
1494
+ find: "Find (Ctrl+F)",
1495
+ findReplace: "Find & Replace (Ctrl+H)",
1496
+ inlineCode: "Inline Code (Ctrl+`)",
1497
+ print: "Print",
1498
+ foreColor: "Text Color",
1499
+ backColor: "Highlight Color",
1500
+ chooseTextColor: "Choose text color",
1501
+ chooseHighlightColor: "Choose highlight color",
1502
+ customColor: "Custom color",
1503
+ insertTableLabel: "Insert Table",
1504
+ paragraphItems: {
1505
+ p: "Normal",
1506
+ blockquote: "Quote",
1507
+ pre: "Code"
1508
+ }
1509
+ },
1510
+ linkDialog: {
1511
+ ariaLabel: "Insert link",
1512
+ title: "Insert Link",
1513
+ url: "URL",
1514
+ urlPlaceholder: "https://",
1515
+ displayText: "Display Text",
1516
+ textPlaceholder: "Link text",
1517
+ openInNewTab: "Open in new tab",
1518
+ insertBtn: "Insert",
1519
+ cancelBtn: "Cancel"
1520
+ },
1521
+ imageDialog: {
1522
+ ariaLabel: "Insert image",
1523
+ title: "Insert Image",
1524
+ imageUrl: "Image URL",
1525
+ urlPlaceholder: "https://example.com/image.png",
1526
+ altText: "Alt Text",
1527
+ altPlaceholder: "Describe the image",
1528
+ alignment: "Alignment",
1529
+ alignNone: "None",
1530
+ alignLeft: "Left",
1531
+ alignCenter: "Center",
1532
+ alignRight: "Right",
1533
+ uploadLabel: "Or upload a file",
1534
+ insertBtn: "Insert",
1535
+ cancelBtn: "Cancel"
1536
+ },
1537
+ videoDialog: {
1538
+ ariaLabel: "Insert video",
1539
+ title: "Insert Video",
1540
+ videoUrl: "Video URL",
1541
+ urlPlaceholder: "YouTube, Vimeo, or direct .mp4 URL",
1542
+ widthLabel: "Width (px)",
1543
+ widthPlaceholder: "560",
1544
+ insertBtn: "Insert",
1545
+ cancelBtn: "Cancel",
1546
+ detected: (type) => `Detected: ${type}`,
1547
+ unknownFormat: "Unknown format — will try direct video embed",
1548
+ invalidUrl: "Invalid URL — please enter a valid video link."
1549
+ },
1550
+ emojiDialog: {
1551
+ ariaLabel: "Insert emoji",
1552
+ title: "Insert Emoji",
1553
+ searchPlaceholder: "Search emojis…",
1554
+ all: "All",
1555
+ cancelBtn: "Cancel",
1556
+ close: "Close",
1557
+ categories: {
1558
+ smileys: "Smileys",
1559
+ people: "People",
1560
+ animals: "Animals",
1561
+ food: "Food",
1562
+ travel: "Travel",
1563
+ objects: "Objects",
1564
+ symbols: "Symbols"
1565
+ }
1566
+ },
1567
+ iconDialog: {
1568
+ ariaLabel: "Insert FA icon",
1569
+ title: "Insert FA Icon",
1570
+ searchPlaceholder: "Search icons…",
1571
+ all: "All",
1572
+ style: "Style",
1573
+ size: "Size",
1574
+ color: "Color",
1575
+ useColor: " Use color",
1576
+ selectHint: "Select an icon",
1577
+ insertBtn: "Insert FA Icon",
1578
+ cancelBtn: "Cancel",
1579
+ close: "Close",
1580
+ categories: {
1581
+ popular: "Popular",
1582
+ interface: "Interface",
1583
+ navigation: "Navigation",
1584
+ media: "Media",
1585
+ communication: "Communication",
1586
+ files: "Files",
1587
+ people: "People",
1588
+ objects: "Objects"
1589
+ }
1590
+ },
1591
+ findReplace: {
1592
+ findTitle: "Find",
1593
+ findReplaceTitle: "Find & Replace",
1594
+ findPlaceholder: "Find…",
1595
+ searchAriaLabel: "Search text",
1596
+ caseSensitive: "\xA0Case sensitive",
1597
+ prevBtn: "← Prev",
1598
+ nextBtn: "Next →",
1599
+ replacePlaceholder: "Replace with…",
1600
+ replaceAriaLabel: "Replace with",
1601
+ replaceBtn: "Replace",
1602
+ replaceAllBtn: "Replace All",
1603
+ close: "×"
1604
+ },
1605
+ shortcutsDialog: {
1606
+ title: "Keyboard Shortcuts",
1607
+ ariaLabel: "Keyboard Shortcuts",
1608
+ close: "Close",
1609
+ shortcuts: [
1610
+ {
1611
+ category: "Text Formatting",
1612
+ items: [
1613
+ {
1614
+ keys: "Ctrl + B",
1615
+ action: "Bold"
1616
+ },
1617
+ {
1618
+ keys: "Ctrl + I",
1619
+ action: "Italic"
1620
+ },
1621
+ {
1622
+ keys: "Ctrl + U",
1623
+ action: "Underline"
1624
+ },
1625
+ {
1626
+ keys: "Ctrl + K",
1627
+ action: "Insert / edit link"
1628
+ }
1629
+ ]
1630
+ },
1631
+ {
1632
+ category: "History",
1633
+ items: [{
1634
+ keys: "Ctrl + Z",
1635
+ action: "Undo"
1636
+ }, {
1637
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
1638
+ action: "Redo"
1639
+ }]
1640
+ },
1641
+ {
1642
+ category: "Selection & Navigation",
1643
+ items: [
1644
+ {
1645
+ keys: "Ctrl + A",
1646
+ action: "Select all content"
1647
+ },
1648
+ {
1649
+ keys: "Tab",
1650
+ action: "Indent list item / insert spaces"
1651
+ },
1652
+ {
1653
+ keys: "Shift + Tab",
1654
+ action: "Outdent list item"
1655
+ }
1656
+ ]
1657
+ },
1658
+ {
1659
+ category: "Clipboard",
1660
+ items: [{
1661
+ keys: "Ctrl + Shift + V",
1662
+ action: "Paste as plain text"
1663
+ }]
1664
+ },
1665
+ {
1666
+ category: "Find & Replace",
1667
+ items: [{
1668
+ keys: "Ctrl + F",
1669
+ action: "Find in document"
1670
+ }, {
1671
+ keys: "Ctrl + H",
1672
+ action: "Find & Replace"
1673
+ }]
1674
+ },
1675
+ {
1676
+ category: "Editor",
1677
+ items: [{
1678
+ keys: "Ctrl + Shift + /",
1679
+ action: "Show this keyboard shortcuts dialog"
1680
+ }]
1681
+ }
1682
+ ]
1683
+ },
1684
+ contextMenu: {
1685
+ cut: "Cut",
1686
+ copy: "Copy",
1687
+ paste: "Paste",
1688
+ bold: "Bold",
1689
+ italic: "Italic",
1690
+ underline: "Underline",
1691
+ textColor: "Text Color",
1692
+ highlightColor: "Highlight Color",
1693
+ copyFormat: "Copy Format",
1694
+ pasteFormat: "Paste Format",
1695
+ removeFormat: "Remove Format",
1696
+ link: "Insert Link",
1697
+ image: "Insert Image",
1698
+ video: "Insert Video",
1699
+ table: "Insert Table",
1700
+ back: "Back",
1701
+ noHighlight: "No highlight",
1702
+ customColor: "Custom color",
1703
+ customColorLabel: "Custom…"
1704
+ },
1705
+ statusbar: {
1706
+ resizeHandle: "Resize editor",
1707
+ words: (n) => `Words: ${n}`,
1708
+ wordsLimit: (n, max) => `Words: ${n}/${max}`,
1709
+ chars: (n) => `Chars: ${n}`,
1710
+ charsLimit: (n, max) => `Chars: ${n}/${max}`
1711
+ },
1712
+ tooltips: {
1713
+ link: {
1714
+ ariaLabel: "Link actions",
1715
+ openLink: "Open link",
1716
+ copyUrl: "Copy URL",
1717
+ editLink: "Edit link",
1718
+ removeLink: "Remove link"
1719
+ },
1720
+ image: {
1721
+ ariaLabel: "Image actions",
1722
+ label: "Image",
1723
+ floatLeft: "Float Left",
1724
+ noFloat: "No Float",
1725
+ alignCenter: "Align Center",
1726
+ floatRight: "Float Right",
1727
+ originalSize: "Original Size",
1728
+ rotateLeft: "Rotate Left",
1729
+ rotateRight: "Rotate Right",
1730
+ cropImage: "Crop Image",
1731
+ addCaption: "Add / Edit Caption",
1732
+ deleteImage: "Delete Image"
1733
+ },
1734
+ code: {
1735
+ ariaLabel: "Code block actions",
1736
+ label: "Code",
1737
+ syntaxLanguage: "Syntax Language",
1738
+ syntaxAriaLabel: "Syntax language",
1739
+ copyCode: "Copy Code",
1740
+ toggleWordWrap: "Toggle Word Wrap",
1741
+ enableWordWrap: "Enable Word Wrap",
1742
+ disableWordWrap: "Disable Word Wrap",
1743
+ convertToParagraph: "Convert to Paragraph",
1744
+ deleteCodeBlock: "Delete Code Block"
1745
+ },
1746
+ table: {
1747
+ ariaLabel: "Table actions",
1748
+ label: "Table",
1749
+ selectCells: "Select Cells",
1750
+ addRowAbove: "Add Row Above",
1751
+ addRowBelow: "Add Row Below",
1752
+ deleteRow: "Delete Row",
1753
+ addColumnLeft: "Add Column Left",
1754
+ addColumnRight: "Add Column Right",
1755
+ deleteColumn: "Delete Column",
1756
+ mergeCells: "Merge Cells",
1757
+ unmergeCells: "Unmerge Cells",
1758
+ columnWidth: "Column Width",
1759
+ rowHeight: "Row Height",
1760
+ tableBorderWidth: "Table Border Width",
1761
+ deleteTable: "Delete Table",
1762
+ columnWidthPx: "Column Width (px)",
1763
+ rowHeightPx: "Row Height (px)",
1764
+ tableBorderWidthPx: "Table Border Width (px)",
1765
+ cancelBtn: "Cancel",
1766
+ applyBtn: "Apply"
1767
+ },
1768
+ video: {
1769
+ ariaLabel: "Video actions",
1770
+ label: "Video",
1771
+ floatLeft: "Float Left",
1772
+ noFloat: "No Float",
1773
+ alignCenter: "Align Center",
1774
+ floatRight: "Float Right",
1775
+ originalSize: "Original Size",
1776
+ previewVideo: "Preview Video",
1777
+ exitPreview: "Exit Preview",
1778
+ deleteVideo: "Delete Video"
1779
+ }
1780
+ },
1781
+ errors: {
1782
+ imageFormat: (type) => `Format "${type}" is not supported for display in web browsers. Please convert to JPEG, PNG, or WebP first.`,
1783
+ imageSize: (maxSize) => `Image file is too large. Maximum allowed size is ${maxSize} MB.`
1784
+ }
1785
+ };
1786
+ //#endregion
1787
+ //#region src/js/i18n/index.js
1788
+ /**
1789
+ * i18n/index.js — Locale registry and resolver for autumn-note-ce.
1790
+ *
1791
+ * Usage:
1792
+ * lang: 'en' → built-in English (default)
1793
+ * lang: 'vi' → built-in Vietnamese
1794
+ * lang: 'ja' → built-in Japanese
1795
+ * lang: 'zh' → built-in Simplified Chinese
1796
+ * lang: 'fr' → built-in French
1797
+ * lang: 'de' → built-in German
1798
+ * lang: 'es' → built-in Spanish
1799
+ * lang: 'ko' → built-in Korean
1800
+ * lang: { ... } → custom locale object, deep-merged over English
1801
+ */
1802
+ /**
1803
+ * All built-in locales keyed by their language code.
1804
+ * @type {Record<string, Partial<AsnLocale>>}
1805
+ */
1806
+ var locales = {
1807
+ en,
1808
+ vi: {
1809
+ toolbar: {
1810
+ bold: "Đậm (Ctrl+B)",
1811
+ italic: "Nghiêng (Ctrl+I)",
1812
+ underline: "Gạch chân (Ctrl+U)",
1813
+ strikethrough: "Gạch ngang",
1814
+ superscript: "Chỉ số trên",
1815
+ subscript: "Chỉ số dưới",
1816
+ alignLeft: "Căn trái",
1817
+ alignCenter: "Căn giữa",
1818
+ alignRight: "Căn phải",
1819
+ alignJustify: "Căn đều",
1820
+ ul: "Danh sách không thứ tự",
1821
+ ol: "Danh sách có thứ tự",
1822
+ checklist: "Danh sách kiểm tra",
1823
+ indent: "Tăng thụt đầu dòng",
1824
+ outdent: "Giảm thụt đầu dòng",
1825
+ undo: "Hoàn tác (Ctrl+Z)",
1826
+ redo: "Làm lại (Ctrl+Y)",
1827
+ hr: "Đường kẻ ngang",
1828
+ link: "Chèn liên kết",
1829
+ image: "Chèn hình ảnh",
1830
+ video: "Chèn video",
1831
+ emoji: "Chèn biểu tượng cảm xúc",
1832
+ icon: "Chèn biểu tượng FA",
1833
+ table: "Chèn bảng",
1834
+ fontSize: "Cỡ chữ",
1835
+ fontSizePlaceholder: "Cỡ",
1836
+ removeFormat: "Xóa định dạng",
1837
+ direction: "Chuyển hướng văn bản (LTR / RTL)",
1838
+ fontFamily: "Phông chữ",
1839
+ paragraphStyle: "Kiểu đoạn văn",
1840
+ paragraphStylePlaceholder: "Kiểu",
1841
+ lineHeight: "Khoảng cách dòng",
1842
+ lineHeightPlaceholder: "↕ Dòng",
1843
+ codeview: "Xem mã HTML",
1844
+ fullscreen: "Toàn màn hình",
1845
+ shortcuts: "Phím tắt (Ctrl+Shift+/)",
1846
+ find: "Tìm kiếm (Ctrl+F)",
1847
+ findReplace: "Tìm & Thay thế (Ctrl+H)",
1848
+ inlineCode: "Mã nội tuyến (Ctrl+`)",
1849
+ print: "In",
1850
+ foreColor: "Màu chữ",
1851
+ backColor: "Màu nền chữ",
1852
+ chooseTextColor: "Chọn màu chữ",
1853
+ chooseHighlightColor: "Chọn màu nền",
1854
+ customColor: "Màu tùy chỉnh",
1855
+ insertTableLabel: "Chèn bảng",
1856
+ paragraphItems: {
1857
+ p: "Bình thường",
1858
+ blockquote: "Trích dẫn",
1859
+ pre: "Mã"
1860
+ }
1861
+ },
1862
+ linkDialog: {
1863
+ ariaLabel: "Chèn liên kết",
1864
+ title: "Chèn liên kết",
1865
+ url: "Địa chỉ URL",
1866
+ urlPlaceholder: "https://",
1867
+ displayText: "Văn bản hiển thị",
1868
+ textPlaceholder: "Nội dung liên kết",
1869
+ openInNewTab: "Mở trong tab mới",
1870
+ insertBtn: "Chèn",
1871
+ cancelBtn: "Hủy"
1872
+ },
1873
+ imageDialog: {
1874
+ ariaLabel: "Chèn hình ảnh",
1875
+ title: "Chèn hình ảnh",
1876
+ imageUrl: "URL hình ảnh",
1877
+ urlPlaceholder: "https://example.com/anh.png",
1878
+ altText: "Văn bản thay thế",
1879
+ altPlaceholder: "Mô tả hình ảnh",
1880
+ alignment: "Căn chỉnh",
1881
+ alignNone: "Không",
1882
+ alignLeft: "Trái",
1883
+ alignCenter: "Giữa",
1884
+ alignRight: "Phải",
1885
+ uploadLabel: "Hoặc tải lên tệp",
1886
+ insertBtn: "Chèn",
1887
+ cancelBtn: "Hủy"
1888
+ },
1889
+ videoDialog: {
1890
+ ariaLabel: "Chèn video",
1891
+ title: "Chèn video",
1892
+ videoUrl: "URL video",
1893
+ urlPlaceholder: "YouTube, Vimeo, hoặc URL .mp4 trực tiếp",
1894
+ widthLabel: "Chiều rộng (px)",
1895
+ widthPlaceholder: "560",
1896
+ insertBtn: "Chèn",
1897
+ cancelBtn: "Hủy",
1898
+ detected: (type) => `Đã phát hiện: ${type}`,
1899
+ unknownFormat: "Định dạng không xác định — sẽ thử nhúng video trực tiếp",
1900
+ invalidUrl: "URL không hợp lệ — vui lòng nhập đường dẫn video hợp lệ."
1901
+ },
1902
+ emojiDialog: {
1903
+ ariaLabel: "Chèn biểu tượng cảm xúc",
1904
+ title: "Chèn biểu tượng cảm xúc",
1905
+ searchPlaceholder: "Tìm kiếm biểu tượng…",
1906
+ all: "Tất cả",
1907
+ cancelBtn: "Hủy",
1908
+ close: "Đóng",
1909
+ categories: {
1910
+ smileys: "Mặt cười",
1911
+ people: "Con người",
1912
+ animals: "Động vật",
1913
+ food: "Thức ăn",
1914
+ travel: "Du lịch",
1915
+ objects: "Đồ vật",
1916
+ symbols: "Ký hiệu"
1917
+ }
1918
+ },
1919
+ iconDialog: {
1920
+ ariaLabel: "Chèn biểu tượng FA",
1921
+ title: "Chèn biểu tượng FA",
1922
+ searchPlaceholder: "Tìm kiếm biểu tượng…",
1923
+ all: "Tất cả",
1924
+ style: "Kiểu",
1925
+ size: "Kích thước",
1926
+ color: "Màu sắc",
1927
+ useColor: " Dùng màu",
1928
+ selectHint: "Chọn một biểu tượng",
1929
+ insertBtn: "Chèn biểu tượng FA",
1930
+ cancelBtn: "Hủy",
1931
+ close: "Đóng",
1932
+ categories: {
1933
+ popular: "Phổ biến",
1934
+ interface: "Giao diện",
1935
+ navigation: "Điều hướng",
1936
+ media: "Phương tiện",
1937
+ communication: "Liên lạc",
1938
+ files: "Tệp tin",
1939
+ people: "Con người",
1940
+ objects: "Đồ vật"
1941
+ }
1942
+ },
1943
+ findReplace: {
1944
+ findTitle: "Tìm kiếm",
1945
+ findReplaceTitle: "Tìm & Thay thế",
1946
+ findPlaceholder: "Tìm…",
1947
+ searchAriaLabel: "Văn bản tìm kiếm",
1948
+ caseSensitive: "\xA0Phân biệt hoa thường",
1949
+ prevBtn: "← Trước",
1950
+ nextBtn: "Tiếp →",
1951
+ replacePlaceholder: "Thay thế bằng…",
1952
+ replaceAriaLabel: "Thay thế bằng",
1953
+ replaceBtn: "Thay thế",
1954
+ replaceAllBtn: "Thay thế tất cả",
1955
+ close: "×"
1956
+ },
1957
+ shortcutsDialog: {
1958
+ title: "Phím tắt bàn phím",
1959
+ ariaLabel: "Phím tắt bàn phím",
1960
+ close: "Đóng",
1961
+ shortcuts: [
1962
+ {
1963
+ category: "Định dạng văn bản",
1964
+ items: [
1965
+ {
1966
+ keys: "Ctrl + B",
1967
+ action: "Đậm"
1968
+ },
1969
+ {
1970
+ keys: "Ctrl + I",
1971
+ action: "Nghiêng"
1972
+ },
1973
+ {
1974
+ keys: "Ctrl + U",
1975
+ action: "Gạch chân"
1976
+ },
1977
+ {
1978
+ keys: "Ctrl + K",
1979
+ action: "Chèn / sửa liên kết"
1980
+ }
1981
+ ]
1982
+ },
1983
+ {
1984
+ category: "Lịch sử",
1985
+ items: [{
1986
+ keys: "Ctrl + Z",
1987
+ action: "Hoàn tác"
1988
+ }, {
1989
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
1990
+ action: "Làm lại"
1991
+ }]
1992
+ },
1993
+ {
1994
+ category: "Chọn & Điều hướng",
1995
+ items: [
1996
+ {
1997
+ keys: "Ctrl + A",
1998
+ action: "Chọn tất cả"
1999
+ },
2000
+ {
2001
+ keys: "Tab",
2002
+ action: "Tăng thụt đầu dòng / chèn khoảng trắng"
2003
+ },
2004
+ {
2005
+ keys: "Shift + Tab",
2006
+ action: "Giảm thụt đầu dòng"
2007
+ }
2008
+ ]
2009
+ },
2010
+ {
2011
+ category: "Bảng nhớ tạm",
2012
+ items: [{
2013
+ keys: "Ctrl + Shift + V",
2014
+ action: "Dán dưới dạng văn bản thuần"
2015
+ }]
2016
+ },
2017
+ {
2018
+ category: "Tìm & Thay thế",
2019
+ items: [{
2020
+ keys: "Ctrl + F",
2021
+ action: "Tìm trong tài liệu"
2022
+ }, {
2023
+ keys: "Ctrl + H",
2024
+ action: "Tìm & Thay thế"
2025
+ }]
2026
+ },
2027
+ {
2028
+ category: "Trình soạn thảo",
2029
+ items: [{
2030
+ keys: "Ctrl + Shift + /",
2031
+ action: "Hiện hộp thoại phím tắt"
2032
+ }]
2033
+ }
2034
+ ]
2035
+ },
2036
+ contextMenu: {
2037
+ cut: "Cắt",
2038
+ copy: "Sao chép",
2039
+ paste: "Dán",
2040
+ bold: "Đậm",
2041
+ italic: "Nghiêng",
2042
+ underline: "Gạch chân",
2043
+ textColor: "Màu chữ",
2044
+ highlightColor: "Màu nền chữ",
2045
+ copyFormat: "Sao chép định dạng",
2046
+ pasteFormat: "Dán định dạng",
2047
+ removeFormat: "Xóa định dạng",
2048
+ link: "Chèn liên kết",
2049
+ image: "Chèn hình ảnh",
2050
+ video: "Chèn video",
2051
+ table: "Chèn bảng",
2052
+ back: "Quay lại",
2053
+ noHighlight: "Không tô màu",
2054
+ customColor: "Màu tùy chỉnh",
2055
+ customColorLabel: "Tùy chỉnh…"
2056
+ },
2057
+ statusbar: {
2058
+ resizeHandle: "Kéo để thay đổi kích thước",
2059
+ words: (n) => `Từ: ${n}`,
2060
+ wordsLimit: (n, max) => `Từ: ${n}/${max}`,
2061
+ chars: (n) => `Ký tự: ${n}`,
2062
+ charsLimit: (n, max) => `Ký tự: ${n}/${max}`
2063
+ },
2064
+ tooltips: {
2065
+ link: {
2066
+ ariaLabel: "Hành động liên kết",
2067
+ openLink: "Mở liên kết",
2068
+ copyUrl: "Sao chép URL",
2069
+ editLink: "Sửa liên kết",
2070
+ removeLink: "Xóa liên kết"
2071
+ },
2072
+ image: {
2073
+ ariaLabel: "Hành động hình ảnh",
2074
+ label: "Hình ảnh",
2075
+ floatLeft: "Nổi trái",
2076
+ noFloat: "Không nổi",
2077
+ alignCenter: "Căn giữa",
2078
+ floatRight: "Nổi phải",
2079
+ originalSize: "Kích thước gốc",
2080
+ rotateLeft: "Xoay trái",
2081
+ rotateRight: "Xoay phải",
2082
+ cropImage: "Cắt ảnh",
2083
+ addCaption: "Thêm / Sửa chú thích",
2084
+ deleteImage: "Xóa hình ảnh"
2085
+ },
2086
+ code: {
2087
+ ariaLabel: "Hành động khối mã",
2088
+ label: "Mã",
2089
+ syntaxLanguage: "Ngôn ngữ cú pháp",
2090
+ syntaxAriaLabel: "Ngôn ngữ cú pháp",
2091
+ copyCode: "Sao chép mã",
2092
+ toggleWordWrap: "Chuyển đổi xuống dòng",
2093
+ enableWordWrap: "Bật xuống dòng",
2094
+ disableWordWrap: "Tắt xuống dòng",
2095
+ convertToParagraph: "Chuyển thành đoạn văn",
2096
+ deleteCodeBlock: "Xóa khối mã"
2097
+ },
2098
+ table: {
2099
+ ariaLabel: "Hành động bảng",
2100
+ label: "Bảng",
2101
+ selectCells: "Chọn ô",
2102
+ addRowAbove: "Thêm hàng phía trên",
2103
+ addRowBelow: "Thêm hàng phía dưới",
2104
+ deleteRow: "Xóa hàng",
2105
+ addColumnLeft: "Thêm cột bên trái",
2106
+ addColumnRight: "Thêm cột bên phải",
2107
+ deleteColumn: "Xóa cột",
2108
+ mergeCells: "Gộp ô",
2109
+ unmergeCells: "Tách ô",
2110
+ columnWidth: "Chiều rộng cột",
2111
+ rowHeight: "Chiều cao hàng",
2112
+ tableBorderWidth: "Độ rộng viền bảng",
2113
+ deleteTable: "Xóa bảng",
2114
+ columnWidthPx: "Chiều rộng cột (px)",
2115
+ rowHeightPx: "Chiều cao hàng (px)",
2116
+ tableBorderWidthPx: "Độ rộng viền bảng (px)",
2117
+ cancelBtn: "Hủy",
2118
+ applyBtn: "Áp dụng"
2119
+ },
2120
+ video: {
2121
+ ariaLabel: "Hành động video",
2122
+ label: "Video",
2123
+ floatLeft: "Nổi trái",
2124
+ noFloat: "Không nổi",
2125
+ alignCenter: "Căn giữa",
2126
+ floatRight: "Nổi phải",
2127
+ originalSize: "Kích thước gốc",
2128
+ previewVideo: "Xem trước",
2129
+ exitPreview: "Thoát xem trước",
2130
+ deleteVideo: "Xóa video"
2131
+ }
2132
+ },
2133
+ errors: {
2134
+ imageFormat: (type) => `Đị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.`,
2135
+ imageSize: (maxSize) => `Tệp hình ảnh quá lớn. Kích thước tối đa cho phép là ${maxSize} MB.`
2136
+ }
2137
+ },
2138
+ ja: {
2139
+ toolbar: {
2140
+ bold: "太字 (Ctrl+B)",
2141
+ italic: "斜体 (Ctrl+I)",
2142
+ underline: "下線 (Ctrl+U)",
2143
+ strikethrough: "取り消し線",
2144
+ superscript: "上付き文字",
2145
+ subscript: "下付き文字",
2146
+ alignLeft: "左揃え",
2147
+ alignCenter: "中央揃え",
2148
+ alignRight: "右揃え",
2149
+ alignJustify: "両端揃え",
2150
+ ul: "箇条書きリスト",
2151
+ ol: "番号付きリスト",
2152
+ checklist: "チェックリスト",
2153
+ indent: "インデントを増やす",
2154
+ outdent: "インデントを減らす",
2155
+ undo: "元に戻す (Ctrl+Z)",
2156
+ redo: "やり直す (Ctrl+Y)",
2157
+ hr: "水平線",
2158
+ link: "リンクを挿入",
2159
+ image: "画像を挿入",
2160
+ video: "動画を挿入",
2161
+ emoji: "絵文字を挿入",
2162
+ icon: "FAアイコンを挿入",
2163
+ table: "テーブルを挿入",
2164
+ fontSize: "フォントサイズ",
2165
+ fontSizePlaceholder: "サイズ",
2166
+ removeFormat: "書式をリセット",
2167
+ direction: "文字方向を切り替え (LTR / RTL)",
2168
+ fontFamily: "フォント",
2169
+ paragraphStyle: "段落スタイル",
2170
+ paragraphStylePlaceholder: "スタイル",
2171
+ lineHeight: "行の高さ",
2172
+ lineHeightPlaceholder: "↕ 行間",
2173
+ codeview: "HTMLソースを表示",
2174
+ fullscreen: "全画面表示",
2175
+ shortcuts: "キーボードショートカット (Ctrl+Shift+/)",
2176
+ find: "検索 (Ctrl+F)",
2177
+ findReplace: "検索と置換 (Ctrl+H)",
2178
+ inlineCode: "インラインコード (Ctrl+`)",
2179
+ print: "印刷",
2180
+ foreColor: "文字色",
2181
+ backColor: "ハイライト色",
2182
+ chooseTextColor: "文字色を選択",
2183
+ chooseHighlightColor: "ハイライト色を選択",
2184
+ customColor: "カスタムカラー",
2185
+ insertTableLabel: "テーブルを挿入",
2186
+ paragraphItems: {
2187
+ p: "標準",
2188
+ blockquote: "引用",
2189
+ pre: "コード"
2190
+ }
2191
+ },
2192
+ linkDialog: {
2193
+ ariaLabel: "リンクを挿入",
2194
+ title: "リンクを挿入",
2195
+ url: "URL",
2196
+ urlPlaceholder: "https://",
2197
+ displayText: "表示テキスト",
2198
+ textPlaceholder: "リンクテキスト",
2199
+ openInNewTab: "新しいタブで開く",
2200
+ insertBtn: "挿入",
2201
+ cancelBtn: "キャンセル"
2202
+ },
2203
+ imageDialog: {
2204
+ ariaLabel: "画像を挿入",
2205
+ title: "画像を挿入",
2206
+ imageUrl: "画像URL",
2207
+ urlPlaceholder: "https://example.com/image.png",
2208
+ altText: "代替テキスト",
2209
+ altPlaceholder: "画像の説明",
2210
+ alignment: "配置",
2211
+ alignNone: "なし",
2212
+ alignLeft: "左",
2213
+ alignCenter: "中央",
2214
+ alignRight: "右",
2215
+ uploadLabel: "ファイルをアップロード",
2216
+ insertBtn: "挿入",
2217
+ cancelBtn: "キャンセル"
2218
+ },
2219
+ videoDialog: {
2220
+ ariaLabel: "動画を挿入",
2221
+ title: "動画を挿入",
2222
+ videoUrl: "動画URL",
2223
+ urlPlaceholder: "YouTube、Vimeo、または直接動画URL",
2224
+ widthLabel: "幅 (px)",
2225
+ widthPlaceholder: "560",
2226
+ insertBtn: "挿入",
2227
+ cancelBtn: "キャンセル",
2228
+ detected: (type) => `検出: ${type}`,
2229
+ unknownFormat: "不明な形式 — 直接動画埋め込みを試みます",
2230
+ invalidUrl: "URLが無効です — 有効な動画URLを入力してください。"
2231
+ },
2232
+ emojiDialog: {
2233
+ ariaLabel: "絵文字を挿入",
2234
+ title: "絵文字を挿入",
2235
+ searchPlaceholder: "絵文字を検索…",
2236
+ all: "すべて",
2237
+ cancelBtn: "キャンセル",
2238
+ close: "閉じる",
2239
+ categories: {
2240
+ smileys: "顔文字",
2241
+ people: "人物",
2242
+ animals: "動物",
2243
+ food: "食べ物",
2244
+ travel: "旅行",
2245
+ objects: "モノ",
2246
+ symbols: "記号"
2247
+ }
2248
+ },
2249
+ iconDialog: {
2250
+ ariaLabel: "FAアイコンを挿入",
2251
+ title: "FAアイコンを挿入",
2252
+ searchPlaceholder: "アイコンを検索…",
2253
+ all: "すべて",
2254
+ style: "スタイル",
2255
+ size: "サイズ",
2256
+ color: "カラー",
2257
+ useColor: " カラーを使用",
2258
+ selectHint: "アイコンを選択してください",
2259
+ insertBtn: "FAアイコンを挿入",
2260
+ cancelBtn: "キャンセル",
2261
+ close: "閉じる",
2262
+ categories: {
2263
+ popular: "人気",
2264
+ interface: "インターフェース",
2265
+ navigation: "ナビゲーション",
2266
+ media: "メディア",
2267
+ communication: "通信",
2268
+ files: "ファイル",
2269
+ people: "人物",
2270
+ objects: "モノ"
2271
+ }
2272
+ },
2273
+ findReplace: {
2274
+ findTitle: "検索",
2275
+ findReplaceTitle: "検索と置換",
2276
+ findPlaceholder: "検索…",
2277
+ searchAriaLabel: "検索テキスト",
2278
+ caseSensitive: "\xA0大文字/小文字を区別",
2279
+ prevBtn: "← 前へ",
2280
+ nextBtn: "次へ →",
2281
+ replacePlaceholder: "置換後…",
2282
+ replaceAriaLabel: "置換後のテキスト",
2283
+ replaceBtn: "置換",
2284
+ replaceAllBtn: "すべて置換",
2285
+ close: "×"
2286
+ },
2287
+ shortcutsDialog: {
2288
+ title: "キーボードショートカット",
2289
+ ariaLabel: "キーボードショートカット",
2290
+ close: "閉じる",
2291
+ shortcuts: [
2292
+ {
2293
+ category: "テキスト書式",
2294
+ items: [
2295
+ {
2296
+ keys: "Ctrl + B",
2297
+ action: "太字"
2298
+ },
2299
+ {
2300
+ keys: "Ctrl + I",
2301
+ action: "斜体"
2302
+ },
2303
+ {
2304
+ keys: "Ctrl + U",
2305
+ action: "下線"
2306
+ },
2307
+ {
2308
+ keys: "Ctrl + K",
2309
+ action: "リンクの挿入 / 編集"
2310
+ }
2311
+ ]
2312
+ },
2313
+ {
2314
+ category: "履歴",
2315
+ items: [{
2316
+ keys: "Ctrl + Z",
2317
+ action: "元に戻す"
2318
+ }, {
2319
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
2320
+ action: "やり直す"
2321
+ }]
2322
+ },
2323
+ {
2324
+ category: "選択と移動",
2325
+ items: [
2326
+ {
2327
+ keys: "Ctrl + A",
2328
+ action: "すべて選択"
2329
+ },
2330
+ {
2331
+ keys: "Tab",
2332
+ action: "インデント増加 / スペース挿入"
2333
+ },
2334
+ {
2335
+ keys: "Shift + Tab",
2336
+ action: "インデント減少"
2337
+ }
2338
+ ]
2339
+ },
2340
+ {
2341
+ category: "クリップボード",
2342
+ items: [{
2343
+ keys: "Ctrl + Shift + V",
2344
+ action: "プレーンテキストとして貼り付け"
2345
+ }]
2346
+ },
2347
+ {
2348
+ category: "検索と置換",
2349
+ items: [{
2350
+ keys: "Ctrl + F",
2351
+ action: "文書内を検索"
2352
+ }, {
2353
+ keys: "Ctrl + H",
2354
+ action: "検索と置換"
2355
+ }]
2356
+ },
2357
+ {
2358
+ category: "エディター",
2359
+ items: [{
2360
+ keys: "Ctrl + Shift + /",
2361
+ action: "ショートカットダイアログを表示"
2362
+ }]
2363
+ }
2364
+ ]
2365
+ },
2366
+ contextMenu: {
2367
+ cut: "切り取り",
2368
+ copy: "コピー",
2369
+ paste: "貼り付け",
2370
+ bold: "太字",
2371
+ italic: "斜体",
2372
+ underline: "下線",
2373
+ textColor: "文字色",
2374
+ highlightColor: "ハイライト色",
2375
+ copyFormat: "書式をコピー",
2376
+ pasteFormat: "書式を貼り付け",
2377
+ removeFormat: "書式をリセット",
2378
+ link: "リンクを挿入",
2379
+ image: "画像を挿入",
2380
+ video: "動画を挿入",
2381
+ table: "テーブルを挿入",
2382
+ back: "戻る",
2383
+ noHighlight: "ハイライトなし",
2384
+ customColor: "カスタムカラー",
2385
+ customColorLabel: "カスタム…"
2386
+ },
2387
+ statusbar: {
2388
+ resizeHandle: "ドラッグしてリサイズ",
2389
+ words: (n) => `単語数: ${n}`,
2390
+ wordsLimit: (n, max) => `単語数: ${n}/${max}`,
2391
+ chars: (n) => `文字数: ${n}`,
2392
+ charsLimit: (n, max) => `文字数: ${n}/${max}`
2393
+ },
2394
+ tooltips: {
2395
+ link: {
2396
+ ariaLabel: "リンク操作",
2397
+ openLink: "リンクを開く",
2398
+ copyUrl: "URLをコピー",
2399
+ editLink: "リンクを編集",
2400
+ removeLink: "リンクを削除"
2401
+ },
2402
+ image: {
2403
+ ariaLabel: "画像操作",
2404
+ label: "画像",
2405
+ floatLeft: "左に回り込み",
2406
+ noFloat: "回り込みなし",
2407
+ alignCenter: "中央揃え",
2408
+ floatRight: "右に回り込み",
2409
+ originalSize: "元のサイズ",
2410
+ rotateLeft: "左に回転",
2411
+ rotateRight: "右に回転",
2412
+ cropImage: "画像をトリミング",
2413
+ addCaption: "キャプションを追加 / 編集",
2414
+ deleteImage: "画像を削除"
2415
+ },
2416
+ code: {
2417
+ ariaLabel: "コードブロック操作",
2418
+ label: "コード",
2419
+ syntaxLanguage: "言語",
2420
+ syntaxAriaLabel: "構文言語",
2421
+ copyCode: "コードをコピー",
2422
+ toggleWordWrap: "折り返しを切り替え",
2423
+ enableWordWrap: "折り返しを有効にする",
2424
+ disableWordWrap: "折り返しを無効にする",
2425
+ convertToParagraph: "段落に変換",
2426
+ deleteCodeBlock: "コードブロックを削除"
2427
+ },
2428
+ table: {
2429
+ ariaLabel: "テーブル操作",
2430
+ label: "テーブル",
2431
+ selectCells: "セルを選択",
2432
+ addRowAbove: "上に行を追加",
2433
+ addRowBelow: "下に行を追加",
2434
+ deleteRow: "行を削除",
2435
+ addColumnLeft: "左に列を追加",
2436
+ addColumnRight: "右に列を追加",
2437
+ deleteColumn: "列を削除",
2438
+ mergeCells: "セルを結合",
2439
+ unmergeCells: "セルの結合を解除",
2440
+ columnWidth: "列幅",
2441
+ rowHeight: "行の高さ",
2442
+ tableBorderWidth: "テーブルの枠幅",
2443
+ deleteTable: "テーブルを削除",
2444
+ columnWidthPx: "列幅 (px)",
2445
+ rowHeightPx: "行の高さ (px)",
2446
+ tableBorderWidthPx: "テーブルの枠幅 (px)",
2447
+ cancelBtn: "キャンセル",
2448
+ applyBtn: "適用"
2449
+ },
2450
+ video: {
2451
+ ariaLabel: "動画操作",
2452
+ label: "動画",
2453
+ floatLeft: "左に回り込み",
2454
+ noFloat: "回り込みなし",
2455
+ alignCenter: "中央揃え",
2456
+ floatRight: "右に回り込み",
2457
+ originalSize: "元のサイズ",
2458
+ previewVideo: "プレビュー",
2459
+ exitPreview: "プレビューを終了",
2460
+ deleteVideo: "動画を削除"
2461
+ }
2462
+ },
2463
+ errors: {
2464
+ imageFormat: (type) => `形式 "${type}" はブラウザでの表示をサポートしていません。JPEG、PNG、または WebP に変換してください。`,
2465
+ imageSize: (maxSize) => `画像ファイルが大きすぎます。最大許容サイズは ${maxSize} MB です。`
2466
+ }
2467
+ },
2468
+ zh: {
2469
+ toolbar: {
2470
+ bold: "粗体 (Ctrl+B)",
2471
+ italic: "斜体 (Ctrl+I)",
2472
+ underline: "下划线 (Ctrl+U)",
2473
+ strikethrough: "删除线",
2474
+ superscript: "上标",
2475
+ subscript: "下标",
2476
+ alignLeft: "左对齐",
2477
+ alignCenter: "居中",
2478
+ alignRight: "右对齐",
2479
+ alignJustify: "两端对齐",
2480
+ ul: "无序列表",
2481
+ ol: "有序列表",
2482
+ checklist: "待办列表",
2483
+ indent: "增加缩进",
2484
+ outdent: "减少缩进",
2485
+ undo: "撤销 (Ctrl+Z)",
2486
+ redo: "重做 (Ctrl+Y)",
2487
+ hr: "水平分割线",
2488
+ link: "插入链接",
2489
+ image: "插入图片",
2490
+ video: "插入视频",
2491
+ emoji: "插入表情",
2492
+ icon: "插入 FA 图标",
2493
+ table: "插入表格",
2494
+ fontSize: "字号",
2495
+ fontSizePlaceholder: "大小",
2496
+ removeFormat: "清除格式",
2497
+ direction: "切换文字方向 (LTR / RTL)",
2498
+ fontFamily: "字体",
2499
+ paragraphStyle: "段落样式",
2500
+ paragraphStylePlaceholder: "样式",
2501
+ lineHeight: "行高",
2502
+ lineHeightPlaceholder: "↕ 行距",
2503
+ codeview: "查看 HTML 源码",
2504
+ fullscreen: "全屏",
2505
+ shortcuts: "键盘快捷键 (Ctrl+Shift+/)",
2506
+ find: "搜索 (Ctrl+F)",
2507
+ findReplace: "查找和替换 (Ctrl+H)",
2508
+ inlineCode: "行内代码 (Ctrl+`)",
2509
+ print: "打印",
2510
+ foreColor: "文字颜色",
2511
+ backColor: "高亮颜色",
2512
+ chooseTextColor: "选择文字颜色",
2513
+ chooseHighlightColor: "选择高亮颜色",
2514
+ customColor: "自定义颜色",
2515
+ insertTableLabel: "插入表格",
2516
+ paragraphItems: {
2517
+ p: "正文",
2518
+ blockquote: "引用",
2519
+ pre: "代码"
2520
+ }
2521
+ },
2522
+ linkDialog: {
2523
+ ariaLabel: "插入链接",
2524
+ title: "插入链接",
2525
+ url: "链接地址",
2526
+ urlPlaceholder: "https://",
2527
+ displayText: "显示文字",
2528
+ textPlaceholder: "链接文字",
2529
+ openInNewTab: "在新标签页中打开",
2530
+ insertBtn: "插入",
2531
+ cancelBtn: "取消"
2532
+ },
2533
+ imageDialog: {
2534
+ ariaLabel: "插入图片",
2535
+ title: "插入图片",
2536
+ imageUrl: "图片地址",
2537
+ urlPlaceholder: "https://example.com/image.png",
2538
+ altText: "替代文字",
2539
+ altPlaceholder: "图片描述",
2540
+ alignment: "对齐方式",
2541
+ alignNone: "无",
2542
+ alignLeft: "左",
2543
+ alignCenter: "居中",
2544
+ alignRight: "右",
2545
+ uploadLabel: "或上传文件",
2546
+ insertBtn: "插入",
2547
+ cancelBtn: "取消"
2548
+ },
2549
+ videoDialog: {
2550
+ ariaLabel: "插入视频",
2551
+ title: "插入视频",
2552
+ videoUrl: "视频地址",
2553
+ urlPlaceholder: "YouTube、Vimeo 或直接 .mp4 链接",
2554
+ widthLabel: "宽度 (px)",
2555
+ widthPlaceholder: "560",
2556
+ insertBtn: "插入",
2557
+ cancelBtn: "取消",
2558
+ detected: (type) => `已识别: ${type}`,
2559
+ unknownFormat: "未知格式 — 将尝试直接嵌入视频",
2560
+ invalidUrl: "URL 无效 — 请输入有效的视频链接。"
2561
+ },
2562
+ emojiDialog: {
2563
+ ariaLabel: "插入表情",
2564
+ title: "插入表情",
2565
+ searchPlaceholder: "搜索表情…",
2566
+ all: "全部",
2567
+ cancelBtn: "取消",
2568
+ close: "关闭",
2569
+ categories: {
2570
+ smileys: "笑脸",
2571
+ people: "人物",
2572
+ animals: "动物",
2573
+ food: "食物",
2574
+ travel: "旅行",
2575
+ objects: "物品",
2576
+ symbols: "符号"
2577
+ }
2578
+ },
2579
+ iconDialog: {
2580
+ ariaLabel: "插入 FA 图标",
2581
+ title: "插入 FA 图标",
2582
+ searchPlaceholder: "搜索图标…",
2583
+ all: "全部",
2584
+ style: "样式",
2585
+ size: "大小",
2586
+ color: "颜色",
2587
+ useColor: " 使用颜色",
2588
+ selectHint: "请选择一个图标",
2589
+ insertBtn: "插入 FA 图标",
2590
+ cancelBtn: "取消",
2591
+ close: "关闭",
2592
+ categories: {
2593
+ popular: "热门",
2594
+ interface: "界面",
2595
+ navigation: "导航",
2596
+ media: "媒体",
2597
+ communication: "通讯",
2598
+ files: "文件",
2599
+ people: "人物",
2600
+ objects: "物品"
2601
+ }
2602
+ },
2603
+ findReplace: {
2604
+ findTitle: "搜索",
2605
+ findReplaceTitle: "查找和替换",
2606
+ findPlaceholder: "查找…",
2607
+ searchAriaLabel: "搜索文字",
2608
+ caseSensitive: "\xA0区分大小写",
2609
+ prevBtn: "← 上一个",
2610
+ nextBtn: "下一个 →",
2611
+ replacePlaceholder: "替换为…",
2612
+ replaceAriaLabel: "替换为",
2613
+ replaceBtn: "替换",
2614
+ replaceAllBtn: "全部替换",
2615
+ close: "×"
2616
+ },
2617
+ shortcutsDialog: {
2618
+ title: "键盘快捷键",
2619
+ ariaLabel: "键盘快捷键",
2620
+ close: "关闭",
2621
+ shortcuts: [
2622
+ {
2623
+ category: "文字格式",
2624
+ items: [
2625
+ {
2626
+ keys: "Ctrl + B",
2627
+ action: "粗体"
2628
+ },
2629
+ {
2630
+ keys: "Ctrl + I",
2631
+ action: "斜体"
2632
+ },
2633
+ {
2634
+ keys: "Ctrl + U",
2635
+ action: "下划线"
2636
+ },
2637
+ {
2638
+ keys: "Ctrl + K",
2639
+ action: "插入 / 编辑链接"
2640
+ }
2641
+ ]
2642
+ },
2643
+ {
2644
+ category: "历史记录",
2645
+ items: [{
2646
+ keys: "Ctrl + Z",
2647
+ action: "撤销"
2648
+ }, {
2649
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
2650
+ action: "重做"
2651
+ }]
2652
+ },
2653
+ {
2654
+ category: "选择与导航",
2655
+ items: [
2656
+ {
2657
+ keys: "Ctrl + A",
2658
+ action: "全选"
2659
+ },
2660
+ {
2661
+ keys: "Tab",
2662
+ action: "增加缩进 / 插入空格"
2663
+ },
2664
+ {
2665
+ keys: "Shift + Tab",
2666
+ action: "减少缩进"
2667
+ }
2668
+ ]
2669
+ },
2670
+ {
2671
+ category: "剪贴板",
2672
+ items: [{
2673
+ keys: "Ctrl + Shift + V",
2674
+ action: "粘贴为纯文本"
2675
+ }]
2676
+ },
2677
+ {
2678
+ category: "查找和替换",
2679
+ items: [{
2680
+ keys: "Ctrl + F",
2681
+ action: "在文档中搜索"
2682
+ }, {
2683
+ keys: "Ctrl + H",
2684
+ action: "查找和替换"
2685
+ }]
2686
+ },
2687
+ {
2688
+ category: "编辑器",
2689
+ items: [{
2690
+ keys: "Ctrl + Shift + /",
2691
+ action: "显示快捷键对话框"
2692
+ }]
2693
+ }
2694
+ ]
2695
+ },
2696
+ contextMenu: {
2697
+ cut: "剪切",
2698
+ copy: "复制",
2699
+ paste: "粘贴",
2700
+ bold: "粗体",
2701
+ italic: "斜体",
2702
+ underline: "下划线",
2703
+ textColor: "文字颜色",
2704
+ highlightColor: "高亮颜色",
2705
+ copyFormat: "复制格式",
2706
+ pasteFormat: "粘贴格式",
2707
+ removeFormat: "清除格式",
2708
+ link: "插入链接",
2709
+ image: "插入图片",
2710
+ video: "插入视频",
2711
+ table: "插入表格",
2712
+ back: "返回",
2713
+ noHighlight: "无高亮",
2714
+ customColor: "自定义颜色",
2715
+ customColorLabel: "自定义…"
2716
+ },
2717
+ statusbar: {
2718
+ resizeHandle: "拖动以调整大小",
2719
+ words: (n) => `字数: ${n}`,
2720
+ wordsLimit: (n, max) => `字数: ${n}/${max}`,
2721
+ chars: (n) => `字符数: ${n}`,
2722
+ charsLimit: (n, max) => `字符数: ${n}/${max}`
2723
+ },
2724
+ tooltips: {
2725
+ link: {
2726
+ ariaLabel: "链接操作",
2727
+ openLink: "打开链接",
2728
+ copyUrl: "复制 URL",
2729
+ editLink: "编辑链接",
2730
+ removeLink: "删除链接"
2731
+ },
2732
+ image: {
2733
+ ariaLabel: "图片操作",
2734
+ label: "图片",
2735
+ floatLeft: "左浮动",
2736
+ noFloat: "不浮动",
2737
+ alignCenter: "居中对齐",
2738
+ floatRight: "右浮动",
2739
+ originalSize: "原始尺寸",
2740
+ rotateLeft: "向左旋转",
2741
+ rotateRight: "向右旋转",
2742
+ cropImage: "裁剪图片",
2743
+ addCaption: "添加 / 编辑说明",
2744
+ deleteImage: "删除图片"
2745
+ },
2746
+ code: {
2747
+ ariaLabel: "代码块操作",
2748
+ label: "代码",
2749
+ syntaxLanguage: "语法语言",
2750
+ syntaxAriaLabel: "语法语言",
2751
+ copyCode: "复制代码",
2752
+ toggleWordWrap: "切换自动换行",
2753
+ enableWordWrap: "启用自动换行",
2754
+ disableWordWrap: "禁用自动换行",
2755
+ convertToParagraph: "转换为段落",
2756
+ deleteCodeBlock: "删除代码块"
2757
+ },
2758
+ table: {
2759
+ ariaLabel: "表格操作",
2760
+ label: "表格",
2761
+ selectCells: "选择单元格",
2762
+ addRowAbove: "在上方插入行",
2763
+ addRowBelow: "在下方插入行",
2764
+ deleteRow: "删除行",
2765
+ addColumnLeft: "在左侧插入列",
2766
+ addColumnRight: "在右侧插入列",
2767
+ deleteColumn: "删除列",
2768
+ mergeCells: "合并单元格",
2769
+ unmergeCells: "拆分单元格",
2770
+ columnWidth: "列宽",
2771
+ rowHeight: "行高",
2772
+ tableBorderWidth: "表格边框宽度",
2773
+ deleteTable: "删除表格",
2774
+ columnWidthPx: "列宽 (px)",
2775
+ rowHeightPx: "行高 (px)",
2776
+ tableBorderWidthPx: "表格边框宽度 (px)",
2777
+ cancelBtn: "取消",
2778
+ applyBtn: "应用"
2779
+ },
2780
+ video: {
2781
+ ariaLabel: "视频操作",
2782
+ label: "视频",
2783
+ floatLeft: "左浮动",
2784
+ noFloat: "不浮动",
2785
+ alignCenter: "居中对齐",
2786
+ floatRight: "右浮动",
2787
+ originalSize: "原始尺寸",
2788
+ previewVideo: "预览视频",
2789
+ exitPreview: "退出预览",
2790
+ deleteVideo: "删除视频"
2791
+ }
2792
+ },
2793
+ errors: {
2794
+ imageFormat: (type) => `格式 "${type}" 不支持在浏览器中显示。请转换为 JPEG、PNG 或 WebP。`,
2795
+ imageSize: (maxSize) => `图片文件过大。最大允许大小为 ${maxSize} MB。`
2796
+ }
2797
+ },
2798
+ fr: {
2799
+ toolbar: {
2800
+ bold: "Gras (Ctrl+B)",
2801
+ italic: "Italique (Ctrl+I)",
2802
+ underline: "Souligné (Ctrl+U)",
2803
+ strikethrough: "Barré",
2804
+ superscript: "Exposant",
2805
+ subscript: "Indice",
2806
+ alignLeft: "Aligner à gauche",
2807
+ alignCenter: "Centrer",
2808
+ alignRight: "Aligner à droite",
2809
+ alignJustify: "Justifier",
2810
+ ul: "Liste à puces",
2811
+ ol: "Liste numérotée",
2812
+ checklist: "Liste de tâches",
2813
+ indent: "Augmenter le retrait",
2814
+ outdent: "Diminuer le retrait",
2815
+ undo: "Annuler (Ctrl+Z)",
2816
+ redo: "Rétablir (Ctrl+Y)",
2817
+ hr: "Ligne horizontale",
2818
+ link: "Insérer un lien",
2819
+ image: "Insérer une image",
2820
+ video: "Insérer une vidéo",
2821
+ emoji: "Insérer un emoji",
2822
+ icon: "Insérer une icône FA",
2823
+ table: "Insérer un tableau",
2824
+ fontSize: "Taille de police",
2825
+ fontSizePlaceholder: "Taille",
2826
+ removeFormat: "Effacer la mise en forme",
2827
+ direction: "Basculer la direction du texte (LTR / RTL)",
2828
+ fontFamily: "Police",
2829
+ paragraphStyle: "Style de paragraphe",
2830
+ paragraphStylePlaceholder: "Style",
2831
+ lineHeight: "Interligne",
2832
+ lineHeightPlaceholder: "↕ Ligne",
2833
+ codeview: "Afficher le code HTML",
2834
+ fullscreen: "Plein écran",
2835
+ shortcuts: "Raccourcis clavier (Ctrl+Shift+/)",
2836
+ find: "Rechercher (Ctrl+F)",
2837
+ findReplace: "Rechercher et remplacer (Ctrl+H)",
2838
+ inlineCode: "Code inline (Ctrl+`)",
2839
+ print: "Imprimer",
2840
+ foreColor: "Couleur du texte",
2841
+ backColor: "Couleur de surbrillance",
2842
+ chooseTextColor: "Choisir la couleur du texte",
2843
+ chooseHighlightColor: "Choisir la couleur de surbrillance",
2844
+ customColor: "Couleur personnalisée",
2845
+ insertTableLabel: "Insérer un tableau",
2846
+ paragraphItems: {
2847
+ p: "Normal",
2848
+ blockquote: "Citation",
2849
+ pre: "Code"
2850
+ }
2851
+ },
2852
+ linkDialog: {
2853
+ ariaLabel: "Insérer un lien",
2854
+ title: "Insérer un lien",
2855
+ url: "URL",
2856
+ urlPlaceholder: "https://",
2857
+ displayText: "Texte affiché",
2858
+ textPlaceholder: "Texte du lien",
2859
+ openInNewTab: "Ouvrir dans un nouvel onglet",
2860
+ insertBtn: "Insérer",
2861
+ cancelBtn: "Annuler"
2862
+ },
2863
+ imageDialog: {
2864
+ ariaLabel: "Insérer une image",
2865
+ title: "Insérer une image",
2866
+ imageUrl: "URL de l'image",
2867
+ urlPlaceholder: "https://example.com/image.png",
2868
+ altText: "Texte alternatif",
2869
+ altPlaceholder: "Description de l'image",
2870
+ alignment: "Alignement",
2871
+ alignNone: "Aucun",
2872
+ alignLeft: "Gauche",
2873
+ alignCenter: "Centre",
2874
+ alignRight: "Droite",
2875
+ uploadLabel: "Ou téléverser un fichier",
2876
+ insertBtn: "Insérer",
2877
+ cancelBtn: "Annuler"
2878
+ },
2879
+ videoDialog: {
2880
+ ariaLabel: "Insérer une vidéo",
2881
+ title: "Insérer une vidéo",
2882
+ videoUrl: "URL de la vidéo",
2883
+ urlPlaceholder: "YouTube, Vimeo ou URL .mp4 directe",
2884
+ widthLabel: "Largeur (px)",
2885
+ widthPlaceholder: "560",
2886
+ insertBtn: "Insérer",
2887
+ cancelBtn: "Annuler",
2888
+ detected: (type) => `Détecté\u00a0: ${type}`,
2889
+ unknownFormat: "Format inconnu — tentative d'intégration directe",
2890
+ invalidUrl: "URL invalide — veuillez saisir un lien vidéo valide."
2891
+ },
2892
+ emojiDialog: {
2893
+ ariaLabel: "Insérer un emoji",
2894
+ title: "Insérer un emoji",
2895
+ searchPlaceholder: "Rechercher des emojis…",
2896
+ all: "Tout",
2897
+ cancelBtn: "Annuler",
2898
+ close: "Fermer",
2899
+ categories: {
2900
+ smileys: "Smileys",
2901
+ people: "Personnes",
2902
+ animals: "Animaux",
2903
+ food: "Nourriture",
2904
+ travel: "Voyage",
2905
+ objects: "Objets",
2906
+ symbols: "Symboles"
2907
+ }
2908
+ },
2909
+ iconDialog: {
2910
+ ariaLabel: "Insérer une icône FA",
2911
+ title: "Insérer une icône FA",
2912
+ searchPlaceholder: "Rechercher des icônes…",
2913
+ all: "Tout",
2914
+ style: "Style",
2915
+ size: "Taille",
2916
+ color: "Couleur",
2917
+ useColor: " Utiliser la couleur",
2918
+ selectHint: "Sélectionner une icône",
2919
+ insertBtn: "Insérer une icône FA",
2920
+ cancelBtn: "Annuler",
2921
+ close: "Fermer",
2922
+ categories: {
2923
+ popular: "Populaire",
2924
+ interface: "Interface",
2925
+ navigation: "Navigation",
2926
+ media: "Média",
2927
+ communication: "Communication",
2928
+ files: "Fichiers",
2929
+ people: "Personnes",
2930
+ objects: "Objets"
2931
+ }
2932
+ },
2933
+ findReplace: {
2934
+ findTitle: "Rechercher",
2935
+ findReplaceTitle: "Rechercher et remplacer",
2936
+ findPlaceholder: "Rechercher…",
2937
+ searchAriaLabel: "Texte à rechercher",
2938
+ caseSensitive: "\xA0Respecter la casse",
2939
+ prevBtn: "← Préc.",
2940
+ nextBtn: "Suiv. →",
2941
+ replacePlaceholder: "Remplacer par…",
2942
+ replaceAriaLabel: "Remplacer par",
2943
+ replaceBtn: "Remplacer",
2944
+ replaceAllBtn: "Tout remplacer",
2945
+ close: "×"
2946
+ },
2947
+ shortcutsDialog: {
2948
+ title: "Raccourcis clavier",
2949
+ ariaLabel: "Raccourcis clavier",
2950
+ close: "Fermer",
2951
+ shortcuts: [
2952
+ {
2953
+ category: "Mise en forme du texte",
2954
+ items: [
2955
+ {
2956
+ keys: "Ctrl + B",
2957
+ action: "Gras"
2958
+ },
2959
+ {
2960
+ keys: "Ctrl + I",
2961
+ action: "Italique"
2962
+ },
2963
+ {
2964
+ keys: "Ctrl + U",
2965
+ action: "Souligné"
2966
+ },
2967
+ {
2968
+ keys: "Ctrl + K",
2969
+ action: "Insérer / modifier un lien"
2970
+ }
2971
+ ]
2972
+ },
2973
+ {
2974
+ category: "Historique",
2975
+ items: [{
2976
+ keys: "Ctrl + Z",
2977
+ action: "Annuler"
2978
+ }, {
2979
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
2980
+ action: "Rétablir"
2981
+ }]
2982
+ },
2983
+ {
2984
+ category: "Sélection et navigation",
2985
+ items: [
2986
+ {
2987
+ keys: "Ctrl + A",
2988
+ action: "Tout sélectionner"
2989
+ },
2990
+ {
2991
+ keys: "Tab",
2992
+ action: "Augmenter le retrait / insérer des espaces"
2993
+ },
2994
+ {
2995
+ keys: "Shift + Tab",
2996
+ action: "Diminuer le retrait"
2997
+ }
2998
+ ]
2999
+ },
3000
+ {
3001
+ category: "Presse-papiers",
3002
+ items: [{
3003
+ keys: "Ctrl + Shift + V",
3004
+ action: "Coller en texte brut"
3005
+ }]
3006
+ },
3007
+ {
3008
+ category: "Rechercher et remplacer",
3009
+ items: [{
3010
+ keys: "Ctrl + F",
3011
+ action: "Rechercher dans le document"
3012
+ }, {
3013
+ keys: "Ctrl + H",
3014
+ action: "Rechercher et remplacer"
3015
+ }]
3016
+ },
3017
+ {
3018
+ category: "Éditeur",
3019
+ items: [{
3020
+ keys: "Ctrl + Shift + /",
3021
+ action: "Afficher les raccourcis clavier"
3022
+ }]
3023
+ }
3024
+ ]
3025
+ },
3026
+ contextMenu: {
3027
+ cut: "Couper",
3028
+ copy: "Copier",
3029
+ paste: "Coller",
3030
+ bold: "Gras",
3031
+ italic: "Italique",
3032
+ underline: "Souligné",
3033
+ textColor: "Couleur du texte",
3034
+ highlightColor: "Couleur de surbrillance",
3035
+ copyFormat: "Copier la mise en forme",
3036
+ pasteFormat: "Coller la mise en forme",
3037
+ removeFormat: "Effacer la mise en forme",
3038
+ link: "Insérer un lien",
3039
+ image: "Insérer une image",
3040
+ video: "Insérer une vidéo",
3041
+ table: "Insérer un tableau",
3042
+ back: "Retour",
3043
+ noHighlight: "Sans surbrillance",
3044
+ customColor: "Couleur personnalisée",
3045
+ customColorLabel: "Personnaliser…"
3046
+ },
3047
+ statusbar: {
3048
+ resizeHandle: "Faire glisser pour redimensionner",
3049
+ words: (n) => `Mots\u00a0: ${n}`,
3050
+ wordsLimit: (n, max) => `Mots\u00a0: ${n}/${max}`,
3051
+ chars: (n) => `Caractères\u00a0: ${n}`,
3052
+ charsLimit: (n, max) => `Caractères\u00a0: ${n}/${max}`
3053
+ },
3054
+ tooltips: {
3055
+ link: {
3056
+ ariaLabel: "Actions du lien",
3057
+ openLink: "Ouvrir le lien",
3058
+ copyUrl: "Copier l'URL",
3059
+ editLink: "Modifier le lien",
3060
+ removeLink: "Supprimer le lien"
3061
+ },
3062
+ image: {
3063
+ ariaLabel: "Actions de l'image",
3064
+ label: "Image",
3065
+ floatLeft: "Flottant à gauche",
3066
+ noFloat: "Sans flottant",
3067
+ alignCenter: "Centré",
3068
+ floatRight: "Flottant à droite",
3069
+ originalSize: "Taille originale",
3070
+ rotateLeft: "Rotation à gauche",
3071
+ rotateRight: "Rotation à droite",
3072
+ cropImage: "Recadrer l'image",
3073
+ addCaption: "Ajouter / modifier la légende",
3074
+ deleteImage: "Supprimer l'image"
3075
+ },
3076
+ code: {
3077
+ ariaLabel: "Actions du bloc de code",
3078
+ label: "Code",
3079
+ syntaxLanguage: "Langage de syntaxe",
3080
+ syntaxAriaLabel: "Langage de syntaxe",
3081
+ copyCode: "Copier le code",
3082
+ toggleWordWrap: "Activer/désactiver le retour à la ligne",
3083
+ enableWordWrap: "Activer le retour à la ligne",
3084
+ disableWordWrap: "Désactiver le retour à la ligne",
3085
+ convertToParagraph: "Convertir en paragraphe",
3086
+ deleteCodeBlock: "Supprimer le bloc de code"
3087
+ },
3088
+ table: {
3089
+ ariaLabel: "Actions du tableau",
3090
+ label: "Tableau",
3091
+ selectCells: "Sélectionner des cellules",
3092
+ addRowAbove: "Ajouter une ligne au-dessus",
3093
+ addRowBelow: "Ajouter une ligne en-dessous",
3094
+ deleteRow: "Supprimer la ligne",
3095
+ addColumnLeft: "Ajouter une colonne à gauche",
3096
+ addColumnRight: "Ajouter une colonne à droite",
3097
+ deleteColumn: "Supprimer la colonne",
3098
+ mergeCells: "Fusionner les cellules",
3099
+ unmergeCells: "Scinder les cellules",
3100
+ columnWidth: "Largeur de colonne",
3101
+ rowHeight: "Hauteur de ligne",
3102
+ tableBorderWidth: "Épaisseur des bordures",
3103
+ deleteTable: "Supprimer le tableau",
3104
+ columnWidthPx: "Largeur de colonne (px)",
3105
+ rowHeightPx: "Hauteur de ligne (px)",
3106
+ tableBorderWidthPx: "Épaisseur des bordures (px)",
3107
+ cancelBtn: "Annuler",
3108
+ applyBtn: "Appliquer"
3109
+ },
3110
+ video: {
3111
+ ariaLabel: "Actions de la vidéo",
3112
+ label: "Vidéo",
3113
+ floatLeft: "Flottant à gauche",
3114
+ noFloat: "Sans flottant",
3115
+ alignCenter: "Centré",
3116
+ floatRight: "Flottant à droite",
3117
+ originalSize: "Taille originale",
3118
+ previewVideo: "Aperçu",
3119
+ exitPreview: "Quitter l'aperçu",
3120
+ deleteVideo: "Supprimer la vidéo"
3121
+ }
3122
+ },
3123
+ errors: {
3124
+ imageFormat: (type) => `Le format "${type}" n'est pas pris en charge par le navigateur. Veuillez le convertir en JPEG, PNG ou WebP.`,
3125
+ imageSize: (maxSize) => `Le fichier image est trop volumineux. La taille maximale autorisée est de ${maxSize}\u00a0Mo.`
3126
+ }
3127
+ },
3128
+ de: {
3129
+ toolbar: {
3130
+ bold: "Fett (Ctrl+B)",
3131
+ italic: "Kursiv (Ctrl+I)",
3132
+ underline: "Unterstrichen (Ctrl+U)",
3133
+ strikethrough: "Durchgestrichen",
3134
+ superscript: "Hochgestellt",
3135
+ subscript: "Tiefgestellt",
3136
+ alignLeft: "Linksbündig",
3137
+ alignCenter: "Zentriert",
3138
+ alignRight: "Rechtsbündig",
3139
+ alignJustify: "Blocksatz",
3140
+ ul: "Ungeordnete Liste",
3141
+ ol: "Geordnete Liste",
3142
+ checklist: "Checkliste",
3143
+ indent: "Einzug vergrößern",
3144
+ outdent: "Einzug verkleinern",
3145
+ undo: "Rückgängig (Ctrl+Z)",
3146
+ redo: "Wiederholen (Ctrl+Y)",
3147
+ hr: "Horizontale Linie",
3148
+ link: "Link einfügen",
3149
+ image: "Bild einfügen",
3150
+ video: "Video einfügen",
3151
+ emoji: "Emoji einfügen",
3152
+ icon: "FA-Symbol einfügen",
3153
+ table: "Tabelle einfügen",
3154
+ fontSize: "Schriftgröße",
3155
+ fontSizePlaceholder: "Größe",
3156
+ removeFormat: "Formatierung entfernen",
3157
+ direction: "Textrichtung umschalten (LTR / RTL)",
3158
+ fontFamily: "Schriftart",
3159
+ paragraphStyle: "Absatzstil",
3160
+ paragraphStylePlaceholder: "Stil",
3161
+ lineHeight: "Zeilenhöhe",
3162
+ lineHeightPlaceholder: "↕ Zeile",
3163
+ codeview: "HTML-Code-Ansicht",
3164
+ fullscreen: "Vollbild",
3165
+ shortcuts: "Tastenkürzel (Ctrl+Shift+/)",
3166
+ find: "Suchen (Ctrl+F)",
3167
+ findReplace: "Suchen & Ersetzen (Ctrl+H)",
3168
+ inlineCode: "Inline-Code (Ctrl+`)",
3169
+ print: "Drucken",
3170
+ foreColor: "Textfarbe",
3171
+ backColor: "Hervorhebungsfarbe",
3172
+ chooseTextColor: "Textfarbe auswählen",
3173
+ chooseHighlightColor: "Hervorhebungsfarbe auswählen",
3174
+ customColor: "Benutzerdefinierte Farbe",
3175
+ insertTableLabel: "Tabelle einfügen",
3176
+ paragraphItems: {
3177
+ p: "Normal",
3178
+ blockquote: "Zitat",
3179
+ pre: "Code"
3180
+ }
3181
+ },
3182
+ linkDialog: {
3183
+ ariaLabel: "Link einfügen",
3184
+ title: "Link einfügen",
3185
+ url: "URL",
3186
+ urlPlaceholder: "https://",
3187
+ displayText: "Anzeigetext",
3188
+ textPlaceholder: "Linktext",
3189
+ openInNewTab: "In neuem Tab öffnen",
3190
+ insertBtn: "Einfügen",
3191
+ cancelBtn: "Abbrechen"
3192
+ },
3193
+ imageDialog: {
3194
+ ariaLabel: "Bild einfügen",
3195
+ title: "Bild einfügen",
3196
+ imageUrl: "Bild-URL",
3197
+ urlPlaceholder: "https://example.com/image.png",
3198
+ altText: "Alt-Text",
3199
+ altPlaceholder: "Bild beschreiben",
3200
+ alignment: "Ausrichtung",
3201
+ alignNone: "Keine",
3202
+ alignLeft: "Links",
3203
+ alignCenter: "Mitte",
3204
+ alignRight: "Rechts",
3205
+ uploadLabel: "Oder Datei hochladen",
3206
+ insertBtn: "Einfügen",
3207
+ cancelBtn: "Abbrechen"
3208
+ },
3209
+ videoDialog: {
3210
+ ariaLabel: "Video einfügen",
3211
+ title: "Video einfügen",
3212
+ videoUrl: "Video-URL",
3213
+ urlPlaceholder: "YouTube, Vimeo oder direkte .mp4-URL",
3214
+ widthLabel: "Breite (px)",
3215
+ widthPlaceholder: "560",
3216
+ insertBtn: "Einfügen",
3217
+ cancelBtn: "Abbrechen",
3218
+ detected: (type) => `Erkannt: ${type}`,
3219
+ unknownFormat: "Unbekanntes Format — direktes Video-Einbetten wird versucht",
3220
+ invalidUrl: "Ungültige URL — bitte geben Sie einen gültigen Videolink ein."
3221
+ },
3222
+ emojiDialog: {
3223
+ ariaLabel: "Emoji einfügen",
3224
+ title: "Emoji einfügen",
3225
+ searchPlaceholder: "Emojis suchen…",
3226
+ all: "Alle",
3227
+ cancelBtn: "Abbrechen",
3228
+ close: "Schließen",
3229
+ categories: {
3230
+ smileys: "Smileys",
3231
+ people: "Menschen",
3232
+ animals: "Tiere",
3233
+ food: "Essen",
3234
+ travel: "Reisen",
3235
+ objects: "Objekte",
3236
+ symbols: "Symbole"
3237
+ }
3238
+ },
3239
+ iconDialog: {
3240
+ ariaLabel: "FA-Symbol einfügen",
3241
+ title: "FA-Symbol einfügen",
3242
+ searchPlaceholder: "Symbole suchen…",
3243
+ all: "Alle",
3244
+ style: "Stil",
3245
+ size: "Größe",
3246
+ color: "Farbe",
3247
+ useColor: " Farbe verwenden",
3248
+ selectHint: "Symbol auswählen",
3249
+ insertBtn: "FA-Symbol einfügen",
3250
+ cancelBtn: "Abbrechen",
3251
+ close: "Schließen",
3252
+ categories: {
3253
+ popular: "Beliebt",
3254
+ interface: "Benutzeroberfläche",
3255
+ navigation: "Navigation",
3256
+ media: "Medien",
3257
+ communication: "Kommunikation",
3258
+ files: "Dateien",
3259
+ people: "Menschen",
3260
+ objects: "Objekte"
3261
+ }
3262
+ },
3263
+ findReplace: {
3264
+ findTitle: "Suchen",
3265
+ findReplaceTitle: "Suchen & Ersetzen",
3266
+ findPlaceholder: "Suchen…",
3267
+ searchAriaLabel: "Suchtext",
3268
+ caseSensitive: "\xA0Groß-/Kleinschreibung",
3269
+ prevBtn: "← Zurück",
3270
+ nextBtn: "Weiter →",
3271
+ replacePlaceholder: "Ersetzen durch…",
3272
+ replaceAriaLabel: "Ersetzen durch",
3273
+ replaceBtn: "Ersetzen",
3274
+ replaceAllBtn: "Alle ersetzen",
3275
+ close: "×"
3276
+ },
3277
+ shortcutsDialog: {
3278
+ title: "Tastenkürzel",
3279
+ ariaLabel: "Tastenkürzel",
3280
+ close: "Schließen",
3281
+ shortcuts: [
3282
+ {
3283
+ category: "Textformatierung",
3284
+ items: [
3285
+ {
3286
+ keys: "Ctrl + B",
3287
+ action: "Fett"
3288
+ },
3289
+ {
3290
+ keys: "Ctrl + I",
3291
+ action: "Kursiv"
3292
+ },
3293
+ {
3294
+ keys: "Ctrl + U",
3295
+ action: "Unterstrichen"
3296
+ },
3297
+ {
3298
+ keys: "Ctrl + K",
3299
+ action: "Link einfügen / bearbeiten"
3300
+ }
3301
+ ]
3302
+ },
3303
+ {
3304
+ category: "Verlauf",
3305
+ items: [{
3306
+ keys: "Ctrl + Z",
3307
+ action: "Rückgängig"
3308
+ }, {
3309
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
3310
+ action: "Wiederholen"
3311
+ }]
3312
+ },
3313
+ {
3314
+ category: "Auswahl & Navigation",
3315
+ items: [
3316
+ {
3317
+ keys: "Ctrl + A",
3318
+ action: "Alles auswählen"
3319
+ },
3320
+ {
3321
+ keys: "Tab",
3322
+ action: "Listenebene erhöhen / Leerzeichen einfügen"
3323
+ },
3324
+ {
3325
+ keys: "Shift + Tab",
3326
+ action: "Listenebene verringern"
3327
+ }
3328
+ ]
3329
+ },
3330
+ {
3331
+ category: "Zwischenablage",
3332
+ items: [{
3333
+ keys: "Ctrl + Shift + V",
3334
+ action: "Als einfachen Text einfügen"
3335
+ }]
3336
+ },
3337
+ {
3338
+ category: "Suchen & Ersetzen",
3339
+ items: [{
3340
+ keys: "Ctrl + F",
3341
+ action: "Im Dokument suchen"
3342
+ }, {
3343
+ keys: "Ctrl + H",
3344
+ action: "Suchen & Ersetzen"
3345
+ }]
3346
+ },
3347
+ {
3348
+ category: "Editor",
3349
+ items: [{
3350
+ keys: "Ctrl + Shift + /",
3351
+ action: "Diesen Tastenkürzel-Dialog anzeigen"
3352
+ }]
3353
+ }
3354
+ ]
3355
+ },
3356
+ contextMenu: {
3357
+ cut: "Ausschneiden",
3358
+ copy: "Kopieren",
3359
+ paste: "Einfügen",
3360
+ bold: "Fett",
3361
+ italic: "Kursiv",
3362
+ underline: "Unterstrichen",
3363
+ textColor: "Textfarbe",
3364
+ highlightColor: "Hervorhebungsfarbe",
3365
+ copyFormat: "Format kopieren",
3366
+ pasteFormat: "Format einfügen",
3367
+ removeFormat: "Formatierung entfernen",
3368
+ link: "Link einfügen",
3369
+ image: "Bild einfügen",
3370
+ video: "Video einfügen",
3371
+ table: "Tabelle einfügen",
3372
+ back: "Zurück",
3373
+ noHighlight: "Keine Hervorhebung",
3374
+ customColor: "Benutzerdefinierte Farbe",
3375
+ customColorLabel: "Benutzerdefiniert…"
3376
+ },
3377
+ statusbar: {
3378
+ resizeHandle: "Editor-Größe ändern",
3379
+ words: (n) => `Wörter: ${n}`,
3380
+ wordsLimit: (n, max) => `Wörter: ${n}/${max}`,
3381
+ chars: (n) => `Zeichen: ${n}`,
3382
+ charsLimit: (n, max) => `Zeichen: ${n}/${max}`
3383
+ },
3384
+ tooltips: {
3385
+ link: {
3386
+ ariaLabel: "Link-Aktionen",
3387
+ openLink: "Link öffnen",
3388
+ copyUrl: "URL kopieren",
3389
+ editLink: "Link bearbeiten",
3390
+ removeLink: "Link entfernen"
3391
+ },
3392
+ image: {
3393
+ ariaLabel: "Bild-Aktionen",
3394
+ label: "Bild",
3395
+ floatLeft: "Links umfließen",
3396
+ noFloat: "Kein Umfluss",
3397
+ alignCenter: "Zentriert",
3398
+ floatRight: "Rechts umfließen",
3399
+ originalSize: "Originalgröße",
3400
+ rotateLeft: "Links drehen",
3401
+ rotateRight: "Rechts drehen",
3402
+ cropImage: "Bild zuschneiden",
3403
+ addCaption: "Beschriftung hinzufügen / bearbeiten",
3404
+ deleteImage: "Bild löschen"
3405
+ },
3406
+ code: {
3407
+ ariaLabel: "Codeblock-Aktionen",
3408
+ label: "Code",
3409
+ syntaxLanguage: "Syntaxsprache",
3410
+ syntaxAriaLabel: "Syntaxsprache",
3411
+ copyCode: "Code kopieren",
3412
+ toggleWordWrap: "Zeilenumbruch umschalten",
3413
+ enableWordWrap: "Zeilenumbruch aktivieren",
3414
+ disableWordWrap: "Zeilenumbruch deaktivieren",
3415
+ convertToParagraph: "In Absatz umwandeln",
3416
+ deleteCodeBlock: "Codeblock löschen"
3417
+ },
3418
+ table: {
3419
+ ariaLabel: "Tabellen-Aktionen",
3420
+ label: "Tabelle",
3421
+ selectCells: "Zellen auswählen",
3422
+ addRowAbove: "Zeile oben hinzufügen",
3423
+ addRowBelow: "Zeile unten hinzufügen",
3424
+ deleteRow: "Zeile löschen",
3425
+ addColumnLeft: "Spalte links hinzufügen",
3426
+ addColumnRight: "Spalte rechts hinzufügen",
3427
+ deleteColumn: "Spalte löschen",
3428
+ mergeCells: "Zellen zusammenführen",
3429
+ unmergeCells: "Zellen trennen",
3430
+ columnWidth: "Spaltenbreite",
3431
+ rowHeight: "Zeilenhöhe",
3432
+ tableBorderWidth: "Tabellenrahmenbreite",
3433
+ deleteTable: "Tabelle löschen",
3434
+ columnWidthPx: "Spaltenbreite (px)",
3435
+ rowHeightPx: "Zeilenhöhe (px)",
3436
+ tableBorderWidthPx: "Tabellenrahmenbreite (px)",
3437
+ cancelBtn: "Abbrechen",
3438
+ applyBtn: "Anwenden"
3439
+ },
3440
+ video: {
3441
+ ariaLabel: "Video-Aktionen",
3442
+ label: "Video",
3443
+ floatLeft: "Links umfließen",
3444
+ noFloat: "Kein Umfluss",
3445
+ alignCenter: "Zentriert",
3446
+ floatRight: "Rechts umfließen",
3447
+ originalSize: "Originalgröße",
3448
+ previewVideo: "Video-Vorschau",
3449
+ exitPreview: "Vorschau beenden",
3450
+ deleteVideo: "Video löschen"
3451
+ }
3452
+ },
3453
+ errors: {
3454
+ imageFormat: (type) => `Das Format „${type}" wird in Webbrowsern nicht unterstützt. Bitte konvertieren Sie es zuerst in JPEG, PNG oder WebP.`,
3455
+ imageSize: (maxSize) => `Die Bilddatei ist zu groß. Die maximal zulässige Größe beträgt ${maxSize} MB.`
3456
+ }
3457
+ },
3458
+ es: {
3459
+ toolbar: {
3460
+ bold: "Negrita (Ctrl+B)",
3461
+ italic: "Cursiva (Ctrl+I)",
3462
+ underline: "Subrayado (Ctrl+U)",
3463
+ strikethrough: "Tachado",
3464
+ superscript: "Superíndice",
3465
+ subscript: "Subíndice",
3466
+ alignLeft: "Alinear a la izquierda",
3467
+ alignCenter: "Centrar",
3468
+ alignRight: "Alinear a la derecha",
3469
+ alignJustify: "Justificar",
3470
+ ul: "Lista sin orden",
3471
+ ol: "Lista ordenada",
3472
+ checklist: "Lista de verificación",
3473
+ indent: "Aumentar sangría",
3474
+ outdent: "Reducir sangría",
3475
+ undo: "Deshacer (Ctrl+Z)",
3476
+ redo: "Rehacer (Ctrl+Y)",
3477
+ hr: "Línea horizontal",
3478
+ link: "Insertar enlace",
3479
+ image: "Insertar imagen",
3480
+ video: "Insertar vídeo",
3481
+ emoji: "Insertar emoji",
3482
+ icon: "Insertar icono FA",
3483
+ table: "Insertar tabla",
3484
+ fontSize: "Tamaño de fuente",
3485
+ fontSizePlaceholder: "Tamaño",
3486
+ removeFormat: "Eliminar formato",
3487
+ direction: "Cambiar dirección del texto (LTR / RTL)",
3488
+ fontFamily: "Fuente",
3489
+ paragraphStyle: "Estilo de párrafo",
3490
+ paragraphStylePlaceholder: "Estilo",
3491
+ lineHeight: "Interlineado",
3492
+ lineHeightPlaceholder: "↕ Línea",
3493
+ codeview: "Vista de código HTML",
3494
+ fullscreen: "Pantalla completa",
3495
+ shortcuts: "Atajos de teclado (Ctrl+Shift+/)",
3496
+ find: "Buscar (Ctrl+F)",
3497
+ findReplace: "Buscar y reemplazar (Ctrl+H)",
3498
+ inlineCode: "Código en línea (Ctrl+`)",
3499
+ print: "Imprimir",
3500
+ foreColor: "Color del texto",
3501
+ backColor: "Color de resaltado",
3502
+ chooseTextColor: "Elegir color del texto",
3503
+ chooseHighlightColor: "Elegir color de resaltado",
3504
+ customColor: "Color personalizado",
3505
+ insertTableLabel: "Insertar tabla",
3506
+ paragraphItems: {
3507
+ p: "Normal",
3508
+ blockquote: "Cita",
3509
+ pre: "Código"
3510
+ }
3511
+ },
3512
+ linkDialog: {
3513
+ ariaLabel: "Insertar enlace",
3514
+ title: "Insertar enlace",
3515
+ url: "URL",
3516
+ urlPlaceholder: "https://",
3517
+ displayText: "Texto a mostrar",
3518
+ textPlaceholder: "Texto del enlace",
3519
+ openInNewTab: "Abrir en nueva pestaña",
3520
+ insertBtn: "Insertar",
3521
+ cancelBtn: "Cancelar"
3522
+ },
3523
+ imageDialog: {
3524
+ ariaLabel: "Insertar imagen",
3525
+ title: "Insertar imagen",
3526
+ imageUrl: "URL de imagen",
3527
+ urlPlaceholder: "https://example.com/image.png",
3528
+ altText: "Texto alternativo",
3529
+ altPlaceholder: "Describir la imagen",
3530
+ alignment: "Alineación",
3531
+ alignNone: "Ninguna",
3532
+ alignLeft: "Izquierda",
3533
+ alignCenter: "Centro",
3534
+ alignRight: "Derecha",
3535
+ uploadLabel: "O subir un archivo",
3536
+ insertBtn: "Insertar",
3537
+ cancelBtn: "Cancelar"
3538
+ },
3539
+ videoDialog: {
3540
+ ariaLabel: "Insertar vídeo",
3541
+ title: "Insertar vídeo",
3542
+ videoUrl: "URL del vídeo",
3543
+ urlPlaceholder: "YouTube, Vimeo o URL directa .mp4",
3544
+ widthLabel: "Ancho (px)",
3545
+ widthPlaceholder: "560",
3546
+ insertBtn: "Insertar",
3547
+ cancelBtn: "Cancelar",
3548
+ detected: (type) => `Detectado: ${type}`,
3549
+ unknownFormat: "Formato desconocido — se intentará incrustar el vídeo directamente",
3550
+ invalidUrl: "URL no válida — introduzca un enlace de vídeo válido."
3551
+ },
3552
+ emojiDialog: {
3553
+ ariaLabel: "Insertar emoji",
3554
+ title: "Insertar emoji",
3555
+ searchPlaceholder: "Buscar emojis…",
3556
+ all: "Todos",
3557
+ cancelBtn: "Cancelar",
3558
+ close: "Cerrar",
3559
+ categories: {
3560
+ smileys: "Caritas",
3561
+ people: "Personas",
3562
+ animals: "Animales",
3563
+ food: "Comida",
3564
+ travel: "Viajes",
3565
+ objects: "Objetos",
3566
+ symbols: "Símbolos"
3567
+ }
3568
+ },
3569
+ iconDialog: {
3570
+ ariaLabel: "Insertar icono FA",
3571
+ title: "Insertar icono FA",
3572
+ searchPlaceholder: "Buscar iconos…",
3573
+ all: "Todos",
3574
+ style: "Estilo",
3575
+ size: "Tamaño",
3576
+ color: "Color",
3577
+ useColor: " Usar color",
3578
+ selectHint: "Seleccionar un icono",
3579
+ insertBtn: "Insertar icono FA",
3580
+ cancelBtn: "Cancelar",
3581
+ close: "Cerrar",
3582
+ categories: {
3583
+ popular: "Popular",
3584
+ interface: "Interfaz",
3585
+ navigation: "Navegación",
3586
+ media: "Medios",
3587
+ communication: "Comunicación",
3588
+ files: "Archivos",
3589
+ people: "Personas",
3590
+ objects: "Objetos"
3591
+ }
3592
+ },
3593
+ findReplace: {
3594
+ findTitle: "Buscar",
3595
+ findReplaceTitle: "Buscar y reemplazar",
3596
+ findPlaceholder: "Buscar…",
3597
+ searchAriaLabel: "Texto de búsqueda",
3598
+ caseSensitive: "\xA0Distinguir mayúsculas",
3599
+ prevBtn: "← Anterior",
3600
+ nextBtn: "Siguiente →",
3601
+ replacePlaceholder: "Reemplazar con…",
3602
+ replaceAriaLabel: "Reemplazar con",
3603
+ replaceBtn: "Reemplazar",
3604
+ replaceAllBtn: "Reemplazar todo",
3605
+ close: "×"
3606
+ },
3607
+ shortcutsDialog: {
3608
+ title: "Atajos de teclado",
3609
+ ariaLabel: "Atajos de teclado",
3610
+ close: "Cerrar",
3611
+ shortcuts: [
3612
+ {
3613
+ category: "Formato de texto",
3614
+ items: [
3615
+ {
3616
+ keys: "Ctrl + B",
3617
+ action: "Negrita"
3618
+ },
3619
+ {
3620
+ keys: "Ctrl + I",
3621
+ action: "Cursiva"
3622
+ },
3623
+ {
3624
+ keys: "Ctrl + U",
3625
+ action: "Subrayado"
3626
+ },
3627
+ {
3628
+ keys: "Ctrl + K",
3629
+ action: "Insertar / editar enlace"
3630
+ }
3631
+ ]
3632
+ },
3633
+ {
3634
+ category: "Historial",
3635
+ items: [{
3636
+ keys: "Ctrl + Z",
3637
+ action: "Deshacer"
3638
+ }, {
3639
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
3640
+ action: "Rehacer"
3641
+ }]
3642
+ },
3643
+ {
3644
+ category: "Selección y navegación",
3645
+ items: [
3646
+ {
3647
+ keys: "Ctrl + A",
3648
+ action: "Seleccionar todo"
3649
+ },
3650
+ {
3651
+ keys: "Tab",
3652
+ action: "Aumentar sangría / insertar espacios"
3653
+ },
3654
+ {
3655
+ keys: "Shift + Tab",
3656
+ action: "Reducir sangría"
3657
+ }
3658
+ ]
3659
+ },
3660
+ {
3661
+ category: "Portapapeles",
3662
+ items: [{
3663
+ keys: "Ctrl + Shift + V",
3664
+ action: "Pegar como texto plano"
3665
+ }]
3666
+ },
3667
+ {
3668
+ category: "Buscar y reemplazar",
3669
+ items: [{
3670
+ keys: "Ctrl + F",
3671
+ action: "Buscar en el documento"
3672
+ }, {
3673
+ keys: "Ctrl + H",
3674
+ action: "Buscar y reemplazar"
3675
+ }]
3676
+ },
3677
+ {
3678
+ category: "Editor",
3679
+ items: [{
3680
+ keys: "Ctrl + Shift + /",
3681
+ action: "Mostrar este diálogo de atajos"
3682
+ }]
3683
+ }
3684
+ ]
3685
+ },
3686
+ contextMenu: {
3687
+ cut: "Cortar",
3688
+ copy: "Copiar",
3689
+ paste: "Pegar",
3690
+ bold: "Negrita",
3691
+ italic: "Cursiva",
3692
+ underline: "Subrayado",
3693
+ textColor: "Color del texto",
3694
+ highlightColor: "Color de resaltado",
3695
+ copyFormat: "Copiar formato",
3696
+ pasteFormat: "Pegar formato",
3697
+ removeFormat: "Eliminar formato",
3698
+ link: "Insertar enlace",
3699
+ image: "Insertar imagen",
3700
+ video: "Insertar vídeo",
3701
+ table: "Insertar tabla",
3702
+ back: "Atrás",
3703
+ noHighlight: "Sin resaltado",
3704
+ customColor: "Color personalizado",
3705
+ customColorLabel: "Personalizado…"
3706
+ },
3707
+ statusbar: {
3708
+ resizeHandle: "Redimensionar editor",
3709
+ words: (n) => `Palabras: ${n}`,
3710
+ wordsLimit: (n, max) => `Palabras: ${n}/${max}`,
3711
+ chars: (n) => `Caracteres: ${n}`,
3712
+ charsLimit: (n, max) => `Caracteres: ${n}/${max}`
3713
+ },
3714
+ tooltips: {
3715
+ link: {
3716
+ ariaLabel: "Acciones de enlace",
3717
+ openLink: "Abrir enlace",
3718
+ copyUrl: "Copiar URL",
3719
+ editLink: "Editar enlace",
3720
+ removeLink: "Eliminar enlace"
3721
+ },
3722
+ image: {
3723
+ ariaLabel: "Acciones de imagen",
3724
+ label: "Imagen",
3725
+ floatLeft: "Flotar a la izquierda",
3726
+ noFloat: "Sin flotado",
3727
+ alignCenter: "Centrar",
3728
+ floatRight: "Flotar a la derecha",
3729
+ originalSize: "Tamaño original",
3730
+ rotateLeft: "Rotar a la izquierda",
3731
+ rotateRight: "Rotar a la derecha",
3732
+ cropImage: "Recortar imagen",
3733
+ addCaption: "Añadir / editar pie de foto",
3734
+ deleteImage: "Eliminar imagen"
3735
+ },
3736
+ code: {
3737
+ ariaLabel: "Acciones de bloque de código",
3738
+ label: "Código",
3739
+ syntaxLanguage: "Lenguaje de sintaxis",
3740
+ syntaxAriaLabel: "Lenguaje de sintaxis",
3741
+ copyCode: "Copiar código",
3742
+ toggleWordWrap: "Alternar ajuste de línea",
3743
+ enableWordWrap: "Activar ajuste de línea",
3744
+ disableWordWrap: "Desactivar ajuste de línea",
3745
+ convertToParagraph: "Convertir en párrafo",
3746
+ deleteCodeBlock: "Eliminar bloque de código"
3747
+ },
3748
+ table: {
3749
+ ariaLabel: "Acciones de tabla",
3750
+ label: "Tabla",
3751
+ selectCells: "Seleccionar celdas",
3752
+ addRowAbove: "Añadir fila encima",
3753
+ addRowBelow: "Añadir fila debajo",
3754
+ deleteRow: "Eliminar fila",
3755
+ addColumnLeft: "Añadir columna a la izquierda",
3756
+ addColumnRight: "Añadir columna a la derecha",
3757
+ deleteColumn: "Eliminar columna",
3758
+ mergeCells: "Combinar celdas",
3759
+ unmergeCells: "Separar celdas",
3760
+ columnWidth: "Ancho de columna",
3761
+ rowHeight: "Alto de fila",
3762
+ tableBorderWidth: "Grosor del borde de la tabla",
3763
+ deleteTable: "Eliminar tabla",
3764
+ columnWidthPx: "Ancho de columna (px)",
3765
+ rowHeightPx: "Alto de fila (px)",
3766
+ tableBorderWidthPx: "Grosor del borde (px)",
3767
+ cancelBtn: "Cancelar",
3768
+ applyBtn: "Aplicar"
3769
+ },
3770
+ video: {
3771
+ ariaLabel: "Acciones de vídeo",
3772
+ label: "Vídeo",
3773
+ floatLeft: "Flotar a la izquierda",
3774
+ noFloat: "Sin flotado",
3775
+ alignCenter: "Centrar",
3776
+ floatRight: "Flotar a la derecha",
3777
+ originalSize: "Tamaño original",
3778
+ previewVideo: "Vista previa de vídeo",
3779
+ exitPreview: "Salir de la vista previa",
3780
+ deleteVideo: "Eliminar vídeo"
3781
+ }
3782
+ },
3783
+ errors: {
3784
+ imageFormat: (type) => `El formato "${type}" no es compatible con los navegadores web. Por favor, conviértalo primero a JPEG, PNG o WebP.`,
3785
+ imageSize: (maxSize) => `El archivo de imagen es demasiado grande. El tamaño máximo permitido es ${maxSize} MB.`
3786
+ }
3787
+ },
3788
+ ko: {
3789
+ toolbar: {
3790
+ bold: "굵게 (Ctrl+B)",
3791
+ italic: "기울임꼴 (Ctrl+I)",
3792
+ underline: "밑줄 (Ctrl+U)",
3793
+ strikethrough: "취소선",
3794
+ superscript: "위 첨자",
3795
+ subscript: "아래 첨자",
3796
+ alignLeft: "왼쪽 정렬",
3797
+ alignCenter: "가운데 정렬",
3798
+ alignRight: "오른쪽 정렬",
3799
+ alignJustify: "양쪽 정렬",
3800
+ ul: "순서 없는 목록",
3801
+ ol: "순서 있는 목록",
3802
+ checklist: "체크리스트",
3803
+ indent: "들여쓰기",
3804
+ outdent: "내어쓰기",
3805
+ undo: "실행 취소 (Ctrl+Z)",
3806
+ redo: "다시 실행 (Ctrl+Y)",
3807
+ hr: "수평선",
3808
+ link: "링크 삽입",
3809
+ image: "이미지 삽입",
3810
+ video: "동영상 삽입",
3811
+ emoji: "이모지 삽입",
3812
+ icon: "FA 아이콘 삽입",
3813
+ table: "표 삽입",
3814
+ fontSize: "글꼴 크기",
3815
+ fontSizePlaceholder: "크기",
3816
+ removeFormat: "서식 제거",
3817
+ direction: "텍스트 방향 전환 (LTR / RTL)",
3818
+ fontFamily: "글꼴",
3819
+ paragraphStyle: "단락 스타일",
3820
+ paragraphStylePlaceholder: "스타일",
3821
+ lineHeight: "줄 간격",
3822
+ lineHeightPlaceholder: "↕ 줄",
3823
+ codeview: "HTML 코드 보기",
3824
+ fullscreen: "전체 화면",
3825
+ shortcuts: "키보드 단축키 (Ctrl+Shift+/)",
3826
+ find: "찾기 (Ctrl+F)",
3827
+ findReplace: "찾기 및 바꾸기 (Ctrl+H)",
3828
+ inlineCode: "인라인 코드 (Ctrl+`)",
3829
+ print: "인쇄",
3830
+ foreColor: "글자 색",
3831
+ backColor: "강조 색",
3832
+ chooseTextColor: "글자 색 선택",
3833
+ chooseHighlightColor: "강조 색 선택",
3834
+ customColor: "사용자 지정 색",
3835
+ insertTableLabel: "표 삽입",
3836
+ paragraphItems: {
3837
+ p: "기본",
3838
+ blockquote: "인용",
3839
+ pre: "코드"
3840
+ }
3841
+ },
3842
+ linkDialog: {
3843
+ ariaLabel: "링크 삽입",
3844
+ title: "링크 삽입",
3845
+ url: "URL",
3846
+ urlPlaceholder: "https://",
3847
+ displayText: "표시 텍스트",
3848
+ textPlaceholder: "링크 텍스트",
3849
+ openInNewTab: "새 탭에서 열기",
3850
+ insertBtn: "삽입",
3851
+ cancelBtn: "취소"
3852
+ },
3853
+ imageDialog: {
3854
+ ariaLabel: "이미지 삽입",
3855
+ title: "이미지 삽입",
3856
+ imageUrl: "이미지 URL",
3857
+ urlPlaceholder: "https://example.com/image.png",
3858
+ altText: "대체 텍스트",
3859
+ altPlaceholder: "이미지 설명",
3860
+ alignment: "정렬",
3861
+ alignNone: "없음",
3862
+ alignLeft: "왼쪽",
3863
+ alignCenter: "가운데",
3864
+ alignRight: "오른쪽",
3865
+ uploadLabel: "또는 파일 업로드",
3866
+ insertBtn: "삽입",
3867
+ cancelBtn: "취소"
3868
+ },
3869
+ videoDialog: {
3870
+ ariaLabel: "동영상 삽입",
3871
+ title: "동영상 삽입",
3872
+ videoUrl: "동영상 URL",
3873
+ urlPlaceholder: "YouTube, Vimeo 또는 직접 .mp4 URL",
3874
+ widthLabel: "너비 (px)",
3875
+ widthPlaceholder: "560",
3876
+ insertBtn: "삽입",
3877
+ cancelBtn: "취소",
3878
+ detected: (type) => `감지됨: ${type}`,
3879
+ unknownFormat: "알 수 없는 형식 — 직접 동영상 임베드를 시도합니다",
3880
+ invalidUrl: "유효하지 않은 URL — 올바른 동영상 링크를 입력하세요."
3881
+ },
3882
+ emojiDialog: {
3883
+ ariaLabel: "이모지 삽입",
3884
+ title: "이모지 삽입",
3885
+ searchPlaceholder: "이모지 검색…",
3886
+ all: "전체",
3887
+ cancelBtn: "취소",
3888
+ close: "닫기",
3889
+ categories: {
3890
+ smileys: "스마일",
3891
+ people: "사람",
3892
+ animals: "동물",
3893
+ food: "음식",
3894
+ travel: "여행",
3895
+ objects: "사물",
3896
+ symbols: "기호"
3897
+ }
3898
+ },
3899
+ iconDialog: {
3900
+ ariaLabel: "FA 아이콘 삽입",
3901
+ title: "FA 아이콘 삽입",
3902
+ searchPlaceholder: "아이콘 검색…",
3903
+ all: "전체",
3904
+ style: "스타일",
3905
+ size: "크기",
3906
+ color: "색상",
3907
+ useColor: " 색상 사용",
3908
+ selectHint: "아이콘을 선택하세요",
3909
+ insertBtn: "FA 아이콘 삽입",
3910
+ cancelBtn: "취소",
3911
+ close: "닫기",
3912
+ categories: {
3913
+ popular: "인기",
3914
+ interface: "인터페이스",
3915
+ navigation: "탐색",
3916
+ media: "미디어",
3917
+ communication: "커뮤니케이션",
3918
+ files: "파일",
3919
+ people: "사람",
3920
+ objects: "사물"
3921
+ }
3922
+ },
3923
+ findReplace: {
3924
+ findTitle: "찾기",
3925
+ findReplaceTitle: "찾기 및 바꾸기",
3926
+ findPlaceholder: "찾기…",
3927
+ searchAriaLabel: "검색 텍스트",
3928
+ caseSensitive: "\xA0대소문자 구분",
3929
+ prevBtn: "← 이전",
3930
+ nextBtn: "다음 →",
3931
+ replacePlaceholder: "바꿀 내용…",
3932
+ replaceAriaLabel: "바꿀 내용",
3933
+ replaceBtn: "바꾸기",
3934
+ replaceAllBtn: "모두 바꾸기",
3935
+ close: "×"
3936
+ },
3937
+ shortcutsDialog: {
3938
+ title: "키보드 단축키",
3939
+ ariaLabel: "키보드 단축키",
3940
+ close: "닫기",
3941
+ shortcuts: [
3942
+ {
3943
+ category: "텍스트 서식",
3944
+ items: [
3945
+ {
3946
+ keys: "Ctrl + B",
3947
+ action: "굵게"
3948
+ },
3949
+ {
3950
+ keys: "Ctrl + I",
3951
+ action: "기울임꼴"
3952
+ },
3953
+ {
3954
+ keys: "Ctrl + U",
3955
+ action: "밑줄"
3956
+ },
3957
+ {
3958
+ keys: "Ctrl + K",
3959
+ action: "링크 삽입 / 편집"
3960
+ }
3961
+ ]
3962
+ },
3963
+ {
3964
+ category: "실행 기록",
3965
+ items: [{
3966
+ keys: "Ctrl + Z",
3967
+ action: "실행 취소"
3968
+ }, {
3969
+ keys: "Ctrl + Y / Ctrl + Shift + Z",
3970
+ action: "다시 실행"
3971
+ }]
3972
+ },
3973
+ {
3974
+ category: "선택 및 탐색",
3975
+ items: [
3976
+ {
3977
+ keys: "Ctrl + A",
3978
+ action: "전체 선택"
3979
+ },
3980
+ {
3981
+ keys: "Tab",
3982
+ action: "목록 들여쓰기 / 공백 삽입"
3983
+ },
3984
+ {
3985
+ keys: "Shift + Tab",
3986
+ action: "목록 내어쓰기"
3987
+ }
3988
+ ]
3989
+ },
3990
+ {
3991
+ category: "클립보드",
3992
+ items: [{
3993
+ keys: "Ctrl + Shift + V",
3994
+ action: "일반 텍스트로 붙여넣기"
3995
+ }]
3996
+ },
3997
+ {
3998
+ category: "찾기 및 바꾸기",
3999
+ items: [{
4000
+ keys: "Ctrl + F",
4001
+ action: "문서에서 찾기"
4002
+ }, {
4003
+ keys: "Ctrl + H",
4004
+ action: "찾기 및 바꾸기"
4005
+ }]
4006
+ },
4007
+ {
4008
+ category: "편집기",
4009
+ items: [{
4010
+ keys: "Ctrl + Shift + /",
4011
+ action: "이 단축키 대화상자 표시"
4012
+ }]
4013
+ }
4014
+ ]
4015
+ },
4016
+ contextMenu: {
4017
+ cut: "잘라내기",
4018
+ copy: "복사",
4019
+ paste: "붙여넣기",
4020
+ bold: "굵게",
4021
+ italic: "기울임꼴",
4022
+ underline: "밑줄",
4023
+ textColor: "글자 색",
4024
+ highlightColor: "강조 색",
4025
+ copyFormat: "서식 복사",
4026
+ pasteFormat: "서식 붙여넣기",
4027
+ removeFormat: "서식 제거",
4028
+ link: "링크 삽입",
4029
+ image: "이미지 삽입",
4030
+ video: "동영상 삽입",
4031
+ table: "표 삽입",
4032
+ back: "뒤로",
4033
+ noHighlight: "강조 없음",
4034
+ customColor: "사용자 지정 색",
4035
+ customColorLabel: "사용자 지정…"
4036
+ },
4037
+ statusbar: {
4038
+ resizeHandle: "편집기 크기 조정",
4039
+ words: (n) => `단어: ${n}`,
4040
+ wordsLimit: (n, max) => `단어: ${n}/${max}`,
4041
+ chars: (n) => `글자: ${n}`,
4042
+ charsLimit: (n, max) => `글자: ${n}/${max}`
4043
+ },
4044
+ tooltips: {
4045
+ link: {
4046
+ ariaLabel: "링크 작업",
4047
+ openLink: "링크 열기",
4048
+ copyUrl: "URL 복사",
4049
+ editLink: "링크 편집",
4050
+ removeLink: "링크 제거"
4051
+ },
4052
+ image: {
4053
+ ariaLabel: "이미지 작업",
4054
+ label: "이미지",
4055
+ floatLeft: "왼쪽 배치",
4056
+ noFloat: "배치 없음",
4057
+ alignCenter: "가운데 정렬",
4058
+ floatRight: "오른쪽 배치",
4059
+ originalSize: "원본 크기",
4060
+ rotateLeft: "왼쪽 회전",
4061
+ rotateRight: "오른쪽 회전",
4062
+ cropImage: "이미지 자르기",
4063
+ addCaption: "캡션 추가 / 편집",
4064
+ deleteImage: "이미지 삭제"
4065
+ },
4066
+ code: {
4067
+ ariaLabel: "코드 블록 작업",
4068
+ label: "코드",
4069
+ syntaxLanguage: "구문 언어",
4070
+ syntaxAriaLabel: "구문 언어",
4071
+ copyCode: "코드 복사",
4072
+ toggleWordWrap: "줄 바꿈 전환",
4073
+ enableWordWrap: "줄 바꿈 사용",
4074
+ disableWordWrap: "줄 바꿈 해제",
4075
+ convertToParagraph: "단락으로 변환",
4076
+ deleteCodeBlock: "코드 블록 삭제"
4077
+ },
4078
+ table: {
4079
+ ariaLabel: "표 작업",
4080
+ label: "표",
4081
+ selectCells: "셀 선택",
4082
+ addRowAbove: "위에 행 추가",
4083
+ addRowBelow: "아래에 행 추가",
4084
+ deleteRow: "행 삭제",
4085
+ addColumnLeft: "왼쪽에 열 추가",
4086
+ addColumnRight: "오른쪽에 열 추가",
4087
+ deleteColumn: "열 삭제",
4088
+ mergeCells: "셀 병합",
4089
+ unmergeCells: "셀 분할",
4090
+ columnWidth: "열 너비",
4091
+ rowHeight: "행 높이",
4092
+ tableBorderWidth: "표 테두리 너비",
4093
+ deleteTable: "표 삭제",
4094
+ columnWidthPx: "열 너비 (px)",
4095
+ rowHeightPx: "행 높이 (px)",
4096
+ tableBorderWidthPx: "표 테두리 너비 (px)",
4097
+ cancelBtn: "취소",
4098
+ applyBtn: "적용"
4099
+ },
4100
+ video: {
4101
+ ariaLabel: "동영상 작업",
4102
+ label: "동영상",
4103
+ floatLeft: "왼쪽 배치",
4104
+ noFloat: "배치 없음",
4105
+ alignCenter: "가운데 정렬",
4106
+ floatRight: "오른쪽 배치",
4107
+ originalSize: "원본 크기",
4108
+ previewVideo: "동영상 미리보기",
4109
+ exitPreview: "미리보기 종료",
4110
+ deleteVideo: "동영상 삭제"
4111
+ }
4112
+ },
4113
+ errors: {
4114
+ imageFormat: (type) => `"${type}" 형식은 웹 브라우저에서 지원되지 않습니다. JPEG, PNG 또는 WebP로 변환해 주세요.`,
4115
+ imageSize: (maxSize) => `이미지 파일이 너무 큽니다. 최대 허용 크기는 ${maxSize} MB입니다.`
4116
+ }
4117
+ }
4118
+ };
4119
+ /**
4120
+ * Resolve a locale object from a lang option value.
4121
+ *
4122
+ * @param {string | Partial<AsnLocale> | null | undefined} lang
4123
+ * @returns {AsnLocale} A fully-populated locale (always contains every key from en.js).
4124
+ */
4125
+ function resolveLocale(lang) {
4126
+ if (!lang || lang === "en") return en;
4127
+ if (typeof lang === "string") {
4128
+ const partial = locales[lang];
4129
+ if (!partial) return en;
4130
+ return mergeDeep(mergeDeep({}, en), partial);
4131
+ }
4132
+ if (typeof lang === "object") return mergeDeep(mergeDeep({}, en), lang);
4133
+ return en;
4134
+ }
4135
+ /**
4136
+ * @typedef {Object} AsnLocale (see types/index.d.ts for the full definition)
4137
+ */
4138
+ //#endregion
1449
4139
  //#region src/js/core/sanitise.js
1450
4140
  /**
1451
4141
  * sanitise.js - Shared HTML and URL sanitisation utilities
@@ -3096,9 +5786,9 @@ var Toolbar = class {
3096
5786
  const btn = createElement("button", {
3097
5787
  type: "button",
3098
5788
  class: !!this.options.useBootstrap ? this.options.toolbarButtonClass || "btn btn-sm btn-light" : "an-btn",
3099
- title: def.tooltip || "",
5789
+ title: this.context.locale.toolbar[def.name] || def.tooltip || "",
3100
5790
  "data-btn": def.name,
3101
- "aria-label": def.tooltip || def.name,
5791
+ "aria-label": this.context.locale.toolbar[def.name] || def.tooltip || def.name,
3102
5792
  "aria-haspopup": "true",
3103
5793
  "aria-expanded": "false"
3104
5794
  });
@@ -3111,7 +5801,7 @@ var Toolbar = class {
3111
5801
  });
3112
5802
  const grid = createElement("div", { class: "an-table-grid" });
3113
5803
  const label = createElement("div", { class: "an-table-label" });
3114
- label.textContent = "Insert Table";
5804
+ label.textContent = this.context.locale.toolbar.insertTableLabel || "Insert Table";
3115
5805
  const cells = [];
3116
5806
  for (let r = 1; r <= ROWS; r++) for (let c = 1; c <= COLS; c++) {
3117
5807
  const cell = createElement("div", {
@@ -3131,7 +5821,7 @@ var Toolbar = class {
3131
5821
  const c = +cell.getAttribute("data-col");
3132
5822
  cell.classList.toggle("active", r <= rows && c <= cols);
3133
5823
  });
3134
- label.textContent = rows && cols ? `${rows} × ${cols}` : "Insert Table";
5824
+ label.textContent = rows && cols ? `${rows} × ${cols}` : this.context.locale.toolbar.insertTableLabel || "Insert Table";
3135
5825
  };
3136
5826
  const openPopup = () => {
3137
5827
  isOpen = true;
@@ -3211,9 +5901,9 @@ var Toolbar = class {
3211
5901
  const applyBtn = createElement("button", {
3212
5902
  type: "button",
3213
5903
  class: `${baseClass} an-color-btn`,
3214
- title: def.tooltip || "",
5904
+ title: this.context.locale.toolbar[def.name] || def.tooltip || "",
3215
5905
  "data-btn": def.name,
3216
- "aria-label": def.tooltip || def.name
5906
+ "aria-label": this.context.locale.toolbar[def.name] || def.tooltip || def.name
3217
5907
  });
3218
5908
  const S = "stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"";
3219
5909
  applyBtn.innerHTML = def.name === "foreColor" ? `<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" ${S} style="display:block"><path d="M4 20L12 4L20 20"/><line x1="7.5" y1="14" x2="16.5" y2="14"/></svg>` : `<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" ${S} style="display:block"><path d="M3 21v-4l9-9 4 4-9 9z"/><path d="M12 8l4 4"/></svg>`;
@@ -3223,7 +5913,7 @@ var Toolbar = class {
3223
5913
  const arrowBtn = createElement("button", {
3224
5914
  type: "button",
3225
5915
  class: `${baseClass} an-color-arrow`,
3226
- title: `Choose ${def.name === "foreColor" ? "text" : "highlight"} color`,
5916
+ title: def.name === "foreColor" ? this.context.locale.toolbar.chooseTextColor || "Choose text color" : this.context.locale.toolbar.chooseHighlightColor || "Choose highlight color",
3227
5917
  "aria-haspopup": "true",
3228
5918
  "aria-expanded": "false"
3229
5919
  });
@@ -3245,9 +5935,9 @@ var Toolbar = class {
3245
5935
  const colorInput = createElement("input", {
3246
5936
  type: "color",
3247
5937
  value: currentColor,
3248
- title: "Custom color"
5938
+ title: this.context.locale.toolbar.customColor || "Custom color"
3249
5939
  });
3250
- const customLabel = createElement("span", {}, ["Custom color"]);
5940
+ const customLabel = createElement("span", {}, [this.context.locale.toolbar.customColor || "Custom color"]);
3251
5941
  customRow.appendChild(colorInput);
3252
5942
  customRow.appendChild(customLabel);
3253
5943
  popup.appendChild(swatches);
@@ -3357,19 +6047,19 @@ var Toolbar = class {
3357
6047
  const items = def.name === "fontFamily" ? this.options.fontFamilies || [] : def.items || [];
3358
6048
  const select = createElement("select", {
3359
6049
  class: def.selectClass ? `an-select ${def.selectClass}` : "an-select",
3360
- title: def.tooltip || "",
6050
+ title: this.context.locale.toolbar[def.name] || def.tooltip || "",
3361
6051
  "data-btn": def.name,
3362
- "aria-label": def.tooltip || def.name
6052
+ "aria-label": this.context.locale.toolbar[def.name] || def.tooltip || def.name
3363
6053
  });
3364
6054
  const placeholder = createElement("option", {
3365
6055
  value: "",
3366
6056
  disabled: "",
3367
6057
  hidden: ""
3368
- }, [def.placeholder || "Font"]);
6058
+ }, [this.context.locale.toolbar[def.name + "Placeholder"] || def.placeholder || "Font"]);
3369
6059
  select.appendChild(placeholder);
3370
6060
  items.forEach((item) => {
3371
6061
  const value = typeof item === "object" ? item.value : item;
3372
- const label = typeof item === "object" ? item.label : item;
6062
+ const label = typeof item === "object" ? def.name === "paragraphStyle" ? (this.context.locale.toolbar.paragraphItems || {})[item.value] || item.label : item.label : item;
3373
6063
  const isHeader = typeof item === "object" && !!item.disabled;
3374
6064
  const attrs = { value };
3375
6065
  if (isHeader) attrs.disabled = "";
@@ -3409,9 +6099,9 @@ var Toolbar = class {
3409
6099
  const btn = createElement("button", {
3410
6100
  type: "button",
3411
6101
  class: `${!!this.options.useBootstrap ? this.options.toolbarButtonClass || "btn btn-sm btn-light" : `an-btn`}${btnDef.className ? ` ${btnDef.className}` : ""}`,
3412
- title: btnDef.tooltip || "",
6102
+ title: this.context.locale.toolbar[btnDef.name] || btnDef.tooltip || "",
3413
6103
  "data-btn": btnDef.name,
3414
- "aria-label": btnDef.tooltip || btnDef.name
6104
+ "aria-label": this.context.locale.toolbar[btnDef.name] || btnDef.tooltip || btnDef.name
3415
6105
  });
3416
6106
  const faPrefix = this.options.fontAwesomeClass || "fas";
3417
6107
  if (this._faReady) {
@@ -3536,7 +6226,7 @@ var Statusbar = class {
3536
6226
  if (this.options.resizable !== false) {
3537
6227
  const handle = createElement("div", {
3538
6228
  class: "an-resize-handle",
3539
- title: "Resize editor",
6229
+ title: this.context.locale.statusbar.resizeHandle,
3540
6230
  "aria-hidden": "true"
3541
6231
  });
3542
6232
  this._bindResize(handle);
@@ -3626,8 +6316,9 @@ var Statusbar = class {
3626
6316
  const chars = text.replace(/\n/g, "").length;
3627
6317
  const maxWords = this.options.maxWords || 0;
3628
6318
  const maxChars = this.options.maxChars || 0;
3629
- this._wordCountEl.textContent = maxWords ? `Words: ${words}/${maxWords}` : `Words: ${words}`;
3630
- this._charCountEl.textContent = maxChars ? `Chars: ${chars}/${maxChars}` : `Chars: ${chars}`;
6319
+ const LS = this.context.locale.statusbar;
6320
+ this._wordCountEl.textContent = maxWords ? LS.wordsLimit(words, maxWords) : LS.words(words);
6321
+ this._charCountEl.textContent = maxChars ? LS.charsLimit(chars, maxChars) : LS.chars(chars);
3631
6322
  _applyLimitClass(this._wordCountEl, words, maxWords);
3632
6323
  _applyLimitClass(this._charCountEl, chars, maxChars);
3633
6324
  }
@@ -4224,32 +6915,33 @@ var LinkDialog = class {
4224
6915
  this._open();
4225
6916
  }
4226
6917
  _buildDialog() {
6918
+ const L = this.context.locale.linkDialog;
4227
6919
  const overlay = createElement("div", {
4228
6920
  class: "an-dialog-overlay",
4229
6921
  role: "dialog",
4230
6922
  "aria-modal": "true",
4231
- "aria-label": "Insert link"
6923
+ "aria-label": L.ariaLabel
4232
6924
  });
4233
6925
  const box = createElement("div", { class: "an-dialog-box" });
4234
6926
  const title = createElement("h3", { class: "an-dialog-title" });
4235
- title.textContent = "Insert Link";
6927
+ title.textContent = L.title;
4236
6928
  const urlLabel = createElement("label", { class: "an-label" });
4237
- urlLabel.textContent = "URL";
6929
+ urlLabel.textContent = L.url;
4238
6930
  const urlInput = createElement("input", {
4239
6931
  type: "url",
4240
6932
  class: "an-input",
4241
- placeholder: "https://",
6933
+ placeholder: L.urlPlaceholder,
4242
6934
  id: "an-link-url",
4243
6935
  name: "url",
4244
6936
  autocomplete: "off"
4245
6937
  });
4246
6938
  this._urlInput = urlInput;
4247
6939
  const textLabel = createElement("label", { class: "an-label" });
4248
- textLabel.textContent = "Display Text";
6940
+ textLabel.textContent = L.displayText;
4249
6941
  const textInput = createElement("input", {
4250
6942
  type: "text",
4251
6943
  class: "an-input",
4252
- placeholder: "Link text",
6944
+ placeholder: L.textPlaceholder,
4253
6945
  id: "an-link-text",
4254
6946
  name: "linkText",
4255
6947
  autocomplete: "off"
@@ -4263,18 +6955,18 @@ var LinkDialog = class {
4263
6955
  });
4264
6956
  this._tabCheckbox = tabCheckbox;
4265
6957
  tabLabel.appendChild(tabCheckbox);
4266
- tabLabel.appendChild(document.createTextNode(" Open in new tab"));
6958
+ tabLabel.appendChild(document.createTextNode(" " + L.openInNewTab));
4267
6959
  const btnRow = createElement("div", { class: "an-dialog-actions" });
4268
6960
  const insertBtn = createElement("button", {
4269
6961
  type: "button",
4270
6962
  class: "an-btn an-btn-primary"
4271
6963
  });
4272
- insertBtn.textContent = "Insert";
6964
+ insertBtn.textContent = L.insertBtn;
4273
6965
  const cancelBtn = createElement("button", {
4274
6966
  type: "button",
4275
6967
  class: "an-btn"
4276
6968
  });
4277
- cancelBtn.textContent = "Cancel";
6969
+ cancelBtn.textContent = L.cancelBtn;
4278
6970
  btnRow.appendChild(insertBtn);
4279
6971
  btnRow.appendChild(cancelBtn);
4280
6972
  box.append(title, urlLabel, urlInput, textLabel, textInput, tabLabel, btnRow);
@@ -4400,53 +7092,54 @@ var ImageDialog = class {
4400
7092
  this._open();
4401
7093
  }
4402
7094
  _buildDialog() {
7095
+ const L = this.context.locale.imageDialog;
4403
7096
  const overlay = createElement("div", {
4404
7097
  class: "an-dialog-overlay",
4405
7098
  role: "dialog",
4406
7099
  "aria-modal": "true",
4407
- "aria-label": "Insert image"
7100
+ "aria-label": L.ariaLabel
4408
7101
  });
4409
7102
  const box = createElement("div", { class: "an-dialog-box" });
4410
7103
  const title = createElement("h3", { class: "an-dialog-title" });
4411
- title.textContent = "Insert Image";
7104
+ title.textContent = L.title;
4412
7105
  const urlLabel = createElement("label", { class: "an-label" });
4413
- urlLabel.textContent = "Image URL";
7106
+ urlLabel.textContent = L.imageUrl;
4414
7107
  const urlInput = createElement("input", {
4415
7108
  type: "url",
4416
7109
  class: "an-input",
4417
- placeholder: "https://example.com/image.png",
7110
+ placeholder: L.urlPlaceholder,
4418
7111
  autocomplete: "off"
4419
7112
  });
4420
7113
  this._urlInput = urlInput;
4421
7114
  const altLabel = createElement("label", { class: "an-label" });
4422
- altLabel.textContent = "Alt Text";
7115
+ altLabel.textContent = L.altText;
4423
7116
  const altInput = createElement("input", {
4424
7117
  type: "text",
4425
7118
  class: "an-input",
4426
- placeholder: "Describe the image",
7119
+ placeholder: L.altPlaceholder,
4427
7120
  autocomplete: "off"
4428
7121
  });
4429
7122
  this._altInput = altInput;
4430
7123
  box.append(title, urlLabel, urlInput, altLabel, altInput);
4431
7124
  const alignLabel = createElement("label", { class: "an-label" });
4432
- alignLabel.textContent = "Alignment";
7125
+ alignLabel.textContent = L.alignment;
4433
7126
  const alignRow = createElement("div", { class: "an-align-row" });
4434
7127
  [
4435
7128
  {
4436
7129
  value: "",
4437
- label: "None"
7130
+ label: L.alignNone
4438
7131
  },
4439
7132
  {
4440
7133
  value: "left",
4441
- label: "Left"
7134
+ label: L.alignLeft
4442
7135
  },
4443
7136
  {
4444
7137
  value: "center",
4445
- label: "Center"
7138
+ label: L.alignCenter
4446
7139
  },
4447
7140
  {
4448
7141
  value: "right",
4449
- label: "Right"
7142
+ label: L.alignRight
4450
7143
  }
4451
7144
  ].forEach(({ value, label }) => {
4452
7145
  const radioId = `an-align-${value || "none"}`;
@@ -4468,7 +7161,7 @@ var ImageDialog = class {
4468
7161
  box.append(alignLabel, alignRow);
4469
7162
  if (this.options.allowImageUpload !== false) {
4470
7163
  const fileLabel = createElement("label", { class: "an-label" });
4471
- fileLabel.textContent = "Or upload a file";
7164
+ fileLabel.textContent = L.uploadLabel;
4472
7165
  const fileInput = createElement("input", {
4473
7166
  type: "file",
4474
7167
  class: "an-input",
@@ -4486,12 +7179,12 @@ var ImageDialog = class {
4486
7179
  type: "button",
4487
7180
  class: "an-btn an-btn-primary"
4488
7181
  });
4489
- insertBtn.textContent = "Insert";
7182
+ insertBtn.textContent = L.insertBtn;
4490
7183
  const cancelBtn = createElement("button", {
4491
7184
  type: "button",
4492
7185
  class: "an-btn"
4493
7186
  });
4494
- cancelBtn.textContent = "Cancel";
7187
+ cancelBtn.textContent = L.cancelBtn;
4495
7188
  btnRow.appendChild(insertBtn);
4496
7189
  btnRow.appendChild(cancelBtn);
4497
7190
  box.append(btnRow);
@@ -4527,7 +7220,7 @@ var ImageDialog = class {
4527
7220
  "image/svg+xml",
4528
7221
  "image/avif"
4529
7222
  ]).has(file.type)) {
4530
- const message = `Format "${file.type}" is not supported for display in web browsers. Please convert to JPEG, PNG, or WebP first.`;
7223
+ const message = this.context.locale.errors.imageFormat(file.type);
4531
7224
  if (this._fileHint) this._fileHint.textContent = message;
4532
7225
  this.context.triggerEvent("imageError", {
4533
7226
  file,
@@ -4539,7 +7232,7 @@ var ImageDialog = class {
4539
7232
  if (this._fileHint) this._fileHint.textContent = "";
4540
7233
  const maxSize = (this.options.maxImageSize || 5) * 1024 * 1024;
4541
7234
  if (file.size > maxSize) {
4542
- const message = `Image file is too large. Maximum allowed size is ${this.options.maxImageSize || 5} MB.`;
7235
+ const message = this.context.locale.errors.imageSize(this.options.maxImageSize || 5);
4543
7236
  if (this._fileHint) this._fileHint.textContent = message;
4544
7237
  console.warn("[AutumnNote] ImageDialog:", message);
4545
7238
  this.context.triggerEvent("imageError", {
@@ -4625,28 +7318,29 @@ var VideoDialog = class {
4625
7318
  this._open();
4626
7319
  }
4627
7320
  _buildDialog() {
7321
+ const L = this.context.locale.videoDialog;
4628
7322
  const overlay = createElement("div", {
4629
7323
  class: "an-dialog-overlay",
4630
7324
  role: "dialog",
4631
7325
  "aria-modal": "true",
4632
- "aria-label": "Insert video"
7326
+ "aria-label": L.ariaLabel
4633
7327
  });
4634
7328
  const box = createElement("div", { class: "an-dialog-box" });
4635
7329
  const title = createElement("h3", { class: "an-dialog-title" });
4636
- title.textContent = "Insert Video";
7330
+ title.textContent = L.title;
4637
7331
  const urlLabel = createElement("label", { class: "an-label" });
4638
- urlLabel.textContent = "Video URL";
7332
+ urlLabel.textContent = L.videoUrl;
4639
7333
  const urlInput = createElement("input", {
4640
7334
  type: "url",
4641
7335
  class: "an-input",
4642
- placeholder: "YouTube, Vimeo, or direct .mp4 URL",
7336
+ placeholder: L.urlPlaceholder,
4643
7337
  autocomplete: "off"
4644
7338
  });
4645
7339
  this._urlInput = urlInput;
4646
7340
  const hintEl = createElement("p", { class: "an-dialog-hint" });
4647
7341
  this._hintEl = hintEl;
4648
7342
  const widthLabel = createElement("label", { class: "an-label" });
4649
- widthLabel.textContent = "Width (px)";
7343
+ widthLabel.textContent = L.widthLabel;
4650
7344
  const widthInput = createElement("input", {
4651
7345
  type: "number",
4652
7346
  class: "an-input",
@@ -4661,19 +7355,19 @@ var VideoDialog = class {
4661
7355
  type: "button",
4662
7356
  class: "an-btn an-btn-primary"
4663
7357
  });
4664
- insertBtn.textContent = "Insert";
7358
+ insertBtn.textContent = L.insertBtn;
4665
7359
  const cancelBtn = createElement("button", {
4666
7360
  type: "button",
4667
7361
  class: "an-btn"
4668
7362
  });
4669
- cancelBtn.textContent = "Cancel";
7363
+ cancelBtn.textContent = L.cancelBtn;
4670
7364
  btnRow.appendChild(insertBtn);
4671
7365
  btnRow.appendChild(cancelBtn);
4672
7366
  box.append(title, urlLabel, urlInput, hintEl, widthLabel, widthInput, btnRow);
4673
7367
  overlay.appendChild(box);
4674
7368
  const d0 = on(urlInput, "input", () => {
4675
7369
  const info = this._parseVideoUrl(urlInput.value.trim());
4676
- hintEl.textContent = info ? `Detected: ${info.type}` : urlInput.value ? "Unknown format — will try direct video embed" : "";
7370
+ hintEl.textContent = info ? this.context.locale.videoDialog.detected(info.type) : urlInput.value ? this.context.locale.videoDialog.unknownFormat : "";
4677
7371
  });
4678
7372
  const d1 = on(insertBtn, "click", () => this._onInsert());
4679
7373
  const d2 = on(cancelBtn, "click", () => this._close());
@@ -4698,7 +7392,7 @@ var VideoDialog = class {
4698
7392
  }
4699
7393
  const html = this._buildEmbedHtml(rawUrl, width);
4700
7394
  if (!html) {
4701
- this._hintEl.textContent = "Invalid URL — please enter a valid video link.";
7395
+ this._hintEl.textContent = this.context.locale.videoDialog.invalidUrl;
4702
7396
  this._urlInput.focus();
4703
7397
  return;
4704
7398
  }
@@ -5270,19 +7964,20 @@ var LinkTooltip = class {
5270
7964
  this._el = null;
5271
7965
  }
5272
7966
  _buildTooltip() {
7967
+ const L = this.context.locale.tooltips.link;
5273
7968
  const el = createElement("div", {
5274
7969
  class: "an-link-tooltip",
5275
7970
  role: "toolbar",
5276
- "aria-label": "Link actions"
7971
+ "aria-label": L.ariaLabel
5277
7972
  });
5278
7973
  el.style.display = "none";
5279
7974
  this._urlLabel = createElement("span", { class: "an-link-tooltip-url" });
5280
7975
  el.appendChild(this._urlLabel);
5281
7976
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5282
- this._openBtn = this._makeBtn(ICONS$5.open, "Open link", () => this._openLink());
5283
- this._copyBtn = this._makeBtn(ICONS$5.copy, "Copy URL", () => this._copyLink());
5284
- this._editBtn = this._makeBtn(ICONS$5.edit, "Edit link", () => this._editLink());
5285
- this._unlinkBtn = this._makeBtn(ICONS$5.unlink, "Remove link", () => this._unlink());
7977
+ this._openBtn = this._makeBtn(ICONS$5.open, L.openLink, () => this._openLink());
7978
+ this._copyBtn = this._makeBtn(ICONS$5.copy, L.copyUrl, () => this._copyLink());
7979
+ this._editBtn = this._makeBtn(ICONS$5.edit, L.editLink, () => this._editLink());
7980
+ this._unlinkBtn = this._makeBtn(ICONS$5.unlink, L.removeLink, () => this._unlink());
5286
7981
  el.appendChild(this._openBtn);
5287
7982
  el.appendChild(this._copyBtn);
5288
7983
  el.appendChild(this._editBtn);
@@ -5461,38 +8156,39 @@ var ImageTooltip = class {
5461
8156
  this._el = null;
5462
8157
  }
5463
8158
  _buildTooltip() {
8159
+ const L = this.context.locale.tooltips.image;
5464
8160
  const el = createElement("div", {
5465
8161
  class: "an-link-tooltip an-image-tooltip",
5466
8162
  role: "toolbar",
5467
- "aria-label": "Image actions"
8163
+ "aria-label": L.ariaLabel
5468
8164
  });
5469
8165
  el.style.display = "none";
5470
8166
  this._label = createElement("span", { class: "an-link-tooltip-url" });
5471
- this._label.textContent = "Image";
8167
+ this._label.textContent = L.label;
5472
8168
  el.appendChild(this._label);
5473
8169
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5474
- this._floatLeftBtn = this._makeBtn(ICONS$4.floatLeft, "Float Left", () => this._setFloat("left"));
5475
- this._floatNoneBtn = this._makeBtn(ICONS$4.floatNone, "No Float", () => this._setFloat(""));
5476
- this._alignCenterBtn = this._makeBtn(ICONS$4.alignCenter, "Align Center", () => this._setCenter());
5477
- this._floatRightBtn = this._makeBtn(ICONS$4.floatRight, "Float Right", () => this._setFloat("right"));
8170
+ this._floatLeftBtn = this._makeBtn(ICONS$4.floatLeft, L.floatLeft, () => this._setFloat("left"));
8171
+ this._floatNoneBtn = this._makeBtn(ICONS$4.floatNone, L.noFloat, () => this._setFloat(""));
8172
+ this._alignCenterBtn = this._makeBtn(ICONS$4.alignCenter, L.alignCenter, () => this._setCenter());
8173
+ this._floatRightBtn = this._makeBtn(ICONS$4.floatRight, L.floatRight, () => this._setFloat("right"));
5478
8174
  el.appendChild(this._floatLeftBtn);
5479
8175
  el.appendChild(this._floatNoneBtn);
5480
8176
  el.appendChild(this._alignCenterBtn);
5481
8177
  el.appendChild(this._floatRightBtn);
5482
8178
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5483
- this._originalBtn = this._makeBtn(ICONS$4.originalSize, "Original Size", () => this._resetSize());
8179
+ this._originalBtn = this._makeBtn(ICONS$4.originalSize, L.originalSize, () => this._resetSize());
5484
8180
  el.appendChild(this._originalBtn);
5485
8181
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5486
- el.appendChild(this._makeBtn(ICONS$4.rotateLeft, "Rotate Left", () => this._rotate(-90)));
5487
- el.appendChild(this._makeBtn(ICONS$4.rotateRight, "Rotate Right", () => this._rotate(90)));
8182
+ el.appendChild(this._makeBtn(ICONS$4.rotateLeft, L.rotateLeft, () => this._rotate(-90)));
8183
+ el.appendChild(this._makeBtn(ICONS$4.rotateRight, L.rotateRight, () => this._rotate(90)));
5488
8184
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5489
- this._cropBtn = this._makeBtn(ICONS$4.crop, "Crop Image", () => this._crop());
8185
+ this._cropBtn = this._makeBtn(ICONS$4.crop, L.cropImage, () => this._crop());
5490
8186
  el.appendChild(this._cropBtn);
5491
8187
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5492
- this._captionBtn = this._makeBtn(ICONS$4.caption, "Add / Edit Caption", () => this._toggleCaption());
8188
+ this._captionBtn = this._makeBtn(ICONS$4.caption, L.addCaption, () => this._toggleCaption());
5493
8189
  el.appendChild(this._captionBtn);
5494
8190
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5495
- this._deleteBtn = this._makeBtn(ICONS$4.deleteImg, "Delete Image", () => this._delete(), true);
8191
+ this._deleteBtn = this._makeBtn(ICONS$4.deleteImg, L.deleteImage, () => this._delete(), true);
5496
8192
  el.appendChild(this._deleteBtn);
5497
8193
  this._disposers.push(on(el, "mouseenter", () => this._clearTimers()), on(el, "mouseleave", () => this._scheduleHide()));
5498
8194
  return el;
@@ -5744,32 +8440,33 @@ var VideoTooltip = class {
5744
8440
  this._el = null;
5745
8441
  }
5746
8442
  _buildTooltip() {
8443
+ const L = this.context.locale.tooltips.video;
5747
8444
  const el = createElement("div", {
5748
8445
  class: "an-link-tooltip an-video-tooltip",
5749
8446
  role: "toolbar",
5750
- "aria-label": "Video actions"
8447
+ "aria-label": L.ariaLabel
5751
8448
  });
5752
8449
  el.style.display = "none";
5753
8450
  this._label = createElement("span", { class: "an-link-tooltip-url" });
5754
- this._label.textContent = "Video";
8451
+ this._label.textContent = L.label;
5755
8452
  el.appendChild(this._label);
5756
8453
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5757
- this._floatLeftBtn = this._makeBtn(ICONS$3.floatLeft, "Float Left", () => this._setFloat("left"));
5758
- this._floatNoneBtn = this._makeBtn(ICONS$3.floatNone, "No Float", () => this._setFloat(""));
5759
- this._alignCenterBtn = this._makeBtn(ICONS$3.alignCenter, "Align Center", () => this._setCenter());
5760
- this._floatRightBtn = this._makeBtn(ICONS$3.floatRight, "Float Right", () => this._setFloat("right"));
8454
+ this._floatLeftBtn = this._makeBtn(ICONS$3.floatLeft, L.floatLeft, () => this._setFloat("left"));
8455
+ this._floatNoneBtn = this._makeBtn(ICONS$3.floatNone, L.noFloat, () => this._setFloat(""));
8456
+ this._alignCenterBtn = this._makeBtn(ICONS$3.alignCenter, L.alignCenter, () => this._setCenter());
8457
+ this._floatRightBtn = this._makeBtn(ICONS$3.floatRight, L.floatRight, () => this._setFloat("right"));
5761
8458
  el.appendChild(this._floatLeftBtn);
5762
8459
  el.appendChild(this._floatNoneBtn);
5763
8460
  el.appendChild(this._alignCenterBtn);
5764
8461
  el.appendChild(this._floatRightBtn);
5765
8462
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5766
- this._originalBtn = this._makeBtn(ICONS$3.originalSize, "Original Size", () => this._resetSize());
8463
+ this._originalBtn = this._makeBtn(ICONS$3.originalSize, L.originalSize, () => this._resetSize());
5767
8464
  el.appendChild(this._originalBtn);
5768
8465
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5769
- this._previewBtn = this._makeBtn(ICONS$3.preview, "Preview Video", () => this._togglePreview());
8466
+ this._previewBtn = this._makeBtn(ICONS$3.preview, L.previewVideo, () => this._togglePreview());
5770
8467
  el.appendChild(this._previewBtn);
5771
8468
  el.appendChild(createElement("div", { class: "an-link-tooltip-sep" }));
5772
- this._deleteBtn = this._makeBtn(ICONS$3.deleteVideo, "Delete Video", () => this._delete(), true);
8469
+ this._deleteBtn = this._makeBtn(ICONS$3.deleteVideo, L.deleteVideo, () => this._delete(), true);
5773
8470
  el.appendChild(this._deleteBtn);
5774
8471
  this._disposers.push(on(el, "mouseenter", () => this._clearTimers()), on(el, "mouseleave", () => this._scheduleHide()));
5775
8472
  return el;
@@ -5906,7 +8603,7 @@ var VideoTooltip = class {
5906
8603
  if (shield) shield.style.display = "none";
5907
8604
  this.context.invoke("videoResizer.deselect");
5908
8605
  this._previewBtn.classList.add("an-link-tooltip-btn--copied");
5909
- this._previewBtn.title = "Exit Preview";
8606
+ this._previewBtn.title = this.context.locale.tooltips.video.exitPreview;
5910
8607
  this._previewClickOff = (e) => {
5911
8608
  if (!wrapper.contains(e.target) && !this._el.contains(e.target)) this._exitPreview();
5912
8609
  };
@@ -5920,7 +8617,7 @@ var VideoTooltip = class {
5920
8617
  if (shield) shield.style.display = "";
5921
8618
  }
5922
8619
  this._previewBtn.classList.remove("an-link-tooltip-btn--copied");
5923
- this._previewBtn.title = "Preview Video";
8620
+ this._previewBtn.title = this.context.locale.tooltips.video.previewVideo;
5924
8621
  if (this._previewClickOff) {
5925
8622
  document.removeEventListener("mousedown", this._previewClickOff, true);
5926
8623
  this._previewClickOff = null;
@@ -6234,35 +8931,36 @@ var TableTooltip = class {
6234
8931
  this._sizePopover = null;
6235
8932
  }
6236
8933
  _buildTooltip() {
8934
+ const L = this.context.locale.tooltips.table;
6237
8935
  const el = createElement("div", {
6238
8936
  class: "an-link-tooltip an-table-tooltip",
6239
8937
  role: "toolbar",
6240
- "aria-label": "Table actions"
8938
+ "aria-label": L.ariaLabel
6241
8939
  });
6242
8940
  el.style.display = "none";
6243
8941
  this._label = createElement("span", { class: "an-link-tooltip-url" });
6244
- this._label.textContent = "Table";
8942
+ this._label.textContent = L.label;
6245
8943
  el.appendChild(this._label);
6246
8944
  el.appendChild(this._sep());
6247
- this._selectBtn = this._makeBtn(ICONS$2.selectCells, "Select Cells", () => this._toggleSelectMode());
8945
+ this._selectBtn = this._makeBtn(ICONS$2.selectCells, L.selectCells, () => this._toggleSelectMode());
6248
8946
  el.appendChild(this._selectBtn);
6249
8947
  el.appendChild(this._sep());
6250
- el.appendChild(this._makeBtn(ICONS$2.rowAbove, "Add Row Above", () => this._addRow("above")));
6251
- el.appendChild(this._makeBtn(ICONS$2.rowBelow, "Add Row Below", () => this._addRow("below")));
6252
- el.appendChild(this._makeBtn(ICONS$2.deleteRow, "Delete Row", () => this._deleteRow()));
8948
+ el.appendChild(this._makeBtn(ICONS$2.rowAbove, L.addRowAbove, () => this._addRow("above")));
8949
+ el.appendChild(this._makeBtn(ICONS$2.rowBelow, L.addRowBelow, () => this._addRow("below")));
8950
+ el.appendChild(this._makeBtn(ICONS$2.deleteRow, L.deleteRow, () => this._deleteRow()));
6253
8951
  el.appendChild(this._sep());
6254
- el.appendChild(this._makeBtn(ICONS$2.colLeft, "Add Column Left", () => this._addColumn("left")));
6255
- el.appendChild(this._makeBtn(ICONS$2.colRight, "Add Column Right", () => this._addColumn("right")));
6256
- el.appendChild(this._makeBtn(ICONS$2.deleteCol, "Delete Column", () => this._deleteColumn()));
8952
+ el.appendChild(this._makeBtn(ICONS$2.colLeft, L.addColumnLeft, () => this._addColumn("left")));
8953
+ el.appendChild(this._makeBtn(ICONS$2.colRight, L.addColumnRight, () => this._addColumn("right")));
8954
+ el.appendChild(this._makeBtn(ICONS$2.deleteCol, L.deleteColumn, () => this._deleteColumn()));
6257
8955
  el.appendChild(this._sep());
6258
- el.appendChild(this._makeBtn(ICONS$2.mergeCells, "Merge Cells", () => this._mergeCells()));
6259
- el.appendChild(this._makeBtn(ICONS$2.unmergeCells, "Unmerge Cells", () => this._unmergeCells()));
8956
+ el.appendChild(this._makeBtn(ICONS$2.mergeCells, L.mergeCells, () => this._mergeCells()));
8957
+ el.appendChild(this._makeBtn(ICONS$2.unmergeCells, L.unmergeCells, () => this._unmergeCells()));
6260
8958
  el.appendChild(this._sep());
6261
- el.appendChild(this._makeBtn(ICONS$2.colWidth, "Column Width", () => this._openSizePopover("col")));
6262
- el.appendChild(this._makeBtn(ICONS$2.rowHeight, "Row Height", () => this._openSizePopover("row")));
6263
- el.appendChild(this._makeBtn(ICONS$2.tableBorder, "Table Border Width", () => this._openSizePopover("border")));
8959
+ el.appendChild(this._makeBtn(ICONS$2.colWidth, L.columnWidth, () => this._openSizePopover("col")));
8960
+ el.appendChild(this._makeBtn(ICONS$2.rowHeight, L.rowHeight, () => this._openSizePopover("row")));
8961
+ el.appendChild(this._makeBtn(ICONS$2.tableBorder, L.tableBorderWidth, () => this._openSizePopover("border")));
6264
8962
  el.appendChild(this._sep());
6265
- el.appendChild(this._makeBtn(ICONS$2.deleteTable, "Delete Table", () => this._deleteTable(), true));
8963
+ el.appendChild(this._makeBtn(ICONS$2.deleteTable, L.deleteTable, () => this._deleteTable(), true));
6266
8964
  this._disposers.push(on(el, "mouseenter", () => this._clearTimers()), on(el, "mouseleave", () => {
6267
8965
  if (this._selectMode) return;
6268
8966
  if (this._sizePopover && this._sizePopover.style.display !== "none") return;
@@ -6660,12 +9358,12 @@ var TableTooltip = class {
6660
9358
  type: "button",
6661
9359
  class: "an-btn"
6662
9360
  });
6663
- cancelBtn.textContent = "Cancel";
9361
+ cancelBtn.textContent = this.context.locale.tooltips.table.cancelBtn;
6664
9362
  const applyBtn = createElement("button", {
6665
9363
  type: "button",
6666
9364
  class: "an-btn an-btn-primary"
6667
9365
  });
6668
- applyBtn.textContent = "Apply";
9366
+ applyBtn.textContent = this.context.locale.tooltips.table.applyBtn;
6669
9367
  actionsEl.appendChild(cancelBtn);
6670
9368
  actionsEl.appendChild(applyBtn);
6671
9369
  popover.appendChild(titleEl);
@@ -6703,7 +9401,7 @@ var TableTooltip = class {
6703
9401
  if (!table) return;
6704
9402
  const firstCell = table.querySelector("td, th");
6705
9403
  const currentPx = firstCell ? parseInt(firstCell.style.borderWidth, 10) || parseInt(window.getComputedStyle(firstCell).borderWidth, 10) || 1 : 1;
6706
- this._sizeTitleEl.textContent = "Table Border Width (px)";
9404
+ this._sizeTitleEl.textContent = this.context.locale.tooltips.table.tableBorderWidthPx;
6707
9405
  this._sizeInputEl.min = "0";
6708
9406
  this._sizeInputEl.max = "10";
6709
9407
  this._sizeInputEl.value = currentPx;
@@ -6725,7 +9423,7 @@ var TableTooltip = class {
6725
9423
  const t = c.closest("table");
6726
9424
  return t && t === cell.closest("table");
6727
9425
  });
6728
- this._sizeTitleEl.textContent = isCol ? "Column Width (px)" : "Row Height (px)";
9426
+ this._sizeTitleEl.textContent = isCol ? this.context.locale.tooltips.table.columnWidthPx : this.context.locale.tooltips.table.rowHeightPx;
6729
9427
  this._sizeInputEl.min = "1";
6730
9428
  this._sizeInputEl.max = "2000";
6731
9429
  this._sizeInputEl.value = isCol ? cell.offsetWidth || 120 : cell.closest("tr") ? cell.closest("tr").offsetHeight || 40 : 40;
@@ -6825,20 +9523,21 @@ var CodeTooltip = class {
6825
9523
  this._el = null;
6826
9524
  }
6827
9525
  _buildTooltip() {
9526
+ const L = this.context.locale.tooltips.code;
6828
9527
  const el = createElement("div", {
6829
9528
  class: "an-link-tooltip an-code-tooltip",
6830
9529
  role: "toolbar",
6831
- "aria-label": "Code block actions"
9530
+ "aria-label": L.ariaLabel
6832
9531
  });
6833
9532
  el.style.display = "none";
6834
9533
  this._label = createElement("span", { class: "an-link-tooltip-url" });
6835
- this._label.textContent = "Code";
9534
+ this._label.textContent = L.label;
6836
9535
  el.appendChild(this._label);
6837
9536
  el.appendChild(this._sep());
6838
9537
  this._langSelect = createElement("select", {
6839
9538
  class: "an-code-lang-select",
6840
- title: "Syntax Language",
6841
- "aria-label": "Syntax language"
9539
+ title: L.syntaxLanguage,
9540
+ "aria-label": L.syntaxAriaLabel
6842
9541
  });
6843
9542
  [
6844
9543
  ["", "Plain text"],
@@ -6869,15 +9568,15 @@ var CodeTooltip = class {
6869
9568
  this._disposers.push(on(this._langSelect, "change", () => this._onLangChange()));
6870
9569
  el.appendChild(this._langSelect);
6871
9570
  el.appendChild(this._sep());
6872
- this._copyBtn = this._makeBtn(ICONS$1.copy, "Copy Code", () => this._copyCode());
9571
+ this._copyBtn = this._makeBtn(ICONS$1.copy, L.copyCode, () => this._copyCode());
6873
9572
  el.appendChild(this._copyBtn);
6874
9573
  el.appendChild(this._sep());
6875
- this._wrapBtn = this._makeBtn(ICONS$1.wrapOn, "Toggle Word Wrap", () => this._toggleWrap());
9574
+ this._wrapBtn = this._makeBtn(ICONS$1.wrapOn, L.toggleWordWrap, () => this._toggleWrap());
6876
9575
  el.appendChild(this._wrapBtn);
6877
9576
  el.appendChild(this._sep());
6878
- el.appendChild(this._makeBtn(ICONS$1.toParagraph, "Convert to Paragraph", () => this._toParagraph()));
9577
+ el.appendChild(this._makeBtn(ICONS$1.toParagraph, L.convertToParagraph, () => this._toParagraph()));
6879
9578
  el.appendChild(this._sep());
6880
- el.appendChild(this._makeBtn(ICONS$1.deleteCode, "Delete Code Block", () => this._delete(), true));
9579
+ el.appendChild(this._makeBtn(ICONS$1.deleteCode, L.deleteCodeBlock, () => this._delete(), true));
6881
9580
  this._disposers.push(on(el, "mouseenter", () => this._clearTimers()), on(el, "mouseleave", () => this._scheduleHide()));
6882
9581
  return el;
6883
9582
  }
@@ -6954,7 +9653,7 @@ var CodeTooltip = class {
6954
9653
  if (!this._activePre || !this._wrapBtn) return;
6955
9654
  const wrapped = (this._activePre.style.whiteSpace || "").includes("pre-wrap") || window.getComputedStyle(this._activePre).whiteSpace === "pre-wrap";
6956
9655
  this._wrapBtn.classList.toggle("active", wrapped);
6957
- this._wrapBtn.title = wrapped ? "Disable Word Wrap" : "Enable Word Wrap";
9656
+ this._wrapBtn.title = wrapped ? this.context.locale.tooltips.code.disableWordWrap : this.context.locale.tooltips.code.enableWordWrap;
6958
9657
  }
6959
9658
  _syncLangSelect() {
6960
9659
  if (!this._activePre || !this._langSelect) return;
@@ -9484,27 +12183,28 @@ var EmojiDialog = class {
9484
12183
  this._open();
9485
12184
  }
9486
12185
  _buildDialog() {
12186
+ const L = this.context.locale.emojiDialog;
9487
12187
  const overlay = createElement("div", {
9488
12188
  class: "an-dialog-overlay",
9489
12189
  role: "dialog",
9490
12190
  "aria-modal": "true",
9491
- "aria-label": "Insert emoji"
12191
+ "aria-label": L.ariaLabel
9492
12192
  });
9493
12193
  const box = createElement("div", { class: "an-dialog-box an-emoji-box" });
9494
12194
  const titleRow = createElement("div", { class: "an-icon-title-row" });
9495
12195
  const title = createElement("h3", { class: "an-dialog-title" });
9496
- title.textContent = "Insert Emoji";
12196
+ title.textContent = L.title;
9497
12197
  const closeBtn = createElement("button", {
9498
12198
  type: "button",
9499
12199
  class: "an-icon-close",
9500
- "aria-label": "Close"
12200
+ "aria-label": L.close
9501
12201
  });
9502
12202
  closeBtn.innerHTML = "&times;";
9503
12203
  titleRow.append(title, closeBtn);
9504
12204
  const searchInput = createElement("input", {
9505
12205
  type: "search",
9506
12206
  class: "an-input an-icon-search",
9507
- placeholder: "Search emojis…",
12207
+ placeholder: L.searchPlaceholder,
9508
12208
  autocomplete: "off"
9509
12209
  });
9510
12210
  this._searchInput = searchInput;
@@ -9514,7 +12214,7 @@ var EmojiDialog = class {
9514
12214
  class: "an-icon-cat active",
9515
12215
  "data-cat": "all"
9516
12216
  });
9517
- allTab.textContent = "All";
12217
+ allTab.textContent = L.all;
9518
12218
  catBar.appendChild(allTab);
9519
12219
  EMOJI_CATS.forEach(({ id, label }) => {
9520
12220
  const tab = createElement("button", {
@@ -9522,7 +12222,7 @@ var EmojiDialog = class {
9522
12222
  class: "an-icon-cat",
9523
12223
  "data-cat": id
9524
12224
  });
9525
- tab.textContent = label;
12225
+ tab.textContent = L.categories && L.categories[id] || label;
9526
12226
  catBar.appendChild(tab);
9527
12227
  });
9528
12228
  this._catBar = catBar;
@@ -9545,7 +12245,7 @@ var EmojiDialog = class {
9545
12245
  type: "button",
9546
12246
  class: "an-btn"
9547
12247
  });
9548
- cancelBtn.textContent = "Cancel";
12248
+ cancelBtn.textContent = L.cancelBtn;
9549
12249
  btnRow.appendChild(cancelBtn);
9550
12250
  box.append(titleRow, searchInput, catBar, grid, btnRow);
9551
12251
  overlay.appendChild(box);
@@ -9956,27 +12656,28 @@ var IconDialog = class {
9956
12656
  this._open();
9957
12657
  }
9958
12658
  _buildDialog() {
12659
+ const L = this.context.locale.iconDialog;
9959
12660
  const overlay = createElement("div", {
9960
12661
  class: "an-dialog-overlay",
9961
12662
  role: "dialog",
9962
12663
  "aria-modal": "true",
9963
- "aria-label": "Insert FA icon"
12664
+ "aria-label": L.ariaLabel
9964
12665
  });
9965
12666
  const box = createElement("div", { class: "an-dialog-box an-icon-box" });
9966
12667
  const titleRow = createElement("div", { class: "an-icon-title-row" });
9967
12668
  const title = createElement("h3", { class: "an-dialog-title" });
9968
- title.textContent = "Insert FA Icon";
12669
+ title.textContent = L.title;
9969
12670
  const closeBtn = createElement("button", {
9970
12671
  type: "button",
9971
12672
  class: "an-icon-close",
9972
- "aria-label": "Close"
12673
+ "aria-label": L.close
9973
12674
  });
9974
12675
  closeBtn.innerHTML = "&times;";
9975
12676
  titleRow.append(title, closeBtn);
9976
12677
  const searchInput = createElement("input", {
9977
12678
  type: "search",
9978
12679
  class: "an-input an-icon-search",
9979
- placeholder: "Search icons…",
12680
+ placeholder: L.searchPlaceholder,
9980
12681
  autocomplete: "off"
9981
12682
  });
9982
12683
  this._searchInput = searchInput;
@@ -9986,7 +12687,7 @@ var IconDialog = class {
9986
12687
  class: "an-icon-cat active",
9987
12688
  "data-cat": "all"
9988
12689
  });
9989
- allTab.textContent = "All";
12690
+ allTab.textContent = L.all;
9990
12691
  catBar.appendChild(allTab);
9991
12692
  ICON_CATEGORIES.forEach(({ id, label }) => {
9992
12693
  const tab = createElement("button", {
@@ -9994,7 +12695,7 @@ var IconDialog = class {
9994
12695
  class: "an-icon-cat",
9995
12696
  "data-cat": id
9996
12697
  });
9997
- tab.textContent = label;
12698
+ tab.textContent = L.categories && L.categories[id] || label;
9998
12699
  catBar.appendChild(tab);
9999
12700
  });
10000
12701
  this._catBar = catBar;
@@ -10019,7 +12720,7 @@ var IconDialog = class {
10019
12720
  this._grid = grid;
10020
12721
  const optRow = createElement("div", { class: "an-icon-options" });
10021
12722
  const styleLabel = createElement("label", { class: "an-label" });
10022
- styleLabel.textContent = "Style";
12723
+ styleLabel.textContent = L.style;
10023
12724
  const styleSelect = createElement("select", { class: "an-input an-icon-option-select" });
10024
12725
  [
10025
12726
  ["fa-solid", "Solid"],
@@ -10033,7 +12734,7 @@ var IconDialog = class {
10033
12734
  styleSelect.value = "fa-solid";
10034
12735
  this._styleSelect = styleSelect;
10035
12736
  const sizeLabel = createElement("label", { class: "an-label" });
10036
- sizeLabel.textContent = "Size";
12737
+ sizeLabel.textContent = L.size;
10037
12738
  const sizeSelect = createElement("select", { class: "an-input an-icon-option-select" });
10038
12739
  [
10039
12740
  ["", "Inherit"],
@@ -10051,7 +12752,7 @@ var IconDialog = class {
10051
12752
  });
10052
12753
  this._sizeSelect = sizeSelect;
10053
12754
  const colorLabel = createElement("label", { class: "an-label" });
10054
- colorLabel.textContent = "Color";
12755
+ colorLabel.textContent = L.color;
10055
12756
  const colorInput = createElement("input", {
10056
12757
  type: "color",
10057
12758
  class: "an-icon-color",
@@ -10064,11 +12765,11 @@ var IconDialog = class {
10064
12765
  checked: ""
10065
12766
  });
10066
12767
  this._useColorCb = useColorCb;
10067
- useColorLabel.append(useColorCb, document.createTextNode(" Use color"));
12768
+ useColorLabel.append(useColorCb, document.createTextNode(L.useColor));
10068
12769
  optRow.append(styleLabel, styleSelect, sizeLabel, sizeSelect, colorLabel, colorInput, useColorLabel);
10069
12770
  const preview = createElement("div", { class: "an-icon-preview" });
10070
12771
  const previewHint = createElement("span", { class: "an-icon-preview-hint" });
10071
- previewHint.textContent = "Select an icon";
12772
+ previewHint.textContent = L.selectHint;
10072
12773
  preview.appendChild(previewHint);
10073
12774
  this._preview = preview;
10074
12775
  const btnRow = createElement("div", { class: "an-dialog-actions" });
@@ -10077,12 +12778,12 @@ var IconDialog = class {
10077
12778
  class: "an-btn an-btn-primary",
10078
12779
  disabled: ""
10079
12780
  });
10080
- insertBtn.textContent = "Insert FA Icon";
12781
+ insertBtn.textContent = L.insertBtn;
10081
12782
  const cancelBtn = createElement("button", {
10082
12783
  type: "button",
10083
12784
  class: "an-btn"
10084
12785
  });
10085
- cancelBtn.textContent = "Cancel";
12786
+ cancelBtn.textContent = L.cancelBtn;
10086
12787
  btnRow.append(insertBtn, cancelBtn);
10087
12788
  this._insertBtn = insertBtn;
10088
12789
  box.append(titleRow, searchInput, catBar, grid, optRow, preview, btnRow);
@@ -10283,9 +12984,11 @@ var COLOR_PRESETS = [
10283
12984
  ];
10284
12985
  function makeColorSubItems(colorType) {
10285
12986
  const label = colorType === "foreColor" ? "Text Color" : "Highlight Color";
12987
+ const localeKey = colorType === "foreColor" ? "textColor" : "highlightColor";
10286
12988
  return () => [{
10287
12989
  back: true,
10288
12990
  label,
12991
+ localeKey,
10289
12992
  navigate: () => defaultItems
10290
12993
  }, {
10291
12994
  colorPalette: true,
@@ -10482,7 +13185,8 @@ var ContextMenu = class {
10482
13185
  });
10483
13186
  iconSpan.innerHTML = ICONS.back;
10484
13187
  backBtn.appendChild(iconSpan);
10485
- backBtn.appendChild(createElement("span", { class: "an-context-label" }, [it.label || "Back"]));
13188
+ const backLabel = it.localeKey && this.context.locale.contextMenu[it.localeKey] || it.label || this.context.locale.contextMenu.back || "Back";
13189
+ backBtn.appendChild(createElement("span", { class: "an-context-label" }, [backLabel]));
10486
13190
  const off = on(backBtn, "click", (e) => {
10487
13191
  e.stopPropagation();
10488
13192
  const curLeft = parseFloat(this.el.style.left);
@@ -10520,7 +13224,7 @@ var ContextMenu = class {
10520
13224
  iconSpan.innerHTML = it.icon;
10521
13225
  btn.appendChild(iconSpan);
10522
13226
  }
10523
- btn.appendChild(createElement("span", { class: "an-context-label" }, [it.label || it.name]));
13227
+ btn.appendChild(createElement("span", { class: "an-context-label" }, [this.context.locale.contextMenu[it.name] || it.label || it.name]));
10524
13228
  const chevron = createElement("span", {
10525
13229
  class: "an-context-chevron",
10526
13230
  "aria-hidden": "true"
@@ -10558,9 +13262,9 @@ var ContextMenu = class {
10558
13262
  if (it.colorType === "hiliteColor") {
10559
13263
  const noColor = createElement("div", {
10560
13264
  class: "an-context-color-swatch an-context-color-none",
10561
- title: "No highlight",
13265
+ title: this.context.locale.contextMenu.noHighlight || "No highlight",
10562
13266
  role: "button",
10563
- "aria-label": "No highlight"
13267
+ "aria-label": this.context.locale.contextMenu.noHighlight || "No highlight"
10564
13268
  });
10565
13269
  noColor.innerHTML = ICONS.noColor;
10566
13270
  const offNo = on(noColor, "click", (e) => {
@@ -10575,10 +13279,10 @@ var ContextMenu = class {
10575
13279
  const colorInput = createElement("input", {
10576
13280
  type: "color",
10577
13281
  value: it.colorType === "foreColor" ? "#000000" : "#ffff00",
10578
- title: "Custom color",
10579
- "aria-label": "Custom color"
13282
+ title: this.context.locale.contextMenu.customColor || "Custom color",
13283
+ "aria-label": this.context.locale.contextMenu.customColor || "Custom color"
10580
13284
  });
10581
- const customLabel = createElement("span", {}, ["Custom…"]);
13285
+ const customLabel = createElement("span", {}, [this.context.locale.contextMenu.customColorLabel || "Custom…"]);
10582
13286
  const offCustom = on(colorInput, "change", () => this._applyColor(it.colorType, colorInput.value));
10583
13287
  this._menuDisposers.push(offCustom);
10584
13288
  customRow.appendChild(colorInput);
@@ -10602,7 +13306,7 @@ var ContextMenu = class {
10602
13306
  iconSpan.innerHTML = it.icon;
10603
13307
  headerBtn.appendChild(iconSpan);
10604
13308
  }
10605
- headerBtn.appendChild(createElement("span", { class: "an-context-label" }, [it.label || "Insert Table"]));
13309
+ headerBtn.appendChild(createElement("span", { class: "an-context-label" }, [this.context.locale.contextMenu.table || it.label || "Insert Table"]));
10606
13310
  const chevron = createElement("span", {
10607
13311
  class: "an-context-chevron",
10608
13312
  "aria-hidden": "true"
@@ -10631,7 +13335,7 @@ var ContextMenu = class {
10631
13335
  cells.forEach((cell) => {
10632
13336
  cell.classList.toggle("active", +cell.dataset.row <= rows && +cell.dataset.col <= cols);
10633
13337
  });
10634
- labelEl.textContent = rows && cols ? `${cols} × ${rows}` : "Insert Table";
13338
+ labelEl.textContent = rows && cols ? `${cols} × ${rows}` : this.context.locale.contextMenu.table || "Insert Table";
10635
13339
  };
10636
13340
  panel.appendChild(gridEl);
10637
13341
  panel.appendChild(labelEl);
@@ -10685,7 +13389,7 @@ var ContextMenu = class {
10685
13389
  iconSpan.innerHTML = it.icon;
10686
13390
  btn.appendChild(iconSpan);
10687
13391
  }
10688
- btn.appendChild(createElement("span", { class: "an-context-label" }, [it.label || it.name]));
13392
+ btn.appendChild(createElement("span", { class: "an-context-label" }, [this.context.locale.contextMenu[it.name] || it.label || it.name]));
10689
13393
  const off = on(btn, "click", (e) => {
10690
13394
  e.stopPropagation();
10691
13395
  this.hide();
@@ -10999,22 +13703,22 @@ var ShortcutsDialog = class {
10999
13703
  class: "an-dialog-overlay",
11000
13704
  role: "dialog",
11001
13705
  "aria-modal": "true",
11002
- "aria-label": "Keyboard Shortcuts"
13706
+ "aria-label": this.context.locale.shortcutsDialog.ariaLabel
11003
13707
  });
11004
13708
  const box = createElement("div", { class: "an-dialog-box an-shortcuts-box" });
11005
13709
  const titleRow = createElement("div", { class: "an-icon-title-row" });
11006
13710
  const title = createElement("h3", { class: "an-dialog-title" });
11007
- title.textContent = "Keyboard Shortcuts";
13711
+ title.textContent = this.context.locale.shortcutsDialog.title;
11008
13712
  const closeBtn = createElement("button", {
11009
13713
  type: "button",
11010
13714
  class: "an-icon-close",
11011
- "aria-label": "Close"
13715
+ "aria-label": this.context.locale.shortcutsDialog.close
11012
13716
  });
11013
13717
  closeBtn.textContent = "×";
11014
13718
  this._closeBtn = closeBtn;
11015
13719
  titleRow.append(title, closeBtn);
11016
13720
  box.appendChild(titleRow);
11017
- SHORTCUTS.forEach(({ category, items }) => {
13721
+ (this.context.locale.shortcutsDialog.shortcuts || SHORTCUTS).forEach(({ category, items }) => {
11018
13722
  const catEl = createElement("div", { class: "an-shortcuts-cat" });
11019
13723
  catEl.textContent = category;
11020
13724
  box.appendChild(catEl);
@@ -11139,25 +13843,26 @@ var FindReplace = class {
11139
13843
  const isReplace = this._mode === "replace";
11140
13844
  if (replaceRow) replaceRow.style.display = isReplace ? "" : "none";
11141
13845
  if (replaceActions) replaceActions.style.display = isReplace ? "" : "none";
11142
- if (title) title.textContent = isReplace ? "Find & Replace" : "Find";
13846
+ if (title) title.textContent = isReplace ? this.context.locale.findReplace.findReplaceTitle : this.context.locale.findReplace.findTitle;
11143
13847
  }
11144
13848
  _buildDialog() {
13849
+ const L = this.context.locale.findReplace;
11145
13850
  const overlay = createElement("div", {
11146
13851
  class: "an-dialog-overlay an-fr-dialog",
11147
13852
  role: "dialog",
11148
13853
  "aria-modal": "true",
11149
- "aria-label": "Find and Replace"
13854
+ "aria-label": L.findReplaceTitle
11150
13855
  });
11151
13856
  const box = createElement("div", { class: "an-dialog-box" });
11152
13857
  const titleRow = createElement("div", { class: "an-icon-title-row" });
11153
13858
  const title = createElement("h3", { class: "an-dialog-title" });
11154
- title.textContent = "Find";
13859
+ title.textContent = L.findTitle;
11155
13860
  const closeBtn = createElement("button", {
11156
13861
  type: "button",
11157
13862
  class: "an-icon-close",
11158
13863
  "aria-label": "Close"
11159
13864
  });
11160
- closeBtn.textContent = "×";
13865
+ closeBtn.textContent = L.close;
11161
13866
  this._closeBtn = closeBtn;
11162
13867
  titleRow.append(title, closeBtn);
11163
13868
  box.appendChild(titleRow);
@@ -11165,8 +13870,8 @@ var FindReplace = class {
11165
13870
  const findInput = createElement("input", {
11166
13871
  type: "text",
11167
13872
  class: "an-input",
11168
- placeholder: "Find…",
11169
- "aria-label": "Search text"
13873
+ placeholder: L.findPlaceholder,
13874
+ "aria-label": L.searchAriaLabel
11170
13875
  });
11171
13876
  this._findInput = findInput;
11172
13877
  findRow.appendChild(findInput);
@@ -11178,7 +13883,7 @@ var FindReplace = class {
11178
13883
  "aria-label": "Case sensitive"
11179
13884
  });
11180
13885
  this._caseCheckbox = caseCheckbox;
11181
- caseLabel.append(caseCheckbox, document.createTextNode("\xA0Case sensitive"));
13886
+ caseLabel.append(caseCheckbox, document.createTextNode(L.caseSensitive));
11182
13887
  const counter = createElement("span", { class: "an-fr-counter" });
11183
13888
  this._counterEl = counter;
11184
13889
  optRow.append(caseLabel, counter);
@@ -11188,12 +13893,12 @@ var FindReplace = class {
11188
13893
  type: "button",
11189
13894
  class: "an-btn"
11190
13895
  });
11191
- prevBtn.textContent = "← Prev";
13896
+ prevBtn.textContent = L.prevBtn;
11192
13897
  const nextBtn = createElement("button", {
11193
13898
  type: "button",
11194
13899
  class: "an-btn an-btn-primary"
11195
13900
  });
11196
- nextBtn.textContent = "Next →";
13901
+ nextBtn.textContent = L.nextBtn;
11197
13902
  findActions.append(prevBtn, nextBtn);
11198
13903
  box.appendChild(findActions);
11199
13904
  const replaceRow = createElement("div", { class: "an-fr-replace-row" });
@@ -11201,8 +13906,8 @@ var FindReplace = class {
11201
13906
  const replaceInput = createElement("input", {
11202
13907
  type: "text",
11203
13908
  class: "an-input",
11204
- placeholder: "Replace with…",
11205
- "aria-label": "Replace with"
13909
+ placeholder: L.replacePlaceholder,
13910
+ "aria-label": L.replaceAriaLabel
11206
13911
  });
11207
13912
  this._replaceInput = replaceInput;
11208
13913
  replaceRow.appendChild(replaceInput);
@@ -11213,12 +13918,12 @@ var FindReplace = class {
11213
13918
  type: "button",
11214
13919
  class: "an-btn"
11215
13920
  });
11216
- replaceBtn.textContent = "Replace";
13921
+ replaceBtn.textContent = L.replaceBtn;
11217
13922
  const replaceAllBtn = createElement("button", {
11218
13923
  type: "button",
11219
13924
  class: "an-btn an-btn-primary"
11220
13925
  });
11221
- replaceAllBtn.textContent = "Replace All";
13926
+ replaceAllBtn.textContent = L.replaceAllBtn;
11222
13927
  replaceActions.append(replaceBtn, replaceAllBtn);
11223
13928
  box.appendChild(replaceActions);
11224
13929
  overlay.appendChild(box);
@@ -11879,6 +14584,8 @@ var Context = class {
11879
14584
  constructor(targetEl, userOptions = {}) {
11880
14585
  this.targetEl = targetEl;
11881
14586
  this.options = mergeDeep(defaultOptions, userOptions);
14587
+ /** @type {import('./i18n/index.js').AsnLocale} */
14588
+ this.locale = resolveLocale(this.options.lang);
11882
14589
  /** @type {{ container: HTMLElement, editable: HTMLElement, toolbar?: HTMLElement, statusbar?: HTMLElement }} */
11883
14590
  this.layoutInfo = {};
11884
14591
  /** @type {Map<string, Function[]>} */
@@ -12388,7 +15095,7 @@ var AutumnNote = {
12388
15095
  registerModule(name, ModuleClass) {
12389
15096
  _customModules.set(name, ModuleClass);
12390
15097
  },
12391
- version: "1.0.4"
15098
+ version: "1.0.9"
12392
15099
  };
12393
15100
  /**
12394
15101
  * @param {string|Element|NodeList|Element[]} selector
@@ -12401,6 +15108,6 @@ function resolveElements(selector) {
12401
15108
  return [];
12402
15109
  }
12403
15110
  //#endregion
12404
- export { Context, ELEMENT_NODE, TEXT_NODE, WrappedRange, alignCenterBtn, alignJustifyBtn, alignLeftBtn, alignRightBtn, all, ancestors, any, backColorBtn, boldBtn, checklistBtn, children, chunk, clamp, closest, closestPara, codeviewBtn, collapsedRange, compose, createElement, currentRange, debounce, AutumnNote as default, defaultOptions, defaultToolbar, directionBtn, emojiBtn, env, findBtn, findReplaceBtn, first, flatten, fontFamilyBtn, fontSizeBtn, foreColorBtn, fromNativeRange, fullscreenBtn, groupBy, hrBtn, iconBtn, identity, imageBtn, indentBtn, initial, inlineCodeBtn, insertAfter, isAnchor, isEditable, isElement, isEmpty, isFunction, isImage, isInline, isInsideEditable, isKey, isLi, isList, isModifier, isNil, isPara, isPlainObject, isSelectionInside, isString, isTable, isText, isVoid, italicBtn, key, last, lineHeightBtn, linkBtn, mergeDeep, nextElement, nodeValue, olBtn, on, outdentBtn, outerHtml, paragraphStyleBtn, placeCaret, prevElement, printBtn, rangeFromElement, rect2bnd, redoBtn, remove, removeFormatBtn, sanitiseHTML, sanitiseUrl, shortcutsBtn, splitText, strikeBtn, subscriptBtn, superscriptBtn, tableBtn, tail, throttle, trapFocus, ulBtn, underlineBtn, undoBtn, unique, unwrap, videoBtn, withSavedRange, wrap };
15111
+ export { Context, ELEMENT_NODE, TEXT_NODE, WrappedRange, alignCenterBtn, alignJustifyBtn, alignLeftBtn, alignRightBtn, all, ancestors, any, backColorBtn, boldBtn, checklistBtn, children, chunk, clamp, closest, closestPara, codeviewBtn, collapsedRange, compose, createElement, currentRange, debounce, AutumnNote as default, defaultOptions, defaultToolbar, directionBtn, emojiBtn, env, findBtn, findReplaceBtn, first, flatten, fontFamilyBtn, fontSizeBtn, foreColorBtn, fromNativeRange, fullscreenBtn, groupBy, hrBtn, iconBtn, identity, imageBtn, indentBtn, initial, inlineCodeBtn, insertAfter, isAnchor, isEditable, isElement, isEmpty, isFunction, isImage, isInline, isInsideEditable, isKey, isLi, isList, isModifier, isNil, isPara, isPlainObject, isSelectionInside, isString, isTable, isText, isVoid, italicBtn, key, last, lineHeightBtn, linkBtn, locales, mergeDeep, nextElement, nodeValue, olBtn, on, outdentBtn, outerHtml, paragraphStyleBtn, placeCaret, prevElement, printBtn, rangeFromElement, rect2bnd, redoBtn, remove, removeFormatBtn, resolveLocale, sanitiseHTML, sanitiseUrl, shortcutsBtn, splitText, strikeBtn, subscriptBtn, superscriptBtn, tableBtn, tail, throttle, trapFocus, ulBtn, underlineBtn, undoBtn, unique, unwrap, videoBtn, withSavedRange, wrap };
12405
15112
 
12406
15113
  //# sourceMappingURL=autumnnote.es.js.map