0.0.4: Standardize UI text casing and language

This commit is contained in:
BCS 2026-04-21 18:01:57 +08:00
parent 6b38578a35
commit 4dadf5c754
11 changed files with 88 additions and 74 deletions

View file

@ -2,10 +2,23 @@
All notable changes to this project will be documented in this file.
## [0.0.2] - 2026-04-15
## [0.0.4] - 2026-04-21
### Fixed
- **UI Text Standardization**: Converted all remaining Chinese UI text to English sentence case to comply with Obsidian community plugin standards.
- Updated command names, setting labels/descriptions, modal text, and context menu items.
- Fixed `aria-label` casing and language issues.
## [0.0.3] - 2026-04-16
### Fixed
- **Plugin Submission Fixes**: Addressed 10 critical code quality and guideline validation issues reported by the `ObsidianReviewBot`.
- Removed unnecessary type assertions to comply with strict TypeScript guidelines.
- Resolved "Floating Promise" warnings using the `void` operator.
- Aligned UI naming conventions to Obsidian defaults ("Side bookmark").
- Stripped plugin ID prefix from command IDs.
- Standardized heading layouts in settings.
### Added
- **拦截笔记链接**新增设置项「拦截笔记链接」开启后单击笔记中的外部链接http/https将自动在 Side Bookmark 内置浏览器中打开,取代系统浏览器。按住 Cmd/Ctrl 单击可临时绕过,仍使用系统浏览器。
## [0.0.1] - 2026-04-01

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,7 @@
{
"id": "side-bookmark",
"name": "Side Bookmark",
"version": "0.0.3",
"version": "0.0.4",
"minAppVersion": "0.15.0",
"description": "A sidebar bookmark browser. Browse websites and manage bookmarks right in the sidebar.",
"author": "bcs1037",

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "side-bookmark",
"version": "0.0.2",
"version": "0.0.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "side-bookmark",
"version": "0.0.2",
"version": "0.0.3",
"license": "MIT",
"dependencies": {
"obsidian": "latest"

View file

@ -1,6 +1,6 @@
{
"name": "side-bookmark",
"version": "0.0.3",
"version": "0.0.4",
"description": "A sidebar bookmark browser plugin for Obsidian",
"main": "main.js",
"type": "module",

View file

@ -38,7 +38,7 @@ export class BookmarkPanel {
const headerLeft = this.headerEl.createDiv({ cls: 'sb-bookmark-header-left' });
const collapseIcon = headerLeft.createDiv({ cls: 'sb-collapse-icon' });
setIcon(collapseIcon, 'chevron-down');
headerLeft.createSpan({ text: '书签', cls: 'sb-bookmark-title' });
headerLeft.createSpan({ text: 'Bookmarks', cls: 'sb-bookmark-title' });
headerLeft.addEventListener('click', () => {
this.toggleCollapse();
@ -51,7 +51,7 @@ export class BookmarkPanel {
const addBookmarkBtn = addBtnGroup.createDiv({
cls: 'sb-header-btn',
attr: { 'aria-label': '添加书签' },
attr: { 'aria-label': 'Add bookmark' },
});
setIcon(addBookmarkBtn, 'plus');
addBookmarkBtn.addEventListener('click', (e: MouseEvent) => {
@ -61,7 +61,7 @@ export class BookmarkPanel {
const addFolderBtn = addBtnGroup.createDiv({
cls: 'sb-header-btn',
attr: { 'aria-label': '新建文件夹' },
attr: { 'aria-label': 'New folder' },
});
setIcon(addFolderBtn, 'folder-plus');
addFolderBtn.addEventListener('click', (e: MouseEvent) => {
@ -111,9 +111,9 @@ export class BookmarkPanel {
const emptyState = this.listEl.createDiv({ cls: 'sb-empty-state' });
const emptyIcon = emptyState.createDiv({ cls: 'sb-empty-icon' });
setIcon(emptyIcon, 'bookmark');
emptyState.createDiv({ text: '暂无书签', cls: 'sb-empty-text' });
emptyState.createDiv({ text: 'No bookmarks', cls: 'sb-empty-text' });
emptyState.createDiv({
text: '点击 + 按钮或 ⭐ 按钮添加书签',
text: 'Click the + button or ⭐ icon to add a bookmark',
cls: 'sb-empty-hint',
});
return;
@ -225,7 +225,7 @@ export class BookmarkPanel {
const menu = new Menu();
menu.addItem(item => {
item.setTitle('打开');
item.setTitle('Open');
item.setIcon('external-link');
item.onClick(() => {
if (this.onNavigate) {
@ -237,7 +237,7 @@ export class BookmarkPanel {
menu.addSeparator();
menu.addItem(item => {
item.setTitle('编辑');
item.setTitle('Edit');
item.setIcon('pencil');
item.onClick(() => {
new EditBookmarkModal(
@ -253,7 +253,7 @@ export class BookmarkPanel {
// Move to folder submenu
menu.addItem(item => {
item.setTitle('移动到...');
item.setTitle('Move to...');
item.setIcon('folder-input');
item.onClick(() => {
this.showMoveMenu(event, bookmark);
@ -263,12 +263,12 @@ export class BookmarkPanel {
menu.addSeparator();
menu.addItem(item => {
item.setTitle('删除');
item.setTitle('Delete');
item.setIcon('trash-2');
item.onClick(() => {
new ConfirmDeleteModal(
this.app,
`确定要删除书签"${bookmark.title}"吗?`,
`Are you sure you want to delete bookmark "${bookmark.title}"?`,
async () => { await this.store.removeBookmark(bookmark.id); }
).open();
});
@ -282,7 +282,7 @@ export class BookmarkPanel {
const menu = new Menu();
menu.addItem(item => {
item.setTitle('添加书签到此文件夹');
item.setTitle('Add bookmark to this folder');
item.setIcon('plus');
item.onClick(() => {
new AddBookmarkModal(this.app, this.store, '', '', folder.id).open();
@ -290,7 +290,7 @@ export class BookmarkPanel {
});
menu.addItem(item => {
item.setTitle('添加子文件夹');
item.setTitle('Add sub-folder');
item.setIcon('folder-plus');
item.onClick(() => {
new AddFolderModal(this.app, this.store, folder.id).open();
@ -300,7 +300,7 @@ export class BookmarkPanel {
menu.addSeparator();
menu.addItem(item => {
item.setTitle('重命名');
item.setTitle('Rename');
item.setIcon('pencil');
item.onClick(() => {
new EditFolderModal(this.app, this.store, folder.id, folder.name).open();
@ -310,14 +310,14 @@ export class BookmarkPanel {
menu.addSeparator();
menu.addItem(item => {
item.setTitle('删除文件夹');
item.setTitle('Delete folder');
item.setIcon('trash-2');
item.onClick(() => {
const bookmarkCount = this.store.getBookmarksByFolder(folder.id).length;
const subFolderCount = this.store.getSubFolders(folder.id).length;
let msg = `确定要删除文件夹"${folder.name}"吗?`;
let msg = `Are you sure you want to delete folder "${folder.name}"?`;
if (bookmarkCount > 0 || subFolderCount > 0) {
msg += `\n其中包含 ${bookmarkCount} 个书签和 ${subFolderCount} 个子文件夹,将一并删除。`;
msg += `\nIt contains ${bookmarkCount} bookmarks and ${subFolderCount} folders, which will all be deleted.`;
}
new ConfirmDeleteModal(
this.app,
@ -337,7 +337,7 @@ export class BookmarkPanel {
// Move to root
if (bookmark.folderId !== null) {
menu.addItem(item => {
item.setTitle('(根级别)');
item.setTitle('(Root level)');
item.setIcon('corner-left-up');
item.onClick(async () => {
await this.store.moveBookmark(bookmark.id, null);

View file

@ -31,15 +31,15 @@ export class BrowserPanel {
// Navigation buttons
const navBtns = this.navBarEl.createDiv({ cls: 'sb-nav-buttons' });
this.backBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '后退' } });
this.backBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Back' } });
setIcon(this.backBtn, 'arrow-left');
this.backBtn.addEventListener('click', () => this.goBack());
this.forwardBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '前进' } });
this.forwardBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Forward' } });
setIcon(this.forwardBtn, 'arrow-right');
this.forwardBtn.addEventListener('click', () => this.goForward());
this.refreshBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': '刷新' } });
this.refreshBtn = navBtns.createDiv({ cls: 'sb-nav-btn', attr: { 'aria-label': 'Reload' } });
setIcon(this.refreshBtn, 'refresh-cw');
this.refreshBtn.addEventListener('click', () => this.reload());
@ -48,7 +48,7 @@ export class BrowserPanel {
cls: 'sb-url-input',
attr: {
type: 'text',
placeholder: '输入网址...',
placeholder: 'Enter URL...',
spellcheck: 'false',
},
});
@ -62,7 +62,7 @@ export class BrowserPanel {
});
// Bookmark (star) button
this.bookmarkBtn = this.navBarEl.createDiv({ cls: 'sb-nav-btn sb-bookmark-btn', attr: { 'aria-label': '添加书签' } });
this.bookmarkBtn = this.navBarEl.createDiv({ cls: 'sb-nav-btn sb-bookmark-btn', attr: { 'aria-label': 'Add bookmark' } });
setIcon(this.bookmarkBtn, 'star');
this.bookmarkBtn.addEventListener('click', () => {
if (this.onAddBookmark && this.currentUrl) {

View file

@ -32,7 +32,7 @@ export default class SideBookmarkPlugin extends Plugin {
this.addCommand({
id: 'open',
name: '打开侧边栏书签',
name: 'Open side bookmark',
callback: () => {
void this.activateView();
},

View file

@ -37,18 +37,18 @@ export class AddBookmarkModal extends Modal {
contentEl.empty();
contentEl.addClass('side-bookmark-modal');
contentEl.createEl('h3', { text: '添加书签' });
contentEl.createEl('h3', { text: 'Add bookmark' });
new Setting(contentEl)
.setName('标题')
.setName('Title')
.addText(text => text
.setPlaceholder('输入书签标题')
.setPlaceholder('Enter bookmark title')
.setValue(this.title)
.onChange(value => { this.title = value; })
);
new Setting(contentEl)
.setName('网址')
.setName('URL')
.addText(text => text
.setPlaceholder('https://example.com')
.setValue(this.url)
@ -56,9 +56,9 @@ export class AddBookmarkModal extends Modal {
);
new Setting(contentEl)
.setName('文件夹')
.setName('Folder')
.addDropdown(dropdown => {
dropdown.addOption('__root__', '(无文件夹)');
dropdown.addOption('__root__', '(No folder)');
for (const folder of this.store.folders) {
dropdown.addOption(folder.id, this.getFolderPath(folder));
}
@ -70,7 +70,7 @@ export class AddBookmarkModal extends Modal {
new Setting(contentEl)
.addButton(btn => btn
.setButtonText('保存')
.setButtonText('Save')
.setCta()
.onClick(async () => {
if (!this.url.trim()) {
@ -93,7 +93,7 @@ export class AddBookmarkModal extends Modal {
})
)
.addButton(btn => btn
.setButtonText('取消')
.setButtonText('Cancel')
.onClick(() => this.close())
);
}
@ -147,18 +147,18 @@ export class EditBookmarkModal extends Modal {
contentEl.empty();
contentEl.addClass('side-bookmark-modal');
contentEl.createEl('h3', { text: '编辑书签' });
contentEl.createEl('h3', { text: 'Edit bookmark' });
new Setting(contentEl)
.setName('标题')
.setName('Title')
.addText(text => text
.setPlaceholder('输入书签标题')
.setPlaceholder('Enter bookmark title')
.setValue(this.title)
.onChange(value => { this.title = value; })
);
new Setting(contentEl)
.setName('网址')
.setName('URL')
.addText(text => text
.setPlaceholder('https://example.com')
.setValue(this.url)
@ -166,9 +166,9 @@ export class EditBookmarkModal extends Modal {
);
new Setting(contentEl)
.setName('文件夹')
.setName('Folder')
.addDropdown(dropdown => {
dropdown.addOption('__root__', '(无文件夹)');
dropdown.addOption('__root__', '(No folder)');
for (const folder of this.store.folders) {
dropdown.addOption(folder.id, this.getFolderPath(folder));
}
@ -180,7 +180,7 @@ export class EditBookmarkModal extends Modal {
new Setting(contentEl)
.addButton(btn => btn
.setButtonText('保存')
.setButtonText('Save')
.setCta()
.onClick(async () => {
if (!this.url.trim()) return;
@ -200,7 +200,7 @@ export class EditBookmarkModal extends Modal {
})
)
.addButton(btn => btn
.setButtonText('取消')
.setButtonText('Cancel')
.onClick(() => this.close())
);
}
@ -242,20 +242,20 @@ export class AddFolderModal extends Modal {
contentEl.empty();
contentEl.addClass('side-bookmark-modal');
contentEl.createEl('h3', { text: '新建文件夹' });
contentEl.createEl('h3', { text: 'New folder' });
new Setting(contentEl)
.setName('文件夹名称')
.setName('Folder name')
.addText(text => text
.setPlaceholder('输入文件夹名称')
.setPlaceholder('Enter folder name')
.setValue(this.folderName)
.onChange(value => { this.folderName = value; })
);
new Setting(contentEl)
.setName('父文件夹')
.setName('Parent folder')
.addDropdown(dropdown => {
dropdown.addOption('__root__', '(根级别)');
dropdown.addOption('__root__', '(Root level)');
for (const folder of this.store.folders) {
dropdown.addOption(folder.id, this.getFolderPath(folder));
}
@ -267,7 +267,7 @@ export class AddFolderModal extends Modal {
new Setting(contentEl)
.addButton(btn => btn
.setButtonText('创建')
.setButtonText('Create')
.setCta()
.onClick(async () => {
if (!this.folderName.trim()) return;
@ -276,7 +276,7 @@ export class AddFolderModal extends Modal {
})
)
.addButton(btn => btn
.setButtonText('取消')
.setButtonText('Cancel')
.onClick(() => this.close())
);
}
@ -318,19 +318,19 @@ export class EditFolderModal extends Modal {
contentEl.empty();
contentEl.addClass('side-bookmark-modal');
contentEl.createEl('h3', { text: '编辑文件夹' });
contentEl.createEl('h3', { text: 'Edit folder' });
new Setting(contentEl)
.setName('文件夹名称')
.setName('Folder name')
.addText(text => text
.setPlaceholder('输入文件夹名称')
.setPlaceholder('Enter folder name')
.setValue(this.folderName)
.onChange(value => { this.folderName = value; })
);
new Setting(contentEl)
.addButton(btn => btn
.setButtonText('保存')
.setButtonText('Save')
.setCta()
.onClick(async () => {
if (!this.folderName.trim()) return;
@ -341,7 +341,7 @@ export class EditFolderModal extends Modal {
})
)
.addButton(btn => btn
.setButtonText('取消')
.setButtonText('Cancel')
.onClick(() => this.close())
);
}
@ -369,12 +369,12 @@ export class ConfirmDeleteModal extends Modal {
contentEl.empty();
contentEl.addClass('side-bookmark-modal');
contentEl.createEl('h3', { text: '确认删除' });
contentEl.createEl('h3', { text: 'Confirm delete' });
contentEl.createEl('p', { text: this.message });
new Setting(contentEl)
.addButton(btn => btn
.setButtonText('删除')
.setButtonText('Delete')
.setWarning()
.onClick(async () => {
await this.onConfirm();
@ -382,7 +382,7 @@ export class ConfirmDeleteModal extends Modal {
})
)
.addButton(btn => btn
.setButtonText('取消')
.setButtonText('Cancel')
.onClick(() => this.close())
);
}

View file

@ -18,11 +18,11 @@ export class SideBookmarkSettingTab extends PluginSettingTab {
const { containerEl } = this;
containerEl.empty();
new Setting(containerEl).setName('设置').setHeading();
new Setting(containerEl).setName('General').setHeading();
new Setting(containerEl)
.setName('默认首页')
.setDesc('打开插件时默认加载的网址')
.setName('Default homepage')
.setDesc('The URL to load when the plugin opens.')
.addText(text => text
.setPlaceholder('https://www.google.com')
.setValue(this.plugin.store.defaultUrl)
@ -33,8 +33,8 @@ export class SideBookmarkSettingTab extends PluginSettingTab {
);
new Setting(containerEl)
.setName('默认显示书签面板')
.setDesc('打开插件时是否默认展开书签列表面板')
.setName('Show bookmark panel by default')
.setDesc('Expand the bookmark list panel automatically when the plugin opens.')
.addToggle(toggle => toggle
.setValue(this.plugin.store.showBookmarkPanel)
.onChange(async (value) => {
@ -44,8 +44,8 @@ export class SideBookmarkSettingTab extends PluginSettingTab {
);
new Setting(containerEl)
.setName('拦截笔记链接')
.setDesc('开启后单击笔记中的外部链接http/https将自动在内置浏览器中打开而非使用系统浏览器。按住 Cmd/Ctrl 单击可临时绕过,仍使用系统浏览器打开。')
.setName('Intercept note links')
.setDesc('When enabled, clicking external links (http/https) in notes opens them in the built-in browser instead of the system browser. Hold Cmd/Ctrl while clicking to bypass and use the system browser.')
.addToggle(toggle => toggle
.setValue(this.plugin.store.interceptLinks)
.onChange(async (value) => {
@ -55,14 +55,14 @@ export class SideBookmarkSettingTab extends PluginSettingTab {
);
// Statistics section
new Setting(containerEl).setName('统计').setHeading();
new Setting(containerEl).setName('Statistics').setHeading();
const stats = containerEl.createDiv({ cls: 'sb-settings-stats' });
stats.createEl('p', {
text: `书签数量: ${this.plugin.store.bookmarks.length}`,
text: `Bookmarks: ${this.plugin.store.bookmarks.length}`,
});
stats.createEl('p', {
text: `文件夹数量: ${this.plugin.store.folders.length}`,
text: `Folders: ${this.plugin.store.folders.length}`,
});
}
}

View file

@ -1,5 +1,6 @@
{
"0.0.1": "0.15.0",
"0.0.2": "0.15.0",
"0.0.3": "0.15.0"
"0.0.3": "0.15.0",
"0.0.4": "0.15.0"
}