Bläddra i källkod

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

Vanessa 7 månader sedan
förälder
incheckning
590b088f69

+ 7 - 1
.github/CONTRIBUTING.md

@@ -58,4 +58,10 @@ Note: In the development environment, the kernel process will not be automatical
 * `gomobile bind --tags fts5 -ldflags '-s -w' -v -o kernel.aar -target='android/arm64' -androidapi 24 ./mobile/`
 * `gomobile bind --tags fts5 -ldflags '-s -w' -v -o kernel.aar -target='android/arm64' -androidapi 24 ./mobile/`
 * https://github.com/siyuan-note/siyuan-android
 * https://github.com/siyuan-note/siyuan-android
 
 
-For the mobile-end, please refer to the corresponding project repository.
+### Harmony
+
+Only support compilation under Linux, need to install Harmony SDK, and need to modify Go source code, please refer to https://github.com/siyuan-note/siyuan/issues/13184
+
+* `cd kernel/harmony`
+* `./build.sh` (`./build-win.sh` for Windows Emulator)
+* https://github.com/siyuan-note/siyuan-harmony

+ 7 - 1
.github/CONTRIBUTING_zh_CN.md

@@ -60,4 +60,10 @@ NPM 镜像:
 * `gomobile bind --tags fts5 -ldflags '-s -w' -v -o kernel.aar -target='android/arm64' -androidapi 24 ./mobile/`
 * `gomobile bind --tags fts5 -ldflags '-s -w' -v -o kernel.aar -target='android/arm64' -androidapi 24 ./mobile/`
 * https://github.com/siyuan-note/siyuan-android
 * https://github.com/siyuan-note/siyuan-android
 
 
-移动端请参考对应项目仓库。
+### Harmony
+
+仅支持在 Linux 下编译,需要安装鸿蒙 SDK,并且需要修改 Go 源码,详情请参考 https://github.com/siyuan-note/siyuan/issues/13184
+
+* `cd kernel/harmony`
+* `./build.sh` (Windows 模拟器使用 `./build-win.sh`)
+* https://github.com/siyuan-note/siyuan-harmony

+ 3 - 1
README.md

@@ -100,7 +100,7 @@ Most features are free, even for commercial use.
 * Multi-tab, drag and drop to split screen
 * Multi-tab, drag and drop to split screen
 * Template snippet
 * Template snippet
 * JavaScript/CSS snippet
 * JavaScript/CSS snippet
-* Android/iOS App
+* Android/iOS/HarmonyOS App
 * Docker deployment
 * Docker deployment
 * [API](https://github.com/siyuan-note/siyuan/blob/master/API.md)
 * [API](https://github.com/siyuan-note/siyuan/blob/master/API.md)
 * Community marketplace
 * Community marketplace
@@ -120,6 +120,7 @@ Some features are only available to paid members, for more details please refer
 | [petal](https://github.com/siyuan-note/petal)            | Plugin API            | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
 | [petal](https://github.com/siyuan-note/petal)            | Plugin API            | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
 | [android](https://github.com/siyuan-note/siyuan-android) | Android App           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
 | [android](https://github.com/siyuan-note/siyuan-android) | Android App           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
 | [ios](https://github.com/siyuan-note/siyuan-ios)         | iOS App               | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
 | [ios](https://github.com/siyuan-note/siyuan-ios)         | iOS App               | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
+| [harmony](https://github.com/siyuan-note/siyuan-harmony) | HarmonyOS App         | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-harmony) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-harmony) |
 | [riff](https://github.com/siyuan-note/riff)              | Spaced repetition     | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
 | [riff](https://github.com/siyuan-note/riff)              | Spaced repetition     | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
 
 
 ## 🌟 Star History
 ## 🌟 Star History
@@ -346,6 +347,7 @@ SiYuan is completely open source, and contributions are welcome:
 * [User Interface and Kernel](https://github.com/siyuan-note/siyuan)
 * [User Interface and Kernel](https://github.com/siyuan-note/siyuan)
 * [Android](https://github.com/siyuan-note/siyuan-android)
 * [Android](https://github.com/siyuan-note/siyuan-android)
 * [iOS](https://github.com/siyuan-note/siyuan-ios)
 * [iOS](https://github.com/siyuan-note/siyuan-ios)
+* [HarmonyOS](https://github.com/siyuan-note/siyuan-harmony)
 * [Chrome Clipping Extension](https://github.com/siyuan-note/siyuan-chrome)
 * [Chrome Clipping Extension](https://github.com/siyuan-note/siyuan-chrome)
 
 
 For more details, please refer to [Development Guide](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md).
 For more details, please refer to [Development Guide](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md).

+ 12 - 10
README_ja_JP.md

@@ -99,7 +99,7 @@ SiYuanは、プライバシーを最優先とする個人の知識管理シス
 * マルチタブ、ドラッグアンドドロップで分割画面
 * マルチタブ、ドラッグアンドドロップで分割画面
 * テンプレートスニペット
 * テンプレートスニペット
 * JavaScript/CSSスニペット
 * JavaScript/CSSスニペット
-* Android/iOSアプリ
+* Android/iOS/HarmonyOSアプリ
 * Dockerデプロイメント
 * Dockerデプロイメント
 * [API](https://github.com/siyuan-note/siyuan/blob/master/API.md)
 * [API](https://github.com/siyuan-note/siyuan/blob/master/API.md)
 * コミュニティマーケットプレイス
 * コミュニティマーケットプレイス
@@ -110,16 +110,17 @@ SiYuanは、プライバシーを最優先とする個人の知識管理シス
 
 
 ![SiYuan Arch](https://b3logfile.com/file/2023/05/SiYuan_Arch-Sgu8vXT.png "SiYuan Arch")
 ![SiYuan Arch](https://b3logfile.com/file/2023/05/SiYuan_Arch-Sgu8vXT.png "SiYuan Arch")
 
 
-| プロジェクト                                                  | 説明           | フォーク                                                                           | スター                                                                                | 
-|----------------------------------------------------------|-----------------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
-| [lute](https://github.com/88250/lute)                    | エディタエンジン         | ![GitHub forks](https://img.shields.io/github/forks/88250/lute)                 | ![GitHub Repo stars](https://img.shields.io/github/stars/88250/lute)                 |
-| [chrome](https://github.com/siyuan-note/siyuan-chrome)   | Chrome/Edge拡張 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-chrome)  | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-chrome)  |
+| プロジェクト                                                   | 説明              | フォーク                                                                           | スター                                                                                | 
+|----------------------------------------------------------|-----------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
+| [lute](https://github.com/88250/lute)                    | エディタエンジン        | ![GitHub forks](https://img.shields.io/github/forks/88250/lute)                 | ![GitHub Repo stars](https://img.shields.io/github/stars/88250/lute)                 |
+| [chrome](https://github.com/siyuan-note/siyuan-chrome)   | Chrome/Edge拡張   | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-chrome)  | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-chrome)  |
 | [bazaar](https://github.com/siyuan-note/bazaar)          | コミュニティマーケットプレイス | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar)         |
 | [bazaar](https://github.com/siyuan-note/bazaar)          | コミュニティマーケットプレイス | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar)         |
-| [dejavu](https://github.com/siyuan-note/dejavu)          | データリポジトリ             | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu)         |
-| [petal](https://github.com/siyuan-note/petal)            | プラグインAPI            | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
-| [android](https://github.com/siyuan-note/siyuan-android) | Androidアプリ           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
-| [ios](https://github.com/siyuan-note/siyuan-ios)         | iOSアプリ               | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
-| [riff](https://github.com/siyuan-note/riff)              | 間隔反復     | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
+| [dejavu](https://github.com/siyuan-note/dejavu)          | データリポジトリ        | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu)         |
+| [petal](https://github.com/siyuan-note/petal)            | プラグインAPI        | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
+| [android](https://github.com/siyuan-note/siyuan-android) | Androidアプリ      | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
+| [ios](https://github.com/siyuan-note/siyuan-ios)         | iOSアプリ          | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
+| [harmony](https://github.com/siyuan-note/siyuan-harmony)     | HarmonyOSアプリ    | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-harmony)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-harmony)     |
+| [riff](https://github.com/siyuan-note/riff)              | 間隔反復            | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
 
 
 ## 🌟 スター履歴
 ## 🌟 スター履歴
 
 
@@ -345,6 +346,7 @@ SiYuanは完全にオープンソースであり、貢献を歓迎します:
 * [ユーザーインターフェースとカーネル](https://github.com/siyuan-note/siyuan)
 * [ユーザーインターフェースとカーネル](https://github.com/siyuan-note/siyuan)
 * [Android](https://github.com/siyuan-note/siyuan-android)
 * [Android](https://github.com/siyuan-note/siyuan-android)
 * [iOS](https://github.com/siyuan-note/siyuan-ios)
 * [iOS](https://github.com/siyuan-note/siyuan-ios)
+* [harmony](https://github.com/siyuan-note/siyuan-harmony)
 * [Chromeクリッピング拡張](https://github.com/siyuan-note/siyuan-chrome)
 * [Chromeクリッピング拡張](https://github.com/siyuan-note/siyuan-chrome)
 
 
 詳細については[開発ガイド](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md)をご覧ください。
 詳細については[開発ガイド](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING.md)をご覧ください。

+ 12 - 10
README_zh_CN.md

@@ -101,7 +101,7 @@
 * Tesseract OCR
 * Tesseract OCR
 * 模板片段
 * 模板片段
 * JavaScript/CSS 代码片段
 * JavaScript/CSS 代码片段
-* Android/iOS App
+* Android/iOS/鸿蒙 App
 * Docker 部署
 * Docker 部署
 * [API](API_zh_CN.md)
 * [API](API_zh_CN.md)
 * 社区集市
 * 社区集市
@@ -112,16 +112,17 @@
 
 
 ![思源笔记架构设计](https://b3logfile.com/file/2023/05/SiYuan_Arch-Sgu8vXT.png "思源笔记架构设计")
 ![思源笔记架构设计](https://b3logfile.com/file/2023/05/SiYuan_Arch-Sgu8vXT.png "思源笔记架构设计")
 
 
-| Project                                                  | Description    | Forks                                                                           | Stars                                                                                | 
-|----------------------------------------------------------|----------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
-| [lute](https://github.com/88250/lute)                    | 编辑器引擎          | ![GitHub forks](https://img.shields.io/github/forks/88250/lute)                 | ![GitHub Repo stars](https://img.shields.io/github/stars/88250/lute)                 |
+| Project                                                  | Description  | Forks                                                                           | Stars                                                                                | 
+|----------------------------------------------------------|--------------|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
+| [lute](https://github.com/88250/lute)                    | 编辑器引擎        | ![GitHub forks](https://img.shields.io/github/forks/88250/lute)                 | ![GitHub Repo stars](https://img.shields.io/github/stars/88250/lute)                 |
 | [chrome](https://github.com/siyuan-note/siyuan-chrome)   | Chrome/Edge 扩展 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-chrome)  | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-chrome)  |
 | [chrome](https://github.com/siyuan-note/siyuan-chrome)   | Chrome/Edge 扩展 | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-chrome)  | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-chrome)  |
-| [bazaar](https://github.com/siyuan-note/bazaar)          | 社区集市           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar)         |
-| [dejavu](https://github.com/siyuan-note/dejavu)          | 数据仓库           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu)         |
-| [petal](https://github.com/siyuan-note/petal)            | 插件 API         | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
-| [android](https://github.com/siyuan-note/siyuan-android) | Android App    | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
-| [ios](https://github.com/siyuan-note/siyuan-ios)         | iOS App        | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
-| [riff](https://github.com/siyuan-note/riff)              | 间隔重复           | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
+| [bazaar](https://github.com/siyuan-note/bazaar)          | 社区集市         | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/bazaar)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/bazaar)         |
+| [dejavu](https://github.com/siyuan-note/dejavu)          | 数据仓库         | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/dejavu)         | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/dejavu)         |
+| [petal](https://github.com/siyuan-note/petal)            | 插件 API       | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/petal)          | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/petal)          |
+| [android](https://github.com/siyuan-note/siyuan-android) | Android App  | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-android) | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-android) |
+| [ios](https://github.com/siyuan-note/siyuan-ios)         | iOS App      | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-ios)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-ios)     |
+| [harmony](https://github.com/siyuan-note/siyuan-harmony)         | 鸿蒙 App       | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/siyuan-harmony)     | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/siyuan-harmony)     |
+| [riff](https://github.com/siyuan-note/riff)              | 间隔重复         | ![GitHub forks](https://img.shields.io/github/forks/siyuan-note/riff)           | ![GitHub Repo stars](https://img.shields.io/github/stars/siyuan-note/riff)           |
 
 
 ## 🌟 星标历史
 ## 🌟 星标历史
 
 
@@ -381,6 +382,7 @@ Publish parameters: --accessAuthCode=******(访问授权码)
 * [界面和内核](https://github.com/siyuan-note/siyuan)
 * [界面和内核](https://github.com/siyuan-note/siyuan)
 * [Android 端](https://github.com/siyuan-note/siyuan-android)
 * [Android 端](https://github.com/siyuan-note/siyuan-android)
 * [iOS 端](https://github.com/siyuan-note/siyuan-ios)
 * [iOS 端](https://github.com/siyuan-note/siyuan-ios)
+* [鸿蒙端](https://github.com/siyuan-note/siyuan-harmony)
 * [Chrome 剪藏扩展](https://github.com/siyuan-note/siyuan-chrome)
 * [Chrome 剪藏扩展](https://github.com/siyuan-note/siyuan-chrome)
 
 
 更多细节请参考[开发指南](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING_zh_CN.md)。
 更多细节请参考[开发指南](https://github.com/siyuan-note/siyuan/blob/master/.github/CONTRIBUTING_zh_CN.md)。

+ 3 - 3
app/appearance/langs/de_DE.json

@@ -504,7 +504,7 @@
   "editReadonly": "Schreibgeschützter Modus",
   "editReadonly": "Schreibgeschützter Modus",
   "editReadonlyTip": "Nach der Aktivierung wird das Dokument im schreibgeschützten Modus geladen.",
   "editReadonlyTip": "Nach der Aktivierung wird das Dokument im schreibgeschützten Modus geladen.",
   "generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.",
   "generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.",
-  "generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die Datenhistorie wird das Konfliktdokument aufzeichnen.",
+  "generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die [Datenhistorie] wird das Konfliktdokument aufzeichnen.",
   "deleteOpConfirm": "⚠️ Bestätigung der Löschoperation",
   "deleteOpConfirm": "⚠️ Bestätigung der Löschoperation",
   "filterKeywordEnter": "Keyword-Filter eingeben",
   "filterKeywordEnter": "Keyword-Filter eingeben",
   "defBlock": "Def Block",
   "defBlock": "Def Block",
@@ -576,7 +576,7 @@
   "key": "Schlüssel",
   "key": "Schlüssel",
   "genKey": "Automatisch generieren",
   "genKey": "Automatisch generieren",
   "genKeyByPW": "Schlüssel nach Passphrase generieren",
   "genKeyByPW": "Schlüssel nach Passphrase generieren",
-  "dataRepoKeyTip1": "Das Daten-Repo wird verwendet, um Datenschnappschüsse zu verschlüsseln und zu speichern. Schnappschüsse können in der Datenhistorie erstellt und zurückgerollt werden.",
+  "dataRepoKeyTip1": "Das Daten-Repo wird verwendet, um Datenschnappschüsse zu verschlüsseln und zu speichern. Schnappschüsse können in der [Datenhistorie] erstellt und zurückgerollt werden.",
   "dataRepoKeyTip2": "Alle Geräte müssen denselben Schlüssel verwenden, wenn die Schlüssel übereinstimmen, können die Daten nicht in die Cloud synchronisiert werden.",
   "dataRepoKeyTip2": "Alle Geräte müssen denselben Schlüssel verwenden, wenn die Schlüssel übereinstimmen, können die Daten nicht in die Cloud synchronisiert werden.",
   "dataRepoKey": "Daten-Repo-Schlüssel",
   "dataRepoKey": "Daten-Repo-Schlüssel",
   "dataRepoPurge": "Daten-Repo bereinigen",
   "dataRepoPurge": "Daten-Repo bereinigen",
@@ -948,7 +948,7 @@
   "copyID": "ID kopieren",
   "copyID": "ID kopieren",
   "newBookmark": "Lesezeichenlabel erstellen",
   "newBookmark": "Lesezeichenlabel erstellen",
   "generateHistory": "Intervall der Historienerzeugung (Minuten, auf 0 setzen, um zu deaktivieren)",
   "generateHistory": "Intervall der Historienerzeugung (Minuten, auf 0 setzen, um zu deaktivieren)",
-  "generateHistoryInterval": "Historien werden automatisch bei der Bearbeitung oder Löschung erstellt und können in der Datenhistorie eingesehen und zurückgerollt werden.",
+  "generateHistoryInterval": "Historien werden automatisch bei der Bearbeitung oder Löschung erstellt und können in der [Datenhistorie] eingesehen und zurückgerollt werden.",
   "historyRetentionDays": "Aufbewahrungstage der Historien",
   "historyRetentionDays": "Aufbewahrungstage der Historien",
   "historyRetentionDaysTip": "Historische Daten, die die Aufbewahrungstage überschreiten, werden automatisch und vollständig gelöscht.",
   "historyRetentionDaysTip": "Historische Daten, die die Aufbewahrungstage überschreiten, werden automatisch und vollständig gelöscht.",
   "clearHistory": "Alle Historien löschen",
   "clearHistory": "Alle Historien löschen",

+ 3 - 3
app/appearance/langs/en_US.json

@@ -504,7 +504,7 @@
   "editReadonly": "Read-only mode",
   "editReadonly": "Read-only mode",
   "editReadonlyTip": "After enabling, the editor will load the document in read-only mode",
   "editReadonlyTip": "After enabling, the editor will load the document in read-only mode",
   "generateConflictDoc": "Generate conflict documentation when syncing conflicts",
   "generateConflictDoc": "Generate conflict documentation when syncing conflicts",
-  "generateConflictDocTip": "After enabling, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the data history will record the conflict document",
+  "generateConflictDocTip": "After enabling, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document",
   "deleteOpConfirm": "⚠️ Delete operation confirmation",
   "deleteOpConfirm": "⚠️ Delete operation confirmation",
   "filterKeywordEnter": "Keyword filtering Enter",
   "filterKeywordEnter": "Keyword filtering Enter",
   "defBlock": "Def block",
   "defBlock": "Def block",
@@ -576,7 +576,7 @@
   "key": "Key",
   "key": "Key",
   "genKey": "Auto-generate key",
   "genKey": "Auto-generate key",
   "genKeyByPW": "Gen key by passphrase",
   "genKeyByPW": "Gen key by passphrase",
-  "dataRepoKeyTip1": "The data repo is used to encrypt and save data snapshots. Snapshots can be created and rolled back in the data history",
+  "dataRepoKeyTip1": "The data repo is used to encrypt and save data snapshots. Snapshots can be created and rolled back in the [Data History]",
   "dataRepoKeyTip2": "All devices must use the same key, if the keys are inconsistent, the data cannot be synced to the cloud",
   "dataRepoKeyTip2": "All devices must use the same key, if the keys are inconsistent, the data cannot be synced to the cloud",
   "dataRepoKey": "Data repo key",
   "dataRepoKey": "Data repo key",
   "dataRepoPurge": "Data repo purge",
   "dataRepoPurge": "Data repo purge",
@@ -948,7 +948,7 @@
   "copyID": "Copy ID",
   "copyID": "Copy ID",
   "newBookmark": "Create a bookmark label",
   "newBookmark": "Create a bookmark label",
   "generateHistory": "History Generation Interval (minutes, set to 0 to disable)",
   "generateHistory": "History Generation Interval (minutes, set to 0 to disable)",
-  "generateHistoryInterval": "History is automatically generated when editing or deleting, which can be viewed and rolled back in the data history",
+  "generateHistoryInterval": "History is automatically generated when editing or deleting, which can be viewed and rolled back in the [Data History]",
   "historyRetentionDays": "History Retention Days",
   "historyRetentionDays": "History Retention Days",
   "historyRetentionDaysTip": "Historical data exceeding the retention days will be automatically and completely deleted",
   "historyRetentionDaysTip": "Historical data exceeding the retention days will be automatically and completely deleted",
   "clearHistory": "Clear all history",
   "clearHistory": "Clear all history",

+ 3 - 3
app/appearance/langs/es_ES.json

@@ -504,7 +504,7 @@
   "editReadonly": "Modo de solo lectura",
   "editReadonly": "Modo de solo lectura",
   "editReadonlyTip": "Después de habilitarlo, el editor cargará el documento en modo de solo lectura",
   "editReadonlyTip": "Después de habilitarlo, el editor cargará el documento en modo de solo lectura",
   "generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
   "generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
-  "generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el historial de datos registrará el documento de conflicto",
+  "generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto",
   "deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",
   "deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",
   "filterKeywordEnter": "Filtrado de palabras clave Entrar",
   "filterKeywordEnter": "Filtrado de palabras clave Entrar",
   "defBlock": "Definir bloque",
   "defBlock": "Definir bloque",
@@ -576,7 +576,7 @@
   "key": "Clave",
   "key": "Clave",
   "genKey": "Gen clave auto",
   "genKey": "Gen clave auto",
   "genKeyByPW": "Clave gen por contraseña",
   "genKeyByPW": "Clave gen por contraseña",
-  "dataRepoKeyTip1": "El repositorio de datos se utiliza para cifrar y guardar instantáneas de datos. Las instantáneas pueden crearse y revertirse en el historial de datos",
+  "dataRepoKeyTip1": "El repositorio de datos se utiliza para cifrar y guardar instantáneas de datos. Las instantáneas pueden crearse y revertirse en el [Historial de datos]",
   "dataRepoKeyTip2": "Todos los dispositivos deben usar la misma clave, si las claves son inconsistentes, los datos no se pueden sincronizar con la nube",
   "dataRepoKeyTip2": "Todos los dispositivos deben usar la misma clave, si las claves son inconsistentes, los datos no se pueden sincronizar con la nube",
   "dataRepoKey": "Clave del repositorio de datos",
   "dataRepoKey": "Clave del repositorio de datos",
   "dataRepoPurge": "Purga del repositorio de datos",
   "dataRepoPurge": "Purga del repositorio de datos",
@@ -948,7 +948,7 @@
   "copyID": "ID de copia",
   "copyID": "ID de copia",
   "newBookmark": "Crear una etiqueta de marcador",
   "newBookmark": "Crear una etiqueta de marcador",
   "generateHistory": "Intervalo de Generación de Historial (minutos, poner a 0 para desactivar)",
   "generateHistory": "Intervalo de Generación de Historial (minutos, poner a 0 para desactivar)",
-  "generateHistoryInterval": "El historial se genera automáticamente cuando se edita o se borra, y se puede ver y retroceder en el historial de datos",
+  "generateHistoryInterval": "El historial se genera automáticamente cuando se edita o se borra, y se puede ver y retroceder en el [Historial de datos]",
   "historyRetentionDays": "Días de retención del historial",
   "historyRetentionDays": "Días de retención del historial",
   "historyRetentionDaysTip": "Los datos históricos que superen los días de retención se eliminarán automática y completamente",
   "historyRetentionDaysTip": "Los datos históricos que superen los días de retención se eliminarán automática y completamente",
   "clearHistory": "Borrar todo el historial",
   "clearHistory": "Borrar todo el historial",

+ 4 - 4
app/appearance/langs/it_IT.json

@@ -504,7 +504,7 @@
   "editReadonly": "Modalità di sola lettura",
   "editReadonly": "Modalità di sola lettura",
   "editReadonlyTip": "Dopo l'abilitazione, l'editor caricherà il documento in modalità di sola lettura",
   "editReadonlyTip": "Dopo l'abilitazione, l'editor caricherà il documento in modalità di sola lettura",
   "generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione",
   "generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione",
-  "generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la cronologia dei dati registrerà il documento di conflitto",
+  "generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la [Cronologia dati] registrerà il documento di conflitto",
   "deleteOpConfirm": "⚠️ Conferma operazione di eliminazione",
   "deleteOpConfirm": "⚠️ Conferma operazione di eliminazione",
   "filterKeywordEnter": "Parola chiave di filtraggio Invio",
   "filterKeywordEnter": "Parola chiave di filtraggio Invio",
   "defBlock": "Blocco definito",
   "defBlock": "Blocco definito",
@@ -576,7 +576,7 @@
   "key": "Chiave",
   "key": "Chiave",
   "genKey": "Genera chiave automaticamente",
   "genKey": "Genera chiave automaticamente",
   "genKeyByPW": "Genera chiave tramite passphrase",
   "genKeyByPW": "Genera chiave tramite passphrase",
-  "dataRepoKeyTip1": "Il repository dei dati è utilizzato per crittografare e salvare gli snapshot dei dati. Gli snapshot possono essere creati e ripristinati nella cronologia dei dati",
+  "dataRepoKeyTip1": "Il repository dei dati è utilizzato per crittografare e salvare gli snapshot dei dati. Gli snapshot possono essere creati e ripristinati nella [Cronologia dati]",
   "dataRepoKeyTip2": "Tutti i dispositivi devono utilizzare la stessa chiave, se le chiavi non corrispondono i dati non possono essere sincronizzati nel cloud",
   "dataRepoKeyTip2": "Tutti i dispositivi devono utilizzare la stessa chiave, se le chiavi non corrispondono i dati non possono essere sincronizzati nel cloud",
   "dataRepoKey": "Chiave del repository dati",
   "dataRepoKey": "Chiave del repository dati",
   "dataRepoPurge": "Pulizia repository dati",
   "dataRepoPurge": "Pulizia repository dati",
@@ -948,7 +948,7 @@
   "copyID": "Copia ID",
   "copyID": "Copia ID",
   "newBookmark": "Crea un'etichetta segnalibro",
   "newBookmark": "Crea un'etichetta segnalibro",
   "generateHistory": "Intervallo di generazione della cronologia (minuti, impostare a 0 per disabilitare)",
   "generateHistory": "Intervallo di generazione della cronologia (minuti, impostare a 0 per disabilitare)",
-  "generateHistoryInterval": "La cronologia viene generata automaticamente durante la modifica o l'eliminazione, può essere visualizzata e ripristinata nella cronologia dei dati",
+  "generateHistoryInterval": "La cronologia viene generata automaticamente durante la modifica o l'eliminazione, può essere visualizzata e ripristinata nella [Cronologia dati]",
   "historyRetentionDays": "Giorni di conservazione della cronologia",
   "historyRetentionDays": "Giorni di conservazione della cronologia",
   "historyRetentionDaysTip": "I dati storici che superano i giorni di conservazione verranno eliminati automaticamente e completamente",
   "historyRetentionDaysTip": "I dati storici che superano i giorni di conservazione verranno eliminati automaticamente e completamente",
   "clearHistory": "Cancella tutta la cronologia",
   "clearHistory": "Cancella tutta la cronologia",
@@ -999,7 +999,7 @@
   "account11": "Fino alla fine dello sconto per gli early bird",
   "account11": "Fino alla fine dello sconto per gli early bird",
   "account12": "Compagno di vita",
   "account12": "Compagno di vita",
   "clickMeToRenew": "Vai al rinnovo",
   "clickMeToRenew": "Vai al rinnovo",
-  "dataHistory": "Cronologia dei dati",
+  "dataHistory": "Cronologia dati",
   "quitApp": "Esci?",
   "quitApp": "Esci?",
   "reset": "Reimposta",
   "reset": "Reimposta",
   "siyuanNote": "SiYuan",
   "siyuanNote": "SiYuan",

+ 3 - 3
app/appearance/langs/ja_JP.json

@@ -504,7 +504,7 @@
   "editReadonly": "読み取り専用モード",
   "editReadonly": "読み取り専用モード",
   "editReadonlyTip": "エディタが読み取り専用モードでドキュメントを読み込みます",
   "editReadonlyTip": "エディタが読み取り専用モードでドキュメントを読み込みます",
   "generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
   "generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
-  "generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらずデータ履歴には競合ドキュメントが記録されます",
+  "generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます",
   "deleteOpConfirm": "⚠️ 削除操作の確認",
   "deleteOpConfirm": "⚠️ 削除操作の確認",
   "filterKeywordEnter": "フィルタキーワードを入力",
   "filterKeywordEnter": "フィルタキーワードを入力",
   "defBlock": "定義ブロック",
   "defBlock": "定義ブロック",
@@ -576,7 +576,7 @@
   "key": "キー",
   "key": "キー",
   "genKey": "キーの自動生成",
   "genKey": "キーの自動生成",
   "genKeyByPW": "パスワードからキーを生成",
   "genKeyByPW": "パスワードからキーを生成",
-  "dataRepoKeyTip1": "データリポジトリはデータスナップショットの暗号化と保存に使用されます。スナップショットはデータ履歴で作成およびロールバックできます",
+  "dataRepoKeyTip1": "データリポジトリはデータスナップショットの暗号化と保存に使用されます。スナップショットは [データ履歴] で作成およびロールバックできます",
   "dataRepoKeyTip2": "すべてのデバイスで同じキーを使用する必要があります。キーが一致しなければデータはクラウドに同期されません",
   "dataRepoKeyTip2": "すべてのデバイスで同じキーを使用する必要があります。キーが一致しなければデータはクラウドに同期されません",
   "dataRepoKey": "データリポジトリキー",
   "dataRepoKey": "データリポジトリキー",
   "dataRepoPurge": "データリポジトリのクリーンアップ",
   "dataRepoPurge": "データリポジトリのクリーンアップ",
@@ -948,7 +948,7 @@
   "copyID": "ID をコピー",
   "copyID": "ID をコピー",
   "newBookmark": "ブックマークラベルを作成",
   "newBookmark": "ブックマークラベルを作成",
   "generateHistory": "履歴生成間隔 (分単位、無効にするには <code class='fn__code'>0</code> に設定)",
   "generateHistory": "履歴生成間隔 (分単位、無効にするには <code class='fn__code'>0</code> に設定)",
-  "generateHistoryInterval": "履歴は編集や削除時に自動的に生成され、データ履歴から閲覧およびロールバックが可能です",
+  "generateHistoryInterval": "履歴は編集や削除時に自動的に生成され、[データ履歴] から閲覧およびロールバックが可能です",
   "historyRetentionDays": "履歴の保存日数",
   "historyRetentionDays": "履歴の保存日数",
   "historyRetentionDaysTip": "保存日数を超える履歴データは自動的に削除されます",
   "historyRetentionDaysTip": "保存日数を超える履歴データは自動的に削除されます",
   "clearHistory": "すべての履歴を消去",
   "clearHistory": "すべての履歴を消去",

+ 3 - 3
app/appearance/langs/pl_PL.json

@@ -504,7 +504,7 @@
   "editReadonly": "Tryb tylko do odczytu",
   "editReadonly": "Tryb tylko do odczytu",
   "editReadonlyTip": "Po włączeniu edytor załaduje dokument w trybie tylko do odczytu",
   "editReadonlyTip": "Po włączeniu edytor załaduje dokument w trybie tylko do odczytu",
   "generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów",
   "generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów",
-  "generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, historia danych zarejestruje dokument konfliktowy",
+  "generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, [Historia danych] zarejestruje dokument konfliktowy",
   "deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia",
   "deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia",
   "filterKeywordEnter": "Filtrowanie słów kluczowych Wprowadź",
   "filterKeywordEnter": "Filtrowanie słów kluczowych Wprowadź",
   "defBlock": "Definicja bloku",
   "defBlock": "Definicja bloku",
@@ -576,7 +576,7 @@
   "key": "Klucz",
   "key": "Klucz",
   "genKey": "Automatycznie wygeneruj klucz",
   "genKey": "Automatycznie wygeneruj klucz",
   "genKeyByPW": "Gen klucz według hasła",
   "genKeyByPW": "Gen klucz według hasła",
-  "dataRepoKeyTip1": "Repozytorium danych jest używane do szyfrowania i zapisywania zrzutów danych. Zrzuty mogą być tworzone i cofanięte w historii danych",
+  "dataRepoKeyTip1": "Repozytorium danych jest używane do szyfrowania i zapisywania zrzutów danych. Zrzuty mogą być tworzone i cofanięte w [Historia danych]",
   "dataRepoKeyTip2": "Wszystkie urządzenia muszą używać tego samego klucza, jeśli klucze się różnią, dane nie mogą być synchronizowane do chmury",
   "dataRepoKeyTip2": "Wszystkie urządzenia muszą używać tego samego klucza, jeśli klucze się różnią, dane nie mogą być synchronizowane do chmury",
   "dataRepoKey": "Klucz repozytorium danych",
   "dataRepoKey": "Klucz repozytorium danych",
   "dataRepoPurge": "Oczyszczanie repozytorium danych",
   "dataRepoPurge": "Oczyszczanie repozytorium danych",
@@ -948,7 +948,7 @@
   "copyID": "Skopiuj ID",
   "copyID": "Skopiuj ID",
   "newBookmark": "Utwórz etykietę zakładki",
   "newBookmark": "Utwórz etykietę zakładki",
   "generateHistory": "Interwał generacji historii (minuty, ustaw na 0, aby wyłączyć)",
   "generateHistory": "Interwał generacji historii (minuty, ustaw na 0, aby wyłączyć)",
-  "generateHistoryInterval": "Historia jest automatycznie generowana podczas edytowania lub usuwania, która może być wyświetlana i wycofywana w historii danych",
+  "generateHistoryInterval": "Historia jest automatycznie generowana podczas edytowania lub usuwania, która może być wyświetlana i wycofywana w [Historia danych]",
   "historyRetentionDays": "Dni przechowywania historii",
   "historyRetentionDays": "Dni przechowywania historii",
   "historyRetentionDaysTip": "Dane historyczne, które przekraczają dni przechowywania, będą automatycznie i całkowicie usuwane",
   "historyRetentionDaysTip": "Dane historyczne, które przekraczają dni przechowywania, będą automatycznie i całkowicie usuwane",
   "clearHistory": "Wyczyść całą historię",
   "clearHistory": "Wyczyść całą historię",

+ 3 - 3
app/appearance/langs/ru_RU.json

@@ -504,7 +504,7 @@
   "editReadonly": "Режим только для чтения",
   "editReadonly": "Режим только для чтения",
   "editReadonlyTip": "После включения редактор загрузит документ в режиме только для чтения",
   "editReadonlyTip": "После включения редактор загрузит документ в режиме только для чтения",
   "generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации",
   "generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации",
-  "generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, история данных зарегистрирует документ конфликта",
+  "generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, [История данных] зарегистрирует документ конфликта",
   "deleteOpConfirm": "⚠️ Подтверждение операции удаления",
   "deleteOpConfirm": "⚠️ Подтверждение операции удаления",
   "filterKeywordEnter": "Ключевое слово фильтрации Ввод",
   "filterKeywordEnter": "Ключевое слово фильтрации Ввод",
   "defBlock": "Определить блок",
   "defBlock": "Определить блок",
@@ -576,7 +576,7 @@
   "key": "Ключ",
   "key": "Ключ",
   "genKey": "Авто-сгенерировать ключ",
   "genKey": "Авто-сгенерировать ключ",
   "genKeyByPW": "Создать ключ по паролю",
   "genKeyByPW": "Создать ключ по паролю",
-  "dataRepoKeyTip1": "Репозиторий данных используется для шифрования и сохранения снимков данных. Снимки могут быть созданы и восстановлены в истории данных",
+  "dataRepoKeyTip1": "Репозиторий данных используется для шифрования и сохранения снимков данных. Снимки могут быть созданы и восстановлены в [Истории данных]",
   "dataRepoKeyTip2": "Все устройства должны использовать один и тот же ключ, если ключи несовпадают, данные не могут синхронизироваться в облако",
   "dataRepoKeyTip2": "Все устройства должны использовать один и тот же ключ, если ключи несовпадают, данные не могут синхронизироваться в облако",
   "dataRepoKey": "Ключ репозитория данных",
   "dataRepoKey": "Ключ репозитория данных",
   "dataRepoPurge": "Очистка репозитория данных",
   "dataRepoPurge": "Очистка репозитория данных",
@@ -948,7 +948,7 @@
   "copyID": "Скопировать ID",
   "copyID": "Скопировать ID",
   "newBookmark": "Создать метку закладки",
   "newBookmark": "Создать метку закладки",
   "generateHistory": "Интервал генерации истории (минуты, установите 0 для отключения)",
   "generateHistory": "Интервал генерации истории (минуты, установите 0 для отключения)",
-  "generateHistoryInterval": "История автоматически генерируется при редактировании или удалении, которую можно просмотреть и откатить в истории данных",
+  "generateHistoryInterval": "История автоматически генерируется при редактировании или удалении, которую можно просмотреть и откатить в [Истории данных]",
   "historyRetentionDays": "Дни хранения истории",
   "historyRetentionDays": "Дни хранения истории",
   "historyRetentionDaysTip": "Исторические данные, превышающие дни хранения, будут автоматически и полностью удалены",
   "historyRetentionDaysTip": "Исторические данные, превышающие дни хранения, будут автоматически и полностью удалены",
   "clearHistory": "Очистить всю историю",
   "clearHistory": "Очистить всю историю",

+ 3 - 3
app/appearance/langs/zh_CHT.json

@@ -504,7 +504,7 @@
   "editReadonly": "只讀模式",
   "editReadonly": "只讀模式",
   "editReadonlyTip": "啟用後編輯器將以只讀模式載入文檔",
   "editReadonlyTip": "啟用後編輯器將以只讀模式載入文檔",
   "generateConflictDoc": "同步衝突時生成衝突文檔",
   "generateConflictDoc": "同步衝突時生成衝突文檔",
-  "generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,資料歷史都會記錄衝突文檔",
+  "generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔",
   "deleteOpConfirm": "⚠️ Delete operation confirmation",
   "deleteOpConfirm": "⚠️ Delete operation confirmation",
   "filterKeywordEnter": "關鍵字過濾 Enter",
   "filterKeywordEnter": "關鍵字過濾 Enter",
   "defBlock": "定義塊",
   "defBlock": "定義塊",
@@ -576,7 +576,7 @@
   "key": "密鑰",
   "key": "密鑰",
   "genKey": "自動生成密鑰",
   "genKey": "自動生成密鑰",
   "genKeyByPW": "通過密碼生成密鑰",
   "genKeyByPW": "通過密碼生成密鑰",
-  "dataRepoKeyTip1": "資料倉庫用於加密保存資料快照,可在資料歷史中建立快照和回復快照",
+  "dataRepoKeyTip1": "資料倉庫用於加密保存資料快照,可在 [資料歷史] 中建立快照和回復快照",
   "dataRepoKeyTip2": "所有設備必須使用相同的密鑰,如果密鑰不一致則無法雲端同步資料",
   "dataRepoKeyTip2": "所有設備必須使用相同的密鑰,如果密鑰不一致則無法雲端同步資料",
   "dataRepoKey": "資料倉庫密鑰",
   "dataRepoKey": "資料倉庫密鑰",
   "dataRepoPurge": "資料倉庫清理",
   "dataRepoPurge": "資料倉庫清理",
@@ -948,7 +948,7 @@
   "copyID": "複製 ID",
   "copyID": "複製 ID",
   "newBookmark": "新建書籤標識",
   "newBookmark": "新建書籤標識",
   "generateHistory": "歷史生成間隔(分鐘,設置為 0 則禁用)",
   "generateHistory": "歷史生成間隔(分鐘,設置為 0 則禁用)",
-  "generateHistoryInterval": "編輯或刪除時會自動生成歷史,可在資料歷史中查看和回復",
+  "generateHistoryInterval": "編輯或刪除時會自動生成歷史,可在 [資料歷史] 中查看和回復",
   "historyRetentionDays": "歷史保留天數",
   "historyRetentionDays": "歷史保留天數",
   "historyRetentionDaysTip": "超過保留天數的歷史資料會被自動徹底刪除",
   "historyRetentionDaysTip": "超過保留天數的歷史資料會被自動徹底刪除",
   "clearHistory": "清空所有歷史",
   "clearHistory": "清空所有歷史",

+ 3 - 3
app/appearance/langs/zh_CN.json

@@ -504,7 +504,7 @@
   "editReadonly": "只读模式",
   "editReadonly": "只读模式",
   "editReadonlyTip": "启用后编辑器将以只读模式载入文档",
   "editReadonlyTip": "启用后编辑器将以只读模式载入文档",
   "generateConflictDoc": "同步冲突时生成冲突文档",
   "generateConflictDoc": "同步冲突时生成冲突文档",
-  "generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,数据历史都会记录冲突文档",
+  "generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档",
   "deleteOpConfirm": "⚠️ 删除操作确认",
   "deleteOpConfirm": "⚠️ 删除操作确认",
   "filterKeywordEnter": "关键字过滤 Enter",
   "filterKeywordEnter": "关键字过滤 Enter",
   "defBlock": "定义块",
   "defBlock": "定义块",
@@ -576,7 +576,7 @@
   "key": "密钥",
   "key": "密钥",
   "genKey": "自动生成密钥",
   "genKey": "自动生成密钥",
   "genKeyByPW": "通过密码生成密钥",
   "genKeyByPW": "通过密码生成密钥",
-  "dataRepoKeyTip1": "数据仓库用于加密保存数据快照,可在数据历史中创建快照和回滚快照",
+  "dataRepoKeyTip1": "数据仓库用于加密保存数据快照,可在 [数据历史] 中创建快照和回滚快照",
   "dataRepoKeyTip2": "所有设备必须使用相同的密钥,如果密钥不一致则无法云端同步数据",
   "dataRepoKeyTip2": "所有设备必须使用相同的密钥,如果密钥不一致则无法云端同步数据",
   "dataRepoKey": "数据仓库密钥",
   "dataRepoKey": "数据仓库密钥",
   "dataRepoPurge": "数据仓库清理",
   "dataRepoPurge": "数据仓库清理",
@@ -948,7 +948,7 @@
   "copyID": "复制 ID",
   "copyID": "复制 ID",
   "newBookmark": "新建书签标识",
   "newBookmark": "新建书签标识",
   "generateHistory": "历史生成间隔(分钟,设置为 0 则禁用)",
   "generateHistory": "历史生成间隔(分钟,设置为 0 则禁用)",
-  "generateHistoryInterval": "编辑或删除时会自动生成历史,可在数据历史中查看和回滚",
+  "generateHistoryInterval": "编辑或删除时会自动生成历史,可在 [数据历史] 中查看和回滚",
   "historyRetentionDays": "历史保留天数",
   "historyRetentionDays": "历史保留天数",
   "historyRetentionDaysTip": "超过保留天数的历史数据会被自动彻底删除",
   "historyRetentionDaysTip": "超过保留天数的历史数据会被自动彻底删除",
   "clearHistory": "清空所有历史",
   "clearHistory": "清空所有历史",

BIN
app/src/assets/fonts/JetBrainsMono-1.0.3/JetBrainsMono-Regular.woff


BIN
app/src/assets/fonts/JetBrainsMono-2.304/JetBrainsMono-Regular.woff2


+ 3 - 3
app/src/assets/fonts/JetBrainsMono-1.0.3/LICENSE → app/src/assets/fonts/JetBrainsMono-2.304/LICENSE

@@ -1,8 +1,8 @@
 Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
 Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
 
 
 This Font Software is licensed under the SIL Open Font License, Version 1.1.
 This Font Software is licensed under the SIL Open Font License, Version 1.1.
-
-This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL
+This license is copied below, and is also available with a FAQ at:
+https://scripts.sil.org/OFL
 
 
 
 
 -----------------------------------------------------------
 -----------------------------------------------------------
@@ -18,7 +18,7 @@ with others.
 
 
 The OFL allows the licensed fonts to be used, studied, modified and
 The OFL allows the licensed fonts to be used, studied, modified and
 redistributed freely as long as they are not sold by themselves. The
 redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
+fonts, including any derivative works, can be bundled, embedded, 
 redistributed and/or sold with any software provided that any reserved
 redistributed and/or sold with any software provided that any reserved
 names are not used by derivative works. The fonts and derivatives,
 names are not used by derivative works. The fonts and derivatives,
 however, cannot be released under any other type of license. The
 however, cannot be released under any other type of license. The

+ 2 - 2
app/src/assets/fonts/LxgwWenKai-Lite-1.311/LICENSE → app/src/assets/fonts/LxgwWenKai-Lite-1.501/LICENSE

@@ -1,9 +1,9 @@
-Copyright 2021-2023 LXGW (https://github.com/lxgw/LxgwWenKai)
+Copyright 2021-2024 LXGW (https://github.com/lxgw/LxgwWenKai)
 Copyright 2020 The Klee Project Authors (https://github.com/fontworks-fonts/Klee)
 Copyright 2020 The Klee Project Authors (https://github.com/fontworks-fonts/Klee)
 
 
 This Font Software is licensed under the SIL Open Font License, Version 1.1.
 This Font Software is licensed under the SIL Open Font License, Version 1.1.
 This license is copied below, and is also available with a FAQ at:
 This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
+https://openfontlicense.org
 
 
 
 
 -----------------------------------------------------------
 -----------------------------------------------------------

BIN
app/src/assets/fonts/LxgwWenKai-Lite-1.311/LXGWWenKaiLite-Regular.ttf → app/src/assets/fonts/LxgwWenKai-Lite-1.501/LXGWWenKaiLite-Regular.ttf


+ 1 - 1
app/src/assets/scss/component/_typography.scss

@@ -1,6 +1,6 @@
 @font-face {
 @font-face {
   font-family: 'JetBrainsMono-Regular';
   font-family: 'JetBrainsMono-Regular';
-  src: url(../fonts/JetBrainsMono-1.0.3/JetBrainsMono-Regular.woff) format('woff');
+  src: url(../fonts/JetBrainsMono-2.304/JetBrainsMono-Regular.woff2) format('woff2');
 }
 }
 
 
 .b3-typography,
 .b3-typography,

+ 3 - 3
app/src/protyle/toolbar/Font.ts

@@ -69,10 +69,10 @@ export const appearanceMenu = (protyle: IProtyle, nodeElements?: Element[]) => {
             const lastFontStatus = item.split(Constants.ZWSP);
             const lastFontStatus = item.split(Constants.ZWSP);
             switch (lastFontStatus[0]) {
             switch (lastFontStatus[0]) {
                 case "color":
                 case "color":
-                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.colorFont} ${lastFontStatus[1] ? "" : window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="color:${lastFontStatus[1]}"` : ""} data-type="${lastFontStatus[0]}">A</button>`;
+                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.colorFont}${lastFontStatus[1] ? "" : " " + window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="color:${lastFontStatus[1]}"` : ""} data-type="${lastFontStatus[0]}">A</button>`;
                     break;
                     break;
                 case "backgroundColor":
                 case "backgroundColor":
-                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.colorPrimary} ${lastFontStatus[1] ? "" : window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="background-color:${lastFontStatus[1]}"` : ""} data-type="${lastFontStatus[0]}"></button>`;
+                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.colorPrimary}${lastFontStatus[1] ? "" : " " + window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="background-color:${lastFontStatus[1]}"` : ""} data-type="${lastFontStatus[0]}"></button>`;
                     break;
                     break;
                 case "style2":
                 case "style2":
                     lastColorHTML += `<button data-type="${lastFontStatus[0]}" class="protyle-font__style" style="-webkit-text-stroke: 0.2px var(--b3-theme-on-background);-webkit-text-fill-color : transparent;">${window.siyuan.languages.hollow}</button>`;
                     lastColorHTML += `<button data-type="${lastFontStatus[0]}" class="protyle-font__style" style="-webkit-text-stroke: 0.2px var(--b3-theme-on-background);-webkit-text-fill-color : transparent;">${window.siyuan.languages.hollow}</button>`;
@@ -86,7 +86,7 @@ export const appearanceMenu = (protyle: IProtyle, nodeElements?: Element[]) => {
                     }
                     }
                     break;
                     break;
                 case "style1":
                 case "style1":
-                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.color} ${lastFontStatus[1] ? "" : window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="background-color:${lastFontStatus[1]};color:${lastFontStatus[2]}"` : ""} data-type="${lastFontStatus[0]}">A</button>`;
+                    lastColorHTML += `<button class="color__square ariaLabel" data-position="3bottom" aria-label="${window.siyuan.languages.color}${lastFontStatus[1] ? "" : " " + window.siyuan.languages.default}" ${lastFontStatus[1] ? `style="background-color:${lastFontStatus[1]};color:${lastFontStatus[2]}"` : ""} data-type="${lastFontStatus[0]}">A</button>`;
                     break;
                     break;
                 case "clear":
                 case "clear":
                     lastColorHTML += `<button style="height: 26px;display: flex;align-items: center;padding: 0 5px;" data-type="${lastFontStatus[0]}" class="protyle-font__style ariaLabel" aria-label="${window.siyuan.languages.clearFontStyle}"><svg class="svg--mid"><use xlink:href="#iconTrashcan"></use></svg></button>`;
                     lastColorHTML += `<button style="height: 26px;display: flex;align-items: center;padding: 0 5px;" data-type="${lastFontStatus[0]}" class="protyle-font__style ariaLabel" aria-label="${window.siyuan.languages.clearFontStyle}"><svg class="svg--mid"><use xlink:href="#iconTrashcan"></use></svg></button>`;

+ 2 - 2
kernel/api/workspace.go

@@ -195,7 +195,7 @@ func getMobileWorkspaces(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
 	defer c.JSON(http.StatusOK, ret)
 
 
-	if util.ContainerIOS != util.Container && util.ContainerAndroid != util.Container {
+	if util.ContainerIOS != util.Container && util.ContainerAndroid != util.Container && util.ContainerHarmony != util.Container {
 		return
 		return
 	}
 	}
 
 
@@ -315,7 +315,7 @@ func setWorkspaceDir(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 		util.PushMsg(model.Conf.Language(42), 1000*15)
 		util.PushMsg(model.Conf.Language(42), 1000*15)
 		time.Sleep(time.Second * 1)
 		time.Sleep(time.Second * 1)
 		model.Close(false, false, 1)
 		model.Close(false, false, 1)

+ 2 - 0
kernel/bazaar/plugin.go

@@ -269,6 +269,8 @@ func getCurrentBackend() string {
 		return "ios"
 		return "ios"
 	case util.ContainerAndroid:
 	case util.ContainerAndroid:
 		return "android"
 		return "android"
+	case util.ContainerHarmony:
+		return "harmony"
 	default:
 	default:
 		return runtime.GOOS
 		return runtime.GOOS
 	}
 	}

+ 1 - 1
kernel/model/asset_content.go

@@ -765,7 +765,7 @@ func (parser *PdfAssetParser) getTextPageWorker(id int, instance pdfium.Pdfium,
 
 
 // Parse will parse a PDF document using PDFium webassembly module using a worker pool
 // Parse will parse a PDF document using PDFium webassembly module using a worker pool
 func (parser *PdfAssetParser) Parse(absPath string) (ret *AssetParseResult) {
 func (parser *PdfAssetParser) Parse(absPath string) (ret *AssetParseResult) {
-	if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container {
+	if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container || util.ContainerHarmony == util.Container {
 		// PDF asset content searching is not supported on mobile platforms
 		// PDF asset content searching is not supported on mobile platforms
 		return
 		return
 	}
 	}

+ 1 - 1
kernel/model/assets_watcher.go

@@ -33,7 +33,7 @@ import (
 var assetsWatcher *fsnotify.Watcher
 var assetsWatcher *fsnotify.Watcher
 
 
 func WatchAssets() {
 func WatchAssets() {
-	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 		return
 		return
 	}
 	}
 
 

+ 1 - 1
kernel/model/block.go

@@ -284,7 +284,7 @@ func RecentUpdatedBlocks() (ret []*Block) {
 	ret = []*Block{}
 	ret = []*Block{}
 
 
 	sqlStmt := "SELECT * FROM blocks WHERE type = 'p' AND length > 1"
 	sqlStmt := "SELECT * FROM blocks WHERE type = 'p' AND length > 1"
-	if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container {
+	if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container || util.ContainerHarmony == util.Container {
 		sqlStmt = "SELECT * FROM blocks WHERE type = 'd'"
 		sqlStmt = "SELECT * FROM blocks WHERE type = 'd'"
 	}
 	}
 
 

+ 2 - 2
kernel/model/conf.go

@@ -134,7 +134,7 @@ func InitConf() {
 
 
 	if "" != util.Lang {
 	if "" != util.Lang {
 		initialized := false
 		initialized := false
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			// 移动端以上次设置的外观语言为准
 			// 移动端以上次设置的外观语言为准
 			if "" != Conf.Lang && util.Lang != Conf.Lang {
 			if "" != Conf.Lang && util.Lang != Conf.Lang {
 				util.Lang = Conf.Lang
 				util.Lang = Conf.Lang
@@ -485,7 +485,7 @@ func InitConf() {
 		// 上次未正常完成数据索引
 		// 上次未正常完成数据索引
 		go func() {
 		go func() {
 			util.WaitForUILoaded()
 			util.WaitForUILoaded()
-			if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container {
+			if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container || util.ContainerHarmony == util.Container {
 				task.AppendAsyncTaskWithDelay(task.PushMsg, 2*time.Second, util.PushMsg, Conf.language(245), 15000)
 				task.AppendAsyncTaskWithDelay(task.PushMsg, 2*time.Second, util.PushMsg, Conf.language(245), 15000)
 			} else {
 			} else {
 				task.AppendAsyncTaskWithDelay(task.PushMsg, 2*time.Second, util.PushMsg, Conf.language(244), 15000)
 				task.AppendAsyncTaskWithDelay(task.PushMsg, 2*time.Second, util.PushMsg, Conf.language(244), 15000)

+ 1 - 1
kernel/model/emojis_watcher.go

@@ -32,7 +32,7 @@ import (
 var emojisWatcher *fsnotify.Watcher
 var emojisWatcher *fsnotify.Watcher
 
 
 func WatchEmojis() {
 func WatchEmojis() {
-	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+	if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 		return
 		return
 	}
 	}
 
 

+ 1 - 1
kernel/model/export.go

@@ -1076,7 +1076,7 @@ func processPDFWatermark(pdfCtx *pdfcpu.Context, watermark bool) {
 		desc = descBuilder.String()
 		desc = descBuilder.String()
 		desc = desc[:len(desc)-1]
 		desc = desc[:len(desc)-1]
 
 
-		fontPath := filepath.Join(util.AppearancePath, "fonts", "LxgwWenKai-Lite-1.311", "LXGWWenKaiLite-Regular.ttf")
+		fontPath := filepath.Join(util.AppearancePath, "fonts", "LxgwWenKai-Lite-1.501", "LXGWWenKaiLite-Regular.ttf")
 		err := api.InstallFonts([]string{fontPath})
 		err := api.InstallFonts([]string{fontPath})
 		if err != nil {
 		if err != nil {
 			logging.LogErrorf("install font [%s] failed: %s", fontPath, err)
 			logging.LogErrorf("install font [%s] failed: %s", fontPath, err)

+ 5 - 5
kernel/model/index.go

@@ -372,7 +372,7 @@ func subscribeSQLEvents() {
 	//	util.ContextPushMsg(context, msg)
 	//	util.ContextPushMsg(context, msg)
 	//})
 	//})
 	eventbus.Subscribe(eventbus.EvtSQLInsertBlocksFTS, func(context map[string]interface{}, blockCount int, hash string) {
 	eventbus.Subscribe(eventbus.EvtSQLInsertBlocksFTS, func(context map[string]interface{}, blockCount int, hash string) {
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			// Android/iOS 端不显示数据索引和搜索索引状态提示 https://github.com/siyuan-note/siyuan/issues/6392
 			// Android/iOS 端不显示数据索引和搜索索引状态提示 https://github.com/siyuan-note/siyuan/issues/6392
 			return
 			return
 		}
 		}
@@ -384,7 +384,7 @@ func subscribeSQLEvents() {
 		util.ContextPushMsg(context, msg)
 		util.ContextPushMsg(context, msg)
 	})
 	})
 	eventbus.Subscribe(eventbus.EvtSQLDeleteBlocks, func(context map[string]interface{}, rootID string) {
 	eventbus.Subscribe(eventbus.EvtSQLDeleteBlocks, func(context map[string]interface{}, rootID string) {
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			return
 			return
 		}
 		}
 
 
@@ -395,7 +395,7 @@ func subscribeSQLEvents() {
 		util.ContextPushMsg(context, msg)
 		util.ContextPushMsg(context, msg)
 	})
 	})
 	eventbus.Subscribe(eventbus.EvtSQLUpdateBlocksHPaths, func(context map[string]interface{}, blockCount int, hash string) {
 	eventbus.Subscribe(eventbus.EvtSQLUpdateBlocksHPaths, func(context map[string]interface{}, blockCount int, hash string) {
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			return
 			return
 		}
 		}
 
 
@@ -407,7 +407,7 @@ func subscribeSQLEvents() {
 	})
 	})
 
 
 	eventbus.Subscribe(eventbus.EvtSQLInsertHistory, func(context map[string]interface{}) {
 	eventbus.Subscribe(eventbus.EvtSQLInsertHistory, func(context map[string]interface{}) {
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			return
 			return
 		}
 		}
 
 
@@ -419,7 +419,7 @@ func subscribeSQLEvents() {
 	})
 	})
 
 
 	eventbus.Subscribe(eventbus.EvtSQLInsertAssetContent, func(context map[string]interface{}) {
 	eventbus.Subscribe(eventbus.EvtSQLInsertAssetContent, func(context map[string]interface{}) {
-		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container {
+		if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container || util.ContainerHarmony == util.Container {
 			return
 			return
 		}
 		}
 
 

+ 1 - 1
kernel/model/session.go

@@ -238,7 +238,7 @@ func CheckAuth(c *gin.Context) {
 			return
 			return
 		}
 		}
 		if strings.HasPrefix(c.Request.RequestURI, "/api/sync/performSync") {
 		if strings.HasPrefix(c.Request.RequestURI, "/api/sync/performSync") {
-			if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container {
+			if util.ContainerIOS == util.Container || util.ContainerAndroid == util.Container || util.ContainerHarmony == util.Container {
 				c.Set(RoleContextKey, RoleAdministrator)
 				c.Set(RoleContextKey, RoleAdministrator)
 				c.Next()
 				c.Next()
 				return
 				return

+ 2 - 1
kernel/util/working.go

@@ -351,7 +351,7 @@ var (
 	AccessAuthCode string
 	AccessAuthCode string
 	Lang           = ""
 	Lang           = ""
 
 
-	Container        string // docker, android, ios, std
+	Container        string // docker, android, ios, harmony, std
 	ISMicrosoftStore bool   // 桌面端是否是微软商店版
 	ISMicrosoftStore bool   // 桌面端是否是微软商店版
 )
 )
 
 
@@ -360,6 +360,7 @@ const (
 	ContainerDocker  = "docker"  // Docker 容器端
 	ContainerDocker  = "docker"  // Docker 容器端
 	ContainerAndroid = "android" // Android 端
 	ContainerAndroid = "android" // Android 端
 	ContainerIOS     = "ios"     // iOS 端
 	ContainerIOS     = "ios"     // iOS 端
+	ContainerHarmony = "harmony" // 鸿蒙端
 
 
 	LocalHost = "127.0.0.1" // 伺服地址
 	LocalHost = "127.0.0.1" // 伺服地址
 	FixedPort = "6806"      // 固定端口
 	FixedPort = "6806"      // 固定端口