From 3cb8e609104781626de26acd12df648d7679d36d Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Sun, 1 Feb 2026 11:19:12 +0800
Subject: [PATCH 1/3] :art: https://github.com/siyuan-note/siyuan/issues/16947
Signed-off-by: Daniel <845765@qq.com>
---
kernel/bazaar/package.go | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/bazaar/package.go b/kernel/bazaar/package.go
index cae1efc29..c5c240490 100644
--- a/kernel/bazaar/package.go
+++ b/kernel/bazaar/package.go
@@ -611,7 +611,7 @@ func isOutdatedTheme(theme *Theme, bazaarThemes []*Theme) bool {
}
for _, pkg := range bazaarThemes {
- if theme.URL == pkg.URL && theme.Name == pkg.Name && 0 > semver.Compare("v"+theme.Version, "v"+pkg.Version) {
+ if theme.Name == pkg.Name && 0 > semver.Compare("v"+theme.Version, "v"+pkg.Version) {
theme.RepoHash = pkg.RepoHash
return true
}
@@ -631,7 +631,7 @@ func isOutdatedIcon(icon *Icon, bazaarIcons []*Icon) bool {
}
for _, pkg := range bazaarIcons {
- if icon.URL == pkg.URL && icon.Name == pkg.Name && 0 > semver.Compare("v"+icon.Version, "v"+pkg.Version) {
+ if icon.Name == pkg.Name && 0 > semver.Compare("v"+icon.Version, "v"+pkg.Version) {
icon.RepoHash = pkg.RepoHash
return true
}
@@ -651,7 +651,7 @@ func isOutdatedPlugin(plugin *Plugin, bazaarPlugins []*Plugin) bool {
}
for _, pkg := range bazaarPlugins {
- if plugin.URL == pkg.URL && plugin.Name == pkg.Name && 0 > semver.Compare("v"+plugin.Version, "v"+pkg.Version) {
+ if plugin.Name == pkg.Name && 0 > semver.Compare("v"+plugin.Version, "v"+pkg.Version) {
plugin.RepoHash = pkg.RepoHash
return true
}
@@ -671,7 +671,7 @@ func isOutdatedWidget(widget *Widget, bazaarWidgets []*Widget) bool {
}
for _, pkg := range bazaarWidgets {
- if widget.URL == pkg.URL && widget.Name == pkg.Name && 0 > semver.Compare("v"+widget.Version, "v"+pkg.Version) {
+ if widget.Name == pkg.Name && 0 > semver.Compare("v"+widget.Version, "v"+pkg.Version) {
widget.RepoHash = pkg.RepoHash
return true
}
@@ -691,7 +691,7 @@ func isOutdatedTemplate(template *Template, bazaarTemplates []*Template) bool {
}
for _, pkg := range bazaarTemplates {
- if template.URL == pkg.URL && template.Name == pkg.Name && 0 > semver.Compare("v"+template.Version, "v"+pkg.Version) {
+ if template.Name == pkg.Name && 0 > semver.Compare("v"+template.Version, "v"+pkg.Version) {
template.RepoHash = pkg.RepoHash
return true
}
From 92ab34740523bc3d39955a81273a8f5f62be4fea Mon Sep 17 00:00:00 2001
From: Jeffrey Chen <78434827+TCOTC@users.noreply.github.com>
Date: Sun, 1 Feb 2026 15:18:49 +0800
Subject: [PATCH 2/3] :memo: Improve text (#16957)
---
app/appearance/langs/ar_SA.json | 12 +++----
app/appearance/langs/de_DE.json | 2 +-
app/appearance/langs/en_US.json | 4 +--
app/appearance/langs/es_ES.json | 8 ++---
app/appearance/langs/fr_FR.json | 54 ++++++++++++++++----------------
app/appearance/langs/he_IL.json | 12 +++----
app/appearance/langs/ja_JP.json | 16 +++++-----
app/appearance/langs/ko_KR.json | 2 +-
app/appearance/langs/pl_PL.json | 10 +++---
app/appearance/langs/pt_BR.json | 6 ++--
app/appearance/langs/zh_CHT.json | 10 +++---
app/appearance/langs/zh_CN.json | 2 +-
12 files changed, 69 insertions(+), 69 deletions(-)
diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json
index a6b8d9b58..93639514f 100644
--- a/app/appearance/langs/ar_SA.json
+++ b/app/appearance/langs/ar_SA.json
@@ -8,8 +8,8 @@
"removeAssetsID": "إزالة الـ ID من أسماء ملفات الموارد",
"removeAssetsIDTip": "عند التفعيل سيتم إزالة جزء الـ ID من أسماء ملفات الموارد عند تصدير Markdown",
"clearTempFiles": "مسح الملفات المؤقتة",
- "clearTempFilesTip": "Bereinigen Sie temporäre Dateien, die während der Ausführung der Anwendung erstellt wurden, um Speicherplatz freizugeben",
- "uploadFileTooLarge": "⚠️ الملف الذي تم رفعه [${x}] كبير جدًا [${y}],هل تؤكد المتابعة بالرفع?",
+ "clearTempFilesTip": "مسح الملفات المؤقتة التي تم إنشاؤها أثناء تشغيل التطبيق لتحرير مساحة التخزين",
+ "uploadFileTooLarge": "⚠️ الملف الذي تم رفعه [${x}] كبير جدًا [${y}]، هل تؤكد المتابعة بالرفع؟",
"recentDocsMaxListCount": "الحد الأقصى لعدد المستندات الحديثة المعروضة",
"recentDocsMaxListCountTip": "الحد الأقصى لعدد المستندات المدرجة في مربع حوار المستندات الحديثة",
"bazaarNeedVersion": "يتطلب ترقية SiYuan إلى الإصدار v${x} أو أحدث لاستخدام هذه الميزة",
@@ -37,7 +37,7 @@
"rebuildDataIndex": "إعادة بناء الفهرس",
"rebuildDataIndexTip": "إعادة بناء كاملة لفهرس البيانات، قد يستغرق ذلك بعض الوقت، يرجى الانتظار",
"displayFieldName": "عرض اسم الحقل",
- "sortBySelectOption": "Nach Option sortieren",
+ "sortBySelectOption": "الترتيب حسب الخيار",
"groupStep": "فاصل التجميع",
"groupRange": "نطاق التجميع",
"groupMethodDateRelative": "تاريخ نسبي",
@@ -757,7 +757,7 @@
"exportPDF4": "تضمين الأصول",
"exportPDF5": "البقاء مطوية",
"paged": "ترقيم الصفحات",
- "mergeSubdocs": "إبقاء مطوياً",
+ "mergeSubdocs": "دمج المستندات الفرعية",
"removeAssetsFolder": "إزالة دليل الأصول",
"upload": "رفع",
"reminderTip": "لا يمكن تعيين وقت التذكير قبل الوقت الحالي",
@@ -1308,7 +1308,7 @@
"exportCABundleTip": "تصدير شهادة CA والمفتاح الخاص لمشاركتها مع أجهزة SiYuan الأخرى. ستثق الأجهزة التي تستخدم نفس CA في الشهادات الصادرة عنها",
"importCABundle": "استيراد حزمة CA",
"importCABundleTip": "استيراد حزمة CA من جهاز SiYuan آخر. بعد الاستيراد سيستخدم هذا الجهاز نفس CA، مما يسمح للعملاء بالثقة في شهادات جميع الأجهزة",
- "importCABundleSuccess": "تم استيراد حزمة CA بنجاح,يرجى إعادة تشغيل التطبيق لتطبيق التغييرات",
+ "importCABundleSuccess": "تم استيراد حزمة CA بنجاح، يرجى إعادة تشغيل التطبيق لتطبيق التغييرات",
"about13": "رمز API",
"about14": "\u202B مصادفة الرمز المميز عند استدعاء واجهة برمجة التطبيقات (API)\u202C
\u202Bرأس طلب HTTP هو \u202AAuthorization: token ${token}\u202C\u202C",
"about17": "عند الضبط على اتصال مباشر لن يتم تفعيل الوكيل",
@@ -1659,7 +1659,7 @@
"193": "يرجى الرجوع إلى الفصل [الذكاء الاصطناعي] من دليل المستخدم للتكوين",
"194": "هناك قيود على واجهة Nutstore، يرجى استخدام خدمات WebDAV الأخرى",
"195": "وقت النظام غير صحيح، يرجى معايرة وقت النظام والمحاولة مرة أخرى",
- "196": "لا تقم بتعيين مساحة العمل تحت مسار قرص مزامنة من طرف ثالث، وإلا فإن البيانات سوف تتلف (iCloud/OneDrive/ropbox/Google Drive/Nutstore/Baidu Netdisk/Tencent Weiyun، إلخ)",
+ "196": "لا تقم بتعيين مساحة العمل تحت مسار قرص مزامنة من طرف ثالث، وإلا فإن البيانات سوف تتلف (iCloud/OneDrive/Dropbox/Google Drive/Nutstore/Baidu Netdisk/Tencent Weiyun، إلخ)",
"197": "يرجى فتح المفكرة [%s] ثم المحاولة مرة أخرى",
"198": "هذا ليس أرشيف بيانات صالح. إذا تم تصدير الأرشيف من [شجرة المستندات]، الرجاء استيراده من [شجرة المستندات]",
"199": "هذا ليس أرشيف .sy.zip الصالح. إذا تم تصدير الأرشيف من [الإعدادات]، الرجاء استيراده من [الإعدادات]",
diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json
index 5f0a96785..9650b47a2 100644
--- a/app/appearance/langs/de_DE.json
+++ b/app/appearance/langs/de_DE.json
@@ -137,7 +137,7 @@
"allowHTMLBLockScript": "Die Ausführung von Skripten innerhalb von HTML-Blöcken zulassen",
"allowHTMLBLockScriptTip": "Nach der Aktivierung wird das Skript im HTML-Block nicht bereinigt. Bitte seien Sie sich des potenziellen Risikos von XSS-Angriffen bewusst.",
"allowSVGScript": "Ausführen von Skripten innerhalb von SVG erlauben",
- "allowSVGScriptTip": "Wenn aktiviert, wird der Code im SVG nicht sicherheitsgefiltert。Achten Sie auf mögliche XSS-Risiken",
+ "allowSVGScriptTip": "Wenn aktiviert, wird der Code im SVG nicht sicherheitsgefiltert. Achten Sie auf mögliche XSS-Risiken",
"autoLaunchMode0": "Nicht automatisch starten",
"autoLaunchMode1": "Automatisch nach dem Booten starten",
"autoLaunchMode2": "Automatisch starten und die Hauptoberfläche minimieren nach dem Booten",
diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index 5da146e9a..5a80f0a3d 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -1103,7 +1103,7 @@
"logout": "Logout",
"refreshUser": "User information refreshed",
"insertBottom": "Open Below the Tab",
- "insertRight": "Open Right the Tab",
+ "insertRight": "Open to the Right of the Tab",
"account1": "Become a paid member",
"account4": "Upgrade to a subscription member",
"account2": "End-to-end encrypted data sync and backup",
@@ -1474,7 +1474,7 @@
"8": "Check update failed",
"9": "\uD83D\uDE80 A new version is available, please browse the release announcement %s",
"10": "Is the latest version",
- "11": "\uD83D\uDCE2 系統公告:%s",
+ "11": "\uD83D\uDCE2 System announcement: %s",
"12": "Query asset failed [%s]",
"13": "Cannot create a file starting with .",
"14": "Export failed: %s",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index 0b51f8ecf..d037a0c98 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -9,7 +9,7 @@
"removeAssetsIDTip": "Al habilitar, al exportar a Markdown se eliminará la parte del nombre de archivo de recursos que contiene el ID",
"clearTempFiles": "Limpiar archivos temporales",
"clearTempFilesTip": "Limpia los archivos temporales generados durante la ejecución de la aplicación para liberar espacio de almacenamiento",
- "uploadFileTooLarge": "⚠️ El archivo subido [${x}] es demasiado grande [${y}],¿estás seguro de que deseas continuar con la subida?",
+ "uploadFileTooLarge": "⚠️ El archivo subido [${x}] es demasiado grande [${y}]. ¿Estás seguro de que deseas continuar con la subida?",
"recentDocsMaxListCount": "Número máximo de documentos recientes listados",
"recentDocsMaxListCountTip": "Número máximo de documentos que se mostrarán en el cuadro de diálogo Documentos recientes",
"bazaarNeedVersion": "Se requiere actualizar SiYuan a la versión v${x} o posterior para usarlo",
@@ -137,7 +137,7 @@
"allowHTMLBLockScript": "Permitir la ejecución de scripts dentro de bloques HTML",
"allowHTMLBLockScriptTip": "Después de habilitarlo, el script en el bloque HTML no se desinfectará. Tenga en cuenta el riesgo potencial de ataques XSS",
"allowSVGScript": "Permitir ejecutar scripts dentro del SVG",
- "allowSVGScriptTip": "Al activarlo, el código dentro del SVG no será filtrado por seguridad。Tenga en cuenta el riesgo potencial de XSS",
+ "allowSVGScriptTip": "Al activarlo, el código dentro del SVG no será filtrado por seguridad. Tenga en cuenta el riesgo potencial de XSS",
"autoLaunchMode0": "No iniciar automáticamente",
"autoLaunchMode1": "Inicio automático después del arranque",
"autoLaunchMode2": "Iniciar automáticamente y minimizar la interfaz principal después del arranque",
@@ -1262,7 +1262,7 @@
"parentRelation": "Padre - Hijo",
"openInNewTab": "Abrir en una nueva pestaña",
"help": "Ayuda",
- "userGuide": "User Guide",
+ "userGuide": "Guía del usuario",
"paragraphBeginningSpace": "Dos espacios vacíos al principio del párrafo",
"outline": "Esquema",
"newFile": "Nuevo documento",
@@ -1531,7 +1531,7 @@
"65": "Exportando datos...",
"66": "Archivo de datos [%s] creado",
"67": "Cargado en %s, descargado en %s",
- "68": "Les données locales ont dépassé la capacité de stockage maximale de l'espace cloud [%s] pendant la période d'essai et ne peuvent pas continuer à synchroniser les données. Después de la suscripción, la capacidad de almacenamiento en la nube se actualizará a 8GB",
+ "68": "Los datos locales han superado la capacidad máxima de almacenamiento del espacio en la nube [%s] durante el período de prueba y no se puede continuar sincronizando datos. Después de la suscripción, la capacidad de almacenamiento en la nube se actualizará a 8 GB",
"69": "Descarga completada",
"70": "Procesando [%s], por favor espere...",
"71": "Fallo en la inserción del archivo de recursos, por favor reabra el documento",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index a6cc61a3b..4fb614cc3 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -137,7 +137,7 @@
"allowHTMLBLockScript": "Autoriser l'exécution de scripts dans les blocs HTML",
"allowHTMLBLockScriptTip": "Après activation, le script dans le bloc HTML ne sera pas nettoyé. Veuillez être conscient du risque potentiel d'attaques XSS",
"allowSVGScript": "Autoriser l'exécution de scripts dans le SVG",
- "allowSVGScriptTip": "Si activé, le code dans le SVG ne sera pas filtré pour la sécurité。Veuillez noter le risque potentiel de XSS",
+ "allowSVGScriptTip": "Si activé, le code dans le SVG ne sera pas filtré pour la sécurité. Veuillez noter le risque potentiel de XSS",
"autoLaunchMode0": "Ne pas lancer automatiquement",
"autoLaunchMode1": "Lancement automatique après le démarrage",
"autoLaunchMode2": "Lancement automatique et minimisation de l'interface principale après le démarrage",
@@ -488,7 +488,7 @@
"apiTimeoutTip": "Le délai d'attente pour lancer une requête",
"apiProxy": "Proxy Web",
"apiProxyTip": "Le proxy réseau qui lance la requête, tel que socks://user:pass@127.0.0.1:1080",
- "apiModel": "Modelo",
+ "apiModel": "Modèle",
"apiModelTip": "Le paramètre model transmis lors de la demande de l'API est utilisé pour contrôler le style de texte généré (l'ID de déploiement doit être renseigné lors de l'utilisation du service Azure OpenAI)",
"apiMaxTokens": "Nombre maximum de jetons",
"apiMaxTokensTip": "Le paramètre max_tokens transmis lors de la demande de l'API est utilisé pour contrôler la longueur du texte généré",
@@ -503,7 +503,7 @@
"apiVersionTip": "Requis uniquement lors de l'utilisation du service Azure OpenAI",
"apiProvider": "API du fournisseur",
"apiProviderTip": "En sélectionnant, le service API du fournisseur sera utilisé pour implémenter des fonctionnalités d'IA (ChatGPT, Claude, DeepSeek et autres modèles prennent en charge l'interface OpenAI)",
- "skip": "Navire",
+ "skip": "Passer",
"nextRound": "Prochain tour",
"save": "Sauvegarder",
"ai": "Intelligence Artificielle",
@@ -726,7 +726,7 @@
"rtl": "De droite à gauche (RTL)",
"ltr": "De gauche à droite (LTR)",
"rtlTip": "Rendre le contenu de droite à gauche",
- "height": "haut",
+ "height": "Hauteur",
"deactivateUser": "Désactiver le compte",
"deactivateUserTip": "
someone101 (le numéro suivant est le numéro d'utilisateur), le mot de passe sera réinitialisé par un nombre aléatoireצור כרטיסים מהר",
"flashcardFSRSParamRequestRetention": "FSRS שימור בקשות",
- "flashcardFSRSParamRequestRetentionTip": "מייצג את הסבירות של התRecall שברצונך להגיע אליה. שים לב שיש סיכון בין שימור גבוה ובין מספר חזרות גבוהים. מומלץ לקבוע ערך זה Somewhere בין 0.8 ל-0.9",
+ "flashcardFSRSParamRequestRetentionTip": "מייצג את הסבירות של ההזכרה שברצונך להגיע אליה. שים לב שיש סיכון בין שימור גבוה ובין מספר חזרות גבוהים. מומלץ לקבוע ערך זה איפשהו בין 0.8 ל-0.9",
"flashcardFSRSParamMaximumInterval": "FSRS מקסימום אינטרוול",
"flashcardFSRSParamMaximumIntervalTip": "מספר הימים המקסימלי בין חזרות",
"flashcardFSRSParamWeights": "FSRS משקלות",
@@ -529,7 +529,7 @@
"allAttrs": "כל שמות מאפיינים וערכי מאפיינים",
"chooseSyncDirection": "בחר כיוון סנכרון",
"uploadData2Cloud": "⬆️ העלה צילום נתונים מקומי",
- "uploadData2CloudTip": "צור צילום נתונים ולאחר מכן העלe אותו לענן",
+ "uploadData2CloudTip": "צור צילום נתונים ולאחר מכן העלה אותו לענן",
"downloadDataFromCloud": "⬇️ הורד צילום נתונים מהענן",
"downloadDataFromCloudTip": "הורד את צילום נתונים האחרון מהענן ובצע מיזוג עם נתונים מקומיים",
"targetBlockID": "ID בלוק יעד",
@@ -1085,7 +1085,7 @@
"sort": "מיין",
"enterFullscreen": "היכנס למסך מלא",
"exitFullscreen": "צא ממסך מלא",
- "clearAll": "האם אתה בטוח שאתה רוצה לנקות את כל הקבצים הלא מפנים?",
+ "clearAll": "האם אתה בטוח שאתה רוצה לנקות את כל הנכסים הלא מפנים?",
"missingAssets": "נכסים חסרים",
"unreferencedAssets": "נכסים לא מפנים",
"paste": "הדבק",
@@ -1496,7 +1496,7 @@
"30": "נכשל בקבלת מידע על ענן",
"31": "אישור חשבון נכשל, אנא היכנס שוב",
"32": "נכשל בהסרת מחברת בענן",
- "33": "הרשאות לא מספיקות לקוראים ולכתוב קבצים או גישה לרשת, אנא בדוק את הרשאות תיקיית החלל עבודה ואת הגדרות תוכנת האנטי-וירוס/חומת האש. אם כבר הפעלת את SiYuan כמנהל בעבר, אנא Consider שינוי לתיקיית עבודה חדשה ואינך מריץ את זה כמנהל בעתיד (תיקיית העבודה הנוכחית עשויה לא להיות נגישה יותר על ידי משתמשים רגילים)",
+ "33": "הרשאות לא מספיקות לקוראים ולכתוב קבצים או גישה לרשת, אנא בדוק את הרשאות תיקיית החלל עבודה ואת הגדרות תוכנת האנטי-וירוס/חומת האש. אם כבר הפעלת את SiYuan כמנהל בעבר, אנא שקול שינוי לתיקיית עבודה חדשה ואינך מריץ את זה כמנהל בעתיד (תיקיית העבודה הנוכחית עשויה לא להיות נגישה יותר על ידי משתמשים רגילים)",
"34": "תפעולה זו אינה נתמכת במצב קריאה בלבד",
"35": "שחזור אינדקס, אנא המתן...",
"36": "יש יותר מדי תוכן במסמך ההיסטורי, כדי שלא להשפיע על הביצועים, זה הוסב לתצוגת טקסט פשוטה",
@@ -1573,7 +1573,7 @@
"107": "הועלה מסמך [%s]",
"108": "נמצא סכסוך בנתוני הסנכרון, תוכל לראות את התוכן שנוצר בסכסוך ב[היסטוריית הנתונים]",
"109": "הסרת תזכורת הושלמה [%s]",
- "110": "מחזיק...",
+ "110": "משנה שם...",
"111": "שומר את הנתונים [%s]...",
"112": "אין לכלול את סימן התחביר של Markdown [%s]",
"113": "שלמת הנתונים מתבצעת...",
diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json
index 96f1a36dd..86773620b 100644
--- a/app/appearance/langs/ja_JP.json
+++ b/app/appearance/langs/ja_JP.json
@@ -30,7 +30,7 @@
"insertSameLevelHeadingAfter": "後に同じレベルの見出しを挿入",
"upgrade": "アップグレード",
"downgrade": "ダウングレード",
- "clipboardPermissionDenied": "A permissão para a área de transferência foi negada. Por favor, permita o acesso à área de transferência na barra de endereços do navegador e tente novamente. Atenção: o protocolo http pode não permitir o acesso à área de transferência, use Ctrl+V / ⌘V para colar",
+ "clipboardPermissionDenied": "クリップボードへのアクセスが拒否されました。ブラウザのアドレスバーでクリップボードへのアクセスを許可してから、再度お試しください。注意:http プロトコルではクリップボードにアクセスできない場合があります。Ctrl+V / ⌘V で貼り付けてください",
"jumpTo": "ジャンプ先",
"vacuumDataIndex": "インデックスの最適化",
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
@@ -1211,8 +1211,8 @@
"export22": "%page は現在のページ番号、%pages は総ページ数で、Sprig テンプレート関数に対応しています",
"export23": "YAML フロントマター付きの Markdown をエクスポート",
"export24": "エクスポートされる Markdown ファイルの先頭に一般的なメタデータを追加します",
- "export25": "Pandoc 실행 매개변수",
- "export26": "Word .docx 파일을 내보낼 때 사용하는 Pandoc 매개변수",
+"export25": "Pandoc 実行パラメータ",
+ "export26": "Word .docx ファイルをエクスポートする際に使用する Pandoc パラメータ",
"export27": "PDF に透かしを書き出す",
"export28": "透かしテキストまたは透かし画像ファイルのパス",
"export29": "透かしの位置、サイズ、スタイルなど",
@@ -1375,7 +1375,7 @@
"desktop": "デスクトップ",
"tablet": "タブレット",
"mobile": "モバイル端末",
- "copyToWechatMP": "Yuque にコピーする",
+ "copyToWechatMP": "WeChat MP にコピー",
"copyToZhihu": "Zhihu にコピーする",
"copyToYuque": "Yuque にコピーする",
"pasteToWechatMP": "コピーしました。WeChat に貼り付けることができます",
@@ -1468,8 +1468,8 @@
"2": "ボックス [%s] およびパス [%s] のファイル一覧の取得に失敗しました: %s",
"3": "ノートブック [%s] ファイル [%s] の読み込みに失敗しました: %s",
"4": "ノートブック [%s] ファイル [%s] のメタ情報の取得に失敗しました: %s",
- "5": "ノートブック [%s] ファイル [%s] の移動に失敗しまし: %s",
- "6": "ノートブック [%s] フォルダ [%s] の作成に失敗しまし: %s",
+ "5": "ノートブック [%s] ファイル [%s] の移動に失敗しました: %s",
+ "6": "ノートブック [%s] フォルダ [%s] の作成に失敗しました: %s",
"7": "ノートブック [%s] パス [%s] の削除に失敗しました: %s",
"8": "更新の確認に失敗しました",
"9": "\uD83D\uDE80 新しいバージョンが利用可能です。リリースアナウンスを確認してください %s",
@@ -1487,11 +1487,11 @@
"21": "キャプチャを入力してください",
"22": "キャプチャが正しくありません",
"23": "データリポジトリが壊れています。データリポジトリをリセットしてください",
- "24": "ネットワークがタイムアウトしました。後でまた試してださい",
+ "24": "ネットワークがタイムアウトしました。後でまた試してください",
"25": "属性名は小文字の英字、数字、ハイフンのみを含むことができ、小文字の英字で始まる必要があります",
"26": "[設定] - [情報] - [データリポジトリキー] でデータリポジトリキーを初期化してください",
"27": "[%v] をアップロード中",
- "28": "ネットワークに問題があります。後でまた試してださい",
+ "28": "ネットワークに問題があります。後でまた試してください",
"29": "この機能は [年額サブスクリプション] を購入後に使用できます(すでに購入している場合は、設定 - アカウントで更新または再ログインしてください)",
"30": "クラウド情報の取得に失敗しました",
"31": "アカウントの認証に失敗しました。もう一度ログインしてください",
diff --git a/app/appearance/langs/ko_KR.json b/app/appearance/langs/ko_KR.json
index c3b4e0c5d..aa0d7528c 100644
--- a/app/appearance/langs/ko_KR.json
+++ b/app/appearance/langs/ko_KR.json
@@ -137,7 +137,7 @@
"allowHTMLBLockScript": "HTML 블록 내 스크립트 실행 허용",
"allowHTMLBLockScriptTip": "활성화하면 HTML 블록의 스크립트가 삭제되지 않습니다. XSS 공격의 잠재적 위험에 주의하세요",
"allowSVGScript": "SVG 내부 스크립트 실행 허용",
- "allowSVGScriptTip": "활성화하면 SVG 내의 코드는 보안 필터링 대상이 되지 않습니다。잠재적 XSS 공격에 주의하세요",
+ "allowSVGScriptTip": "활성화하면 SVG 내의 코드는 보안 필터링 대상이 되지 않습니다. 잠재적 XSS 공격에 주의하세요",
"autoLaunchMode0": "자동으로 시작하지 않음",
"autoLaunchMode1": "부팅 후 자동 시작",
"autoLaunchMode2": "부팅 후 자동 시작 및 메인 인터페이스 최소화",
diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json
index 1455b5273..efd46bcb9 100644
--- a/app/appearance/langs/pl_PL.json
+++ b/app/appearance/langs/pl_PL.json
@@ -30,7 +30,7 @@
"insertSameLevelHeadingAfter": "Wstaw nagłówek na tym samym poziomie po",
"upgrade": "Aktualizuj",
"downgrade": "Degraduj",
- "clipboardPermissionDenied": "A permissão para a área de transferência foi negada. Por favor, permita o acesso à área de transferência na barra de endereços do navegador e tente novamente. Atenção: o protocolo http pode não permitir o acesso à área de transferência, use Ctrl+V / ⌘V para colar",
+ "clipboardPermissionDenied": "Odmowa dostępu do schowka. Zezwól na dostęp do schowka w pasku adresu przeglądarki i spróbuj ponownie. Uwaga: protokół http może uniemożliwiać dostęp do schowka, użyj Ctrl+V / ⌘V do wklejenia",
"jumpTo": "Przejdź do",
"vacuumDataIndex": "Optymalizuj indeks",
"vacuumDataIndexTip": "Sprawdź indeks danych, zwolnij miejsce i popraw wydajność indeksu",
@@ -91,7 +91,7 @@
"dynamicIconDateEmptyInfo": "Wyczyść datę, ikona kalendarza będzie dynamicznie wyświetlać bieżącą datę",
"backlinkContainChildren": "Czy linki zwrotne zawierają bloki podrzędne",
"backlinkContainChildrenTip": "Po włączeniu bloki podrzędne zostaną uwzględnione w obliczeniach linków zwrotnych",
- "entryNum": "Количество записей",
+ "entryNum": "Liczba wpisów",
"workspaceData": "Dane przestrzeni roboczej",
"confirmRemoveRelationField": "Czy na pewno chcesz usunąć pole ${x}? Po usunięciu tego pola, dwukierunkowe pole relacji ${z} w bazie danych ${y} również zostanie usunięte synchronicznie.",
"removeBothRelationField": "Usuń oba pola",
@@ -561,7 +561,7 @@
"sortByRankDesc": "Relevance DESC",
"sortByRankAsc": "Relevance ASC",
"saveCriterion": "Zapisz kryteria zapytania",
- "useCriterion": "Następne zapytanie nie wilno już używać bieżących kryteriów zapytania",
+ "useCriterion": "Następne zapytanie nie będzie już używać bieżących kryteriów zapytania",
"removeCriterion": "Resetuj kryteria zapytania",
"group": "Grupa",
"noGroupBy": "Brak grupowania",
@@ -1210,7 +1210,7 @@
"export21": "Eksportuj szablon stopki PDF",
"export22": "%page to numer bieżącej strony, %pages to całkowita liczba stron, wspiera funkcje szablonu Sprig",
"export23": "Eksportuj Markdown z metadanymi YAML",
- "export24": "Po włączeniu, dodaj kilka ogólnych informacji metadanych на początku wyeksportowanego pliku Markdown",
+ "export24": "Po włączeniu, dodaj kilka ogólnych informacji metadanych na początku wyeksportowanego pliku Markdown",
"export25": "Parametry uruchamiania Pandoc",
"export26": "Parametry Pandoc używane przy eksporcie pliku Word .docx",
"export27": "Eksportuj znak wodny PDF",
@@ -1661,7 +1661,7 @@
"195": "Czas systemowy jest nieprawidłowy, proszę skalibrować czas systemowy i spróbować ponownie",
"196": "Nie ustawiaj obszaru roboczego pod ścieżką zewnętrznego dysku synchronizującego, w przeciwnym razie dane ulegną uszkodzeniu (iCloud/OneDrive/Dropbox/Google Drive/Nutstore/Baidu Netdisk/Tencent Weiyun itp.)",
"197": "Proszę otworzyć notatnik [%s] i spróbować ponownie",
- "198": "To nie jest ważny archiwum. Jeśli archiwum zostało wyeksportowane z [Drzewa dokumentów], proszę zaimportować je iz [Drzewa dokumentów]",
+ "198": "To nie jest ważny archiwum. Jeśli archiwum zostało wyeksportowane z [Drzewa dokumentów], proszę zaimportować je z [Drzewa dokumentów]",
"199": "To nie jest ważny archiwum .sy.zip. Jeśli archiwum zostało wyeksportowane z [Ustawień], proszę zaimportować je z [Ustawień]",
"200": "Czas reakcji wyszukiwania globalnego jest wolny, zaleca się dodanie filtrów typów lub słów kluczowych w celu zawężenia zakresu wyszukiwania",
"201": "Nie udało się opróżnić repozytorium danych: %s",
diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json
index bda09ba2c..165b9ed82 100644
--- a/app/appearance/langs/pt_BR.json
+++ b/app/appearance/langs/pt_BR.json
@@ -9,7 +9,7 @@
"removeAssetsIDTip": "Ao ativar, ao exportar para Markdown a parte do nome do arquivo de recursos contendo o ID será removida",
"clearTempFiles": "Limpar arquivos temporários",
"clearTempFilesTip": "Limpe os arquivos temporários gerados durante a execução do aplicativo para liberar espaço de armazenamento",
- "uploadFileTooLarge": "⚠️ O arquivo enviado [${x}] é muito grande [${y}]。 Tem certeza de que deseja continuar o upload?",
+ "uploadFileTooLarge": "⚠️ O arquivo enviado [${x}] é muito grande [${y}]. Tem certeza de que deseja continuar o upload?",
"recentDocsMaxListCount": "Número máximo de documentos recentes listados",
"recentDocsMaxListCountTip": "Número máximo de documentos listados na caixa de diálogo Documentos Recentes",
"bazaarNeedVersion": "É necessário atualizar o SiYuan para a versão v${x} ou superior para usar",
@@ -137,7 +137,7 @@
"allowHTMLBLockScript": "Permitir execução de scripts dentro de blocos HTML",
"allowHTMLBLockScriptTip": "Quando ativado, o script no bloco HTML não será sanitizado, esteja ciente do risco potencial de ataques XSS",
"allowSVGScript": "Permitir execução de scripts dentro de SVG",
- "allowSVGScriptTip": "Ao ativar, o código dentro do SVG não será filtrado por segurança。Atenção ao risco potencial de XSS",
+ "allowSVGScriptTip": "Ao ativar, o código dentro do SVG não será filtrado por segurança. Atenção ao risco potencial de XSS",
"autoLaunchMode0": "Não iniciar automaticamente",
"autoLaunchMode1": "Iniciar automaticamente após inicialização",
"autoLaunchMode2": "Iniciar automaticamente e minimizar a interface principal após inicialização",
@@ -330,7 +330,7 @@
"numberFormatMOP": "Pataca de Macau",
"numberFormatSGD": "Dólar de Singapura",
"numberFormatNZD": "Dólar neozelandês",
- "numberFormatILS": "Новый израильский шекель",
+ "numberFormatILS": "Novo shequel israelense",
"email": "E-mail",
"phone": "Telefone",
"inboxTip": "Abra o guia do usuário para pesquisar o inbox e visualizar as instruções",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index 7bfd2fb3f..2c8e8ac8e 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -13,7 +13,7 @@
"recentDocsMaxListCount": "最近的文檔列出數量",
"recentDocsMaxListCountTip": "在最近的文檔對話框中最多列出文檔的數量",
"bazaarNeedVersion": "需升級到思源筆記 v${x} 或更高版本才能使用",
- "downloadRollback": "下载并回滚",
+ "downloadRollback": "下載並回滾",
"callout": "提示",
"hasAttrName": "屬性名 ${x} 已存在",
"statusBarMsgPushTip": "透過狀態列訊息可以即時地了解系統的運作情況,如果感到打擾可以將其關閉",
@@ -1574,7 +1574,7 @@
"108": "資料同步發現衝突,可在 [資料歷史] 中查看生成的衝突內容",
"109": "移除提醒完畢 [%s]",
"110": "正在重命名...",
- "111": "正在保存数据 [%s]...",
+ "111": "正在保存資料 [%s]...",
"112": "請勿包含 Markdown 語法標記符 [%s]",
"113": "正在完成資料寫入...",
"114": "標籤不能為空",
@@ -1597,8 +1597,8 @@
"131": "不支持該操作,請到雲端存儲提供商管理控制台進行操作",
"132": "SQL 搜索方式下不支援替換操作,請使用其他搜索方式",
"133": "正在下載更新安裝檔 [%s]",
- "134": "為避免剛恢復的資料被同步覆蓋,資料據同步功能已被自動暫停",
- "135": "資料倉儲金鑰不正確,無法解密資料。請參考 用戶指南-常見問題-遺失密鑰 步驟處理",
+ "134": "為避免剛恢復的資料被同步覆蓋,資料同步功能已被自動暫停",
+ "135": "資料倉庫密鑰不正確,無法解密資料。請參考 用戶指南-常見問題-遺失密鑰 步驟處理",
"136": "初始化資料倉庫密鑰...",
"137": "初始化資料倉庫密鑰失敗:%s",
"138": "資料倉庫密鑰設置完畢",
@@ -1714,7 +1714,7 @@
"248": "目標標題位於容器塊中,無法作為放置點",
"249": "因配置錯誤導致無法存取數據,請仔細逐個核對配置項,並檢查雲端存儲相關權限配置",
"250": "請求已被雲端存儲限流,請仔細逐個核對配置項,並檢查雲端存儲相關權限配置",
- "251": "未引用資源一共 ${x} 個,這裡僅列出 ${y} 個",
+ "251": "未引用資源一共 [%d] 個,這裡僅列出 [%d] 個",
"252": "\uD83D\uDEA8 Microsoft Defender 可能會誤殺內核、誤刪數據和嚴重降低運行性能,建議將思源安裝路徑和工作空間路徑添加到排除列表",
"253": "正在壓縮文件 [%s],請稍等...",
"254": "[Region ID] 不正確,請參考 S3 服務提供商的文檔配置地域 ID",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index 839ee5397..af13dd596 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -835,7 +835,7 @@
"thumbsTitle": "显示缩略图",
"document_properties_page_size_name_a3": "A3",
"document_properties_page_size_name_a4": "A4",
- "document_properties_page_size_name_letter": "文本",
+ "document_properties_page_size_name_letter": "信纸",
"document_properties_page_size_name_legal": "法律",
"document_properties_page_size_orientation_portrait": "纵向",
"document_properties_page_size_orientation_landscape": "横向",
From a6104015ae8b08321c323886de0a7def2de921fb Mon Sep 17 00:00:00 2001
From: Daniel <845765@qq.com>
Date: Sun, 1 Feb 2026 15:34:46 +0800
Subject: [PATCH 3/3] :art:
https://github.com/siyuan-note/siyuan/issues/11569#issuecomment-3830534244
Signed-off-by: Daniel <845765@qq.com>
---
kernel/model/attribute_view_render.go | 25 +++++++++++++++++++++++++
kernel/model/tree.go | 1 +
2 files changed, 26 insertions(+)
diff --git a/kernel/model/attribute_view_render.go b/kernel/model/attribute_view_render.go
index 5b78d21d3..93b654236 100644
--- a/kernel/model/attribute_view_render.go
+++ b/kernel/model/attribute_view_render.go
@@ -44,6 +44,11 @@ func RenderAttributeView(blockID, avID, viewID, query string, page, pageSize int
return
}
+ if !ast.IsNodeIDPattern(avID) {
+ err = ErrInvalidID
+ return
+ }
+
attrView = av.NewAttributeView(avID)
if err = av.SaveAttributeView(attrView); err != nil {
logging.LogErrorf("save attribute view [%s] failed: %s", avID, err)
@@ -499,6 +504,11 @@ func RenderRepoSnapshotAttributeView(indexID, avID string) (viewable av.Viewable
}
if nil == avFile {
+ if !ast.IsNodeIDPattern(avID) {
+ err = ErrInvalidID
+ return
+ }
+
attrView = av.NewAttributeView(avID)
} else {
data, readErr := repo.OpenFile(avFile)
@@ -507,6 +517,11 @@ func RenderRepoSnapshotAttributeView(indexID, avID string) (viewable av.Viewable
return
}
+ if !ast.IsNodeIDPattern(avID) {
+ err = ErrInvalidID
+ return
+ }
+
attrView = av.NewAttributeView(avID)
if err = gulu.JSON.UnmarshalJSON(data, attrView); err != nil {
logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err)
@@ -544,6 +559,11 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS
}
if !gulu.File.IsExist(avJSONPath) {
logging.LogWarnf("attribute view [%s] not found in current data", avID)
+ if !ast.IsNodeIDPattern(avID) {
+ err = ErrInvalidID
+ return
+ }
+
attrView = av.NewAttributeView(avID)
} else {
data, readErr := os.ReadFile(avJSONPath)
@@ -552,6 +572,11 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS
return
}
+ if !ast.IsNodeIDPattern(avID) {
+ err = ErrInvalidID
+ return
+ }
+
attrView = av.NewAttributeView(avID)
if err = gulu.JSON.UnmarshalJSON(data, attrView); err != nil {
logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err)
diff --git a/kernel/model/tree.go b/kernel/model/tree.go
index 96ff5989e..ba18dd159 100644
--- a/kernel/model/tree.go
+++ b/kernel/model/tree.go
@@ -182,6 +182,7 @@ var (
ErrTreeNotFound = errors.New("tree not found")
ErrIndexing = errors.New("indexing")
ErrBoxUnindexed = errors.New("notebook unindexed")
+ ErrInvalidID = errors.New("invalid id")
)
func LoadTreeByBlockIDWithReindex(id string) (ret *parse.Tree, err error) {