From d33ab92c7fd223652838fdc9b7f4482ca771657b Mon Sep 17 00:00:00 2001 From: Vanessa Date: Thu, 27 Nov 2025 11:06:24 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/16447 --- app/appearance/langs/ar_SA.json | 1 + app/appearance/langs/de_DE.json | 1 + app/appearance/langs/en_US.json | 1 + app/appearance/langs/es_ES.json | 1 + app/appearance/langs/fr_FR.json | 1 + app/appearance/langs/he_IL.json | 1 + app/appearance/langs/it_IT.json | 1 + app/appearance/langs/ja_JP.json | 1 + app/appearance/langs/pl_PL.json | 1 + app/appearance/langs/pt_BR.json | 1 + app/appearance/langs/ru_RU.json | 1 + app/appearance/langs/zh_CHT.json | 1 + app/appearance/langs/zh_CN.json | 1 + app/src/menus/commonMenuItem.ts | 97 ++++++++++++++++++-------------- 14 files changed, 68 insertions(+), 42 deletions(-) diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index 7021cb7ec..e907249ca 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1,4 +1,5 @@ { + "hasAttrName": "اسم السمة ${x} موجود بالفعل", "statusBarMsgPushTip": "من خلال رسائل شريط الحالة يمكنك معرفة حالة عمل النظام فورًا، وإذا كانت مزعجة يمكنك إيقافها", "useBackground": "ملء خلفية العمود بلون الخيار", "print": "طباعة", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index 45a11435a..c75d4ebaa 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1,4 +1,5 @@ { + "hasAttrName": "Der Attributname ${x} ist bereits vorhanden", "statusBarMsgPushTip": "Über Nachrichten in der Statusleiste können Sie den Zustand des Systems sofort erfahren, wenn sie stören, können Sie sie deaktivieren", "useBackground": "Spaltenhintergrund mit der Farbe der Option füllen", "print": "Drucken", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index db0923393..5cd88bbbf 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1,4 +1,5 @@ { + "hasAttrName": "The attribute name ${x} already exists", "statusBarMsgPushTip": "Status bar messages let you instantly know the system's running status, and if they bother you you can turn them off", "useBackground": "Fill column background with option color", "print": "Print", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index b301671f0..f56b44883 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1,4 +1,5 @@ { + "hasAttrName": "El nombre del atributo ${x} ya existe", "statusBarMsgPushTip": "A través de los mensajes en la barra de estado puedes conocer al instante el funcionamiento del sistema, si te molestan puedes desactivarlos", "useBackground": "Rellenar el fondo de la columna con el color de la opción", "print": "Imprimir", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index cf9d5b68e..a593c9e33 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1,4 +1,5 @@ { + "hasAttrName": "Le nom d’attribut ${x} existe déjà", "statusBarMsgPushTip": "Via les messages de la barre d'état, vous pouvez connaître immédiatement le fonctionnement du système, si cela vous dérange vous pouvez les désactiver", "useBackground": "Remplir l'arrière-plan de la colonne avec la couleur de l'option", "print": "Imprimer", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 65ba6304f..30c95c274 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1,4 +1,5 @@ { + "hasAttrName": "שם המאפיין ${x} כבר קיים", "statusBarMsgPushTip": "באמצעות הודעות בסרגל המצב ניתן לדעת מיד את מצב פעולתו של המערכת, ואם זה מפריע ניתן לכבות אותן", "useBackground": "מלא את רקע העמודה בצבע האפשרות", "print": "הדפס", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index fe5e99bcb..7ef451df3 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1,4 +1,5 @@ { + "hasAttrName": "Il nome dell'attributo ${x} esiste già", "statusBarMsgPushTip": "Tramite i messaggi nella barra di stato è possibile conoscere immediatamente lo stato di funzionamento del sistema, se danno fastidio è possibile disattivarli", "useBackground": "Riempire lo sfondo della colonna con il colore dell'opzione", "print": "Stampa", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index ea1c3c013..5f3bf02c9 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1,4 +1,5 @@ { + "hasAttrName": "属性名 ${x} は既に存在します", "statusBarMsgPushTip": "ステータスバーのメッセージによってシステムの動作状況を即座に把握でき、迷惑に感じる場合はオフにできます", "useBackground": "オプションの色で列の背景を塗りつぶす", "print": "印刷", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index 399130729..de74889f4 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1,4 +1,5 @@ { + "hasAttrName": "Nazwa atrybutu ${x} już istnieje", "statusBarMsgPushTip": "Dzięki powiadomieniom na pasku stanu można na bieżąco poznać działanie systemu, a jeśli przeszkadzają, można je wyłączyć", "useBackground": "Wypełnij tło kolumny kolorem opcji", "print": "Drukuj", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index bcc14820a..5aff6d116 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1,4 +1,5 @@ { + "hasAttrName": "O nome do atributo ${x} já existe", "statusBarMsgPushTip": "Por meio das mensagens na barra de status é possível saber imediatamente o funcionamento do sistema, se isso incomodar você pode desativá‑las", "useBackground": "Preencher o fundo da coluna com a cor da opção", "print": "Imprimir", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 833a121a7..c23e4aef1 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1,4 +1,5 @@ { + "hasAttrName": "Имя атрибута ${x} уже существует", "statusBarMsgPushTip": "С помощью сообщений в строке состояния можно мгновенно узнать о работе системы, и если они мешают, их можно отключить", "useBackground": "Заполнить фон столбца цветом опции", "print": "Печать", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 43ab907dd..58f87e206 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1,4 +1,5 @@ { + "hasAttrName": "屬性名 ${x} 已存在", "statusBarMsgPushTip": "透過狀態列訊息可以即時地了解系統的運作情況,如果感到打擾可以將其關閉", "useBackground": "按選項顏色填充列背景", "print": "列印", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 56df08e07..56041bb32 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1,4 +1,5 @@ { + "hasAttrName": "属性名 ${x} 已存在", "statusBarMsgPushTip": "通过状态栏消息可以即时地了解系统的运行情况,如果感到打扰可以将其关闭", "useBackground": "按选项颜色填充列背景", "print": "打印", diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 1a06fd56e..7817345d3 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -26,6 +26,7 @@ import {copyTextByType} from "../protyle/toolbar/util"; import {hideElements} from "../protyle/ui/hideElements"; import {Protyle} from "../protyle"; import {getAllEditor} from "../layout/getAll"; +import {hasClosestByClassName} from "../protyle/util/hasClosest"; const bindAttrInput = (inputElement: HTMLInputElement, id: string) => { inputElement.addEventListener("change", () => { @@ -351,22 +352,34 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I addDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { - if (!isValidAttrName(inputElement.value)) { - showMessage(window.siyuan.languages.attrName + " " + escapeHtml(inputElement.value) + " " + window.siyuan.languages.invalid); + const value = inputElement.value.toLowerCase(); + if (!isValidAttrName(value)) { + showMessage(window.siyuan.languages.attrName + " " + escapeHtml(value) + " " + window.siyuan.languages.invalid); return false; } - target.parentElement.insertAdjacentHTML("beforebegin", `
+ let existElement: HTMLElement | false; + Array.from(dialog.element.querySelectorAll('.custom-attr[data-type="custom"] .b3-label .fn__flex-1')).find((labelItem: HTMLElement) => { + if (labelItem.textContent === value) { + existElement = hasClosestByClassName(labelItem, "b3-label"); + return true; + } + }); + if (existElement) { + showMessage(window.siyuan.languages.hasAttrName.replace('${x}', value)); + } else { + target.parentElement.insertAdjacentHTML("beforebegin", `
- ${inputElement.value} + ${value}
- +
`); - const valueElement = target.parentElement.previousElementSibling.querySelector(".b3-text-field") as HTMLInputElement; - valueElement.focus(); - bindAttrInput(valueElement, attrs.id); - addDialog.destroy(); + const newInputElement = target.parentElement.previousElementSibling.querySelector(".b3-text-field") as HTMLInputElement; + newInputElement.focus(); + bindAttrInput(newInputElement, attrs.id); + addDialog.destroy(); + } }); event.stopPropagation(); event.preventDefault(); @@ -444,42 +457,42 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El } } }, - /// #if BROWSER - { - id: "copyWebURL", - iconHTML: "", - label: window.siyuan.languages.copyWebURL, - click: () => { - copyTextByType(ids, "webURL"); - if (focusElement) { - focusBlock(focusElement); + /// #if BROWSER + { + id: "copyWebURL", + iconHTML: "", + label: window.siyuan.languages.copyWebURL, + click: () => { + copyTextByType(ids, "webURL"); + if (focusElement) { + focusBlock(focusElement); + } } - } - }, - /// #endif - { - id: "copyHPath", - iconHTML: "", - label: window.siyuan.languages.copyHPath, - accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyHPath.custom : undefined, - click: () => { - copyTextByType(ids, "hPath"); - if (focusElement) { - focusBlock(focusElement); + }, + /// #endif + { + id: "copyHPath", + iconHTML: "", + label: window.siyuan.languages.copyHPath, + accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyHPath.custom : undefined, + click: () => { + copyTextByType(ids, "hPath"); + if (focusElement) { + focusBlock(focusElement); + } } - } - }, { - id: "copyID", - iconHTML: "", - label: window.siyuan.languages.copyID, - accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyID.custom : undefined, - click: () => { - copyTextByType(ids, "id"); - if (focusElement) { - focusBlock(focusElement); + }, { + id: "copyID", + iconHTML: "", + label: window.siyuan.languages.copyID, + accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyID.custom : undefined, + click: () => { + copyTextByType(ids, "id"); + if (focusElement) { + focusBlock(focusElement); + } } - } - }]; + }]; if (stdMarkdownId) { menuItems.push({