diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index 4721efc41..499682f13 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -764,7 +764,7 @@
"8": "Check update failed",
"9": "A new version is available, please browse the release announcement %s",
"10": "Is the latest version",
- "11": "TODO",
+ "11": "\uD83D\uDCE2 系統公告:%s",
"12": "Query asset failed [%s]",
"13": "Cannot create a file starting with .",
"14": "Export failed: %s",
@@ -789,7 +789,7 @@
"33": "Insufficient permissions to read and write files or access to the network, please check the permissions of the workspace folder and the settings of the anti-virus software/firewall. If you have run SiYuan as an administrator before, please consider switching to a new workspace directory, and do not run it as an administrator in the future (the current workspace directory may no longer be accessible by ordinary users)",
"34": "This operation is not supported in read-only mode",
"35": "Rebuilding index, please wait...",
- "36": "Please check the version update in the app store",
+ "36": "TODO",
"37": "Do not include spaces and special symbols in the name of the cloud sync directory",
"38": "The number of mentioned keywords [%d] is too many, currently only supports up to [512] keywords",
"39": "TODO",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index b47f1d367..cf4a6a5a9 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -764,7 +764,7 @@
"8": "Comprobar la actualización falló",
"9": "Una nueva versión está disponible, por favor, busque el anuncio de lanzamiento %s",
"10": "Es la última versión",
- "11": "TODO",
+ "11": "\uD83D\uDCE2 Anuncio del sistema: %s",
"12": "Fallo en la consulta de activos [%s]",
"13": "No se puede crear un archivo que empiece por .",
"14": "Exportación fallida: %s",
@@ -789,7 +789,7 @@
"33": "Permisos insuficientes para leer y escribir archivos o acceso a la red, por favor comprueba los permisos de la carpeta del espacio de trabajo y la configuración del software antivirus/firewall. Si has ejecutado SiYuan como administrador antes, por favor considera cambiar a un nuevo directorio de espacio de trabajo, y no lo ejecutes como administrador en el futuro (el directorio de espacio de trabajo actual puede que ya no sea accesible por los usuarios ordinarios)",
"34": "Esta operación no es compatible con el modo de sólo lectura",
"35": "Reconstruyendo el índice, por favor espere...",
- "36": "Por favor, comprueba la actualización de la versión en la tienda de aplicaciones",
+ "36": "TODO",
"37": "No incluyas espacios ni símbolos especiales en el nombre del directorio de sincronización con la nube",
"38": "El número de palabras clave mencionadas [%d] son demasiados, actualmente solo admite hasta [512] palabras clave",
"39": "TODO",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index ff6da4a64..714d064e7 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -764,7 +764,7 @@
"8": "La vérification de la mise à jour a échoué",
"9": "Une nouvelle version est disponible, veuillez consulter l'annonce de la version %s",
"10": "C'est la dernière version",
- "11": "TODO",
+ "11": "\uD83D\uDCE2 Annonce système : %s",
"12": "Échec de la requête asset [%s]",
"13": "Impossible de créer un fichier commençant par .",
"14": "L'exportation a échoué : %s",
@@ -789,7 +789,7 @@
"33": "Autorisations insuffisantes pour lire et écrire des fichiers ou accéder au réseau, veuillez vérifier les autorisations du dossier de l'espace de travail et les paramètres du logiciel anti-virus/pare-feu. Si vous avez déjà exécuté SiYuan en tant qu'administrateur, envisagez de passer à un nouveau répertoire d'espace de travail et ne l'exécutez plus en tant qu'administrateur à l'avenir (le répertoire d'espace de travail actuel peut ne plus être accessible aux utilisateurs ordinaires) ",
"34": "Cette opération n'est pas supportée en mode lecture seule.",
"35": "Recréation de l'index, veuillez patienter...",
- "36": "Veuillez vérifier la mise à jour de la version dans l'App Store",
+ "36": "TODO",
"37": "N'incluez pas d'espaces et de symboles spéciaux dans le nom du répertoire de synchronisation cloud",
"38": "Le nombre de mots-clés mentionnés [%d] est trop élevé, ne prend actuellement en charge que jusqu'à [512] mots-clés",
"39": "TODO",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index c6e2d8188..dc845914b 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -764,7 +764,7 @@
"8": "檢查更新失敗",
"9": "有新版本可用,請瀏覽發佈公告 %s",
"10": "已是最新版",
- "11": "TODO",
+ "11": "\uD83D\uDCE2 系統公告:%s",
"12": "查詢資料檔失敗 [%s]",
"13": "無法創建 . 開頭的文件",
"14": "匯出失敗:%s",
@@ -789,7 +789,7 @@
"33": "讀寫檔或存取網路權限不足,請檢查工作空間資料夾權限和防毒軟體/防火牆的設置。如果你曾經使用管理員身份運行過思源,請考慮切換到新的工作空間目錄,後續請勿使用管理員身份運行(當前的工作空間目錄可能已經無法使用普通用戶存取)",
"34": "唯讀模式下不支援該操作",
"35": "正在重建索引,請稍等...",
- "36": "請在應用商店中檢查版本更新",
+ "36": "TODO",
"37": "雲端同步目錄的名稱請勿包含空格和特殊符號",
"38": "提及關鍵字數量 [%d] 過多,目前最多僅支援搜索 [512] 個關鍵字",
"39": "TODO",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index f3cf1eecd..cbb49ef51 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -765,7 +765,7 @@
"8": "检查更新失败",
"9": "有新版本可用,请浏览发布公告 %s",
"10": "已是最新版",
- "11": "TODO",
+ "11": "\uD83D\uDCE2 系统公告:%s",
"12": "查询资源文件失败 [%s]",
"13": "无法创建 . 开头的文件",
"14": "导出失败:%s",
@@ -790,7 +790,7 @@
"33": "读写文件或访问网络权限不足,请检查工作空间文件夹权限和杀毒软件/防火墙的设置。如果你曾经使用管理员身份运行过思源,请考虑切换到新的工作空间目录,后续请勿使用管理员身份运行(当前的工作空间目录可能已经无法使用普通用户访问)",
"34": "只读模式下不支持该操作",
"35": "正在重建索引,请稍等...",
- "36": "请在应用商店中检查版本更新",
+ "36": "TODO",
"37": "云端同步目录的名称请勿包含空格和特殊符号",
"38": "提及关键字数量 [%d] 过多,目前最多仅支持搜索 [512] 个关键字",
"39": "TODO",
diff --git a/kernel/model/liandi.go b/kernel/model/liandi.go
index d38332933..ccc6f3740 100644
--- a/kernel/model/liandi.go
+++ b/kernel/model/liandi.go
@@ -21,6 +21,8 @@ import (
"errors"
"fmt"
"net/http"
+ "os"
+ "path/filepath"
"strconv"
"strings"
"time"
@@ -150,6 +152,8 @@ func AutoRefreshUser() {
if !subscriptionExpirationReminded {
subscriptionExpirationReminded = true
go func() {
+ defer util.Recover()
+
if "ios" == util.Container {
return
}
@@ -170,13 +174,65 @@ func AutoRefreshUser() {
}()
}
- if nil != Conf.User {
- time.Sleep(3 * time.Minute)
+ go func() {
+ defer util.Recover()
+
if nil != Conf.User {
- RefreshUser(Conf.User.UserToken)
+ time.Sleep(3 * time.Minute)
+ if nil != Conf.User {
+ RefreshUser(Conf.User.UserToken)
+ }
+ subscriptionExpirationReminded = false
}
- subscriptionExpirationReminded = false
- }
+ }()
+
+ go func() {
+ defer util.Recover()
+
+ time.Sleep(1 * time.Minute)
+ announcementConf := filepath.Join(util.HomeDir, ".config", "siyuan", "announcement.json")
+ var existingAnnouncements, newAnnouncements []*Announcement
+ if gulu.File.IsExist(announcementConf) {
+ data, err := os.ReadFile(announcementConf)
+ if nil != err {
+ util.LogErrorf("read announcement conf failed: %s", err)
+ return
+ }
+ if err = gulu.JSON.UnmarshalJSON(data, &existingAnnouncements); nil != err {
+ util.LogErrorf("unmarshal announcement conf failed: %s", err)
+ return
+ }
+ }
+
+ for _, announcement := range GetAnnouncements() {
+ var exist bool
+ for _, existingAnnouncement := range existingAnnouncements {
+ if announcement.Id == existingAnnouncement.Id {
+ exist = true
+ break
+ }
+ }
+ if !exist {
+ existingAnnouncements = append(existingAnnouncements, announcement)
+ newAnnouncements = append(newAnnouncements, announcement)
+ }
+ }
+
+ data, err := gulu.JSON.MarshalJSON(existingAnnouncements)
+ if nil != err {
+ util.LogErrorf("marshal announcement conf failed: %s", err)
+ return
+ }
+ if err = os.WriteFile(announcementConf, data, 0644); nil != err {
+ util.LogErrorf("write announcement conf failed: %s", err)
+ return
+ }
+
+ for _, newAnnouncement := range newAnnouncements {
+ util.PushMsg(fmt.Sprintf(Conf.Language(11), newAnnouncement.URL, newAnnouncement.Title), 0)
+ }
+ }()
+
<-refreshUserTicker.C
}
}
diff --git a/kernel/model/updater.go b/kernel/model/updater.go
index 9ccb5eb35..e113dc1ff 100644
--- a/kernel/model/updater.go
+++ b/kernel/model/updater.go
@@ -27,15 +27,33 @@ var (
checkUpdateLock = &sync.Mutex{}
)
-func CheckUpdate(showMsg bool) {
- if !showMsg {
+type Announcement struct {
+ Id string `json:"id"`
+ Title string `json:"title"`
+ URL string `json:"url"`
+}
+
+func GetAnnouncements() (ret []*Announcement) {
+ result, err := util.GetRhyResult(false)
+ if nil != err {
+ util.LogErrorf("get ")
return
}
- if "ios" == util.Container {
- if showMsg {
- util.PushMsg(Conf.Language(36), 5000)
- }
+ announcements := result["announcement"].([]interface{})
+ for _, announcement := range announcements {
+ ann := announcement.(map[string]interface{})
+ ret = append(ret, &Announcement{
+ Id: ann["id"].(string),
+ Title: ann["title"].(string),
+ URL: ann["url"].(string),
+ })
+ }
+ return
+}
+
+func CheckUpdate(showMsg bool) {
+ if !showMsg {
return
}
diff --git a/kernel/util/rhy.go b/kernel/util/rhy.go
index de96d8933..9242cae7a 100644
--- a/kernel/util/rhy.go
+++ b/kernel/util/rhy.go
@@ -39,7 +39,7 @@ func GetRhyResult(force bool) (map[string]interface{}, error) {
request := httpclient.NewCloudRequest()
_, err := request.SetResult(&cachedRhyResult).Get(AliyunServer + "/apis/siyuan/version?ver=" + Ver)
if nil != err {
- LogErrorf("get version meta info failed: %s", err)
+ LogErrorf("get version info failed: %s", err)
return nil, err
}
rhyResultCacheTime = now