Compare commits

...
Author SHA1 Message Date
Yuki Guoandssongliu d658395188 feat(sync): sync php extended template (#14299)
* feat(sync): sync php extended template

* fix(i18n): complete resource sync translations

---------

Co-authored-by: ssongliu <sloooop1x@gmail.com>
2026-11-05 15:06:12 +08:00
ssongliu 51bae946e1 feat(ai): refine model service terminology and provider setup (#14305) 2026-11-05 14:58:17 +08:00
Yuki Guo 56c7981b3a fix(docker): check image update (#14302) 2026-11-05 14:03:55 +08:00
ssongliu 730dbbab5b fix(vllm): distinguish empty metrics from collection failures (#14303) 2026-11-04 20:42:58 +08:00
ssongliu 2e9c1794f2 feat: separate model services into a standalone menu (#14300) 2026-11-04 17:23:21 +08:00
66 changed files with 1113 additions and 295 deletions
+11 -11
View File
@@ -380,7 +380,7 @@ func (b *BaseApi) DeleteHermesChatSession(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Get model account providers // @Summary Get model service providers
// @Success 200 {array} dto.ProviderInfo // @Success 200 {array} dto.ProviderInfo
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Security Timestamp // @Security Timestamp
@@ -395,7 +395,7 @@ func (b *BaseApi) GetAgentProviders(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Create model account // @Summary Create model service
// @Accept json // @Accept json
// @Param request body dto.AgentAccountCreateReq true "request" // @Param request body dto.AgentAccountCreateReq true "request"
// @Success 200 // @Success 200
@@ -415,7 +415,7 @@ func (b *BaseApi) CreateAgentAccount(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Update model account // @Summary Update model service
// @Accept json // @Accept json
// @Param request body dto.AgentAccountUpdateReq true "request" // @Param request body dto.AgentAccountUpdateReq true "request"
// @Success 200 // @Success 200
@@ -435,7 +435,7 @@ func (b *BaseApi) UpdateAgentAccount(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Page model accounts // @Summary Page model services
// @Accept json // @Accept json
// @Param request body dto.AgentAccountSearch true "request" // @Param request body dto.AgentAccountSearch true "request"
// @Success 200 {object} dto.PageResult // @Success 200 {object} dto.PageResult
@@ -459,7 +459,7 @@ func (b *BaseApi) PageAgentAccounts(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Count model accounts by provider // @Summary Count model services by provider
// @Accept json // @Accept json
// @Param request body dto.AgentAccountProviderCountReq true "request" // @Param request body dto.AgentAccountProviderCountReq true "request"
// @Success 200 {object} map[string]int64 // @Success 200 {object} map[string]int64
@@ -480,7 +480,7 @@ func (b *BaseApi) CountAgentAccountsByProviders(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary List model account models // @Summary List model service models
// @Accept json // @Accept json
// @Param request body dto.AgentAccountModelReq true "request" // @Param request body dto.AgentAccountModelReq true "request"
// @Success 200 {array} dto.AgentAccountModel // @Success 200 {array} dto.AgentAccountModel
@@ -522,7 +522,7 @@ func (b *BaseApi) DiscoverAgentAccountModels(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Create model account model // @Summary Create model service model
// @Accept json // @Accept json
// @Param request body dto.AgentAccountModelCreateReq true "request" // @Param request body dto.AgentAccountModelCreateReq true "request"
// @Success 200 // @Success 200
@@ -542,7 +542,7 @@ func (b *BaseApi) CreateAgentAccountModel(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Update model account model // @Summary Update model service model
// @Accept json // @Accept json
// @Param request body dto.AgentAccountModelUpdateReq true "request" // @Param request body dto.AgentAccountModelUpdateReq true "request"
// @Success 200 // @Success 200
@@ -562,7 +562,7 @@ func (b *BaseApi) UpdateAgentAccountModel(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Delete model account model // @Summary Delete model service model
// @Accept json // @Accept json
// @Param request body dto.AgentAccountModelDeleteReq true "request" // @Param request body dto.AgentAccountModelDeleteReq true "request"
// @Success 200 // @Success 200
@@ -582,7 +582,7 @@ func (b *BaseApi) DeleteAgentAccountModel(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Verify model account // @Summary Verify model service
// @Accept json // @Accept json
// @Param request body dto.AgentAccountVerifyReq true "request" // @Param request body dto.AgentAccountVerifyReq true "request"
// @Success 200 // @Success 200
@@ -602,7 +602,7 @@ func (b *BaseApi) VerifyAgentAccount(c *gin.Context) {
} }
// @Tags AI // @Tags AI
// @Summary Delete model account // @Summary Delete model service
// @Accept json // @Accept json
// @Param request body dto.AgentAccountDeleteReq true "request" // @Param request body dto.AgentAccountDeleteReq true "request"
// @Success 200 // @Success 200
+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 {
+4
View File
@@ -59,6 +59,10 @@ var catalog = map[string]Meta{
Key: "vllm", DisplayName: "vLLM", Sort: 20, DefaultAPIType: "openai-completions", EnvKey: "VLLM_API_KEY", Key: "vllm", DisplayName: "vLLM", Sort: 20, DefaultAPIType: "openai-completions", EnvKey: "VLLM_API_KEY",
APIConfigs: editableAPIConfigs(false, "openai-completions", "openai-responses", "anthropic-messages", "openai-images", "openai-embeddings"), APIConfigs: editableAPIConfigs(false, "openai-completions", "openai-responses", "anthropic-messages", "openai-images", "openai-embeddings"),
}, },
"1panel-ai-gateway": {
Key: "1panel-ai-gateway", DisplayName: "1Panel AI Gateway", DisplayNameKey: "AIProvider1PanelGateway", Sort: 21, DefaultAPIType: "openai-completions", EnvKey: "ONEPANEL_AI_GATEWAY_API_KEY",
APIConfigs: editableAPIConfigs(true, "openai-completions", "openai-responses", "anthropic-messages", "openai-images", "openai-embeddings"),
},
"deepseek": { "deepseek": {
Key: "deepseek", DisplayName: "DeepSeek", Sort: 25, DefaultAPIType: "openai-completions", EnvKey: "DEEPSEEK_API_KEY", Key: "deepseek", DisplayName: "DeepSeek", Sort: 25, DefaultAPIType: "openai-completions", EnvKey: "DEEPSEEK_API_KEY",
APIConfigs: []APIConfig{ APIConfigs: []APIConfig{
+4 -4
View File
@@ -36,7 +36,7 @@ func SyncLocalModelAccount(install model.AppInstall, accountID uint, baseURL str
return nil, err return nil, err
} }
if err == nil && account.AppInstallID != 0 && account.AppInstallID != install.ID { if err == nil && account.AppInstallID != 0 && account.AppInstallID != install.ID {
return nil, fmt.Errorf("model account belongs to another installation") return nil, fmt.Errorf("model service belongs to another installation")
} }
} }
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
@@ -228,12 +228,12 @@ func CleanupLocalModelAccount(installID uint) {
} }
accounts, err := agentAccountRepo.List(repo.WithByAppInstallID(installID)) accounts, err := agentAccountRepo.List(repo.WithByAppInstallID(installID))
if err != nil { if err != nil {
global.LOG.Errorf("load local model accounts: %v", err) global.LOG.Errorf("load local model services: %v", err)
return return
} }
for _, account := range accounts { for _, account := range accounts {
if err := (AgentService{}).DeleteAccount(dto.AgentAccountDeleteReq{ID: account.ID}); err != nil { if err := (AgentService{}).DeleteAccount(dto.AgentAccountDeleteReq{ID: account.ID}); err != nil {
global.LOG.Warnf("keep local model account %d after uninstall: %v", account.ID, err) global.LOG.Warnf("keep local model service %d after uninstall: %v", account.ID, err)
} }
} }
} }
@@ -243,7 +243,7 @@ func ResolveLocalModelAccountBaseURL(addressType, customURL, containerName, cont
case "custom": case "custom":
baseURL := strings.TrimRight(strings.TrimSpace(customURL), "/") baseURL := strings.TrimRight(strings.TrimSpace(customURL), "/")
if !strings.HasPrefix(baseURL, "http://") && !strings.HasPrefix(baseURL, "https://") { if !strings.HasPrefix(baseURL, "http://") && !strings.HasPrefix(baseURL, "https://") {
return "", fmt.Errorf("model account base URL must start with http:// or https://") return "", fmt.Errorf("model service base URL must start with http:// or https://")
} }
return baseURL, nil return baseURL, nil
case "localhost": case "localhost":
@@ -299,8 +299,19 @@ func checkContainerImageUpdate(ctx context.Context, cli imageCheckUpdateDockerCl
record.LatestVersion = remote.target.Tag record.LatestVersion = remote.target.Tag
record.TargetImage = "docker.io/" + repository + ":" + remote.target.Tag record.TargetImage = "docker.io/" + repository + ":" + remote.target.Tag
record.TargetImageID = remote.target.ConfigDigest record.TargetImageID = remote.target.ConfigDigest
sameImage := inspected.ID == remote.target.ConfigDigest
if inspected.Descriptor != nil {
// The containerd store uses the pulled index/manifest as its image ID,
// not the config digest. Persist the ID that pulling this tag will produce
// so post-upgrade reconciliation uses the same identity as Docker.
if remote.target.ReferenceDigest == "" {
return record, fmt.Errorf("Docker Hub manifest response is missing its digest")
}
record.TargetImageID = remote.target.ReferenceDigest
sameImage = inspected.ID == remote.target.ReferenceDigest || inspected.ID == remote.target.Digest
}
// Both versioned and floating tags can be republished with new image content. // Both versioned and floating tags can be republished with new image content.
record.HasUpdate = remote.target.Tag != tag || remote.target.ConfigDigest != inspected.ID record.HasUpdate = remote.target.Tag != tag || !sameImage
return record, nil return record, nil
} }
return record, fmt.Errorf("no compatible image for %s/%s", platform.OS, platform.Architecture) return record, fmt.Errorf("no compatible image for %s/%s", platform.OS, platform.Architecture)
+5
View File
@@ -286,6 +286,11 @@ func collectVLLMMetrics(ctx context.Context, install model.AppInstall, previous
return point, err return point, err
} }
point.CreatedAt = time.Now() point.CreatedAt = time.Now()
if len(metrics) == 0 {
point.Status = "no_data"
point.RawMetrics = "{}"
return point, nil
}
raw, err := json.Marshal(metrics) raw, err := json.Marshal(metrics)
if err != nil { if err != nil {
return point, err return point, err
+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)
}
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: "Decrypt"
# agent # agent
ErrAgentAccountBound: 'Account is bound to an agent and cannot be deleted' ErrAgentAccountBound: 'Account is bound to an agent and cannot be deleted'
ErrTerminalAIAccountInUse: 'This model account is currently used by Terminal AI. Switch the account in Terminal AI settings or disable Terminal AI and try again.' ErrTerminalAIAccountInUse: 'This model service is currently used by Terminal AI. Switch the account in Terminal AI settings or disable Terminal AI and try again.'
ErrFileAIAccountInUse: 'This model account is currently used by File Management AI. Switch the account in File Management AI settings or disable File Management AI and try again.' ErrFileAIAccountInUse: 'This model service is currently used by File Management AI. Switch the account in File Management AI settings or disable File Management AI and try again.'
ErrAgentAccountUnavailable: 'Account connection unavailable: {{ .err }}' ErrAgentAccountUnavailable: 'Account connection unavailable: {{ .err }}'
ErrAgentProviderNotSupported: 'Unsupported agent provider' ErrAgentProviderNotSupported: 'Unsupported agent provider'
ErrAgentAccountRequired: 'Select an agent account first' ErrAgentAccountRequired: 'Select an agent account first'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI request failed: {{ .err }}'
# AI gateway # AI gateway
ErrAIProxyServiceNotInstalled: '{{ .name }} service is not installed' ErrAIProxyServiceNotInstalled: '{{ .name }} service is not installed'
ErrAIProxyModelAccountNotFound: 'Model account {{ .id }} not found' ErrAIProxyModelAccountNotFound: 'Model service {{ .id }} not found'
ErrAIProxyModelMapRequired: 'This field is required.' ErrAIProxyModelMapRequired: 'This field is required.'
ErrAIProxyModelMapInvalid: 'Model mapping must be a valid JSON object: {{ .err }}' ErrAIProxyModelMapInvalid: 'Model mapping must be a valid JSON object: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Model mapping cannot be empty' ErrAIProxyModelMapEmpty: 'Model mapping cannot be empty'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI Gateway'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'The Docker DOCKER-USER chain was not found. Restart Docker and try again' ErrDockerIptablesChainUnavailable: 'The Docker DOCKER-USER chain was not found. Restart Docker and try again'
@@ -815,3 +816,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"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Descifrar'
# agente # agente
ErrAgentAccountBound: 'Cuenta vinculada a agente' ErrAgentAccountBound: 'Cuenta vinculada a agente'
ErrTerminalAIAccountInUse: 'Esta cuenta de modelo esta siendo usada por Terminal AI. Cambia la cuenta en la configuracion de Terminal AI o desactiva Terminal AI y vuelve a intentarlo.' ErrTerminalAIAccountInUse: 'Este servicio de modelo esta siendo usado por Terminal AI. Cambia la cuenta en la configuracion de Terminal AI o desactiva Terminal AI y vuelve a intentarlo.'
ErrFileAIAccountInUse: 'Esta cuenta de modelo está siendo utilizada por la IA del gestor de archivos. Cambia la cuenta en su configuración o desactívala y vuelve a intentarlo.' ErrFileAIAccountInUse: 'Este servicio de modelo está siendo utilizado por la IA del gestor de archivos. Cambia la cuenta en su configuración o desactívala y vuelve a intentarlo.'
ErrAgentAccountUnavailable: 'Conexión de cuenta no disponible: {{ .err }}' ErrAgentAccountUnavailable: 'Conexión de cuenta no disponible: {{ .err }}'
ErrAgentProviderNotSupported: 'Proveedor de agente no soportado' ErrAgentProviderNotSupported: 'Proveedor de agente no soportado'
ErrAgentAccountRequired: 'Elige una cuenta de agente primero' ErrAgentAccountRequired: 'Elige una cuenta de agente primero'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'La solicitud de AI ha fallado: {{ .err }}'
# puerta de enlace de IA # puerta de enlace de IA
ErrAIProxyServiceNotInstalled: 'El servicio {{ .name }} no está instalado' ErrAIProxyServiceNotInstalled: 'El servicio {{ .name }} no está instalado'
ErrAIProxyModelAccountNotFound: 'Cuenta de modelo {{ .id }} no encontrada' ErrAIProxyModelAccountNotFound: 'Servicio de modelo {{ .id }} no encontrado'
ErrAIProxyModelMapRequired: 'Este campo es obligatorio.' ErrAIProxyModelMapRequired: 'Este campo es obligatorio.'
ErrAIProxyModelMapInvalid: 'El mapeo de modelos debe ser un objeto JSON válido: {{ .err }}' ErrAIProxyModelMapInvalid: 'El mapeo de modelos debe ser un objeto JSON válido: {{ .err }}'
ErrAIProxyModelMapEmpty: 'El mapeo de modelos no puede estar vacío' ErrAIProxyModelMapEmpty: 'El mapeo de modelos no puede estar vacío'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Puerta de enlace de IA de 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'No se encontró la cadena DOCKER-USER de Docker. Reinicie Docker y vuelva a intentarlo' ErrDockerIptablesChainUnavailable: 'No se encontró la cadena DOCKER-USER de Docker. Reinicie Docker y vuelva a intentarlo'
@@ -815,3 +816,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 este nombre y contenido diferente; no se ha sobrescrito"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: "رمزگشایی"
# عامل # عامل
ErrAgentAccountBound: 'حساب به یک عامل متصل است و قابل حذف نیست' ErrAgentAccountBound: 'حساب به یک عامل متصل است و قابل حذف نیست'
ErrTerminalAIAccountInUse: 'این حساب مدل در حال حاضر توسط ترمینال هوش مصنوعی استفاده می‌شود. حساب را در تنظیمات ترمینال هوش مصنوعی تغییر دهید یا ترمینال هوش مصنوعی را غیرفعال کرده و دوباره تلاش کنید.' ErrTerminalAIAccountInUse: 'این سرویس مدل در حال حاضر توسط ترمینال هوش مصنوعی استفاده می‌شود. حساب را در تنظیمات ترمینال هوش مصنوعی تغییر دهید یا ترمینال هوش مصنوعی را غیرفعال کرده و دوباره تلاش کنید.'
ErrFileAIAccountInUse: 'این حساب مدل توسط هوش مصنوعی مدیریت فایل استفاده می‌شود. حساب را در تنظیمات آن تغییر دهید یا هوش مصنوعی مدیریت فایل را غیرفعال کرده و دوباره تلاش کنید.' ErrFileAIAccountInUse: 'این سرویس مدل توسط هوش مصنوعی مدیریت فایل استفاده می‌شود. حساب را در تنظیمات آن تغییر دهید یا هوش مصنوعی مدیریت فایل را غیرفعال کرده و دوباره تلاش کنید.'
ErrAgentAccountUnavailable: 'اتصال حساب در دسترس نیست: {{ .err }}' ErrAgentAccountUnavailable: 'اتصال حساب در دسترس نیست: {{ .err }}'
ErrAgentProviderNotSupported: 'ارائه‌دهنده عامل پشتیبانی نمی‌شود' ErrAgentProviderNotSupported: 'ارائه‌دهنده عامل پشتیبانی نمی‌شود'
ErrAgentAccountRequired: 'ابتدا یک حساب عامل انتخاب کنید' ErrAgentAccountRequired: 'ابتدا یک حساب عامل انتخاب کنید'
@@ -677,7 +677,7 @@ TerminalAIRequestFailed: 'درخواست هوش مصنوعی ناموفق بود
# دروازه هوش مصنوعی # دروازه هوش مصنوعی
ErrAIProxyServiceNotInstalled: 'سرویس {{ .name }} نصب نشده است' ErrAIProxyServiceNotInstalled: 'سرویس {{ .name }} نصب نشده است'
ErrAIProxyModelAccountNotFound: 'حساب مدل {{ .id }} یافت نشد' ErrAIProxyModelAccountNotFound: 'سرویس مدل {{ .id }} یافت نشد'
ErrAIProxyModelMapRequired: 'این فیلد الزامی است.' ErrAIProxyModelMapRequired: 'این فیلد الزامی است.'
ErrAIProxyModelMapInvalid: 'نگاشت مدل باید یک شی JSON معتبر باشد: {{ .err }}' ErrAIProxyModelMapInvalid: 'نگاشت مدل باید یک شی JSON معتبر باشد: {{ .err }}'
ErrAIProxyModelMapEmpty: 'نگاشت مدل نمی‌تواند خالی باشد' ErrAIProxyModelMapEmpty: 'نگاشت مدل نمی‌تواند خالی باشد'
@@ -688,6 +688,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'درگاه هوش مصنوعی 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'زنجیره DOCKER-USER داکر یافت نشد. داکر را راه‌اندازی مجدد کنید و دوباره تلاش کنید' ErrDockerIptablesChainUnavailable: 'زنجیره DOCKER-USER داکر یافت نشد. داکر را راه‌اندازی مجدد کنید و دوباره تلاش کنید'
@@ -816,3 +817,5 @@ ContainerImageCheckSummary: "بررسی پایان یافت: بررسی‌شده
ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموفق بود؛ گزارش وظیفه را مشاهده کنید" ContainerImageCheckFailures: "بررسی {{ .count }} کانتینر ناموفق بود؛ گزارش وظیفه را مشاهده کنید"
ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید." ErrImageCheckProxyRequired: "برای بررسی به‌روزرسانی تصاویر در محیط فعلی، ابتدا یک سرور پروکسی پیکربندی کنید."
ErrPHPExtensionsConflict: "قالب افزونه PHP با این نام و محتوای متفاوت از قبل وجود دارد؛ بازنویسی نشد"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: '復号化'
# エージェント # エージェント
ErrAgentAccountBound: 'アカウントはエージェントに紐づいています' ErrAgentAccountBound: 'アカウントはエージェントに紐づいています'
ErrTerminalAIAccountInUse: 'このモデルアカウントは Terminal AI で使用中です。Terminal AI の設定で別のアカウントへ切り替えるか、Terminal AI を無効にしてから再試行してください。' ErrTerminalAIAccountInUse: 'このモデルサービスは Terminal AI で使用中です。Terminal AI の設定で別のアカウントへ切り替えるか、Terminal AI を無効にしてから再試行してください。'
ErrFileAIAccountInUse: 'このモデルアカウントはファイル管理 AI で使用中です。ファイル管理 AI の設定で別のアカウントへ切り替えるか、ファイル管理 AI を無効にしてから再試行してください。' ErrFileAIAccountInUse: 'このモデルサービスはファイル管理 AI で使用中です。ファイル管理 AI の設定で別のアカウントへ切り替えるか、ファイル管理 AI を無効にしてから再試行してください。'
ErrAgentAccountUnavailable: 'アカウント接続不可: {{ .err }}' ErrAgentAccountUnavailable: 'アカウント接続不可: {{ .err }}'
ErrAgentProviderNotSupported: 'エージェントプロバイダ非対応' ErrAgentProviderNotSupported: 'エージェントプロバイダ非対応'
ErrAgentAccountRequired: 'まずエージェントアカウントを選択' ErrAgentAccountRequired: 'まずエージェントアカウントを選択'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI リクエストに失敗しました: {{ .err }}'
# AIゲートウェイ # AIゲートウェイ
ErrAIProxyServiceNotInstalled: '{{ .name }} サービスはインストールされていません' ErrAIProxyServiceNotInstalled: '{{ .name }} サービスはインストールされていません'
ErrAIProxyModelAccountNotFound: 'モデルアカウント {{ .id }} が見つかりません' ErrAIProxyModelAccountNotFound: 'モデルサービス {{ .id }} が見つかりません'
ErrAIProxyModelMapRequired: 'この項目は必須です。' ErrAIProxyModelMapRequired: 'この項目は必須です。'
ErrAIProxyModelMapInvalid: 'モデルマッピングは有効な JSON オブジェクトである必要があります: {{ .err }}' ErrAIProxyModelMapInvalid: 'モデルマッピングは有効な JSON オブジェクトである必要があります: {{ .err }}'
ErrAIProxyModelMapEmpty: 'モデルマッピングは空にできません' ErrAIProxyModelMapEmpty: 'モデルマッピングは空にできません'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI ゲートウェイ'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'Docker の DOCKER-USER チェーンが見つかりません。Docker を再起動してから再試行してください' ErrDockerIptablesChainUnavailable: 'Docker の DOCKER-USER チェーンが見つかりません。Docker を再起動してから再試行してください'
@@ -815,3 +816,5 @@ ContainerImageCheckSummary: "確認終了:成功 {{ .checked }}、更新可能
ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しました。タスクログを確認してください" ContainerImageCheckFailures: "{{ .count }} コンテナの確認に失敗しました。タスクログを確認してください"
ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。" ErrImageCheckProxyRequired: "現在の実行環境でイメージの更新を確認するには、先にプロキシサーバーを設定してください。"
ErrPHPExtensionsConflict: "同じ名前で内容が異なる PHP 拡張機能テンプレートが既に存在するため、上書きしませんでした"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: '복호화'
# 에이전트 # 에이전트
ErrAgentAccountBound: '계정이 에이전트에 묶여 있습니다' ErrAgentAccountBound: '계정이 에이전트에 묶여 있습니다'
ErrTerminalAIAccountInUse: '이 모델 계정은 현재 터미널 AI에서 사용 중입니다. 터미널 AI 설정에서 다른 계정으로 변경하거나 터미널 AI를 비활성화한 뒤 다시 시도하세요.' ErrTerminalAIAccountInUse: '이 모델 서비스는 현재 터미널 AI에서 사용 중입니다. 터미널 AI 설정에서 다른 계정으로 변경하거나 터미널 AI를 비활성화한 뒤 다시 시도하세요.'
ErrFileAIAccountInUse: '이 모델 계정은 현재 파일 관리 AI에서 사용 중입니다. 파일 관리 AI 설정에서 다른 계정으로 변경하거나 파일 관리 AI를 비활성화한 뒤 다시 시도하세요.' ErrFileAIAccountInUse: '이 모델 서비스는 현재 파일 관리 AI에서 사용 중입니다. 파일 관리 AI 설정에서 다른 계정으로 변경하거나 파일 관리 AI를 비활성화한 뒤 다시 시도하세요.'
ErrAgentAccountUnavailable: '계정 연결 불가: {{ .err }}' ErrAgentAccountUnavailable: '계정 연결 불가: {{ .err }}'
ErrAgentProviderNotSupported: '지원되지 않는 에이전트 공급자' ErrAgentProviderNotSupported: '지원되지 않는 에이전트 공급자'
ErrAgentAccountRequired: '먼저 에이전트 계정을 선택하세요' ErrAgentAccountRequired: '먼저 에이전트 계정을 선택하세요'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI 요청 실패: {{ .err }}'
# AI 게이트웨이 # AI 게이트웨이
ErrAIProxyServiceNotInstalled: '{{ .name }} 서비스가 설치되어 있지 않습니다' ErrAIProxyServiceNotInstalled: '{{ .name }} 서비스가 설치되어 있지 않습니다'
ErrAIProxyModelAccountNotFound: '모델 계정 {{ .id }}을(를) 찾을 수 없습니다' ErrAIProxyModelAccountNotFound: '모델 서비스 {{ .id }}을(를) 찾을 수 없습니다'
ErrAIProxyModelMapRequired: '이 필드는 필수입니다.' ErrAIProxyModelMapRequired: '이 필드는 필수입니다.'
ErrAIProxyModelMapInvalid: '모델 매핑은 유효한 JSON 객체여야 합니다: {{ .err }}' ErrAIProxyModelMapInvalid: '모델 매핑은 유효한 JSON 객체여야 합니다: {{ .err }}'
ErrAIProxyModelMapEmpty: '모델 매핑은 비워 둘 수 없습니다' ErrAIProxyModelMapEmpty: '모델 매핑은 비워 둘 수 없습니다'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI 게이트웨이'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER 체인을 찾을 수 없습니다. Docker를 다시 시작한 후 재시도하세요' ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER 체인을 찾을 수 없습니다. Docker를 다시 시작한 후 재시도하세요'
@@ -815,3 +816,5 @@ ContainerImageCheckSummary: "확인 종료: 성공 {{ .checked }}, 업데이트
ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했습니다. 작업 로그를 확인하세요" ContainerImageCheckFailures: "컨테이너 {{ .count }}개 확인에 실패했습니다. 작업 로그를 확인하세요"
ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요." ErrImageCheckProxyRequired: "현재 실행 환경에서 이미지 업데이트를 확인하려면 먼저 프록시 서버를 설정하세요."
ErrPHPExtensionsConflict: "같은 이름에 내용이 다른 PHP 확장 템플릿이 이미 있어 덮어쓰지 않았습니다"
+6 -3
View File
@@ -55,8 +55,8 @@ Decrypt: "ຖອດລະຫັດ"
#agent #agent
ErrAgentAccountBound: 'ບັນຊີຖືກຜູກມັດກັບຕົວແທນ (Agent) ແລະບໍ່ສາມາດລຶບໄດ້' ErrAgentAccountBound: 'ບັນຊີຖືກຜູກມັດກັບຕົວແທນ (Agent) ແລະບໍ່ສາມາດລຶບໄດ້'
ErrTerminalAIAccountInUse: 'ບັນຊີໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ Terminal AI. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ Terminal AI ຫຼື ປິດໃຊ້ງານ Terminal AI ແລ້ວລອງໃໝ່.' ErrTerminalAIAccountInUse: 'ບໍລິການໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ Terminal AI. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ Terminal AI ຫຼື ປິດໃຊ້ງານ Terminal AI ແລ້ວລອງໃໝ່.'
ErrFileAIAccountInUse: 'ບັນຊີໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ AI ຈັດການໄຟລ໌. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ AI ຈັດການໄຟລ໌ ຫຼື ປິດໃຊ້ງານແລ້ວລອງໃໝ່.' ErrFileAIAccountInUse: 'ບໍລິການໂມເດລນີ້ກຳລັງຖືກໃຊ້ໂດຍ AI ຈັດການໄຟລ໌. ກະລຸນາປ່ຽນບັນຊີໃນການຕັ້ງຄ່າ AI ຈັດການໄຟລ໌ ຫຼື ປິດໃຊ້ງານແລ້ວລອງໃໝ່.'
ErrAgentAccountUnavailable: 'ການເຊື່ອມຕໍ່ບັນຊີບໍ່ສາມາດໃຊ້ງານໄດ້: {{ .err }}' ErrAgentAccountUnavailable: 'ການເຊື່ອມຕໍ່ບັນຊີບໍ່ສາມາດໃຊ້ງານໄດ້: {{ .err }}'
ErrAgentProviderNotSupported: 'ບໍ່ຮອງຮັບຜູ້ໃຫ້ບໍລິການຕົວແທນນີ້' ErrAgentProviderNotSupported: 'ບໍ່ຮອງຮັບຜູ້ໃຫ້ບໍລິການຕົວແທນນີ້'
ErrAgentAccountRequired: 'ກະລຸນາເລືອກບັນຊີຕົວແທນກ່ອນ' ErrAgentAccountRequired: 'ກະລຸນາເລືອກບັນຊີຕົວແທນກ່ອນ'
@@ -667,7 +667,7 @@ FileAISearchEmptyDir: 'ບໍ່ພົບໄຟລ໌ ຫຼື ໂຟນເດ
# ai proxy # ai proxy
ErrAIProxyServiceNotInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງບໍລິການ {{ .name }}' ErrAIProxyServiceNotInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງບໍລິການ {{ .name }}'
ErrAIProxyModelAccountNotFound: 'ບໍ່ພົບບັນຊີໂມເດລ {{ .id }}' ErrAIProxyModelAccountNotFound: 'ບໍ່ພົບບໍລິການໂມເດລ {{ .id }}'
ErrAIProxyModelMapRequired: 'ຟິວ (Field) ນີ້ຈຳເປັນຕ້ອງມີ.' ErrAIProxyModelMapRequired: 'ຟິວ (Field) ນີ້ຈຳເປັນຕ້ອງມີ.'
ErrAIProxyModelMapInvalid: 'ການຈັບຄູ່ໂມເດລຕ້ອງເປັນວັດຖຸ JSON ທີ່ຖືກຕ້ອງ: {{ .err }}' ErrAIProxyModelMapInvalid: 'ການຈັບຄູ່ໂມເດລຕ້ອງເປັນວັດຖຸ JSON ທີ່ຖືກຕ້ອງ: {{ .err }}'
ErrAIProxyModelMapEmpty: 'ການຈັບຄູ່ໂມເດລບໍ່ສາມາດຫວ່າງເປົ່າໄດ້' ErrAIProxyModelMapEmpty: 'ການຈັບຄູ່ໂມເດລບໍ່ສາມາດຫວ່າງເປົ່າໄດ້'
@@ -678,6 +678,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'ເກດເວ AI ຂອງ 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'ບໍ່ພົບ chain DOCKER-USER ຂອງ Docker. ກະລຸນາເລີ່ມ Docker ໃໝ່ແລ້ວລອງອີກຄັ້ງ' ErrDockerIptablesChainUnavailable: 'ບໍ່ພົບ chain DOCKER-USER ຂອງ Docker. ກະລຸນາເລີ່ມ Docker ໃໝ່ແລ້ວລອງອີກຄັ້ງ'
@@ -806,3 +807,5 @@ ContainerImageCheckSummary: "ກວດສອບສິ້ນສຸດ: ກວດ
ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນເນີລົ້ມເຫຼວ; ກະລຸນາເບິ່ງບັນທຶກວຽກ" ContainerImageCheckFailures: "ກວດສອບ {{ .count }} ຄອນເທນເນີລົ້ມເຫຼວ; ກະລຸນາເບິ່ງບັນທຶກວຽກ"
ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ." ErrImageCheckProxyRequired: "ເພື່ອກວດສອບການອັບເດດອິມເມຈໃນສະພາບແວດລ້ອມປັດຈຸບັນ ກະລຸນາຕັ້ງຄ່າພຣັອກຊີເຊີບເວີກ່ອນ."
ErrPHPExtensionsConflict: "ມີແມ່ແບບສ່ວນຂະຫຍາຍ PHP ຊື່ນີ້ຢູ່ແລ້ວແຕ່ເນື້ອຫາຕ່າງກັນ; ບໍ່ໄດ້ຂຽນທັບ"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Dekripsi'
# ejen # ejen
ErrAgentAccountBound: 'Akaun terikat kepada ejen' ErrAgentAccountBound: 'Akaun terikat kepada ejen'
ErrTerminalAIAccountInUse: 'Akaun model ini sedang digunakan oleh Terminal AI. Tukar akaun dalam tetapan Terminal AI atau nyahaktifkan Terminal AI, kemudian cuba lagi.' ErrTerminalAIAccountInUse: 'Perkhidmatan model ini sedang digunakan oleh Terminal AI. Tukar akaun dalam tetapan Terminal AI atau nyahaktifkan Terminal AI, kemudian cuba lagi.'
ErrFileAIAccountInUse: 'Akaun model ini sedang digunakan oleh AI pengurusan fail. Tukar akaun dalam tetapannya atau nyahaktifkan AI tersebut, kemudian cuba lagi.' ErrFileAIAccountInUse: 'Perkhidmatan model ini sedang digunakan oleh AI pengurusan fail. Tukar akaun dalam tetapannya atau nyahaktifkan AI tersebut, kemudian cuba lagi.'
ErrAgentAccountUnavailable: 'Sambungan akaun tidak tersedia: {{ .err }}' ErrAgentAccountUnavailable: 'Sambungan akaun tidak tersedia: {{ .err }}'
ErrAgentProviderNotSupported: 'Penyedia ejen tidak disokong' ErrAgentProviderNotSupported: 'Penyedia ejen tidak disokong'
ErrAgentAccountRequired: 'Pilih akaun ejen terlebih dahulu' ErrAgentAccountRequired: 'Pilih akaun ejen terlebih dahulu'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Permintaan AI gagal: {{ .err }}'
# gerbang AI # gerbang AI
ErrAIProxyServiceNotInstalled: 'Perkhidmatan {{ .name }} belum dipasang' ErrAIProxyServiceNotInstalled: 'Perkhidmatan {{ .name }} belum dipasang'
ErrAIProxyModelAccountNotFound: 'Akaun model {{ .id }} tidak ditemui' ErrAIProxyModelAccountNotFound: 'Perkhidmatan model {{ .id }} tidak ditemui'
ErrAIProxyModelMapRequired: 'Medan ini wajib diisi.' ErrAIProxyModelMapRequired: 'Medan ini wajib diisi.'
ErrAIProxyModelMapInvalid: 'Pemetaan model mestilah objek JSON yang sah: {{ .err }}' ErrAIProxyModelMapInvalid: 'Pemetaan model mestilah objek JSON yang sah: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Pemetaan model tidak boleh kosong' ErrAIProxyModelMapEmpty: 'Pemetaan model tidak boleh kosong'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Gerbang AI 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'Rantaian DOCKER-USER Docker tidak ditemui. Mulakan semula Docker dan cuba lagi' ErrDockerIptablesChainUnavailable: 'Rantaian DOCKER-USER Docker tidak ditemui. Mulakan semula Docker dan cuba lagi'
@@ -815,3 +816,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 ini sudah wujud tetapi kandungannya berbeza; tidak ditulis ganti"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Descriptografar'
# agente # agente
ErrAgentAccountBound: 'Conta vinculada a agente' ErrAgentAccountBound: 'Conta vinculada a agente'
ErrTerminalAIAccountInUse: 'Esta conta de modelo esta sendo usada pelo Terminal AI. Troque a conta nas configuracoes do Terminal AI ou desative o Terminal AI e tente novamente.' ErrTerminalAIAccountInUse: 'Este serviço de modelo esta sendo usado pelo Terminal AI. Troque a conta nas configuracoes do Terminal AI ou desative o Terminal AI e tente novamente.'
ErrFileAIAccountInUse: 'Esta conta de modelo está sendo usada pela IA do gerenciador de arquivos. Troque a conta nas configurações ou desative a IA e tente novamente.' ErrFileAIAccountInUse: 'Este serviço de modelo está sendo usado pela IA do gerenciador de arquivos. Troque a conta nas configurações ou desative a IA e tente novamente.'
ErrAgentAccountUnavailable: 'Conexão da conta indisponível: {{ .err }}' ErrAgentAccountUnavailable: 'Conexão da conta indisponível: {{ .err }}'
ErrAgentProviderNotSupported: 'Provedor de agente não suportado' ErrAgentProviderNotSupported: 'Provedor de agente não suportado'
ErrAgentAccountRequired: 'Selecione uma conta de agente primeiro' ErrAgentAccountRequired: 'Selecione uma conta de agente primeiro'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Falha na solicitação de AI: {{ .err }}'
# gateway de IA # gateway de IA
ErrAIProxyServiceNotInstalled: 'O serviço {{ .name }} não está instalado' ErrAIProxyServiceNotInstalled: 'O serviço {{ .name }} não está instalado'
ErrAIProxyModelAccountNotFound: 'Conta de modelo {{ .id }} não encontrada' ErrAIProxyModelAccountNotFound: 'Serviço de modelo {{ .id }} não encontrado'
ErrAIProxyModelMapRequired: 'Este campo é obrigatório.' ErrAIProxyModelMapRequired: 'Este campo é obrigatório.'
ErrAIProxyModelMapInvalid: 'O mapeamento de modelos deve ser um objeto JSON válido: {{ .err }}' ErrAIProxyModelMapInvalid: 'O mapeamento de modelos deve ser um objeto JSON válido: {{ .err }}'
ErrAIProxyModelMapEmpty: 'O mapeamento de modelos não pode estar vazio' ErrAIProxyModelMapEmpty: 'O mapeamento de modelos não pode estar vazio'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'Gateway de IA do 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'A cadeia DOCKER-USER do Docker não foi encontrada. Reinicie o Docker e tente novamente' ErrDockerIptablesChainUnavailable: 'A cadeia DOCKER-USER do Docker não foi encontrada. Reinicie o Docker e tente novamente'
@@ -815,3 +816,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 este nome e conteúdo diferente; ele não foi sobrescrito"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Расшифровать'
# агент # агент
ErrAgentAccountBound: 'Акаунт привязан к агенту' ErrAgentAccountBound: 'Акаунт привязан к агенту'
ErrTerminalAIAccountInUse: 'Эта учетная запись модели сейчас используется Terminal AI. Смените учетную запись в настройках Terminal AI или отключите Terminal AI и повторите попытку.' ErrTerminalAIAccountInUse: 'Этот сервис модели сейчас используется Terminal AI. Смените учетную запись в настройках Terminal AI или отключите Terminal AI и повторите попытку.'
ErrFileAIAccountInUse: 'Эта учетная запись модели используется ИИ файлового менеджера. Смените учетную запись в его настройках или отключите ИИ и повторите попытку.' ErrFileAIAccountInUse: 'Этот сервис модели используется ИИ файлового менеджера. Смените учетную запись в его настройках или отключите ИИ и повторите попытку.'
ErrAgentAccountUnavailable: 'Связь с аккаунтом недоступна: {{ .err }}' ErrAgentAccountUnavailable: 'Связь с аккаунтом недоступна: {{ .err }}'
ErrAgentProviderNotSupported: 'Провайдер агента не поддерживается' ErrAgentProviderNotSupported: 'Провайдер агента не поддерживается'
ErrAgentAccountRequired: 'Выберите аккаунт агента' ErrAgentAccountRequired: 'Выберите аккаунт агента'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'Ошибка запроса AI: {{ .err }}'
# AI-шлюз # AI-шлюз
ErrAIProxyServiceNotInstalled: 'Сервис {{ .name }} не установлен' ErrAIProxyServiceNotInstalled: 'Сервис {{ .name }} не установлен'
ErrAIProxyModelAccountNotFound: 'Аккаунт модели {{ .id }} не найден' ErrAIProxyModelAccountNotFound: 'Сервис модели {{ .id }} не найден'
ErrAIProxyModelMapRequired: 'Это поле обязательно.' ErrAIProxyModelMapRequired: 'Это поле обязательно.'
ErrAIProxyModelMapInvalid: 'Сопоставление моделей должно быть допустимым JSON-объектом: {{ .err }}' ErrAIProxyModelMapInvalid: 'Сопоставление моделей должно быть допустимым JSON-объектом: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Сопоставление моделей не может быть пустым' ErrAIProxyModelMapEmpty: 'Сопоставление моделей не может быть пустым'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: 'ИИ-шлюз 1Panel'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'Цепочка Docker DOCKER-USER не найдена. Перезапустите Docker и повторите попытку' ErrDockerIptablesChainUnavailable: 'Цепочка Docker DOCKER-USER не найдена. Перезапустите Docker и повторите попытку'
@@ -815,3 +816,5 @@ ContainerImageCheckSummary: "Проверка завершена: провере
ContainerImageCheckFailures: "Не удалось проверить контейнеры: {{ .count }}. Подробности в журнале задачи" ContainerImageCheckFailures: "Не удалось проверить контейнеры: {{ .count }}. Подробности в журнале задачи"
ErrImageCheckProxyRequired: "Для проверки обновлений образов в текущей среде сначала настройте прокси-сервер." ErrImageCheckProxyRequired: "Для проверки обновлений образов в текущей среде сначала настройте прокси-сервер."
ErrPHPExtensionsConflict: "Шаблон расширений PHP с таким именем уже существует и имеет другое содержимое; перезапись не выполнена"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: 'Şifre Çöz'
# ajan # ajan
ErrAgentAccountBound: 'Hesap bir ajana bağlı' ErrAgentAccountBound: 'Hesap bir ajana bağlı'
ErrTerminalAIAccountInUse: 'Bu model hesabi su anda Terminal AI tarafindan kullaniliyor. Terminal AI ayarlarinda baska bir hesaba gecin veya Terminal AI yi devre disi birakip tekrar deneyin.' ErrTerminalAIAccountInUse: 'Bu model hizmeti su anda Terminal AI tarafindan kullaniliyor. Terminal AI ayarlarinda baska bir hesaba gecin veya Terminal AI yi devre disi birakip tekrar deneyin.'
ErrFileAIAccountInUse: 'Bu model hesabı dosya yönetimi yapay zekası tarafından kullanılıyor. Ayarlardan hesabı değiştirin veya yapay zekayı devre dışı bırakıp yeniden deneyin.' ErrFileAIAccountInUse: 'Bu model hizmeti dosya yönetimi yapay zekası tarafından kullanılıyor. Ayarlardan hesabı değiştirin veya yapay zekayı devre dışı bırakıp yeniden deneyin.'
ErrAgentAccountUnavailable: 'Hesap bağlantısı yok: {{ .err }}' ErrAgentAccountUnavailable: 'Hesap bağlantısı yok: {{ .err }}'
ErrAgentProviderNotSupported: 'Ajans sağlayıcısı desteklenmiyor' ErrAgentProviderNotSupported: 'Ajans sağlayıcısı desteklenmiyor'
ErrAgentAccountRequired: 'Önce bir ajans hesabı seçin' ErrAgentAccountRequired: 'Önce bir ajans hesabı seçin'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI istegi basarisiz oldu: {{ .err }}'
# AI ağ geçidi # AI ağ geçidi
ErrAIProxyServiceNotInstalled: '{{ .name }} servisi kurulu değil' ErrAIProxyServiceNotInstalled: '{{ .name }} servisi kurulu değil'
ErrAIProxyModelAccountNotFound: 'Model hesabı {{ .id }} bulunamadı' ErrAIProxyModelAccountNotFound: 'Model hizmeti {{ .id }} bulunamadı'
ErrAIProxyModelMapRequired: 'Bu alan zorunludur.' ErrAIProxyModelMapRequired: 'Bu alan zorunludur.'
ErrAIProxyModelMapInvalid: 'Model eşlemesi geçerli bir JSON nesnesi olmalıdır: {{ .err }}' ErrAIProxyModelMapInvalid: 'Model eşlemesi geçerli bir JSON nesnesi olmalıdır: {{ .err }}'
ErrAIProxyModelMapEmpty: 'Model eşlemesi boş olamaz' ErrAIProxyModelMapEmpty: 'Model eşlemesi boş olamaz'
@@ -687,6 +687,7 @@ AIProviderBailian: 'Alibaba Cloud Model Studio'
AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan' AIProviderBailianCodingPlan: 'Alibaba Cloud Model Studio Coding Plan'
AIProviderArk: 'Volcengine Ark' AIProviderArk: 'Volcengine Ark'
AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan' AIProviderArkCodingPlan: 'Volcengine Ark Coding Plan'
AIProvider1PanelGateway: '1Panel AI Ağ Geçidi'
# Firewall # Firewall
ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER zinciri bulunamadı. Docker’ı yeniden başlatıp tekrar deneyin' ErrDockerIptablesChainUnavailable: 'Docker DOCKER-USER zinciri bulunamadı. Docker’ı yeniden başlatıp tekrar deneyin'
@@ -815,3 +816,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: "Bu ada sahip ancak içeriği farklı bir PHP uzantı şablonu zaten mevcut; üzerine yazılmadı"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: '解密'
# 智慧體 # 智慧體
ErrAgentAccountBound: '該帳號已綁定到智能體,無法刪除,請重試。' ErrAgentAccountBound: '該帳號已綁定到智能體,無法刪除,請重試。'
ErrTerminalAIAccountInUse: '該模型帳號正被終端 AI 使用,請在終端 AI 設定中更換帳號或關閉終端 AI 後再試。' ErrTerminalAIAccountInUse: '該模型服務正被終端 AI 使用,請在終端 AI 設定中更換帳號或關閉終端 AI 後再試。'
ErrFileAIAccountInUse: '該模型帳號正被檔案管理 AI 使用,請在檔案管理 AI 設定中更換帳號或關閉檔案管理 AI 後再試。' ErrFileAIAccountInUse: '該模型服務正被檔案管理 AI 使用,請在檔案管理 AI 設定中更換帳號或關閉檔案管理 AI 後再試。'
ErrAgentAccountUnavailable: '帳號連線資訊不可用,錯誤:{{ .err }},請重試' ErrAgentAccountUnavailable: '帳號連線資訊不可用,錯誤:{{ .err }},請重試'
ErrAgentProviderNotSupported: '暫不支援該智能體提供商,請重試' ErrAgentProviderNotSupported: '暫不支援該智能體提供商,請重試'
ErrAgentAccountRequired: '請選擇智能體帳號後重試' ErrAgentAccountRequired: '請選擇智能體帳號後重試'
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: 'AI 請求失敗:{{ .err }}'
# AI 閘道 # AI 閘道
ErrAIProxyServiceNotInstalled: '{{ .name }} 服務未安裝' ErrAIProxyServiceNotInstalled: '{{ .name }} 服務未安裝'
ErrAIProxyModelAccountNotFound: '模型帳號 {{ .id }} 不存在' ErrAIProxyModelAccountNotFound: '模型服務 {{ .id }} 不存在'
ErrAIProxyModelMapRequired: '請填寫必填項' ErrAIProxyModelMapRequired: '請填寫必填項'
ErrAIProxyModelMapInvalid: '模型映射必須是合法的 JSON 物件:{{ .err }}' ErrAIProxyModelMapInvalid: '模型映射必須是合法的 JSON 物件:{{ .err }}'
ErrAIProxyModelMapEmpty: '模型映射不能為空' ErrAIProxyModelMapEmpty: '模型映射不能為空'
@@ -687,6 +687,7 @@ AIProviderBailian: '阿里雲百煉'
AIProviderBailianCodingPlan: '阿里雲百煉 Coding Plan' AIProviderBailianCodingPlan: '阿里雲百煉 Coding Plan'
AIProviderArk: '火山方舟' AIProviderArk: '火山方舟'
AIProviderArkCodingPlan: '火山方舟 Coding Plan' AIProviderArkCodingPlan: '火山方舟 Coding Plan'
AIProvider1PanelGateway: '1Panel AI 閘道'
# 防火牆 # 防火牆
ErrDockerIptablesChainUnavailable: '未偵測到 Docker 的 DOCKER-USER 鏈,請重新啟動 Docker 後再試' ErrDockerIptablesChainUnavailable: '未偵測到 Docker 的 DOCKER-USER 鏈,請重新啟動 Docker 後再試'
@@ -815,3 +816,5 @@ ContainerImageCheckSummary: "檢查結束:成功 {{ .checked }},可升級 {{
ContainerImageCheckFailures: "{{ .count }} 個容器檢查失敗,請查看任務日誌" ContainerImageCheckFailures: "{{ .count }} 個容器檢查失敗,請查看任務日誌"
ErrImageCheckProxyRequired: "目前運行環境下,如需檢查映像是否更新,請先設定代理伺服器" ErrImageCheckProxyRequired: "目前運行環境下,如需檢查映像是否更新,請先設定代理伺服器"
ErrPHPExtensionsConflict: "同名 PHP 擴充模版已存在且內容不同,未覆蓋"
+6 -3
View File
@@ -70,8 +70,8 @@ Decrypt: "解密"
# 智能体 # 智能体
ErrAgentAccountBound: "该账号已绑定智能体,无法删除" ErrAgentAccountBound: "该账号已绑定智能体,无法删除"
ErrTerminalAIAccountInUse: "该模型账号正被终端 AI 使用,请在终端 AI 设置中更换账号或关闭终端 AI 后重试" ErrTerminalAIAccountInUse: "该模型服务正被终端 AI 使用,请在终端 AI 设置中更换账号或关闭终端 AI 后重试"
ErrFileAIAccountInUse: "该模型账号正被文件管理 AI 使用,请在文件管理 AI 设置中更换账号或关闭文件管理 AI 后重试" ErrFileAIAccountInUse: "该模型服务正被文件管理 AI 使用,请在文件管理 AI 设置中更换账号或关闭文件管理 AI 后重试"
ErrAgentAccountUnavailable: "账号连接信息不可用: {{ .err }}" ErrAgentAccountUnavailable: "账号连接信息不可用: {{ .err }}"
ErrAgentProviderNotSupported: "不支持该智能体提供商" ErrAgentProviderNotSupported: "不支持该智能体提供商"
ErrAgentAccountRequired: "请选择智能体账号后重试" ErrAgentAccountRequired: "请选择智能体账号后重试"
@@ -676,7 +676,7 @@ TerminalAIRequestFailed: "AI 请求失败:{{ .err }}"
# AI 网关 # AI 网关
ErrAIProxyServiceNotInstalled: "{{ .name }} 服务未安装" ErrAIProxyServiceNotInstalled: "{{ .name }} 服务未安装"
ErrAIProxyModelAccountNotFound: "模型账号 {{ .id }} 不存在" ErrAIProxyModelAccountNotFound: "模型服务 {{ .id }} 不存在"
ErrAIProxyModelMapRequired: "请填写必填项" ErrAIProxyModelMapRequired: "请填写必填项"
ErrAIProxyModelMapInvalid: "模型映射必须是合法的 JSON 对象:{{ .err }}" ErrAIProxyModelMapInvalid: "模型映射必须是合法的 JSON 对象:{{ .err }}"
ErrAIProxyModelMapEmpty: "模型映射不能为空" ErrAIProxyModelMapEmpty: "模型映射不能为空"
@@ -687,6 +687,7 @@ AIProviderBailian: "阿里云百炼"
AIProviderBailianCodingPlan: "阿里云百炼 Coding Plan" AIProviderBailianCodingPlan: "阿里云百炼 Coding Plan"
AIProviderArk: "火山方舟" AIProviderArk: "火山方舟"
AIProviderArkCodingPlan: "火山方舟 Coding Plan" AIProviderArkCodingPlan: "火山方舟 Coding Plan"
AIProvider1PanelGateway: '1Panel AI 网关'
# 防火墙 # 防火墙
ErrDockerIptablesChainUnavailable: "未检测到 Docker 的 DOCKER-USER 链,请重启 Docker 后重试" ErrDockerIptablesChainUnavailable: "未检测到 Docker 的 DOCKER-USER 链,请重启 Docker 后重试"
@@ -815,3 +816,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)
+8 -8
View File
@@ -29,13 +29,20 @@ func Parse(reader io.Reader) (Metrics, error) {
scanner.Buffer(make([]byte, 4096), 1024*1024) scanner.Buffer(make([]byte, 4096), 1024*1024)
for scanner.Scan() { for scanner.Scan() {
line := strings.TrimSpace(scanner.Text()) line := strings.TrimSpace(scanner.Text())
if !strings.HasPrefix(line, "vllm:") { if line == "" || strings.HasPrefix(line, "#") {
continue continue
} }
match := re.GetRegex(re.VLLMMetricSamplePattern).FindStringSubmatch(line) match := re.GetRegex(re.VLLMMetricSamplePattern).FindStringSubmatch(line)
if match == nil { if match == nil {
return nil, fmt.Errorf("invalid vLLM metric sample") return nil, fmt.Errorf("invalid vLLM metric sample")
} }
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if !strings.HasPrefix(match[1], "vllm:") {
continue
}
name := strings.TrimPrefix(match[1], "vllm:") name := strings.TrimPrefix(match[1], "vllm:")
switch name { switch name {
case "request_prefill_time_seconds_bucket", "request_decode_time_seconds_bucket", "request_queue_time_seconds_bucket": case "request_prefill_time_seconds_bucket", "request_decode_time_seconds_bucket", "request_queue_time_seconds_bucket":
@@ -52,10 +59,6 @@ func Parse(reader io.Reader) (Metrics, error) {
continue continue
} }
} }
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if math.IsNaN(value) || math.IsInf(value, 0) || value < 0 { if math.IsNaN(value) || math.IsInf(value, 0) || value < 0 {
continue continue
} }
@@ -73,9 +76,6 @@ func Parse(reader io.Reader) (Metrics, error) {
if err := scanner.Err(); err != nil { if err := scanner.Err(); err != nil {
return nil, err return nil, err
} }
if len(metrics) == 0 {
return nil, fmt.Errorf("no supported vLLM metrics")
}
return metrics, nil return metrics, nil
} }
+10 -4
View File
@@ -42,7 +42,12 @@ type Client struct {
} }
type Platform struct{ OS, Architecture, Variant string } type Platform struct{ OS, Architecture, Variant string }
type Target struct{ Tag, Digest, ConfigDigest string } type Target struct {
Tag string
Digest string // Platform-specific manifest digest.
ReferenceDigest string // Tag target: an image index or a single-platform manifest.
ConfigDigest string // Image configuration digest used by the classic Docker image store.
}
func New(ctx context.Context, repository, username, password string, httpClient *http.Client) (*Client, error) { func New(ctx context.Context, repository, username, password string, httpClient *http.Client) (*Client, error) {
if httpClient == nil { if httpClient == nil {
@@ -151,7 +156,8 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if err != nil { if err != nil {
return Target{}, false, err return Target{}, false, err
} }
digest := headers.Get("Docker-Content-Digest") referenceDigest := headers.Get("Docker-Content-Digest")
digest := referenceDigest
if len(m.Manifests) > 0 { if len(m.Manifests) > 0 {
digest = "" digest = ""
for _, item := range m.Manifests { for _, item := range m.Manifests {
@@ -171,7 +177,7 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if m.Config.Digest == "" { if m.Config.Digest == "" {
return Target{}, false, fmt.Errorf("unsupported Docker Hub manifest") return Target{}, false, fmt.Errorf("unsupported Docker Hub manifest")
} }
// Validate single-platform manifests too; the config digest is the Docker Image ID. // Validate single-platform manifests too; classic Docker image IDs use the config digest.
var config struct { var config struct {
OS string `json:"os"` OS string `json:"os"`
Architecture string `json:"architecture"` Architecture string `json:"architecture"`
@@ -183,7 +189,7 @@ func (c *Client) Resolve(ctx context.Context, tag string, platform Platform) (Ta
if config.OS != platform.OS || config.Architecture != platform.Architecture || (platform.Variant != "" && config.Variant != "" && config.Variant != platform.Variant) { if config.OS != platform.OS || config.Architecture != platform.Architecture || (platform.Variant != "" && config.Variant != "" && config.Variant != platform.Variant) {
return Target{}, false, nil return Target{}, false, nil
} }
return Target{Tag: tag, Digest: digest, ConfigDigest: m.Config.Digest}, true, nil return Target{Tag: tag, Digest: digest, ReferenceDigest: referenceDigest, ConfigDigest: m.Config.Digest}, true, nil
} }
var versionPattern = regexp.MustCompile(`^v?(\d+)\.(\d+)(?:\.(\d+))?(-[a-zA-Z][a-zA-Z0-9_.-]*)?$`) var versionPattern = regexp.MustCompile(`^v?(\d+)\.(\d+)(?:\.(\d+))?(-[a-zA-Z][a-zA-Z0-9_.-]*)?$`)
+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)
} }
+11 -11
View File
@@ -51,7 +51,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Create model account", "summary": "Create model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -92,7 +92,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Count model accounts by provider", "summary": "Count model services by provider",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -127,7 +127,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Delete model account", "summary": "Delete model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -168,7 +168,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "List model account models", "summary": "List model service models",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -203,7 +203,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Create model account model", "summary": "Create model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -238,7 +238,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Delete model account model", "summary": "Delete model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -314,7 +314,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Update model account model", "summary": "Update model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -341,7 +341,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Get model account providers", "summary": "Get model service providers",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -379,7 +379,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Page model accounts", "summary": "Page model services",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -414,7 +414,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Update model account", "summary": "Update model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -449,7 +449,7 @@ const docTemplate = `{
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Verify model account", "summary": "Verify model service",
"tags": [ "tags": [
"AI" "AI"
] ]
+11 -11
View File
@@ -43,7 +43,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Create model account", "summary": "Create model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -85,7 +85,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Count model accounts by provider", "summary": "Count model services by provider",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -120,7 +120,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Delete model account", "summary": "Delete model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -161,7 +161,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "List model account models", "summary": "List model service models",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -196,7 +196,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Create model account model", "summary": "Create model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -231,7 +231,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Delete model account model", "summary": "Delete model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -307,7 +307,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Update model account model", "summary": "Update model service model",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -334,7 +334,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Get model account providers", "summary": "Get model service providers",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -372,7 +372,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Page model accounts", "summary": "Page model services",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -407,7 +407,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Update model account", "summary": "Update model service",
"tags": [ "tags": [
"AI" "AI"
] ]
@@ -442,7 +442,7 @@
"Timestamp": [] "Timestamp": []
} }
], ],
"summary": "Verify model account", "summary": "Verify model service",
"tags": [ "tags": [
"AI" "AI"
] ]
+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": {},
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Alert information sync error, check and retry!"
ErrAIProxyUserGroupIsDefault: "Default user group cannot be deleted." ErrAIProxyUserGroupIsDefault: "Default user group cannot be deleted."
ErrAIProxyUserGroupInUse: "The user group is in use and cannot be deleted." ErrAIProxyUserGroupInUse: "The user group is in use and cannot be deleted."
ErrAIProxyUserGroupExists: "The user group name already exists." ErrAIProxyUserGroupExists: "The user group name already exists."
ErrAIProxyBackendAccountExists: "This model account has already been imported into the AI Gateway account pool." ErrAIProxyBackendAccountExists: "This model service has already been imported into the AI Gateway account pool."
ErrAIProxyModelGroupInUse: "The model group is in use and cannot be deleted." ErrAIProxyModelGroupInUse: "The model group is in use and cannot be deleted."
ErrAIProxyModelGroupExists: "The model group name already exists." ErrAIProxyModelGroupExists: "The model group name already exists."
ErrAIProxySensitiveGroupInUse: "The sensitive word group is in use and cannot be deleted." ErrAIProxySensitiveGroupInUse: "The sensitive word group is in use and cannot be deleted."
@@ -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"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Error al sincronizar la información de alertas, verifique e inte
ErrAIProxyUserGroupIsDefault: "No se puede eliminar el grupo de usuarios predeterminado." ErrAIProxyUserGroupIsDefault: "No se puede eliminar el grupo de usuarios predeterminado."
ErrAIProxyUserGroupInUse: "El grupo de usuarios está en uso y no se puede eliminar." ErrAIProxyUserGroupInUse: "El grupo de usuarios está en uso y no se puede eliminar."
ErrAIProxyUserGroupExists: "El nombre del grupo de usuarios ya existe." ErrAIProxyUserGroupExists: "El nombre del grupo de usuarios ya existe."
ErrAIProxyBackendAccountExists: "Esta cuenta de modelo ya se importó al grupo de cuentas de AI Gateway." ErrAIProxyBackendAccountExists: "Este servicio de modelo ya se importó al grupo de cuentas de AI Gateway."
ErrAIProxyModelGroupInUse: "El grupo de modelos está en uso y no se puede eliminar." ErrAIProxyModelGroupInUse: "El grupo de modelos está en uso y no se puede eliminar."
ErrAIProxyModelGroupExists: "El nombre del grupo de modelos ya existe." ErrAIProxyModelGroupExists: "El nombre del grupo de modelos ya existe."
ErrAIProxySensitiveGroupInUse: "El grupo de palabras sensibles está en uso y no se puede eliminar." ErrAIProxySensitiveGroupInUse: "El grupo de palabras sensibles está en uso y no se puede eliminar."
@@ -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"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "خطا در همگام‌سازی اطلاعات هشدار، ب
ErrAIProxyUserGroupIsDefault: "گروه کاربری پیش‌فرض قابل حذف نیست." ErrAIProxyUserGroupIsDefault: "گروه کاربری پیش‌فرض قابل حذف نیست."
ErrAIProxyUserGroupInUse: "گروه کاربری در حال استفاده است و قابل حذف نیست." ErrAIProxyUserGroupInUse: "گروه کاربری در حال استفاده است و قابل حذف نیست."
ErrAIProxyUserGroupExists: "نام گروه کاربری از قبل وجود دارد." ErrAIProxyUserGroupExists: "نام گروه کاربری از قبل وجود دارد."
ErrAIProxyBackendAccountExists: "این حساب مدل قبلاً به مجموعه حساب‌های دروازه AI وارد شده است." ErrAIProxyBackendAccountExists: "این سرویس مدل قبلاً به مجموعه حساب‌های دروازه AI وارد شده است."
ErrAIProxyModelGroupInUse: "گروه مدل در حال استفاده است و قابل حذف نیست." ErrAIProxyModelGroupInUse: "گروه مدل در حال استفاده است و قابل حذف نیست."
ErrAIProxyModelGroupExists: "نام گروه مدل از قبل وجود دارد." ErrAIProxyModelGroupExists: "نام گروه مدل از قبل وجود دارد."
ErrAIProxySensitiveGroupInUse: "گروه کلمات حساس در حال استفاده است و قابل حذف نیست." ErrAIProxySensitiveGroupInUse: "گروه کلمات حساس در حال استفاده است و قابل حذف نیست."
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "نصب ناموفق و بازیابی سرویس نا
MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛ دریافت انجام نمی‌شود" MCPInstallLocalImage: "تصویر به‌صورت محلی موجود است؛ دریافت انجام نمی‌شود"
MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده" MCPInstallVerifyImage: "اعتبارسنجی نسخه تصویر و قرارداد سرویس مدیریت‌شده"
MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود" MCPInstallVerifiedImage: "اعتبارسنجی تصویر موفق بود"
PHPExtensionsNoTargets: "پس از کنار گذاشتن گره مبدأ، هیچ گره مقصدی باقی نمانده است"
PHPExtensionsSyncTask: "همگام‌سازی قالب افزونه PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "گره [{{ .node }}] از قبل قالب یکسانی دارد؛ نادیده گرفته شد"
MCPInstallCleanup: "پاک‌سازی کانتینر قبلی" MCPInstallCleanup: "پاک‌سازی کانتینر قبلی"
MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد" MCPInstallOldContainerRemoved: "کانتینر قبلی حذف شد"
MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد" MCPInstallOldImageRemoved: "ایمیج قبلی حذف شد"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "アラート情報の同期エラーです。後で再試行し
ErrAIProxyUserGroupIsDefault: "デフォルトユーザーグループは削除できません" ErrAIProxyUserGroupIsDefault: "デフォルトユーザーグループは削除できません"
ErrAIProxyUserGroupInUse: "ユーザーグループは使用中のため、削除できません。" ErrAIProxyUserGroupInUse: "ユーザーグループは使用中のため、削除できません。"
ErrAIProxyUserGroupExists: "ユーザーグループ名は既に存在します。" ErrAIProxyUserGroupExists: "ユーザーグループ名は既に存在します。"
ErrAIProxyBackendAccountExists: "このモデルアカウントは既に AI ゲートウェイのアカウントプールにインポートされています。" ErrAIProxyBackendAccountExists: "このモデルサービスは既に AI ゲートウェイのアカウントプールにインポートされています。"
ErrAIProxyModelGroupInUse: "モデルグループは使用中のため、削除できません。" ErrAIProxyModelGroupInUse: "モデルグループは使用中のため、削除できません。"
ErrAIProxyModelGroupExists: "モデルグループ名は既に存在します。" ErrAIProxyModelGroupExists: "モデルグループ名は既に存在します。"
ErrAIProxySensitiveGroupInUse: "センシティブワードグループは使用中のため削除できません。" ErrAIProxySensitiveGroupInUse: "センシティブワードグループは使用中のため削除できません。"
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "インストールに失敗し、サービスの復
MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウンロードをスキップ" MCPInstallLocalImage: "ローカルにイメージが存在するため、ダウンロードをスキップ"
MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証" MCPInstallVerifyImage: "イメージのバージョンと管理対象サービスの契約を検証"
MCPInstallVerifiedImage: "イメージの検証に成功しました" MCPInstallVerifiedImage: "イメージの検証に成功しました"
PHPExtensionsNoTargets: "ソースノードを除外すると、ターゲットノードが残りません"
PHPExtensionsSyncTask: "PHP 拡張機能テンプレート [{{ .name }}] を同期"
PHPExtensionsSyncSkipped: "ノード [{{ .node }}] には同一のテンプレートが既に存在するため、スキップしました"
MCPInstallCleanup: "以前のコンテナーをクリーンアップ" MCPInstallCleanup: "以前のコンテナーをクリーンアップ"
MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました" MCPInstallOldContainerRemoved: "以前のコンテナーを削除しました"
MCPInstallOldImageRemoved: "以前のイメージを削除しました" MCPInstallOldImageRemoved: "以前のイメージを削除しました"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "경고 정보 동기화 오류, 다시 확인하고 시도해 주
ErrAIProxyUserGroupIsDefault: "기본 사용자 그룹은 삭제할 수 없습니다" ErrAIProxyUserGroupIsDefault: "기본 사용자 그룹은 삭제할 수 없습니다"
ErrAIProxyUserGroupInUse: "사용자 그룹이 사용 중이므로 삭제할 수 없습니다." ErrAIProxyUserGroupInUse: "사용자 그룹이 사용 중이므로 삭제할 수 없습니다."
ErrAIProxyUserGroupExists: "사용자 그룹 이름이 이미 존재합니다." ErrAIProxyUserGroupExists: "사용자 그룹 이름이 이미 존재합니다."
ErrAIProxyBackendAccountExists: "이 모델 계정은 이미 AI 게이트웨이 계정 풀에 가져왔습니다." ErrAIProxyBackendAccountExists: "이 모델 서비스는 이미 AI 게이트웨이 계정 풀에 가져왔습니다."
ErrAIProxyModelGroupInUse: "모델 그룹이 사용 중이므로 삭제할 수 없습니다." ErrAIProxyModelGroupInUse: "모델 그룹이 사용 중이므로 삭제할 수 없습니다."
ErrAIProxyModelGroupExists: "모델 그룹 이름이 이미 존재합니다." ErrAIProxyModelGroupExists: "모델 그룹 이름이 이미 존재합니다."
ErrAIProxySensitiveGroupInUse: "민감 단어 그룹이 사용 중이므로 삭제할 수 없습니다." ErrAIProxySensitiveGroupInUse: "민감 단어 그룹이 사용 중이므로 삭제할 수 없습니다."
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "설치에 실패했고 서비스 복원이 불완전
MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니다" MCPInstallLocalImage: "로컬 이미지가 있어 다운로드를 건너뜁니다"
MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증" MCPInstallVerifyImage: "이미지 버전 및 관리형 서비스 계약 검증"
MCPInstallVerifiedImage: "이미지 검증 통과" MCPInstallVerifiedImage: "이미지 검증 통과"
PHPExtensionsNoTargets: "원본 노드를 제외하면 대상 노드가 남지 않습니다"
PHPExtensionsSyncTask: "PHP 확장 템플릿 [{{ .name }}] 동기화"
PHPExtensionsSyncSkipped: "노드 [{{ .node }}]에 동일한 템플릿이 이미 있어 건너뛰었습니다"
MCPInstallCleanup: "이전 컨테이너 정리" MCPInstallCleanup: "이전 컨테이너 정리"
MCPInstallOldContainerRemoved: "이전 컨테이너가 삭제되었습니다" MCPInstallOldContainerRemoved: "이전 컨테이너가 삭제되었습니다"
MCPInstallOldImageRemoved: "이전 이미지가 삭제되었습니다" MCPInstallOldImageRemoved: "이전 이미지가 삭제되었습니다"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "ການຊິງຂໍ້ມູນແຈ້ງເຕືອນ
ErrAIProxyUserGroupIsDefault: "ບໍ່ສາມາດລຶບກຸ່ມຜູ້ໃຊ້ເລີ່ມຕົ້ນໄດ້." ErrAIProxyUserGroupIsDefault: "ບໍ່ສາມາດລຶບກຸ່ມຜູ້ໃຊ້ເລີ່ມຕົ້ນໄດ້."
ErrAIProxyUserGroupInUse: "ກຸ່ມຜູ້ໃຊ້ກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້." ErrAIProxyUserGroupInUse: "ກຸ່ມຜູ້ໃຊ້ກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
ErrAIProxyUserGroupExists: "ມີຊື່ກຸ່ມຜູ້ໃຊ້ນີ້ຢູ່ແລ້ວ." ErrAIProxyUserGroupExists: "ມີຊື່ກຸ່ມຜູ້ໃຊ້ນີ້ຢູ່ແລ້ວ."
ErrAIProxyBackendAccountExists: "ບັນຊີໂມເດວນີ້ຖືກນຳເຂົ້າໃນພູນບັນຊີ AI Gateway ແລ້ວ." ErrAIProxyBackendAccountExists: "ບໍລິການໂມເດວນີ້ຖືກນຳເຂົ້າໃນພູນບັນຊີ AI Gateway ແລ້ວ."
ErrAIProxyModelGroupInUse: "ກຸ່ມໂມເດວກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້." ErrAIProxyModelGroupInUse: "ກຸ່ມໂມເດວກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
ErrAIProxyModelGroupExists: "ມີຊື່ກຸ່ມໂມເດວນີ້ຢູ່ແລ້ວ." ErrAIProxyModelGroupExists: "ມີຊື່ກຸ່ມໂມເດວນີ້ຢູ່ແລ້ວ."
ErrAIProxySensitiveGroupInUse: "ກຸ່ມຄຳທີ່ລະອຽດອ່ອນກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້." ErrAIProxySensitiveGroupInUse: "ກຸ່ມຄຳທີ່ລະອຽດອ່ອນກຳລັງຖືກໃຊ້ງານ ແລະ ບໍ່ສາມາດລຶບໄດ້."
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "ຕິດຕັ້ງບໍ່ສຳເລັດແ
MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງແລ້ວ; ຂ້າມການດາວໂຫຼດ" MCPInstallLocalImage: "ມີອິມເມດຢູ່ໃນເຄື່ອງແລ້ວ; ຂ້າມການດາວໂຫຼດ"
MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ" MCPInstallVerifyImage: "ກວດສອບເວີຊັນອິມເມດ ແລະ ສັນຍາບໍລິການທີ່ຈັດການ"
MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ" MCPInstallVerifiedImage: "ກວດສອບອິມເມດຜ່ານແລ້ວ"
PHPExtensionsNoTargets: "ບໍ່ມີໂນດປາຍທາງເຫຼືອຫຼັງຈາກຍົກເວັ້ນໂນດຕົ້ນທາງ"
PHPExtensionsSyncTask: "ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "ໂນດ [{{ .node }}] ມີແມ່ແບບທີ່ຄືກັນແລ້ວ; ຂ້າມ"
MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ" MCPInstallCleanup: "ກຳລັງລ້າງຄອນເທນເນີເກົ່າ"
MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ" MCPInstallOldContainerRemoved: "ລຶບຄອນເທນເນີເກົ່າແລ້ວ"
MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ" MCPInstallOldImageRemoved: "ລຶບອິມເມຈເກົ່າແລ້ວ"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Ralat penyinkronan maklumat amaran, sila semak dan cuba lagi"
ErrAIProxyUserGroupIsDefault: "Kumpulan pengguna lalai tidak boleh dipadam." ErrAIProxyUserGroupIsDefault: "Kumpulan pengguna lalai tidak boleh dipadam."
ErrAIProxyUserGroupInUse: "Kumpulan pengguna sedang digunakan dan tidak boleh dipadam." ErrAIProxyUserGroupInUse: "Kumpulan pengguna sedang digunakan dan tidak boleh dipadam."
ErrAIProxyUserGroupExists: "Nama kumpulan pengguna sudah wujud." ErrAIProxyUserGroupExists: "Nama kumpulan pengguna sudah wujud."
ErrAIProxyBackendAccountExists: "Akaun model ini telah diimport ke dalam kolam akaun AI Gateway." ErrAIProxyBackendAccountExists: "Perkhidmatan model ini telah diimport ke dalam kolam akaun AI Gateway."
ErrAIProxyModelGroupInUse: "Kumpulan model sedang digunakan dan tidak boleh dipadam." ErrAIProxyModelGroupInUse: "Kumpulan model sedang digunakan dan tidak boleh dipadam."
ErrAIProxyModelGroupExists: "Nama kumpulan model sudah wujud." ErrAIProxyModelGroupExists: "Nama kumpulan model sudah wujud."
ErrAIProxySensitiveGroupInUse: "Kumpulan kata sensitif sedang digunakan dan tidak boleh dipadam." ErrAIProxySensitiveGroupInUse: "Kumpulan kata sensitif sedang digunakan dan tidak boleh dipadam."
@@ -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 yang tinggal selepas mengecualikan nod sumber"
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"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Erro na sincronização das informações de alerta, verifique e
ErrAIProxyUserGroupIsDefault: "O grupo de usuários padrão não pode ser excluído." ErrAIProxyUserGroupIsDefault: "O grupo de usuários padrão não pode ser excluído."
ErrAIProxyUserGroupInUse: "O grupo de usuários está em uso e não pode ser excluído." ErrAIProxyUserGroupInUse: "O grupo de usuários está em uso e não pode ser excluído."
ErrAIProxyUserGroupExists: "O nome do grupo de usuários já existe." ErrAIProxyUserGroupExists: "O nome do grupo de usuários já existe."
ErrAIProxyBackendAccountExists: "Esta conta de modelo já foi importada para o pool de contas do AI Gateway." ErrAIProxyBackendAccountExists: "Este serviço de modelo já foi importado para o pool de contas do AI Gateway."
ErrAIProxyModelGroupInUse: "O grupo de modelos está em uso e não pode ser excluído." ErrAIProxyModelGroupInUse: "O grupo de modelos está em uso e não pode ser excluído."
ErrAIProxyModelGroupExists: "O nome do grupo de modelos já existe." ErrAIProxyModelGroupExists: "O nome do grupo de modelos já existe."
ErrAIProxySensitiveGroupInUse: "O grupo de palavras sensíveis está em uso e não pode ser excluído." ErrAIProxySensitiveGroupInUse: "O grupo de palavras sensíveis está em uso e não pode ser excluído."
@@ -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 restam 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"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Ошибка синхронизации информации об
ErrAIProxyUserGroupIsDefault: "Группу пользователей по умолчанию нельзя удалить." ErrAIProxyUserGroupIsDefault: "Группу пользователей по умолчанию нельзя удалить."
ErrAIProxyUserGroupInUse: "Группа пользователей используется и не может быть удалена." ErrAIProxyUserGroupInUse: "Группа пользователей используется и не может быть удалена."
ErrAIProxyUserGroupExists: "Имя группы пользователей уже существует." ErrAIProxyUserGroupExists: "Имя группы пользователей уже существует."
ErrAIProxyBackendAccountExists: "Эта учетная запись модели уже импортирована в пул аккаунтов AI Gateway." ErrAIProxyBackendAccountExists: "Этот сервис модели уже импортирован в пул аккаунтов AI Gateway."
ErrAIProxyModelGroupInUse: "Группа моделей используется и не может быть удалена." ErrAIProxyModelGroupInUse: "Группа моделей используется и не может быть удалена."
ErrAIProxyModelGroupExists: "Имя группы моделей уже существует." ErrAIProxyModelGroupExists: "Имя группы моделей уже существует."
ErrAIProxySensitiveGroupInUse: "Группа чувствительных слов используется и не может быть удалена." ErrAIProxySensitiveGroupInUse: "Группа чувствительных слов используется и не может быть удалена."
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "Установка не удалась, служба
MCPInstallLocalImage: "Образ уже есть локально; пропустить загрузку" MCPInstallLocalImage: "Образ уже есть локально; пропустить загрузку"
MCPInstallVerifyImage: "Проверить версию образа и контракт управляемой службы" MCPInstallVerifyImage: "Проверить версию образа и контракт управляемой службы"
MCPInstallVerifiedImage: "Образ успешно проверен" MCPInstallVerifiedImage: "Образ успешно проверен"
PHPExtensionsNoTargets: "После исключения исходного узла не осталось целевых узлов"
PHPExtensionsSyncTask: "Синхронизация шаблона расширений PHP [{{ .name }}]"
PHPExtensionsSyncSkipped: "На узле [{{ .node }}] уже есть идентичный шаблон; пропущено"
MCPInstallCleanup: "Очистка предыдущего контейнера" MCPInstallCleanup: "Очистка предыдущего контейнера"
MCPInstallOldContainerRemoved: "Предыдущий контейнер удалён" MCPInstallOldContainerRemoved: "Предыдущий контейнер удалён"
MCPInstallOldImageRemoved: "Предыдущий образ удалён" MCPInstallOldImageRemoved: "Предыдущий образ удалён"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "Uyarı bilgisi senkronizasyon hatası, lütfen kontrol edip tekra
ErrAIProxyUserGroupIsDefault: "Varsayılan kullanıcı grubu silinemez." ErrAIProxyUserGroupIsDefault: "Varsayılan kullanıcı grubu silinemez."
ErrAIProxyUserGroupInUse: "Kullanıcı grubu kullanımda ve silinemez." ErrAIProxyUserGroupInUse: "Kullanıcı grubu kullanımda ve silinemez."
ErrAIProxyUserGroupExists: "Kullanıcı grubu adı zaten mevcut." ErrAIProxyUserGroupExists: "Kullanıcı grubu adı zaten mevcut."
ErrAIProxyBackendAccountExists: "Bu model hesabı AI Gateway hesap havuzuna zaten aktarılmış." ErrAIProxyBackendAccountExists: "Bu model hizmeti AI Gateway hesap havuzuna zaten aktarılmış."
ErrAIProxyModelGroupInUse: "Model grubu kullanımda ve silinemez." ErrAIProxyModelGroupInUse: "Model grubu kullanımda ve silinemez."
ErrAIProxyModelGroupExists: "Model grubu adı zaten mevcut." ErrAIProxyModelGroupExists: "Model grubu adı zaten mevcut."
ErrAIProxySensitiveGroupInUse: "Hassas kelime grubu kullanımda ve silinemez." ErrAIProxySensitiveGroupInUse: "Hassas kelime grubu kullanımda ve silinemez."
@@ -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 uzantı şablonunu eşitle [{{ .name }}]"
PHPExtensionsSyncSkipped: "[{{ .node }}] düğümünde aynı şablon zaten mevcut; 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"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "告警資訊同步錯誤,請檢查後重試。"
ErrAIProxyUserGroupIsDefault: "預設使用者群組無法刪除" ErrAIProxyUserGroupIsDefault: "預設使用者群組無法刪除"
ErrAIProxyUserGroupInUse: "使用者群組正被使用,無法刪除。" ErrAIProxyUserGroupInUse: "使用者群組正被使用,無法刪除。"
ErrAIProxyUserGroupExists: "使用者群組名稱已存在" ErrAIProxyUserGroupExists: "使用者群組名稱已存在"
ErrAIProxyBackendAccountExists: "該模型帳號已匯入 AI 閘道帳號池,請勿重複匯入" ErrAIProxyBackendAccountExists: "該模型服務已匯入 AI 閘道帳號池,請勿重複匯入"
ErrAIProxyModelGroupInUse: "模型組正在使用,無法刪除" ErrAIProxyModelGroupInUse: "模型組正在使用,無法刪除"
ErrAIProxyModelGroupExists: "模型組名稱已存在" ErrAIProxyModelGroupExists: "模型組名稱已存在"
ErrAIProxySensitiveGroupInUse: "敏感詞分組正在使用,無法刪除。" ErrAIProxySensitiveGroupInUse: "敏感詞分組正在使用,無法刪除。"
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安裝失敗且原服務還原不完整,請核對
MCPInstallLocalImage: "本機映像已存在,略過下載" MCPInstallLocalImage: "本機映像已存在,略過下載"
MCPInstallVerifyImage: "驗證映像版本及受管契約" MCPInstallVerifyImage: "驗證映像版本及受管契約"
MCPInstallVerifiedImage: "映像驗證通過" MCPInstallVerifiedImage: "映像驗證通過"
PHPExtensionsNoTargets: "排除來源節點後,沒有可同步的目標節點"
PHPExtensionsSyncTask: "同步 PHP 擴充模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "節點 [{{ .node }}] 已存在相同模版,略過"
MCPInstallCleanup: "正在清理舊容器" MCPInstallCleanup: "正在清理舊容器"
MCPInstallOldContainerRemoved: "舊容器已刪除" MCPInstallOldContainerRemoved: "舊容器已刪除"
MCPInstallOldImageRemoved: "舊映像已刪除" MCPInstallOldImageRemoved: "舊映像已刪除"
+5 -1
View File
@@ -156,7 +156,7 @@ ErrAlertSync: "告警信息同步错误,请检查后重试!"
ErrAIProxyUserGroupIsDefault: "默认用户组无法删除" ErrAIProxyUserGroupIsDefault: "默认用户组无法删除"
ErrAIProxyUserGroupInUse: "用户组正被使用,无法删除" ErrAIProxyUserGroupInUse: "用户组正被使用,无法删除"
ErrAIProxyUserGroupExists: "用户组名称已存在" ErrAIProxyUserGroupExists: "用户组名称已存在"
ErrAIProxyBackendAccountExists: "该模型账号已导入 AI 网关账号池,请勿重复导入" ErrAIProxyBackendAccountExists: "该模型服务已导入 AI 网关账号池,请勿重复导入"
ErrAIProxyModelGroupInUse: "模型组正在使用,无法删除" ErrAIProxyModelGroupInUse: "模型组正在使用,无法删除"
ErrAIProxyModelGroupExists: "模型组名称已存在" ErrAIProxyModelGroupExists: "模型组名称已存在"
ErrAIProxySensitiveGroupInUse: "敏感词分组正在使用,无法删除" ErrAIProxySensitiveGroupInUse: "敏感词分组正在使用,无法删除"
@@ -587,6 +587,10 @@ MCPInstallRecoveryFailed: "安装失败且原服务恢复不完整,请核对
MCPInstallLocalImage: "本地镜像已存在,跳过下载" MCPInstallLocalImage: "本地镜像已存在,跳过下载"
MCPInstallVerifyImage: "校验镜像版本和受管契约" MCPInstallVerifyImage: "校验镜像版本和受管契约"
MCPInstallVerifiedImage: "镜像校验通过" MCPInstallVerifiedImage: "镜像校验通过"
PHPExtensionsNoTargets: "排除源节点后,没有可同步的目标节点"
PHPExtensionsSyncTask: "同步 PHP 扩展模版 [{{ .name }}]"
PHPExtensionsSyncSkipped: "节点 [{{ .node }}] 已存在相同模版,跳过"
MCPInstallCleanup: "正在清理旧容器" MCPInstallCleanup: "正在清理旧容器"
MCPInstallOldContainerRemoved: "旧容器已删除" MCPInstallOldContainerRemoved: "旧容器已删除"
MCPInstallOldImageRemoved: "旧镜像已删除" MCPInstallOldImageRemoved: "旧镜像已删除"
+2
View File
@@ -100,6 +100,7 @@ func LoadMenus() string {
Children: []dto.ShowMenu{ Children: []dto.ShowMenu{
{ID: "48", Disabled: false, Title: "aiTools.model.ollamaManagement", IsShow: true, Label: "OllamaModels", Path: "/ai/model/local/ollama", Sort: 25}, {ID: "48", Disabled: false, Title: "aiTools.model.ollamaManagement", IsShow: true, Label: "OllamaModels", Path: "/ai/model/local/ollama", Sort: 25},
{ID: "41", Disabled: false, Title: "aiTools.model.vllmManagement", IsShow: true, Label: "AIModel", Path: "/ai/model/files", Sort: 50}, {ID: "41", Disabled: false, Title: "aiTools.model.vllmManagement", IsShow: true, Label: "AIModel", Path: "/ai/model/files", Sort: 50},
{ID: "49", Disabled: false, Title: "aiTools.model.services", IsShow: true, Label: "ModelServices", Path: "/ai/model/account", Sort: 75},
{ID: "44", Disabled: false, Title: "aiTools.agents.agent", IsShow: true, Label: "Agents", Path: "/ai/agents/agent", Sort: 100}, {ID: "44", Disabled: false, Title: "aiTools.agents.agent", IsShow: true, Label: "Agents", Path: "/ai/agents/agent", Sort: 100},
{ID: "42", Disabled: false, Title: "menu.mcp", IsShow: true, Label: "MCPServer", Path: "/ai/mcp", Sort: 200}, {ID: "42", Disabled: false, Title: "menu.mcp", IsShow: true, Label: "MCPServer", Path: "/ai/mcp", Sort: 200},
{ID: "43", Disabled: false, Title: "aiTools.gpu.gpu", IsShow: true, Label: "GPU", Path: "/ai/gpu", Sort: 300}, {ID: "43", Disabled: false, Title: "aiTools.gpu.gpu", IsShow: true, Label: "GPU", Path: "/ai/gpu", Sort: 300},
@@ -207,6 +208,7 @@ func MenuSort() []dto.MenuLabelSort {
{Label: "AI-Menu", Sort: 300}, {Label: "AI-Menu", Sort: 300},
{Label: "OllamaModels", Sort: 25}, {Label: "OllamaModels", Sort: 25},
{Label: "AIModel", Sort: 50}, {Label: "AIModel", Sort: 50},
{Label: "ModelServices", Sort: 75},
{Label: "Agents", Sort: 100}, {Label: "Agents", Sort: 100},
{Label: "AIProxyManagement", Sort: 150}, {Label: "AIProxyManagement", Sort: 150},
{Label: "SkillsHub", Sort: 175}, {Label: "SkillsHub", Sort: 175},
+1
View File
@@ -75,5 +75,6 @@ func coreMigrations() []*gormigrate.Migration {
migrations.AddAPIKeyDeletedAt, migrations.AddAPIKeyDeletedAt,
migrations.MoveVirtualMachineMenuToTopLevel, migrations.MoveVirtualMachineMenuToTopLevel,
migrations.UpdateAiModelManagementMenus, migrations.UpdateAiModelManagementMenus,
migrations.AddModelServicesMenu,
} }
} }
+28
View File
@@ -1446,6 +1446,34 @@ var UpdateAiModelManagementMenus = &gormigrate.Migration{
}, },
} }
var AddModelServicesMenu = &gormigrate.Migration{
ID: "20261104-add-model-services-menu",
Migrate: func(tx *gorm.DB) error {
return helper.UpdateHideMenu(tx, func(menus []dto.ShowMenu) []dto.ShowMenu {
for i := range menus {
if menus[i].Label != "AI-Menu" {
continue
}
isShow := true
for _, child := range menus[i].Children {
if child.Label == "ModelServices" {
return menus
}
if child.Label == "AIModel" {
isShow = child.IsShow
}
}
menus[i].Children = helper.UpsertMenuByLabel(menus[i].Children, dto.ShowMenu{
ID: "49", Title: "aiTools.model.services", IsShow: isShow,
Label: "ModelServices", Path: "/ai/model/account", Sort: 75,
}, "AIModel")
break
}
return menus
})
},
}
var UpdateFirewallMenuPath = &gormigrate.Migration{ var UpdateFirewallMenuPath = &gormigrate.Migration{
ID: "20260819-update-firewall-menu-path", ID: "20260819-update-firewall-menu-path",
Migrate: func(tx *gorm.DB) error { Migrate: func(tx *gorm.DB) error {
+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' });
};
+58 -13
View File
@@ -804,7 +804,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'The existing installation has no compatible HTTPS access address or port. Check its application settings.', 'The existing installation has no compatible HTTPS access address or port. Check its application settings.',
agent: 'Agent', agent: 'Agent',
account: 'Model Account', account: 'Model Service',
batchOperation: 'Batch Operation', batchOperation: 'Batch Operation',
operationType: 'Operation Type', operationType: 'Operation Type',
batchAction: 'Batch {0}', batchAction: 'Batch {0}',
@@ -818,10 +818,10 @@ const message = {
skillSource: 'Skill Source', skillSource: 'Skill Source',
skillKeyword: 'Skill Keyword', skillKeyword: 'Skill Keyword',
clawHubSkillPlaceholder: 'Search and select a Skill first', clawHubSkillPlaceholder: 'Search and select a Skill first',
noAccountHint: 'Choose an existing model account or add a new one.', noAccountHint: 'Choose an existing model service or add a new one.',
accountCount: '{0} model accounts', accountCount: '{0} model services',
syncAgents: 'Sync related agents', syncAgents: 'Sync related agents',
syncAgentsHelper: 'Update openclaw.json for agents using this model account', syncAgentsHelper: 'Update openclaw.json for agents using this model service',
appVersion: 'App Version', appVersion: 'App Version',
webuiPort: 'WebUI Port', webuiPort: 'WebUI Port',
tokenOrAuth: 'Token/Auth', tokenOrAuth: 'Token/Auth',
@@ -862,7 +862,7 @@ const message = {
useModelDefault: 'Use model default', useModelDefault: 'Use model default',
reasoning: 'Reasoning Model', reasoning: 'Reasoning Model',
verified: 'Verified', verified: 'Verified',
verifySkipped: 'No verification', verifySkipped: 'No verification required',
skillsTab: 'Skills', skillsTab: 'Skills',
pluginsTab: 'Plugins', pluginsTab: 'Plugins',
pluginsInstalled: 'Installed', pluginsInstalled: 'Installed',
@@ -1214,9 +1214,9 @@ const message = {
notInstalled: 'Not installed', notInstalled: 'Not installed',
usage: 'Usage', usage: 'Usage',
accountPool: 'Account Pool', accountPool: 'Account Pool',
importModelAccount: 'Import Model Account', importModelAccount: 'Import Model Service',
editModelAccount: 'Edit Model Account', editModelAccount: 'Edit Model Service',
selectModelAccount: 'Select an existing model account', selectModelAccount: 'Select an existing model service',
upstreamApiAddress: 'Upstream API Address', upstreamApiAddress: 'Upstream API Address',
priority: 'Priority', priority: 'Priority',
healthStatus: 'Health', healthStatus: 'Health',
@@ -1273,8 +1273,8 @@ const message = {
waitingQueue: 'Current Waiting Queue', waitingQueue: 'Current Waiting Queue',
currentActiveUsers: 'Current Active Users', currentActiveUsers: 'Current Active Users',
activeStreamingRequests: 'Active Streaming Requests', activeStreamingRequests: 'Active Streaming Requests',
modelAccountConcurrency: 'Model Account Concurrency', modelAccountConcurrency: 'Model Service Concurrency',
accountAvailability: 'Model Account Availability', accountAvailability: 'Model Service Availability',
capacityFull: 'At Capacity', capacityFull: 'At Capacity',
groupConcurrency: 'User Group Concurrency', groupConcurrency: 'User Group Concurrency',
apiKeyConcurrency: 'API Key Concurrency', apiKeyConcurrency: 'API Key Concurrency',
@@ -1329,7 +1329,7 @@ const message = {
esLogCircuitUntil: 'ES Circuit Until', esLogCircuitUntil: 'ES Circuit Until',
serviceOperateConfirm: 'Confirm to {0} the AI Gateway service?', serviceOperateConfirm: 'Confirm to {0} the AI Gateway service?',
deleteTargetConfirm: 'Delete {0} {1}?', deleteTargetConfirm: 'Delete {0} {1}?',
deleteBackendTitle: 'Delete Model Account', deleteBackendTitle: 'Delete Model Service',
userFallback: 'Deleted user (ID: {0})', userFallback: 'Deleted user (ID: {0})',
requestModel: 'Request Model', requestModel: 'Request Model',
upstreamModel: 'Upstream Model', upstreamModel: 'Upstream Model',
@@ -1342,7 +1342,7 @@ const message = {
usageTrend: 'Usage Trend', usageTrend: 'Usage Trend',
distributionBy: '{0} Distribution', distributionBy: '{0} Distribution',
unmatched: 'Unmatched', unmatched: 'Unmatched',
modelAccount: 'Model Account', modelAccount: 'Model Service',
serviceProvider: 'Provider', serviceProvider: 'Provider',
tokenUsage: 'Token Usage', tokenUsage: 'Token Usage',
percent: 'Percent', percent: 'Percent',
@@ -1689,6 +1689,8 @@ const message = {
timeToFirstToken: 'Mean time to first token', timeToFirstToken: 'Mean time to first token',
timePerOutputToken: 'Mean inter-token latency', timePerOutputToken: 'Mean inter-token latency',
requestLatency: 'Mean request latency', requestLatency: 'Mean request latency',
noMetrics:
'The metrics endpoint is reachable, but no supported vLLM metrics are available yet. Some metrics may appear only after the first inference request.',
unavailable: 'Metrics are unavailable. Check that the instance is running and /metrics is accessible.', unavailable: 'Metrics are unavailable. Check that the instance is running and /metrics is accessible.',
loadFailed: 'Failed to load monitoring data. Please retry.', loadFailed: 'Failed to load monitoring data. Please retry.',
helper: 'Manage collection, interval and retention in monitoring settings.', helper: 'Manage collection, interval and retention in monitoring settings.',
@@ -2825,7 +2827,7 @@ const message = {
scrollSensitivity: 'Scroll Sensitivity', scrollSensitivity: 'Scroll Sensitivity',
aiAssistant: 'AI Assistant', aiAssistant: 'AI Assistant',
aiAccountHelper: aiAccountHelper:
'Use the selected model account to generate and fill commands. For local models like Ollama and vLLM, use a custom model account.', 'Use the selected model service to generate and fill commands. For local models like Ollama and vLLM, use a custom model service.',
aiPrefix: 'Trigger Prefix', aiPrefix: 'Trigger Prefix',
aiPrefixHelper: aiPrefixHelper:
'Enter "prefix + space" and press Enter to trigger AI command generation, for example: {0} help me check disk usage.', 'Enter "prefix + space" and press Enter to trigger AI command generation, for example: {0} help me check disk usage.',
@@ -4009,6 +4011,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 +7045,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 +7588,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.',
+67 -14
View File
@@ -807,7 +807,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'La instalación existente no tiene una dirección o puerto HTTPS compatible. Revise la configuración de la aplicación.', 'La instalación existente no tiene una dirección o puerto HTTPS compatible. Revise la configuración de la aplicación.',
agent: 'Agente', agent: 'Agente',
account: 'Cuenta de modelo', account: 'Servicio de modelo',
batchOperation: 'Operación por lotes', batchOperation: 'Operación por lotes',
operationType: 'Tipo de operación', operationType: 'Tipo de operación',
batchAction: '{0} por lotes', batchAction: '{0} por lotes',
@@ -821,10 +821,10 @@ const message = {
skillSource: 'Origen de Skill', skillSource: 'Origen de Skill',
skillKeyword: 'Palabra clave de Skill', skillKeyword: 'Palabra clave de Skill',
clawHubSkillPlaceholder: 'Busque y seleccione una Skill primero', clawHubSkillPlaceholder: 'Busque y seleccione una Skill primero',
noAccountHint: 'Selecciona una cuenta de modelo existente o agrega una nueva.', noAccountHint: 'Selecciona un servicio de modelo existente o agrega uno nuevo.',
accountCount: '{0} cuentas de modelo', accountCount: '{0} servicios de modelo',
syncAgents: 'Sincronizar agentes vinculados', syncAgents: 'Sincronizar agentes vinculados',
syncAgentsHelper: 'Actualiza openclaw.json para los agentes que usan esta cuenta de modelo', syncAgentsHelper: 'Actualiza openclaw.json para los agentes que usan este servicio de modelo',
appVersion: 'Versión de la app', appVersion: 'Versión de la app',
webuiPort: 'Puerto WebUI', webuiPort: 'Puerto WebUI',
tokenOrAuth: 'Token/Autenticación', tokenOrAuth: 'Token/Autenticación',
@@ -867,7 +867,7 @@ const message = {
useModelDefault: 'Usar valor predeterminado del modelo', useModelDefault: 'Usar valor predeterminado del modelo',
reasoning: 'Modelo de razonamiento', reasoning: 'Modelo de razonamiento',
verified: 'Verificado', verified: 'Verificado',
verifySkipped: 'Sin verificación', verifySkipped: 'No requiere verificación',
skillsTab: 'Habilidades', skillsTab: 'Habilidades',
pluginsTab: 'Complementos', pluginsTab: 'Complementos',
pluginsInstalled: 'Instalados', pluginsInstalled: 'Instalados',
@@ -1218,9 +1218,9 @@ const message = {
notInstalled: 'No instalado', notInstalled: 'No instalado',
usage: 'Uso', usage: 'Uso',
accountPool: 'Grupo de cuentas', accountPool: 'Grupo de cuentas',
importModelAccount: 'Importar cuenta de modelo', importModelAccount: 'Importar servicio de modelo',
editModelAccount: 'Editar cuenta de modelo', editModelAccount: 'Editar servicio de modelo',
selectModelAccount: 'Seleccionar una cuenta de modelo existente', selectModelAccount: 'Seleccionar un servicio de modelo existente',
upstreamApiAddress: 'Dirección de API ascendente', upstreamApiAddress: 'Dirección de API ascendente',
priority: 'Prioridad', priority: 'Prioridad',
healthStatus: 'Estado de salud', healthStatus: 'Estado de salud',
@@ -1277,8 +1277,8 @@ const message = {
waitingQueue: 'Cola de espera actual', waitingQueue: 'Cola de espera actual',
currentActiveUsers: 'Usuarios activos actuales', currentActiveUsers: 'Usuarios activos actuales',
activeStreamingRequests: 'Solicitudes de streaming activas', activeStreamingRequests: 'Solicitudes de streaming activas',
modelAccountConcurrency: 'Concurrencia de cuentas de modelo', modelAccountConcurrency: 'Concurrencia de servicios de modelo',
accountAvailability: 'Disponibilidad de cuentas de modelo', accountAvailability: 'Disponibilidad de servicios de modelo',
capacityFull: 'Capacidad completa', capacityFull: 'Capacidad completa',
groupConcurrency: 'Concurrencia de grupos de usuarios', groupConcurrency: 'Concurrencia de grupos de usuarios',
apiKeyConcurrency: 'Concurrencia de API Keys', apiKeyConcurrency: 'Concurrencia de API Keys',
@@ -1334,7 +1334,7 @@ const message = {
esLogCircuitUntil: 'Circuito ES hasta', esLogCircuitUntil: 'Circuito ES hasta',
serviceOperateConfirm: '¿Confirmar {0} el servicio de gateway de IA?', serviceOperateConfirm: '¿Confirmar {0} el servicio de gateway de IA?',
deleteTargetConfirm: '¿Eliminar {0} {1}?', deleteTargetConfirm: '¿Eliminar {0} {1}?',
deleteBackendTitle: 'Eliminar cuenta de modelo', deleteBackendTitle: 'Eliminar servicio de modelo',
userFallback: 'Usuario eliminado (ID: {0})', userFallback: 'Usuario eliminado (ID: {0})',
requestModel: 'Modelo solicitado', requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream', upstreamModel: 'Modelo upstream',
@@ -1347,7 +1347,7 @@ const message = {
usageTrend: 'Tendencia de uso', usageTrend: 'Tendencia de uso',
distributionBy: 'Distribución por {0}', distributionBy: 'Distribución por {0}',
unmatched: 'Sin coincidencia', unmatched: 'Sin coincidencia',
modelAccount: 'Cuenta de modelo', modelAccount: 'Servicio de modelo',
serviceProvider: 'Proveedor', serviceProvider: 'Proveedor',
tokenUsage: 'Uso de tokens', tokenUsage: 'Uso de tokens',
percent: 'Porcentaje', percent: 'Porcentaje',
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latencia media del primer token', timeToFirstToken: 'Latencia media del primer token',
timePerOutputToken: 'Latencia media entre tokens', timePerOutputToken: 'Latencia media entre tokens',
requestLatency: 'Latencia media de solicitud', requestLatency: 'Latencia media de solicitud',
noMetrics:
'El endpoint de métricas es accesible, pero aún no hay métricas de vLLM compatibles. Algunas pueden aparecer solo después de la primera solicitud de inferencia.',
unavailable: unavailable:
'Métricas no disponibles. Compruebe que la instancia esté en ejecución y que /metrics sea accesible.', 'Métricas no disponibles. Compruebe que la instancia esté en ejecución y que /metrics sea accesible.',
loadFailed: 'No se pudieron cargar los datos. Inténtelo de nuevo.', loadFailed: 'No se pudieron cargar los datos. Inténtelo de nuevo.',
@@ -2878,7 +2880,7 @@ const message = {
scrollSensitivity: 'Sensibilidad de scroll', scrollSensitivity: 'Sensibilidad de scroll',
aiAssistant: 'Asistente de IA', aiAssistant: 'Asistente de IA',
aiAccountHelper: aiAccountHelper:
'Use la cuenta de modelo seleccionada para generar y rellenar comandos. Para modelos locales como Ollama y vLLM, use una cuenta de modelo personalizada.', 'Use el servicio de modelo seleccionado para generar y rellenar comandos. Para modelos locales como Ollama y vLLM, use un servicio de modelo personalizado.',
aiPrefix: 'Prefijo de activación', aiPrefix: 'Prefijo de activación',
aiPrefixHelper: aiPrefixHelper:
'Introduzca "prefijo + espacio" y pulse Enter para activar la generación de comandos por IA; por ejemplo: {0} ayúdame a consultar la información del disco.', 'Introduzca "prefijo + espacio" y pulse Enter para activar la generación de comandos por IA; por ejemplo: {0} ayúdame a consultar la información del disco.',
@@ -3123,7 +3125,7 @@ const message = {
aiSearchHint: aiSearchHint:
'Busca el contenido del archivo línea por línea. Usa los botones a la derecha de la fila de búsqueda y las "Condiciones avanzadas" debajo. Cuando la cuenta de IA esté activada y guardada, también se podrá generar un resumen en Markdown.', 'Busca el contenido del archivo línea por línea. Usa los botones a la derecha de la fila de búsqueda y las "Condiciones avanzadas" debajo. Cuando la cuenta de IA esté activada y guardada, también se podrá generar un resumen en Markdown.',
aiSearchAccountTitle: 'Cuenta de IA', aiSearchAccountTitle: 'Cuenta de IA',
aiSearchAccountIntro: 'Elige una cuenta de modelo grande para generar resúmenes y guarda los cambios.', aiSearchAccountIntro: 'Elige un servicio de modelo grande para generar resúmenes y guarda los cambios.',
aiSearchAccountEnable: 'Activar búsqueda de IA en archivos', aiSearchAccountEnable: 'Activar búsqueda de IA en archivos',
aiSearchSaveAccount: 'Guardar configuración de la cuenta', aiSearchSaveAccount: 'Guardar configuración de la cuenta',
aiSearchSectionQuery: 'Búsqueda', aiSearchSectionQuery: 'Búsqueda',
@@ -4086,6 +4088,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:
'Actualiza a la Edición Comercial para transferir imágenes de contenedores por lotes entre nodos.',
appExchange:
'Actualiza a la Edición Comercial para migrar aplicaciones instaladas a nodos de destino y confirmar sus dependencias de recursos.',
sslSync:
'Actualiza a la Edición Comercial para sincronizar certificados de un nodo de origen con uno o varios nodos de destino.',
phpExtensionsSync:
'Actualiza 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 +7159,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:
'Consulta las imágenes de contenedores del nodo de origen y selecciona las que quieras transferir.',
imageExchangeTitle2: 'Distribuir imágenes',
imageExchangeContent2: 'Transfiere las imágenes seleccionadas a uno o varios nodos de destino.',
imageExchangeTitle3: 'Ver registros de transferencia',
imageExchangeContent3:
'Consulta el progreso y los resultados de la transferencia de imágenes en los registros de tareas.',
appExchangeTitle1: 'Seleccionar una aplicación',
appExchangeContent1:
'Consulta las aplicaciones instaladas en el nodo de origen y selecciona una para migrarla.',
appExchangeTitle2: 'Confirmar dependencias',
appExchangeContent2:
'Antes de migrar, confirma los nodos de destino y los recursos necesarios, como las bases de datos.',
appExchangeTitle3: 'Migrar aplicaciones',
appExchangeContent3:
'Transfiere las copias de seguridad de las aplicaciones a los nodos de destino para restaurarlas y consulta los resultados en los registros de tareas.',
sslSyncTitle1: 'Seleccionar certificados',
sslSyncContent1:
'Consulta los detalles de los certificados del nodo de origen y selecciona los que quieras sincronizar.',
sslSyncTitle2: 'Sincronizar entre nodos',
sslSyncContent2:
'Sincroniza los certificados seleccionados con los nodos de destino, excluyendo automáticamente el nodo de origen.',
sslSyncTitle3: 'Confirmar tareas de sincronización',
sslSyncContent3:
'Revisa los nodos de destino y los certificados antes de ejecutar la tarea y consulta los resultados en los registros de tareas.',
phpExtensionsSyncTitle1: 'Seleccionar una plantilla',
phpExtensionsSyncContent1:
'Consulta los nombres de las plantillas y sus listas de extensiones en el nodo de origen y selecciona una plantilla para sincronizarla.',
phpExtensionsSyncTitle2: 'Sincronizar plantillas',
phpExtensionsSyncContent2:
'Sincroniza 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 es diferente, se informa del conflicto sin sobrescribirlo.',
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 +7712,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:
'Selecciona un nodo de origen para sincronizar su plantilla de extensiones PHP con los nodos de destino.',
phpExtensionsList: 'Extensiones PHP',
phpExtensionsConfirm: 'Se sincronizarán {0} plantillas de extensiones PHP con {1} nodos.',
phpExtensionsConflictHint:
'Se omiten las plantillas idénticas. Las plantillas con el mismo nombre y contenido diferente se notifican como conflictos y no se sobrescriben.',
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.',
+59 -13
View File
@@ -798,7 +798,7 @@ const message = {
initialCredentials: 'اطلاعات ورود اولیه؛ اگر در برنامه تغییر کرده، از گذرواژه فعلی استفاده کنید.', initialCredentials: 'اطلاعات ورود اولیه؛ اگر در برنامه تغییر کرده، از گذرواژه فعلی استفاده کنید.',
nativeAgentAccessUnavailable: 'نصب موجود نشانی یا درگاه HTTPS سازگار ندارد. تنظیمات برنامه را بررسی کنید.', nativeAgentAccessUnavailable: 'نصب موجود نشانی یا درگاه HTTPS سازگار ندارد. تنظیمات برنامه را بررسی کنید.',
agent: 'عامل', agent: 'عامل',
account: 'حساب مدل', account: 'سرویس مدل',
batchOperation: 'عملیات دسته‌ای', batchOperation: 'عملیات دسته‌ای',
operationType: 'نوع عملیات', operationType: 'نوع عملیات',
batchAction: 'دسته‌ای {0}', batchAction: 'دسته‌ای {0}',
@@ -812,10 +812,10 @@ const message = {
skillSource: 'منبع مهارت', skillSource: 'منبع مهارت',
skillKeyword: 'کلیدواژه مهارت', skillKeyword: 'کلیدواژه مهارت',
clawHubSkillPlaceholder: 'ابتدا یک مهارت را جستجو و انتخاب کنید', clawHubSkillPlaceholder: 'ابتدا یک مهارت را جستجو و انتخاب کنید',
noAccountHint: 'یک حساب مدل موجود انتخاب کنید یا یک حساب جدید اضافه کنید.', noAccountHint: 'یک سرویس مدل موجود انتخاب کنید یا یک حساب جدید اضافه کنید.',
accountCount: '{0} حساب مدل', accountCount: '{0} سرویس مدل',
syncAgents: 'همگام‌سازی عامل‌های مرتبط', syncAgents: 'همگام‌سازی عامل‌های مرتبط',
syncAgentsHelper: 'به‌روزرسانی openclaw.json برای عامل‌هایی که از این حساب مدل استفاده می‌کنند', syncAgentsHelper: 'به‌روزرسانی openclaw.json برای عامل‌هایی که از این سرویس مدل استفاده می‌کنند',
appVersion: 'نسخه برنامه', appVersion: 'نسخه برنامه',
webuiPort: 'پورت WebUI', webuiPort: 'پورت WebUI',
tokenOrAuth: 'Token/احراز هویت', tokenOrAuth: 'Token/احراز هویت',
@@ -856,7 +856,7 @@ const message = {
useModelDefault: 'استفاده از پیش‌فرض مدل', useModelDefault: 'استفاده از پیش‌فرض مدل',
reasoning: 'مدل استدلالی', reasoning: 'مدل استدلالی',
verified: 'تأیید شده', verified: 'تأیید شده',
verifySkipped: 'بدون تأیید', verifySkipped: 'نیازی به تأیید نیست',
skillsTab: 'مهارت‌ها', skillsTab: 'مهارت‌ها',
pluginsTab: 'افزونه‌ها', pluginsTab: 'افزونه‌ها',
pluginsInstalled: 'نصب‌شده', pluginsInstalled: 'نصب‌شده',
@@ -1196,9 +1196,9 @@ const message = {
notInstalled: 'نصب نشده', notInstalled: 'نصب نشده',
usage: 'استفاده', usage: 'استفاده',
accountPool: 'مجموعه حساب‌ها', accountPool: 'مجموعه حساب‌ها',
importModelAccount: 'واردات حساب مدل', importModelAccount: 'واردات سرویس مدل',
editModelAccount: 'ویرایش حساب مدل', editModelAccount: 'ویرایش سرویس مدل',
selectModelAccount: 'یک حساب مدل موجود انتخاب کنید', selectModelAccount: 'یک سرویس مدل موجود انتخاب کنید',
upstreamApiAddress: 'آدرس API بالادست', upstreamApiAddress: 'آدرس API بالادست',
priority: 'اولویت', priority: 'اولویت',
healthStatus: 'سلامت', healthStatus: 'سلامت',
@@ -1255,8 +1255,8 @@ const message = {
waitingQueue: 'صف انتظار فعلی', waitingQueue: 'صف انتظار فعلی',
currentActiveUsers: 'کاربران فعال فعلی', currentActiveUsers: 'کاربران فعال فعلی',
activeStreamingRequests: 'درخواست‌های جریانی فعال', activeStreamingRequests: 'درخواست‌های جریانی فعال',
modelAccountConcurrency: 'هم‌روندی حساب مدل', modelAccountConcurrency: 'هم‌روندی سرویس مدل',
accountAvailability: 'دسترس‌پذیری حساب مدل', accountAvailability: 'دسترس‌پذیری سرویس مدل',
capacityFull: 'ظرفیت تکمیل', capacityFull: 'ظرفیت تکمیل',
groupConcurrency: 'هم‌روندی گروه کاربر', groupConcurrency: 'هم‌روندی گروه کاربر',
apiKeyConcurrency: 'هم‌روندی API Key', apiKeyConcurrency: 'هم‌روندی API Key',
@@ -1310,7 +1310,7 @@ const message = {
esLogCircuitUntil: 'مدار ES تا', esLogCircuitUntil: 'مدار ES تا',
serviceOperateConfirm: 'تأیید {0} سرویس دروازه AI؟', serviceOperateConfirm: 'تأیید {0} سرویس دروازه AI؟',
deleteTargetConfirm: 'حذف {0} {1}؟', deleteTargetConfirm: 'حذف {0} {1}؟',
deleteBackendTitle: 'حذف حساب مدل', deleteBackendTitle: 'حذف سرویس مدل',
userFallback: 'کاربر حذف شده (شناسه: {0})', userFallback: 'کاربر حذف شده (شناسه: {0})',
requestModel: 'مدل درخواست', requestModel: 'مدل درخواست',
upstreamModel: 'مدل بالادست', upstreamModel: 'مدل بالادست',
@@ -1323,7 +1323,7 @@ const message = {
usageTrend: 'روند استفاده', usageTrend: 'روند استفاده',
distributionBy: 'توزیع {0}', distributionBy: 'توزیع {0}',
unmatched: 'بدون تطابق', unmatched: 'بدون تطابق',
modelAccount: 'حساب مدل', modelAccount: 'سرویس مدل',
serviceProvider: 'ارائه‌دهنده', serviceProvider: 'ارائه‌دهنده',
tokenUsage: 'استفاده از توکن', tokenUsage: 'استفاده از توکن',
percent: 'درصد', percent: 'درصد',
@@ -1669,6 +1669,8 @@ const message = {
timeToFirstToken: 'میانگین تأخیر توکن اول', timeToFirstToken: 'میانگین تأخیر توکن اول',
timePerOutputToken: 'میانگین تأخیر بین توکن‌ها', timePerOutputToken: 'میانگین تأخیر بین توکن‌ها',
requestLatency: 'میانگین تأخیر درخواست', requestLatency: 'میانگین تأخیر درخواست',
noMetrics:
'نقطه پایانی معیارها در دسترس است، اما هنوز معیار پشتیبانی‌شده‌ای از vLLM موجود نیست. برخی معیارها ممکن است تنها پس از نخستین درخواست استنتاج ظاهر شوند.',
unavailable: 'معیارها در دسترس نیستند. از اجرای نمونه و دسترسی به /metrics مطمئن شوید.', unavailable: 'معیارها در دسترس نیستند. از اجرای نمونه و دسترسی به /metrics مطمئن شوید.',
loadFailed: 'بارگیری داده‌های پایش ناموفق بود. دوباره تلاش کنید.', loadFailed: 'بارگیری داده‌های پایش ناموفق بود. دوباره تلاش کنید.',
helper: 'فعال‌سازی جمع‌آوری، فاصله زمانی و مدت نگهداری را در تنظیمات پایش تغییر دهید.', helper: 'فعال‌سازی جمع‌آوری، فاصله زمانی و مدت نگهداری را در تنظیمات پایش تغییر دهید.',
@@ -2798,7 +2800,7 @@ const message = {
scrollSensitivity: 'حساسیت اسکرول', scrollSensitivity: 'حساسیت اسکرول',
aiAssistant: 'دستیار هوش مصنوعی', aiAssistant: 'دستیار هوش مصنوعی',
aiAccountHelper: aiAccountHelper:
'از حساب مدل انتخاب شده برای تولید و پر کردن دستورات استفاده کنید. برای مدل‌های محلی مانند Ollama و vLLM، از یک حساب مدل سفارشی استفاده کنید.', 'از سرویس مدل انتخاب شده برای تولید و پر کردن دستورات استفاده کنید. برای مدل‌های محلی مانند Ollama و vLLM، از یک سرویس مدل سفارشی استفاده کنید.',
aiPrefix: 'پیشوند محرک', aiPrefix: 'پیشوند محرک',
aiPrefixHelper: aiPrefixHelper:
'«پیشوند + فاصله» را وارد کرده و Enter را بزنید تا تولید دستور AI فعال شود؛ برای نمونه: {0} کمک کن میزان استفاده از دیسک را بررسی کنم.', '«پیشوند + فاصله» را وارد کرده و Enter را بزنید تا تولید دستور AI فعال شود؛ برای نمونه: {0} کمک کن میزان استفاده از دیسک را بررسی کنم.',
@@ -3973,6 +3975,11 @@ 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 +6998,38 @@ 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 +7547,13 @@ const message = {
imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.', imageBatchConfirmPrefix: 'در حال انتقال {0} تصویر به {1} گره، مجموعاً {2} وظیفه.',
ssl: 'همگام‌سازی گواهی', ssl: 'همگام‌سازی گواهی',
phpExtensions: 'همگام‌سازی قالب‌های افزونه PHP',
phpExtensionsTitle: 'همگام‌سازی قالب‌های افزونه',
phpExtensionsDesc: 'یک گره مبدأ انتخاب کنید تا قالب افزونه PHP آن با گره‌های مقصد همگام شود.',
phpExtensionsList: 'افزونه‌های PHP',
phpExtensionsConfirm: '{0} قالب افزونه PHP با {1} گره همگام می‌شود.',
phpExtensionsConflictHint:
'قالب‌های یکسان نادیده گرفته می‌شوند. قالب‌های هم‌نام با محتوای متفاوت به‌عنوان تعارض گزارش می‌شوند و بازنویسی نخواهند شد.',
sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.', sslBatchDesc: 'پس از انتخاب یک گره منبع، گواهی مشخص شده را به محیط پنل فعلی همگام‌سازی کنید.',
sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.', sslBatchConfirmPrefix: 'در حال همگام‌سازی {0} گواهی به {1} گره، مجموعاً {2} وظیفه.',
+57 -14
View File
@@ -803,7 +803,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'既存のインストールに対応する HTTPS アクセス先またはポートがありません。アプリの設定を確認してください。', '既存のインストールに対応する HTTPS アクセス先またはポートがありません。アプリの設定を確認してください。',
agent: 'エージェント', agent: 'エージェント',
account: 'モデルアカウント', account: 'モデルサービス',
batchOperation: '一括操作', batchOperation: '一括操作',
operationType: '操作タイプ', operationType: '操作タイプ',
batchAction: '一括{0}', batchAction: '一括{0}',
@@ -817,10 +817,10 @@ const message = {
skillSource: 'Skill ソース', skillSource: 'Skill ソース',
skillKeyword: 'Skill キーワード', skillKeyword: 'Skill キーワード',
clawHubSkillPlaceholder: '先に Skill を検索して選択してください', clawHubSkillPlaceholder: '先に Skill を検索して選択してください',
noAccountHint: '既存のモデルアカウントを選択するか、新規に追加してください。', noAccountHint: '既存のモデルサービスを選択するか、新規に追加してください。',
accountCount: 'モデルアカウント {0} 件', accountCount: 'モデルサービス {0} 件',
syncAgents: '関連エージェントを同期', syncAgents: '関連エージェントを同期',
syncAgentsHelper: 'このモデルアカウントを使用するエージェントの openclaw.json を更新', syncAgentsHelper: 'このモデルサービスを使用するエージェントの openclaw.json を更新',
appVersion: 'アプリバージョン', appVersion: 'アプリバージョン',
webuiPort: 'WebUI ポート', webuiPort: 'WebUI ポート',
tokenOrAuth: 'Token/認証', tokenOrAuth: 'Token/認証',
@@ -860,7 +860,7 @@ const message = {
useModelDefault: 'モデルの既定値を使用', useModelDefault: 'モデルの既定値を使用',
reasoning: '推論モデル', reasoning: '推論モデル',
verified: '検証済み', verified: '検証済み',
verifySkipped: '検証なし', verifySkipped: '検証不要',
skillsTab: '技能', skillsTab: '技能',
pluginsTab: 'プラグイン', pluginsTab: 'プラグイン',
pluginsInstalled: 'インストール済み', pluginsInstalled: 'インストール済み',
@@ -1203,9 +1203,9 @@ const message = {
notInstalled: '未インストール', notInstalled: '未インストール',
usage: '使用量', usage: '使用量',
accountPool: 'アカウントプール', accountPool: 'アカウントプール',
importModelAccount: 'モデルアカウントをインポート', importModelAccount: 'モデルサービスをインポート',
editModelAccount: 'モデルアカウントを編集', editModelAccount: 'モデルサービスを編集',
selectModelAccount: '既存のモデルアカウントを選択', selectModelAccount: '既存のモデルサービスを選択',
upstreamApiAddress: '上流 API アドレス', upstreamApiAddress: '上流 API アドレス',
priority: '優先度', priority: '優先度',
healthStatus: 'ヘルス状態', healthStatus: 'ヘルス状態',
@@ -1261,8 +1261,8 @@ const message = {
waitingQueue: '現在の待機キュー', waitingQueue: '現在の待機キュー',
currentActiveUsers: '現在のアクティブユーザー', currentActiveUsers: '現在のアクティブユーザー',
activeStreamingRequests: '実行中のストリーミングリクエスト', activeStreamingRequests: '実行中のストリーミングリクエスト',
modelAccountConcurrency: 'モデルアカウント同時実行数', modelAccountConcurrency: 'モデルサービス同時実行数',
accountAvailability: 'モデルアカウント可用性', accountAvailability: 'モデルサービス可用性',
capacityFull: '上限到達', capacityFull: '上限到達',
groupConcurrency: 'ユーザーグループ同時実行数', groupConcurrency: 'ユーザーグループ同時実行数',
apiKeyConcurrency: 'API Key 同時実行数', apiKeyConcurrency: 'API Key 同時実行数',
@@ -1316,7 +1316,7 @@ const message = {
esLogCircuitUntil: 'ES サーキット終了時刻', esLogCircuitUntil: 'ES サーキット終了時刻',
serviceOperateConfirm: 'AI ゲートウェイサービスを {0} しますか?', serviceOperateConfirm: 'AI ゲートウェイサービスを {0} しますか?',
deleteTargetConfirm: '{0} {1} を削除しますか?', deleteTargetConfirm: '{0} {1} を削除しますか?',
deleteBackendTitle: 'モデルアカウントを削除', deleteBackendTitle: 'モデルサービスを削除',
userFallback: '削除済みユーザー (ID: {0})', userFallback: '削除済みユーザー (ID: {0})',
requestModel: 'リクエストモデル', requestModel: 'リクエストモデル',
upstreamModel: '上流モデル', upstreamModel: '上流モデル',
@@ -1329,7 +1329,7 @@ const message = {
usageTrend: '使用傾向', usageTrend: '使用傾向',
distributionBy: '{0}別分布', distributionBy: '{0}別分布',
unmatched: '未一致', unmatched: '未一致',
modelAccount: 'モデルアカウント', modelAccount: 'モデルサービス',
serviceProvider: 'プロバイダー', serviceProvider: 'プロバイダー',
tokenUsage: 'Token 使用量', tokenUsage: 'Token 使用量',
percent: '割合', percent: '割合',
@@ -1676,6 +1676,8 @@ const message = {
timeToFirstToken: '平均初回トークン遅延', timeToFirstToken: '平均初回トークン遅延',
timePerOutputToken: '平均トークン間遅延', timePerOutputToken: '平均トークン間遅延',
requestLatency: '平均リクエスト遅延', requestLatency: '平均リクエスト遅延',
noMetrics:
'メトリクスエンドポイントにはアクセスできますが、対応する vLLM メトリクスはまだありません。一部のメトリクスは初回の推論リクエスト後に生成される場合があります。',
unavailable: '指標を取得できません。インスタンスが稼働し、/metrics にアクセスできるか確認してください。', unavailable: '指標を取得できません。インスタンスが稼働し、/metrics にアクセスできるか確認してください。',
loadFailed: '監視データの読み込みに失敗しました。再試行してください。', loadFailed: '監視データの読み込みに失敗しました。再試行してください。',
helper: '収集の有効化、間隔、保存期間は監視設定で変更できます。', helper: '収集の有効化、間隔、保存期間は監視設定で変更できます。',
@@ -2811,7 +2813,7 @@ const message = {
scrollSensitivity: 'スクロール感度', scrollSensitivity: 'スクロール感度',
aiAssistant: 'AI アシスタント', aiAssistant: 'AI アシスタント',
aiAccountHelper: aiAccountHelper:
'選択したモデルアカウントでコマンドを生成して補完します。Ollama や vLLM などのローカルモデルはカスタムモデルアカウントを使用してください。', '選択したモデルサービスでコマンドを生成して補完します。Ollama や vLLM などのローカルモデルはカスタムモデルサービスを使用してください。',
aiPrefix: 'トリガープレフィックス', aiPrefix: 'トリガープレフィックス',
aiPrefixHelper: aiPrefixHelper:
'「プレフィックス + スペース」を入力して Enter を押すと、AI コマンド生成がトリガーされます。例: {0} ディスク情報を確認して。', '「プレフィックス + スペース」を入力して Enter を押すと、AI コマンド生成がトリガーされます。例: {0} ディスク情報を確認して。',
@@ -3058,7 +3060,7 @@ const message = {
aiSearchHint: aiSearchHint:
'ファイル内容を行ごとに検索します。検索行右側のボタンと下の「詳細条件」で検索方法を切り替えられます。AIアカウントを有効化して保存すると、Markdown要約も生成できます。', 'ファイル内容を行ごとに検索します。検索行右側のボタンと下の「詳細条件」で検索方法を切り替えられます。AIアカウントを有効化して保存すると、Markdown要約も生成できます。',
aiSearchAccountTitle: 'AIアカウント', aiSearchAccountTitle: 'AIアカウント',
aiSearchAccountIntro: '要約生成に使うモデルのアカウントを選択し、変更後は保存してください。', aiSearchAccountIntro: '要約生成に使うモデルサービスを選択し、変更後は保存してください。',
aiSearchAccountEnable: 'ファイルAI検索を有効化', aiSearchAccountEnable: 'ファイルAI検索を有効化',
aiSearchSaveAccount: 'アカウント設定を保存', aiSearchSaveAccount: 'アカウント設定を保存',
aiSearchSectionQuery: '検索', aiSearchSectionQuery: '検索',
@@ -3990,6 +3992,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 +7032,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 +7574,13 @@ const message = {
'{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。', '{0} 個のイメージを {1} 個のノードへ転送します。合計 {2} 件のタスクが作成されます。',
ssl: '証明書同期', ssl: '証明書同期',
phpExtensions: 'PHP 拡張機能テンプレートの同期',
phpExtensionsTitle: '拡張機能テンプレートの同期',
phpExtensionsDesc: 'ソースノードを選択し、その PHP 拡張機能テンプレートをターゲットノードに同期します。',
phpExtensionsList: 'PHP 拡張機能',
phpExtensionsConfirm: '{0} 件の PHP 拡張機能テンプレートを {1} 個のノードに同期します。',
phpExtensionsConflictHint:
'同一のテンプレートはスキップします。同じ名前で内容が異なるテンプレートは競合として報告し、上書きしません。',
sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。', sslBatchDesc: 'ソースノードを選択すると、指定した証明書を現在のパネル環境へ同期できます。',
sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。', sslBatchConfirmPrefix: '{0} 件の証明書を {1} 個のノードへ同期します。合計 {2} 件のタスクが作成されます。',
+54 -14
View File
@@ -794,7 +794,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'기존 설치에 호환되는 HTTPS 접속 주소 또는 포트가 없습니다. 앱 설정을 확인하세요.', '기존 설치에 호환되는 HTTPS 접속 주소 또는 포트가 없습니다. 앱 설정을 확인하세요.',
agent: '에이전트', agent: '에이전트',
account: '모델 계정', account: '모델 서비스',
batchOperation: '일괄 작업', batchOperation: '일괄 작업',
operationType: '작업 유형', operationType: '작업 유형',
batchAction: '일괄 {0}', batchAction: '일괄 {0}',
@@ -808,10 +808,10 @@ const message = {
skillSource: 'Skill 소스', skillSource: 'Skill 소스',
skillKeyword: 'Skill 키워드', skillKeyword: 'Skill 키워드',
clawHubSkillPlaceholder: '먼저 Skill을 검색하고 선택하세요', clawHubSkillPlaceholder: '먼저 Skill을 검색하고 선택하세요',
noAccountHint: '기존 모델 계정을 선택하거나 새로 추가하세요.', noAccountHint: '기존 모델 서비스를 선택하거나 새로 추가하세요.',
accountCount: '모델 계정 {0}개', accountCount: '모델 서비스 {0}개',
syncAgents: '관련 에이전트 동기화', syncAgents: '관련 에이전트 동기화',
syncAgentsHelper: '이 모델 계정을 사용하는 에이전트의 openclaw.json 업데이트', syncAgentsHelper: '이 모델 서비스를 사용하는 에이전트의 openclaw.json 업데이트',
appVersion: '앱 버전', appVersion: '앱 버전',
webuiPort: 'WebUI 포트', webuiPort: 'WebUI 포트',
tokenOrAuth: 'Token/인증', tokenOrAuth: 'Token/인증',
@@ -850,7 +850,7 @@ const message = {
useModelDefault: '모델 기본값 사용', useModelDefault: '모델 기본값 사용',
reasoning: '추론 모델', reasoning: '추론 모델',
verified: '검증됨', verified: '검증됨',
verifySkipped: '검증 안 함', verifySkipped: '검증 불필요',
skillsTab: '기술', skillsTab: '기술',
pluginsTab: '플러그인', pluginsTab: '플러그인',
pluginsInstalled: '설치됨', pluginsInstalled: '설치됨',
@@ -1190,9 +1190,9 @@ const message = {
notInstalled: '설치되지 않음', notInstalled: '설치되지 않음',
usage: '사용량', usage: '사용량',
accountPool: '계정 풀', accountPool: '계정 풀',
importModelAccount: '모델 계정 가져오기', importModelAccount: '모델 서비스 가져오기',
editModelAccount: '모델 계정 편집', editModelAccount: '모델 서비스 편집',
selectModelAccount: '기존 모델 계정 선택', selectModelAccount: '기존 모델 서비스 선택',
upstreamApiAddress: '업스트림 API 주소', upstreamApiAddress: '업스트림 API 주소',
priority: '우선순위', priority: '우선순위',
healthStatus: '상태', healthStatus: '상태',
@@ -1248,8 +1248,8 @@ const message = {
waitingQueue: '현재 대기열', waitingQueue: '현재 대기열',
currentActiveUsers: '현재 활성 사용자', currentActiveUsers: '현재 활성 사용자',
activeStreamingRequests: '활성 스트리밍 요청', activeStreamingRequests: '활성 스트리밍 요청',
modelAccountConcurrency: '모델 계정 동시성', modelAccountConcurrency: '모델 서비스 동시성',
accountAvailability: '모델 계정 가용성', accountAvailability: '모델 서비스 가용성',
capacityFull: '용량 가득 참', capacityFull: '용량 가득 참',
groupConcurrency: '사용자 그룹 동시성', groupConcurrency: '사용자 그룹 동시성',
apiKeyConcurrency: 'API Key 동시성', apiKeyConcurrency: 'API Key 동시성',
@@ -1303,7 +1303,7 @@ const message = {
esLogCircuitUntil: 'ES 서킷 종료 시간', esLogCircuitUntil: 'ES 서킷 종료 시간',
serviceOperateConfirm: 'AI 게이트웨이 서비스를 {0}하시겠습니까?', serviceOperateConfirm: 'AI 게이트웨이 서비스를 {0}하시겠습니까?',
deleteTargetConfirm: '{0} {1}을(를) 삭제하시겠습니까?', deleteTargetConfirm: '{0} {1}을(를) 삭제하시겠습니까?',
deleteBackendTitle: '모델 계정 삭제', deleteBackendTitle: '모델 서비스 삭제',
userFallback: '삭제된 사용자 (ID: {0})', userFallback: '삭제된 사용자 (ID: {0})',
requestModel: '요청 모델', requestModel: '요청 모델',
upstreamModel: '업스트림 모델', upstreamModel: '업스트림 모델',
@@ -1316,7 +1316,7 @@ const message = {
usageTrend: '사용 추세', usageTrend: '사용 추세',
distributionBy: '{0}별 분포', distributionBy: '{0}별 분포',
unmatched: '미일치', unmatched: '미일치',
modelAccount: '모델 계정', modelAccount: '모델 서비스',
serviceProvider: '제공자', serviceProvider: '제공자',
tokenUsage: 'Token 사용량', tokenUsage: 'Token 사용량',
percent: '비율', percent: '비율',
@@ -1660,6 +1660,8 @@ const message = {
timeToFirstToken: '평균 첫 토큰 지연', timeToFirstToken: '평균 첫 토큰 지연',
timePerOutputToken: '평균 토큰 간 지연', timePerOutputToken: '평균 토큰 간 지연',
requestLatency: '평균 요청 지연', requestLatency: '평균 요청 지연',
noMetrics:
'메트릭 엔드포인트에 접근할 수 있지만 아직 지원되는 vLLM 메트릭이 없습니다. 일부 메트릭은 첫 추론 요청 후에만 생성될 수 있습니다.',
unavailable: '지표를 수집할 수 없습니다. 인스턴스 실행 상태와 /metrics 접근 가능 여부를 확인하세요.', unavailable: '지표를 수집할 수 없습니다. 인스턴스 실행 상태와 /metrics 접근 가능 여부를 확인하세요.',
loadFailed: '모니터링 데이터를 불러오지 못했습니다. 다시 시도하세요.', loadFailed: '모니터링 데이터를 불러오지 못했습니다. 다시 시도하세요.',
helper: '수집 활성화, 간격 및 보존 기간은 모니터링 설정에서 조정합니다.', helper: '수집 활성화, 간격 및 보존 기간은 모니터링 설정에서 조정합니다.',
@@ -2770,7 +2772,7 @@ const message = {
scrollSensitivity: '스크롤 감도', scrollSensitivity: '스크롤 감도',
aiAssistant: 'AI 도우미', aiAssistant: 'AI 도우미',
aiAccountHelper: aiAccountHelper:
'선택한 모델 계정으로 명령을 생성하고 채웁니다. Ollama, vLLM 같은 로컬 모델은 사용자 지정 모델 계정을 사용하세요.', '선택한 모델 서비스로 명령을 생성하고 채웁니다. Ollama, vLLM 같은 로컬 모델은 사용자 지정 모델 서비스를 사용하세요.',
aiPrefix: '트리거 접두사', aiPrefix: '트리거 접두사',
aiPrefixHelper: aiPrefixHelper:
'"접두사 + 공백"을 입력하고 Enter를 누르면 AI 명령 생성이 시작됩니다. 예: {0} 디스크 정보를 조회해줘.', '"접두사 + 공백"을 입력하고 Enter를 누르면 AI 명령 생성이 시작됩니다. 예: {0} 디스크 정보를 조회해줘.',
@@ -3012,7 +3014,7 @@ const message = {
aiSearchHint: aiSearchHint:
'파일 내용을 줄 단위로 검색합니다. 검색창 오른쪽 버튼과 아래의 "고급 조건"에서 검색 방식을 바꿀 수 있습니다. AI 계정을 활성화하고 저장하면 Markdown 요약도 생성할 수 있습니다.', '파일 내용을 줄 단위로 검색합니다. 검색창 오른쪽 버튼과 아래의 "고급 조건"에서 검색 방식을 바꿀 수 있습니다. AI 계정을 활성화하고 저장하면 Markdown 요약도 생성할 수 있습니다.',
aiSearchAccountTitle: 'AI 계정', aiSearchAccountTitle: 'AI 계정',
aiSearchAccountIntro: '요약 생성을 위한 대형 모델 계정을 선택하세요. 변경 후 저장을 눌러주세요.', aiSearchAccountIntro: '요약 생성을 위한 대형 모델 서비스를 선택하세요. 변경 후 저장을 눌러주세요.',
aiSearchAccountEnable: '파일 AI 검색 활성화', aiSearchAccountEnable: '파일 AI 검색 활성화',
aiSearchSaveAccount: '계정 설정 저장', aiSearchSaveAccount: '계정 설정 저장',
aiSearchSectionQuery: '검색', aiSearchSectionQuery: '검색',
@@ -3920,6 +3922,12 @@ const message = {
'상용 버전으로 업그레이드하면 노드를 수동으로 전환하지 않고도 다중 노드 애플리케이션 버전을 일괄 업그레이드할 수 있습니다.', '상용 버전으로 업그레이드하면 노드를 수동으로 전환하지 않고도 다중 노드 애플리케이션 버전을 일괄 업그레이드할 수 있습니다.',
nodeDashboard: nodeDashboard:
'상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.', '상용 버전으로 업그레이드하면 다중 노드 애플리케이션, 웹사이트, 데이터베이스, 예약 작업을 중앙에서 관리할 수 있습니다.',
imageExchange: '상용 버전으로 업그레이드하면 노드 간에 컨테이너 이미지를 일괄 전송할 수 있습니다.',
appExchange:
'상용 버전으로 업그레이드하면 설치된 애플리케이션을 대상 노드로 마이그레이션하고 필요한 리소스 의존성을 확인할 수 있습니다.',
sslSync: '상용 버전으로 업그레이드하면 원본 노드의 인증서를 하나 이상의 대상 노드에 동기화할 수 있습니다.',
phpExtensionsSync:
'상용 버전으로 업그레이드하면 PHP 확장 템플릿을 하나 이상의 대상 노드에 동기화할 수 있습니다.',
fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.', fileExchange: '상용 버전으로 업그레이드하면 여러 서버 간에 파일을 빠르게 전송할 수 있습니다.',
app: '상용 버전으로 업그레이드하면 모바일 앱에서 서비스 정보와 이상 모니터링을 확인할 수 있습니다.', app: '상용 버전으로 업그레이드하면 모바일 앱에서 서비스 정보와 이상 모니터링을 확인할 수 있습니다.',
cluster: '상용 버전으로 업그레이드하면 MySQL/Postgres/Redis 기본-복제 클러스터를 관리할 수 있습니다.', cluster: '상용 버전으로 업그레이드하면 MySQL/Postgres/Redis 기본-복제 클러스터를 관리할 수 있습니다.',
@@ -6883,6 +6891,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 +7423,13 @@ const message = {
imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.', imageBatchConfirmPrefix: '{0}개의 이미지를 {1}개 노드로 전달합니다. 총 {2}개의 작업이 생성됩니다.',
ssl: '인증서 동기화', ssl: '인증서 동기화',
phpExtensions: 'PHP 확장 템플릿 동기화',
phpExtensionsTitle: '확장 템플릿 동기화',
phpExtensionsDesc: '원본 노드를 선택하여 PHP 확장 템플릿을 대상 노드에 동기화합니다.',
phpExtensionsList: 'PHP 확장',
phpExtensionsConfirm: 'PHP 확장 템플릿 {0}개를 노드 {1}개에 동기화합니다.',
phpExtensionsConflictHint:
'동일한 템플릿은 건너뜁니다. 이름은 같지만 내용이 다른 템플릿은 충돌로 보고되며 덮어쓰지 않습니다.',
sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.', sslBatchDesc: '원본 노드를 선택한 후 지정된 인증서를 현재 패널 환경으로 동기화할 수 있습니다.',
sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.', sslBatchConfirmPrefix: '{0}개의 인증서를 {1}개 노드로 동기화합니다. 총 {2}개의 작업이 생성됩니다.',
+52 -13
View File
@@ -792,7 +792,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'ການຕິດຕັ້ງທີ່ມີຢູ່ບໍ່ມີທີ່ຢູ່ ຫຼືພອດ HTTPS ທີ່ເຂົ້າກັນໄດ້. ກະລຸນາກວດສອບການຕັ້ງຄ່າແອັບ.', 'ການຕິດຕັ້ງທີ່ມີຢູ່ບໍ່ມີທີ່ຢູ່ ຫຼືພອດ HTTPS ທີ່ເຂົ້າກັນໄດ້. ກະລຸນາກວດສອບການຕັ້ງຄ່າແອັບ.',
agent: 'ຕົວແທນ (Agent)', agent: 'ຕົວແທນ (Agent)',
account: 'ບັນຊີໂມເດວ', account: 'ບໍລິການໂມເດວ',
batchOperation: 'ດຳເນີນການແບບກຸ່ມ', batchOperation: 'ດຳເນີນການແບບກຸ່ມ',
operationType: 'ປະເພດການດຳເນີນການ', operationType: 'ປະເພດການດຳເນີນການ',
batchAction: '{0} ແບບກຸ່ມ', batchAction: '{0} ແບບກຸ່ມ',
@@ -806,10 +806,10 @@ const message = {
skillSource: 'ແຫຼ່ງທີ່ມາທັກສະ', skillSource: 'ແຫຼ່ງທີ່ມາທັກສະ',
skillKeyword: 'ຄຳຄົ້ນຫາທັກສະ', skillKeyword: 'ຄຳຄົ້ນຫາທັກສະ',
clawHubSkillPlaceholder: 'ຄົ້ນຫາ ແລະ ເລືອກທັກສະກ່ອນ', clawHubSkillPlaceholder: 'ຄົ້ນຫາ ແລະ ເລືອກທັກສະກ່ອນ',
noAccountHint: 'ເລືອກບັນຊີໂມເດວທີ່ມີຢູ່ ຫຼື ເພີ່ມບັນຊີໃໝ່.', noAccountHint: 'ເລືອກບໍລິການໂມເດວທີ່ມີຢູ່ ຫຼື ເພີ່ມບັນຊີໃໝ່.',
accountCount: '{0} ບັນຊີໂມເດວ', accountCount: '{0} ບໍລິການໂມເດວ',
syncAgents: 'ຊິ້ງຄ໌ຕົວແທນທີ່ກ່ຽວຂ້ອງ', syncAgents: 'ຊິ້ງຄ໌ຕົວແທນທີ່ກ່ຽວຂ້ອງ',
syncAgentsHelper: 'ອັບເດດ openclaw.json ສຳລັບຕົວແທນທີ່ໃຊ້ບັນຊີໂມເດວນີ້', syncAgentsHelper: 'ອັບເດດ openclaw.json ສຳລັບຕົວແທນທີ່ໃຊ້ບໍລິການໂມເດວນີ້',
appVersion: 'ເວີຊັນແອັບ', appVersion: 'ເວີຊັນແອັບ',
webuiPort: 'ພອດ WebUI', webuiPort: 'ພອດ WebUI',
tokenOrAuth: 'Token/ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານ', tokenOrAuth: 'Token/ຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານ',
@@ -848,7 +848,7 @@ const message = {
useModelDefault: 'ໃຊ້ຄ່າເລີ່ມຕົ້ນຂອງໂມເດວ', useModelDefault: 'ໃຊ້ຄ່າເລີ່ມຕົ້ນຂອງໂມເດວ',
reasoning: 'ໂມເດວການໃຊ້ເຫດຜົນ', reasoning: 'ໂມເດວການໃຊ້ເຫດຜົນ',
verified: 'ກວດສອບແລ້ວ', verified: 'ກວດສອບແລ້ວ',
verifySkipped: 'ບໍ່ມີການກວດສອບ', verifySkipped: 'ບໍ່ຈຳເປັນຕ້ອງກວດສອບ',
skillsTab: 'ທັກສະ', skillsTab: 'ທັກສະ',
pluginsTab: 'ປລັກອິນ', pluginsTab: 'ປລັກອິນ',
pluginsInstalled: 'ຕິດຕັ້ງແລ້ວ', pluginsInstalled: 'ຕິດຕັ້ງແລ້ວ',
@@ -1185,9 +1185,9 @@ const message = {
notInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງ', notInstalled: 'ຍັງບໍ່ໄດ້ຕິດຕັ້ງ',
usage: 'ການໃຊ້ງານ', usage: 'ການໃຊ້ງານ',
accountPool: 'ກຸ່ມບັນຊີ', accountPool: 'ກຸ່ມບັນຊີ',
importModelAccount: 'ນຳເຂົ້າບັນຊີໂມເດວ', importModelAccount: 'ນຳເຂົ້າບໍລິການໂມເດວ',
editModelAccount: 'ແກ້ໄຂບັນຊີໂມເດວ', editModelAccount: 'ແກ້ໄຂບໍລິການໂມເດວ',
selectModelAccount: 'ເລືອກບັນຊີໂມເດວທີ່ມີຢູ່', selectModelAccount: 'ເລືອກບໍລິການໂມເດວທີ່ມີຢູ່',
upstreamApiAddress: 'ທີ່ຢູ່ API ຕົ້ນທາງ (Upstream)', upstreamApiAddress: 'ທີ່ຢູ່ API ຕົ້ນທາງ (Upstream)',
priority: 'ລຳດັບຄວາມສຳຄັນ', priority: 'ລຳດັບຄວາມສຳຄັນ',
healthStatus: 'ສຸຂະພາບ', healthStatus: 'ສຸຂະພາບ',
@@ -1242,8 +1242,8 @@ const message = {
gatewayConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງເກດເວປັດຈຸບັນ', gatewayConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງເກດເວປັດຈຸບັນ',
waitingQueue: 'ຄິວລໍຖ້າປັດຈຸບັນ', waitingQueue: 'ຄິວລໍຖ້າປັດຈຸບັນ',
currentActiveUsers: 'ຜູ້ໃຊ້ທີ່ກຳລັງໃຊ້ງານ', currentActiveUsers: 'ຜູ້ໃຊ້ທີ່ກຳລັງໃຊ້ງານ',
modelAccountConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງບັນຊີໂມເດວ', modelAccountConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງບໍລິການໂມເດວ',
accountAvailability: 'ຄວາມພ້ອມໃຊ້ງານຂອງບັນຊີໂມເດວ', accountAvailability: 'ຄວາມພ້ອມໃຊ້ງານຂອງບໍລິການໂມເດວ',
capacityFull: 'ຄວາມຈຸເຕັມ', capacityFull: 'ຄວາມຈຸເຕັມ',
groupConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງກຸ່ມຜູ້ໃຊ້', groupConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງກຸ່ມຜູ້ໃຊ້',
apiKeyConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງ API Key', apiKeyConcurrency: 'ການເຮັດວຽກພ້ອມກັນຂອງ API Key',
@@ -1297,7 +1297,7 @@ const message = {
esLogCircuitUntil: 'ES Circuit ຈົນເຖິງ', esLogCircuitUntil: 'ES Circuit ຈົນເຖິງ',
serviceOperateConfirm: 'ຢືນຢັນທີ່ຈະ {0} ບໍລິການ AI Gateway?', serviceOperateConfirm: 'ຢືນຢັນທີ່ຈະ {0} ບໍລິການ AI Gateway?',
deleteTargetConfirm: 'ລຶບ {0} {1}?', deleteTargetConfirm: 'ລຶບ {0} {1}?',
deleteBackendTitle: 'ລຶບບັນຊີໂມເດວ', deleteBackendTitle: 'ລຶບບໍລິການໂມເດວ',
userFallback: 'ຜູ້ໃຊ້ທີ່ຖືກລຶບ (ID: {0})', userFallback: 'ຜູ້ໃຊ້ທີ່ຖືກລຶບ (ID: {0})',
requestModel: 'ໂມເດວທີ່ຮ້ອງຂໍ', requestModel: 'ໂມເດວທີ່ຮ້ອງຂໍ',
upstreamModel: 'ໂມເດວຕົ້ນທາງ (Upstream)', upstreamModel: 'ໂມເດວຕົ້ນທາງ (Upstream)',
@@ -1310,7 +1310,7 @@ const message = {
usageTrend: 'ແນວໂນ້ມການນຳໃຊ້', usageTrend: 'ແນວໂນ້ມການນຳໃຊ້',
distributionBy: 'ການແຈກຢາຍໂດຍ {0}', distributionBy: 'ການແຈກຢາຍໂດຍ {0}',
unmatched: 'ບໍ່ກົງກັນ', unmatched: 'ບໍ່ກົງກັນ',
modelAccount: 'ບັນຊີໂມເດວ', modelAccount: 'ບໍລິການໂມເດວ',
serviceProvider: 'ຜູ້ໃຫ້ບໍລິການ', serviceProvider: 'ຜູ້ໃຫ້ບໍລິການ',
tokenUsage: 'ການນຳໃຊ້ Token', tokenUsage: 'ການນຳໃຊ້ Token',
percent: 'ເປີເຊັນ', percent: 'ເປີເຊັນ',
@@ -1649,6 +1649,8 @@ const message = {
timeToFirstToken: 'ເວລາລໍຖ້າສະເລ່ຍຂອງ Token ທຳອິດ', timeToFirstToken: 'ເວລາລໍຖ້າສະເລ່ຍຂອງ Token ທຳອິດ',
timePerOutputToken: 'ເວລາລໍຖ້າສະເລ່ຍລະຫວ່າງ Token', timePerOutputToken: 'ເວລາລໍຖ້າສະເລ່ຍລະຫວ່າງ Token',
requestLatency: 'ເວລາລໍຖ້າສະເລ່ຍຂອງຄຳຮ້ອງຂໍ', requestLatency: 'ເວລາລໍຖ້າສະເລ່ຍຂອງຄຳຮ້ອງຂໍ',
noMetrics:
'ສາມາດເຂົ້າເຖິງຈຸດປາຍທາງເມຕຣິກໄດ້ ແຕ່ຍັງບໍ່ມີເມຕຣິກ vLLM ທີ່ຮອງຮັບ. ບາງເມຕຣິກອາດປາກົດຫຼັງຈາກຄຳຮ້ອງຂໍອະນຸມານຄັ້ງທຳອິດເທົ່ານັ້ນ.',
unavailable: 'ບໍ່ສາມາດເກັບຕົວຊີ້ວັດໄດ້. ກວດສອບວ່າອິນສະແຕນເຮັດວຽກ ແລະ ເຂົ້າເຖິງ /metrics ໄດ້.', unavailable: 'ບໍ່ສາມາດເກັບຕົວຊີ້ວັດໄດ້. ກວດສອບວ່າອິນສະແຕນເຮັດວຽກ ແລະ ເຂົ້າເຖິງ /metrics ໄດ້.',
loadFailed: 'ໂຫຼດຂໍ້ມູນຕິດຕາມບໍ່ສຳເລັດ. ກະລຸນາລອງອີກຄັ້ງ.', loadFailed: 'ໂຫຼດຂໍ້ມູນຕິດຕາມບໍ່ສຳເລັດ. ກະລຸນາລອງອີກຄັ້ງ.',
helper: 'ປັບການເປີດໃຊ້ການເກັບຂໍ້ມູນ, ໄລຍະຫ່າງ ແລະ ຈຳນວນມື້ເກັບຮັກສາໃນການຕັ້ງຄ່າການຕິດຕາມ.', helper: 'ປັບການເປີດໃຊ້ການເກັບຂໍ້ມູນ, ໄລຍະຫ່າງ ແລະ ຈຳນວນມື້ເກັບຮັກສາໃນການຕັ້ງຄ່າການຕິດຕາມ.',
@@ -2748,7 +2750,7 @@ const message = {
scrollSensitivity: 'ຄວາມໄວການເລື່ອນ (Scroll)', scrollSensitivity: 'ຄວາມໄວການເລື່ອນ (Scroll)',
aiAssistant: 'AI Assistant', aiAssistant: 'AI Assistant',
aiAccountHelper: aiAccountHelper:
'ໃຊ້ບັນຊີໂມເດວທີ່ເລືອກເພື່ອສ້າງ ແລະ ຕື່ມຄຳສັ່ງ. ສຳລັບໂມເດວພາຍໃນເຄື່ອງເຊັ່ນ Ollama ແລະ vLLM ໃຫ້ໃຊ້ບັນຊີໂມເດວທີ່ກຳນົດເອງ.', 'ໃຊ້ບໍລິການໂມເດວທີ່ເລືອກເພື່ອສ້າງ ແລະ ຕື່ມຄຳສັ່ງ. ສຳລັບໂມເດວພາຍໃນເຄື່ອງເຊັ່ນ Ollama ແລະ vLLM ໃຫ້ໃຊ້ບໍລິການໂມເດວທີ່ກຳນົດເອງ.',
aiPrefix: 'Prefix ເລີ່ມຕົ້ນ AI', aiPrefix: 'Prefix ເລີ່ມຕົ້ນ AI',
aiPrefixHelper: aiPrefixHelper:
'ປ້ອນ "prefix + ຍະຫວ່າງ" ແລະ ກົດ Enter ເພື່ອໃຫ້ AI ສ້າງຄຳສັ່ງ, ຕົວຢ່າງ: {0} help me check disk usage.', 'ປ້ອນ "prefix + ຍະຫວ່າງ" ແລະ ກົດ Enter ເພື່ອໃຫ້ AI ສ້າງຄຳສັ່ງ, ຕົວຢ່າງ: {0} help me check disk usage.',
@@ -3898,6 +3900,11 @@ const message = {
nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.', nodeApp: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອອັບເກຣດເວີຊັນແອັບໃນຫຼາຍໂນດໂດຍບໍ່ຕ້ອງສະຫຼັບໂນດດ້ວຍຕົນເອງ.',
nodeDashboard: nodeDashboard:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.', 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຈັດການແອັບ, ເວັບໄຊ, ຖານຂໍ້ມູນ ແລະ ງານຕາມກຳນົດເວລາຂອງຫຼາຍໂນດຢູ່ບ່ອນດຽວ.',
imageExchange: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອໂອນອິມເມດຄອນເທນເນີເປັນຊຸດລະຫວ່າງໂນດ.',
appExchange:
'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຍ້າຍແອັບທີ່ຕິດຕັ້ງແລ້ວໄປຍັງໂນດປາຍທາງ ແລະ ຢືນຢັນຊັບພະຍາກອນທີ່ຈຳເປັນ.',
sslSync: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຊິງໃບຢັ້ງຢືນຈາກໂນດຕົ້ນທາງໄປຍັງໂນດປາຍທາງໜຶ່ງ ຫຼື ຫຼາຍໂນດ.',
phpExtensionsSync: 'ອັບເກຣດເປັນເວີຊັນ Commercial ເພື່ອຊິງແມ່ແບບສ່ວນຂະຫຍາຍ 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 +6832,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: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication', fileExchangeTitle1: 'ສົ່ງຂໍ້ມູນຜ່ານ Key Authentication',
fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.', fileExchangeContent1: 'ຢືນຢັນຕົວຕົນຜ່ານ SSH keys ເພື່ອຄວາມປອດໄພໃນການສົ່ງຂໍ້ມູນ.',
fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ', fileExchangeTitle2: 'ຊິງໂຄຣໄນໄຟລ໌ທີ່ມີປະສິດທິພາບ',
@@ -7302,6 +7334,13 @@ const message = {
imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.', imageBatchConfirmPrefix: 'ກຳລັງຈະໂອນ {0} images ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ', ssl: 'ຊິງໂຄຣໄນໃບຢັ້ງຢືນ',
phpExtensions: 'ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP',
phpExtensionsTitle: 'ຊິງແມ່ແບບສ່ວນຂະຫຍາຍ',
phpExtensionsDesc: 'ເລືອກໂນດຕົ້ນທາງເພື່ອຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP ໄປຍັງໂນດປາຍທາງ.',
phpExtensionsList: 'ສ່ວນຂະຫຍາຍ PHP',
phpExtensionsConfirm: 'ຈະຊິງແມ່ແບບສ່ວນຂະຫຍາຍ PHP {0} ແມ່ແບບ ໄປຍັງ {1} ໂນດ.',
phpExtensionsConflictHint:
'ແມ່ແບບທີ່ຄືກັນຈະຖືກຂ້າມ. ແມ່ແບບທີ່ມີຊື່ຄືກັນແຕ່ເນື້ອຫາຕ່າງກັນຈະຖືກແຈ້ງເປັນຂໍ້ຂັດແຍ່ງ ແລະ ບໍ່ຖືກຂຽນທັບ.',
sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.', sslBatchDesc: 'ເລືອກໂນດຕົ້ນທາງ ແລະ ຊິງໂຄຣໄນໃບຢັ້ງຢືນທີ່ກຳນົດເຂົ້າມາໃນພາແນລປັດຈຸບັນ.',
sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.', sslBatchConfirmPrefix: 'ກຳລັງຈະຊິງໂຄຣໄນ {0} ໃບຢັ້ງຢືນ ໄປຫາ {1} ໂນດ, ລວມທັງໝົດ {2} ງານ.',
+62 -14
View File
@@ -812,7 +812,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'Pemasangan sedia ada tiada alamat atau port HTTPS yang serasi. Semak tetapan aplikasi.', 'Pemasangan sedia ada tiada alamat atau port HTTPS yang serasi. Semak tetapan aplikasi.',
agent: 'Agen', agent: 'Agen',
account: 'Akaun model', account: 'Perkhidmatan model',
batchOperation: 'Operasi pukal', batchOperation: 'Operasi pukal',
operationType: 'Jenis operasi', operationType: 'Jenis operasi',
batchAction: '{0} pukal', batchAction: '{0} pukal',
@@ -826,10 +826,10 @@ const message = {
skillSource: 'Sumber Skill', skillSource: 'Sumber Skill',
skillKeyword: 'Kata kunci Skill', skillKeyword: 'Kata kunci Skill',
clawHubSkillPlaceholder: 'Cari dan pilih Skill dahulu', clawHubSkillPlaceholder: 'Cari dan pilih Skill dahulu',
noAccountHint: 'Pilih akaun model sedia ada atau tambah yang baharu.', noAccountHint: 'Pilih perkhidmatan model sedia ada atau tambah yang baharu.',
accountCount: 'Akaun model {0}', accountCount: 'Perkhidmatan model {0}',
syncAgents: 'Segerakkan agen berkaitan', syncAgents: 'Segerakkan agen berkaitan',
syncAgentsHelper: 'Kemas kini openclaw.json untuk agen yang menggunakan akaun model ini', syncAgentsHelper: 'Kemas kini openclaw.json untuk agen yang menggunakan perkhidmatan model ini',
appVersion: 'Versi aplikasi', appVersion: 'Versi aplikasi',
webuiPort: 'Port WebUI', webuiPort: 'Port WebUI',
tokenOrAuth: 'Token/Pengesahan', tokenOrAuth: 'Token/Pengesahan',
@@ -871,7 +871,7 @@ const message = {
useModelDefault: 'Gunakan lalai model', useModelDefault: 'Gunakan lalai model',
reasoning: 'Model penaakulan', reasoning: 'Model penaakulan',
verified: 'Disahkan', verified: 'Disahkan',
verifySkipped: 'Tanpa pengesahan', verifySkipped: 'Pengesahan tidak diperlukan',
skillsTab: 'Kemahiran', skillsTab: 'Kemahiran',
pluginsTab: 'Pemalam', pluginsTab: 'Pemalam',
pluginsInstalled: 'Dipasang', pluginsInstalled: 'Dipasang',
@@ -1226,9 +1226,9 @@ const message = {
notInstalled: 'Belum dipasang', notInstalled: 'Belum dipasang',
usage: 'Penggunaan', usage: 'Penggunaan',
accountPool: 'Kolam Akaun', accountPool: 'Kolam Akaun',
importModelAccount: 'Import akaun model', importModelAccount: 'Import perkhidmatan model',
editModelAccount: 'Edit akaun model', editModelAccount: 'Edit perkhidmatan model',
selectModelAccount: 'Pilih akaun model sedia ada', selectModelAccount: 'Pilih perkhidmatan model sedia ada',
upstreamApiAddress: 'Alamat API Hulu', upstreamApiAddress: 'Alamat API Hulu',
priority: 'Keutamaan', priority: 'Keutamaan',
healthStatus: 'Status kesihatan', healthStatus: 'Status kesihatan',
@@ -1285,8 +1285,8 @@ const message = {
waitingQueue: 'Baris gilir menunggu semasa', waitingQueue: 'Baris gilir menunggu semasa',
currentActiveUsers: 'Pengguna aktif semasa', currentActiveUsers: 'Pengguna aktif semasa',
activeStreamingRequests: 'Permintaan penstriman aktif', activeStreamingRequests: 'Permintaan penstriman aktif',
modelAccountConcurrency: 'Keserentakan akaun model', modelAccountConcurrency: 'Keserentakan perkhidmatan model',
accountAvailability: 'Ketersediaan akaun model', accountAvailability: 'Ketersediaan perkhidmatan model',
capacityFull: 'Kapasiti penuh', capacityFull: 'Kapasiti penuh',
groupConcurrency: 'Keserentakan kumpulan pengguna', groupConcurrency: 'Keserentakan kumpulan pengguna',
apiKeyConcurrency: 'Keserentakan API Key', apiKeyConcurrency: 'Keserentakan API Key',
@@ -1340,7 +1340,7 @@ const message = {
esLogCircuitUntil: 'Litar ES hingga', esLogCircuitUntil: 'Litar ES hingga',
serviceOperateConfirm: 'Sahkan untuk {0} perkhidmatan gateway AI?', serviceOperateConfirm: 'Sahkan untuk {0} perkhidmatan gateway AI?',
deleteTargetConfirm: 'Padam {0} {1}?', deleteTargetConfirm: 'Padam {0} {1}?',
deleteBackendTitle: 'Padam akaun model', deleteBackendTitle: 'Padam perkhidmatan model',
userFallback: 'Pengguna dipadam (ID: {0})', userFallback: 'Pengguna dipadam (ID: {0})',
requestModel: 'Model permintaan', requestModel: 'Model permintaan',
upstreamModel: 'Model upstream', upstreamModel: 'Model upstream',
@@ -1353,7 +1353,7 @@ const message = {
usageTrend: 'Trend penggunaan', usageTrend: 'Trend penggunaan',
distributionBy: 'Taburan mengikut {0}', distributionBy: 'Taburan mengikut {0}',
unmatched: 'Tidak sepadan', unmatched: 'Tidak sepadan',
modelAccount: 'Akaun model', modelAccount: 'Perkhidmatan model',
serviceProvider: 'Penyedia', serviceProvider: 'Penyedia',
tokenUsage: 'Penggunaan Token', tokenUsage: 'Penggunaan Token',
percent: 'Peratus', percent: 'Peratus',
@@ -1703,6 +1703,8 @@ const message = {
timeToFirstToken: 'Purata kependaman token pertama', timeToFirstToken: 'Purata kependaman token pertama',
timePerOutputToken: 'Purata kependaman antara token', timePerOutputToken: 'Purata kependaman antara token',
requestLatency: 'Purata kependaman permintaan', requestLatency: 'Purata kependaman permintaan',
noMetrics:
'Titik akhir metrik boleh dicapai, tetapi belum ada metrik vLLM yang disokong. Sesetengah metrik mungkin hanya muncul selepas permintaan inferens pertama.',
unavailable: 'Metrik tidak tersedia. Pastikan tika sedang berjalan dan /metrics boleh dicapai.', unavailable: 'Metrik tidak tersedia. Pastikan tika sedang berjalan dan /metrics boleh dicapai.',
loadFailed: 'Gagal memuatkan data pemantauan. Sila cuba lagi.', loadFailed: 'Gagal memuatkan data pemantauan. Sila cuba lagi.',
helper: 'Urus pengumpulan, sela dan tempoh penyimpanan dalam tetapan pemantauan.', helper: 'Urus pengumpulan, sela dan tempoh penyimpanan dalam tetapan pemantauan.',
@@ -2862,7 +2864,7 @@ const message = {
scrollSensitivity: 'Kepekaan skrol', scrollSensitivity: 'Kepekaan skrol',
aiAssistant: 'Pembantu AI', aiAssistant: 'Pembantu AI',
aiAccountHelper: aiAccountHelper:
'Gunakan akaun model yang dipilih untuk menjana dan mengisi arahan. Untuk model tempatan seperti Ollama dan vLLM, gunakan akaun model tersuai.', 'Gunakan perkhidmatan model yang dipilih untuk menjana dan mengisi arahan. Untuk model tempatan seperti Ollama dan vLLM, gunakan perkhidmatan model tersuai.',
aiPrefix: 'Awalan pencetus', aiPrefix: 'Awalan pencetus',
aiPrefixHelper: aiPrefixHelper:
'Masukkan "awalan + ruang" dan tekan Enter untuk mencetuskan penjanaan arahan AI, contohnya: {0} bantu saya semak maklumat cakera.', 'Masukkan "awalan + ruang" dan tekan Enter untuk mencetuskan penjanaan arahan AI, contohnya: {0} bantu saya semak maklumat cakera.',
@@ -3120,7 +3122,7 @@ const message = {
aiSearchHint: aiSearchHint:
'Cari kandungan fail baris demi baris. Gunakan butang di sebelah kanan baris carian dan "Syarat lanjutan" di bawah. Apabila akaun AI diaktifkan dan disimpan, ringkasan Markdown juga boleh dijana.', 'Cari kandungan fail baris demi baris. Gunakan butang di sebelah kanan baris carian dan "Syarat lanjutan" di bawah. Apabila akaun AI diaktifkan dan disimpan, ringkasan Markdown juga boleh dijana.',
aiSearchAccountTitle: 'Akaun AI', aiSearchAccountTitle: 'Akaun AI',
aiSearchAccountIntro: 'Pilih akaun model besar untuk menjana ringkasan, kemudian simpan selepas perubahan.', aiSearchAccountIntro: 'Pilih perkhidmatan model besar untuk menjana ringkasan, kemudian simpan selepas perubahan.',
aiSearchAccountEnable: 'Dayakan carian AI fail', aiSearchAccountEnable: 'Dayakan carian AI fail',
aiSearchSaveAccount: 'Simpan konfigurasi akaun', aiSearchSaveAccount: 'Simpan konfigurasi akaun',
aiSearchSectionQuery: 'Carian', aiSearchSectionQuery: 'Carian',
@@ -4076,6 +4078,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 secara kelompok antara nod.',
appExchange:
'Naik taraf ke Edisi Komersial untuk memindahkan aplikasi yang dipasang ke nod sasaran dan mengesahkan kebergantungan sumbernya.',
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 +7146,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 hendak dipindahkan.',
imageExchangeTitle2: 'Edarkan imej',
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',
appExchangeContent1:
'Lihat aplikasi yang dipasang pada nod sumber dan pilih aplikasi yang hendak dipindahkan.',
appExchangeTitle2: 'Sahkan kebergantungan',
appExchangeContent2:
'Sebelum pemindahan, sahkan nod sasaran dan sumber yang diperlukan, seperti pangkalan data.',
appExchangeTitle3: 'Pindahkan aplikasi',
appExchangeContent3:
'Pindahkan sandaran aplikasi ke nod sasaran untuk pemulihan dan lihat hasilnya dalam log tugas.',
sslSyncTitle1: 'Pilih sijil',
sslSyncContent1: 'Lihat butiran sijil pada nod sumber dan pilih sijil yang hendak disegerakkan.',
sslSyncTitle2: 'Segerakkan 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',
phpExtensionsSyncContent1:
'Lihat nama templat dan senarai sambungan pada nod sumber, kemudian pilih templat yang hendak disegerakkan.',
phpExtensionsSyncTitle2: 'Segerakkan templat',
phpExtensionsSyncContent2:
'Segerakkan templat yang dipilih ke nod sasaran dengan mengecualikan nod sumber secara automatik.',
phpExtensionsSyncTitle3: 'Semak templat sedia ada',
phpExtensionsSyncContent3:
'Templat dengan nama dan kandungan yang sama akan dilangkau. Kandungan yang berbeza dilaporkan sebagai konflik tanpa ditulis ganti.',
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 +7701,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: 'Sambungan PHP',
phpExtensionsConfirm: 'Segerakkan {0} templat sambungan PHP ke {1} nod.',
phpExtensionsConflictHint:
'Templat yang sama akan dilangkau. Templat dengan nama yang sama tetapi kandungan berbeza dilaporkan sebagai konflik dan tidak akan ditulis ganti.',
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.',
+65 -14
View File
@@ -805,7 +805,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'A instalação existente não tem endereço ou porta HTTPS compatível. Verifique as configurações do aplicativo.', 'A instalação existente não tem endereço ou porta HTTPS compatível. Verifique as configurações do aplicativo.',
agent: 'Agente', agent: 'Agente',
account: 'Conta de modelo', account: 'Serviço de modelo',
batchOperation: 'Operação em lote', batchOperation: 'Operação em lote',
operationType: 'Tipo de operação', operationType: 'Tipo de operação',
batchAction: '{0} em lote', batchAction: '{0} em lote',
@@ -819,10 +819,10 @@ const message = {
skillSource: 'Origem da Skill', skillSource: 'Origem da Skill',
skillKeyword: 'Palavra-chave da Skill', skillKeyword: 'Palavra-chave da Skill',
clawHubSkillPlaceholder: 'Pesquise e selecione uma Skill primeiro', clawHubSkillPlaceholder: 'Pesquise e selecione uma Skill primeiro',
noAccountHint: 'Selecione uma conta de modelo existente ou adicione uma nova.', noAccountHint: 'Selecione um serviço de modelo existente ou adicione um novo.',
accountCount: '{0} contas de modelo', accountCount: '{0} serviços de modelo',
syncAgents: 'Sincronizar agentes vinculados', syncAgents: 'Sincronizar agentes vinculados',
syncAgentsHelper: 'Atualize o openclaw.json para agentes que usam esta conta de modelo', syncAgentsHelper: 'Atualize o openclaw.json para agentes que usam este serviço de modelo',
appVersion: 'Versão do app', appVersion: 'Versão do app',
webuiPort: 'Porta WebUI', webuiPort: 'Porta WebUI',
tokenOrAuth: 'Token/Autenticação', tokenOrAuth: 'Token/Autenticação',
@@ -864,7 +864,7 @@ const message = {
useModelDefault: 'Usar padrão do modelo', useModelDefault: 'Usar padrão do modelo',
reasoning: 'Modelo de raciocínio', reasoning: 'Modelo de raciocínio',
verified: 'Verificado', verified: 'Verificado',
verifySkipped: 'Sem verificação', verifySkipped: 'Não requer verificação',
skillsTab: 'Habilidades', skillsTab: 'Habilidades',
pluginsTab: 'Plugins', pluginsTab: 'Plugins',
pluginsInstalled: 'Instalados', pluginsInstalled: 'Instalados',
@@ -1220,9 +1220,9 @@ const message = {
notInstalled: 'Não instalado', notInstalled: 'Não instalado',
usage: 'Uso', usage: 'Uso',
accountPool: 'Pool de contas', accountPool: 'Pool de contas',
importModelAccount: 'Importar conta de modelo', importModelAccount: 'Importar serviço de modelo',
editModelAccount: 'Editar conta de modelo', editModelAccount: 'Editar serviço de modelo',
selectModelAccount: 'Selecionar uma conta de modelo existente', selectModelAccount: 'Selecionar um serviço de modelo existente',
upstreamApiAddress: 'Endereço da API upstream', upstreamApiAddress: 'Endereço da API upstream',
priority: 'Prioridade', priority: 'Prioridade',
healthStatus: 'Saúde', healthStatus: 'Saúde',
@@ -1279,8 +1279,8 @@ const message = {
waitingQueue: 'Fila de espera atual', waitingQueue: 'Fila de espera atual',
currentActiveUsers: 'Usuários ativos agora', currentActiveUsers: 'Usuários ativos agora',
activeStreamingRequests: 'Solicitações de streaming ativas', activeStreamingRequests: 'Solicitações de streaming ativas',
modelAccountConcurrency: 'Concorrência das contas de modelo', modelAccountConcurrency: 'Concorrência dos serviços de modelo',
accountAvailability: 'Disponibilidade das contas de modelo', accountAvailability: 'Disponibilidade dos serviços de modelo',
capacityFull: 'Capacidade esgotada', capacityFull: 'Capacidade esgotada',
groupConcurrency: 'Concorrência dos grupos de usuários', groupConcurrency: 'Concorrência dos grupos de usuários',
apiKeyConcurrency: 'Concorrência das API Keys', apiKeyConcurrency: 'Concorrência das API Keys',
@@ -1335,7 +1335,7 @@ const message = {
esLogCircuitUntil: 'Circuito ES até', esLogCircuitUntil: 'Circuito ES até',
serviceOperateConfirm: 'Confirmar {0} o serviço de gateway de IA?', serviceOperateConfirm: 'Confirmar {0} o serviço de gateway de IA?',
deleteTargetConfirm: 'Excluir {0} {1}?', deleteTargetConfirm: 'Excluir {0} {1}?',
deleteBackendTitle: 'Excluir conta de modelo', deleteBackendTitle: 'Excluir serviço de modelo',
userFallback: 'Usuário excluído (ID: {0})', userFallback: 'Usuário excluído (ID: {0})',
requestModel: 'Modelo solicitado', requestModel: 'Modelo solicitado',
upstreamModel: 'Modelo upstream', upstreamModel: 'Modelo upstream',
@@ -1348,7 +1348,7 @@ const message = {
usageTrend: 'Tendência de uso', usageTrend: 'Tendência de uso',
distributionBy: 'Distribuição por {0}', distributionBy: 'Distribuição por {0}',
unmatched: 'Sem correspondência', unmatched: 'Sem correspondência',
modelAccount: 'Conta de modelo', modelAccount: 'Serviço de modelo',
serviceProvider: 'Provedor', serviceProvider: 'Provedor',
tokenUsage: 'Uso de Token', tokenUsage: 'Uso de Token',
percent: 'Percentual', percent: 'Percentual',
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latência média do primeiro token', timeToFirstToken: 'Latência média do primeiro token',
timePerOutputToken: 'Latência média entre tokens', timePerOutputToken: 'Latência média entre tokens',
requestLatency: 'Latência média da solicitação', requestLatency: 'Latência média da solicitação',
noMetrics:
'O endpoint de métricas está acessível, mas ainda não há métricas compatíveis do vLLM. Algumas podem aparecer apenas após a primeira solicitação de inferência.',
unavailable: unavailable:
'Métricas indisponíveis. Verifique se a instância está em execução e se /metrics está acessível.', 'Métricas indisponíveis. Verifique se a instância está em execução e se /metrics está acessível.',
loadFailed: 'Falha ao carregar os dados. Tente novamente.', loadFailed: 'Falha ao carregar os dados. Tente novamente.',
@@ -2867,7 +2869,7 @@ const message = {
scrollSensitivity: 'Sensibilidade de rolagem', scrollSensitivity: 'Sensibilidade de rolagem',
aiAssistant: 'Assistente de IA', aiAssistant: 'Assistente de IA',
aiAccountHelper: aiAccountHelper:
'Use a conta de modelo selecionada para gerar e preencher comandos. Para modelos locais como Ollama e vLLM, use uma conta de modelo personalizada.', 'Use o serviço de modelo selecionado para gerar e preencher comandos. Para modelos locais como Ollama e vLLM, use um serviço de modelo personalizado.',
aiPrefix: 'Prefixo de disparo', aiPrefix: 'Prefixo de disparo',
aiPrefixHelper: aiPrefixHelper:
'Digite "prefixo + espaço" e pressione Enter para acionar a geração de comandos por IA, por exemplo: {0} me ajude a consultar as informações do disco.', 'Digite "prefixo + espaço" e pressione Enter para acionar a geração de comandos por IA, por exemplo: {0} me ajude a consultar as informações do disco.',
@@ -3119,7 +3121,7 @@ const message = {
aiSearchHint: aiSearchHint:
'Pesquise o conteúdo do arquivo linha por linha. Use os botões à direita da barra de busca e as "Condições avançadas" abaixo. Quando a conta de IA estiver ativada e salva, também será possível gerar um resumo em Markdown.', 'Pesquise o conteúdo do arquivo linha por linha. Use os botões à direita da barra de busca e as "Condições avançadas" abaixo. Quando a conta de IA estiver ativada e salva, também será possível gerar um resumo em Markdown.',
aiSearchAccountTitle: 'Conta de IA', aiSearchAccountTitle: 'Conta de IA',
aiSearchAccountIntro: 'Escolha uma conta de modelo para gerar resumos e clique em salvar após as alterações.', aiSearchAccountIntro: 'Escolha um serviço de modelo para gerar resumos e clique em salvar após as alterações.',
aiSearchAccountEnable: 'Ativar pesquisa de IA em arquivos', aiSearchAccountEnable: 'Ativar pesquisa de IA em arquivos',
aiSearchSaveAccount: 'Salvar configuração da conta', aiSearchSaveAccount: 'Salvar configuração da conta',
aiSearchSectionQuery: 'Pesquisa', aiSearchSectionQuery: 'Pesquisa',
@@ -4082,6 +4084,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 em lote entre nós.',
appExchange:
'Atualize para a edição comercial para migrar aplicativos instalados para nós de destino e confirmar suas dependências de recursos.',
sslSync:
'Atualize para a edição comercial para sincronizar certificados de um 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 +7181,40 @@ 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:
'Consulte as imagens de contêineres do nó de origem e selecione as que deseja transferir.',
imageExchangeTitle2: 'Distribuir imagens',
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 um aplicativo',
appExchangeContent1: 'Consulte os aplicativos instalados no nó de origem e selecione um para migrar.',
appExchangeTitle2: 'Confirmar dependências',
appExchangeContent2:
'Antes da migração, confirme os nós de destino e os recursos necessários, como bancos de dados.',
appExchangeTitle3: 'Migrar aplicativos',
appExchangeContent3:
'Transfira os backups dos aplicativos para os nós de destino para restauração e consulte os resultados nos logs de tarefas.',
sslSyncTitle1: 'Selecionar certificados',
sslSyncContent1:
'Consulte os detalhes dos certificados do nó de origem e selecione os que deseja sincronizar.',
sslSyncTitle2: 'Sincronizar 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:
'Revise os nós de destino e os certificados antes da execução e consulte os resultados nos logs de tarefas.',
phpExtensionsSyncTitle1: 'Selecionar um modelo',
phpExtensionsSyncContent1:
'Consulte os nomes dos modelos e as listas de extensões do nó de origem e selecione um modelo para sincronizar.',
phpExtensionsSyncTitle2: 'Sincronizar modelos',
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 são sinalizados como conflitos e não são sobrescritos.',
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 +7740,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: 'Extensões PHP',
phpExtensionsConfirm: 'Serão sincronizados {0} modelos de extensões PHP com {1} nós.',
phpExtensionsConflictHint:
'Modelos idênticos são ignorados. Modelos com o mesmo nome e conteúdo diferente são sinalizados como conflitos e não são sobrescritos.',
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.',
+63 -14
View File
@@ -802,7 +802,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'У существующей установки нет совместимого HTTPS-адреса или порта. Проверьте настройки приложения.', 'У существующей установки нет совместимого HTTPS-адреса или порта. Проверьте настройки приложения.',
agent: 'Агент', agent: 'Агент',
account: 'Аккаунт модели', account: 'Сервис модели',
batchOperation: 'Пакетная операция', batchOperation: 'Пакетная операция',
operationType: 'Тип операции', operationType: 'Тип операции',
batchAction: 'Пакетно {0}', batchAction: 'Пакетно {0}',
@@ -816,10 +816,10 @@ const message = {
skillSource: 'Источник Skill', skillSource: 'Источник Skill',
skillKeyword: 'Ключевое слово Skill', skillKeyword: 'Ключевое слово Skill',
clawHubSkillPlaceholder: 'Сначала найдите и выберите Skill', clawHubSkillPlaceholder: 'Сначала найдите и выберите Skill',
noAccountHint: 'Выберите существующий аккаунт модели или добавьте новый.', noAccountHint: 'Выберите существующий сервис модели или добавьте новый.',
accountCount: '{0} аккаунтов модели', accountCount: '{0} сервисов модели',
syncAgents: 'Синхронизировать связанные агенты', syncAgents: 'Синхронизировать связанные агенты',
syncAgentsHelper: 'Обновите openclaw.json для агентов, использующих этот аккаунт модели', syncAgentsHelper: 'Обновите openclaw.json для агентов, использующих этот сервис модели',
appVersion: 'Версия приложения', appVersion: 'Версия приложения',
webuiPort: 'Порт WebUI', webuiPort: 'Порт WebUI',
tokenOrAuth: 'Token/Аутентификация', tokenOrAuth: 'Token/Аутентификация',
@@ -859,7 +859,7 @@ const message = {
useModelDefault: 'Использовать значение модели', useModelDefault: 'Использовать значение модели',
reasoning: 'Модель рассуждений', reasoning: 'Модель рассуждений',
verified: 'Проверено', verified: 'Проверено',
verifySkipped: 'Без проверки', verifySkipped: 'Проверка не требуется',
skillsTab: 'Навыки', skillsTab: 'Навыки',
pluginsTab: 'Плагины', pluginsTab: 'Плагины',
pluginsInstalled: 'Установленные', pluginsInstalled: 'Установленные',
@@ -1216,9 +1216,9 @@ const message = {
notInstalled: 'Не установлен', notInstalled: 'Не установлен',
usage: 'Использование', usage: 'Использование',
accountPool: 'Пул аккаунтов', accountPool: 'Пул аккаунтов',
importModelAccount: 'Импортировать аккаунт модели', importModelAccount: 'Импортировать сервис модели',
editModelAccount: 'Редактировать аккаунт модели', editModelAccount: 'Редактировать сервис модели',
selectModelAccount: 'Выберите существующий аккаунт модели', selectModelAccount: 'Выберите существующий сервис модели',
upstreamApiAddress: 'Адрес API upstream', upstreamApiAddress: 'Адрес API upstream',
priority: 'Приоритет', priority: 'Приоритет',
healthStatus: 'Состояние', healthStatus: 'Состояние',
@@ -1274,8 +1274,8 @@ const message = {
waitingQueue: 'Текущая очередь ожидания', waitingQueue: 'Текущая очередь ожидания',
currentActiveUsers: 'Активные пользователи сейчас', currentActiveUsers: 'Активные пользователи сейчас',
activeStreamingRequests: 'Активные потоковые запросы', activeStreamingRequests: 'Активные потоковые запросы',
modelAccountConcurrency: 'Параллельность модельных аккаунтов', modelAccountConcurrency: 'Параллельность модельных сервисов',
accountAvailability: 'Доступность модельных аккаунтов', accountAvailability: 'Доступность модельных сервисов',
capacityFull: 'Лимит исчерпан', capacityFull: 'Лимит исчерпан',
groupConcurrency: 'Параллельность групп пользователей', groupConcurrency: 'Параллельность групп пользователей',
apiKeyConcurrency: 'Параллельность API Key', apiKeyConcurrency: 'Параллельность API Key',
@@ -1330,7 +1330,7 @@ const message = {
esLogCircuitUntil: 'ES разомкнута до', esLogCircuitUntil: 'ES разомкнута до',
serviceOperateConfirm: 'Подтвердить {0} сервис AI-шлюза?', serviceOperateConfirm: 'Подтвердить {0} сервис AI-шлюза?',
deleteTargetConfirm: 'Удалить {0} {1}?', deleteTargetConfirm: 'Удалить {0} {1}?',
deleteBackendTitle: 'Удалить аккаунт модели', deleteBackendTitle: 'Удалить сервис модели',
userFallback: 'Удаленный пользователь (ID: {0})', userFallback: 'Удаленный пользователь (ID: {0})',
requestModel: 'Запрошенная модель', requestModel: 'Запрошенная модель',
upstreamModel: 'Upstream-модель', upstreamModel: 'Upstream-модель',
@@ -1343,7 +1343,7 @@ const message = {
usageTrend: 'Тренд использования', usageTrend: 'Тренд использования',
distributionBy: 'Распределение по {0}', distributionBy: 'Распределение по {0}',
unmatched: 'Не сопоставлено', unmatched: 'Не сопоставлено',
modelAccount: 'Аккаунт модели', modelAccount: 'Сервис модели',
serviceProvider: 'Провайдер', serviceProvider: 'Провайдер',
tokenUsage: 'Использование Token', tokenUsage: 'Использование Token',
percent: 'Доля', percent: 'Доля',
@@ -1694,6 +1694,8 @@ const message = {
timeToFirstToken: 'Среднее время до первого токена', timeToFirstToken: 'Среднее время до первого токена',
timePerOutputToken: 'Средняя задержка между токенами', timePerOutputToken: 'Средняя задержка между токенами',
requestLatency: 'Средняя задержка запроса', requestLatency: 'Средняя задержка запроса',
noMetrics:
'Конечная точка метрик доступна, но поддерживаемых метрик vLLM пока нет. Некоторые метрики могут появиться только после первого запроса к модели.',
unavailable: 'Метрики недоступны. Проверьте, что экземпляр запущен и /metrics доступен.', unavailable: 'Метрики недоступны. Проверьте, что экземпляр запущен и /metrics доступен.',
loadFailed: 'Не удалось загрузить данные мониторинга. Повторите попытку.', loadFailed: 'Не удалось загрузить данные мониторинга. Повторите попытку.',
helper: 'Сбор, интервал и срок хранения настраиваются в параметрах мониторинга.', helper: 'Сбор, интервал и срок хранения настраиваются в параметрах мониторинга.',
@@ -2853,7 +2855,7 @@ const message = {
scrollSensitivity: 'Чувствительность прокрутки', scrollSensitivity: 'Чувствительность прокрутки',
aiAssistant: 'AI-помощник', aiAssistant: 'AI-помощник',
aiAccountHelper: aiAccountHelper:
'Используйте выбранный модельный аккаунт для генерации и подстановки команд. Для локальных моделей, таких как Ollama и vLLM, используйте пользовательский модельный аккаунт.', 'Используйте выбранный модельный сервис для генерации и подстановки команд. Для локальных моделей, таких как Ollama и vLLM, используйте пользовательский модельный сервис.',
aiPrefix: 'Префикс запуска', aiPrefix: 'Префикс запуска',
aiPrefixHelper: aiPrefixHelper:
'Введите "префикс + пробел" и нажмите Enter, чтобы запустить генерацию команд ИИ, например: {0} помоги мне показать информацию о диске.', 'Введите "префикс + пробел" и нажмите Enter, чтобы запустить генерацию команд ИИ, например: {0} помоги мне показать информацию о диске.',
@@ -3106,7 +3108,7 @@ const message = {
aiSearchHint: aiSearchHint:
'Ищет содержимое файлов построчно. Используйте кнопки справа от строки поиска и "Дополнительные условия" ниже. После включения и сохранения аккаунта ИИ можно также генерировать Markdown-сводку.', 'Ищет содержимое файлов построчно. Используйте кнопки справа от строки поиска и "Дополнительные условия" ниже. После включения и сохранения аккаунта ИИ можно также генерировать Markdown-сводку.',
aiSearchAccountTitle: 'Аккаунт ИИ', aiSearchAccountTitle: 'Аккаунт ИИ',
aiSearchAccountIntro: 'Выберите аккаунт большой модели для генерации сводок и сохраните изменения.', aiSearchAccountIntro: 'Выберите сервис большой модели для генерации сводок и сохраните изменения.',
aiSearchAccountEnable: 'Включить ИИ-поиск по файлам', aiSearchAccountEnable: 'Включить ИИ-поиск по файлам',
aiSearchSaveAccount: 'Сохранить настройки аккаунта', aiSearchSaveAccount: 'Сохранить настройки аккаунта',
aiSearchSectionQuery: 'Поиск', aiSearchSectionQuery: 'Поиск',
@@ -4058,6 +4060,13 @@ const message = {
'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.', 'Обновление до коммерческой редакции позволяет унифицированно обновлять версии приложений на нескольких узлах без необходимости ручного переключения узлов.',
nodeDashboard: nodeDashboard:
'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.', 'Обновление до коммерческой редакции позволяет централизованно управлять приложениями, веб-сайтами, базами данных и запланированными задачами на нескольких узлах.',
imageExchange: 'Обновите до Коммерческой версии, чтобы передавать образы контейнеров между узлами пакетами.',
appExchange:
'Обновите до Коммерческой версии, чтобы переносить установленные приложения на целевые узлы и проверять необходимые ресурсы.',
sslSync:
'Обновите до Коммерческой версии, чтобы синхронизировать сертификаты исходного узла с одним или несколькими целевыми узлами.',
phpExtensionsSync:
'Обновите до Коммерческой версии, чтобы синхронизировать шаблоны расширений PHP с одним или несколькими целевыми узлами.',
fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.', fileExchange: 'Обновите до Коммерческой версии, чтобы быстро передавать файлы между несколькими серверами.',
app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.', app: 'Обновите до коммерческой версии, чтобы просматривать информацию о сервисах, мониторинг аномалий и т.д. через мобильное приложение.',
cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.', cluster: 'Обновление до коммерческой версии позволяет управлять кластерами мастер-слейв MySQL/Postgres/Redis.',
@@ -7146,6 +7155,38 @@ 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 +7717,14 @@ const message = {
imageBatchConfirmPrefix: 'Будет передано {0} образов на {1} узлов, всего {2} задач.', imageBatchConfirmPrefix: 'Будет передано {0} образов на {1} узлов, всего {2} задач.',
ssl: 'Синхронизация сертификатов', ssl: 'Синхронизация сертификатов',
phpExtensions: 'Синхронизация шаблонов расширений PHP',
phpExtensionsTitle: 'Синхронизация шаблонов расширений',
phpExtensionsDesc:
'Выберите исходный узел, чтобы синхронизировать его шаблон расширений PHP с целевыми узлами.',
phpExtensionsList: 'Расширения PHP',
phpExtensionsConfirm: 'Будет синхронизировано шаблонов расширений PHP: {0}; целевых узлов: {1}.',
phpExtensionsConflictHint:
'Идентичные шаблоны пропускаются. Шаблоны с одинаковыми именами и разным содержимым отмечаются как конфликтующие и не перезаписываются.',
sslBatchDesc: sslBatchDesc:
'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.', 'После выбора исходного узла указанные сертификаты можно синхронизировать с текущей средой панели.',
sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.', sslBatchConfirmPrefix: 'Будет синхронизировано {0} сертификатов на {1} узлов, всего {2} задач.',
+62 -14
View File
@@ -808,7 +808,7 @@ const message = {
nativeAgentAccessUnavailable: nativeAgentAccessUnavailable:
'Mevcut kurulumda uyumlu HTTPS erişim adresi veya bağlantı noktası yok. Uygulama ayarlarını kontrol edin.', 'Mevcut kurulumda uyumlu HTTPS erişim adresi veya bağlantı noktası yok. Uygulama ayarlarını kontrol edin.',
agent: 'Ajan', agent: 'Ajan',
account: 'Model hesabı', account: 'Model hizmeti',
batchOperation: 'Toplu işlem', batchOperation: 'Toplu işlem',
operationType: 'İşlem türü', operationType: 'İşlem türü',
batchAction: 'Toplu {0}', batchAction: 'Toplu {0}',
@@ -822,10 +822,10 @@ const message = {
skillSource: 'Skill Kaynağı', skillSource: 'Skill Kaynağı',
skillKeyword: 'Skill Anahtar Kelimesi', skillKeyword: 'Skill Anahtar Kelimesi',
clawHubSkillPlaceholder: 'Önce bir Skill arayın ve seçin', clawHubSkillPlaceholder: 'Önce bir Skill arayın ve seçin',
noAccountHint: 'Mevcut bir model hesabını seçin veya yeni bir tane ekleyin.', noAccountHint: 'Mevcut bir model hizmetinı seçin veya yeni bir tane ekleyin.',
accountCount: '{0} model hesabı', accountCount: '{0} model hizmeti',
syncAgents: 'İlişkili ajanları senkronize et', syncAgents: 'İlişkili ajanları senkronize et',
syncAgentsHelper: 'Bu model hesabını kullanan ajanlar için openclaw.json dosyasını güncelleyin', syncAgentsHelper: 'Bu model hizmetinı kullanan ajanlar için openclaw.json dosyasını güncelleyin',
appVersion: 'Uygulama sürümü', appVersion: 'Uygulama sürümü',
webuiPort: 'WebUI portu', webuiPort: 'WebUI portu',
tokenOrAuth: 'Token/Kimlik Doğrulama', tokenOrAuth: 'Token/Kimlik Doğrulama',
@@ -866,7 +866,7 @@ const message = {
useModelDefault: 'Model varsayılanını kullan', useModelDefault: 'Model varsayılanını kullan',
reasoning: 'Akıl yürütme modeli', reasoning: 'Akıl yürütme modeli',
verified: 'Doğrulandı', verified: 'Doğrulandı',
verifySkipped: 'Doğrulama yok', verifySkipped: 'Doğrulama gerekmiyor',
skillsTab: 'Yetenekler', skillsTab: 'Yetenekler',
pluginsTab: 'Eklentiler', pluginsTab: 'Eklentiler',
pluginsInstalled: 'Yüklü', pluginsInstalled: 'Yüklü',
@@ -1224,9 +1224,9 @@ const message = {
notInstalled: 'Kurulu değil', notInstalled: 'Kurulu değil',
usage: 'Kullanım', usage: 'Kullanım',
accountPool: 'Hesap Havuzu', accountPool: 'Hesap Havuzu',
importModelAccount: 'Model hesabını içe aktar', importModelAccount: 'Model hizmetinı içe aktar',
editModelAccount: 'Model hesabını düzenle', editModelAccount: 'Model hizmetinı düzenle',
selectModelAccount: 'Mevcut bir model hesabı seçin', selectModelAccount: 'Mevcut bir model hizmeti seçin',
upstreamApiAddress: 'Yukarı Akış API Adresi', upstreamApiAddress: 'Yukarı Akış API Adresi',
priority: 'Öncelik', priority: 'Öncelik',
healthStatus: 'Sağlık durumu', healthStatus: 'Sağlık durumu',
@@ -1282,8 +1282,8 @@ const message = {
waitingQueue: 'Mevcut bekleme kuyruğu', waitingQueue: 'Mevcut bekleme kuyruğu',
currentActiveUsers: 'Şu anda aktif kullanıcılar', currentActiveUsers: 'Şu anda aktif kullanıcılar',
activeStreamingRequests: 'Aktif akış istekleri', activeStreamingRequests: 'Aktif akış istekleri',
modelAccountConcurrency: 'Model hesabı eşzamanlılığı', modelAccountConcurrency: 'Model hizmeti eşzamanlılığı',
accountAvailability: 'Model hesabı kullanılabilirliği', accountAvailability: 'Model hizmeti kullanılabilirliği',
capacityFull: 'Kapasite dolu', capacityFull: 'Kapasite dolu',
groupConcurrency: 'Kullanıcı grubu eşzamanlılığı', groupConcurrency: 'Kullanıcı grubu eşzamanlılığı',
apiKeyConcurrency: 'API Key eşzamanlılığı', apiKeyConcurrency: 'API Key eşzamanlılığı',
@@ -1337,7 +1337,7 @@ const message = {
esLogCircuitUntil: 'ES devresi şu zamana kadar', esLogCircuitUntil: 'ES devresi şu zamana kadar',
serviceOperateConfirm: 'AI Ağ Geçidi servisini {0} onaylıyor musunuz?', serviceOperateConfirm: 'AI Ağ Geçidi servisini {0} onaylıyor musunuz?',
deleteTargetConfirm: '{0} {1} silinsin mi?', deleteTargetConfirm: '{0} {1} silinsin mi?',
deleteBackendTitle: 'Model hesabını sil', deleteBackendTitle: 'Model hizmetinı sil',
userFallback: 'Silinen kullanıcı (ID: {0})', userFallback: 'Silinen kullanıcı (ID: {0})',
requestModel: 'İstek modeli', requestModel: 'İstek modeli',
upstreamModel: 'Upstream model', upstreamModel: 'Upstream model',
@@ -1350,7 +1350,7 @@ const message = {
usageTrend: 'Kullanım eğilimi', usageTrend: 'Kullanım eğilimi',
distributionBy: '{0} dağılımı', distributionBy: '{0} dağılımı',
unmatched: 'Eşleşmedi', unmatched: 'Eşleşmedi',
modelAccount: 'Model hesabı', modelAccount: 'Model hizmeti',
serviceProvider: 'Sağlayıcı', serviceProvider: 'Sağlayıcı',
tokenUsage: 'Token kullanımı', tokenUsage: 'Token kullanımı',
percent: 'Yüzde', percent: 'Yüzde',
@@ -1698,6 +1698,8 @@ const message = {
timeToFirstToken: 'Ortalama ilk token gecikmesi', timeToFirstToken: 'Ortalama ilk token gecikmesi',
timePerOutputToken: 'Ortalama token arası gecikme', timePerOutputToken: 'Ortalama token arası gecikme',
requestLatency: 'Ortalama istek gecikmesi', requestLatency: 'Ortalama istek gecikmesi',
noMetrics:
'Metrik uç noktasına erişilebiliyor, ancak henüz desteklenen vLLM metrikleri yok. Bazı metrikler yalnızca ilk çıkarım isteğinden sonra görünebilir.',
unavailable: unavailable:
'Metrikler kullanılamıyor. Örneğin çalıştığını ve /metrics yolunun erişilebilir olduğunu kontrol edin.', 'Metrikler kullanılamıyor. Örneğin çalıştığını ve /metrics yolunun erişilebilir olduğunu kontrol edin.',
loadFailed: 'İzleme verileri yüklenemedi. Tekrar deneyin.', loadFailed: 'İzleme verileri yüklenemedi. Tekrar deneyin.',
@@ -2855,7 +2857,7 @@ const message = {
scrollSensitivity: 'Kaydırma Hassasiyeti', scrollSensitivity: 'Kaydırma Hassasiyeti',
aiAssistant: 'AI Asistani', aiAssistant: 'AI Asistani',
aiAccountHelper: aiAccountHelper:
'Komut üretmek ve doldurmak için seçili model hesabını kullanın. Ollama ve vLLM gibi yerel modeller için özel model hesabı kullanın.', 'Komut üretmek ve doldurmak için seçili model hizmetinı kullanın. Ollama ve vLLM gibi yerel modeller için özel model hizmeti kullanın.',
aiPrefix: 'Tetikleme öneki', aiPrefix: 'Tetikleme öneki',
aiPrefixHelper: aiPrefixHelper:
'"Önek + boşluk" girip Enter tuşuna bastığınızda AI komut üretimi tetiklenir; örneğin: {0} disk bilgisini sorgulamama yardım et.', '"Önek + boşluk" girip Enter tuşuna bastığınızda AI komut üretimi tetiklenir; örneğin: {0} disk bilgisini sorgulamama yardım et.',
@@ -3111,7 +3113,7 @@ const message = {
aiSearchHint: aiSearchHint:
'Dosya içeriğini satır satır arar. Arama satırının sağındaki düğmeleri ve alttaki "Gelişmiş koşullar"ı kullanın. AI hesabı etkinleştirilip kaydedildiğinde Markdown özeti de oluşturulabilir.', 'Dosya içeriğini satır satır arar. Arama satırının sağındaki düğmeleri ve alttaki "Gelişmiş koşullar"ı kullanın. AI hesabı etkinleştirilip kaydedildiğinde Markdown özeti de oluşturulabilir.',
aiSearchAccountTitle: 'AI hesabı', aiSearchAccountTitle: 'AI hesabı',
aiSearchAccountIntro: 'Özet için kullanılacak model hesabını seçin, ardından kaydedin.', aiSearchAccountIntro: 'Özet için kullanılacak model hizmetinı seçin, ardından kaydedin.',
aiSearchAccountEnable: 'Dosya AI aramasını etkinleştir', aiSearchAccountEnable: 'Dosya AI aramasını etkinleştir',
aiSearchSaveAccount: 'Hesap yapılandırmasını kaydet', aiSearchSaveAccount: 'Hesap yapılandırmasını kaydet',
aiSearchSectionQuery: 'Arama', aiSearchSectionQuery: 'Arama',
@@ -4071,6 +4073,14 @@ 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:
'Ticari sürüme yükselterek konteyner imajlarını düğümler arasında toplu olarak aktarabilirsiniz.',
appExchange:
'Ticari sürüme yükselterek yüklü uygulamaları hedef düğümlere taşıyabilir ve gerekli kaynak bağımlılıklarını doğrulayabilirsiniz.',
sslSync:
'Ticari sürüme yükselterek kaynak düğümdeki sertifikaları bir veya daha fazla hedef düğümle eşitleyebilirsiniz.',
phpExtensionsSync:
'Ticari sürüme yükselterek PHP uzantı şablonlarını bir veya daha fazla hedef düğümle eşitleyebilirsiniz.',
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 +7159,37 @@ 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ı inceleyin ve aktarılacak imajları seçin.',
imageExchangeTitle2: 'İmajları 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: 'Bir uygulama seçin',
appExchangeContent1: 'Kaynak düğümde yüklü uygulamaları inceleyin ve taşınacak uygulamayı seçin.',
appExchangeTitle2: 'Bağımlılıkları doğrulayın',
appExchangeContent2:
'Taşıma işleminden önce hedef düğümleri ve veritabanları gibi gerekli kaynakları doğrulayın.',
appExchangeTitle3: 'Uygulamaları taşıyın',
appExchangeContent3:
'Uygulama yedeklerini geri yüklemek için hedef düğümlere aktarın ve sonuçları görev günlüklerinde görüntüleyin.',
sslSyncTitle1: 'Sertifikaları seçin',
sslSyncContent1: 'Kaynak düğümdeki sertifika bilgilerini inceleyin ve eşitlenecek sertifikaları seçin.',
sslSyncTitle2: 'Düğümler arasında eşitleyin',
sslSyncContent2:
'Kaynak düğüm otomatik olarak hariç tutularak seçilen sertifikaları hedef düğümlerle eşitleyin.',
sslSyncTitle3: 'Eşitleme görevlerini onaylayın',
sslSyncContent3:
'İşlemden önce hedef düğümleri ve sertifikaları gözden geçirin, ardından sonuçları görev günlüklerinde görüntüleyin.',
phpExtensionsSyncTitle1: 'Bir şablon seçin',
phpExtensionsSyncContent1:
'Kaynak düğümdeki şablon adlarını ve uzantı listelerini inceleyin ve eşitlenecek şablonu seçin.',
phpExtensionsSyncTitle2: 'Şablonları eşitleyin',
phpExtensionsSyncContent2:
'Kaynak düğüm otomatik olarak hariç tutularak seçilen şablonu hedef düğümlerle eşitleyin.',
phpExtensionsSyncTitle3: 'Mevcut şablonları kontrol edin',
phpExtensionsSyncContent3:
'Adı ve içeriği aynı olan şablonlar atlanır. İçerik farklıysa üzerine yazılmadan çakışma bildirilir.',
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 +7714,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 Uzantı Şablonu Eşitleme',
phpExtensionsTitle: 'Uzantı Şablonu Eşitleme',
phpExtensionsDesc: 'PHP uzantı şablonunu hedef düğümlerle eşitlemek için bir kaynak düğüm seçin.',
phpExtensionsList: 'PHP uzantıları',
phpExtensionsConfirm: '{0} PHP uzantı şablonu {1} düğümle eşitlenecek.',
phpExtensionsConflictHint:
'Aynı şablonlar atlanır. Adı aynı ancak içeriği farklı olan şablonlar çakışma olarak bildirilir ve üzerlerine 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.',
+49 -14
View File
@@ -766,7 +766,7 @@ const message = {
initialCredentials: '初始登入資訊;若已在應用程式內修改,以目前密碼為準。', initialCredentials: '初始登入資訊;若已在應用程式內修改,以目前密碼為準。',
nativeAgentAccessUnavailable: '現有安裝缺少相容的 HTTPS 存取位址或連接埠,請檢查應用程式設定。', nativeAgentAccessUnavailable: '現有安裝缺少相容的 HTTPS 存取位址或連接埠,請檢查應用程式設定。',
agent: 'Agent', agent: 'Agent',
account: '模型帳號', account: '模型服務',
batchOperation: '批次操作', batchOperation: '批次操作',
operationType: '操作類型', operationType: '操作類型',
batchAction: '批次{0}', batchAction: '批次{0}',
@@ -780,10 +780,10 @@ const message = {
skillSource: 'Skill 來源', skillSource: 'Skill 來源',
skillKeyword: 'Skill 關鍵字', skillKeyword: 'Skill 關鍵字',
clawHubSkillPlaceholder: '請先搜尋並選擇 Skill', clawHubSkillPlaceholder: '請先搜尋並選擇 Skill',
noAccountHint: '選擇現有模型帳號,或新增帳號。', noAccountHint: '選擇現有模型服務,或新增帳號。',
accountCount: '{0} 個模型帳號', accountCount: '{0} 個模型服務',
syncAgents: '同步相關 Agent', syncAgents: '同步相關 Agent',
syncAgentsHelper: '更新所有使用此模型帳號的 Agent 設定檔 openclaw.json', syncAgentsHelper: '更新所有使用此模型服務的 Agent 設定檔 openclaw.json',
appVersion: '應用程式版本', appVersion: '應用程式版本',
webuiPort: 'WebUI 埠', webuiPort: 'WebUI 埠',
tokenOrAuth: 'Token/Auth', tokenOrAuth: 'Token/Auth',
@@ -820,7 +820,7 @@ const message = {
useModelDefault: '使用模型預設值', useModelDefault: '使用模型預設值',
reasoning: '推理模型', reasoning: '推理模型',
verified: '驗證成功', verified: '驗證成功',
verifySkipped: '略過驗證', verifySkipped: '無需驗證',
skillsTab: 'Skill', skillsTab: 'Skill',
pluginsTab: '外掛', pluginsTab: '外掛',
pluginsInstalled: '已安裝', pluginsInstalled: '已安裝',
@@ -1143,9 +1143,9 @@ const message = {
notInstalled: '未安裝', notInstalled: '未安裝',
usage: '用量統計', usage: '用量統計',
accountPool: '帳號池', accountPool: '帳號池',
importModelAccount: '匯入模型帳號', importModelAccount: '匯入模型服務',
editModelAccount: '編輯模型帳號', editModelAccount: '編輯模型服務',
selectModelAccount: '選擇已有模型帳號', selectModelAccount: '選擇已有模型服務',
upstreamApiAddress: '上游 API 地址', upstreamApiAddress: '上游 API 地址',
priority: '優先級', priority: '優先級',
healthStatus: '健康狀態', healthStatus: '健康狀態',
@@ -1199,8 +1199,8 @@ const message = {
waitingQueue: '目前等待佇列', waitingQueue: '目前等待佇列',
currentActiveUsers: '目前活躍使用者', currentActiveUsers: '目前活躍使用者',
activeStreamingRequests: '目前串流請求', activeStreamingRequests: '目前串流請求',
modelAccountConcurrency: '模型帳號併發', modelAccountConcurrency: '模型服務併發',
accountAvailability: '模型帳號可用性', accountAvailability: '模型服務可用性',
capacityFull: '已滿載', capacityFull: '已滿載',
groupConcurrency: '使用者群組併發', groupConcurrency: '使用者群組併發',
apiKeyConcurrency: 'API Key 併發', apiKeyConcurrency: 'API Key 併發',
@@ -1252,7 +1252,7 @@ const message = {
esLogCircuitUntil: 'ES 熔斷結束時間', esLogCircuitUntil: 'ES 熔斷結束時間',
serviceOperateConfirm: '確認{0} AI 閘道服務?', serviceOperateConfirm: '確認{0} AI 閘道服務?',
deleteTargetConfirm: '確認刪除{0} {1}?', deleteTargetConfirm: '確認刪除{0} {1}?',
deleteBackendTitle: '刪除模型帳號', deleteBackendTitle: '刪除模型服務',
userFallback: '已刪除使用者 (ID: {0})', userFallback: '已刪除使用者 (ID: {0})',
requestModel: '請求模型', requestModel: '請求模型',
upstreamModel: '上游模型', upstreamModel: '上游模型',
@@ -1265,7 +1265,7 @@ const message = {
usageTrend: '使用趨勢', usageTrend: '使用趨勢',
distributionBy: '按{0}分佈', distributionBy: '按{0}分佈',
unmatched: '未匹配', unmatched: '未匹配',
modelAccount: '模型帳號', modelAccount: '模型服務',
serviceProvider: '服務商', serviceProvider: '服務商',
tokenUsage: 'Token 用量', tokenUsage: 'Token 用量',
percent: '佔比', percent: '佔比',
@@ -1596,6 +1596,7 @@ const message = {
timeToFirstToken: '平均首 Token 延遲', timeToFirstToken: '平均首 Token 延遲',
timePerOutputToken: '平均 Token 間延遲', timePerOutputToken: '平均 Token 間延遲',
requestLatency: '平均請求延遲', requestLatency: '平均請求延遲',
noMetrics: '指標介面可存取,但暫無可用的 vLLM 指標;部分指標可能在首次推論請求後才會產生。',
unavailable: '無法採集指標,請確認實例已啟動且 /metrics 可存取。', unavailable: '無法採集指標,請確認實例已啟動且 /metrics 可存取。',
loadFailed: '監控資料載入失敗,請重試。', loadFailed: '監控資料載入失敗,請重試。',
helper: '採集開關、頻率和儲存天數統一在監控設定中調整。', helper: '採集開關、頻率和儲存天數統一在監控設定中調整。',
@@ -2660,7 +2661,7 @@ const message = {
scrollback: '滾動行數', scrollback: '滾動行數',
scrollSensitivity: '滾動速度', scrollSensitivity: '滾動速度',
aiAssistant: 'AI 助手', aiAssistant: 'AI 助手',
aiAccountHelper: '使用所選模型帳號生成並回填命令。Ollama、vLLM 本地模型請使用自訂模型帳號。', aiAccountHelper: '使用所選模型服務生成並回填命令。Ollama、vLLM 本地模型請使用自訂模型服務。',
aiPrefix: '觸發前綴', aiPrefix: '觸發前綴',
aiPrefixHelper: '輸入「前綴 + 空格」並按下 Enter 時,將觸發 AI 指令生成,例如:{0} 幫我查詢磁碟資訊。', aiPrefixHelper: '輸入「前綴 + 空格」並按下 Enter 時,將觸發 AI 指令生成,例如:{0} 幫我查詢磁碟資訊。',
aiRiskCommands: '風險命令攔截', aiRiskCommands: '風險命令攔截',
@@ -2893,7 +2894,7 @@ const message = {
aiSearchHint: aiSearchHint:
'按檔案內容逐行比對;比對方式見搜尋列右側按鈕與下方「進階條件」。啟用並儲存 AI 帳號後,還可產生 Markdown 摘要。', '按檔案內容逐行比對;比對方式見搜尋列右側按鈕與下方「進階條件」。啟用並儲存 AI 帳號後,還可產生 Markdown 摘要。',
aiSearchAccountTitle: 'AI 帳號', aiSearchAccountTitle: 'AI 帳號',
aiSearchAccountIntro: '選擇用於產生摘要的大模型帳號,修改後請點選儲存。', aiSearchAccountIntro: '選擇用於產生摘要的大模型服務,修改後請點選儲存。',
aiSearchAccountEnable: '啟用檔案 AI 搜尋', aiSearchAccountEnable: '啟用檔案 AI 搜尋',
aiSearchSaveAccount: '儲存帳號設定', aiSearchSaveAccount: '儲存帳號設定',
aiSearchSectionQuery: '搜尋', aiSearchSectionQuery: '搜尋',
@@ -3747,6 +3748,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 +6544,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 +7051,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} 個任務。',
+49 -14
View File
@@ -783,7 +783,7 @@ const message = {
initialCredentials: '初始登录信息;若已在应用内修改,以当前密码为准。', initialCredentials: '初始登录信息;若已在应用内修改,以当前密码为准。',
nativeAgentAccessUnavailable: '现有安装缺少兼容的 HTTPS 访问地址或端口,请检查应用设置。', nativeAgentAccessUnavailable: '现有安装缺少兼容的 HTTPS 访问地址或端口,请检查应用设置。',
agent: '智能体', agent: '智能体',
account: '模型账号', account: '模型服务',
batchOperation: '批量操作', batchOperation: '批量操作',
operationType: '操作类型', operationType: '操作类型',
batchAction: '批量{0}', batchAction: '批量{0}',
@@ -797,10 +797,10 @@ const message = {
skillSource: 'Skill 来源', skillSource: 'Skill 来源',
skillKeyword: 'Skill 关键词', skillKeyword: 'Skill 关键词',
clawHubSkillPlaceholder: '请先搜索并选择 Skill', clawHubSkillPlaceholder: '请先搜索并选择 Skill',
noAccountHint: '选择已有模型账号,或直接创建', noAccountHint: '选择已有模型服务,或直接创建',
accountCount: '模型账号 {0} 个', accountCount: '模型服务 {0} 个',
syncAgents: '同步关联智能体', syncAgents: '同步关联智能体',
syncAgentsHelper: '更新使用该模型账号的智能体 openclaw.json', syncAgentsHelper: '更新使用该模型服务的智能体 openclaw.json',
appVersion: '应用版本', appVersion: '应用版本',
webuiPort: 'WebUI 端口', webuiPort: 'WebUI 端口',
tokenOrAuth: 'Token/Auth', tokenOrAuth: 'Token/Auth',
@@ -837,7 +837,7 @@ const message = {
useModelDefault: '使用模型默认值', useModelDefault: '使用模型默认值',
reasoning: '推理模型', reasoning: '推理模型',
verified: '验证成功', verified: '验证成功',
verifySkipped: '不验证', verifySkipped: '无需验证',
skillsTab: '技能', skillsTab: '技能',
pluginsTab: '插件', pluginsTab: '插件',
pluginsInstalled: '已安装', pluginsInstalled: '已安装',
@@ -1156,9 +1156,9 @@ const message = {
notInstalled: '未安装', notInstalled: '未安装',
usage: '用量统计', usage: '用量统计',
accountPool: '账号池', accountPool: '账号池',
importModelAccount: '导入模型账号', importModelAccount: '导入模型服务',
editModelAccount: '编辑模型账号', editModelAccount: '编辑模型服务',
selectModelAccount: '选择已有模型账号', selectModelAccount: '选择已有模型服务',
upstreamApiAddress: '上游 API 地址', upstreamApiAddress: '上游 API 地址',
priority: '优先级', priority: '优先级',
healthStatus: '健康状态', healthStatus: '健康状态',
@@ -1213,8 +1213,8 @@ const message = {
waitingQueue: '当前等待队列', waitingQueue: '当前等待队列',
currentActiveUsers: '当前活跃用户', currentActiveUsers: '当前活跃用户',
activeStreamingRequests: '当前流式请求', activeStreamingRequests: '当前流式请求',
modelAccountConcurrency: '模型账号并发', modelAccountConcurrency: '模型服务并发',
accountAvailability: '模型账号可用性', accountAvailability: '模型服务可用性',
capacityFull: '满载', capacityFull: '满载',
groupConcurrency: '用户组并发', groupConcurrency: '用户组并发',
apiKeyConcurrency: 'API Key 并发', apiKeyConcurrency: 'API Key 并发',
@@ -1266,7 +1266,7 @@ const message = {
esLogCircuitUntil: 'ES 熔断结束时间', esLogCircuitUntil: 'ES 熔断结束时间',
serviceOperateConfirm: '确认{0} AI 网关服务?', serviceOperateConfirm: '确认{0} AI 网关服务?',
deleteTargetConfirm: '确认删除{0} {1}?', deleteTargetConfirm: '确认删除{0} {1}?',
deleteBackendTitle: '删除模型账号', deleteBackendTitle: '删除模型服务',
userFallback: '已删除用户 (ID: {0})', userFallback: '已删除用户 (ID: {0})',
requestModel: '请求模型', requestModel: '请求模型',
upstreamModel: '上游模型', upstreamModel: '上游模型',
@@ -1279,7 +1279,7 @@ const message = {
usageTrend: '使用趋势', usageTrend: '使用趋势',
distributionBy: '按{0}分布', distributionBy: '按{0}分布',
unmatched: '未匹配', unmatched: '未匹配',
modelAccount: '模型账号', modelAccount: '模型服务',
serviceProvider: '服务商', serviceProvider: '服务商',
tokenUsage: 'Token 用量', tokenUsage: 'Token 用量',
percent: '占比', percent: '占比',
@@ -1609,6 +1609,7 @@ const message = {
timeToFirstToken: '平均首 Token 延迟', timeToFirstToken: '平均首 Token 延迟',
timePerOutputToken: '平均 Token 间延迟', timePerOutputToken: '平均 Token 间延迟',
requestLatency: '平均请求延迟', requestLatency: '平均请求延迟',
noMetrics: '指标接口可访问,但暂无可用的 vLLM 指标;部分指标可能在首次推理请求后才会产生。',
unavailable: '无法采集指标,请确认实例已启动且 /metrics 可访问。', unavailable: '无法采集指标,请确认实例已启动且 /metrics 可访问。',
loadFailed: '监控数据加载失败,请重试。', loadFailed: '监控数据加载失败,请重试。',
helper: '采集开关、频率和保存天数在监控设置的 vLLM 监控中独立调整。', helper: '采集开关、频率和保存天数在监控设置的 vLLM 监控中独立调整。',
@@ -2685,7 +2686,7 @@ const message = {
scrollback: '滚动行数', scrollback: '滚动行数',
scrollSensitivity: '滚动速度', scrollSensitivity: '滚动速度',
aiAssistant: 'AI 助手', aiAssistant: 'AI 助手',
aiAccountHelper: '使用所选模型账号生成并回填命令。Ollama、vLLM 本地模型请用自定义模型账号。', aiAccountHelper: '使用所选模型服务生成并回填命令。Ollama、vLLM 本地模型请用自定义模型服务。',
aiPrefix: '触发前缀', aiPrefix: '触发前缀',
aiPrefixHelper: '输入“前缀 + 空格”并回车时,将触发 AI 命令生成,例如:{0} 帮我查询磁盘信息。', aiPrefixHelper: '输入“前缀 + 空格”并回车时,将触发 AI 命令生成,例如:{0} 帮我查询磁盘信息。',
aiRiskCommands: '风险命令拦截', aiRiskCommands: '风险命令拦截',
@@ -2903,7 +2904,7 @@ const message = {
aiSearchHint: aiSearchHint:
'按文件内容逐行匹配;匹配方式见搜索框右侧按钮与下方「高级条件」。启用并保存 AI 账号后,还可生成 Markdown 总结。', '按文件内容逐行匹配;匹配方式见搜索框右侧按钮与下方「高级条件」。启用并保存 AI 账号后,还可生成 Markdown 总结。',
aiSearchAccountTitle: 'AI 账号', aiSearchAccountTitle: 'AI 账号',
aiSearchAccountIntro: '选择用于生成总结的大模型账号,修改后请点击保存。', aiSearchAccountIntro: '选择用于生成总结的大模型服务,修改后请点击保存。',
aiSearchAccountEnable: '启用文件 AI 搜索', aiSearchAccountEnable: '启用文件 AI 搜索',
aiSearchSaveAccount: '保存账号配置', aiSearchSaveAccount: '保存账号配置',
aiSearchSectionQuery: '搜索', aiSearchSectionQuery: '搜索',
@@ -3777,6 +3778,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 +5499,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 +7108,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} 个任务。',
+2 -2
View File
@@ -46,12 +46,12 @@ const aiRouter = {
}, },
{ {
path: '/ai/model/account', path: '/ai/model/account',
hidden: true,
name: 'ModelServices', name: 'ModelServices',
component: () => import('@/views/ai/model/index.vue'), component: () => import('@/views/ai/model/index.vue'),
meta: { meta: {
icon: 'p-moxing-menu',
title: 'aiTools.model.services', title: 'aiTools.model.services',
activeMenu: '/ai/model', activeMenu: '/ai/model/account',
permission: 'ai_model_view', permission: 'ai_model_view',
}, },
}, },
@@ -1,3 +1,5 @@
import menuLogo from '../assets/images/1panel-menu-logo.svg?raw';
export interface AgentProviderLogo { export interface AgentProviderLogo {
src?: string; src?: string;
mark: string; mark: string;
@@ -52,6 +54,12 @@ const providerLogos: Record<string, AgentProviderLogo> = {
borderColor: '#dcdfe6', borderColor: '#dcdfe6',
source: 'https://vllm.ai/vLLM-Logo.svg', source: 'https://vllm.ai/vLLM-Logo.svg',
}, },
'1panel-ai-gateway': {
src: `data:image/svg+xml,${encodeURIComponent(menuLogo.replace('currentColor', '#005eeb'))}`,
mark: '1P',
background: '#ffffff',
color: '#005eeb',
},
deepseek: { deepseek: {
src: asset('deepseek.png'), src: asset('deepseek.png'),
mark: 'DS', mark: 'DS',
@@ -127,7 +127,9 @@
<el-form-item> <el-form-item>
<el-checkbox v-model="form.rememberApiKey">{{ $t('terminal.rememberPassword') }}</el-checkbox> <el-checkbox v-model="form.rememberApiKey">{{ $t('terminal.rememberPassword') }}</el-checkbox>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item
v-if="isImageAPIType || isEmbeddingAPIType || !isAgentAccountVerificationSkipped(form.provider)"
>
<el-switch v-model="form.validateAvailability" /> <el-switch v-model="form.validateAvailability" />
<el-text class="validate-availability-label">{{ $t('aiTools.agents.validateAvailability') }}</el-text> <el-text class="validate-availability-label">{{ $t('aiTools.agents.validateAvailability') }}</el-text>
<span class="input-help"> <span class="input-help">
+9 -6
View File
@@ -342,11 +342,14 @@ const isCurrentPage = computed(() => route.path === pagePath);
const { isProductPro, isIntl, currentNode, isAdminOrNodeAdmin } = useGlobalStore(); const { isProductPro, isIntl, currentNode, isAdminOrNodeAdmin } = useGlobalStore();
const isFiles = pagePath === '/ai/model/files'; const isFiles = pagePath === '/ai/model/files';
const isLocal = pagePath === '/ai/model/local'; const isLocal = pagePath === '/ai/model/local';
const tabs = computed(() => [ const tabs = computed(() =>
{ label: i18n.global.t('aiTools.model.files'), path: '/ai/model/files' }, isFiles || isLocal
{ label: i18n.global.t('aiTools.model.deployments'), path: '/ai/model/local' }, ? [
{ label: i18n.global.t('aiTools.model.services'), path: '/ai/model/account' }, { label: i18n.global.t('aiTools.model.files'), path: '/ai/model/files' },
]); { label: i18n.global.t('aiTools.model.deployments'), path: '/ai/model/local' },
]
: [{ label: i18n.global.t('aiTools.model.services'), path: '/ai/model/account' }],
);
const downloaderView = defineAsyncComponent(() => import('@/views/model-downloader/index.vue')); const downloaderView = defineAsyncComponent(() => import('@/views/model-downloader/index.vue'));
const createRef = ref(); const createRef = ref();
const manageRef = ref(); const manageRef = ref();
@@ -504,7 +507,7 @@ const search = async () => {
const connectionStatus = (row: AI.AgentAccountItem) => { const connectionStatus = (row: AI.AgentAccountItem) => {
if (isAgentAccountVerificationSkipped(row.provider)) { if (isAgentAccountVerificationSkipped(row.provider)) {
return { type: 'info' as const, label: i18n.global.t('aiTools.agents.verifySkipped') }; return { type: 'success' as const, label: i18n.global.t('aiTools.agents.verifySkipped') };
} }
return { return {
type: row.verified ? ('success' as const) : ('warning' as const), type: row.verified ? ('success' as const) : ('warning' as const),
@@ -670,7 +670,7 @@ const fileAiVerificationLabel = (item: { provider?: string; verified?: boolean }
const fileAiVerificationTagType = (item: { provider?: string; verified?: boolean }) => { const fileAiVerificationTagType = (item: { provider?: string; verified?: boolean }) => {
if (isAgentAccountVerificationSkipped(item.provider)) { if (isAgentAccountVerificationSkipped(item.provider)) {
return 'info'; return 'success';
} }
return item.verified ? 'success' : 'warning'; return item.verified ? 'success' : 'warning';
}; };
@@ -135,7 +135,7 @@ const verificationLabel = (item: AgentAccountOption) => {
const verificationTagType = (item: AgentAccountOption) => { const verificationTagType = (item: AgentAccountOption) => {
if (isAgentAccountVerificationSkipped(item.provider)) { if (isAgentAccountVerificationSkipped(item.provider)) {
return 'info'; return 'success';
} }
return item.verified ? 'success' : 'warning'; return item.verified ? 'success' : 'warning';
}; };