diff --git a/manifest.json b/manifest.json index fe7d563..703fd12 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "gridexplorer", "name": "GridExplorer", - "version": "3.4.16", + "version": "3.4.17", "minAppVersion": "1.8.7", "description": "Browse and organize note files visually in a flexible grid layout.", "author": "Devon22", diff --git a/package-lock.json b/package-lock.json index 99691a4..04306e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gridexplorer", - "version": "3.4.16", + "version": "3.4.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gridexplorer", - "version": "3.4.16", + "version": "3.4.17", "license": "MIT", "dependencies": { "jszip": "^3.10.1" diff --git a/package.json b/package.json index ab944fd..beddc5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gridexplorer", - "version": "3.4.16", + "version": "3.4.17", "description": "Browse and organize note files visually in a flexible grid layout.", "main": "main.js", "scripts": { diff --git a/src/ExplorerView.ts b/src/ExplorerView.ts index 9aa305e..6aa5232 100644 --- a/src/ExplorerView.ts +++ b/src/ExplorerView.ts @@ -1,4 +1,4 @@ -import { TFile, TFolder, WorkspaceLeaf, Menu, setIcon, Platform, normalizePath, ItemView, EventRef, FuzzySuggestModal, parseLinktext, ViewStateResult } from 'obsidian'; +import { TFile, TFolder, WorkspaceLeaf, Menu, setIcon, Platform, normalizePath, ItemView, EventRef, FuzzySuggestModal, parseLinktext, ViewStateResult, Notice } from 'obsidian'; import GridExplorerPlugin from './main'; import { GridView } from './GridView'; import { isFolderIgnored, isImageFile, isVideoFile, isAudioFile, isMediaFile } from './utils/fileUtils'; @@ -2225,11 +2225,11 @@ export class ExplorerView extends ItemView { let handled = false; for (const line of lines) { + let resolvedFile: TFile | null = null; try { let text = line; if (text.startsWith('!')) text = text.substring(1); - let resolvedFile: TFile | null = null; if (text.startsWith('[[') && text.endsWith(']]')) { const inner = text.slice(2, -2); const parsed = parseLinktext(inner); @@ -2253,6 +2253,7 @@ export class ExplorerView extends ItemView { handled = true; } } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`); console.error('An error occurred while moving one of the files (ExplorerView):', error); // 繼續處理其他檔案 } diff --git a/src/main.ts b/src/main.ts index 6e4ceff..e855752 100644 --- a/src/main.ts +++ b/src/main.ts @@ -398,8 +398,13 @@ export default class GridExplorerPlugin extends Plugin { // 攔截所有tag點擊事件 this.registerDomEvent(activeDocument, 'click', async (evt: MouseEvent) => { - // 如果未啟用攔截所有tag點擊事件,則跳過 - if (!this.settings.interceptAllTagClicks) return; + // 判斷是否符合攔截條件 + const tagMode = this.settings.interceptAllTagClicks; + if (tagMode === 'disabled') return; + if (tagMode === 'alt' && !evt.altKey) return; + if (tagMode === 'ctrl' && !(evt.ctrlKey || evt.metaKey)) return; + if (tagMode === 'shift' && !evt.shiftKey) return; + // 只處理左鍵 if (evt.button !== 0) return; @@ -462,11 +467,18 @@ export default class GridExplorerPlugin extends Plugin { // 攔截Breadcrumb導航點擊事件 this.registerDomEvent(activeDocument, 'click', async (evt: MouseEvent) => { - // 如果未啟用攔截Breadcrumb導航點擊事件,則跳過 - if (!this.settings.interceptBreadcrumbClicks) return; - - //如果有按著Ctrl鍵,則跳過 - if (evt.ctrlKey || evt.metaKey) return; + // 判斷是否符合攔截條件 + const crumbMode = this.settings.interceptBreadcrumbClicks; + if (crumbMode === 'disabled') return; + if (crumbMode === 'enabled') { + if (evt.ctrlKey || evt.metaKey) return; // 預設功能,有按 Ctrl 鍵則跳過 + } else if (crumbMode === 'alt') { + if (!evt.altKey) return; + } else if (crumbMode === 'ctrl') { + if (!(evt.ctrlKey || evt.metaKey)) return; + } else if (crumbMode === 'shift') { + if (!evt.shiftKey) return; + } const target = evt.target as HTMLElement; const breadcrumbEl = target.closest('.view-header-breadcrumb'); @@ -838,6 +850,15 @@ export default class GridExplorerPlugin extends Plugin { async loadSettings() { const loadedSettings = await this.loadData() as Partial | null; this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedSettings ?? {}); + + // 相容舊版 boolean 設定 + if (typeof this.settings.interceptAllTagClicks === 'boolean') { + this.settings.interceptAllTagClicks = this.settings.interceptAllTagClicks ? 'enabled' : 'disabled'; + } + if (typeof this.settings.interceptBreadcrumbClicks === 'boolean') { + this.settings.interceptBreadcrumbClicks = this.settings.interceptBreadcrumbClicks ? 'enabled' : 'disabled'; + } + migrateDataviewCodeToQuery(this.settings); updateCustomDocumentExtensions(this.settings); } diff --git a/src/renderFolder.ts b/src/renderFolder.ts index 49ccd32..6ac7628 100644 --- a/src/renderFolder.ts +++ b/src/renderFolder.ts @@ -1,4 +1,4 @@ -import { TFolder, TFile, normalizePath, Platform, setIcon, setTooltip, Menu, parseLinktext } from 'obsidian'; +import { TFolder, TFile, normalizePath, Platform, setIcon, setTooltip, Menu, parseLinktext, Notice } from 'obsidian'; import { GridView } from './GridView'; import { isFolderIgnored } from './utils/fileUtils'; import { extractObsidianPathsFromDT } from './utils/dragUtils'; @@ -93,6 +93,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) { await gridView.app.fileManager.renameFile(resolved, newPath); } } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolved.name}`); console.error(`An error occurred while moving the file ${p}:`, error); } } else { @@ -117,11 +118,11 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) { .filter((v: string): v is string => v.length > 0); for (const line of lines) { + let resolvedFile: TFile | null = null; try { let text = line; if (text.startsWith('!')) text = text.substring(1); - let resolvedFile: TFile | null = null; if (text.startsWith('[[') && text.endsWith(']]')) { const inner = text.slice(2, -2); const parsed = parseLinktext(inner); @@ -144,6 +145,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) { } } } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`); console.error('An error occurred while moving one of the files (container):', error); // 繼續處理其他檔案 } @@ -525,6 +527,7 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) { await gridView.app.fileManager.renameFile(resolved, newPath); } } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolved.name}`); console.error(`An error occurred while moving the file ${p}:`, error); } } else { @@ -555,37 +558,38 @@ export async function renderFolder(gridView: GridView, container: HTMLElement) { .map((s: string) => s.trim()) .filter((v: string): v is string => v.length > 0); for (const line of lines) { - try { - let text = line; - if (text.startsWith('!')) text = text.substring(1); // 去除 '!' - let resolvedFile: TFile | null = null; - if (text.startsWith('[[') && text.endsWith(']]')) { - const inner = text.slice(2, -2); - const parsed = parseLinktext(inner); - const dest = gridView.app.metadataCache.getFirstLinkpathDest(parsed.path, srcPath); - if (dest instanceof TFile) resolvedFile = dest; - } else { - const direct = gridView.app.vault.getAbstractFileByPath(text); - if (direct instanceof TFile) { - resolvedFile = direct; - } else { - const dest = gridView.app.metadataCache.getFirstLinkpathDest(text, srcPath); - if (dest instanceof TFile) resolvedFile = dest; - } - } + try { + let text = line; + if (text.startsWith('!')) text = text.substring(1); // 去除 '!' - if (resolvedFile instanceof TFile) { - const newPath = normalizePath(`${folderPath}/${resolvedFile.name}`); - if (resolvedFile.path !== newPath) { - await gridView.app.fileManager.renameFile(resolvedFile, newPath); + if (text.startsWith('[[') && text.endsWith(']]')) { + const inner = text.slice(2, -2); + const parsed = parseLinktext(inner); + const dest = gridView.app.metadataCache.getFirstLinkpathDest(parsed.path, srcPath); + if (dest instanceof TFile) resolvedFile = dest; + } else { + const direct = gridView.app.vault.getAbstractFileByPath(text); + if (direct instanceof TFile) { + resolvedFile = direct; + } else { + const dest = gridView.app.metadataCache.getFirstLinkpathDest(text, srcPath); + if (dest instanceof TFile) resolvedFile = dest; + } } + + if (resolvedFile instanceof TFile) { + const newPath = normalizePath(`${folderPath}/${resolvedFile.name}`); + if (resolvedFile.path !== newPath) { + await gridView.app.fileManager.renameFile(resolvedFile, newPath); + } + } + } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`); + console.error('An error occurred while moving one of the files:', error); + // 繼續處理其他檔案 } - } catch (error) { - console.error('An error occurred while moving one of the files:', error); - // 繼續處理其他檔案 } - } })(); }); }); diff --git a/src/renderModePath.ts b/src/renderModePath.ts index 47ef989..4b87043 100644 --- a/src/renderModePath.ts +++ b/src/renderModePath.ts @@ -1,4 +1,4 @@ -import { TFolder, TFile, Menu, Platform, setIcon, normalizePath, setTooltip, parseLinktext } from 'obsidian'; +import { TFolder, TFile, Menu, Platform, setIcon, normalizePath, setTooltip, parseLinktext, Notice } from 'obsidian'; import { GridView } from './GridView'; import { isFolderIgnored } from './utils/fileUtils'; import { extractObsidianPathsFromDT } from './utils/dragUtils'; @@ -312,10 +312,9 @@ export function renderModePath(gridView: GridView) { // 處理 obsidian:// URI 格式(單檔/多檔) const obsidianPaths = await extractObsidianPathsFromDT(event.dataTransfer); if (obsidianPaths.length > 0) { - try { - for (const filePath of obsidianPaths) { - let resolved: TFile | null = null; - + for (const filePath of obsidianPaths) { + let resolved: TFile | null = null; + try { // 1) 直接以路徑查找 const direct = gridView.app.vault.getAbstractFileByPath(filePath); if (direct instanceof TFile) { @@ -341,9 +340,10 @@ export function renderModePath(gridView: GridView) { await gridView.app.fileManager.renameFile(resolved, newPath); } } + } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolved ? resolved.name : filePath}`); + console.error('An error occurred while moving multiple files to folder:', error); } - } catch (error) { - console.error('An error occurred while moving multiple files to folder:', error); } return; } @@ -359,11 +359,11 @@ export function renderModePath(gridView: GridView) { .filter((v: string): v is string => v.length > 0); for (const line of lines) { + let resolvedFile: TFile | null = null; try { let text = line; if (text.startsWith('!')) text = text.substring(1); - let resolvedFile: TFile | null = null; if (text.startsWith('[[') && text.endsWith(']]')) { const inner = text.slice(2, -2); const parsed = parseLinktext(inner); @@ -386,6 +386,7 @@ export function renderModePath(gridView: GridView) { } } } catch (error) { + new Notice(`${t('failed_to_move_file')}: ${resolvedFile ? resolvedFile.name : line}`); console.error('An error occurred while moving one of the files to folder:', error); // 繼續處理其他檔案 } diff --git a/src/settings.ts b/src/settings.ts index db573d0..7b877c0 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -37,6 +37,8 @@ function isCustomMode(value: unknown): value is CustomMode { ); } +export type InterceptMode = 'enabled' | 'alt' | 'ctrl' | 'shift' | 'disabled'; + export interface GallerySettings { ignoredFolders: string[]; // 要忽略的資料夾路徑 ignoredFolderPatterns: string[]; // 要忽略的資料夾模式 @@ -81,8 +83,8 @@ export interface GallerySettings { dateDividerMode: string; // 日期分隔器模式:none, year, month, day showCodeBlocksInSummary: boolean; // 是否在摘要中顯示程式碼區塊 folderNoteDisplaySettings: string; // 資料夾筆記設定 - interceptAllTagClicks: boolean; // 攔截所有tag點擊事件 - interceptBreadcrumbClicks: boolean; // 攔截Breadcrumb點擊事件 + interceptAllTagClicks: InterceptMode; // 攔截所有tag點擊事件 + interceptBreadcrumbClicks: InterceptMode; // 攔截Breadcrumb點擊事件 customModes: CustomMode[]; // 自訂模式 quickAccessCommandPath: string; // Path used by "Open quick access folder" command quickAccessModeType: string; // View types used by "Open quick access view" command @@ -141,8 +143,8 @@ export const DEFAULT_SETTINGS: GallerySettings = { dateDividerMode: 'none', // 預設不使用日期分隔器 showCodeBlocksInSummary: false, // 預設不在摘要中顯示程式碼區塊 folderNoteDisplaySettings: 'default', // 預設不處理資料夾筆記 - interceptAllTagClicks: true, // 預設攔截所有tag點擊事件 - interceptBreadcrumbClicks: true, // 預設攔截Breadcrumb點擊事件 + interceptAllTagClicks: 'enabled', // 預設攔截所有tag點擊事件 + interceptBreadcrumbClicks: 'enabled', // 預設攔截Breadcrumb點擊事件 customModes: [ { internalName: 'custom-1750837329297', @@ -881,26 +883,34 @@ export class GridExplorerSettingTab extends PluginSettingTab { new Setting(sectionEl) .setName(t('intercept_all_tag_clicks')) .setDesc(t('intercept_all_tag_clicks_desc')) - .addToggle(toggle => { - toggle - .setValue(this.plugin.settings.interceptAllTagClicks) - .onChange(async (value) => { - this.plugin.settings.interceptAllTagClicks = value; - await this.plugin.saveSettings(); - }); + .addDropdown(drop => { + drop.addOption('enabled', t('intercept_mode_enabled')); + drop.addOption('alt', t('intercept_mode_alt')); + drop.addOption('ctrl', t('intercept_mode_ctrl')); + drop.addOption('shift', t('intercept_mode_shift')); + drop.addOption('disabled', t('intercept_mode_disabled')); + drop.setValue(this.plugin.settings.interceptAllTagClicks); + drop.onChange(async (value) => { + this.plugin.settings.interceptAllTagClicks = value as InterceptMode; + await this.plugin.saveSettings(); + }); }); // 攔截Breadcrumb點擊事件 new Setting(sectionEl) .setName(t('intercept_breadcrumb_clicks')) .setDesc(t('intercept_breadcrumb_clicks_desc')) - .addToggle(toggle => { - toggle - .setValue(this.plugin.settings.interceptBreadcrumbClicks) - .onChange(async (value) => { - this.plugin.settings.interceptBreadcrumbClicks = value; - await this.plugin.saveSettings(); - }); + .addDropdown(drop => { + drop.addOption('enabled', t('intercept_mode_enabled')); + drop.addOption('alt', t('intercept_mode_alt')); + drop.addOption('ctrl', t('intercept_mode_ctrl')); + drop.addOption('shift', t('intercept_mode_shift')); + drop.addOption('disabled', t('intercept_mode_disabled')); + drop.setValue(this.plugin.settings.interceptBreadcrumbClicks); + drop.onChange(async (value) => { + this.plugin.settings.interceptBreadcrumbClicks = value as InterceptMode; + await this.plugin.saveSettings(); + }); }); diff --git a/src/translations/en.ts b/src/translations/en.ts index e37831d..bd776a8 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -140,9 +140,14 @@ export default { 'enable_file_watcher': 'Enable file watcher', 'enable_file_watcher_desc': 'When enabled, the view will automatically update when files change. If disabled, you need to click the refresh button manually', 'intercept_all_tag_clicks': 'Intercept all tag clicks', - 'intercept_all_tag_clicks_desc': 'When enabled, all tag clicks will be intercepted and opened in the grid view', + 'intercept_all_tag_clicks_desc': 'Configure how tag click interception is triggered to open tags in grid view', 'intercept_breadcrumb_clicks': 'Intercept breadcrumb clicks', - 'intercept_breadcrumb_clicks_desc': 'When enabled, breadcrumb clicks will be intercepted and the path will be opened in the grid view', + 'intercept_breadcrumb_clicks_desc': 'Configure how breadcrumb click interception is triggered to open the folder path in grid view', + 'intercept_mode_enabled': 'Intercept click', + 'intercept_mode_alt': 'Click with Alt', + 'intercept_mode_ctrl': 'Click with Ctrl', + 'intercept_mode_shift': 'Click with Shift', + 'intercept_mode_disabled': 'No intercept', 'reset_to_default': 'Reset to default', 'settings_reset_notice': 'Settings have been reset to default values', 'config_management': 'Config management', @@ -333,4 +338,5 @@ export default { 'add_to_stash': 'Add to stash', 'added_to_stash': 'Added to stash', 'import_fail_notice': 'Import failed', + 'failed_to_move_file': 'Failed to move file', }; diff --git a/src/translations/ja.ts b/src/translations/ja.ts index 10bd068..5fcb036 100644 --- a/src/translations/ja.ts +++ b/src/translations/ja.ts @@ -139,9 +139,14 @@ export default { 'enable_file_watcher': 'ファイル監視を有効にする', 'enable_file_watcher_desc': '有効にすると、ファイルの変更を自動的に検出してビューを更新します。無効の場合は、更新ボタンを手動でクリックする必要があります', 'intercept_all_tag_clicks': 'すべてのタグクリックをインターセプト', - 'intercept_all_tag_clicks_desc': '有効にすると、すべてのタグクリックがインターセプトされ、グリッドビューで開かれます', + 'intercept_all_tag_clicks_desc': 'タグクリックのインターセプトをトリガーする方法を設定し、グリッドビューで開きます', 'intercept_breadcrumb_clicks': 'パンくずリストのクリックをインターセプト', - 'intercept_breadcrumb_clicks_desc': '有効にすると、パンくずリストのクリックがインターセプトされ、パスがグリッドビューで開かれます', + 'intercept_breadcrumb_clicks_desc': 'パンくずリストのクリックのインターセプトをトリガーする方法を設定し、グリッドビューで開きます', + 'intercept_mode_enabled': 'クリックをインターセプト', + 'intercept_mode_alt': 'Altを押しながらクリック', + 'intercept_mode_ctrl': 'Ctrlを押しながらクリック', + 'intercept_mode_shift': 'Shiftを押しながらクリック', + 'intercept_mode_disabled': 'インターセプトしない', 'reset_to_default': 'デフォルトに戻す', 'settings_reset_notice': '設定値がデフォルト値にリセットされました', 'config_management': '設定管理', diff --git a/src/translations/ko.ts b/src/translations/ko.ts index 53cfbab..b75e539 100644 --- a/src/translations/ko.ts +++ b/src/translations/ko.ts @@ -140,9 +140,14 @@ export default { 'enable_file_watcher': '파일 감시 활성화', 'enable_file_watcher_desc': '활성화 시 파일 변경 시 뷰가 자동으로 업데이트됩니다. 비활성화 시 새로고침 버튼을 수동으로 클릭해야 합니다', 'intercept_all_tag_clicks': '모든 태그 클릭 가로채기', - 'intercept_all_tag_clicks_desc': '활성화 시 모든 태그 클릭이 가로채져 그리드 뷰에서 열립니다', + 'intercept_all_tag_clicks_desc': '태그 클릭 가로채기 트리거 방식을 설정하여 그리드 뷰에서 엽니다', 'intercept_breadcrumb_clicks': '브레드크럼 클릭 가로채기', - 'intercept_breadcrumb_clicks_desc': '활성화 시 브레드크럼 클릭이 가로채져 경로가 그리드 뷰에서 열립니다', + 'intercept_breadcrumb_clicks_desc': '브레드크럼 클릭 가로채기 트리거 방식을 설정하여 경로를 그리드 뷰에서 엽니다', + 'intercept_mode_enabled': '클릭 가로채기', + 'intercept_mode_alt': 'Alt 누르고 클릭', + 'intercept_mode_ctrl': 'Ctrl 누르고 클릭', + 'intercept_mode_shift': 'Shift 누르고 클릭', + 'intercept_mode_disabled': '가로채지 않음', 'reset_to_default': '기본값으로 재설정', 'settings_reset_notice': '설정이 기본값으로 재설정되었습니다', 'config_management': '구성 관리', diff --git a/src/translations/ru.ts b/src/translations/ru.ts index b568b7d..680fb59 100644 --- a/src/translations/ru.ts +++ b/src/translations/ru.ts @@ -139,9 +139,14 @@ export default { 'enable_file_watcher': 'Включить наблюдение за файлами', 'enable_file_watcher_desc': 'При включении вид будет автоматически обновляться при изменении файлов. Если отключено, нужно вручную нажимать кнопку обновления', 'intercept_all_tag_clicks': 'Перехватывать все клики по тегам', - 'intercept_all_tag_clicks_desc': 'При включении все клики по тегам будут перехватываться и открываться в виде сетки', + 'intercept_all_tag_clicks_desc': 'Настройте способ перехвата кликов по тегам для открытия в виде сетки', 'intercept_breadcrumb_clicks': 'Перехватывать клики по навигационной цепочке', - 'intercept_breadcrumb_clicks_desc': 'При включении клики по навигационной цепочке будут перехватываться, и путь будет открываться в виде сетки', + 'intercept_breadcrumb_clicks_desc': 'Настройте способ перехвата кликов по навигационной цепочке для открытия пути в виде сетки', + 'intercept_mode_enabled': 'Перехватывать клик', + 'intercept_mode_alt': 'Клик с Alt', + 'intercept_mode_ctrl': 'Клик с Ctrl', + 'intercept_mode_shift': 'Клик с Shift', + 'intercept_mode_disabled': 'Не перехватывать', 'reset_to_default': 'Сбросить на значения по умолчанию', 'settings_reset_notice': 'Настройки сброшены на значения по умолчанию', 'config_management': 'Конфигурация управления', diff --git a/src/translations/uk.ts b/src/translations/uk.ts index d95af6c..c868300 100644 --- a/src/translations/uk.ts +++ b/src/translations/uk.ts @@ -139,9 +139,14 @@ export default { 'enable_file_watcher': 'Увімкнути спостереження за файлами', 'enable_file_watcher_desc': 'Коли увімкнено, вигляд автоматично оновлюватиметься при зміні файлів. Якщо вимкнено, потрібно вручну натискати кнопку оновлення', 'intercept_all_tag_clicks': 'Перехоплювати всі кліки по тегах', - 'intercept_all_tag_clicks_desc': 'Коли увімкнено, всі кліки по тегах перехоплюватимуться і відкриватимуться в сітковому вигляді', + 'intercept_all_tag_clicks_desc': 'Налаштуйте спосіб перехоплення кліків по тегах для відкриття в сітковому вигляді', 'intercept_breadcrumb_clicks': 'Перехоплювати кліки по навігаційному ланцюжку', - 'intercept_breadcrumb_clicks_desc': 'Коли увімкнено, кліки по навігаційному ланцюжку перехоплюватимуться, і шлях відкриватиметься в сітковому вигляді', + 'intercept_breadcrumb_clicks_desc': 'Налаштуйте спосіб перехоплення кліків по навігаційному ланцюжку для відкриття шляху в сітковому вигляді', + 'intercept_mode_enabled': 'Перехоплювати клік', + 'intercept_mode_alt': 'Клік з Alt', + 'intercept_mode_ctrl': 'Клік з Ctrl', + 'intercept_mode_shift': 'Клік з Shift', + 'intercept_mode_disabled': 'Не перехоплювати', 'reset_to_default': 'Скинути до значень за замовчуванням', 'settings_reset_notice': 'Налаштування скинуто до значень за замовчуванням', 'config_management': 'Управління конфігурацією', diff --git a/src/translations/zh-TW.ts b/src/translations/zh-TW.ts index c0c2266..74702b2 100644 --- a/src/translations/zh-TW.ts +++ b/src/translations/zh-TW.ts @@ -140,9 +140,14 @@ export default { 'enable_file_watcher': '啟用檔案監控', 'enable_file_watcher_desc': '啟用後會自動偵測檔案變更並更新視圖,關閉後需手動點擊重新整理按鈕', 'intercept_all_tag_clicks': '攔截所有標籤點擊事件', - 'intercept_all_tag_clicks_desc': '啟用後會攔截所有標籤點擊事件,並在網格視圖中打開標籤', + 'intercept_all_tag_clicks_desc': '設定攔截標籤點擊事件的觸發方式,並在網格視圖中打開標籤', 'intercept_breadcrumb_clicks': '攔截筆記導航列點擊事件', - 'intercept_breadcrumb_clicks_desc': '啟用後會攔截筆記導航列點擊事件,並在網格視圖中打開路徑', + 'intercept_breadcrumb_clicks_desc': '設定攔截筆記導航列點擊事件的觸發方式,並在網格視圖中打開路徑', + 'intercept_mode_enabled': '攔截點擊', + 'intercept_mode_alt': '按著Alt點擊', + 'intercept_mode_ctrl': '按著Ctrl點擊', + 'intercept_mode_shift': '按著Shift點擊', + 'intercept_mode_disabled': '不攔截', 'reset_to_default': '重置為預設值', 'settings_reset_notice': '設定值已重置為預設值', 'config_management': '設定檔管理', @@ -333,4 +338,5 @@ export default { 'add_to_stash': '加入暫存區', 'added_to_stash': '已添加到暫存區', 'import_fail_notice': '匯入失敗', + 'failed_to_move_file': '搬移檔案失敗', }; diff --git a/src/translations/zh.ts b/src/translations/zh.ts index 5a38de7..b6b3891 100644 --- a/src/translations/zh.ts +++ b/src/translations/zh.ts @@ -139,9 +139,14 @@ export default { 'enable_file_watcher': '启用文件监控', 'enable_file_watcher_desc': '启用后会自动检测文件变更并更新视图,关闭后需手动点击刷新按钮', 'intercept_all_tag_clicks': '拦截所有标签点击事件', - 'intercept_all_tag_clicks_desc': '启用后会拦截所有标签点击事件,改为在网格视图中打开标签', + 'intercept_all_tag_clicks_desc': '设置拦截标签点击事件的触发方式,并在网格视图中打开标签', 'intercept_breadcrumb_clicks': '拦截笔记导航栏点击事件', - 'intercept_breadcrumb_clicks_desc': '启用后会拦截笔记导航栏点击事件,并在网格视图中打开路径', + 'intercept_breadcrumb_clicks_desc': '设置拦截笔记导航栏点击事件的触发方式,并在网格视图中打开路径', + 'intercept_mode_enabled': '拦截点击', + 'intercept_mode_alt': '按住Alt点击', + 'intercept_mode_ctrl': '按住Ctrl点击', + 'intercept_mode_shift': '按住Shift点击', + 'intercept_mode_disabled': '不拦截', 'reset_to_default': '重置为默认值', 'settings_reset_notice': '设置值已重置为默认值', 'config_management': '配置管理', @@ -332,4 +337,5 @@ export default { 'add_to_stash': '加入暂存区', 'added_to_stash': '已添加到暂存区', 'import_fail_notice': '导入失败', + 'failed_to_move_file': '搬移文件失败', };