Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2026-01-03 19:33:16 +08:00
commit 47b6a449ae
25 changed files with 153 additions and 158 deletions

View file

@ -1373,6 +1373,7 @@
"undo": "تراجع",
"up": "أعلى",
"update": "تحديث",
"updateVersion": "⬆️ تحديث",
"insertAsset": "إدراج صورة أو ملف",
"uploadError": "خطأ في الرفع",
"uploading": "يتم الرفع...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] جارٍ التحقق من الفهرس...",
"59": "فشل في تعيين قائمة تجاهل المزامنة",
"60": "‫فشل في الحصول على حزمة التحديث: %s",
"61": "⬆️ حزمة تثبيت الإصدار الجديد جاهزة، هل تريد تثبيت الإصدار الجديد الآن؟",
"61": "حزمة تثبيت الإصدار الجديد جاهزة، هل تريد تثبيت الإصدار الجديد الآن؟<br><br><span class='ft__on-surface'>يرجى ملاحظة أنه يجب الانتظار حتى يتم إغلاق SiYuan بالكامل قبل التثبيت</span>",
"62": "⬆️ حزمة تثبيت الإصدار الجديد جاهزة. عند الخروج من التطبيق، سوف تُسأل ما إذا كنت تريد تثبيت الإصدار الجديد",
"63": "جارٍ الاسترجاع, الرجاء الانتظار...",
"64": "‫هناك [%d] ملفات في المجموع، سوف يستغرق الأمر بعض الوقت للفهرسة، الرجاء الانتظار...",
@ -1541,7 +1542,7 @@
"100": "جارٍ تنظيف البيانات...",
"101": "‫تم إعداد تذكير [%s]",
"102": "اكتملت المعالجة",
"103": "تم تنزيل حزمة التحديث تلقائياً في الخلفية. عند الخروج، سوف تُسأل ما إذا كنت تريد تثبيت الإصدار الجديد",
"103": "تم بدء تنزيل حزمة التحديث تلقائياً، سيتم عرض تقدم التنزيل في الشريط السفلي",
"104": "فشل تنزيل حزمة التحديث، الرجاء التحقق من اتصال الشبكة",
"105": "بدون عنوان",
"106": "الحد الأقصى للطول هو 512 حرفاً",

View file

@ -1373,6 +1373,7 @@
"undo": "Rückgängig",
"up": "Nach oben",
"update": "Aktualisieren",
"updateVersion": "⬆️ Aktualisieren",
"insertAsset": "Bild oder Datei einfügen",
"uploadError": "Upload-Fehler",
"uploading": "Hochladen...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Überprüfen des Index...",
"59": "Fehler beim Festlegen der Ignorierliste für die Synchronisation",
"60": "Fehler beim Abrufen des Update-Pakets: %s",
"61": "⬆️ Das neue Versionsinstallationspaket ist bereit, möchten Sie die neue Version jetzt installieren?",
"61": "Das neue Versionsinstallationspaket ist bereit, möchten Sie die neue Version jetzt installieren?<br><br><span class='ft__on-surface'>Bitte beachten Sie, dass Sie warten müssen, bis SiYuan vollständig beendet ist, bevor Sie die Installation durchführen</span>",
"62": "⬆️ Das neue Versionsinstallationspaket ist bereit. Beim Beenden werden Sie gefragt, ob Sie die neue Version installieren möchten",
"63": "Wiederherstellung, bitte warten...",
"64": "Insgesamt [%d] Dateien, es dauert etwas Zeit, um zu indizieren, bitte warten...",
@ -1541,7 +1542,7 @@
"100": "Daten bereinigen...",
"101": "Erinnerung [%s] eingestellt",
"102": "Bearbeitung abgeschlossen",
"103": "Das Update-Installationspaket wurde automatisch im Hintergrund heruntergeladen. Beim Beenden werden Sie gefragt, ob Sie die neue Version installieren möchten",
"103": "Der Download des Update-Installationspakets wurde automatisch gestartet, der Download-Fortschritt wird in der unteren Leiste angezeigt",
"104": "Das Update-Installationspaket konnte nicht heruntergeladen werden, bitte überprüfen Sie die Netzwerkverbindung",
"105": "Ohne Titel",
"106": "Maximale Länge ist auf 512 Zeichen begrenzt",

View file

@ -1373,6 +1373,7 @@
"undo": "Undo",
"up": "Up",
"update": "Update",
"updateVersion": "⬆️ Update",
"insertAsset": "Insert image or file",
"uploadError": "upload error",
"uploading": "Uploading...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Verifying index...",
"59": "Failed to set sync ignore list",
"60": "Failed to get the update package: %s",
"61": "⬆️ The new version installation package is ready, do you want to install the new version now?",
"61": "The new version installation package is ready, do you want to install the new version now?<br><br><span class='ft__on-surface'>Please note that you need to wait for SiYuan to fully exit before installing</span>",
"62": "⬆️ The new version installation package is ready. When exiting, you will be asked whether to install the new version",
"63": "Recovering, please wait...",
"64": "There are [%d] files in total, it will take some time to index, please wait...",
@ -1541,7 +1542,7 @@
"100": "Cleaning data...",
"101": "Done setting reminder [%s]",
"102": "Processing completed",
"103": "The update installation package has been automatically downloaded in the background. When exiting, you will be asked whether to install the new version",
"103": "The update installation package has been automatically started downloading, download progress will be displayed in the bottom bar",
"104": "The update installation package failed to download, please check the network connection",
"105": "Untitled",
"106": "Maximum length is limited to 512 characters",

View file

@ -18,7 +18,7 @@
"insertSameLevelHeadingBefore": "Insertar título del mismo nivel antes",
"insertSameLevelHeadingAfter": "Insertar título del mismo nivel después",
"upgrade": "Actualizar",
"downgrade": "Degradar",
"downgrade": "Revertir",
"clipboardPermissionDenied": "Permiso del portapapeles denegado. Por favor, permita el acceso al portapapeles en la barra de direcciones del navegador y vuelva a intentarlo. Atención: el protocolo http puede no permitir el acceso al portapapeles, utilice Ctrl+V / ⌘V para pegar",
"jumpTo": "Ir a",
"vacuumDataIndex": "Optimizar índice",
@ -165,7 +165,7 @@
"insertRowAfter": "Insertar ${x} fila(s) abajo",
"setDueTime": "Establecer tiempo de vencimiento",
"showCardDay": "¿Después de cuántos días deseas mostrar la tarjeta?",
"forgetCount": "Olvídate de contar",
"forgetCount": "Conteo de olvidos",
"lastReviewTime": "Última hora de revisión",
"cardStatus": "Estado de la tarjeta",
"noSupportTip": "Esta función no admite el uso de paquetes de tarjetas",
@ -320,7 +320,7 @@
"numberFormatILS": "Nuevo shekel israelí",
"email": "Correo electrónico",
"phone": "Teléfono",
"inboxTip": "Abra la guía del usuario para buscar en la <code class='fn__code'>bandeja de entrada</code> para ver las instrucciones",
"inboxTip": "Abra la guía del usuario y busque <code class='fn__code'>bandeja de entrada</code> para ver las instrucciones",
"builtIn": "Incorporado",
"endDate": "Fecha de finalización",
"needLogin": "Esta función requiere iniciar sesión en la cuenta antes de poder usarla",
@ -416,14 +416,14 @@
"enablePluginTip2": "Todos los complementos están actualmente deshabilitados, habilítelos en [Descargados - Complemento]",
"enablePlugin": "Habilitar complemento",
"color": "Color",
"confirmPassword": "Ya he recordado la contraseña",
"confirmPassword": "He guardado la contraseña",
"passwordNoMatch": "Las contraseñas ingresadas dos veces no coinciden",
"cloudConfigTip": "Configure en [Configuración - Nube]",
"confirmUninstall": "¿Está seguro de que desea desinstalar ${name}?<br>La desinstalación puede eliminar todas las configuraciones y datos relacionados, por favor, decida con precaución!",
"scrollGetMore": "Desplácese hacia arriba y hacia abajo para cargar más",
"flashcardNewCard": "Nueva Tarjeta",
"flashcardReviewCard": "Vieja Tarjeta",
"flashcardDueCard": "Tarjeta debida",
"flashcardReviewCard": "Vieja de repaso",
"flashcardDueCard": "Tarjeta vencida",
"flashcardCard": "Todos",
"plugin": "Complemento",
"attrBookmarkTip": "Asociar este bloque con un marcador para verlo posteriormente a través del panel de marcadores",
@ -451,9 +451,9 @@
"nextDue": "Revisa la próxima vez",
"flashcardNewCardLimit": "Límite de tarjeta nueva",
"flashcardNewCardLimitTip": "Si hay muchas tarjetas nuevas, puede establecer la cantidad de tarjetas nuevas para revisar a través de este elemento",
"flashcardReviewCardLimit": "Límite de tarjeta antigua",
"flashcardReviewCardLimitTip": "Si hay muchas tarjetas antiguas, puede configurar la cantidad de tarjetas antiguas para revisar a través de este elemento",
"flashcardMark": "Marcar cardado",
"flashcardReviewCardLimit": "Límite de tarjeta de repaso",
"flashcardReviewCardLimitTip": "Si hay muchas tarjetas de repaso, puede establecer el límite de revisión aquí",
"flashcardMark": "Tarjeta de marcado",
"flashcardMarkTip": "Después de habilitar, la marca se reconoce como un espacio en blanco",
"flashcardList": "Lista de tarjetas",
"flashcardListTip": "Después de habilitar, el primer elemento de una lista se reconoce como una pregunta, y el resto de los elementos básicos se reconocen como respuestas",
@ -540,7 +540,7 @@
"removeDeck": "Eliminar del mazo",
"riffCard": "Tarjeta Flash",
"compare": "Comparar",
"switchTab": "Conmutador",
"switchTab": "Cambiar pestaña",
"recentDocs": "Documentos recientes",
"autoLaunch": "Inicio automático al arrancar",
"autoLaunchTip": "Después de habilitar, la aplicación se iniciará automáticamente después de iniciar sesión en el sistema operativo",
@ -612,13 +612,13 @@
"downloaded": "Descargado",
"allOp": "Todas las operaciones",
"allNotebooks": "Todos los cuadernos",
"historyClean": "limpiar (clean)",
"historyUpdate": "actualizar (update)",
"historyDelete": "eliminar (delete)",
"historyFormat": "formatear (format)",
"historySync": "sincronizar (sync)",
"historyReplace": "reemplazar (replace)",
"historyOutline": "esquema (outline)",
"historyClean": "Limpiar",
"historyUpdate": "Actualizar",
"historyDelete": "Eliminar",
"historyFormat": "Formatear",
"historySync": "Sincronizar",
"historyReplace": "Reemplazar",
"historyOutline": "Esquema",
"htmlBlockError": "La ejecución del siguiente script afectará la visualización de la interfaz y el script ha dejado de ejecutarse",
"fileHistory": "Historial de archivos",
"htmlBlockTip": "Se forman varios bloques HTML. Para evitar la pérdida de datos, utilice etiquetas <code class='fn__code'>&lt;div&gt;</code> para ajustar y eliminar líneas en blanco",
@ -716,7 +716,7 @@
"height": "Alto",
"deactivateUser": "Desactivar cuenta",
"deactivateUserTip": "<ul class='fn__list'><li>Una vez desactivada la cuenta, no se puede recuperar, por favor no lo intente a voluntad</li><li>El nombre de usuario se rellenará con <code>alguien101</code> (el siguiente número es el número de usuario), la contraseña se restablecerá con un número aleatorio</li><li>Borrar el apodo, la autoetiqueta, la URL, el perfil, el avatar, el enlace del sitio, la dirección de correo y otra información del usuario</li><li >Todos los interruptores de la configuración de privacidad se restablecerán al estado público por defecto</li>n<li>Las cuentas sociales de terceros, los teléfonos móviles</li><li><strong>nombre de usuario, número de teléfono móvil, tercero vinculado. La cuenta no podrá volver a utilizarse en el futuro</strong></li><li>El estado del usuario está desactivado, el inicio de sesión está prohibido</li></ul>",
"mergeCell": "Merge Cell",
"mergeCell": "Fusionar celdas",
"cancelMerged": "Cancelar fusión de celda",
"useDefaultWidth": "Usar el ancho de columna por defecto",
"useDefaultAlign": "Usar alineación predeterminada",
@ -742,7 +742,7 @@
"exportPDF2": "Márgenes de la página",
"exportPDF3": "Escala de la página",
"exportPDF4": "Recursos incrustados",
"exportPDF5": "Mantener doblado",
"exportPDF5": "Mantener contraído",
"paged": "Paginado",
"mergeSubdocs": "Fusionar subdocumentos",
"removeAssetsFolder": "Eliminar directorio de recursos",
@ -943,7 +943,7 @@
"collapse": "Colapsar",
"blockEmbed": "Integrar Bloque",
"rowTip": "Haga clic en <span class='ft__on-surface'>Abrir menú</span><br>Arrastre <span class='ft__on-surface'>Ordenar</span><br>⇧Haga clic en <span class='ft__on-surface'>Actualizar atributo</span>",
"gutterTip": "Haga clic/⌘/ <span class='ft__on-surface'>Abrir menú</span><br>⌘Haga clic⌥→ <span class='ft__on-surface'>Enfoque</span><br>⌥Hacer clic⌘↑ <span class='ft__on-surface'>Contraer/Expandir</span><br>⇧Hacer clic⌥⌘A <span class='ft__on-surface'>Actualizar atributo</span><br>Arrastrar <span class='ft__on-surface'>Mover posición</span><br>⌃Arrastrar <span class='ft__on-surface'>Repetir</span><br>⌥Arrastra <span class='ft__on-surface'>Generar referencia a bloque</span><br>⇧Arrastrar <span class='ft__on-surface'>Generar bloque incrustado</span>",
"gutterTip": "Clic/⌘/ <span class='ft__on-surface'>Menú</span><br>⌘Clic⌥→ <span class='ft__on-surface'>Enfocar</span><br>⌥Clic⌘↑ <span class='ft__on-surface'>Contraer/Expandir</span><br>⇧Clic⌥⌘A <span class='ft__on-surface'>Actualizar atributo</span><br>Arrastrar <span class='ft__on-surface'>Mover</span><br>⌃Arrastrar <span class='ft__on-surface'>Duplicar</span><br>⌥Arrastrar <span class='ft__on-surface'>Referenciar</span><br>⇧Arrastrar <span class='ft__on-surface'>Incrustar</span>",
"gutterTip2": "Haga clic en <span class='ft__on-surface'>Abrir menú</span><br>⇧Haga clic en <span class='ft__on-surface'>Actualizar atributo</span>",
"linkDistance": "Distancia de enlace",
"collideStrength": "Fuerza de colisión",
@ -974,7 +974,7 @@
"pdfConfirm": "¿Desea seguir exportando con el tema Claro seleccionado?",
"import": "Importar",
"doc": "Documento",
"openBy": "Abierto por",
"openBy": "Abrir con",
"replace": "Sustituir",
"replaceAll": "Sustituir todo",
"alias": "Alias",
@ -997,7 +997,7 @@
"zoom": "Zoom",
"invalid": "Inválido",
"conflict": "Conflicto",
"checkToggle": "Compruebe la lista de tareas para cambiar",
"checkToggle": "Alternar casilla de tarea",
"heading1": "Encabezado 1",
"heading2": "Encabezado 2",
"heading3": "Encabezado 3",
@ -1089,8 +1089,8 @@
"refresh": "Actualizar",
"logout": "Cierre de sesión",
"refreshUser": "Información del usuario actualizada",
"insertBottom": "Abrir debajo de la pestaña",
"insertRight": "Abrir a la derecha la pestaña",
"insertBottom": "Abrir debajo",
"insertRight": "Abrir a la derecha",
"account1": "Conviértete en miembro pago",
"account4": "Actualizar a miembro suscrito",
"account2": "Copia de seguridad y sincronización de datos cifrados de extremo a extremo",
@ -1129,7 +1129,7 @@
"appearance2": "Selecciona el tema de resaltado de sintaxis utilizado en el modo claro",
"appearance1": "Tema del bloque de código",
"appearance10": "Configuración del botón de cierre",
"appearance11": "encoger a la bandeja después de hacer clic en el botón de cierre",
"appearance11": "Minimizar a la bandeja del sistema después de hacer clic en el botón de cierre",
"appearance16": "Barra de estado inferior",
"appearance17": "Al habilitar, la barra de estado se ocultará",
"appearance18": "Configurar el interruptor de mensajes de la barra de estado",
@ -1226,13 +1226,13 @@
"graphConfig2": "Filtro de recuento de referencias",
"selectOpen": "Seleccionar siempre el documento abierto",
"selectOpen1": "Seleccionar documento abierto",
"closeAll": "Cierra todas las pestañas",
"closeAll": "Cerrar todas las pestañas",
"closeOthers": "Cerrar otras pestañas",
"closeLeft": "Cerrar pestañas a la izquierda",
"closeRight": "Cerrar pestañas a la derecha",
"closeUnmodified": "Cerrar pestañas sin modificar",
"newFileTip": "Por favor, abra primero un cuaderno de notas",
"copyBlockRef": "Copiar bloque referencia",
"copyBlockRef": "Copiar referencia de bloque",
"copyBlockEmbed": "Copiar bloque incrustado",
"copyMarkdown": "Copiar como Markdown",
"linkLevel": "Profundidad",
@ -1341,7 +1341,7 @@
"nameEmpty": "El nombre está vacío",
"ordered-list": "Lista ordenada",
"outdent": "Reducir sangría",
"outlineOutdent": "Lista de contorno sin sangría",
"outlineOutdent": "Disminuir nivel de esquema",
"outlineOutdentTip": "Después de habilitar, el outdent utilizará la lógica de esquema de la lista, es decir, moviendo los elementos de la lista debajo del padre",
"spellcheck": "Corrección ortográfica",
"spellcheckTip": "Al activarlo se usará el corrector ortográfico integrado del navegador. Por favor, seleccione los idiomas a comprobar en la configuración del navegador",
@ -1373,6 +1373,7 @@
"undo": "Deshacer",
"up": "Arriba",
"update": "Actualización",
"updateVersion": "⬆️ Actualizar",
"insertAsset": "Insertar imagen o archivo",
"uploadError": "error de subida",
"uploading": "Subiendo...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Verificando índice...",
"59": " Falló la configuración de sincronización de la lista de ignorados",
"60": "Fallo al obtener el paquete de actualización: %s",
"61": "⬆️ El paquete de instalación de la nueva versión está listo, ¿quieres instalar la nueva versión ahora?",
"61": "El paquete de instalación de la nueva versión está listo, ¿quieres instalar la nueva versión ahora?<br><br><span class='ft__on-surface'>Tenga en cuenta que debe esperar a que SiYuan se cierre completamente antes de instalar</span>",
"62": "⬆️ El paquete de instalación de la nueva versión está listo. Al salir, se le preguntará si desea instalar la nueva versión",
"63": "Recuperando, por favor espere...",
"64": "Hay [%d] archivos en total, tardará un tiempo en indexarse, por favor espere...",
@ -1541,7 +1542,7 @@
"100": "Limpieza de datos...",
"101": "El recordatorio de configuración [%s] se ha completado",
"102": "Procesamiento completado",
"103": "El paquete de instalación de la actualización se ha descargado automáticamente en segundo plano. Al salir, se le preguntará si desea instalar la nueva versión",
"103": "La descarga del paquete de instalación de la actualización se ha iniciado automáticamente, el progreso de la descarga se mostrará en la barra inferior",
"104": "El paquete de instalación de la actualización no se pudo descargar, verifique la conexión de red",
"105": "Sin título",
"106": "La longitud máxima está limitada a 512 caracteres",

View file

@ -1373,6 +1373,7 @@
"undo": "Retiré",
"up": "en haut",
"update": "Mises à jour",
"updateVersion": "⬆️ Mettre à jour",
"insertAsset": "Insérer une image ou un fichier",
"uploadError": "erreur de transfert",
"uploading": "Transfert en cours",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Vérification de l'index...",
"59": "Échec de la définition de la liste des ignores de synchronisation",
"60": "Échec de la récupération du paquet de mise à jour : %s",
"61": "⬆️ Le package d'installation de la nouvelle version est prêt, voulez-vous installer la nouvelle version maintenant ?",
"61": "Le package d'installation de la nouvelle version est prêt, voulez-vous installer la nouvelle version maintenant ?<br><br><span class='ft__on-surface'>Veuillez noter que vous devez attendre que SiYuan se ferme complètement avant d'installer</span>",
"62": "⬆️ Le package d'installation de la nouvelle version est prêt. En quittant, il vous sera demandé si vous souhaitez installer la nouvelle version",
"63": "Récupération, veuillez patienter...",
"64": "Il y a [%d] fichiers au total, l'indexation prendra un certain temps, veuillez patienter...",
@ -1541,7 +1542,7 @@
"100": "Nettoyage des données...",
"101": "Rappel de réglage terminé [%s]",
"102": "Traitement terminé",
"103": "Le package d'installation de la mise à jour a été automatiquement téléchargé en arrière-plan. En quittant, il vous sera demandé si vous souhaitez installer la nouvelle version",
"103": "Le téléchargement du package d'installation de la mise à jour a été automatiquement démarré, la progression du téléchargement sera affichée dans la barre inférieure",
"104": "Le package d'installation de la mise à jour n'a pas pu être téléchargé, veuillez vérifier la connexion réseau",
"105": "Sans titre",
"106": "La longueur maximale est limitée à 512 caractères",

View file

@ -1373,6 +1373,7 @@
"undo": "ביטול",
"up": "למעלה",
"update": "עדכן",
"updateVersion": "⬆️ עדכן",
"insertAsset": "הכנס תמונה או קובץ",
"uploadError": "שגיאת העלאה",
"uploading": "מעלה...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] בודק אינדקס...",
"59": "נכשל בהגדרת רשימת ההזנחה בסנכרון",
"60": "נכשל לקבל את חבילת העדכון: %s",
"61": "⬆️ חבילת העדכון החדשה מוכנה, האם אתה רוצה להתקין את הגרסה החדשה עכשיו?",
"61": "חבילת העדכון החדשה מוכנה, האם אתה רוצה להתקין את הגרסה החדשה עכשיו?<br><br><span class='ft__on-surface'>שימו לב: יש להמתין עד ש-SiYuan ייסגר לחלוטין לפני ההתקנה</span>",
"62": "⬆️ חבילת העדכון החדשה מוכנה. בעת היציאה, תישאל אם להתקין את הגרסה החדשה",
"63": "מוקם, אנא המתן...",
"64": "יש בסך הכל [%d] קבצים, יידרש זמן מה לאינדיקציה, אנא המתן...",
@ -1541,7 +1542,7 @@
"100": "מנקה נתונים...",
"101": "הושלמה הגדרת תזכורת [%s]",
"102": "העיבוד הושלם",
"103": "חבילת ההתקנה לעדכון הושלמה ברקע אוטומטית. בעת היציאה, תישאל אם להתקין את הגרסה החדשה",
"103": "הורדת חבילת ההתקנה לעדכון החלה אוטומטית, התקדמות ההורדה תוצג בשורת התחתית",
"104": "חבילת ההתקנה לעדכון נכשלת בהורדה, אנא בדוק את החיבור לרשת",
"105": "ללא כותרת",
"106": "אורך מרבי מוגבל ל-512 תווים",

View file

@ -1373,6 +1373,7 @@
"undo": "Annulla",
"up": "Su",
"update": "Aggiorna",
"updateVersion": "⬆️ Aggiorna",
"insertAsset": "Inserisci immagine o file",
"uploadError": "Errore di caricamento",
"uploading": "Caricamento in corso.",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Verifica dell'indice in corso...",
"59": "Impossibile impostare la lista di ignoranza della sincronizzazione",
"60": "Impossibile ottenere il pacchetto di aggiornamento: %s",
"61": "⬆️ Il pacchetto di installazione della nuova versione è pronto, vuoi installarlo ora?",
"61": "Il pacchetto di installazione della nuova versione è pronto, vuoi installarlo ora?<br><br><span class='ft__on-surface'>Si prega di notare che è necessario attendere che SiYuan si chiuda completamente prima di installare</span>",
"62": "⬆️ Il pacchetto di installazione della nuova versione è pronto. Quando esci, ti verrà chiesto se installare la nuova versione",
"63": "Recupero in corso, attendere prego...",
"64": "Ci sono [%d] file in totale, ci vorrà del tempo per indicizzare, attendere prego...",
@ -1541,7 +1542,7 @@
"100": "Pulizia dei dati in corso...",
"101": "Promemoria impostato [%s] completato",
"102": "Elaborazione completata",
"103": "Il pacchetto di installazione dell'aggiornamento è stato scaricato automaticamente in background. Uscendo, ti verrà chiesto se installare la nuova versione",
"103": "Il download del pacchetto di installazione dell'aggiornamento è stato avviato automaticamente, il progresso del download verrà visualizzato nella barra inferiore",
"104": "Il pacchetto di installazione dell'aggiornamento non è riuscito a scaricarsi, verifica la connessione di rete",
"105": "Senza titolo",
"106": "La lunghezza massima è limitata a 512 caratteri",

View file

@ -1373,6 +1373,7 @@
"undo": "元に戻す",
"up": "上へ",
"update": "更新",
"updateVersion": "⬆️ 更新",
"insertAsset": "画像またはファイルを挿入",
"uploadError": "アップロードエラー",
"uploading": "アップロード中...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] インデックスを検証しています...",
"59": "同期除外リストの設定に失敗しました",
"60": "更新パッケージの取得に失敗しました: %s",
"61": "⬆️ 新しいバージョンをインストールする準備ができました。今すぐ新しいバージョンをインストールしますか?",
"61": "新しいバージョンをインストールする準備ができました。今すぐ新しいバージョンをインストールしますか?<br><br><span class='ft__on-surface'>ご注意:思源ノートが完全に終了してからインストールしてください</span>",
"62": "⬆️ 新しいバージョンをインストールする準備できました。終了するときに新しいバージョンをインストールするかどうかを確認します",
"63": "復元中です。お待ちください...",
"64": "合計 [%d] 個のファイルがあります。インデックスの作成には時間がかかりますので、しばらくお待ちください...",
@ -1541,7 +1542,7 @@
"100": "データをクリーニングしています...",
"101": "リマインダーの設定が完了しました [%s]",
"102": "処理が完了しました",
"103": "更新インストールパッケージがバックグラウンドで自動的にダウンロードされました。終了時に新バージョンをインストールするかどうかを確認するメッセージが表示されます",
"103": "更新インストールパッケージの自動ダウンロードが開始されました。ダウンロードの進捗は下部バーに表示されます",
"104": "更新インストールパッケージのダウンロードに失敗しました。ネットワーク接続を確認してください",
"105": "タイトルなし",
"106": "最大長は 512 文字に制限されています",

View file

@ -1373,6 +1373,7 @@
"undo": "실행 취소",
"up": "위",
"update": "업데이트",
"updateVersion": "⬆️ 업데이트",
"insertAsset": "이미지 또는 파일 삽입",
"uploadError": "업로드 오류",
"uploading": "업로드 중...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] 인덱스 확인 중...",
"59": "동기화 무시 목록 설정 실패",
"60": "업데이트 패키지 가져오기 실패: %s",
"61": "⬆️ 새 버전 설치 패키지가 준비되었습니다. 지금 새 버전을 설치하시겠습니까?",
"61": "새 버전 설치 패키지가 준비되었습니다. 지금 새 버전을 설치하시겠습니까?<br><br><span class='ft__on-surface'>주의: 시유안이 완전히 종료될 때까지 기다린 후 설치해야 합니다</span>",
"62": "⬆️ 새 버전 설치 패키지가 준비되었습니다. 종료할 때 새 버전 설치 여부를 묻습니다",
"63": "복구 중, 잠시만 기다려 주세요...",
"64": "총 [%d]개의 파일이 있으며 인덱싱하는 데 시간이 걸립니다. 잠시만 기다려 주세요...",
@ -1541,7 +1542,7 @@
"100": "데이터 정리 중...",
"101": "알림 설정 완료 [%s]",
"102": "처리 완료",
"103": "업데이트 설치 패키지가 백그라운드에서 자동으로 다운로드되었습니다. 종료할 때 새 버전 설치 여부를 묻습니다",
"103": "업데이트 설치 패키지 자동 다운로드가 시작되었습니다. 다운로드 진행률은 하단 바에 표시됩니다",
"104": "업데이트 설치 패키지 다운로드 실패, 네트워크 연결을 확인하세요",
"105": "제목 없음",
"106": "최대 길이는 512자로 제한됩니다",

View file

@ -1373,6 +1373,7 @@
"undo": "Cofnij",
"up": "W górę",
"update": "Aktualizuj",
"updateVersion": "⬆️ Aktualizuj",
"insertAsset": "Wstaw obraz lub plik",
"uploadError": "błąd przesyłania",
"uploading": "Przesyłanie...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Weryfikacja indeksu...",
"59": "Nie udało się ustawić listy pomijania synchronizacji",
"60": "Nie udało się uzyskać pakietu aktualizacji: %s",
"61": "⬆️ Instalacja nowego pakietu wersji jest gotowa, czy chcesz teraz zainstalować nową wersję?",
"61": "Instalacja nowego pakietu wersji jest gotowa, czy chcesz teraz zainstalować nową wersję?<br><br><span class='ft__on-surface'>Uwaga: należy poczekać, aż SiYuan całkowicie się zamknie przed instalacją</span>",
"62": "⬆️ Instalacja nowego pakietu wersji jest gotowa. Przy wyjściu zapytasz, czy zainstalować nową wersję",
"63": "Odzyskiwanie, proszę czekać...",
"64": "Całkowita liczba plików wynosi [%d], zajmie trochę czasu na indeksowanie, proszę czekać...",
@ -1541,7 +1542,7 @@
"100": "Czyszczenie danych...",
"101": "Zakończono ustawienie przypomnienia [%s]",
"102": "Przetwarzanie zakończone",
"103": "Pakiet instalacyjny aktualizacji został automatycznie pobrany w tle. Przy wyjściu zostanie zapytane, czy zainstalować nową wersję",
"103": "Pobieranie pakietu instalacyjnego aktualizacji zostało automatycznie uruchomione, postęp pobierania będzie wyświetlany na dolnym pasku",
"104": "Pobranie pakietu instalacyjnego nie powiodło się, proszę sprawdzić połączenie sieciowe",
"105": "Bez tytułu",
"106": "Maksymalna długość jest ograniczona do 512 znaków",

View file

@ -1373,6 +1373,7 @@
"undo": "Desfazer",
"up": "Para cima",
"update": "Atualizar",
"updateVersion": "⬆️ Atualizar",
"insertAsset": "Inserir imagem ou arquivo",
"uploadError": "erro de upload",
"uploading": "Enviando...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Verificando índice...",
"59": "Falha ao definir lista de ignorados de sincronização",
"60": "Falha ao obter o pacote de atualização: %s",
"61": "⬆️ O pacote de instalação da nova versão está pronto, deseja instalar a nova versão agora?",
"61": "O pacote de instalação da nova versão está pronto, deseja instalar a nova versão agora?<br><br><span class='ft__on-surface'>Por favor, note que você precisa aguardar o SiYuan fechar completamente antes de instalar</span>",
"62": "⬆️ O pacote de instalação da nova versão está pronto. Ao sair, você será perguntado se deseja instalar a nova versão",
"63": "Recuperando, por favor aguarde...",
"64": "Há [%d] arquivos no total, levará algum tempo para indexar, por favor aguarde...",
@ -1541,7 +1542,7 @@
"100": "Limpando dados...",
"101": "Lembrete definido [%s]",
"102": "Processamento concluído",
"103": "O pacote de instalação da atualização foi baixado automaticamente em segundo plano. Ao sair, você será perguntado se deseja instalar a nova versão",
"103": "O download do pacote de instalação da atualização foi iniciado automaticamente, o progresso do download será exibido na barra inferior",
"104": "Falha ao baixar o pacote de instalação da atualização, por favor verifique a conexão de rede",
"105": "Sem título",
"106": "Comprimento máximo limitado a 512 caracteres",

View file

@ -1373,6 +1373,7 @@
"undo": "Отменить",
"up": "Вверх",
"update": "Обновить",
"updateVersion": "⬆️ Обновить",
"insertAsset": "Вставить изображение или файл",
"uploadError": "Ошибка закачивания",
"uploading": "Закачивание...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Проверка индекса...",
"59": "Не удалось установить список игнорирования синхронизации",
"60": "Не удалось получить пакет обновления: %s",
"61": "⬆️ Установочный пакет новой версии готов, вы хотите установить новую версию сейчас?",
"61": "Установочный пакет новой версии готов, вы хотите установить новую версию сейчас?<br><br><span class='ft__on-surface'>Обратите внимание, что необходимо дождаться полного завершения работы SiYuan перед установкой</span>",
"62": "⬆️ Установочный пакет новой версии готов. При выходе вас спросят, хотите ли вы установить новую версию",
"63": "Восстановление, пожалуйста, подождите...",
"64": "Всего [%d] файлов, потребуется некоторое время для индексации, пожалуйста, подождите...",
@ -1541,7 +1542,7 @@
"100": "Очистка данных...",
"101": "Задание напоминания завершено [%s]",
"102": "Обработка завершена",
"103": "Установочный пакет обновления был загружен автоматически в фоновом режиме. При выходе вас спросят, хотите ли вы установить новую версию",
"103": "Загрузка установочного пакета обновления была автоматически запущена, прогресс загрузки будет отображаться в нижней панели",
"104": "Не удалось скачать установочный пакет обновления, пожалуйста, проверьте сетевое подключение",
"105": "Без названия",
"106": "Максимальная длина ограничена 512 символами",

View file

@ -1373,6 +1373,7 @@
"undo": "Geri al",
"up": "Yukarı",
"update": "Güncelle",
"updateVersion": "⬆️ Güncelle",
"insertAsset": "Görsel veya dosya ekle",
"uploadError": "Yükleme hatası",
"uploading": "Yükleniyor...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] Dizin doğrulanıyor...",
"59": "Senkronizasyon yok sayma listesi ayarlanamadı",
"60": "Güncelleme paketi alınamadı: %s",
"61": "⬆️ Yeni sürüm paketi hazır, şimdi yüklemek ister misin?",
"61": "Yeni sürüm paketi hazır, şimdi yüklemek ister misin?<br><br><span class='ft__on-surface'>Lütfen dikkat: Kurulumdan önce SiYuan'ın tamamen kapanmasını beklemeniz gerekir</span>",
"62": "⬆️ Yeni sürüm paketi hazır, çıkarken yükleme seçeneği sunulacak",
"63": "Kurtarılıyor, lütfen bekle...",
"64": "Toplam [%d] dosya var, indeksleme biraz sürebilir, lütfen bekle...",
@ -1541,7 +1542,7 @@
"100": "Veri temizleniyor...",
"101": "Hatırlatıcı ayarlandı [%s]",
"102": "İşlem tamamlandı",
"103": "Güncelleme paketi arka planda indirildi. Çıkarken yeni sürüm kurulumu sorulacak",
"103": "Güncelleme paketi indirmesi otomatik olarak başlatıldı, indirme ilerlemesi alt çubukta gösterilecek",
"104": "Güncelleme paketi indirilemedi, ağ bağlantısını kontrol et",
"105": "Başlıksız",
"106": "Maksimum uzunluk 512 karakter ile sınırlı",

View file

@ -1373,6 +1373,7 @@
"undo": "撤銷",
"up": "上",
"update": "更新",
"updateVersion": "⬆️ 更新",
"insertAsset": "插入圖片或檔",
"uploadError": "上傳錯誤",
"uploading": "上傳中...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] 正在校驗索引...",
"59": "設置同步忽略列表失敗",
"60": "獲取更新檔失敗:%s",
"61": "⬆️ 新版本安裝檔已經準備就緒,是否現在安裝新版本?",
"61": "新版本安裝檔已經準備就緒,是否現在安裝新版本?<br><br><span class='ft__on-surface'>請注意,需要先等待思源筆記完全退出再進行安裝</span>",
"62": "⬆️ 新版本安裝檔已經準備就緒,退出時將詢問是否安裝新版本",
"63": "正在恢復,請稍等...",
"64": "共有檔 [%d] 個,需要一些時間進行索引,請稍等...",
@ -1541,7 +1542,7 @@
"100": "正在清理資料...",
"101": "設置提醒完畢 [%s]",
"102": "處理完畢",
"103": "已經在後台開始自動下載更新安裝檔,退出時將詢問是否安裝新版本",
"103": "已經自動開始下載更新安裝檔,下載進度將在底欄顯示",
"104": "更新安裝檔下載失敗,請檢查網絡連接",
"105": "未命名",
"106": "最大長度限制為 512 字元",

View file

@ -1373,6 +1373,7 @@
"undo": "撤销",
"up": "上",
"update": "更新",
"updateVersion": "⬆️ 更新",
"insertAsset": "插入图片或文件",
"uploadError": "上传错误",
"uploading": "上传中...",
@ -1499,7 +1500,7 @@
"58": "[%d/%d] 正在校验索引...",
"59": "设置同步忽略列表失败",
"60": "获取更新包失败:%s",
"61": "⬆️ 新版本安装包已经准备就绪,是否现在安装新版本?",
"61": "新版本安装包已经准备就绪,是否现在安装新版本?<br><br><span class='ft__on-surface'>请注意,需要先等待思源笔记完全退出再进行安装</span>",
"62": "⬆️ 新版本安装包已经准备就绪,退出时将询问是否安装新版本",
"63": "正在恢复,请稍等...",
"64": "共有文件 [%d] 个,需要一些时间进行索引,请稍等...",
@ -1541,7 +1542,7 @@
"100": "正在清理数据...",
"101": "设置提醒完毕 [%s]",
"102": "处理完毕",
"103": "已经在后台开始自动下载更新安装包,退出时将询问是否安装新版本",
"103": "已经自动开始下载更新安装包,下载进度将在底栏显示",
"104": "更新安装包下载失败,请检查网络连接",
"105": "未命名",
"106": "最大长度限制为 512 字符",

View file

@ -305,7 +305,6 @@ export const exitSiYuan = async (setCurrentWorkspace = true) => {
window.webkit.messageHandlers.exit.postMessage("");
return;
}
if (isInHarmony()) {
window.JSHarmony.exit();
return;
@ -321,7 +320,7 @@ export const exitSiYuan = async (setCurrentWorkspace = true) => {
ipcRenderer.send(Constants.SIYUAN_SHOW_WINDOW);
}
confirmDialog(window.siyuan.languages.tip, response.msg, () => {
confirmDialog(window.siyuan.languages.updateVersion, response.msg, () => {
fetchPost("/api/system/exit", {
force: true,
setCurrentWorkspace,

File diff suppressed because one or more lines are too long

View file

@ -79,7 +79,7 @@ func setConfSnippet(c *gin.Context) {
model.Conf.Save()
ret.Data = snippet
util.BroadcastByType("main", "setSnippet", 0, "", snippet)
model.PushReloadSnippet(snippet)
}
func addVirtualBlockRefExclude(c *gin.Context) {

View file

@ -8,7 +8,7 @@ require (
github.com/88250/epub v0.0.0-20230830085737-c19055cd1f48
github.com/88250/go-humanize v0.0.0-20240424102817-4f78fac47ea7
github.com/88250/gulu v1.2.3-0.20251208021445-f93f2666eaac
github.com/88250/lute v1.7.7-0.20251230035220-bc8ebaa605a4
github.com/88250/lute v1.7.7-0.20260103021733-9fd554ae3f44
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1
github.com/ClarkThan/ahocorasick v0.0.0-20231011042242-30d1ef1347f4
github.com/ConradIrwin/font v0.2.1

View file

@ -14,8 +14,8 @@ github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950 h1:Pa5hMiBceT
github.com/88250/go-sqlite3 v1.14.13-0.20231214121541-e7f54c482950/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/88250/gulu v1.2.3-0.20251208021445-f93f2666eaac h1:EC80pY8zyR0gbL8ZLIBB4IPG/ia3ZHScrR/xt8zU8qU=
github.com/88250/gulu v1.2.3-0.20251208021445-f93f2666eaac/go.mod h1:IQ5dXW9CjVmx6B7OfK1Y4ZBKTPMe9q1AkVoLGGzRbS8=
github.com/88250/lute v1.7.7-0.20251230035220-bc8ebaa605a4 h1:t9gV+5keET8FsUuXzoYigXVMgB429iG3TEzfNQDREPo=
github.com/88250/lute v1.7.7-0.20251230035220-bc8ebaa605a4/go.mod h1:WYyUw//5yVw9BJnoVjx7rI/3szsISxNZCYGOqTIrV0o=
github.com/88250/lute v1.7.7-0.20260103021733-9fd554ae3f44 h1:ax+JaNRNpyH3MnisUepYgw5Eid/YdB7oqAmbptHwIBk=
github.com/88250/lute v1.7.7-0.20260103021733-9fd554ae3f44/go.mod h1:WYyUw//5yVw9BJnoVjx7rI/3szsISxNZCYGOqTIrV0o=
github.com/88250/pdfcpu v0.3.14-0.20250424122812-f10e8d9d8d46 h1:Bq1JsDfVbHKUxNL/B2JXd8cC/1h6aFjrlXpGycnh0Hk=
github.com/88250/pdfcpu v0.3.14-0.20250424122812-f10e8d9d8d46/go.mod h1:fVfOloBzs2+W2VJCCbq60XIxc3yJHAZ0Gahv1oO0gyI=
github.com/88250/vitess-sqlparser v0.0.0-20210205111146-56a2ded2aba1 h1:48T899JQDwyyRu9yXHePYlPdHtpJfrJEUGBMH3SMBWY=

View file

@ -272,9 +272,6 @@ func refreshCheckDownloadInstallPkg() {
time.Sleep(3 * time.Minute)
checkDownloadInstallPkg()
if "" != getNewVerInstallPkgPath() {
util.PushMsg(Conf.Language(62), 15*1000)
}
}
func refreshAnnouncement() {

View file

@ -711,6 +711,7 @@ func Close(force, setCurrentWorkspace bool, execInstallPkg int) (exitCode int) {
util.IsExiting.Store(true)
waitSecondForExecInstallPkg := false
newVerInstallPkgPath := getNewVerInstallPkgPath()
if !skipNewVerInstallPkg() && "" != newVerInstallPkgPath {
if 2 == execInstallPkg || (force && 0 == execInstallPkg) { // 执行新版本安装
waitSecondForExecInstallPkg = true

View file

@ -31,6 +31,7 @@ import (
"github.com/emirpasic/gods/sets/hashset"
"github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/av"
"github.com/siyuan-note/siyuan/kernel/conf"
"github.com/siyuan-note/siyuan/kernel/filesys"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/task"
@ -38,6 +39,10 @@ import (
"github.com/siyuan-note/siyuan/kernel/util"
)
func PushReloadSnippet(snippet *conf.Snpt) {
util.BroadcastByType("main", "setSnippet", 0, "", snippet)
}
func PushReloadPlugin(upsertCodePluginSet, upsertDataPluginSet, unloadPluginNameSet, uninstallPluginNameSet *hashset.Set, excludeApp string) {
// 集合去重
if nil != uninstallPluginNameSet {

View file

@ -1595,7 +1595,7 @@ func processSyncMergeResult(exit, byHand bool, mergeResult *dejavu.MergeResult,
var upserts, removes []string
var upsertTrees int
// 可能需要重新加载部分功能
var needReloadFlashcard, needReloadOcrTexts, needReloadPlugin bool
var needReloadFlashcard, needReloadOcrTexts, needReloadPlugin, needReloadSnippet bool
upsertCodePluginSet := hashset.New() // 插件代码变更 data/plugins/
upsertDataPluginSet := hashset.New() // 插件存储数据变更 data/storage/petal/
needUnindexBoxes, needIndexBoxes := map[string]bool{}, map[string]bool{}
@ -1640,6 +1640,10 @@ func processSyncMergeResult(exit, byHand bool, mergeResult *dejavu.MergeResult,
absPath := filepath.Join(util.DataDir, file.Path)
HandleAssetsChangeEvent(absPath)
}
if file.Path == "/snippets/conf.json" {
needReloadSnippet = true
}
}
removeWidgetDirSet, unloadPluginSet, uninstallPluginSet := hashset.New(), hashset.New(), hashset.New()
@ -1686,6 +1690,10 @@ func processSyncMergeResult(exit, byHand bool, mergeResult *dejavu.MergeResult,
absPath := filepath.Join(util.DataDir, file.Path)
HandleAssetsRemoveEvent(absPath)
}
if file.Path == "/snippets/conf.json" {
needReloadSnippet = true
}
}
for _, upsertPetal := range mergeResult.UpsertPetals {
@ -1710,6 +1718,10 @@ func processSyncMergeResult(exit, byHand bool, mergeResult *dejavu.MergeResult,
PushReloadPlugin(upsertCodePluginSet, upsertDataPluginSet, unloadPluginSet, uninstallPluginSet, "")
}
if needReloadSnippet {
PushReloadSnippet(Conf.Snippet)
}
for _, widgetDir := range removeWidgetDirSet.Values() {
widgetDirPath := filepath.Join(util.DataDir, "widgets", widgetDir.(string))
gulu.File.RemoveEmptyDirs(widgetDirPath)

View file

@ -26,7 +26,6 @@ import (
"path"
"path/filepath"
"runtime"
"strconv"
"strings"
"sync"
"time"
@ -35,6 +34,7 @@ import (
"github.com/imroc/req/v3"
"github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/util"
"golang.org/x/mod/semver"
)
func execNewVerInstallPkg(newVerInstallPkgPath string) {
@ -45,6 +45,9 @@ func execNewVerInstallPkg(newVerInstallPkgPath string) {
} else if gulu.OS.IsDarwin() {
exec.Command("chmod", "+x", newVerInstallPkgPath).CombinedOutput()
cmd = exec.Command("open", newVerInstallPkgPath)
} else {
logging.LogErrorf("unsupported platform for auto-installing package")
return
}
gulu.CmdAttr(cmd)
cmdErr := cmd.Run()
@ -54,28 +57,23 @@ func execNewVerInstallPkg(newVerInstallPkgPath string) {
}
}
var newVerInstallPkgPath string
func getNewVerInstallPkgPath() string {
if skipNewVerInstallPkg() {
newVerInstallPkgPath = ""
return ""
}
downloadPkgURLs, checksum, err := getUpdatePkg()
if err != nil || 1 > len(downloadPkgURLs) || "" == checksum {
newVerInstallPkgPath = ""
if err != nil {
return ""
}
pkg := path.Base(downloadPkgURLs[0])
newVerInstallPkgPath = filepath.Join(util.TempDir, "install", pkg)
localChecksum, _ := sha256Hash(newVerInstallPkgPath)
pkgPath := filepath.Join(util.TempDir, "install", pkg)
localChecksum, _ := sha256Hash(pkgPath)
if checksum != localChecksum {
newVerInstallPkgPath = ""
return ""
}
return newVerInstallPkgPath
return pkgPath
}
var checkDownloadInstallPkgLock = sync.Mutex{}
@ -93,22 +91,30 @@ func checkDownloadInstallPkg() {
defer checkDownloadInstallPkgLock.Unlock()
downloadPkgURLs, checksum, err := getUpdatePkg()
if err != nil || 1 > len(downloadPkgURLs) || "" == checksum {
if err != nil {
return
}
msgId := util.PushMsg(Conf.Language(103), 1000*7)
succ := false
existingPkgPath := getNewVerInstallPkgPath()
if "" != existingPkgPath {
// 存在经过 sha256Hash 检查的安装包
util.PushUpdateMsg("update-pkg-ready", Conf.Language(62), 15*1000)
return
}
util.PushUpdateMsg("update-pkg-downloading", Conf.Language(103), 1000*7)
success := false
for _, downloadPkgURL := range downloadPkgURLs {
err = downloadInstallPkg(downloadPkgURL, checksum)
if err == nil {
succ = true
success = true
break
}
}
if !succ {
util.PushUpdateMsg(msgId, Conf.Language(104), 7000)
if success {
util.PushUpdateMsg("update-pkg-ready", Conf.Language(62), 15*1000)
} else {
util.PushUpdateMsg("update-pkg-downloading", Conf.Language(104), 7000)
}
}
@ -121,6 +127,7 @@ func getUpdatePkg() (downloadPkgURLs []string, checksum string, err error) {
ver := result["ver"].(string)
if isVersionUpToDate(ver) {
err = fmt.Errorf("version is up to date")
return
}
@ -158,6 +165,11 @@ func getUpdatePkg() (downloadPkgURLs []string, checksum string, err error) {
checksums := result["checksums"].(map[string]interface{})
checksum = checksums[pkg].(string)
if "" == checksum {
err = fmt.Errorf("checksum is empty")
return
}
return
}
@ -277,88 +289,42 @@ func CheckUpdate(showMsg bool) {
releaseLang = releaseLangArg.(string)
}
var msg string
var timeout int
if isVersionUpToDate(ver) {
msg = Conf.Language(10)
timeout = 3000
util.PushUpdateMsg("update-notify", Conf.Language(10), 3000)
} else {
msg = fmt.Sprintf(Conf.Language(9), "<a href=\""+releaseLang+"\">"+releaseLang+"</a>")
showMsg = true
timeout = 15000
}
if showMsg {
util.PushMsg(msg, timeout)
go func() {
defer logging.Recover()
checkDownloadInstallPkg()
if "" != getNewVerInstallPkgPath() {
util.PushMsg(Conf.Language(62), 15*1000)
}
}()
util.PushUpdateMsg("update-notify", fmt.Sprintf(Conf.Language(9), "<a href=\""+releaseLang+"\">"+releaseLang+"</a>"), 15000)
}
go func() {
defer logging.Recover()
checkDownloadInstallPkg()
}()
}
func isVersionUpToDate(releaseVer string) bool {
return ver2num(releaseVer) <= ver2num(util.Ver)
return semver.Compare("v"+releaseVer, "v"+util.Ver) <= 0
}
// skipInstallPkgPlatformCached 缓存平台相关判断,-1 未初始化0 表示不跳过1 表示跳过
var skipInstallPkgPlatformCached = -1
func skipNewVerInstallPkg() bool {
if !gulu.OS.IsWindows() && !gulu.OS.IsDarwin() {
return true
}
if util.ISMicrosoftStore || util.ContainerStd != util.Container {
return true
}
if !Conf.System.DownloadInstallPkg {
return true
}
if gulu.OS.IsWindows() {
plat := strings.ToLower(Conf.System.OSPlatform)
// Windows 7, 8 and Server 2012 are no longer supported https://github.com/siyuan-note/siyuan/issues/7347
if strings.Contains(plat, " 7 ") || strings.Contains(plat, " 8 ") || strings.Contains(plat, "2012") {
return true
if skipInstallPkgPlatformCached == -1 {
skipInstallPkgPlatformCached = 0
if !gulu.OS.IsWindows() && !gulu.OS.IsDarwin() {
skipInstallPkgPlatformCached = 1
} else if util.ISMicrosoftStore || util.ContainerStd != util.Container {
skipInstallPkgPlatformCached = 1
} else if gulu.OS.IsWindows() {
plat := strings.ToLower(Conf.System.OSPlatform)
// Windows 7, 8 and Server 2012 are no longer supported https://github.com/siyuan-note/siyuan/issues/7347
if strings.Contains(plat, " 7 ") || strings.Contains(plat, " 8 ") || strings.Contains(plat, "2012") {
skipInstallPkgPlatformCached = 1
}
}
}
if skipInstallPkgPlatformCached == 1 || !Conf.System.DownloadInstallPkg {
return true
}
return false
}
func ver2num(a string) int {
var version string
var suffixpos int
var suffixStr string
var suffix string
a = strings.Trim(a, " ")
if strings.Contains(a, "alpha") {
suffixpos = strings.Index(a, "-alpha")
version = a[0:suffixpos]
suffixStr = a[suffixpos+6 : len(a)]
suffix = "0" + fmt.Sprintf("%03s", suffixStr)
} else if strings.Contains(a, "beta") {
suffixpos = strings.Index(a, "-beta")
version = a[0:suffixpos]
suffixStr = a[suffixpos+5 : len(a)]
suffix = "1" + fmt.Sprintf("%03s", suffixStr)
} else {
version = a
suffix = "5000"
}
split := strings.Split(version, ".")
var verArr []string
verArr = append(verArr, "1")
var tmp string
for i := 0; i < 3; i++ {
if i < len(split) {
tmp = split[i]
} else {
tmp = "0"
}
verArr = append(verArr, fmt.Sprintf("%04s", tmp))
}
verArr = append(verArr, suffix)
ver := strings.Join(verArr, "")
verNum, _ := strconv.Atoi(ver)
return verNum
}