Compare commits

...
Author SHA1 Message Date
guoyuqi 5e12ce056b feat(sync): sync php extended template 2026-11-05 15:42:53 +08:00
guoyuqi c7bd036390 feat(sync): sync php extended template 2026-11-04 16:55:22 +08:00
48 changed files with 731 additions and 21 deletions
+43
View File
@@ -103,3 +103,46 @@ func (b *BaseApi) DeletePHPExtensions(c *gin.Context) {
} }
helper.Success(c) helper.Success(c)
} }
// @Router /runtimes/php/extensions/detail [post]
func (b *BaseApi) GetPHPExtensions(c *gin.Context) {
var req request.PHPExtensionsDelete
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
item, err := phpExtensionsService.Get(req.ID)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, item)
}
// @Router /runtimes/php/extensions/import [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步 PHP 扩展模版 [name]","formatEN":"Sync PHP extension template [name]"}
func (b *BaseApi) ImportPHPExtensions(c *gin.Context) {
var req request.PHPExtensionsCreate
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
status, err := phpExtensionsService.Import(req)
if err != nil {
helper.InternalServer(c, err)
return
}
helper.SuccessWithData(c, status)
}
// @Router /runtimes/php/extensions/push [post]
// @x-panel-log {"bodyKeys":["sourceNode","targetNodes"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"推送 PHP 扩展模版 [sourceNode] 至 [targetNodes]","formatEN":"Push PHP extension template from [sourceNode] to [targetNodes]"}
func (b *BaseApi) PushPHPExtensions(c *gin.Context) {
var req dto.PHPExtensionsPush
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
if err := phpExtensionsService.Push(req); err != nil {
helper.InternalServer(c, err)
return
}
helper.Success(c)
}
+9
View File
@@ -0,0 +1,9 @@
package dto
// PHPExtensionsPush is submitted to the master agent, with an explicit source node.
type PHPExtensionsPush struct {
SourceNode string `json:"sourceNode" validate:"required"`
TargetNodes []string `json:"targetNodes" validate:"required,min=1,dive,required"`
ID uint `json:"id" validate:"required"`
TaskID string `json:"taskID" validate:"required,uuid"`
}
+2 -1
View File
@@ -4,7 +4,8 @@ import "github.com/1Panel-dev/1Panel/agent/app/dto"
type PHPExtensionsSearch struct { type PHPExtensionsSearch struct {
dto.PageInfo dto.PageInfo
All bool `json:"all"` All bool `json:"all"`
Name string `json:"name"`
} }
type PHPExtensionsCreate struct { type PHPExtensionsCreate struct {
+53 -1
View File
@@ -1,13 +1,22 @@
package service package service
import ( import (
"errors"
"sync"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request" "github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/app/dto/response" "github.com/1Panel-dev/1Panel/agent/app/dto/response"
"github.com/1Panel-dev/1Panel/agent/app/model" "github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/app/repo" "github.com/1Panel-dev/1Panel/agent/app/repo"
"github.com/1Panel-dev/1Panel/agent/buserr" "github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/xpack"
"gorm.io/gorm"
) )
var phpExtensionsMu sync.Mutex
type PHPExtensionsService struct { type PHPExtensionsService struct {
} }
@@ -17,6 +26,9 @@ type IPHPExtensionsService interface {
Create(req request.PHPExtensionsCreate) error Create(req request.PHPExtensionsCreate) error
Update(req request.PHPExtensionsUpdate) error Update(req request.PHPExtensionsUpdate) error
Delete(req request.PHPExtensionsDelete) error Delete(req request.PHPExtensionsDelete) error
Get(id uint) (model.PHPExtensions, error)
Import(req request.PHPExtensionsCreate) (string, error)
Push(req dto.PHPExtensionsPush) error
} }
func NewIPHPExtensionsService() IPHPExtensionsService { func NewIPHPExtensionsService() IPHPExtensionsService {
@@ -30,7 +42,7 @@ func (p PHPExtensionsService) Page(req request.PHPExtensionsSearch) (int64, []re
err error err error
result []response.PHPExtensionsDTO result []response.PHPExtensionsDTO
) )
total, extensions, err = phpExtensionsRepo.Page(req.Page, req.PageSize) total, extensions, err = phpExtensionsRepo.Page(req.Page, req.PageSize, repo.WithByLikeName(req.Name))
if err != nil { if err != nil {
return 0, nil, err return 0, nil, err
} }
@@ -61,6 +73,8 @@ func (p PHPExtensionsService) List() ([]response.PHPExtensionsDTO, error) {
} }
func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error { func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, _ := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name)) exist, _ := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if exist.ID > 0 { if exist.ID > 0 {
return buserr.New("ErrNameIsExist") return buserr.New("ErrNameIsExist")
@@ -73,6 +87,8 @@ func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error {
} }
func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error { func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, err := phpExtensionsRepo.GetFirst(repo.WithByID(req.ID)) exist, err := phpExtensionsRepo.GetFirst(repo.WithByID(req.ID))
if err != nil { if err != nil {
return err return err
@@ -82,5 +98,41 @@ func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error {
} }
func (p PHPExtensionsService) Delete(req request.PHPExtensionsDelete) error { func (p PHPExtensionsService) Delete(req request.PHPExtensionsDelete) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
return phpExtensionsRepo.DeleteBy(repo.WithByID(req.ID)) return phpExtensionsRepo.DeleteBy(repo.WithByID(req.ID))
} }
func (p PHPExtensionsService) Get(id uint) (model.PHPExtensions, error) {
return phpExtensionsRepo.GetFirst(repo.WithByID(id))
}
func (p PHPExtensionsService) Import(req request.PHPExtensionsCreate) (string, error) {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
existing, err := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if err == nil {
if existing.Extensions == req.Extensions {
return "skipped", nil
}
return "", buserr.New("ErrPHPExtensionsConflict")
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
return "", err
}
item := model.PHPExtensions{Name: req.Name, Extensions: req.Extensions}
if err := phpExtensionsRepo.Create(&item); err != nil {
return "", err
}
return "created", nil
}
func (p PHPExtensionsService) Push(req dto.PHPExtensionsPush) error {
if !global.IsMaster {
return errors.New("PHP extension template sync must be submitted to the master node")
}
if !xpack.MultiNodeProvider.IsXpack() {
return buserr.New("ErrXpackNotFound")
}
return xpack.MultiNodeProvider.PushPHPExtensionsToNode(req)
}
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Check finished: {{ .checked }} checked, {{ .updates
ContainerImageCheckFailures: "{{ .count }} container checks failed; see the task log" ContainerImageCheckFailures: "{{ .count }} container checks failed; see the task log"
ErrImageCheckProxyRequired: "To check for image updates in the current runtime environment, please configure a proxy server first." ErrImageCheckProxyRequired: "To check for image updates in the current runtime environment, please configure a proxy server first."
ErrPHPExtensionsConflict: "A PHP extension template with this name exists with different content"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Comprobación finalizada: comprobados {{ .checked }
ContainerImageCheckFailures: "Falló la comprobación de {{ .count }} contenedores; consulte el registro de la tarea" ContainerImageCheckFailures: "Falló la comprobación de {{ .count }} contenedores; consulte el registro de la tarea"
ErrImageCheckProxyRequired: "Para comprobar actualizaciones de imágenes en el entorno actual, configura primero un servidor proxy." ErrImageCheckProxyRequired: "Para comprobar actualizaciones de imágenes en el entorno actual, configura primero un servidor proxy."
ErrPHPExtensionsConflict: "Ya existe una plantilla de extensiones PHP con el mismo nombre y distinto contenido; no se ha sobrescrito"
+2
View File
@@ -816,3 +816,5 @@ ContainerImageCheckSummary: "بررسی پایان یافت: بررسی‌شده
ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموفق بود؛ گزارش وظیفه را مشاهده کنید" ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموفق بود؛ گزارش وظیفه را مشاهده کنید"
ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید." ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید."
ErrPHPExtensionsConflict: "الگوی افزونه‌های PHP با این نام و محتوای متفاوت از قبل وجود دارد؛ بازنویسی نشد"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "確認終了:成功 {{ .checked }}、更新可能
ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しました。タスクログを確認してください" ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しました。タスクログを確認してください"
ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。" ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。"
ErrPHPExtensionsConflict: "同名の PHP 拡張テンプレートが異なる内容で存在するため、上書きしませんでした"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "확인 종료: 성공 {{ .checked }}, 업데이트
ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했습니다. 작업 로그를 확인하세요" ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했습니다. 작업 로그를 확인하세요"
ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요." ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요."
ErrPHPExtensionsConflict: "이름은 같지만 내용이 다른 PHP 확장 템플릿이 이미 있어 덮어쓰지 않았습니다"
+2
View File
@@ -806,3 +806,5 @@ ContainerImageCheckSummary: "ກວດສອບສິ້ນສຸດ: ກວດ
ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນເນີລົ້ມເຫຼວ; ກະລຸນາເບິ່ງບັນທຶກວຽກ" ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນເນີລົ້ມເຫຼວ; ກະລຸນາເບິ່ງບັນທຶກວຽກ"
ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ." ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ."
ErrPHPExtensionsConflict: "ມີແມ່ແບບສ່ວນຂະຫຍາຍ PHP ຊື່ດຽວກັນແຕ່ເນື້ອຫາຕ່າງກັນຢູ່ແລ້ວ; ບໍ່ໄດ້ຂຽນທັບ"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Semakan selesai: disemak {{ .checked }}, boleh dike
ContainerImageCheckFailures: "Semakan {{ .count }} kontena gagal; lihat log tugas" ContainerImageCheckFailures: "Semakan {{ .count }} kontena gagal; lihat log tugas"
ErrImageCheckProxyRequired: "Untuk menyemak kemas kini imej dalam persekitaran semasa, sila konfigurasikan pelayan proksi terlebih dahulu." ErrImageCheckProxyRequired: "Untuk menyemak kemas kini imej dalam persekitaran semasa, sila konfigurasikan pelayan proksi terlebih dahulu."
ErrPHPExtensionsConflict: "Templat sambungan PHP dengan nama yang sama tetapi kandungan berbeza sudah wujud; tidak ditulis ganti"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Verificação concluída: verificados {{ .checked }
ContainerImageCheckFailures: "Falha na verificação de {{ .count }} contêineres; consulte o log da tarefa" ContainerImageCheckFailures: "Falha na verificação de {{ .count }} contêineres; consulte o log da tarefa"
ErrImageCheckProxyRequired: "Para verificar atualizações de imagens no ambiente atual, configure primeiro um servidor proxy." ErrImageCheckProxyRequired: "Para verificar atualizações de imagens no ambiente atual, configure primeiro um servidor proxy."
ErrPHPExtensionsConflict: "Já existe um modelo de extensões PHP com o mesmo nome e conteúdo diferente; ele não foi sobrescrito"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Проверка завершена: провере
ContainerImageCheckFailures: "Не удалось проверить контейнеры: {{ .count }}. Подробности в журнале задачи" ContainerImageCheckFailures: "Не удалось проверить контейнеры: {{ .count }}. Подробности в журнале задачи"
ErrImageCheckProxyRequired: "Для проверки обновлений образов в текущей среде сначала настройте прокси-сервер." ErrImageCheckProxyRequired: "Для проверки обновлений образов в текущей среде сначала настройте прокси-сервер."
ErrPHPExtensionsConflict: "Шаблон расширений PHP с таким именем уже существует и имеет другое содержимое; перезапись не выполнена"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "Denetim tamamlandı: denetlenen {{ .checked }}, gü
ContainerImageCheckFailures: "{{ .count }} konteyner denetlenemedi; görev günlüğünü inceleyin" ContainerImageCheckFailures: "{{ .count }} konteyner denetlenemedi; görev günlüğünü inceleyin"
ErrImageCheckProxyRequired: "Geçerli çalışma ortamında imaj güncellemelerini kontrol etmek için önce bir proxy sunucusu yapılandırın." ErrImageCheckProxyRequired: "Geçerli çalışma ortamında imaj güncellemelerini kontrol etmek için önce bir proxy sunucusu yapılandırın."
ErrPHPExtensionsConflict: "Aynı ada sahip farklı içerikli bir PHP eklenti şablonu zaten var; üzerine yazılmadı"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "檢查結束:成功 {{ .checked }},可升級 {{
ContainerImageCheckFailures: "{{ .count }} 個容器檢查失敗,請查看任務日誌" ContainerImageCheckFailures: "{{ .count }} 個容器檢查失敗,請查看任務日誌"
ErrImageCheckProxyRequired: "目前運行環境下,如需檢查映像是否更新,請先設定代理伺服器" ErrImageCheckProxyRequired: "目前運行環境下,如需檢查映像是否更新,請先設定代理伺服器"
ErrPHPExtensionsConflict: "同名 PHP 擴充模版已存在且內容不同,未覆蓋"
+2
View File
@@ -815,3 +815,5 @@ ContainerImageCheckSummary: "检查结束:成功 {{ .checked }},可升级 {{
ContainerImageCheckFailures: "{{ .count }} 个容器检查失败,请查看任务日志" ContainerImageCheckFailures: "{{ .count }} 个容器检查失败,请查看任务日志"
ErrImageCheckProxyRequired: "当前运行环境下,如需检查镜像是否更新,请优先配置代理服务器" ErrImageCheckProxyRequired: "当前运行环境下,如需检查镜像是否更新,请优先配置代理服务器"
ErrPHPExtensionsConflict: "同名 PHP 扩展模版已存在且内容不同,未覆盖"
+3
View File
@@ -27,6 +27,9 @@ func (r *RuntimeRouter) InitRouter(Router *gin.RouterGroup) {
groupRouter.POST("/node/modules/operate", baseApi.OperateNodeModules) groupRouter.POST("/node/modules/operate", baseApi.OperateNodeModules)
groupRouter.POST("/php/extensions/search", baseApi.PagePHPExtensions) groupRouter.POST("/php/extensions/search", baseApi.PagePHPExtensions)
groupRouter.POST("/php/extensions/detail", baseApi.GetPHPExtensions)
groupRouter.POST("/php/extensions/import", baseApi.ImportPHPExtensions)
groupRouter.POST("/php/extensions/push", baseApi.PushPHPExtensions)
groupRouter.POST("/php/extensions", baseApi.CreatePHPExtensions) groupRouter.POST("/php/extensions", baseApi.CreatePHPExtensions)
groupRouter.POST("/php/extensions/update", baseApi.UpdatePHPExtensions) groupRouter.POST("/php/extensions/update", baseApi.UpdatePHPExtensions)
groupRouter.POST("/php/extensions/del", baseApi.DeletePHPExtensions) groupRouter.POST("/php/extensions/del", baseApi.DeletePHPExtensions)
+4
View File
@@ -72,3 +72,7 @@ func (m *multiNodeHelper) PushSSLToNode(websiteSSL *model.WebsiteSSL) error {
func (m *multiNodeHelper) GetAgentInfo() (*dto.AgentInfo, error) { func (m *multiNodeHelper) GetAgentInfo() (*dto.AgentInfo, error) {
return nil, nil return nil, nil
} }
func (m *multiNodeHelper) PushPHPExtensionsToNode(req dto.PHPExtensionsPush) error {
return buserr.New("ErrXpackNotFound")
}
@@ -19,5 +19,6 @@ type MultiNodeProvider interface {
LoadRequestTransport() *http.Transport LoadRequestTransport() *http.Transport
ValidateCertificate(c *gin.Context) bool ValidateCertificate(c *gin.Context) bool
PushSSLToNode(websiteSSL *model.WebsiteSSL) error PushSSLToNode(websiteSSL *model.WebsiteSSL) error
PushPHPExtensionsToNode(req dto.PHPExtensionsPush) error
GetAgentInfo() (*dto.AgentInfo, error) GetAgentInfo() (*dto.AgentInfo, error)
} }
+16 -15
View File
@@ -189,21 +189,22 @@ var WebUrlMap = map[string]struct{}{
"/xpack/monitor/trend": {}, "/xpack/monitor/trend": {},
"/xpack/monitor/websites": {}, "/xpack/monitor/websites": {},
"/xpack/tamper": {}, "/xpack/tamper": {},
"/xpack/gpu": {}, "/xpack/gpu": {},
"/xpack/alert/dashboard": {}, "/xpack/alert/dashboard": {},
"/xpack/alert/log": {}, "/xpack/alert/log": {},
"/xpack/alert/setting": {}, "/xpack/alert/setting": {},
"/xpack/setting": {}, "/xpack/setting": {},
"/xpack/node/dashboard": {}, "/xpack/node/dashboard": {},
"/xpack/node": {}, "/xpack/node": {},
"/xpack/simple-node": {}, "/xpack/simple-node": {},
"/xpack/sync/file": {}, "/xpack/sync/file": {},
"/xpack/sync/image": {}, "/xpack/sync/image": {},
"/xpack/sync/ssl": {}, "/xpack/sync/php-extensions": {},
"/xpack/sync/app": {}, "/xpack/sync/ssl": {},
"/xpack/app": {}, "/xpack/sync/app": {},
"/xpack/app-upgrade": {}, "/xpack/app": {},
"/xpack/app-upgrade": {},
"/xpack/cluster/mysql": {}, "/xpack/cluster/mysql": {},
"/xpack/cluster/postgres": {}, "/xpack/cluster/postgres": {},
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Installation failed and service recovery is incomplet
MCPInstallLocalImage: "The image exists locally; skip downloading" MCPInstallLocalImage: "The image exists locally; skip downloading"
MCPInstallVerifyImage: "Validate the image version and managed service contract" MCPInstallVerifyImage: "Validate the image version and managed service contract"
MCPInstallVerifiedImage: "Image validation passed" MCPInstallVerifiedImage: "Image validation passed"
PHPExtensionsNoTargets: "No target nodes remain after excluding the source node"
PHPExtensionsSyncTask: "Sync PHP extension template [{{ .name }}]"
PHPExtensionsSyncSkipped: "Node [{{ .node }}] already has an identical template; skipped"
MCPInstallCleanup: "Clean up the previous container" MCPInstallCleanup: "Clean up the previous container"
MCPInstallOldContainerRemoved: "Previous container removed" MCPInstallOldContainerRemoved: "Previous container removed"
MCPInstallOldImageRemoved: "Previous image removed" MCPInstallOldImageRemoved: "Previous image removed"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Instalación fallida y recuperación incompleta. Veri
MCPInstallLocalImage: "La imagen ya existe localmente; omitir la descarga" MCPInstallLocalImage: "La imagen ya existe localmente; omitir la descarga"
MCPInstallVerifyImage: "Validar la versión de la imagen y el contrato del servicio administrado" MCPInstallVerifyImage: "Validar la versión de la imagen y el contrato del servicio administrado"
MCPInstallVerifiedImage: "La imagen superó la validación" MCPInstallVerifiedImage: "La imagen superó la validación"
PHPExtensionsNoTargets: "No quedan nodos de destino tras excluir el nodo de origen"
PHPExtensionsSyncTask: "Sincronizar plantilla de extensiones PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "El nodo [{{ .node }}] ya tiene una plantilla idéntica; se ha omitido"
MCPInstallCleanup: "Limpiar el contenedor anterior" MCPInstallCleanup: "Limpiar el contenedor anterior"
MCPInstallOldContainerRemoved: "Contenedor anterior eliminado" MCPInstallOldContainerRemoved: "Contenedor anterior eliminado"
MCPInstallOldImageRemoved: "Imagen anterior eliminada" MCPInstallOldImageRemoved: "Imagen anterior eliminada"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "نصب ناموفق و بازیابی سرویس نا
MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛ دریافت انجام نمی‌شود" MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛ دریافت انجام نمی‌شود"
MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده" MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده"
MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود" MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود"
PHPExtensionsNoTargets: "پس از حذف گره مبدأ از فهرست، هیچ گره مقصدی باقی نمانده است"
PHPExtensionsSyncTask: "همگام‌سازی الگوی افزونه‌های PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "گره [{{ .node }}] از قبل الگوی یکسانی دارد؛ رد شد"
MCPInstallCleanup: "پاک‌سازی کانتینر قبلی" MCPInstallCleanup: "پاک‌سازی کانتینر قبلی"
MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد" MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد"
MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد" MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "インストールに失敗し、サービスの復
MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウンロードをスキップ" MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウンロードをスキップ"
MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証" MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証"
MCPInstallVerifiedImage: "イメージの検証に成功しました" MCPInstallVerifiedImage: "イメージの検証に成功しました"
PHPExtensionsNoTargets: "ソースノードを除外した結果、同期先ノードがありません"
PHPExtensionsSyncTask: "PHP 拡張テンプレート [{{ .name }}] を同期"
PHPExtensionsSyncSkipped: "ノード [{{ .node }}] に同一のテンプレートが存在するため、スキップしました"
MCPInstallCleanup: "以前のコンテナーをクリーンアップ" MCPInstallCleanup: "以前のコンテナーをクリーンアップ"
MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました" MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました"
MCPInstallOldImageRemoved: "以前のイメージを削除しました" MCPInstallOldImageRemoved: "以前のイメージを削除しました"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "설치에 실패했고 서비스 복원이 불완전
MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니다" MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니다"
MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증" MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증"
MCPInstallVerifiedImage: "이미지 검증 통과" MCPInstallVerifiedImage: "이미지 검증 통과"
PHPExtensionsNoTargets: "소스 노드를 제외하면 동기화할 대상 노드가 없습니다"
PHPExtensionsSyncTask: "PHP 확장 템플릿 [{{ .name }}] 동기화"
PHPExtensionsSyncSkipped: "노드 [{{ .node }}]에 동일한 템플릿이 이미 있어 건너뛰었습니다"
MCPInstallCleanup: "이전 컨테이너 정리" MCPInstallCleanup: "이전 컨테이너 정리"
MCPInstallOldContainerRemoved: "이전 컨테이너가 삭제되었습니다" MCPInstallOldContainerRemoved: "이전 컨테이너가 삭제되었습니다"
MCPInstallOldImageRemoved: "이전 이미지가 삭제되었습니다" MCPInstallOldImageRemoved: "이전 이미지가 삭제되었습니다"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "ຕິດຕັ້ງບໍ່ສຳເລັດແ
MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງແລ້ວ; ຂ້າມການດາວໂຫຼດ" MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງແລ້ວ; ຂ້າມການດາວໂຫຼດ"
MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ" MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ"
MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ" MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ"
PHPExtensionsNoTargets: "ບໍ່ມີໂນດປາຍທາງຫຼັງຈາກຍົກເວັ້ນໂນດຕົ້ນທາງ"
PHPExtensionsSyncTask: "ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "ໂນດ [{{ .node }}] ມີແມ່ແບບດຽວກັນຢູ່ແລ້ວ; ຂ້າມແລ້ວ"
MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ" MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ"
MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ" MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ"
MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ" MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Pemasangan gagal dan pemulihan tidak lengkap. Sahkan
MCPInstallLocalImage: "Imej sudah tersedia secara setempat; langkau muat turun" MCPInstallLocalImage: "Imej sudah tersedia secara setempat; langkau muat turun"
MCPInstallVerifyImage: "Sahkan versi imej dan kontrak perkhidmatan terurus" MCPInstallVerifyImage: "Sahkan versi imej dan kontrak perkhidmatan terurus"
MCPInstallVerifiedImage: "Pengesahan imej berjaya" MCPInstallVerifiedImage: "Pengesahan imej berjaya"
PHPExtensionsNoTargets: "Tiada nod sasaran selepas nod sumber dikecualikan"
PHPExtensionsSyncTask: "Segerakkan templat sambungan PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "Nod [{{ .node }}] sudah mempunyai templat yang sama; dilangkau"
MCPInstallCleanup: "Bersihkan bekas terdahulu" MCPInstallCleanup: "Bersihkan bekas terdahulu"
MCPInstallOldContainerRemoved: "Bekas terdahulu dipadam" MCPInstallOldContainerRemoved: "Bekas terdahulu dipadam"
MCPInstallOldImageRemoved: "Imej terdahulu dipadam" MCPInstallOldImageRemoved: "Imej terdahulu dipadam"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Instalação falhou e a recuperação está incomplet
MCPInstallLocalImage: "A imagem já existe localmente; ignorar o download" MCPInstallLocalImage: "A imagem já existe localmente; ignorar o download"
MCPInstallVerifyImage: "Validar a versão da imagem e o contrato do serviço gerenciado" MCPInstallVerifyImage: "Validar a versão da imagem e o contrato do serviço gerenciado"
MCPInstallVerifiedImage: "A imagem passou na validação" MCPInstallVerifiedImage: "A imagem passou na validação"
PHPExtensionsNoTargets: "Não há nós de destino após excluir o nó de origem"
PHPExtensionsSyncTask: "Sincronizar modelo de extensões PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "O nó [{{ .node }}] já possui um modelo idêntico; ignorado"
MCPInstallCleanup: "Limpar o contêiner anterior" MCPInstallCleanup: "Limpar o contêiner anterior"
MCPInstallOldContainerRemoved: "Contêiner anterior removido" MCPInstallOldContainerRemoved: "Contêiner anterior removido"
MCPInstallOldImageRemoved: "Imagem anterior removida" MCPInstallOldImageRemoved: "Imagem anterior removida"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Установка не удалась, служба
MCPInstallLocalImage: "Образ уже есть локально; пропустить загрузку" MCPInstallLocalImage: "Образ уже есть локально; пропустить загрузку"
MCPInstallVerifyImage: "Проверить версию образа и контракт управляемой службы" MCPInstallVerifyImage: "Проверить версию образа и контракт управляемой службы"
MCPInstallVerifiedImage: "Образ успешно проверен" MCPInstallVerifiedImage: "Образ успешно проверен"
PHPExtensionsNoTargets: "После исключения исходного узла не осталось целевых узлов"
PHPExtensionsSyncTask: "Синхронизация шаблона расширений PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "На узле [{{ .node }}] уже есть идентичный шаблон; пропущено"
MCPInstallCleanup: "Очистка предыдущего контейнера" MCPInstallCleanup: "Очистка предыдущего контейнера"
MCPInstallOldContainerRemoved: "Предыдущий контейнер удалён" MCPInstallOldContainerRemoved: "Предыдущий контейнер удалён"
MCPInstallOldImageRemoved: "Предыдущий образ удалён" MCPInstallOldImageRemoved: "Предыдущий образ удалён"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Kurulum başarısız ve hizmet tam geri yüklenemedi.
MCPInstallLocalImage: "İmaj yerel olarak mevcut; indirmeyi atla" MCPInstallLocalImage: "İmaj yerel olarak mevcut; indirmeyi atla"
MCPInstallVerifyImage: "İmaj sürümünü ve yönetilen hizmet sözleşmesini doğrula" MCPInstallVerifyImage: "İmaj sürümünü ve yönetilen hizmet sözleşmesini doğrula"
MCPInstallVerifiedImage: "İmaj doğrulaması başarılı" MCPInstallVerifiedImage: "İmaj doğrulaması başarılı"
PHPExtensionsNoTargets: "Kaynak düğüm hariç tutulduktan sonra hedef düğüm kalmadı"
PHPExtensionsSyncTask: "PHP eklenti şablonunu eşitle [{{ .name }}]"
PHPExtensionsSyncSkipped: "[{{ .node }}] düğümünde aynı şablon zaten var; atlandı"
MCPInstallCleanup: "Önceki konteyneri temizle" MCPInstallCleanup: "Önceki konteyneri temizle"
MCPInstallOldContainerRemoved: "Önceki konteyner silindi" MCPInstallOldContainerRemoved: "Önceki konteyner silindi"
MCPInstallOldImageRemoved: "Önceki imaj silindi" MCPInstallOldImageRemoved: "Önceki imaj silindi"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安裝失敗且原服務還原不完整,請核對
MCPInstallLocalImage: "本機映像已存在,略過下載" MCPInstallLocalImage: "本機映像已存在,略過下載"
MCPInstallVerifyImage: "驗證映像版本及受管契約" MCPInstallVerifyImage: "驗證映像版本及受管契約"
MCPInstallVerifiedImage: "映像驗證通過" MCPInstallVerifiedImage: "映像驗證通過"
PHPExtensionsNoTargets: "排除來源節點後,沒有可同步的目標節點"
PHPExtensionsSyncTask: "同步 PHP 擴充模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "節點 [{{ .node }}] 已存在相同模版,略過"
MCPInstallCleanup: "正在清理舊容器" MCPInstallCleanup: "正在清理舊容器"
MCPInstallOldContainerRemoved: "舊容器已刪除" MCPInstallOldContainerRemoved: "舊容器已刪除"
MCPInstallOldImageRemoved: "舊映像已刪除" MCPInstallOldImageRemoved: "舊映像已刪除"
+4
View File
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安装失败且原服务恢复不完整,请核对
MCPInstallLocalImage: "本地镜像已存在,跳过下载" MCPInstallLocalImage: "本地镜像已存在,跳过下载"
MCPInstallVerifyImage: "校验镜像版本和受管契约" MCPInstallVerifyImage: "校验镜像版本和受管契约"
MCPInstallVerifiedImage: "镜像校验通过" MCPInstallVerifiedImage: "镜像校验通过"
PHPExtensionsNoTargets: "排除源节点后,没有可同步的目标节点"
PHPExtensionsSyncTask: "同步 PHP 扩展模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "节点 [{{ .node }}] 已存在相同模版,跳过"
MCPInstallCleanup: "正在清理旧容器" MCPInstallCleanup: "正在清理旧容器"
MCPInstallOldContainerRemoved: "旧容器已删除" MCPInstallOldContainerRemoved: "旧容器已删除"
MCPInstallOldImageRemoved: "旧镜像已删除" MCPInstallOldImageRemoved: "旧镜像已删除"
+3 -1
View File
@@ -199,5 +199,7 @@ func checkSession(c *gin.Context, refresh bool) bool {
} }
func isLocalAPI(urlPath string) bool { func isLocalAPI(urlPath string) bool {
return urlPath == "/api/v2/core/xpack/sync/ssl" || urlPath == "/api/v2/core/xpack/settings/search" return urlPath == "/api/v2/core/xpack/sync/ssl" ||
urlPath == "/api/v2/core/xpack/sync/php/extensions" ||
urlPath == "/api/v2/core/xpack/settings/search"
} }
+1 -1
View File
@@ -98,7 +98,7 @@ func isLocalSyncRequest(reqPath, clientIP, token string) bool {
} }
switch reqPath { switch reqPath {
case "/api/v2/core/xpack/sync/ssl": case "/api/v2/core/xpack/sync/ssl", "/api/v2/core/xpack/sync/php/extensions":
return token != "" return token != ""
case "/api/v2/core/settings/ssl/reload": case "/api/v2/core/settings/ssl/reload":
return token != "" return token != ""
+7
View File
@@ -1,6 +1,13 @@
import { CommonModel, ReqPage } from '.'; import { CommonModel, ReqPage } from '.';
import { App } from './app'; import { App } from './app';
export namespace Runtime { export namespace Runtime {
export interface PHPExtensionsPush {
sourceNode: string;
targetNodes: string[];
id: number;
taskID: string;
}
export interface Runtime extends CommonModel { export interface Runtime extends CommonModel {
name: string; name: string;
appDetailID: number; appDetailID: number;
+11 -2
View File
@@ -46,8 +46,13 @@ export const OperateNodeModule = (req: Runtime.NodeModuleReq) => {
return http.post<any>(`/runtimes/node/modules/operate`, req, TimeoutEnum.T_10M); return http.post<any>(`/runtimes/node/modules/operate`, req, TimeoutEnum.T_10M);
}; };
export const SearchPHPExtensions = (req: ReqPage) => { export const SearchPHPExtensions = (req: ReqPage & { name?: string }, currentNode?: string) => {
return http.post<ResPage<Runtime.PHPExtensions>>(`/runtimes/php/extensions/search`, req); return http.post<ResPage<Runtime.PHPExtensions>>(
`/runtimes/php/extensions/search`,
req,
undefined,
currentNode ? { CurrentNode: currentNode } : undefined,
);
}; };
export const ListPHPExtensions = (req: Runtime.PHPExtensionsList) => { export const ListPHPExtensions = (req: Runtime.PHPExtensionsList) => {
@@ -137,3 +142,7 @@ export const updateRemark = (req: Runtime.RemarkUpdate) => {
export const getFPMStatus = (id: number) => { export const getFPMStatus = (id: number) => {
return http.get<Runtime.FpmStatus[]>(`/runtimes/php/fpm/status/${id}`); return http.get<Runtime.FpmStatus[]>(`/runtimes/php/fpm/status/${id}`);
}; };
export const PushPHPExtensions = (req: Runtime.PHPExtensionsPush) => {
return http.post(`/runtimes/php/extensions/push`, req, undefined, { CurrentNode: 'local' });
};
+43
View File
@@ -4009,6 +4009,13 @@ const message = {
nodeApp: 'Upgrade to Commercial Edition to upgrade multi-node app versions without switching nodes manually.', nodeApp: 'Upgrade to Commercial Edition to upgrade multi-node app versions without switching nodes manually.',
nodeDashboard: nodeDashboard:
'Upgrade to Commercial Edition for centralized management of multi-node apps, websites, databases, and scheduled tasks.', 'Upgrade to Commercial Edition for centralized management of multi-node apps, websites, databases, and scheduled tasks.',
imageExchange: 'Upgrade to Commercial Edition to transfer container images between nodes in batches.',
appExchange:
'Upgrade to Commercial Edition to migrate installed applications to target nodes and confirm their resource dependencies.',
sslSync:
'Upgrade to Commercial Edition to synchronize certificates from a source node to one or more target nodes.',
phpExtensionsSync:
'Upgrade to Commercial Edition to synchronize PHP extension templates to one or more target nodes.',
fileExchange: 'Upgrade to Commercial Edition to transfer files quickly between servers.', fileExchange: 'Upgrade to Commercial Edition to transfer files quickly between servers.',
app: 'Upgrade to Commercial Edition to view service details, anomaly monitoring, and more in the mobile app.', app: 'Upgrade to Commercial Edition to view service details, anomaly monitoring, and more in the mobile app.',
cluster: 'Upgrade to Commercial Edition to manage MySQL/Postgres/Redis primary-replica clusters.', cluster: 'Upgrade to Commercial Edition to manage MySQL/Postgres/Redis primary-replica clusters.',
@@ -7036,6 +7043,35 @@ const message = {
nodeContent3: "Real-time monitoring of each node's operational status", nodeContent3: "Real-time monitoring of each node's operational status",
nodeTitle4: 'Quick Remote Connection', nodeTitle4: 'Quick Remote Connection',
nodeContent4: 'One-click direct connection to node remote terminals', nodeContent4: 'One-click direct connection to node remote terminals',
imageExchangeTitle1: 'Select source images',
imageExchangeContent1: 'Browse container images on the source node and select the images to transfer.',
imageExchangeTitle2: 'Distribute images',
imageExchangeContent2: 'Transfer selected images to one or more target nodes.',
imageExchangeTitle3: 'View transfer logs',
imageExchangeContent3: 'Track image transfer progress and results in task logs.',
appExchangeTitle1: 'Select an application',
appExchangeContent1: 'Browse installed applications on the source node and select one to migrate.',
appExchangeTitle2: 'Confirm dependencies',
appExchangeContent2: 'Confirm target nodes and required resources, such as databases, before migration.',
appExchangeTitle3: 'Migrate applications',
appExchangeContent3:
'Transfer application backups to target nodes for restoration and view results in task logs.',
sslSyncTitle1: 'Select certificates',
sslSyncContent1: 'Browse certificate details on the source node and select certificates to synchronize.',
sslSyncTitle2: 'Synchronize across nodes',
sslSyncContent2:
'Synchronize selected certificates to target nodes, automatically excluding the source node.',
sslSyncTitle3: 'Confirm sync tasks',
sslSyncContent3: 'Review target nodes and certificates before execution, then view results in task logs.',
phpExtensionsSyncTitle1: 'Select a template',
phpExtensionsSyncContent1:
'Browse template names and extension lists on the source node and select a template to synchronize.',
phpExtensionsSyncTitle2: 'Synchronize templates',
phpExtensionsSyncContent2:
'Synchronize the selected template to target nodes, automatically excluding the source node.',
phpExtensionsSyncTitle3: 'Check existing templates',
phpExtensionsSyncContent3:
'Skip templates with identical names and content. Report conflicts without overwriting different content.',
fileExchangeTitle1: 'Key Authentication Transmission', fileExchangeTitle1: 'Key Authentication Transmission',
fileExchangeContent1: 'Authenticate via SSH keys to ensure transmission security.', fileExchangeContent1: 'Authenticate via SSH keys to ensure transmission security.',
fileExchangeTitle2: 'Efficient File Synchronization', fileExchangeTitle2: 'Efficient File Synchronization',
@@ -7550,6 +7586,13 @@ const message = {
imageBatchConfirmPrefix: 'About to transfer {0} images to {1} nodes, for a total of {2} tasks.', imageBatchConfirmPrefix: 'About to transfer {0} images to {1} nodes, for a total of {2} tasks.',
ssl: 'Certificate Sync', ssl: 'Certificate Sync',
phpExtensions: 'PHP Extension Template Sync',
phpExtensionsTitle: 'Extension Template Sync',
phpExtensionsDesc: 'Select a source node to sync its PHP extension template to target nodes.',
phpExtensionsList: 'PHP extensions',
phpExtensionsConfirm: 'Sync {0} PHP extension template(s) to {1} node(s).',
phpExtensionsConflictHint:
'Identical templates are skipped. Same-name templates with different content are reported as conflicts and will not be overwritten.',
sslBatchDesc: sslBatchDesc:
'After selecting a source node, sync the specified certificate into the current panel environment.', 'After selecting a source node, sync the specified certificate into the current panel environment.',
sslBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.', sslBatchConfirmPrefix: 'About to sync {0} certificates to {1} nodes, for a total of {2} tasks.',
+51
View File
@@ -4086,6 +4086,14 @@ const message = {
'Actualizar a la edición comercial permite actualizar versiones de aplicaciones multinodo sin cambiar de nodo manualmente.', 'Actualizar a la edición comercial permite actualizar versiones de aplicaciones multinodo sin cambiar de nodo manualmente.',
nodeDashboard: nodeDashboard:
'Actualizar a la edición comercial permite la gestión centralizada de aplicaciones, sitios web, bases de datos y tareas programadas multinodo.', 'Actualizar a la edición comercial permite la gestión centralizada de aplicaciones, sitios web, bases de datos y tareas programadas multinodo.',
imageExchange:
'Actualice a la edición comercial para transferir imágenes de contenedores entre nodos por lotes.',
appExchange:
'Actualice a la edición comercial para migrar aplicaciones instaladas a nodos de destino y confirmar sus recursos dependientes.',
sslSync:
'Actualice a la edición comercial para sincronizar certificados del nodo de origen con uno o varios nodos de destino.',
phpExtensionsSync:
'Actualice a la edición comercial para sincronizar plantillas de extensiones PHP con uno o varios nodos de destino.',
fileExchange: 'La edición comercial permite transferir archivos entre varios servidores.', fileExchange: 'La edición comercial permite transferir archivos entre varios servidores.',
app: 'La edición comercial permite ver información de servicio, monitoreo, etc. vía app móvil.', app: 'La edición comercial permite ver información de servicio, monitoreo, etc. vía app móvil.',
cluster: cluster:
@@ -7149,6 +7157,41 @@ const message = {
nodeContent3: 'Supervisa en tiempo real el estado operativo de cada nodo', nodeContent3: 'Supervisa en tiempo real el estado operativo de cada nodo',
nodeTitle4: 'Conexión Remota Rápida', nodeTitle4: 'Conexión Remota Rápida',
nodeContent4: 'Conecta directamente a la terminal remota de un nodo con un clic', nodeContent4: 'Conecta directamente a la terminal remota de un nodo con un clic',
imageExchangeTitle1: 'Seleccionar imágenes de origen',
imageExchangeContent1:
'Consulte las imágenes de contenedores del nodo de origen y seleccione las que desea transferir.',
imageExchangeTitle2: 'Distribuir imágenes por lotes',
imageExchangeContent2: 'Transfiera las imágenes seleccionadas a uno o varios nodos de destino.',
imageExchangeTitle3: 'Consultar registros de transferencia',
imageExchangeContent3:
'Consulte el progreso y los resultados de la transferencia de imágenes en los registros de tareas.',
appExchangeTitle1: 'Seleccionar una aplicación',
appExchangeContent1:
'Consulte las aplicaciones instaladas en el nodo de origen y seleccione la que desea migrar.',
appExchangeTitle2: 'Confirmar dependencias',
appExchangeContent2:
'Confirme los nodos de destino y los recursos necesarios, como bases de datos, antes de la migración.',
appExchangeTitle3: 'Migrar aplicaciones',
appExchangeContent3:
'Transfiera copias de seguridad de aplicaciones a los nodos de destino para restaurarlas y consulte los resultados en los registros de tareas.',
sslSyncTitle1: 'Seleccionar certificados',
sslSyncContent1:
'Consulte los detalles de los certificados del nodo de origen y seleccione los que desea sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nodos',
sslSyncContent2:
'Sincronice los certificados seleccionados con los nodos de destino, excluyendo automáticamente el nodo de origen.',
sslSyncTitle3: 'Confirmar tareas de sincronización',
sslSyncContent3:
'Revise los nodos de destino y los certificados antes de ejecutar la tarea y consulte los resultados en sus registros.',
phpExtensionsSyncTitle1: 'Seleccionar una plantilla',
phpExtensionsSyncContent1:
'Consulte los nombres de las plantillas y sus extensiones en el nodo de origen y seleccione la plantilla que desea sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar plantillas entre nodos',
phpExtensionsSyncContent2:
'Sincronice la plantilla seleccionada con los nodos de destino, excluyendo automáticamente el nodo de origen.',
phpExtensionsSyncTitle3: 'Comprobar plantillas existentes',
phpExtensionsSyncContent3:
'Se omiten las plantillas con el mismo nombre y contenido. Si el contenido difiere, se informa del conflicto sin sobrescribirlas.',
fileExchangeTitle1: 'Transmisión con Autenticación por Claves', fileExchangeTitle1: 'Transmisión con Autenticación por Claves',
fileExchangeContent1: 'Autenticación vía claves SSH para garantizar seguridad en la transmisión.', fileExchangeContent1: 'Autenticación vía claves SSH para garantizar seguridad en la transmisión.',
fileExchangeTitle2: 'Sincronización de Archivos Eficiente', fileExchangeTitle2: 'Sincronización de Archivos Eficiente',
@@ -7667,6 +7710,14 @@ const message = {
imageBatchConfirmPrefix: 'Se enviarán {0} imágenes a {1} nodos, creando {2} tareas.', imageBatchConfirmPrefix: 'Se enviarán {0} imágenes a {1} nodos, creando {2} tareas.',
ssl: 'Sincronización de certificados', ssl: 'Sincronización de certificados',
phpExtensions: 'Sincronización de plantillas de extensiones PHP',
phpExtensionsTitle: 'Sincronización de plantillas de extensiones',
phpExtensionsDesc:
'Seleccione un nodo de origen para sincronizar su plantilla de extensiones PHP con los nodos de destino.',
phpExtensionsList: 'Lista de extensiones',
phpExtensionsConfirm: 'Se sincronizarán {0} plantillas de extensiones PHP con {1} nodos.',
phpExtensionsConflictHint:
'Se omiten las plantillas con el mismo nombre y contenido. Si el nombre coincide pero el contenido difiere, se informa del conflicto sin sobrescribirlas.',
sslBatchDesc: sslBatchDesc:
'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.', 'Después de seleccionar el nodo de origen, los certificados especificados pueden sincronizarse con el entorno actual del panel.',
sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.', sslBatchConfirmPrefix: 'Se sincronizarán {0} certificados a {1} nodos, creando {2} tareas.',
+42
View File
@@ -3973,6 +3973,10 @@ const message = {
nodeApp: 'برای ارتقاء نسخه برنامه‌های چند گره بدون نیاز به جابجایی دستی بین گره‌ها به نسخه تجاری ارتقاء دهید.', nodeApp: 'برای ارتقاء نسخه برنامه‌های چند گره بدون نیاز به جابجایی دستی بین گره‌ها به نسخه تجاری ارتقاء دهید.',
nodeDashboard: nodeDashboard:
'برای مدیریت متمرکز برنامه‌ها، وب‌سایت‌ها، پایگاه‌های داده و وظایف زمان‌بندی شده چند گره به نسخه تجاری ارتقاء دهید.', 'برای مدیریت متمرکز برنامه‌ها، وب‌سایت‌ها، پایگاه‌های داده و وظایف زمان‌بندی شده چند گره به نسخه تجاری ارتقاء دهید.',
imageExchange: 'برای انتقال گروهی تصاویر کانتینر بین گره‌ها، به نسخه تجاری ارتقا دهید.',
appExchange: 'برای انتقال برنامه‌های نصب‌شده به گره‌های مقصد و تأیید منابع وابسته، به نسخه تجاری ارتقا دهید.',
sslSync: 'برای همگام‌سازی گواهی‌های گره مبدأ با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
phpExtensionsSync: 'برای همگام‌سازی الگوهای افزونه‌های PHP با یک یا چند گره مقصد، به نسخه تجاری ارتقا دهید.',
fileExchange: 'برای انتقال سریع فایل‌ها بین سرورها به نسخه تجاری ارتقاء دهید.', fileExchange: 'برای انتقال سریع فایل‌ها بین سرورها به نسخه تجاری ارتقاء دهید.',
app: 'برای مشاهده جزئیات سرویس، نظارت بر ناهنجاری‌ها و موارد دیگر در برنامه موبایل به نسخه تجاری ارتقاء دهید.', app: 'برای مشاهده جزئیات سرویس، نظارت بر ناهنجاری‌ها و موارد دیگر در برنامه موبایل به نسخه تجاری ارتقاء دهید.',
cluster: 'برای مدیریت خوشه‌های اصلی-برده MySQL/Postgres/Redis به نسخه تجاری ارتقاء دهید.', cluster: 'برای مدیریت خوشه‌های اصلی-برده MySQL/Postgres/Redis به نسخه تجاری ارتقاء دهید.',
@@ -6991,6 +6995,37 @@ const message = {
nodeContent3: 'نظارت بر وضعیت عملیاتی هر گره به صورت بلادرنگ', nodeContent3: 'نظارت بر وضعیت عملیاتی هر گره به صورت بلادرنگ',
nodeTitle4: 'اتصال سریع از راه دور', nodeTitle4: 'اتصال سریع از راه دور',
nodeContent4: 'اتصال مستقیم یک‌کلیکی به ترمینال‌های از راه دور گره', nodeContent4: 'اتصال مستقیم یک‌کلیکی به ترمینال‌های از راه دور گره',
imageExchangeTitle1: 'انتخاب تصاویر مبدأ',
imageExchangeContent1: 'تصاویر کانتینر در گره مبدأ را مشاهده و تصاویر موردنظر برای انتقال را انتخاب کنید.',
imageExchangeTitle2: 'توزیع گروهی تصاویر',
imageExchangeContent2: 'تصاویر انتخاب‌شده را به یک یا چند گره مقصد انتقال دهید.',
imageExchangeTitle3: 'مشاهده گزارش‌های انتقال',
imageExchangeContent3: 'پیشرفت و نتایج انتقال تصاویر را در گزارش‌های وظایف مشاهده کنید.',
appExchangeTitle1: 'انتخاب برنامه مبدأ',
appExchangeContent1:
'برنامه‌های نصب‌شده در گره مبدأ را مشاهده و برنامه موردنظر برای انتقال را انتخاب کنید.',
appExchangeTitle2: 'تأیید وابستگی‌ها',
appExchangeContent2: 'پیش از انتقال، گره‌های مقصد و منابع موردنیاز مانند پایگاه‌های داده را تأیید کنید.',
appExchangeTitle3: 'انتقال برنامه‌ها',
appExchangeContent3:
'نسخه‌های پشتیبان برنامه‌ها را برای بازیابی به گره‌های مقصد انتقال دهید و نتایج را در گزارش‌های وظایف مشاهده کنید.',
sslSyncTitle1: 'انتخاب گواهی‌ها',
sslSyncContent1: 'اطلاعات گواهی‌های گره مبدأ را مشاهده و گواهی‌های موردنظر برای همگام‌سازی را انتخاب کنید.',
sslSyncTitle2: 'همگام‌سازی گواهی‌ها بین گره‌ها',
sslSyncContent2:
'گواهی‌های انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
sslSyncTitle3: 'تأیید وظایف همگام‌سازی',
sslSyncContent3:
'پیش از اجرا، گره‌های مقصد و گواهی‌ها را بررسی کنید و سپس نتایج را در گزارش‌های وظایف مشاهده کنید.',
phpExtensionsSyncTitle1: 'انتخاب الگوی افزونه‌ها',
phpExtensionsSyncContent1:
'نام الگوها و فهرست افزونه‌های گره مبدأ را مشاهده و الگوی موردنظر برای همگام‌سازی را انتخاب کنید.',
phpExtensionsSyncTitle2: 'همگام‌سازی الگوها بین گره‌ها',
phpExtensionsSyncContent2:
'الگوی انتخاب‌شده را با گره‌های مقصد همگام‌سازی کنید؛ گره مبدأ به‌طور خودکار از فهرست مقصدها حذف می‌شود.',
phpExtensionsSyncTitle3: 'بررسی الگوهای هم‌نام',
phpExtensionsSyncContent3:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. در صورت تفاوت محتوا، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
fileExchangeTitle1: 'انتقال احراز هویت کلید', fileExchangeTitle1: 'انتقال احراز هویت کلید',
fileExchangeContent1: 'از طریق کلیدهای SSH احراز هویت کنید تا امنیت انتقال تضمین شود.', fileExchangeContent1: 'از طریق کلیدهای SSH احراز هویت کنید تا امنیت انتقال تضمین شود.',
fileExchangeTitle2: 'همگام‌سازی کارآمد فایل', fileExchangeTitle2: 'همگام‌سازی کارآمد فایل',
@@ -7508,6 +7543,13 @@ const message = {
imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.', imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.',
ssl: 'همگام‌سازی گواهی', ssl: 'همگام‌سازی گواهی',
phpExtensions: 'همگام‌سازی الگوی افزونه‌های PHP',
phpExtensionsTitle: 'همگام‌سازی الگوی افزونه‌ها',
phpExtensionsDesc: 'گره مبدأ را برای همگام‌سازی الگوی افزونه‌های PHP آن با گره‌های مقصد انتخاب کنید.',
phpExtensionsList: 'فهرست افزونه‌ها',
phpExtensionsConfirm: '{0} الگوی افزونه‌های PHP با {1} گره همگام‌سازی می‌شود.',
phpExtensionsConflictHint:
'الگوهای دارای نام و محتوای یکسان رد می‌شوند. اگر نام یکسان اما محتوا متفاوت باشد، تعارض گزارش می‌شود و الگو بازنویسی نخواهد شد.',
sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.', sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.', sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',
+41
View File
@@ -3990,6 +3990,12 @@ const message = {
'商用版にアップグレードすると、ノードを手動で切り替えずにマルチノードアプリのバージョンを一括アップグレードできます。', '商用版にアップグレードすると、ノードを手動で切り替えずにマルチノードアプリのバージョンを一括アップグレードできます。',
nodeDashboard: nodeDashboard:
'商用版にアップグレードすると、マルチノードのアプリ、Web サイト、データベース、スケジュールタスクを一元管理できます。', '商用版にアップグレードすると、マルチノードのアプリ、Web サイト、データベース、スケジュールタスクを一元管理できます。',
imageExchange: '商用版にアップグレードすると、ノード間でコンテナーイメージを一括転送できます。',
appExchange:
'商用版にアップグレードすると、インストール済みアプリをターゲットノードに移行し、必要な依存リソースを確認できます。',
sslSync: '商用版にアップグレードすると、ソースノードの証明書を1つ以上のターゲットノードに同期できます。',
phpExtensionsSync:
'商用版にアップグレードすると、PHP 拡張テンプレートを1つ以上のターゲットノードに同期できます。',
fileExchange: '商用版にアップグレードすると、複数サーバー間でファイルをすばやく転送できます。', fileExchange: '商用版にアップグレードすると、複数サーバー間でファイルをすばやく転送できます。',
cluster: '商用版にアップグレードすると、MySQL/Postgres/Redis のプライマリ/レプリカ構成を管理できます。', cluster: '商用版にアップグレードすると、MySQL/Postgres/Redis のプライマリ/レプリカ構成を管理できます。',
vllm: '商用版にアップグレードすると、1Panel で vLLM サービスのデプロイ、設定、ライフサイクル操作、タスク追跡を一元管理できます。', vllm: '商用版にアップグレードすると、1Panel で vLLM サービスのデプロイ、設定、ライフサイクル操作、タスク追跡を一元管理できます。',
@@ -7024,6 +7030,34 @@ const message = {
nodeContent3: '各ノードの運用状況をリアルタイムで把握', nodeContent3: '各ノードの運用状況をリアルタイムで把握',
nodeTitle4: '迅速なリモート接続', nodeTitle4: '迅速なリモート接続',
nodeContent4: 'ワンクリックでノードリモート端末に直接接続', nodeContent4: 'ワンクリックでノードリモート端末に直接接続',
imageExchangeTitle1: 'ソースイメージの選択',
imageExchangeContent1: 'ソースノードのコンテナーイメージを確認し、転送するイメージを選択します。',
imageExchangeTitle2: 'イメージの一括配布',
imageExchangeContent2: '選択したイメージを1つ以上のターゲットノードに転送します。',
imageExchangeTitle3: '転送ログの確認',
imageExchangeContent3: 'タスクログでイメージ転送の進捗と実行結果を確認できます。',
appExchangeTitle1: 'ソースアプリの選択',
appExchangeContent1: 'ソースノードのインストール済みアプリを確認し、移行するアプリを選択します。',
appExchangeTitle2: '依存リソースの確認',
appExchangeContent2: '移行前にターゲットノードと、データベースなどの必要なリソースを確認します。',
appExchangeTitle3: 'アプリの移行',
appExchangeContent3:
'アプリのバックアップをターゲットノードに転送して復元し、タスクログで結果を確認できます。',
sslSyncTitle1: 'ソース証明書の選択',
sslSyncContent1: 'ソースノードの証明書情報を確認し、同期する証明書を選択します。',
sslSyncTitle2: '複数ノードへの証明書同期',
sslSyncContent2: 'ソースノードを自動的に除外し、選択した証明書をターゲットノードに同期します。',
sslSyncTitle3: '同期タスクの確認',
sslSyncContent3: '実行前にターゲットノードと証明書を確認し、タスクログで同期結果を確認できます。',
phpExtensionsSyncTitle1: '拡張テンプレートの選択',
phpExtensionsSyncContent1:
'ソースノードのテンプレート名と拡張機能一覧を確認し、同期するテンプレートを選択します。',
phpExtensionsSyncTitle2: '複数ノードへのテンプレート同期',
phpExtensionsSyncContent2:
'ソースノードを自動的に除外し、選択したテンプレートをターゲットノードに同期します。',
phpExtensionsSyncTitle3: '同名テンプレートの確認',
phpExtensionsSyncContent3:
'同名で内容も同じテンプレートはスキップします。内容が異なる場合は競合を報告し、上書きしません。',
fileExchangeTitle1: 'キー認証伝送', fileExchangeTitle1: 'キー認証伝送',
fileExchangeContent1: 'SSHキーを介して認証し、伝送のセキュリティを確保します。', fileExchangeContent1: 'SSHキーを介して認証し、伝送のセキュリティを確保します。',
fileExchangeTitle2: '効率的なファイル同期', fileExchangeTitle2: '効率的なファイル同期',
@@ -7538,6 +7572,13 @@ const message = {
'{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。', '{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。',
ssl: '証明書同期', ssl: '証明書同期',
phpExtensions: 'PHP 拡張テンプレート同期',
phpExtensionsTitle: '拡張テンプレート同期',
phpExtensionsDesc: 'ソースノードを選択すると、PHP 拡張テンプレートをターゲットノードに同期できます。',
phpExtensionsList: '拡張機能一覧',
phpExtensionsConfirm: '{0} 件の PHP 拡張テンプレートを {1} 個のノードに同期します。',
phpExtensionsConflictHint:
'同名で内容も同じテンプレートはスキップします。同名で内容が異なる場合は競合を報告し、上書きしません。',
sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。', sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。', sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',
+38
View File
@@ -3920,6 +3920,12 @@ const message = {
'상용 버전으로 업그레이드하면 노드를 수동으로 전환하지 않고도 다중 노드 애플리케이션 버전을 일괄 업그레이드할 수 있습니다.', '상용 버전으로 업그레이드하면 노드를 수동으로 전환하지 않고도 다중 노드 애플리케이션 버전을 일괄 업그레이드할 수 있습니다.',
nodeDashboard: nodeDashboard:
'상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.', '상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.',
imageExchange: '상용 버전으로 업그레이드하면 노드 간에 컨테이너 이미지를 일괄 전송할 수 있습니다.',
appExchange:
'상용 버전으로 업그레이드하면 설치된 앱을 대상 노드로 이전하고 필요한 종속 리소스를 확인할 수 있습니다.',
sslSync: '상용 버전으로 업그레이드하면 소스 노드의 인증서를 하나 이상의 대상 노드에 동기화할 수 있습니다.',
phpExtensionsSync:
'상용 버전으로 업그레이드하면 PHP 확장 템플릿을 하나 이상의 대상 노드에 동기화할 수 있습니다.',
fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.', fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.',
app: '상용 버전으로 업그레이드하면 모바일 앱에서 서비스 정보와 이상 모니터링을 확인할 수 있습니다.', app: '상용 버전으로 업그레이드하면 모바일 앱에서 서비스 정보와 이상 모니터링을 확인할 수 있습니다.',
cluster: '상용 버전으로 업그레이드하면 MySQL/Postgres/Redis 기본-복제 클러스터를 관리할 수 있습니다.', cluster: '상용 버전으로 업그레이드하면 MySQL/Postgres/Redis 기본-복제 클러스터를 관리할 수 있습니다.',
@@ -6883,6 +6889,31 @@ const message = {
nodeContent3: '각 노드의 운영 상태를 실시간으로 파악', nodeContent3: '각 노드의 운영 상태를 실시간으로 파악',
nodeTitle4: '빠른 원격 연결', nodeTitle4: '빠른 원격 연결',
nodeContent4: '원클릭으로 노드 원격 터미널에 직접 연결', nodeContent4: '원클릭으로 노드 원격 터미널에 직접 연결',
imageExchangeTitle1: '소스 이미지 선택',
imageExchangeContent1: '소스 노드의 컨테이너 이미지를 확인하고 전송할 이미지를 선택합니다.',
imageExchangeTitle2: '이미지 일괄 배포',
imageExchangeContent2: '선택한 이미지를 하나 이상의 대상 노드로 전송합니다.',
imageExchangeTitle3: '전송 로그 확인',
imageExchangeContent3: '작업 로그에서 이미지 전송 진행 상황과 실행 결과를 확인합니다.',
appExchangeTitle1: '소스 앱 선택',
appExchangeContent1: '소스 노드에 설치된 앱을 확인하고 이전할 앱을 선택합니다.',
appExchangeTitle2: '종속 리소스 확인',
appExchangeContent2: '이전 전에 대상 노드와 데이터베이스 등 필요한 리소스를 확인합니다.',
appExchangeTitle3: '앱 이전 실행',
appExchangeContent3: '앱 백업을 대상 노드로 전송하여 복원하고 작업 로그에서 결과를 확인합니다.',
sslSyncTitle1: '소스 인증서 선택',
sslSyncContent1: '소스 노드의 인증서 정보를 확인하고 동기화할 인증서를 선택합니다.',
sslSyncTitle2: '여러 노드에 인증서 동기화',
sslSyncContent2: '소스 노드를 자동으로 제외하고 선택한 인증서를 대상 노드에 동기화합니다.',
sslSyncTitle3: '동기화 작업 확인',
sslSyncContent3: '실행 전에 대상 노드와 인증서를 확인하고 작업 로그에서 동기화 결과를 확인합니다.',
phpExtensionsSyncTitle1: '확장 템플릿 선택',
phpExtensionsSyncContent1: '소스 노드의 템플릿 이름과 확장 목록을 확인하고 동기화할 템플릿을 선택합니다.',
phpExtensionsSyncTitle2: '여러 노드에 템플릿 동기화',
phpExtensionsSyncContent2: '소스 노드를 자동으로 제외하고 선택한 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsSyncTitle3: '동일 이름 템플릿 확인',
phpExtensionsSyncContent3:
'이름과 내용이 같으면 건너뜁니다. 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
fileExchangeTitle1: '키 인증 전송', fileExchangeTitle1: '키 인증 전송',
fileExchangeContent1: 'SSH 키를 통해 인증하여 전송 보안을 보장합니다.', fileExchangeContent1: 'SSH 키를 통해 인증하여 전송 보안을 보장합니다.',
fileExchangeTitle2: '효율적인 파일 동기화', fileExchangeTitle2: '효율적인 파일 동기화',
@@ -7390,6 +7421,13 @@ const message = {
imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.', imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.',
ssl: '인증서 동기화', ssl: '인증서 동기화',
phpExtensions: 'PHP 확장 템플릿 동기화',
phpExtensionsTitle: '확장 템플릿 동기화',
phpExtensionsDesc: '소스 노드를 선택하면 PHP 확장 템플릿을 대상 노드에 동기화할 수 있습니다.',
phpExtensionsList: '확장 목록',
phpExtensionsConfirm: 'PHP 확장 템플릿 {0}개를 노드 {1}개에 동기화합니다.',
phpExtensionsConflictHint:
'이름과 내용이 같은 템플릿은 건너뜁니다. 이름은 같지만 내용이 다르면 충돌을 알리고 덮어쓰지 않습니다.',
sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.', sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.', sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',
+37
View File
@@ -3898,6 +3898,10 @@ const message = {
nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.', nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.',
nodeDashboard: nodeDashboard:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.', 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.',
imageExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອໂອນຍ້າຍອິມເມຈຄອນເທນເນີລະຫວ່າງໂນດເປັນຊຸດ.',
appExchange: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຍ້າຍແອັບທີ່ຕິດຕັ້ງແລ້ວໄປຍັງໂນດປາຍທາງ ແລະຢືນຢັນຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້.',
sslSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນໃບຢັ້ງຢືນຈາກໂນດຕົ້ນທາງໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
phpExtensionsSync: 'ອັບເກຣດເປັນເວີຊັນການຄ້າເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
fileExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນຍ້າຍໄຟລ໌ລະຫວ່າງເຊີບເວີຢ່າງວ່ອງໄວ.', fileExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນຍ້າຍໄຟລ໌ລະຫວ່າງເຊີບເວີຢ່າງວ່ອງໄວ.',
app: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອເບິ່ງລາຍລະອຽດບໍລິການ, ການຕິດຕາມສິ່ງຜິດປົກກະຕິ ແລະ ອື່ນໆໃນແອັບມືຖື.', app: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອເບິ່ງລາຍລະອຽດບໍລິການ, ການຕິດຕາມສິ່ງຜິດປົກກະຕິ ແລະ ອື່ນໆໃນແອັບມືຖື.',
cluster: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການ MySQL/Postgres/Redis primary-replica clusters.', cluster: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການ MySQL/Postgres/Redis primary-replica clusters.',
@@ -6825,6 +6829,32 @@ const message = {
nodeContent3: 'ຕິດຕາມສະຖານະການທຳງານຂອງແຕ່ລະໂນດແບບທັນທີ', nodeContent3: 'ຕິດຕາມສະຖານະການທຳງານຂອງແຕ່ລະໂນດແບບທັນທີ',
nodeTitle4: 'ເຊື່ອມຕໍ່ໄລຍະໄກວ່ອງໄວ', nodeTitle4: 'ເຊື່ອມຕໍ່ໄລຍະໄກວ່ອງໄວ',
nodeContent4: 'ເຊື່ອມຕໍ່ຫາເທີມິນອລຂອງໂນດໄດ້ໂດຍກົງຄລິກດຽວ', nodeContent4: 'ເຊື່ອມຕໍ່ຫາເທີມິນອລຂອງໂນດໄດ້ໂດຍກົງຄລິກດຽວ',
imageExchangeTitle1: 'ເລືອກອິມເມຈຕົ້ນທາງ',
imageExchangeContent1: 'ເບິ່ງອິມເມຈຄອນເທນເນີໃນໂນດຕົ້ນທາງ ແລະເລືອກອິມເມຈທີ່ຕ້ອງການໂອນຍ້າຍ.',
imageExchangeTitle2: 'ແຈກຢາຍອິມເມຈເປັນຊຸດ',
imageExchangeContent2: 'ໂອນຍ້າຍອິມເມຈທີ່ເລືອກໄປຍັງໂນດປາຍທາງໜຶ່ງຫຼືຫຼາຍໂນດ.',
imageExchangeTitle3: 'ເບິ່ງບັນທຶກການໂອນຍ້າຍ',
imageExchangeContent3: 'ຕິດຕາມຄວາມຄືບໜ້າແລະຜົນການໂອນຍ້າຍອິມເມຈໃນບັນທຶກວຽກ.',
appExchangeTitle1: 'ເລືອກແອັບຕົ້ນທາງ',
appExchangeContent1: 'ເບິ່ງແອັບທີ່ຕິດຕັ້ງໃນໂນດຕົ້ນທາງ ແລະເລືອກແອັບທີ່ຕ້ອງການຍ້າຍ.',
appExchangeTitle2: 'ຢືນຢັນຊັບພະຍາກອນທີ່ຂຶ້ນຕໍ່ກັນ',
appExchangeContent2: 'ຢືນຢັນໂນດປາຍທາງແລະຊັບພະຍາກອນທີ່ຕ້ອງໃຊ້ ເຊັ່ນ ຖານຂໍ້ມູນ ກ່ອນການຍ້າຍ.',
appExchangeTitle3: 'ຍ້າຍແອັບ',
appExchangeContent3: 'ໂອນຍ້າຍຂໍ້ມູນສຳຮອງຂອງແອັບໄປຍັງໂນດປາຍທາງເພື່ອກູ້ຄືນ ແລະເບິ່ງຜົນໃນບັນທຶກວຽກ.',
sslSyncTitle1: 'ເລືອກໃບຢັ້ງຢືນຕົ້ນທາງ',
sslSyncContent1: 'ເບິ່ງຂໍ້ມູນໃບຢັ້ງຢືນໃນໂນດຕົ້ນທາງ ແລະເລືອກໃບຢັ້ງຢືນທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
sslSyncTitle2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນລະຫວ່າງໂນດ',
sslSyncContent2: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
sslSyncTitle3: 'ຢືນຢັນວຽກຊິງໂຄຣໄນ',
sslSyncContent3: 'ກວດສອບໂນດປາຍທາງແລະໃບຢັ້ງຢືນກ່ອນດຳເນີນການ ແລ້ວເບິ່ງຜົນໃນບັນທຶກວຽກ.',
phpExtensionsSyncTitle1: 'ເລືອກແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsSyncContent1:
'ເບິ່ງຊື່ແມ່ແບບແລະລາຍການສ່ວນຂະຫຍາຍໃນໂນດຕົ້ນທາງ ແລະເລືອກແມ່ແບບທີ່ຕ້ອງການຊິງໂຄຣໄນ.',
phpExtensionsSyncTitle2: 'ຊິງໂຄຣໄນແມ່ແບບລະຫວ່າງໂນດ',
phpExtensionsSyncContent2: 'ຊິງໂຄຣໄນແມ່ແບບທີ່ເລືອກໄປຍັງໂນດປາຍທາງ ໂດຍຍົກເວັ້ນໂນດຕົ້ນທາງອັດຕະໂນມັດ.',
phpExtensionsSyncTitle3: 'ກວດສອບແມ່ແບບຊື່ດຽວກັນ',
phpExtensionsSyncContent3:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
fileExchangeTitle1: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication', fileExchangeTitle1: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication',
fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.', fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.',
fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ', fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ',
@@ -7302,6 +7332,13 @@ const message = {
imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.', imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ', ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ',
phpExtensions: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP',
phpExtensionsTitle: 'ຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsDesc: 'ເລືອກໂນດຕົ້ນທາງເພື່ອຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງ.',
phpExtensionsList: 'ລາຍການສ່ວນຂະຫຍາຍ',
phpExtensionsConfirm: 'ຈະຊິງໂຄຣໄນແມ່ແບບສ່ວນຂະຫຍາຍ PHP {0} ແມ່ແບບ ໄປຍັງ {1} ໂນດ.',
phpExtensionsConflictHint:
'ຈະຂ້າມແມ່ແບບທີ່ມີຊື່ແລະເນື້ອຫາຄືກັນ. ຖ້າຊື່ຄືກັນແຕ່ເນື້ອຫາຕ່າງກັນ ຈະແຈ້ງຂໍ້ຂັດແຍ່ງແລະບໍ່ຂຽນທັບ.',
sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.', sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.',
sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.', sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
+46
View File
@@ -4076,6 +4076,13 @@ const message = {
'Naik taraf ke Edisi Komersial untuk menaik taraf versi aplikasi berbilang nod tanpa menukar nod secara manual.', 'Naik taraf ke Edisi Komersial untuk menaik taraf versi aplikasi berbilang nod tanpa menukar nod secara manual.',
nodeDashboard: nodeDashboard:
'Naik taraf ke Edisi Komersial untuk mengurus aplikasi, laman web, pangkalan data dan tugas berjadual berbilang nod secara berpusat.', 'Naik taraf ke Edisi Komersial untuk mengurus aplikasi, laman web, pangkalan data dan tugas berjadual berbilang nod secara berpusat.',
imageExchange: 'Naik taraf ke edisi komersial untuk memindahkan imej kontena antara nod secara kelompok.',
appExchange:
'Naik taraf ke edisi komersial untuk memindahkan aplikasi yang dipasang ke nod sasaran dan mengesahkan sumber kebergantungannya.',
sslSync:
'Naik taraf ke edisi komersial untuk menyegerakkan sijil daripada nod sumber ke satu atau lebih nod sasaran.',
phpExtensionsSync:
'Naik taraf ke edisi komersial untuk menyegerakkan templat sambungan PHP ke satu atau lebih nod sasaran.',
fileExchange: 'Naik taraf ke Edisi Komersial untuk memindahkan fail dengan pantas antara pelayan.', fileExchange: 'Naik taraf ke Edisi Komersial untuk memindahkan fail dengan pantas antara pelayan.',
app: 'Naik taraf ke Edisi Komersial untuk melihat maklumat perkhidmatan dan pemantauan anomali dalam aplikasi mudah alih.', app: 'Naik taraf ke Edisi Komersial untuk melihat maklumat perkhidmatan dan pemantauan anomali dalam aplikasi mudah alih.',
cluster: 'Naik taraf ke Edisi Komersial untuk mengurus kelompok utama-replika MySQL/Postgres/Redis.', cluster: 'Naik taraf ke Edisi Komersial untuk mengurus kelompok utama-replika MySQL/Postgres/Redis.',
@@ -7137,6 +7144,38 @@ const message = {
nodeContent3: 'Memantau status operasi setiap nod secara real-time', nodeContent3: 'Memantau status operasi setiap nod secara real-time',
nodeTitle4: 'Sambungan Jauh Pantas', nodeTitle4: 'Sambungan Jauh Pantas',
nodeContent4: 'Sambung terus ke terminal jauh nod dengan satu klik', nodeContent4: 'Sambung terus ke terminal jauh nod dengan satu klik',
imageExchangeTitle1: 'Pilih imej sumber',
imageExchangeContent1: 'Lihat imej kontena pada nod sumber dan pilih imej yang ingin dipindahkan.',
imageExchangeTitle2: 'Edarkan imej secara kelompok',
imageExchangeContent2: 'Pindahkan imej yang dipilih ke satu atau lebih nod sasaran.',
imageExchangeTitle3: 'Lihat log pemindahan',
imageExchangeContent3: 'Pantau kemajuan dan hasil pemindahan imej dalam log tugas.',
appExchangeTitle1: 'Pilih aplikasi sumber',
appExchangeContent1:
'Lihat aplikasi yang dipasang pada nod sumber dan pilih aplikasi yang ingin dipindahkan.',
appExchangeTitle2: 'Sahkan kebergantungan',
appExchangeContent2:
'Sahkan nod sasaran dan sumber yang diperlukan, seperti pangkalan data, sebelum pemindahan.',
appExchangeTitle3: 'Pindahkan aplikasi',
appExchangeContent3:
'Pindahkan sandaran aplikasi ke nod sasaran untuk pemulihan dan lihat hasilnya dalam log tugas.',
sslSyncTitle1: 'Pilih sijil sumber',
sslSyncContent1: 'Lihat maklumat sijil pada nod sumber dan pilih sijil yang ingin disegerakkan.',
sslSyncTitle2: 'Segerakkan sijil antara nod',
sslSyncContent2:
'Segerakkan sijil yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
sslSyncTitle3: 'Sahkan tugas penyegerakan',
sslSyncContent3:
'Semak nod sasaran dan sijil sebelum pelaksanaan, kemudian lihat hasilnya dalam log tugas.',
phpExtensionsSyncTitle1: 'Pilih templat sambungan',
phpExtensionsSyncContent1:
'Lihat nama templat dan senarai sambungan pada nod sumber, kemudian pilih templat yang ingin disegerakkan.',
phpExtensionsSyncTitle2: 'Segerakkan templat antara nod',
phpExtensionsSyncContent2:
'Segerakkan templat yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
phpExtensionsSyncTitle3: 'Semak templat bernama sama',
phpExtensionsSyncContent3:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Kandungan yang berbeza dilaporkan sebagai konflik tanpa menulis ganti templat.',
fileExchangeTitle1: 'Pengangkutan Pengesahan Kunci', fileExchangeTitle1: 'Pengangkutan Pengesahan Kunci',
fileExchangeContent1: 'Mengesahkan melalui kunci SSH untuk memastikan keselamatan pengangkutan.', fileExchangeContent1: 'Mengesahkan melalui kunci SSH untuk memastikan keselamatan pengangkutan.',
fileExchangeTitle2: 'Segerakan Fail Cekap', fileExchangeTitle2: 'Segerakan Fail Cekap',
@@ -7660,6 +7699,13 @@ const message = {
imageBatchConfirmPrefix: 'Akan memindahkan {0} imej ke {1} nod, dengan jumlah {2} tugasan.', imageBatchConfirmPrefix: 'Akan memindahkan {0} imej ke {1} nod, dengan jumlah {2} tugasan.',
ssl: 'Penyegerakan Sijil', ssl: 'Penyegerakan Sijil',
phpExtensions: 'Penyegerakan Templat Sambungan PHP',
phpExtensionsTitle: 'Penyegerakan Templat Sambungan',
phpExtensionsDesc: 'Pilih nod sumber untuk menyegerakkan templat sambungan PHP ke nod sasaran.',
phpExtensionsList: 'Senarai sambungan',
phpExtensionsConfirm: 'Segerakkan {0} templat sambungan PHP ke {1} nod.',
phpExtensionsConflictHint:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Jika nama sama tetapi kandungan berbeza, konflik akan dilaporkan tanpa menulis ganti templat.',
sslBatchDesc: sslBatchDesc:
'Selepas memilih nod sumber, sijil yang ditentukan boleh disegerakkan ke persekitaran panel semasa.', 'Selepas memilih nod sumber, sijil yang ditentukan boleh disegerakkan ke persekitaran panel semasa.',
sslBatchConfirmPrefix: 'Akan menyegerakkan {0} sijil ke {1} nod, dengan jumlah {2} tugasan.', sslBatchConfirmPrefix: 'Akan menyegerakkan {0} sijil ke {1} nod, dengan jumlah {2} tugasan.',
+48
View File
@@ -4082,6 +4082,13 @@ const message = {
'Atualize para a edição comercial para atualizar versões de aplicativos multi-nó sem alternar manualmente entre os nós.', 'Atualize para a edição comercial para atualizar versões de aplicativos multi-nó sem alternar manualmente entre os nós.',
nodeDashboard: nodeDashboard:
'Atualize para a edição comercial para gerenciar aplicativos, sites, bancos de dados e tarefas agendadas multi-nó de forma centralizada.', 'Atualize para a edição comercial para gerenciar aplicativos, sites, bancos de dados e tarefas agendadas multi-nó de forma centralizada.',
imageExchange: 'Atualize para a edição comercial para transferir imagens de contêineres entre nós em lote.',
appExchange:
'Atualize para a edição comercial para migrar aplicativos instalados para nós de destino e confirmar os recursos necessários.',
sslSync:
'Atualize para a edição comercial para sincronizar certificados do nó de origem com um ou mais nós de destino.',
phpExtensionsSync:
'Atualize para a edição comercial para sincronizar modelos de extensões PHP com um ou mais nós de destino.',
fileExchange: 'Atualize para a edição comercial para transferir arquivos rapidamente entre vários servidores.', fileExchange: 'Atualize para a edição comercial para transferir arquivos rapidamente entre vários servidores.',
app: 'Faça upgrade para a edição comercial para visualizar informações do serviço e monitoramento de anomalias no aplicativo móvel.', app: 'Faça upgrade para a edição comercial para visualizar informações do serviço e monitoramento de anomalias no aplicativo móvel.',
cluster: 'Atualize para a edição comercial para gerenciar clusters primário-réplica de MySQL/Postgres/Redis.', cluster: 'Atualize para a edição comercial para gerenciar clusters primário-réplica de MySQL/Postgres/Redis.',
@@ -7172,6 +7179,39 @@ const message = {
nodeContent3: 'Acompanhe em tempo real o status operacional de cada nó', nodeContent3: 'Acompanhe em tempo real o status operacional de cada nó',
nodeTitle4: 'Conexão Remota Rápida', nodeTitle4: 'Conexão Remota Rápida',
nodeContent4: 'Conecte-se diretamente a terminais remotos de nós com um clique', nodeContent4: 'Conecte-se diretamente a terminais remotos de nós com um clique',
imageExchangeTitle1: 'Selecionar imagens de origem',
imageExchangeContent1:
'Veja as imagens de contêineres no nó de origem e selecione as que deseja transferir.',
imageExchangeTitle2: 'Distribuir imagens em lote',
imageExchangeContent2: 'Transfira as imagens selecionadas para um ou mais nós de destino.',
imageExchangeTitle3: 'Ver logs de transferência',
imageExchangeContent3:
'Acompanhe o progresso e os resultados da transferência de imagens nos logs de tarefas.',
appExchangeTitle1: 'Selecionar aplicativo de origem',
appExchangeContent1: 'Veja os aplicativos instalados no nó de origem e selecione o que deseja migrar.',
appExchangeTitle2: 'Confirmar dependências',
appExchangeContent2:
'Confirme os nós de destino e os recursos necessários, como bancos de dados, antes da migração.',
appExchangeTitle3: 'Migrar aplicativos',
appExchangeContent3:
'Transfira backups dos aplicativos para restauração nos nós de destino e veja os resultados nos logs de tarefas.',
sslSyncTitle1: 'Selecionar certificados',
sslSyncContent1: 'Veja os detalhes dos certificados no nó de origem e selecione os que deseja sincronizar.',
sslSyncTitle2: 'Sincronizar certificados entre nós',
sslSyncContent2:
'Sincronize os certificados selecionados com os nós de destino, excluindo automaticamente o nó de origem.',
sslSyncTitle3: 'Confirmar tarefas de sincronização',
sslSyncContent3:
'Confira os nós de destino e os certificados antes da execução e veja os resultados nos logs de tarefas.',
phpExtensionsSyncTitle1: 'Selecionar modelo de extensões',
phpExtensionsSyncContent1:
'Veja os nomes dos modelos e suas listas de extensões no nó de origem e selecione o modelo que deseja sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar modelos entre nós',
phpExtensionsSyncContent2:
'Sincronize o modelo selecionado com os nós de destino, excluindo automaticamente o nó de origem.',
phpExtensionsSyncTitle3: 'Verificar modelos existentes',
phpExtensionsSyncContent3:
'Modelos com nome e conteúdo idênticos são ignorados. Conteúdos diferentes geram um aviso de conflito, sem sobrescrever o modelo.',
fileExchangeTitle1: 'Transmissão de Autenticação por Chave', fileExchangeTitle1: 'Transmissão de Autenticação por Chave',
fileExchangeContent1: 'Autentique via chaves SSH para garantir a segurança da transmissão.', fileExchangeContent1: 'Autentique via chaves SSH para garantir a segurança da transmissão.',
fileExchangeTitle2: 'Sincronização de Arquivos Eficiente', fileExchangeTitle2: 'Sincronização de Arquivos Eficiente',
@@ -7697,6 +7737,14 @@ const message = {
imageBatchConfirmPrefix: 'Serão encaminhadas {0} imagens para {1} nós, totalizando {2} tarefas.', imageBatchConfirmPrefix: 'Serão encaminhadas {0} imagens para {1} nós, totalizando {2} tarefas.',
ssl: 'Sincronização de Certificados', ssl: 'Sincronização de Certificados',
phpExtensions: 'Sincronização de modelos de extensões PHP',
phpExtensionsTitle: 'Sincronização de modelos de extensões',
phpExtensionsDesc:
'Selecione um nó de origem para sincronizar seu modelo de extensões PHP com os nós de destino.',
phpExtensionsList: 'Lista de extensões',
phpExtensionsConfirm: 'Sincronizar {0} modelos de extensões PHP com {1} nós.',
phpExtensionsConflictHint:
'Modelos com o mesmo nome e conteúdo são ignorados. Se o nome for igual e o conteúdo diferente, o conflito será informado sem sobrescrever o modelo.',
sslBatchDesc: sslBatchDesc:
'Após selecionar o nó de origem, os certificados especificados podem ser sincronizados com o ambiente atual do painel.', 'Após selecionar o nó de origem, os certificados especificados podem ser sincronizados com o ambiente atual do painel.',
sslBatchConfirmPrefix: 'Serão sincronizados {0} certificados para {1} nós, totalizando {2} tarefas.', sslBatchConfirmPrefix: 'Serão sincronizados {0} certificados para {1} nós, totalizando {2} tarefas.',
+48
View File
@@ -4058,6 +4058,13 @@ const message = {
'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.', 'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.',
nodeDashboard: nodeDashboard:
'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.', 'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.',
imageExchange: 'Перейдите на коммерческую версию для пакетной передачи образов контейнеров между узлами.',
appExchange:
'Перейдите на коммерческую версию для переноса установленных приложений на целевые узлы и подтверждения зависимых ресурсов.',
sslSync:
'Перейдите на коммерческую версию для синхронизации сертификатов исходного узла с одним или несколькими целевыми узлами.',
phpExtensionsSync:
'Перейдите на коммерческую версию для синхронизации шаблонов расширений PHP с одним или несколькими целевыми узлами.',
fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.', fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.',
app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.', app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.',
cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.', cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.',
@@ -7146,6 +7153,39 @@ const message = {
nodeContent3: 'Реальное наблюдение за рабочим статусом каждого узла', nodeContent3: 'Реальное наблюдение за рабочим статусом каждого узла',
nodeTitle4: 'Быстрое удаленное подключение', nodeTitle4: 'Быстрое удаленное подключение',
nodeContent4: 'Одним кликом подключитесь к удаленным терминалам узлов', nodeContent4: 'Одним кликом подключитесь к удаленным терминалам узлов',
imageExchangeTitle1: 'Выбор исходных образов',
imageExchangeContent1: 'Просмотрите образы контейнеров на исходном узле и выберите образы для передачи.',
imageExchangeTitle2: 'Пакетная передача образов',
imageExchangeContent2: 'Передавайте выбранные образы на один или несколько целевых узлов.',
imageExchangeTitle3: 'Просмотр журналов передачи',
imageExchangeContent3: 'Отслеживайте ход и результаты передачи образов в журналах задач.',
appExchangeTitle1: 'Выбор исходного приложения',
appExchangeContent1:
'Просмотрите установленные приложения на исходном узле и выберите приложение для переноса.',
appExchangeTitle2: 'Подтверждение зависимостей',
appExchangeContent2:
'Перед переносом подтвердите целевые узлы и необходимые ресурсы, например базы данных.',
appExchangeTitle3: 'Перенос приложений',
appExchangeContent3:
'Передавайте резервные копии приложений на целевые узлы для восстановления и просматривайте результаты в журналах задач.',
sslSyncTitle1: 'Выбор сертификатов',
sslSyncContent1:
'Просмотрите сведения о сертификатах на исходном узле и выберите сертификаты для синхронизации.',
sslSyncTitle2: 'Синхронизация сертификатов между узлами',
sslSyncContent2:
'Синхронизируйте выбранные сертификаты с целевыми узлами, автоматически исключая исходный узел.',
sslSyncTitle3: 'Подтверждение задач синхронизации',
sslSyncContent3:
'Проверьте целевые узлы и сертификаты перед выполнением, затем просмотрите результаты в журналах задач.',
phpExtensionsSyncTitle1: 'Выбор шаблона расширений',
phpExtensionsSyncContent1:
'Просмотрите имена шаблонов и списки расширений на исходном узле и выберите шаблон для синхронизации.',
phpExtensionsSyncTitle2: 'Синхронизация шаблонов между узлами',
phpExtensionsSyncContent2:
'Синхронизируйте выбранный шаблон с целевыми узлами, автоматически исключая исходный узел.',
phpExtensionsSyncTitle3: 'Проверка одноимённых шаблонов',
phpExtensionsSyncContent3:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При различии содержимого сообщается о конфликте без перезаписи.',
fileExchangeTitle1: 'Передача с аутентификацией по ключу', fileExchangeTitle1: 'Передача с аутентификацией по ключу',
fileExchangeContent1: 'Аутентифицируйтесь через SSH-ключи, чтобы обеспечить безопасность передачи.', fileExchangeContent1: 'Аутентифицируйтесь через SSH-ключи, чтобы обеспечить безопасность передачи.',
fileExchangeTitle2: 'Эффективная синхронизация файлов', fileExchangeTitle2: 'Эффективная синхронизация файлов',
@@ -7676,6 +7716,14 @@ const message = {
imageBatchConfirmPrefix: 'Будет передано {0} образов на {1} узлов, всего {2} задач.', imageBatchConfirmPrefix: 'Будет передано {0} образов на {1} узлов, всего {2} задач.',
ssl: 'Синхронизация сертификатов', ssl: 'Синхронизация сертификатов',
phpExtensions: 'Синхронизация шаблонов расширений PHP',
phpExtensionsTitle: 'Синхронизация шаблонов расширений',
phpExtensionsDesc:
'Выберите исходный узел, чтобы синхронизировать его шаблон расширений PHP с целевыми узлами.',
phpExtensionsList: 'Список расширений',
phpExtensionsConfirm: 'Синхронизировать шаблоны расширений PHP ({0}) с узлами ({1}).',
phpExtensionsConflictHint:
'Шаблоны с одинаковыми именами и содержимым пропускаются. При совпадении имени и различии содержимого сообщается о конфликте без перезаписи.',
sslBatchDesc: sslBatchDesc:
'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.', 'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.',
sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.', sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.',
+44
View File
@@ -4071,6 +4071,13 @@ const message = {
'Ticari sürüme yükselterek düğümleri manuel değiştirmeden çok düğümlü uygulama sürümlerini toplu olarak yükseltebilirsiniz.', 'Ticari sürüme yükselterek düğümleri manuel değiştirmeden çok düğümlü uygulama sürümlerini toplu olarak yükseltebilirsiniz.',
nodeDashboard: nodeDashboard:
'Ticari sürüme yükselterek çok düğümlü uygulamaları, web sitelerini, veritabanlarını ve zamanlanmış görevleri merkezi olarak yönetebilirsiniz.', 'Ticari sürüme yükselterek çok düğümlü uygulamaları, web sitelerini, veritabanlarını ve zamanlanmış görevleri merkezi olarak yönetebilirsiniz.',
imageExchange: 'Konteyner imajlarını düğümler arasında toplu olarak aktarmak için ticari sürüme yükseltin.',
appExchange:
'Kurulu uygulamaları hedef düğümlere taşımak ve gerekli kaynak bağımlılıklarını onaylamak için ticari sürüme yükseltin.',
sslSync:
'Kaynak düğümdeki sertifikaları bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
phpExtensionsSync:
'PHP eklenti şablonlarını bir veya daha fazla hedef düğümle eşitlemek için ticari sürüme yükseltin.',
fileExchange: 'Ticari sürüme yükselterek birden fazla sunucu arasında dosyaları hızlıca aktarabilirsiniz.', fileExchange: 'Ticari sürüme yükselterek birden fazla sunucu arasında dosyaları hızlıca aktarabilirsiniz.',
app: 'Ticari sürüme yükselterek mobil uygulamada hizmet bilgilerini ve anormallik izlemeyi görüntüleyebilirsiniz.', app: 'Ticari sürüme yükselterek mobil uygulamada hizmet bilgilerini ve anormallik izlemeyi görüntüleyebilirsiniz.',
cluster: 'Ticari sürüme yükselterek MySQL/Postgres/Redis birincil-kopya kümelerini yönetebilirsiniz.', cluster: 'Ticari sürüme yükselterek MySQL/Postgres/Redis birincil-kopya kümelerini yönetebilirsiniz.',
@@ -7149,6 +7156,36 @@ const message = {
nodeContent3: 'Her düğümün çalışma durumunu gerçek zamanlı olarak izler', nodeContent3: 'Her düğümün çalışma durumunu gerçek zamanlı olarak izler',
nodeTitle4: 'Hızlı Uzak Bağlantı', nodeTitle4: 'Hızlı Uzak Bağlantı',
nodeContent4: 'Düğümlere tek tıkla doğrudan uzak terminal bağlantısı', nodeContent4: 'Düğümlere tek tıkla doğrudan uzak terminal bağlantısı',
imageExchangeTitle1: 'Kaynak imajları seçin',
imageExchangeContent1: 'Kaynak düğümdeki konteyner imajlarını görüntüleyin ve aktarılacak imajları seçin.',
imageExchangeTitle2: 'İmajları toplu dağıtın',
imageExchangeContent2: 'Seçilen imajları bir veya daha fazla hedef düğüme aktarın.',
imageExchangeTitle3: 'Aktarım günlüklerini görüntüleyin',
imageExchangeContent3: 'İmaj aktarımının ilerlemesini ve sonuçlarını görev günlüklerinden takip edin.',
appExchangeTitle1: 'Kaynak uygulamayı seçin',
appExchangeContent1: 'Kaynak düğümde kurulu uygulamaları görüntüleyin ve taşınacak uygulamayı seçin.',
appExchangeTitle2: 'Bağımlılıkları onaylayın',
appExchangeContent2: 'Taşıma öncesinde hedef düğümleri ve veritabanları gibi gerekli kaynakları onaylayın.',
appExchangeTitle3: 'Uygulamaları taşıyın',
appExchangeContent3:
'Uygulama yedeklerini geri yüklemek üzere hedef düğümlere aktarın ve sonuçları görev günlüklerinden görüntüleyin.',
sslSyncTitle1: 'Sertifikaları seçin',
sslSyncContent1: 'Kaynak düğümdeki sertifika bilgilerini görüntüleyin ve eşitlenecek sertifikaları seçin.',
sslSyncTitle2: 'Düğümler arasında sertifika eşitleme',
sslSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen sertifikaları hedef düğümlerle eşitleyin.',
sslSyncTitle3: 'Eşitleme görevlerini onaylayın',
sslSyncContent3:
'Çalıştırmadan önce hedef düğümleri ve sertifikaları kontrol edin, ardından sonuçları görev günlüklerinden görüntüleyin.',
phpExtensionsSyncTitle1: 'Eklenti şablonunu seçin',
phpExtensionsSyncContent1:
'Kaynak düğümdeki şablon adlarını ve eklenti listelerini görüntüleyin, eşitlenecek şablonu seçin.',
phpExtensionsSyncTitle2: 'Düğümler arasında şablon eşitleme',
phpExtensionsSyncContent2:
'Kaynak düğümü otomatik olarak hariç tutarak seçilen şablonu hedef düğümlerle eşitleyin.',
phpExtensionsSyncTitle3: 'Aynı adlı şablonları kontrol edin',
phpExtensionsSyncContent3:
'Adı ve içeriği aynı olan şablonlar atlanır. İçerik farklıysa çakışma bildirilir ve üzerine yazılmaz.',
fileExchangeTitle1: 'Anahtar Kimlik Doğrulama İletimi', fileExchangeTitle1: 'Anahtar Kimlik Doğrulama İletimi',
fileExchangeContent1: 'İletim güvenliğini sağlamak için SSH anahtarları ile kimlik doğrulaması yapar.', fileExchangeContent1: 'İletim güvenliğini sağlamak için SSH anahtarları ile kimlik doğrulaması yapar.',
fileExchangeTitle2: 'Verimli Dosya Senkronizasyonu', fileExchangeTitle2: 'Verimli Dosya Senkronizasyonu',
@@ -7673,6 +7710,13 @@ const message = {
imageBatchConfirmPrefix: '{0} imaj {1} düğüme aktarılacak, toplam {2} görev oluşturulacak.', imageBatchConfirmPrefix: '{0} imaj {1} düğüme aktarılacak, toplam {2} görev oluşturulacak.',
ssl: 'Sertifika Senkronizasyonu', ssl: 'Sertifika Senkronizasyonu',
phpExtensions: 'PHP Eklenti Şablonu Eşitleme',
phpExtensionsTitle: 'Eklenti Şablonu Eşitleme',
phpExtensionsDesc: 'PHP eklenti şablonunu hedef düğümlerle eşitlemek için bir kaynak düğüm seçin.',
phpExtensionsList: 'Eklenti listesi',
phpExtensionsConfirm: '{0} PHP eklenti şablonu {1} düğümle eşitlenecek.',
phpExtensionsConflictHint:
'Adı ve içeriği aynı olan şablonlar atlanır. Adı aynı ancak içeriği farklı olan şablonlar için çakışma bildirilir ve üzerine yazılmaz.',
sslBatchDesc: sslBatchDesc:
'Kaynak düğüm seçildikten sonra belirtilen sertifikalar mevcut panel ortamına senkronize edilebilir.', 'Kaynak düğüm seçildikten sonra belirtilen sertifikalar mevcut panel ortamına senkronize edilebilir.',
sslBatchConfirmPrefix: '{0} sertifika {1} düğüme senkronize edilecek, toplam {2} görev oluşturulacak.', sslBatchConfirmPrefix: '{0} sertifika {1} düğüme senkronize edilecek, toplam {2} görev oluşturulacak.',
+34
View File
@@ -3747,6 +3747,10 @@ const message = {
node: '升級商業版可以使用 1Panel 管理多台 Linux 伺服器。', node: '升級商業版可以使用 1Panel 管理多台 Linux 伺服器。',
nodeApp: '升級商業版可以統一升級多節點應用版本,無需手動切換節點。', nodeApp: '升級商業版可以統一升級多節點應用版本,無需手動切換節點。',
nodeDashboard: '升級商業版可以集中管理多節點應用、網站、資料庫和計劃任務。', nodeDashboard: '升級商業版可以集中管理多節點應用、網站、資料庫和計劃任務。',
imageExchange: '升級商業版可以在多個節點之間批次傳輸容器映像。',
appExchange: '升級商業版可以將已安裝的應用程式遷移到目標節點,並確認所需的關聯資源。',
sslSync: '升級商業版可以將來源節點的憑證同步到一個或多個目標節點。',
phpExtensionsSync: '升級商業版可以將 PHP 擴充範本同步到一個或多個目標節點。',
fileExchange: '升級商業版可以在多台伺服器之間快速傳輸檔案。', fileExchange: '升級商業版可以在多台伺服器之間快速傳輸檔案。',
app: '升級商業版可透過手機APP,檢視服務資訊、異常監控等。', app: '升級商業版可透過手機APP,檢視服務資訊、異常監控等。',
cluster: '升級商業版可以管理 MySQL/Postgres/Redis 主從叢集。', cluster: '升級商業版可以管理 MySQL/Postgres/Redis 主從叢集。',
@@ -6539,6 +6543,30 @@ const message = {
nodeContent3: '即時掌握各節點執行狀態', nodeContent3: '即時掌握各節點執行狀態',
nodeTitle4: '快速遠端連接', nodeTitle4: '快速遠端連接',
nodeContent4: '一鍵直連節點遠端終端', nodeContent4: '一鍵直連節點遠端終端',
imageExchangeTitle1: '選擇來源映像',
imageExchangeContent1: '檢視來源節點的容器映像,選擇需要傳輸的映像。',
imageExchangeTitle2: '批次分發映像',
imageExchangeContent2: '將選取的映像傳輸到一個或多個目標節點。',
imageExchangeTitle3: '檢視傳輸日誌',
imageExchangeContent3: '透過任務日誌檢視映像傳輸進度和執行結果。',
appExchangeTitle1: '選擇來源應用程式',
appExchangeContent1: '檢視來源節點已安裝的應用程式,選擇需要遷移的應用程式。',
appExchangeTitle2: '確認資源相依性',
appExchangeContent2: '遷移前確認目標節點及應用程式所需的資料庫等關聯資源。',
appExchangeTitle3: '執行應用程式遷移',
appExchangeContent3: '將應用程式備份傳輸到目標節點進行還原,並透過任務日誌檢視結果。',
sslSyncTitle1: '選擇來源憑證',
sslSyncContent1: '檢視來源節點的憑證資訊,選擇需要同步的憑證。',
sslSyncTitle2: '多節點憑證同步',
sslSyncContent2: '將選取的憑證同步到目標節點,自動排除來源節點。',
sslSyncTitle3: '確認同步任務',
sslSyncContent3: '執行前確認目標節點和憑證,透過任務日誌檢視同步結果。',
phpExtensionsSyncTitle1: '選擇擴充範本',
phpExtensionsSyncContent1: '檢視來源節點的範本名稱和擴充清單,選擇需要同步的範本。',
phpExtensionsSyncTitle2: '多節點範本同步',
phpExtensionsSyncContent2: '將選取的擴充範本同步到目標節點,自動排除來源節點。',
phpExtensionsSyncTitle3: '同名範本檢查',
phpExtensionsSyncContent3: '同名且內容一致的範本會略過;內容不同則提示衝突,不會覆寫。',
fileExchangeTitle1: '金鑰認證傳輸', fileExchangeTitle1: '金鑰認證傳輸',
fileExchangeContent1: '通過 SSH 金鑰進行身份驗證,確保傳輸的安全性。', fileExchangeContent1: '通過 SSH 金鑰進行身份驗證,確保傳輸的安全性。',
fileExchangeTitle2: '高效檔案同步', fileExchangeTitle2: '高效檔案同步',
@@ -7022,6 +7050,12 @@ const message = {
imageBatchConfirmPrefix: '即將把 {0} 張映像轉發到 {1} 個節點,共 {2} 個任務。', imageBatchConfirmPrefix: '即將把 {0} 張映像轉發到 {1} 個節點,共 {2} 個任務。',
ssl: '證書同步', ssl: '證書同步',
phpExtensions: 'PHP 擴充模版同步',
phpExtensionsTitle: '擴充模版同步',
phpExtensionsDesc: '選擇來源節點後,可將指定 PHP 擴充模版同步至目標節點。',
phpExtensionsList: '擴充清單',
phpExtensionsConfirm: '即將把 {0} 個 PHP 擴充模版同步至 {1} 個目標節點。',
phpExtensionsConflictHint: '同名且內容一致的模版將略過;同名但內容不同的模版將提示衝突,不會覆蓋。',
sslBatchDesc: '選擇來源節點後,可將指定證書同步到目前面板環境。', sslBatchDesc: '選擇來源節點後,可將指定證書同步到目前面板環境。',
sslBatchConfirmPrefix: '即將把 {0} 張證書同步到 {1} 個節點,共 {2} 個任務。', sslBatchConfirmPrefix: '即將把 {0} 張證書同步到 {1} 個節點,共 {2} 個任務。',
+34
View File
@@ -3777,6 +3777,10 @@ const message = {
node: '升级商业版可以使用 1Panel 管理多台 linux 服务器。', node: '升级商业版可以使用 1Panel 管理多台 linux 服务器。',
nodeApp: '升级商业版可以统一升级多节点应用版本,无需手动切换节点。', nodeApp: '升级商业版可以统一升级多节点应用版本,无需手动切换节点。',
nodeDashboard: '升级商业版可以集中管理多节点应用、网站、数据库和计划任务。', nodeDashboard: '升级商业版可以集中管理多节点应用、网站、数据库和计划任务。',
imageExchange: '升级商业版可以在多个节点之间批量传输容器镜像。',
appExchange: '升级商业版可以将已安装的应用迁移到目标节点,并确认所需的关联资源。',
sslSync: '升级商业版可以将源节点的证书同步到一个或多个目标节点。',
phpExtensionsSync: '升级商业版可以将 PHP 扩展模版同步到一个或多个目标节点。',
fileExchange: '升级商业版可以在多台服务器之间快速传输文件。', fileExchange: '升级商业版可以在多台服务器之间快速传输文件。',
app: '升级商业版可通过手机 APP,查看服务信息、异常监控等。', app: '升级商业版可通过手机 APP,查看服务信息、异常监控等。',
cluster: '升级商业版可以管理 MySQL/Postgres/Redis 主从集群。', cluster: '升级商业版可以管理 MySQL/Postgres/Redis 主从集群。',
@@ -5494,6 +5498,30 @@ const message = {
nodeTitle4: '快速远程连接', nodeTitle4: '快速远程连接',
nodeContent4: '一键直连节点远程终端', nodeContent4: '一键直连节点远程终端',
imageExchangeTitle1: '选择源镜像',
imageExchangeContent1: '查看源节点的容器镜像,选择需要传输的镜像。',
imageExchangeTitle2: '批量分发镜像',
imageExchangeContent2: '将选中的镜像传输到一个或多个目标节点。',
imageExchangeTitle3: '查看传输日志',
imageExchangeContent3: '通过任务日志查看镜像传输进度和执行结果。',
appExchangeTitle1: '选择源应用',
appExchangeContent1: '查看源节点已安装的应用,选择需要迁移的应用。',
appExchangeTitle2: '确认资源依赖',
appExchangeContent2: '迁移前确认目标节点及应用所需的数据库等关联资源。',
appExchangeTitle3: '执行应用迁移',
appExchangeContent3: '将应用备份传输到目标节点进行恢复,并通过任务日志查看结果。',
sslSyncTitle1: '选择源证书',
sslSyncContent1: '查看源节点的证书信息,选择需要同步的证书。',
sslSyncTitle2: '多节点证书同步',
sslSyncContent2: '将选中的证书同步到目标节点,自动排除源节点。',
sslSyncTitle3: '确认同步任务',
sslSyncContent3: '执行前确认目标节点和证书,通过任务日志查看同步结果。',
phpExtensionsSyncTitle1: '选择扩展模版',
phpExtensionsSyncContent1: '查看源节点的模版名称和扩展列表,选择需要同步的模版。',
phpExtensionsSyncTitle2: '多节点模版同步',
phpExtensionsSyncContent2: '将选中的扩展模版同步到目标节点,自动排除源节点。',
phpExtensionsSyncTitle3: '同名模版检查',
phpExtensionsSyncContent3: '同名且内容一致的模版会跳过;内容不同则提示冲突,不会覆盖。',
fileExchangeTitle1: '密钥认证传输', fileExchangeTitle1: '密钥认证传输',
fileExchangeContent1: '通过 SSH 密钥进行身份验证,确保传输的安全性。', fileExchangeContent1: '通过 SSH 密钥进行身份验证,确保传输的安全性。',
fileExchangeTitle2: '高效文件同步', fileExchangeTitle2: '高效文件同步',
@@ -7079,6 +7107,12 @@ const message = {
imageBatchConfirmPrefix: '即将把 {0} 张镜像转发到 {1} 个节点,共 {2} 个任务。', imageBatchConfirmPrefix: '即将把 {0} 张镜像转发到 {1} 个节点,共 {2} 个任务。',
ssl: '证书同步', ssl: '证书同步',
phpExtensions: 'PHP 扩展模版同步',
phpExtensionsTitle: '扩展模版同步',
phpExtensionsDesc: '选择源节点后,可将指定 PHP 扩展模版同步到目标节点。',
phpExtensionsList: '扩展列表',
phpExtensionsConfirm: '即将把 {0} 个 PHP 扩展模版同步到 {1} 个目标节点。',
phpExtensionsConflictHint: '同名且内容一致的模版将跳过;同名但内容不同的模版将提示冲突,不会覆盖。',
sslBatchDesc: '选择源节点后,可将指定证书同步到当前面板环境。', sslBatchDesc: '选择源节点后,可将指定证书同步到当前面板环境。',
sslBatchConfirmPrefix: '即将把 {0} 张证书同步到 {1} 个节点,共 {2} 个任务。', sslBatchConfirmPrefix: '即将把 {0} 张证书同步到 {1} 个节点,共 {2} 个任务。',