From 085d20cf17238e4efc1f8472705003abdb9aac21 Mon Sep 17 00:00:00 2001 From: ssongliu Date: Tue, 2 Jun 2026 18:52:47 +0800 Subject: [PATCH] feat: support multi-node batch installation in Skills Hub --- core/app/task/task.go | 1 + core/i18n/lang/en.yaml | 2 ++ core/i18n/lang/es-ES.yaml | 2 ++ core/i18n/lang/ja.yaml | 2 ++ core/i18n/lang/ko.yaml | 2 ++ core/i18n/lang/ms.yaml | 2 ++ core/i18n/lang/pt-BR.yaml | 2 ++ core/i18n/lang/ru.yaml | 2 ++ core/i18n/lang/tr.yaml | 2 ++ core/i18n/lang/zh-Hant.yaml | 2 ++ core/i18n/lang/zh.yaml | 2 ++ frontend/src/lang/modules/en.ts | 3 ++- frontend/src/lang/modules/es-es.ts | 4 ++-- frontend/src/lang/modules/ja.ts | 4 ++-- frontend/src/lang/modules/ko.ts | 3 ++- frontend/src/lang/modules/ms.ts | 3 ++- frontend/src/lang/modules/pt-br.ts | 3 ++- frontend/src/lang/modules/ru.ts | 3 ++- frontend/src/lang/modules/tr.ts | 3 ++- frontend/src/lang/modules/zh-Hant.ts | 3 ++- frontend/src/lang/modules/zh.ts | 3 ++- 21 files changed, 41 insertions(+), 12 deletions(-) diff --git a/core/app/task/task.go b/core/app/task/task.go index 8eef976b28c4..2c2c992c9b97 100644 --- a/core/app/task/task.go +++ b/core/app/task/task.go @@ -48,6 +48,7 @@ type SubTask struct { } const ( + TaskInstall = "TaskInstall" TaskUpgrade = "TaskUpgrade" TaskAddNode = "TaskAddNode" TaskSync = "TaskSync" diff --git a/core/i18n/lang/en.yaml b/core/i18n/lang/en.yaml index 80c2ad766023..77caee78e561 100644 --- a/core/i18n/lang/en.yaml +++ b/core/i18n/lang/en.yaml @@ -145,6 +145,8 @@ PushAppInstallTaskToNode: "Push app installation task to node [{{ .name }}]" TaskPush: "Push" AppInstallTask: "App installation task" PushAppFailed: "Failed to push app installation task" +SkillHubInstallTask: "Install skill [{{ .name }}]" +SkillHubInstallToTarget: "Install skill to target [{{ .name }}]" Success: "Success" #script diff --git a/core/i18n/lang/es-ES.yaml b/core/i18n/lang/es-ES.yaml index 55651ec54aba..0d6a454ccebc 100644 --- a/core/i18n/lang/es-ES.yaml +++ b/core/i18n/lang/es-ES.yaml @@ -140,6 +140,8 @@ FailedStatus: "{{ .name }} fallida {{ .err }}" Start: "Iniciar" SubTask: "Subtarea" Skip: "Omitir errores y continuar..." +SkillHubInstallTask: "Instalar skill [{{ .name }}]" +SkillHubInstallToTarget: "Instalar skill en destino [{{ .name }}]" #script ScriptLibrary: "Biblioteca de scripts" diff --git a/core/i18n/lang/ja.yaml b/core/i18n/lang/ja.yaml index de2f136c1ba0..1a988d3354af 100644 --- a/core/i18n/lang/ja.yaml +++ b/core/i18n/lang/ja.yaml @@ -139,6 +139,8 @@ PushAppInstallTaskToNode: "ノード [{{ .name }}] にアプリインストー TaskPush: "送信" AppInstallTask: "アプリインストールタスク" PushAppFailed: "アプリインストールタスクの送信に失敗しました" +SkillHubInstallTask: "スキルをインストール [{{ .name }}]" +SkillHubInstallToTarget: "ターゲットにスキルをインストール [{{ .name }}]" Success: "成功" #script diff --git a/core/i18n/lang/ko.yaml b/core/i18n/lang/ko.yaml index 7ef7c925fd55..682499a66150 100644 --- a/core/i18n/lang/ko.yaml +++ b/core/i18n/lang/ko.yaml @@ -138,6 +138,8 @@ PushAppInstallTaskToNode: "노드 [{{ .name }}]로 앱 설치 작업 전송" TaskPush: "전송" AppInstallTask: "앱 설치 작업" PushAppFailed: "앱 설치 작업 전송 실패" +SkillHubInstallTask: "스킬 설치 [{{ .name }}]" +SkillHubInstallToTarget: "대상에 스킬 설치 [{{ .name }}]" Success: "성공" #script diff --git a/core/i18n/lang/ms.yaml b/core/i18n/lang/ms.yaml index f75ae0a61214..53d1ca5c79fe 100644 --- a/core/i18n/lang/ms.yaml +++ b/core/i18n/lang/ms.yaml @@ -133,6 +133,8 @@ PushAppInstallTaskToNode: "Hantar tugas pemasangan aplikasi ke nod [{{ .name }}] TaskPush: "Hantar" AppInstallTask: "Tugas pemasangan aplikasi" PushAppFailed: "Gagal menghantar tugas pemasangan aplikasi" +SkillHubInstallTask: "Pasang kemahiran [{{ .name }}]" +SkillHubInstallToTarget: "Pasang kemahiran ke sasaran [{{ .name }}]" Success: "Berjaya" #script diff --git a/core/i18n/lang/pt-BR.yaml b/core/i18n/lang/pt-BR.yaml index 49bb058112db..f16bbd661beb 100644 --- a/core/i18n/lang/pt-BR.yaml +++ b/core/i18n/lang/pt-BR.yaml @@ -138,6 +138,8 @@ PushAppInstallTaskToNode: "Enviar tarefa de instalação de aplicativo para o n TaskPush: "Enviar" AppInstallTask: "Tarefa de instalação de aplicativo" PushAppFailed: "Falha ao enviar tarefa de instalação de aplicativo" +SkillHubInstallTask: "Instalar skill [{{ .name }}]" +SkillHubInstallToTarget: "Instalar skill no destino [{{ .name }}]" Success: "Sucesso" #script diff --git a/core/i18n/lang/ru.yaml b/core/i18n/lang/ru.yaml index 3b8c4e60786d..a960aaa7cd3d 100644 --- a/core/i18n/lang/ru.yaml +++ b/core/i18n/lang/ru.yaml @@ -137,6 +137,8 @@ Skip: "Пропустить ошибки и продолжить..." TaskPush: "Отправить" AppInstallTask: "Задача установки приложения" PushAppFailed: "Не удалось отправить задачу установки приложения" +SkillHubInstallTask: "Установить навык [{{ .name }}]" +SkillHubInstallToTarget: "Установить навык в цель [{{ .name }}]" Success: "Успешно" #script diff --git a/core/i18n/lang/tr.yaml b/core/i18n/lang/tr.yaml index ed1ebe962164..1b3733cd42b8 100644 --- a/core/i18n/lang/tr.yaml +++ b/core/i18n/lang/tr.yaml @@ -137,6 +137,8 @@ PushAppInstallTaskToNode: "Uygulama kurulum görevini düğüme [{{ .name }}] g TaskPush: "Gönder" AppInstallTask: "Uygulama kurulum görevi" PushAppFailed: "Uygulama kurulum görevi gönderilemedi" +SkillHubInstallTask: "Skill yükle [{{ .name }}]" +SkillHubInstallToTarget: "Skill hedefe yükle [{{ .name }}]" Success: "Başarılı" #script diff --git a/core/i18n/lang/zh-Hant.yaml b/core/i18n/lang/zh-Hant.yaml index 37b4a45f9c90..0a702c868626 100644 --- a/core/i18n/lang/zh-Hant.yaml +++ b/core/i18n/lang/zh-Hant.yaml @@ -139,6 +139,8 @@ PushAppInstallTaskToNode: "傳送應用安裝任務到節點 [{{ .name }}]" TaskPush: "傳送" AppInstallTask: "應用安裝任務" PushAppFailed: "傳送應用安裝任務失敗" +SkillHubInstallTask: "安裝技能 [{{ .name }}]" +SkillHubInstallToTarget: "安裝技能到目標 [{{ .name }}]" Success: "成功" #script diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml index b7a53fb57aa2..5f30d05866d2 100644 --- a/core/i18n/lang/zh.yaml +++ b/core/i18n/lang/zh.yaml @@ -145,6 +145,8 @@ PushAppInstallTaskToNode: "推送应用安装任务到节点 [{{ .name }}]" TaskPush: "推送" AppInstallTask: "应用安装任务" PushAppFailed: "推送应用安装任务失败" +SkillHubInstallTask: "安装技能 [{{ .name }}]" +SkillHubInstallToTarget: "安装技能 {{ .name }} 到目标 {{ .target }}" Success: "成功" #script diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 1d8a19a16e92..546bb78da18f 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1078,7 +1078,7 @@ const message = { containerized: 'Containerized', containerName: 'Container Name', hostSkillDir: 'Skill Directory', - hostSkillDirHelper: 'Enter the Skill directory path on the server where 1Panel is installed.', + hostSkillDirHelper: 'Enter the Skill directory path on the node.', containerSkillDir: 'Container Skill Directory', installMethod: 'Install Method', copy: 'Copy', @@ -1113,6 +1113,7 @@ const message = { published: 'Published', disabled: 'Unpublished', rejected: 'Rejected', + deleted: 'Deleted', }, agent: { common: 'Common', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 586bd28ab6bf..4ab5bcd10804 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -1092,8 +1092,7 @@ const message = { containerized: 'En contenedor', containerName: 'Nombre del contenedor', hostSkillDir: 'Directorio de Skills', - hostSkillDirHelper: - 'Introduzca la ruta del directorio de Skills en el servidor donde está instalado 1Panel.', + hostSkillDirHelper: 'Introduzca la ruta del directorio de Skills del nodo.', containerSkillDir: 'Directorio de Skills en el contenedor', installMethod: 'Método de instalación', copy: 'Copiar', @@ -1129,6 +1128,7 @@ const message = { published: 'Publicado', disabled: 'Retirado', rejected: 'Rechazado', + deleted: 'Eliminado', }, agent: { common: 'Común', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index e26eada1cdd6..3c01d83e2d24 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1082,8 +1082,7 @@ const message = { containerized: 'コンテナ化', containerName: 'コンテナ名', hostSkillDir: 'Skill ディレクトリ', - hostSkillDirHelper: - '1Panel がインストールされているサーバー上の Skill ディレクトリパスを入力してください。', + hostSkillDirHelper: 'ノードの Skill ディレクトリパスを入力してください。', containerSkillDir: 'コンテナ内 Skill ディレクトリ', installMethod: 'インストール方法', copy: 'コピー', @@ -1120,6 +1119,7 @@ const message = { published: '公開済み', disabled: '非公開', rejected: '却下', + deleted: '削除済み', }, agent: { common: '共通', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 4018d4bf6305..81c4e0030664 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1066,7 +1066,7 @@ const message = { containerized: '컨테이너화', containerName: '컨테이너 이름', hostSkillDir: 'Skill 디렉터리', - hostSkillDirHelper: '1Panel이 설치된 서버의 Skill 디렉터리 경로를 입력하세요.', + hostSkillDirHelper: '노드의 Skill 디렉터리 경로를 입력하세요.', containerSkillDir: '컨테이너 내 Skill 디렉터리', installMethod: '설치 방식', copy: '복사', @@ -1102,6 +1102,7 @@ const message = { published: '게시됨', disabled: '게시 해제됨', rejected: '거부됨', + deleted: '삭제됨', }, agent: { common: '공통', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index dd3a9ff6a146..86b833b05287 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1091,7 +1091,7 @@ const message = { containerized: 'Berkontena', containerName: 'Nama kontena', hostSkillDir: 'Direktori Skill', - hostSkillDirHelper: 'Masukkan laluan direktori Skill pada pelayan tempat 1Panel dipasang.', + hostSkillDirHelper: 'Masukkan laluan direktori Skill pada nod.', containerSkillDir: 'Direktori Skill dalam kontena', installMethod: 'Kaedah pemasangan', copy: 'Salin', @@ -1126,6 +1126,7 @@ const message = { published: 'Diterbitkan', disabled: 'Dinyahterbit', rejected: 'Ditolak', + deleted: 'Dipadam', }, agent: { common: 'Umum', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index 5a793da6ba33..898fa4926ea6 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1087,7 +1087,7 @@ const message = { containerized: 'Conteinerizado', containerName: 'Nome do contêiner', hostSkillDir: 'Diretório de Skills', - hostSkillDirHelper: 'Informe o caminho do diretório de Skills no servidor onde o 1Panel está instalado.', + hostSkillDirHelper: 'Informe o caminho do diretório de Skills no nó.', containerSkillDir: 'Diretório de Skills no contêiner', installMethod: 'Método de instalação', copy: 'Copiar', @@ -1123,6 +1123,7 @@ const message = { published: 'Publicado', disabled: 'Despublicado', rejected: 'Rejeitado', + deleted: 'Excluído', }, agent: { common: 'Comum', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index e1e91efb14f6..60739a8e492c 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1081,7 +1081,7 @@ const message = { containerized: 'В контейнере', containerName: 'Имя контейнера', hostSkillDir: 'Каталог Skills', - hostSkillDirHelper: 'Введите путь к каталогу Skills на сервере, где установлен 1Panel.', + hostSkillDirHelper: 'Введите путь к каталогу Skills на узле.', containerSkillDir: 'Каталог Skills в контейнере', installMethod: 'Способ установки', copy: 'Копировать', @@ -1118,6 +1118,7 @@ const message = { published: 'Опубликован', disabled: 'Снят с публикации', rejected: 'Отклонен', + deleted: 'Удален', }, agent: { common: 'Общий', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index cc977993cbfe..67928f220f68 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -1089,7 +1089,7 @@ const message = { containerized: 'Konteynerli', containerName: 'Konteyner adı', hostSkillDir: 'Skill dizini', - hostSkillDirHelper: '1Panelin kurulu olduğu sunucudaki Skill dizini yolunu girin.', + hostSkillDirHelper: 'Düğümdeki Skill dizini yolunu girin.', containerSkillDir: 'Konteyner içi Skill dizini', installMethod: 'Kurulum yöntemi', copy: 'Kopyala', @@ -1125,6 +1125,7 @@ const message = { published: 'Yayınlandı', disabled: 'Yayından kaldırıldı', rejected: 'Reddedildi', + deleted: 'Silindi', }, agent: { common: 'Ortak', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 55d5ceef458e..f2b49f034227 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1025,7 +1025,7 @@ const message = { containerized: '容器化', containerName: '容器名稱', hostSkillDir: 'Skill 目錄', - hostSkillDirHelper: '請填寫 1Panel 所在伺服器上的 Skill 目錄路徑。', + hostSkillDirHelper: '請填寫節點 Skill 目錄路徑。', containerSkillDir: '容器內 Skill 目錄', installMethod: '安裝方式', copy: '複製', @@ -1058,6 +1058,7 @@ const message = { published: '已上架', disabled: '已下架', rejected: '審核未通過', + deleted: '已刪除', }, agent: { common: '通用', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 8db3b58a61cc..9af9fb8cb6d9 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1019,7 +1019,7 @@ const message = { containerized: '容器化', containerName: '容器名称', hostSkillDir: 'Skill 目录', - hostSkillDirHelper: '请填写 1Panel 所在服务器上的 Skill 目录路径。', + hostSkillDirHelper: '请填写节点 Skill 目录路径。', containerSkillDir: '容器内 Skill 目录', installMethod: '安装方式', copy: '复制', @@ -1052,6 +1052,7 @@ const message = { published: '已上架', disabled: '已下架', rejected: '审核未通过', + deleted: '已删除', }, agent: { common: '通用',