Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions scripts/reloadOpenToolbar.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ test('preview-level open shortcut handles Ctrl/Cmd+O outside Monaco without doub
assert.match(markdownViewer, /cmdOrCtrl[\s\S]*key === 'o'[\s\S]*selectFile\(\)/);
});

test('editor toolbar delegates to Monaco actions and exposes expected Markdown commands', () => {
test('editor toolbar delegates actions and optional payloads to Monaco', () => {
assert.match(markdownViewer, /import EditorToolbar from '\.\/components\/EditorToolbar\.svelte'/);
assert.match(markdownViewer, /<EditorToolbar[\s\S]*onaction=\{\(actionId\) => editorPane\?\.runEditorAction\(actionId\)\}/);
assert.match(editor, /export function runEditorAction\(actionId: string\)/);
assert.match(markdownViewer, /<EditorToolbar[\s\S]*onaction=\{\(actionId, payload\) => editorPane\?\.runEditorAction\(actionId, payload\)\}/);
assert.match(editor, /export function runEditorAction\(actionId: string, payload\?: any\)/);

for (const actionId of [
'fmt-bold',
Expand Down
34 changes: 20 additions & 14 deletions scripts/toolbarCustomizationWiring.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,21 +78,17 @@ test('settings modal does not light-dismiss when clicking the backdrop', () => {
assert.doesNotMatch(settingsComponent, /function handleBackdropClick[\s\S]*onclose\(\)/);
});

test('toolbar settings use collapsed accordions for application and editor toolbars', () => {
const accordionBlocks = Array.from(settingsComponent.matchAll(/<details\s+class="toolbar-settings toolbar-settings-accordion"[\s\S]*?<\/details>/g));

assert.equal(accordionBlocks.length, 2);
assert.match(accordionBlocks[0][0], /settings\.applicationToolbar/);
assert.match(accordionBlocks[1][0], /settings\.editorToolbar/);
assert.match(accordionBlocks[0][0], /<summary class="toolbar-settings-summary">/);
assert.match(accordionBlocks[1][0], /<summary class="toolbar-settings-summary">/);
assert.match(accordionBlocks[0][0], /class="toolbar-settings-chevron"/);
assert.match(accordionBlocks[1][0], /class="toolbar-settings-chevron"/);
for (const block of accordionBlocks) {
assert.doesNotMatch(block[0], /<details[^>]*\sopen(?:[\s=>]|$)/);
test('toolbar settings expose application and editor sections', () => {
const sectionBlocks = Array.from(settingsComponent.matchAll(/<div class="toolbar-section"[\s\S]*?<\/div>\s*<\/div>/g));

assert.equal(sectionBlocks.length, 2);
assert.match(sectionBlocks[0][0], /settings\.applicationToolbar/);
assert.match(sectionBlocks[1][0], /settings\.editorToolbar/);
for (const block of sectionBlocks) {
assert.match(block[0], /class="toolbar-section-header"/);
assert.match(block[0], /class="toolbar-settings-list" role="list"/);
}
assert.match(settingsComponent, /\.toolbar-settings\[open\]\s+\.toolbar-settings-chevron/);
assert.match(settingsComponent, /\.toolbar-settings-summary::-webkit-details-marker/);
assert.doesNotMatch(settingsComponent, /toolbar-settings-accordion/);
});

test('interactive button labels are directly translated for every supported language', () => {
Expand Down Expand Up @@ -123,6 +119,16 @@ test('interactive button labels are directly translated for every supported lang
assert.doesNotMatch(toastComponent, /aria-label="Close"/);
});

test('Simplified Chinese directly translates window organization labels', () => {
const keys = [
'menu.moveToWindow', 'menu.window', 'menu.mergeAllWindows', 'menu.setWindowTag',
'menu.windowTagPlaceholder', 'menu.windowTagClear', 'menu.pinWindowTag',
'menu.unpinWindowTag', 'toast.noOtherWindows', 'home.pinnedTags', 'home.pinnedFileCount',
];
assert.deepEqual(keys.filter((key) => getDirectTranslation('zh-CN', key) === undefined), []);
assert.doesNotMatch(readFileSync('src/lib/components/HomePage.svelte', 'utf8'), /\{tag\.files\.length\} files/);
});

test('top toolbar overflow no longer includes Open file location action', () => {
assert.doesNotMatch(titleBar, /list\.push\('open_loc'\)/);
});
2 changes: 1 addition & 1 deletion src/lib/components/HomePage.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
{#each pinnedTags as tag (tag.name)}
<div class="recent-card" onclick={() => onopenPinnedTag?.(tag)} onkeydown={(event) => (event.key === 'Enter' || event.key === ' ') && onopenPinnedTag?.(tag)} role="button" tabindex="0">
<div class="file-icon"><span class="tag-dot" style:--tag-color={tag.color}></span></div>
<div class="file-info"><span class="file-name">{tag.name}</span><span class="file-path">{tag.files.length} files</span></div>
<div class="file-info"><span class="file-name">{tag.name}</span><span class="file-path">{t('home.pinnedFileCount', settings.language).replace('{{count}}', String(tag.files.length))}</span></div>
<button class="clear-btn" onclick={(event) => { event.stopPropagation(); onunpinTag?.(tag.name); }}>×</button>
</div>
{/each}
Expand Down
89 changes: 81 additions & 8 deletions src/lib/utils/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ export const translations: Record<LanguageCode, Translation> = {
welcomeToMarkpad: 'Welcome to Markpad',
recentFiles: 'Recent Files',
pinnedTags: 'Pinned Windows',
pinnedFileCount: '{{count}} files',
noRecentFiles: 'No recent files',
newFile: 'New File',
openFile: 'Open File',
Expand Down Expand Up @@ -409,6 +410,8 @@ export const translations: Record<LanguageCode, Translation> = {
editor: '编辑器',
preview: '预览',
appearance: '外观',
toolbars: '工具栏',
toolbarsSettings: '工具栏设置',
editorSettings: '编辑器设置',
previewSettings: '预览设置',
appearanceSettings: '外观设置',
Expand Down Expand Up @@ -444,6 +447,10 @@ export const translations: Record<LanguageCode, Translation> = {
imageDirectory: '图片目录',
scaleMacOSScreenshots: '缩放macOS截图',
reduceSizeBy50: '缩小50%',
toolbar: '工具栏',
showEditorToolbar: '显示编辑器工具栏',
editorToolbar: '编辑器工具栏',
applicationToolbar: '应用程序工具栏',
default: '默认',
cancel: '取消',
save: '保存',
Expand Down Expand Up @@ -477,9 +484,18 @@ export const translations: Record<LanguageCode, Translation> = {
openFile: '打开文件',
save: '保存',
saveAs: '另存为',
reloadFromDisk: '从磁盘重新加载',
closeFile: '关闭文件',
closeWindow: '关闭窗口',
moveToNewWindow: '移动到新窗口',
moveToWindow: '移动到',
window: '窗口',
mergeAllWindows: '将所有窗口合并到此处',
setWindowTag: '窗口标签…',
windowTagPlaceholder: '为此窗口命名',
windowTagClear: '移除标签',
pinWindowTag: '固定标签',
unpinWindowTag: '取消固定标签',
undo: '撤销',
redo: '重做',
cut: '剪切',
Expand All @@ -496,6 +512,7 @@ export const translations: Record<LanguageCode, Translation> = {
resetZoom: '重置缩放',
settings: '设置',
about: '关于',
checkForUpdates: '检查更新…',
github: 'GitHub',
documentation: '文档',
home: '主页',
Expand All @@ -504,7 +521,12 @@ export const translations: Record<LanguageCode, Translation> = {
exit: '退出',
zenMode: '禅模式',
tabs: '{{action}} 标签页',
back: '后退',
forward: '前进',
openLocation: '打开位置',
openFileLocation: '打开文件位置',
openInNewTab: '在新标签页中打开',
copyFullPath: '复制完整路径',
splitView: '分屏视图',
syncScroll: '同步滚动',
fullWidth: '全宽',
Expand Down Expand Up @@ -539,8 +561,19 @@ export const translations: Record<LanguageCode, Translation> = {
saveDiagramAsSvg: '将图表保存为SVG...',
wordWrapOff: '关闭',
wordWrapOn: '窗口',
wordWrapColumn: '列'
},
wordWrapColumn: '列',
find: '查找…'
},
find: {
placeholder: '查找',
next: '下一个匹配项',
previous: '上一个匹配项',
close: '关闭',
matchCount: '第 {{current}} 项,共 {{total}} 项',
noMatches: '没有结果',
caseSensitive: '区分大小写',
wholeWord: '全词匹配'
},
toast: {
imageSavedSuccessfully: '图片保存成功',
failedToSaveRemoteImage: '保存远程图片失败',
Expand All @@ -550,7 +583,9 @@ export const translations: Record<LanguageCode, Translation> = {
failedToCopyCode: '复制代码失败',
unsupportedFile: '不支持的文件类型: {{filename}}',
autoSaveFailed: '自动保存失败 — 未保存的更改仍在内存中',
savedNewerEdits: '已保存 — 因为存在更新的编辑,继续保持编辑模式'
noOtherWindows: '没有其他可合并的窗口',
savedNewerEdits: '已保存 — 因为存在更新的编辑,继续保持编辑模式',
openExportedFileFailed: '无法打开导出的文件'
},
modal: {
confirmExit: '确认退出',
Expand All @@ -559,11 +594,42 @@ export const translations: Record<LanguageCode, Translation> = {
youHaveUnsavedChanges: '"{title}"中有未保存的更改。关闭前要保存吗?',
youHaveUnsavedChangesBeforeReturning: '您有未保存的更改。返回查看模式前要保存吗?',
youHaveUnsavedChangesBeforeClosingSplitView: '您有未保存的更改。关闭分屏视图前要保存吗?',
youHaveUnsavedFiles: '您有 {{count}} 个未保存的文件。是否保存更改?'
},
youHaveUnsavedFiles: '您有 {{count}} 个未保存的文件。是否保存更改?',
openExportedFileTitle: '打开导出的文件?',
openExportedHtmlMessage: 'HTML 导出已保存。现在打开吗?'
},
update: {
checkingHeader: '正在检查更新…',
checkingBody: '正在查找 Markpad 的最新版本…',
upToDateHeader: '已是最新版本',
upToDateBody: '您正在使用 Markpad 的最新版本(v{{version}})。',
upToDateBodyNoVersion: '您正在使用 Markpad 的最新版本。',
availableHeader: '有可用更新',
availableBody: 'Markpad v{{latest}} 可供更新。您当前使用 v{{current}}。',
releaseNotes: '发行说明',
downloadingHeader: '正在下载更新…',
downloadingBody: '正在下载 Markpad v{{version}}…',
downloadingProgress: '已下载 {{downloaded}} MB,共 {{total}} MB({{pct}}%)',
downloadingProgressUnknown: '已下载 {{downloaded}} MB',
downloadingHint: '更新准备就绪后,Markpad 将自动重启。',
errorCheckHeader: '检查更新失败',
errorCheckBody: '无法检查更新。',
errorDownloadHeader: '下载更新失败',
errorDownloadBody: '无法下载或安装更新。',
errorInstallHeader: '重启失败',
errorInstallBody: '更新已下载,但 Markpad 无法自动重启。请退出后重新打开 Markpad 以完成安装。',
notConfiguredHint: '此构建版本尚未配置更新功能。',
cancel: '取消',
ok: '确定',
downloadInstall: '下载并安装',
close: '关闭',
retry: '重试'
},
home: {
welcomeToMarkpad: '欢迎使用Markpad',
recentFiles: '最近文件',
pinnedTags: '已固定窗口',
pinnedFileCount: '{{count}} 个文件',
noRecentFiles: '没有最近文件',
newFile: '新建文件',
openFile: '打开文件',
Expand All @@ -582,6 +648,8 @@ export const translations: Record<LanguageCode, Translation> = {
tooltip: {
menu: '菜单',
more: '更多',
back: '后退',
forward: '前进',
moreActions: '更多操作',
settings: '设置',
resetZoom: '重置缩放',
Expand All @@ -598,9 +666,12 @@ export const translations: Record<LanguageCode, Translation> = {
scrollSync: '滚动同步',
toggleFullWidth: '切换全宽',
fullWidth: '切换全宽',
reloadFromDisk: '从磁盘重新加载',
toggleAutoReload: '切换自动重载',
autoReload: '自动重载',
editFile: '编辑文件',
editFile: '编辑文件',
editorToolbar: '编辑器工具栏',
toggleEditorToolbar: '切换编辑器工具栏',
changeTheme: '更改主题',
undock: '取消固定',
dock: '固定',
Expand All @@ -611,7 +682,8 @@ export const translations: Record<LanguageCode, Translation> = {
showTableOfContents: '显示目录',
hideTableOfContents: '隐藏目录',
newTab: '新标签页',
close: '关闭'
close: '关闭',
find: '查找'
},
toc: {
noHeadingsFound: '未找到标题'
Expand Down Expand Up @@ -663,7 +735,8 @@ export const translations: Record<LanguageCode, Translation> = {
common: {
close: '关闭',
minimize: '最小化',
maximize: '最大化'
maximize: '最大化',
loadingFullDocument: '正在加载完整文档…'
}
},
ja: {
Expand Down
Loading