Ver Fonte

Merge pull request #364 from 0xJacky/enhance/chatbot

Jacky há 1 ano atrás
pai
commit
1e9c537bdb
40 ficheiros alterados com 1128 adições e 900 exclusões
  1. 0 2
      .editorconfig
  2. 1 1
      api/cluster/environment.go
  3. 36 36
      api/config/get.go
  4. 124 115
      api/openai/openai.go
  5. 2 2
      api/openai/router.go
  6. 2 0
      api/sites/domain.go
  7. 1 0
      api/sites/sites.go
  8. 3 0
      api/streams/streams.go
  9. 1 1
      app/src/api/config.ts
  10. 1 0
      app/src/api/domain.ts
  11. 1 1
      app/src/api/openai.ts
  12. 1 0
      app/src/api/stream.ts
  13. 2 11
      app/src/components/ChatGPT/ChatGPT.vue
  14. 78 78
      app/src/language/en/app.po
  15. 78 78
      app/src/language/es/app.po
  16. 78 78
      app/src/language/fr_FR/app.po
  17. 78 78
      app/src/language/ko_KR/app.po
  18. 87 87
      app/src/language/messages.pot
  19. 78 78
      app/src/language/ru_RU/app.po
  20. 78 78
      app/src/language/vi_VN/app.po
  21. BIN
      app/src/language/zh_CN/app.mo
  22. 84 78
      app/src/language/zh_CN/app.po
  23. 78 78
      app/src/language/zh_TW/app.po
  24. 1 0
      app/src/views/config/Config.vue
  25. 5 6
      app/src/views/config/ConfigEdit.vue
  26. 3 0
      app/src/views/domain/DomainEdit.vue
  27. 2 0
      app/src/views/domain/DomainList.vue
  28. 2 3
      app/src/views/domain/components/RightSettings.vue
  29. 3 0
      app/src/views/stream/StreamEdit.vue
  30. 2 0
      app/src/views/stream/StreamList.vue
  31. 3 5
      app/src/views/stream/components/RightSettings.vue
  32. 102 0
      internal/chatbot/context.go
  33. 23 0
      internal/chatbot/context_test.go
  34. 22 0
      internal/chatbot/messages.go
  35. 26 0
      internal/chatbot/messages_test.go
  36. 1 1
      internal/config/config.go
  37. 25 0
      internal/helper/directory.go
  38. 11 0
      internal/helper/directory_test.go
  39. 2 2
      model/config_backup.go
  40. 3 3
      query/config_backups.gen.go

+ 0 - 2
.editorconfig

@@ -1,8 +1,6 @@
 root = true
 
 [*]
-block_comment_start = /*
-block_comment_end = */
 charset = utf-8
 indent_style = space
 indent_size = 2

+ 1 - 1
api/cluster/environment.go

@@ -23,7 +23,7 @@ func GetEnvironment(c *gin.Context) {
 		return
 	}
 
-	c.JSON(http.StatusOK, env)
+	c.JSON(http.StatusOK, analytic.GetNode(env))
 }
 
 func GetEnvironmentList(c *gin.Context) {

+ 36 - 36
api/config/get.go

@@ -1,52 +1,52 @@
 package config
 
 import (
-    "github.com/0xJacky/Nginx-UI/api"
-    "github.com/0xJacky/Nginx-UI/internal/config"
-    "github.com/0xJacky/Nginx-UI/internal/nginx"
-    "github.com/0xJacky/Nginx-UI/query"
-    "github.com/gin-gonic/gin"
-    "github.com/sashabaranov/go-openai"
-    "net/http"
-    "os"
+	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/internal/config"
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/0xJacky/Nginx-UI/query"
+	"github.com/gin-gonic/gin"
+	"github.com/sashabaranov/go-openai"
+	"net/http"
+	"os"
 )
 
 func GetConfig(c *gin.Context) {
-    name := c.Param("name")
+	name := c.Param("name")
 
-    path := nginx.GetConfPath("/", name)
+	path := nginx.GetConfPath("/", name)
 
-    stat, err := os.Stat(path)
+	stat, err := os.Stat(path)
 
-    if err != nil {
-        api.ErrHandler(c, err)
-        return
-    }
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
 
-    content, err := os.ReadFile(path)
+	content, err := os.ReadFile(path)
 
-    if err != nil {
-        api.ErrHandler(c, err)
-        return
-    }
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
 
-    g := query.ChatGPTLog
-    chatgpt, err := g.Where(g.Name.Eq(path)).FirstOrCreate()
+	g := query.ChatGPTLog
+	chatgpt, err := g.Where(g.Name.Eq(path)).FirstOrCreate()
 
-    if err != nil {
-        api.ErrHandler(c, err)
-        return
-    }
+	if err != nil {
+		api.ErrHandler(c, err)
+		return
+	}
 
-    if chatgpt.Content == nil {
-        chatgpt.Content = make([]openai.ChatCompletionMessage, 0)
-    }
+	if chatgpt.Content == nil {
+		chatgpt.Content = make([]openai.ChatCompletionMessage, 0)
+	}
 
-    c.JSON(http.StatusOK, config.Config{
-        Name:            name,
-        Content:         string(content),
-        ChatGPTMessages: chatgpt.Content,
-        FilePath:        path,
-        ModifiedAt:      stat.ModTime(),
-    })
+	c.JSON(http.StatusOK, config.Config{
+		Name:            stat.Name(),
+		Content:         string(content),
+		ChatGPTMessages: chatgpt.Content,
+		FilePath:        path,
+		ModifiedAt:      stat.ModTime(),
+	})
 }

+ 124 - 115
api/openai/openai.go

@@ -1,123 +1,132 @@
 package openai
 
 import (
-    "context"
-    "crypto/tls"
-    "fmt"
-    "github.com/0xJacky/Nginx-UI/api"
-    "github.com/0xJacky/Nginx-UI/settings"
-    "github.com/gin-gonic/gin"
-    "github.com/pkg/errors"
-    "github.com/sashabaranov/go-openai"
-    "io"
-    "net/http"
-    "net/url"
-    "os"
+	"context"
+	"crypto/tls"
+	"fmt"
+	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/internal/chatbot"
+	"github.com/0xJacky/Nginx-UI/settings"
+	"github.com/gin-gonic/gin"
+	"github.com/pkg/errors"
+	"github.com/sashabaranov/go-openai"
+	"io"
+	"net/http"
+	"net/url"
 )
 
-const ChatGPTInitPrompt = "You are a assistant who can help users write and optimise the configurations of Nginx, the first user message contains the content of the configuration file which is currently opened by the user and the current language code(CLC). You suppose to use the language corresponding to the CLC to give the first reply. Later the language environment depends on the user message. The first reply should involve the key information of the file and ask user what can you help them."
+const ChatGPTInitPrompt = `You are a assistant who can help users write and optimise the configurations of Nginx,
+the first user message contains the content of the configuration file which is currently opened by the user and
+the current language code(CLC). You suppose to use the language corresponding to the CLC to give the first reply.
+Later the language environment depends on the user message.
+The first reply should involve the key information of the file and ask user what can you help them.`
 
 func MakeChatCompletionRequest(c *gin.Context) {
-    var json struct {
-        Messages []openai.ChatCompletionMessage `json:"messages"`
-    }
-
-    if !api.BindAndValid(c, &json) {
-        return
-    }
-
-    messages := []openai.ChatCompletionMessage{
-        {
-            Role:    openai.ChatMessageRoleSystem,
-            Content: ChatGPTInitPrompt,
-        },
-    }
-    messages = append(messages, json.Messages...)
-    // sse server
-    c.Writer.Header().Set("Content-Type", "text/event-stream; charset=utf-8")
-    c.Writer.Header().Set("Cache-Control", "no-cache")
-    c.Writer.Header().Set("Connection", "keep-alive")
-    c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
-
-    config := openai.DefaultConfig(settings.OpenAISettings.Token)
-
-    if settings.OpenAISettings.Proxy != "" {
-        proxyUrl, err := url.Parse(settings.OpenAISettings.Proxy)
-        if err != nil {
-            c.Stream(func(w io.Writer) bool {
-                c.SSEvent("message", gin.H{
-                    "type":    "error",
-                    "content": err.Error(),
-                })
-                return false
-            })
-            return
-        }
-        transport := &http.Transport{
-            Proxy:           http.ProxyURL(proxyUrl),
-            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
-        }
-        config.HTTPClient = &http.Client{
-            Transport: transport,
-        }
-    }
-
-    if settings.OpenAISettings.BaseUrl != "" {
-        config.BaseURL = settings.OpenAISettings.BaseUrl
-    }
-
-    openaiClient := openai.NewClientWithConfig(config)
-    ctx := context.Background()
-
-    req := openai.ChatCompletionRequest{
-        Model:    settings.OpenAISettings.Model,
-        Messages: messages,
-        Stream:   true,
-    }
-    stream, err := openaiClient.CreateChatCompletionStream(ctx, req)
-    if err != nil {
-        fmt.Printf("CompletionStream error: %v\n", err)
-        c.Stream(func(w io.Writer) bool {
-            c.SSEvent("message", gin.H{
-                "type":    "error",
-                "content": err.Error(),
-            })
-            return false
-        })
-        return
-    }
-    defer stream.Close()
-    msgChan := make(chan string)
-    go func() {
-        defer close(msgChan)
-        for {
-            response, err := stream.Recv()
-            if errors.Is(err, io.EOF) {
-                fmt.Println()
-                return
-            }
-
-            if err != nil {
-                fmt.Printf("Stream error: %v\n", err)
-                return
-            }
-
-            message := fmt.Sprintf("%s", response.Choices[0].Delta.Content)
-            fmt.Printf("%s", message)
-            _ = os.Stdout.Sync()
-
-            msgChan <- message
-        }
-    }()
-
-    c.Stream(func(w io.Writer) bool {
-        if m, ok := <-msgChan; ok {
-            c.SSEvent("message", gin.H{
-                "type":    "message",
-                "content": m,
-            })
-            return true
-        }
-        return false
-    })
+	var json struct {
+		Filepath string                         `json:"filepath"`
+		Messages []openai.ChatCompletionMessage `json:"messages"`
+	}
+
+	if !api.BindAndValid(c, &json) {
+		return
+	}
+
+	messages := []openai.ChatCompletionMessage{
+		{
+			Role:    openai.ChatMessageRoleSystem,
+			Content: ChatGPTInitPrompt,
+		},
+	}
+
+	messages = append(messages, json.Messages...)
+
+	if json.Filepath != "" {
+		messages = chatbot.ChatCompletionWithContext(json.Filepath, messages)
+	}
+
+	// SSE server
+	c.Writer.Header().Set("Content-Type", "text/event-stream; charset=utf-8")
+	c.Writer.Header().Set("Cache-Control", "no-cache")
+	c.Writer.Header().Set("Connection", "keep-alive")
+	c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
+
+	config := openai.DefaultConfig(settings.OpenAISettings.Token)
+
+	if settings.OpenAISettings.Proxy != "" {
+		proxyUrl, err := url.Parse(settings.OpenAISettings.Proxy)
+		if err != nil {
+			c.Stream(func(w io.Writer) bool {
+				c.SSEvent("message", gin.H{
+					"type":    "error",
+					"content": err.Error(),
+				})
+				return false
+			})
+			return
+		}
+		transport := &http.Transport{
+			Proxy:           http.ProxyURL(proxyUrl),
+			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
+		}
+		config.HTTPClient = &http.Client{
+			Transport: transport,
+		}
+	}
+
+	if settings.OpenAISettings.BaseUrl != "" {
+		config.BaseURL = settings.OpenAISettings.BaseUrl
+	}
+
+	openaiClient := openai.NewClientWithConfig(config)
+	ctx := context.Background()
+
+	req := openai.ChatCompletionRequest{
+		Model:    settings.OpenAISettings.Model,
+		Messages: messages,
+		Stream:   true,
+	}
+	stream, err := openaiClient.CreateChatCompletionStream(ctx, req)
+	if err != nil {
+		fmt.Printf("CompletionStream error: %v\n", err)
+		c.Stream(func(w io.Writer) bool {
+			c.SSEvent("message", gin.H{
+				"type":    "error",
+				"content": err.Error(),
+			})
+			return false
+		})
+		return
+	}
+	defer stream.Close()
+	msgChan := make(chan string)
+	go func() {
+		defer close(msgChan)
+		for {
+			response, err := stream.Recv()
+			if errors.Is(err, io.EOF) {
+				fmt.Println()
+				return
+			}
+
+			if err != nil {
+				fmt.Printf("Stream error: %v\n", err)
+				return
+			}
+
+			message := fmt.Sprintf("%s", response.Choices[0].Delta.Content)
+
+			msgChan <- message
+		}
+	}()
+
+	c.Stream(func(w io.Writer) bool {
+		if m, ok := <-msgChan; ok {
+			c.SSEvent("message", gin.H{
+				"type":    "message",
+				"content": m,
+			})
+			return true
+		}
+		return false
+	})
 }

+ 2 - 2
api/openai/router.go

@@ -4,6 +4,6 @@ import "github.com/gin-gonic/gin"
 
 func InitRouter(r *gin.RouterGroup) {
 	// ChatGPT
-	r.POST("chat_gpt", MakeChatCompletionRequest)
-	r.POST("chat_gpt_record", StoreChatGPTRecord)
+	r.POST("chatgpt", MakeChatCompletionRequest)
+	r.POST("chatgpt_record", StoreChatGPTRecord)
 }

+ 2 - 0
api/sites/domain.go

@@ -132,6 +132,7 @@ func GetDomain(c *gin.Context) {
 			Config:          string(origContent),
 			AutoCert:        certModel.AutoCert == model.AutoCertEnabled,
 			ChatGPTMessages: chatgpt.Content,
+			Filepath:        path,
 		})
 		return
 	}
@@ -173,6 +174,7 @@ func GetDomain(c *gin.Context) {
 		AutoCert:        certModel.AutoCert == model.AutoCertEnabled,
 		CertInfo:        certInfoMap,
 		ChatGPTMessages: chatgpt.Content,
+		Filepath:        path,
 	})
 }
 

+ 1 - 0
api/sites/sites.go

@@ -17,4 +17,5 @@ type Site struct {
 	ChatGPTMessages []openai.ChatCompletionMessage `json:"chatgpt_messages,omitempty"`
 	Tokenized       *nginx.NgxConfig               `json:"tokenized,omitempty"`
 	CertInfo        map[int]*cert.Info             `json:"cert_info,omitempty"`
+	Filepath        string                         `json:"filepath"`
 }

+ 3 - 0
api/streams/streams.go

@@ -22,6 +22,7 @@ type Stream struct {
 	Config          string                         `json:"config"`
 	ChatGPTMessages []openai.ChatCompletionMessage `json:"chatgpt_messages,omitempty"`
 	Tokenized       *nginx.NgxConfig               `json:"tokenized,omitempty"`
+	Filepath        string                         `json:"filepath"`
 }
 
 func GetStreams(c *gin.Context) {
@@ -133,6 +134,7 @@ func GetStream(c *gin.Context) {
 			Name:            name,
 			Config:          string(origContent),
 			ChatGPTMessages: chatgpt.Content,
+			Filepath:        path,
 		})
 		return
 	}
@@ -152,6 +154,7 @@ func GetStream(c *gin.Context) {
 		Config:          nginxConfig.FmtCode(),
 		Tokenized:       nginxConfig,
 		ChatGPTMessages: chatgpt.Content,
+		Filepath:        path,
 	})
 }
 

+ 1 - 1
app/src/api/config.ts

@@ -5,7 +5,7 @@ export interface Config {
   name: string
   content: string
   chatgpt_messages: ChatComplicationMessage[]
-  file_path: string
+  filepath: string
   modified_at: string
 }
 

+ 1 - 0
app/src/api/domain.ts

@@ -10,6 +10,7 @@ export interface Site {
   advanced: boolean
   enabled: boolean
   name: string
+  filepath: string
   config: string
   auto_cert: boolean
   chatgpt_messages: ChatComplicationMessage[]

+ 1 - 1
app/src/api/openai.ts

@@ -8,7 +8,7 @@ export interface ChatComplicationMessage {
 
 const openai = {
   store_record(data: { file_name?: string; messages?: ChatComplicationMessage[] }) {
-    return http.post('/chat_gpt_record', data)
+    return http.post('/chatgpt_record', data)
   },
 }
 

+ 1 - 0
app/src/api/stream.ts

@@ -8,6 +8,7 @@ export interface Stream {
   advanced: boolean
   enabled: boolean
   name: string
+  filepath: string
   config: string
   chatgpt_messages: ChatComplicationMessage[]
   tokenized?: NgxConfig

+ 2 - 11
app/src/components/ChatGPT/ChatGPT.vue

@@ -49,26 +49,18 @@ async function request() {
 
   const { token } = storeToRefs(user)
 
-  console.log('fetching...')
-
   messages.value?.push(t.value)
 
   emit('update:history_messages', messages.value)
 
-  const res = await fetch(urlJoin(window.location.pathname, '/api/chat_gpt'), {
+  const res = await fetch(urlJoin(window.location.pathname, '/api/chatgpt'), {
     method: 'POST',
     headers: { Accept: 'text/event-stream', Authorization: token.value },
-    body: JSON.stringify({ messages: messages.value?.slice(0, messages.value?.length - 1) }),
+    body: JSON.stringify({ filepath: props.path, messages: messages.value?.slice(0, messages.value?.length - 1) }),
   })
 
-  // read body as stream
-  console.info('reading...')
-
   const reader = res.body!.getReader()
 
-  // read stream
-  console.info('reading stream...')
-
   let buffer = ''
 
   let hasCodeBlockIndicator = false
@@ -76,7 +68,6 @@ async function request() {
   while (true) {
     const { done, value } = await reader.read()
     if (done) {
-      console.info('done')
       setTimeout(() => {
         scrollToBottom()
       }, 500)

+ 78 - 78
app/src/language/en/app.po

@@ -54,7 +54,7 @@ msgstr "Add Location"
 msgid "Add Site"
 msgstr "Add Site"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 #, fuzzy
 msgid "Add Stream"
 msgstr "Add Site"
@@ -69,7 +69,7 @@ msgstr "Saved successfully"
 msgid "Additional"
 msgstr "Add Location"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "Advance Mode"
 
@@ -99,7 +99,7 @@ msgstr ""
 msgid "Are you sure you want to clear all notifications?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 #, fuzzy
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "Are you sure you want to remove this directive?"
@@ -109,7 +109,7 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgstr "Are you sure you want to remove this directive?"
@@ -128,11 +128,11 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr ""
 
@@ -158,9 +158,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "Auto-renewal enabled for %{name}"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "Back"
 
@@ -173,15 +173,15 @@ msgstr "Back"
 msgid "Base information"
 msgstr "Base information"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
 msgid "Basic"
 msgstr "Basic Mode"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "Basic Mode"
 
@@ -203,18 +203,18 @@ msgstr ""
 msgid "CADir"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "Cancel"
 
@@ -268,7 +268,7 @@ msgstr ""
 msgid "Cleaning environment variables"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -382,10 +382,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr ""
 
@@ -403,9 +403,9 @@ msgid "Deleted successfully"
 msgstr "Disabled successfully"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr ""
 
@@ -451,7 +451,7 @@ msgstr "Directives"
 msgid "Directory"
 msgstr "Directive"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 #, fuzzy
 msgid "Disable"
 msgstr "Disabled"
@@ -460,15 +460,15 @@ msgstr "Disabled"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "Disabled"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
@@ -502,22 +502,22 @@ msgstr[1] "Are you sure you want to remove this directive?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this stream?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this stream?"
 msgstr "Are you sure you want to remove this directive?"
@@ -562,9 +562,9 @@ msgid "Dry run mode enabled"
 msgstr ""
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr ""
 
@@ -592,11 +592,11 @@ msgstr "Saved successfully"
 msgid "Duplicate to local successfully"
 msgstr "Saved successfully"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "Edit %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "Edit Configuration"
 
@@ -619,9 +619,9 @@ msgid "Email (*)"
 msgstr "Email (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 #, fuzzy
 msgid "Enable"
 msgstr "Enabled"
@@ -655,18 +655,18 @@ msgid "Enable TLS"
 msgstr "Enable TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -715,16 +715,16 @@ msgstr ""
 msgid "Fail to obtain certificate"
 msgstr "Certificate is valid"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
@@ -733,7 +733,7 @@ msgstr "Failed to enable %{msg}"
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -767,16 +767,16 @@ msgstr "Finished"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 #, fuzzy
 msgid "Format error %{msg}"
 msgstr "Save error %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 #, fuzzy
 msgid "Format successfully"
 msgstr "Saved successfully"
@@ -1029,7 +1029,7 @@ msgstr ""
 msgid "Model"
 msgstr "Advance Mode"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 #, fuzzy
@@ -1060,14 +1060,14 @@ msgstr "Single Directive"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "Name"
 
@@ -1105,7 +1105,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Configuration Name"
@@ -1132,15 +1132,15 @@ msgstr "Saved successfully"
 msgid "Nginx restarted successfully"
 msgstr "Saved successfully"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "No"
 
@@ -1194,7 +1194,7 @@ msgstr ""
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1202,15 +1202,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr ""
 
@@ -1260,7 +1260,7 @@ msgstr "Password"
 msgid "Password (*)"
 msgstr "Password (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1363,7 +1363,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "Saved successfully"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr ""
 
@@ -1398,7 +1398,7 @@ msgstr "Install"
 msgid "Release Note"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr ""
@@ -1468,11 +1468,11 @@ msgstr "Advance Mode"
 msgid "Running"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "Save"
 
@@ -1480,7 +1480,7 @@ msgstr "Save"
 msgid "Save Directive"
 msgstr "Save Directive"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "Save error %{msg}"
@@ -1493,10 +1493,10 @@ msgstr "Save error %{msg}"
 msgid "Save successfully"
 msgstr "Saved successfully"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "Saved successfully"
 
@@ -1520,7 +1520,7 @@ msgstr "Send"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1749,10 +1749,10 @@ msgstr ""
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Updated at"
@@ -1788,7 +1788,7 @@ msgstr "Uptime:"
 msgid "URL"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 #, fuzzy
 msgid "User"
 msgstr "Username"

+ 78 - 78
app/src/language/es/app.po

@@ -59,7 +59,7 @@ msgstr "Agregar Ubicación"
 msgid "Add Site"
 msgstr "Agregar Sitio"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 msgid "Add Stream"
 msgstr "Agregar Stream"
 
@@ -71,7 +71,7 @@ msgstr "Agregado exitoso"
 msgid "Additional"
 msgstr "Adicional"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "Modo avanzado"
 
@@ -101,7 +101,7 @@ msgstr "Arquitectura"
 msgid "Are you sure you want to clear all notifications?"
 msgstr "¿Está seguro de que desea borrar todas las notificaciones?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "¿Está seguro de que desea borrar el registro del chat?"
 
@@ -110,7 +110,7 @@ msgstr "¿Está seguro de que desea borrar el registro del chat?"
 msgid "Are you sure you want to delete this item?"
 msgstr "¿Está seguro de que quiere borrar?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr "¿Está seguro de que quiere borrar?"
 
@@ -127,11 +127,11 @@ msgstr "¿Está seguro de que quiere borrar esta directiva?"
 msgid "Are you sure you want to remove this location?"
 msgstr "¿Está seguro de que quiere borrar esta ubicación?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "Preguntar por ayuda a ChatGPT"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "Asistente"
 
@@ -157,9 +157,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "Renovación automática habilitada por %{name}"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "Volver"
 
@@ -171,14 +171,14 @@ msgstr "Volver al Inicio"
 msgid "Base information"
 msgstr "Información general"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr "Básico"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "Modo Básico"
 
@@ -199,18 +199,18 @@ msgstr ""
 msgid "CADir"
 msgstr "Directorio CA"
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "Cancelar"
 
@@ -261,7 +261,7 @@ msgstr "Intentar nuevamente"
 msgid "Cleaning environment variables"
 msgstr "Borrar las variables de entorno"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -372,10 +372,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -392,9 +392,9 @@ msgid "Deleted successfully"
 msgstr "Borrado exitoso"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr "Desplegar"
 
@@ -438,7 +438,7 @@ msgstr "Directivas"
 msgid "Directory"
 msgstr "Directorio"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 msgid "Disable"
 msgstr "Desactivar"
 
@@ -446,15 +446,15 @@ msgstr "Desactivar"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "No se pudo desactivar la renovación automática por %{name}"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "Desactivado con éxito"
@@ -487,19 +487,19 @@ msgstr[1] "¿Desea desplegar este archivo en los servidores remotos?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "¿Desea deshabilitar la renovación automática de certificado?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr "¿Quieres deshabilitar este sitio?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to disable this stream?"
 msgstr "¿Quieres deshabilitar esta transmisión?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr "¿Quieres habilitar este sitio?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to enable this stream?"
 msgstr "¿Quieres habilitar esta transmisión?"
 
@@ -542,9 +542,9 @@ msgid "Dry run mode enabled"
 msgstr "Modo de ejecución de prueba habilitado"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "Duplicar"
 
@@ -568,11 +568,11 @@ msgstr "Duplicado con éxito"
 msgid "Duplicate to local successfully"
 msgstr "Duplicado con éxito a local"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "Editar %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "Editar Configuración"
 
@@ -594,9 +594,9 @@ msgid "Email (*)"
 msgstr "Correo (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 msgid "Enable"
 msgstr "Habilitar"
 
@@ -628,18 +628,18 @@ msgid "Enable TLS"
 msgstr "Habilitar TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -686,16 +686,16 @@ msgstr "Exportar"
 msgid "Fail to obtain certificate"
 msgstr "Obtener certificado"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "Error al deshabilitar %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Error al habilitar %{msg}"
@@ -704,7 +704,7 @@ msgstr "Error al habilitar %{msg}"
 msgid "Failed to get certificate information"
 msgstr "No se pudo obtener la información del certificado"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "No se pudo guardar, se detectó un error(es) de sintaxis en la configuración."
@@ -738,15 +738,15 @@ msgstr "Terminado"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "Para usuario chino: https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "Código de formato"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 msgid "Format error %{msg}"
 msgstr "Error de formato %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 msgid "Format successfully"
 msgstr "Formateado correctamente"
 
@@ -984,7 +984,7 @@ msgstr ""
 msgid "Model"
 msgstr "Modo de ejecución"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 msgid "Modify"
@@ -1012,14 +1012,14 @@ msgstr "Directiva multilínea"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "Nombre"
 
@@ -1057,7 +1057,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Ruta de registro de acceso de Nginx"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 msgid "Nginx Configuration Parse Error"
 msgstr "Error de análisis de configuración de Nginx"
 
@@ -1081,15 +1081,15 @@ msgstr "Nginx recargado con éxito"
 msgid "Nginx restarted successfully"
 msgstr "Nginx reiniciado con éxito"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "No"
 
@@ -1140,7 +1140,7 @@ msgstr "Desconectado"
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1148,15 +1148,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr "OK"
 
@@ -1205,7 +1205,7 @@ msgstr "Contraseña"
 msgid "Password (*)"
 msgstr "Contraseña (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1316,7 +1316,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "Eliminado con éxito"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "Regenerar respuesta"
 
@@ -1352,7 +1352,7 @@ msgstr "Reinstalar"
 msgid "Release Note"
 msgstr "Nota de versión"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "Recargar"
@@ -1415,11 +1415,11 @@ msgstr "Modo de ejecución"
 msgid "Running"
 msgstr "Corriendo"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "Guardar"
 
@@ -1427,7 +1427,7 @@ msgstr "Guardar"
 msgid "Save Directive"
 msgstr "Guardar Directiva"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "Error al guardar %{msg}"
@@ -1439,10 +1439,10 @@ msgstr "Error al guardar %{msg}"
 msgid "Save successfully"
 msgstr "Guardado con éxito"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "Guardado con éxito"
 
@@ -1466,7 +1466,7 @@ msgstr "Enviado"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1689,10 +1689,10 @@ msgstr "Tipo"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Actualizado a"
@@ -1726,7 +1726,7 @@ msgstr "Tiempo encendido:"
 msgid "URL"
 msgstr "URL"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "User"
 msgstr "Usuario"
 

+ 78 - 78
app/src/language/fr_FR/app.po

@@ -56,7 +56,7 @@ msgstr "Ajouter une localisation"
 msgid "Add Site"
 msgstr "Ajouter un site"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 #, fuzzy
 msgid "Add Stream"
 msgstr "Ajouter un site"
@@ -71,7 +71,7 @@ msgstr "Mis à jour avec succés"
 msgid "Additional"
 msgstr "Supplémentaire"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "Mode avancé"
 
@@ -103,7 +103,7 @@ msgstr "Arch"
 msgid "Are you sure you want to clear all notifications?"
 msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
 
@@ -112,7 +112,7 @@ msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
@@ -129,12 +129,12 @@ msgstr "Voulez-vous vraiment supprimer cette directive ?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Voulez-vous vraiment supprimer cette localisation ?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 #, fuzzy
 msgid "Ask ChatGPT for Help"
 msgstr "Modèle ChatGPT"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr ""
 
@@ -160,9 +160,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "Renouvellement automatique activé pour %{name}"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "Retour"
 
@@ -174,14 +174,14 @@ msgstr "Retour au menu principal"
 msgid "Base information"
 msgstr "Information générale"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr "Basique"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "Mode simple"
 
@@ -203,18 +203,18 @@ msgstr ""
 msgid "CADir"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -267,7 +267,7 @@ msgstr "Revérifier"
 msgid "Cleaning environment variables"
 msgstr "Nettoyage des variables d'environnement"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -380,10 +380,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -402,9 +402,9 @@ msgid "Deleted successfully"
 msgstr "Désactivé avec succès"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr ""
 
@@ -450,7 +450,7 @@ msgstr "Directives"
 msgid "Directory"
 msgstr "Directive"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 #, fuzzy
 msgid "Disable"
 msgstr "Désactivé"
@@ -459,15 +459,15 @@ msgstr "Désactivé"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "La désactivation du renouvellement automatique a échoué pour %{name}"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "Désactivé avec succès"
@@ -501,20 +501,20 @@ msgstr[1] "Voulez-vous supprimer ce serveur ?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "Voulez-vous désactiver le renouvellement automatique des certificats ?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr "Voulez-vous désactiver ce site ?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this stream?"
 msgstr "Voulez-vous désactiver ce site ?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr "Voulez-vous activer ce site ?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this stream?"
 msgstr "Voulez-vous activer ce site ?"
@@ -560,9 +560,9 @@ msgid "Dry run mode enabled"
 msgstr ""
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "Dupliquer"
 
@@ -590,11 +590,11 @@ msgstr "Dupliqué avec succès"
 msgid "Duplicate to local successfully"
 msgstr "Dupliqué avec succès"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "Modifier %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "Modifier la configuration"
 
@@ -617,9 +617,9 @@ msgid "Email (*)"
 msgstr "Email (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 #, fuzzy
 msgid "Enable"
 msgstr "Activé"
@@ -653,18 +653,18 @@ msgid "Enable TLS"
 msgstr "Activer TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "Activé"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -713,16 +713,16 @@ msgstr "Exporter"
 msgid "Fail to obtain certificate"
 msgstr "Obtenir un certificat"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "Impossible de désactiver %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Impossible d'activer %{msg}"
@@ -731,7 +731,7 @@ msgstr "Impossible d'activer %{msg}"
 msgid "Failed to get certificate information"
 msgstr "Échec de l'obtention des informations sur le certificat"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 "Échec de l'enregistrement, une ou plusieurs erreurs de syntaxe ont été "
@@ -768,15 +768,15 @@ msgstr "Finie"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "Utilisateur chinois : https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "Code de formatage"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 msgid "Format error %{msg}"
 msgstr "Erreur de format %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 msgid "Format successfully"
 msgstr "Formaté avec succès"
 
@@ -1028,7 +1028,7 @@ msgstr ""
 msgid "Model"
 msgstr "Mode d'exécution"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 msgid "Modify"
@@ -1057,14 +1057,14 @@ msgstr "Directive multiligne"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "Nom"
 
@@ -1103,7 +1103,7 @@ msgstr "Journal Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Chemin du journal d'accès Nginx"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 msgid "Nginx Configuration Parse Error"
 msgstr "Erreur d'analyse de configuration Nginx"
 
@@ -1127,15 +1127,15 @@ msgstr "Nginx a été rechargé avec succès"
 msgid "Nginx restarted successfully"
 msgstr "Nginx a redémarré avec succès"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "Non"
 
@@ -1189,7 +1189,7 @@ msgstr ""
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1197,15 +1197,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr "OK"
 
@@ -1254,7 +1254,7 @@ msgstr "Mot de passe"
 msgid "Password (*)"
 msgstr "Mot de passe (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1366,7 +1366,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "Enregistré avec succès"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "Régénérer la réponse"
 
@@ -1402,7 +1402,7 @@ msgstr "Réinstaller"
 msgid "Release Note"
 msgstr "Note de version"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "Recharger"
@@ -1471,11 +1471,11 @@ msgstr "Mode d'exécution"
 msgid "Running"
 msgstr "En cours d'éxécution"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "Enregistrer"
 
@@ -1483,7 +1483,7 @@ msgstr "Enregistrer"
 msgid "Save Directive"
 msgstr "Enregistrer la directive"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "Enregistrer l'erreur %{msg}"
@@ -1495,10 +1495,10 @@ msgstr "Enregistrer l'erreur %{msg}"
 msgid "Save successfully"
 msgstr "Sauvegarde réussie"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "Enregistré avec succès"
 
@@ -1522,7 +1522,7 @@ msgstr "Envoyer"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1759,10 +1759,10 @@ msgstr "Type"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Mis à jour le"
@@ -1796,7 +1796,7 @@ msgstr "Disponibilité :"
 msgid "URL"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 #, fuzzy
 msgid "User"
 msgstr "Nom d'utilisateur"

+ 78 - 78
app/src/language/ko_KR/app.po

@@ -58,7 +58,7 @@ msgstr "위치 추가"
 msgid "Add Site"
 msgstr "사이트 추가"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 msgid "Add Stream"
 msgstr "스트림 추가"
 
@@ -70,7 +70,7 @@ msgstr "성공적으로 추가됨"
 msgid "Additional"
 msgstr "추가적인"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "고급 모드"
 
@@ -100,7 +100,7 @@ msgstr "아키텍처"
 msgid "Are you sure you want to clear all notifications?"
 msgstr "모든 알림을 지우시겠습니까?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "기록을 지우시겠습니까?"
 
@@ -109,7 +109,7 @@ msgstr "기록을 지우시겠습니까?"
 msgid "Are you sure you want to delete this item?"
 msgstr "정말 삭제하시겠습니까?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr "정말 삭제하시겠습니까?"
 
@@ -126,11 +126,11 @@ msgstr "이 지시문을 정말로 제거하시겠습니까?"
 msgid "Are you sure you want to remove this location?"
 msgstr "이 위치를 제거하시겠습니까?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "ChatGPT에게 도움 요청"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "조수"
 
@@ -156,9 +156,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "%{name}에 대한 자동 갱신 활성화됨"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "뒤로"
 
@@ -170,14 +170,14 @@ msgstr "홈으로"
 msgid "Base information"
 msgstr "기본 정보"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr "기본"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "기본 모드"
 
@@ -198,18 +198,18 @@ msgstr ""
 msgid "CADir"
 msgstr "CA 디렉토리"
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "취소"
 
@@ -260,7 +260,7 @@ msgstr "다시 확인"
 msgid "Cleaning environment variables"
 msgstr "환경 변수 정리"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -370,10 +370,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "삭제"
 
@@ -390,9 +390,9 @@ msgid "Deleted successfully"
 msgstr "성공적으로 삭제됨"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr "배포"
 
@@ -436,7 +436,7 @@ msgstr "지시문들"
 msgid "Directory"
 msgstr "디렉토리"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 msgid "Disable"
 msgstr "비활성화"
 
@@ -444,15 +444,15 @@ msgstr "비활성화"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "%{name}의 자동 갱신 비활성화 실패"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "비활성화됨"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "성공적으로 비활성화됨"
@@ -485,19 +485,19 @@ msgstr[1] "이 지시문들을 정말로 제거하시겠습니까?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "자동 인증서 갱신을 비활성화하시겠습니까?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr "이 사이트를 비활성화하시겠습니까?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to disable this stream?"
 msgstr "이 스트림을 비활성화하시겠습니까?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr "이 사이트를 활성화하시겠습니까?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to enable this stream?"
 msgstr "이 스트림을 활성화하시겠습니까?"
 
@@ -539,9 +539,9 @@ msgid "Dry run mode enabled"
 msgstr "드라이런 모드 활성화됨"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "복제"
 
@@ -566,11 +566,11 @@ msgstr "성공적으로 복제됨"
 msgid "Duplicate to local successfully"
 msgstr "로컬로 성공적으로 복제됨"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "%{n} 편집"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "구성 편집"
 
@@ -592,9 +592,9 @@ msgid "Email (*)"
 msgstr "이메일 (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 msgid "Enable"
 msgstr "활성화"
 
@@ -626,18 +626,18 @@ msgid "Enable TLS"
 msgstr "TLS 활성화"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "활성화됨"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -685,16 +685,16 @@ msgstr "내보내기"
 msgid "Fail to obtain certificate"
 msgstr "인증서 획득 실패"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "%{msg} 비활성화 실패"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "%{msg} 활성화 실패"
@@ -703,7 +703,7 @@ msgstr "%{msg} 활성화 실패"
 msgid "Failed to get certificate information"
 msgstr "인증서 정보 가져오기 실패"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "저장 실패, 구성에서 구문 오류가 감지되었습니다."
 
@@ -737,16 +737,16 @@ msgstr "완료됨"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "중국 사용자를 위해: https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "코드 형식"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 #, fuzzy
 msgid "Format error %{msg}"
 msgstr "형식 오류 %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 #, fuzzy
 msgid "Format successfully"
 msgstr "성공적으로 형식 지정됨"
@@ -1004,7 +1004,7 @@ msgstr "분"
 msgid "Model"
 msgstr "실행 모드"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 #, fuzzy
@@ -1035,14 +1035,14 @@ msgstr "단일 지시문"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "이름"
 
@@ -1080,7 +1080,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 접근 로그 경로"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Nginx 구성 오류름"
@@ -1107,15 +1107,15 @@ msgstr "Nginx가 성공적으로 리로드됨"
 msgid "Nginx restarted successfully"
 msgstr "Nginx가 성공적으로 재시작됨"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "아니요"
 
@@ -1169,7 +1169,7 @@ msgstr "오프라인"
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1177,15 +1177,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr "확인"
 
@@ -1235,7 +1235,7 @@ msgstr "비밀번호"
 msgid "Password (*)"
 msgstr "비밀번호 (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1340,7 +1340,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "성공적으로 제거됨"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "응답 재생성"
 
@@ -1377,7 +1377,7 @@ msgstr "재설치"
 msgid "Release Note"
 msgstr "릴리스 노트"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "리로드"
@@ -1447,11 +1447,11 @@ msgstr "실행 모드"
 msgid "Running"
 msgstr "실행 중"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "저장"
 
@@ -1459,7 +1459,7 @@ msgstr "저장"
 msgid "Save Directive"
 msgstr "지시문 저장"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "저장 오류 %{msg}"
@@ -1472,10 +1472,10 @@ msgstr "저장 오류 %{msg}"
 msgid "Save successfully"
 msgstr "성공적으로 저장됨"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "성공적으로 저장됨"
 
@@ -1499,7 +1499,7 @@ msgstr "보내기"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1730,10 +1730,10 @@ msgstr "유형"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "업데이트됨"
@@ -1769,7 +1769,7 @@ msgstr "가동 시간:"
 msgid "URL"
 msgstr "URL"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 #, fuzzy
 msgid "User"
 msgstr "사용자 이름"

+ 87 - 87
app/src/language/messages.pot

@@ -52,7 +52,7 @@ msgstr ""
 msgid "Add Site"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 msgid "Add Stream"
 msgstr ""
 
@@ -64,8 +64,8 @@ msgstr ""
 msgid "Additional"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:196
-#: src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199
+#: src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr ""
 
@@ -94,7 +94,7 @@ msgstr ""
 msgid "Are you sure you want to clear all notifications?"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr ""
 
@@ -102,8 +102,8 @@ msgstr ""
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 
-#: src/views/domain/DomainList.vue:144
-#: src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146
+#: src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr ""
 
@@ -119,11 +119,11 @@ msgstr ""
 msgid "Are you sure you want to remove this location?"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr ""
 
@@ -149,11 +149,11 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr ""
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72
-#: src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253
+#: src/views/config/Config.vue:73
+#: src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256
 #: src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr ""
 
@@ -165,15 +165,15 @@ msgstr ""
 msgid "Base information"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:199
-#: src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202
+#: src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr ""
 
@@ -194,18 +194,18 @@ msgstr ""
 msgid "CADir"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr ""
 
@@ -256,7 +256,7 @@ msgstr ""
 msgid "Cleaning environment variables"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -367,10 +367,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr ""
 
@@ -387,9 +387,9 @@ msgid "Deleted successfully"
 msgstr ""
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr ""
 
@@ -433,8 +433,8 @@ msgstr ""
 msgid "Directory"
 msgstr ""
 
-#: src/views/domain/DomainList.vue:122
-#: src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124
+#: src/views/stream/StreamList.vue:145
 msgid "Disable"
 msgstr ""
 
@@ -443,16 +443,16 @@ msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
 #: src/views/domain/cert/ChangeCert.vue:45
-#: src/views/domain/DomainEdit.vue:182
+#: src/views/domain/DomainEdit.vue:185
 #: src/views/domain/DomainList.vue:33
-#: src/views/stream/StreamEdit.vue:174
+#: src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr ""
@@ -486,19 +486,19 @@ msgstr[1] ""
 msgid "Do you want to disable auto-cert renewal?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr ""
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to disable this stream?"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr ""
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to enable this stream?"
 msgstr ""
 
@@ -539,9 +539,9 @@ msgid "Dry run mode enabled"
 msgstr ""
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr ""
 
@@ -565,13 +565,13 @@ msgstr ""
 msgid "Duplicate to local successfully"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:171
-#: src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174
+#: src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr ""
 
 #: src/routes/index.ts:109
-#: src/views/config/ConfigEdit.vue:82
+#: src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr ""
 
@@ -592,9 +592,9 @@ msgid "Email (*)"
 msgstr ""
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 msgid "Enable"
 msgstr ""
 
@@ -626,21 +626,21 @@ msgid "Enable TLS"
 msgstr ""
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179
 #: src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171
 #: src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42
 #: src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -689,16 +689,16 @@ msgstr ""
 msgid "Fail to obtain certificate"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr ""
@@ -707,8 +707,8 @@ msgstr ""
 msgid "Failed to get certificate information"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:130
-#: src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132
+#: src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr ""
 
@@ -742,15 +742,15 @@ msgstr ""
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 msgid "Format error %{msg}"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 msgid "Format successfully"
 msgstr ""
 
@@ -982,7 +982,7 @@ msgstr ""
 msgid "Model"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 msgid "Modify"
@@ -1011,15 +1011,15 @@ msgstr ""
 #: src/views/certificate/DNSCredential.vue:10
 #: src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
 #: src/views/stream/StreamList.vue:13
-#: src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr ""
 
@@ -1057,8 +1057,8 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:214
-#: src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217
+#: src/views/stream/StreamEdit.vue:209
 msgid "Nginx Configuration Parse Error"
 msgstr ""
 
@@ -1083,15 +1083,15 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr ""
 
@@ -1143,7 +1143,7 @@ msgstr ""
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1151,15 +1151,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr ""
 
@@ -1209,7 +1209,7 @@ msgstr ""
 msgid "Password (*)"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1307,7 +1307,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr ""
 
@@ -1339,7 +1339,7 @@ msgstr ""
 msgid "Release Note"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr ""
@@ -1402,13 +1402,13 @@ msgstr ""
 msgid "Running"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97
-#: src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96
+#: src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
 #: src/views/preference/Preference.vue:122
-#: src/views/stream/StreamEdit.vue:251
+#: src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr ""
 
@@ -1416,7 +1416,7 @@ msgstr ""
 msgid "Save Directive"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:58
+#: src/views/config/ConfigEdit.vue:57
 #: src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
@@ -1429,11 +1429,11 @@ msgstr ""
 msgid "Save successfully"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:56
+#: src/views/config/ConfigEdit.vue:55
 #: src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr ""
 
@@ -1457,7 +1457,7 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41
+#: src/views/config/ConfigEdit.vue:40
 #: src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70
 #: src/views/preference/Preference.vue:62
@@ -1671,11 +1671,11 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23
 #: src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41
 #: src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
@@ -1711,7 +1711,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "User"
 msgstr ""
 

+ 78 - 78
app/src/language/ru_RU/app.po

@@ -54,7 +54,7 @@ msgstr "Добавить Location"
 msgid "Add Site"
 msgstr "Добавть Сайт"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 #, fuzzy
 msgid "Add Stream"
 msgstr "Добавть Сайт"
@@ -69,7 +69,7 @@ msgstr "Обновлено успешно"
 msgid "Additional"
 msgstr "Дополнительно"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "Расширенный режим"
 
@@ -99,7 +99,7 @@ msgstr ""
 msgid "Are you sure you want to clear all notifications?"
 msgstr "Вы уверены, что хотите удалить все уведомления?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 #, fuzzy
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "Вы уверены, что хотите очистить сообщения чата?"
@@ -109,7 +109,7 @@ msgstr "Вы уверены, что хотите очистить сообщен
 msgid "Are you sure you want to delete this item?"
 msgstr "Вы уверены, что хотите удалить?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgstr "Вы уверены, что хотите удалить?"
@@ -128,11 +128,11 @@ msgstr "Вы уверены, что хотите удалить эту дире
 msgid "Are you sure you want to remove this location?"
 msgstr "Вы уверены, что хотите удалить эту директиву?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "Обратитесь за помощью к ChatGPT"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "Ассистент"
 
@@ -158,9 +158,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "Автообновление включено для %{name}"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "Назад"
 
@@ -173,15 +173,15 @@ msgstr "Вернутся"
 msgid "Base information"
 msgstr "Основная информация"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
 msgid "Basic"
 msgstr "Простой режим"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "Простой режим"
 
@@ -203,18 +203,18 @@ msgstr ""
 msgid "CADir"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "Отмена"
 
@@ -268,7 +268,7 @@ msgstr "Проверить повторно"
 msgid "Cleaning environment variables"
 msgstr "Очистка переменных среды"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -382,10 +382,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "Удалить"
 
@@ -403,9 +403,9 @@ msgid "Deleted successfully"
 msgstr "Отключено успешно"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr ""
 
@@ -451,7 +451,7 @@ msgstr "Дерективы"
 msgid "Directory"
 msgstr "Деректива"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 #, fuzzy
 msgid "Disable"
 msgstr "Отключить"
@@ -460,15 +460,15 @@ msgstr "Отключить"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Не удалось отключить автоматическое продление для %{name}"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "Отключено"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "Отключено успешно"
@@ -502,22 +502,22 @@ msgstr[1] "Are you sure you want to remove this directive?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "Вы хотите отключить автоматическое обновление сертификата?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Вы хотите отключить этот сайт?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this stream?"
 msgstr "Вы хотите отключить этот сайт?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Вы хотите включить этот сайт?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this stream?"
 msgstr "Вы хотите включить этот сайт?"
@@ -564,9 +564,9 @@ msgid "Dry run mode enabled"
 msgstr "Включен пробный режим"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "Дублировать"
 
@@ -594,11 +594,11 @@ msgstr "Продублированно"
 msgid "Duplicate to local successfully"
 msgstr "Saved successfully"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "Редактировать %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "Редактировать Конфигурацию"
 
@@ -621,9 +621,9 @@ msgid "Email (*)"
 msgstr "Email (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 #, fuzzy
 msgid "Enable"
 msgstr "Включить"
@@ -657,18 +657,18 @@ msgid "Enable TLS"
 msgstr "Включить TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "Включено"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -717,16 +717,16 @@ msgstr "Экспорт"
 msgid "Fail to obtain certificate"
 msgstr "Получить сертификат"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "Не удалось отключить %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Не удалось включить %{msg}"
@@ -735,7 +735,7 @@ msgstr "Не удалось включить %{msg}"
 msgid "Failed to get certificate information"
 msgstr "Не удалось получить информацию о сертификате"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Не удалось сохранить, обнаружены синтаксические ошибки в конфигурации."
 
@@ -769,16 +769,16 @@ msgstr "Готово"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "Форматировать код"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 #, fuzzy
 msgid "Format error %{msg}"
 msgstr "Ошибка форматирования %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 #, fuzzy
 msgid "Format successfully"
 msgstr "Форматирование успешно"
@@ -1033,7 +1033,7 @@ msgstr ""
 msgid "Model"
 msgstr "Расширенный режим"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 #, fuzzy
@@ -1064,14 +1064,14 @@ msgstr "Одиночная директива"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "Имя"
 
@@ -1110,7 +1110,7 @@ msgstr "Журнал"
 msgid "Nginx Access Log Path"
 msgstr "Путь для Nginx Access Log"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Ошибка синтаксического анализа конфигурации Nginx"
@@ -1137,15 +1137,15 @@ msgstr "Nginx перезагружен успешно"
 msgid "Nginx restarted successfully"
 msgstr "Nginx успешно перезапущен"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "Нет"
 
@@ -1199,7 +1199,7 @@ msgstr ""
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1207,15 +1207,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr ""
 
@@ -1265,7 +1265,7 @@ msgstr "Пароль"
 msgid "Password (*)"
 msgstr "Пароль (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1370,7 +1370,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "Успешно сохранено"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "Восстановить ответ"
 
@@ -1407,7 +1407,7 @@ msgstr "Переустановить"
 msgid "Release Note"
 msgstr "Что нового"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "Перегрузить"
@@ -1477,11 +1477,11 @@ msgstr "Расширенный режим"
 msgid "Running"
 msgstr "Выполняется"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "Сохранить"
 
@@ -1489,7 +1489,7 @@ msgstr "Сохранить"
 msgid "Save Directive"
 msgstr "Сохранить директиву"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "Ошибка сохранения %{msg}"
@@ -1502,10 +1502,10 @@ msgstr "Ошибка сохранения %{msg}"
 msgid "Save successfully"
 msgstr "Успешно сохранено"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "Успешно сохранено"
 
@@ -1529,7 +1529,7 @@ msgstr "Отправлено"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1759,10 +1759,10 @@ msgstr "Тип"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Обновлено в"
@@ -1798,7 +1798,7 @@ msgstr "Аптайм:"
 msgid "URL"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 #, fuzzy
 msgid "User"
 msgstr "Пользователь"

+ 78 - 78
app/src/language/vi_VN/app.po

@@ -54,7 +54,7 @@ msgstr "Thêm Location"
 msgid "Add Site"
 msgstr "Thêm Website"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 #, fuzzy
 msgid "Add Stream"
 msgstr "Thêm Website"
@@ -69,7 +69,7 @@ msgstr "Cập nhật thành công"
 msgid "Additional"
 msgstr "Tùy chọn bổ sung"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "Nâng cao"
 
@@ -99,7 +99,7 @@ msgstr ""
 msgid "Are you sure you want to clear all notifications?"
 msgstr "Bạn có chắc chắn muốn xóa tất cả thông báo không ?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 #, fuzzy
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "Bạn có chắc chắn muốn xóa lịch sử trò chuyện không ?"
@@ -109,7 +109,7 @@ msgstr "Bạn có chắc chắn muốn xóa lịch sử trò chuyện không ?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Bạn chắc chắn muốn xóa nó "
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgstr "Bạn chắc chắn muốn xóa nó "
@@ -128,11 +128,11 @@ msgstr "Bạn chắc chắn muốn xoá directive này ?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Bạn chắc chắn muốn xoá location này ?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "Hỏi ChatGPT"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "Trợ lý"
 
@@ -158,9 +158,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "Đã bật tự động gia hạn SSL cho %{name}"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "Quay lại"
 
@@ -173,15 +173,15 @@ msgstr "Quay lại"
 msgid "Base information"
 msgstr "Thông tin"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 #, fuzzy
 msgid "Basic"
 msgstr "Cơ bản"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "Cơ bản"
 
@@ -203,18 +203,18 @@ msgstr ""
 msgid "CADir"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "Huỷ"
 
@@ -268,7 +268,7 @@ msgstr "Kiểm tra lại"
 msgid "Cleaning environment variables"
 msgstr "Xoá các biến môi trường"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -382,10 +382,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "Xoá"
 
@@ -404,9 +404,9 @@ msgid "Deleted successfully"
 msgstr "Đã xoá thành công"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr "Triển khai"
 
@@ -452,7 +452,7 @@ msgstr "Directives"
 msgid "Directory"
 msgstr "Thư mục"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 #, fuzzy
 msgid "Disable"
 msgstr "Tắt"
@@ -461,15 +461,15 @@ msgstr "Tắt"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Tắt tự động gia hạn SSL cho %{name} thất bại"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "Đã tắt"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "Đã tắt thành công"
@@ -503,22 +503,22 @@ msgstr[1] "Bạn có muốn triển khai tệp này đến máy chủ từ xa kh
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "Bạn muốn tắt tự động gia hạn chứng chỉ SSL ?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this site?"
 msgstr "Bạn muốn tắt trang web này ?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this stream?"
 msgstr "Bạn muốn tắt trang web này ?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this site?"
 msgstr "Bạn muốn bật trang web này ?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this stream?"
 msgstr "Bạn muốn bật trang web này ?"
@@ -565,9 +565,9 @@ msgid "Dry run mode enabled"
 msgstr "Đã bật chế độ Dry run"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "Nhân bản"
 
@@ -595,11 +595,11 @@ msgstr "Nhân bản thành công"
 msgid "Duplicate to local successfully"
 msgstr "Đã sao chép thành công vào máy cục bộ"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "Sửa %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "Sửa cấu hình"
 
@@ -622,9 +622,9 @@ msgid "Email (*)"
 msgstr "Email (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 #, fuzzy
 msgid "Enable"
 msgstr "Đã bật"
@@ -658,18 +658,18 @@ msgid "Enable TLS"
 msgstr "Bật TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "Đã bật"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -718,16 +718,16 @@ msgstr "Xuất"
 msgid "Fail to obtain certificate"
 msgstr "Nhận chứng chỉ"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "Không thể tắt %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "Không thể bật %{msg}"
@@ -736,7 +736,7 @@ msgstr "Không thể bật %{msg}"
 msgid "Failed to get certificate information"
 msgstr "Không thể truy xuất thông tin chứng chỉ"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "Không lưu được, đã phát hiện thấy (các) lỗi cú pháp trong cấu hình."
 
@@ -771,16 +771,16 @@ msgstr "Đã hoàn thành"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "Người dùng Trung Quốc: https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "Định dạng code"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 #, fuzzy
 msgid "Format error %{msg}"
 msgstr "Lưu lỗi %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 #, fuzzy
 msgid "Format successfully"
 msgstr "Định dạng thành công"
@@ -1034,7 +1034,7 @@ msgstr ""
 msgid "Model"
 msgstr "Run Mode"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 #, fuzzy
@@ -1065,14 +1065,14 @@ msgstr "Single Directive"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "Tên"
 
@@ -1110,7 +1110,7 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr "Vị trí lưu log truy cập (Access log) của Nginx"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 #, fuzzy
 msgid "Nginx Configuration Parse Error"
 msgstr "Lỗi phân tích cú pháp cấu hình Nginx"
@@ -1137,15 +1137,15 @@ msgstr "Reload Nginx thành công"
 msgid "Nginx restarted successfully"
 msgstr "Restart Nginx thành công"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "Không"
 
@@ -1199,7 +1199,7 @@ msgstr "Ngoại tuyến"
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1207,15 +1207,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr ""
 
@@ -1265,7 +1265,7 @@ msgstr "Mật khẩu"
 msgid "Password (*)"
 msgstr "Mật khẩu (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1372,7 +1372,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "Xoá thành công"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "Tạo lại câu trả lời"
 
@@ -1409,7 +1409,7 @@ msgstr "Cài lại"
 msgid "Release Note"
 msgstr "Ghi chú phát hành"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "Tải lại"
@@ -1479,11 +1479,11 @@ msgstr "Run Mode"
 msgid "Running"
 msgstr "Running"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "Lưu"
 
@@ -1491,7 +1491,7 @@ msgstr "Lưu"
 msgid "Save Directive"
 msgstr "Lưu Directive"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "Đã xảy ra lỗi khi lưu %{msg}"
@@ -1504,10 +1504,10 @@ msgstr "Đã xảy ra lỗi khi lưu %{msg}"
 msgid "Save successfully"
 msgstr "Lưu thành công"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "Lưu thành công"
 
@@ -1531,7 +1531,7 @@ msgstr "Gửi"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1757,10 +1757,10 @@ msgstr "Loại"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Ngày cập nhật"
@@ -1796,7 +1796,7 @@ msgstr "Thời gian hoạt động:"
 msgid "URL"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 #, fuzzy
 msgid "User"
 msgstr "Người dùng"

BIN
app/src/language/zh_CN/app.mo


+ 84 - 78
app/src/language/zh_CN/app.po

@@ -57,7 +57,7 @@ msgstr "添加 Location"
 msgid "Add Site"
 msgstr "添加站点"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 msgid "Add Stream"
 msgstr "添加 Stream"
 
@@ -69,7 +69,7 @@ msgstr "添加成功"
 msgid "Additional"
 msgstr "额外选项"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "高级模式"
 
@@ -98,7 +98,7 @@ msgstr "架构"
 msgid "Are you sure you want to clear all notifications?"
 msgstr "您确定要清除所有通知吗?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "你确定你要清除聊天记录吗?"
 
@@ -106,7 +106,7 @@ msgstr "你确定你要清除聊天记录吗?"
 msgid "Are you sure you want to delete this item?"
 msgstr "你确定要删除这个项目吗?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 
@@ -122,11 +122,11 @@ msgstr "您确定要删除这条指令?"
 msgid "Are you sure you want to remove this location?"
 msgstr "您确定要删除这个 Location?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "与ChatGPT聊天"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "助手"
 
@@ -152,9 +152,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "成功启用 %{name} 自动续签"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "返回"
 
@@ -166,14 +166,14 @@ msgstr "返回首页"
 msgid "Base information"
 msgstr "基本信息"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr "基本"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "基本模式"
 
@@ -194,18 +194,18 @@ msgstr "CA Dir"
 msgid "CADir"
 msgstr "CADir"
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "取消"
 
@@ -255,7 +255,7 @@ msgstr "重新检查"
 msgid "Cleaning environment variables"
 msgstr "正在清理环境变量"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -365,10 +365,10 @@ msgid "Days"
 msgstr "天"
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "删除"
 
@@ -385,9 +385,9 @@ msgid "Deleted successfully"
 msgstr "删除成功"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr "部署"
 
@@ -431,7 +431,7 @@ msgstr "指令"
 msgid "Directory"
 msgstr "目录"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 msgid "Disable"
 msgstr "禁用"
 
@@ -439,15 +439,15 @@ msgstr "禁用"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "关闭 %{name} 自动续签失败"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "禁用成功"
@@ -479,19 +479,19 @@ msgstr[0] "你想把这个文件部署到远程服务器上吗?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "你想禁用自动更新证书吗?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr "你想停用这个网站吗?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to disable this stream?"
 msgstr "你想停用这个 Stream 吗?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr "你想启用这个网站吗?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 msgid "Do you want to enable this stream?"
 msgstr "你想启用这个 Stream 吗?"
 
@@ -532,9 +532,9 @@ msgid "Dry run mode enabled"
 msgstr "试运行模式已启动"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "复制"
 
@@ -558,11 +558,11 @@ msgstr "复制成功"
 msgid "Duplicate to local successfully"
 msgstr "成功复制到本地"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "编辑 %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "编辑配置"
 
@@ -583,9 +583,9 @@ msgid "Email (*)"
 msgstr "邮箱 (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 msgid "Enable"
 msgstr "启用"
 
@@ -617,18 +617,18 @@ msgid "Enable TLS"
 msgstr "启用 TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -674,16 +674,16 @@ msgstr "导出"
 msgid "Fail to obtain certificate"
 msgstr "获取证书失败"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
@@ -692,7 +692,7 @@ msgstr "启用失败 %{msg}"
 msgid "Failed to get certificate information"
 msgstr "获取证书信息失败"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "保存失败,在配置中检测到语法错误。"
 
@@ -725,15 +725,15 @@ msgstr "完成"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "中国用户:https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "代码格式化"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 msgid "Format error %{msg}"
 msgstr "保存错误 %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 msgid "Format successfully"
 msgstr "格式化成功"
 
@@ -972,7 +972,7 @@ msgstr "分钟"
 msgid "Model"
 msgstr "模型"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 msgid "Modify"
@@ -999,14 +999,14 @@ msgstr "多行指令"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "名称"
 
@@ -1044,7 +1044,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 访问日志路径"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 msgid "Nginx Configuration Parse Error"
 msgstr "Nginx 配置解析错误"
 
@@ -1068,15 +1068,15 @@ msgstr "Nginx 重载成功"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重启成功"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "取消"
 
@@ -1127,7 +1127,7 @@ msgstr "离线"
 msgid "Ok"
 msgstr "确定"
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1135,15 +1135,15 @@ msgstr "确定"
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr "确定"
 
@@ -1192,7 +1192,7 @@ msgstr "密码"
 msgid "Password (*)"
 msgstr "密码 (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1295,7 +1295,7 @@ msgstr "恢复"
 msgid "Recovered Successfully"
 msgstr "恢复成功"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "重新生成响应"
 
@@ -1327,7 +1327,7 @@ msgstr "重新安装"
 msgid "Release Note"
 msgstr "发行日志"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "重载"
@@ -1390,11 +1390,11 @@ msgstr "运行模式"
 msgid "Running"
 msgstr "运行中"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "保存"
 
@@ -1402,7 +1402,7 @@ msgstr "保存"
 msgid "Save Directive"
 msgstr "保存指令"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
@@ -1414,10 +1414,10 @@ msgstr "保存错误 %{msg}"
 msgid "Save successfully"
 msgstr "保存成功"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "保存成功"
 
@@ -1441,7 +1441,7 @@ msgstr "上传"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1658,10 +1658,10 @@ msgstr "类型"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "修改时间"
@@ -1695,7 +1695,7 @@ msgstr "运行时间:"
 msgid "URL"
 msgstr "URL"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "User"
 msgstr "用户"
 
@@ -1774,6 +1774,12 @@ msgstr "您使用的是最新版本"
 msgid "You can check Nginx UI upgrade at this page."
 msgstr "你可以在这个页面检查Nginx UI的升级。"
 
+#~ msgid "Enable this option will significantly increase the token usage."
+#~ msgstr "启用该选项将显著增加 token 的使用量。"
+
+#~ msgid "Send Include Context"
+#~ msgstr "发送 Include 内容"
+
 #~ msgid "ChatGPT Model"
 #~ msgstr "ChatGPT 模型"
 

+ 78 - 78
app/src/language/zh_TW/app.po

@@ -59,7 +59,7 @@ msgstr "新增 Location"
 msgid "Add Site"
 msgstr "新增網站"
 
-#: src/views/stream/StreamList.vue:181
+#: src/views/stream/StreamList.vue:183
 #, fuzzy
 msgid "Add Stream"
 msgstr "新增網站"
@@ -73,7 +73,7 @@ msgstr "更新成功"
 msgid "Additional"
 msgstr "其他設定"
 
-#: src/views/domain/DomainEdit.vue:196 src/views/stream/StreamEdit.vue:188
+#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
 msgid "Advance Mode"
 msgstr "進階模式"
 
@@ -104,7 +104,7 @@ msgstr "架構"
 msgid "Are you sure you want to clear all notifications?"
 msgstr "您確定要清除聊天記錄嗎?"
 
-#: src/components/ChatGPT/ChatGPT.vue:276
+#: src/components/ChatGPT/ChatGPT.vue:267
 msgid "Are you sure you want to clear the record of chat?"
 msgstr "您確定要清除聊天記錄嗎?"
 
@@ -113,7 +113,7 @@ msgstr "您確定要清除聊天記錄嗎?"
 msgid "Are you sure you want to delete this item?"
 msgstr "您確定要刪除嗎?"
 
-#: src/views/domain/DomainList.vue:144 src/views/stream/StreamList.vue:165
+#: src/views/domain/DomainList.vue:146 src/views/stream/StreamList.vue:167
 msgid "Are you sure you want to delete?"
 msgstr "您確定要刪除嗎?"
 
@@ -130,11 +130,11 @@ msgstr "您確定要刪除這條指令嗎?"
 msgid "Are you sure you want to remove this location?"
 msgstr "您確定要刪除此 Location 嗎?"
 
-#: src/components/ChatGPT/ChatGPT.vue:220
+#: src/components/ChatGPT/ChatGPT.vue:211
 msgid "Ask ChatGPT for Help"
 msgstr "向 ChatGPT 尋求幫助"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "Assistant"
 msgstr "助理"
 
@@ -160,9 +160,9 @@ msgid "Auto-renewal enabled for %{name}"
 msgstr "已啟用 %{name} 的自動續簽"
 
 #: src/views/certificate/CertificateEditor.vue:235
-#: src/views/config/Config.vue:72 src/views/config/ConfigEdit.vue:88
-#: src/views/domain/DomainEdit.vue:253 src/views/nginx_log/NginxLog.vue:168
-#: src/views/stream/StreamEdit.vue:244
+#: src/views/config/Config.vue:73 src/views/config/ConfigEdit.vue:87
+#: src/views/domain/DomainEdit.vue:256 src/views/nginx_log/NginxLog.vue:168
+#: src/views/stream/StreamEdit.vue:247
 msgid "Back"
 msgstr "返回"
 
@@ -174,14 +174,14 @@ msgstr "返回首頁"
 msgid "Base information"
 msgstr "基本資訊"
 
-#: src/views/config/ConfigEdit.vue:116
-#: src/views/domain/components/RightSettings.vue:76
+#: src/views/config/ConfigEdit.vue:115
+#: src/views/domain/components/RightSettings.vue:75
 #: src/views/preference/Preference.vue:93
-#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/components/RightSettings.vue:74
 msgid "Basic"
 msgstr "基本"
 
-#: src/views/domain/DomainEdit.vue:199 src/views/stream/StreamEdit.vue:191
+#: src/views/domain/DomainEdit.vue:202 src/views/stream/StreamEdit.vue:194
 msgid "Basic Mode"
 msgstr "基本模式"
 
@@ -202,18 +202,18 @@ msgstr ""
 msgid "CADir"
 msgstr "CADir"
 
-#: src/components/ChatGPT/ChatGPT.vue:257
+#: src/components/ChatGPT/ChatGPT.vue:248
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:55
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:263
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:102
 #: src/views/domain/cert/components/ObtainCert.vue:137
 #: src/views/domain/components/Deploy.vue:21
-#: src/views/domain/components/RightSettings.vue:52
+#: src/views/domain/components/RightSettings.vue:51
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:50
 #: src/views/domain/ngx_conf/NgxServer.vue:84
 #: src/views/domain/ngx_conf/NgxUpstream.vue:33
 #: src/views/stream/components/Deploy.vue:21
-#: src/views/stream/components/RightSettings.vue:52
+#: src/views/stream/components/RightSettings.vue:51
 msgid "Cancel"
 msgstr "取消"
 
@@ -266,7 +266,7 @@ msgstr "再次檢查"
 msgid "Cleaning environment variables"
 msgstr "清理環境變數"
 
-#: src/components/ChatGPT/ChatGPT.vue:280
+#: src/components/ChatGPT/ChatGPT.vue:271
 #: src/components/Notification/Notification.vue:89
 #: src/views/notification/Notification.vue:75
 msgid "Clear"
@@ -379,10 +379,10 @@ msgid "Days"
 msgstr ""
 
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:516
-#: src/views/domain/DomainList.vue:153
+#: src/views/domain/DomainList.vue:155
 #: src/views/domain/ngx_conf/NgxServer.vue:114
 #: src/views/domain/ngx_conf/NgxUpstream.vue:126
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:176
 msgid "Delete"
 msgstr "刪除"
 
@@ -401,9 +401,9 @@ msgid "Deleted successfully"
 msgstr "成功停用"
 
 #: src/views/domain/components/Deploy.vue:106
-#: src/views/domain/components/RightSettings.vue:94
+#: src/views/domain/components/RightSettings.vue:93
 #: src/views/stream/components/Deploy.vue:106
-#: src/views/stream/components/RightSettings.vue:94
+#: src/views/stream/components/RightSettings.vue:92
 msgid "Deploy"
 msgstr "部署"
 
@@ -448,7 +448,7 @@ msgstr "指令"
 msgid "Directory"
 msgstr "指令"
 
-#: src/views/domain/DomainList.vue:122 src/views/stream/StreamList.vue:143
+#: src/views/domain/DomainList.vue:124 src/views/stream/StreamList.vue:145
 msgid "Disable"
 msgstr "停用"
 
@@ -456,15 +456,15 @@ msgstr "停用"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "關閉 %{name} 自動續簽失敗"
 
-#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:182
-#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:174
+#: src/views/domain/cert/ChangeCert.vue:45 src/views/domain/DomainEdit.vue:185
+#: src/views/domain/DomainList.vue:33 src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamList.vue:33
 msgid "Disabled"
 msgstr "停用"
 
-#: src/views/domain/components/RightSettings.vue:39
+#: src/views/domain/components/RightSettings.vue:38
 #: src/views/domain/DomainList.vue:67
-#: src/views/stream/components/RightSettings.vue:39
+#: src/views/stream/components/RightSettings.vue:38
 #: src/views/stream/StreamList.vue:67
 msgid "Disabled successfully"
 msgstr "成功停用"
@@ -496,20 +496,20 @@ msgstr[0] "您要將此檔案部署至遠端伺服器嗎?"
 msgid "Do you want to disable auto-cert renewal?"
 msgstr "您要停用自動憑證續訂嗎?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to disable this site?"
 msgstr "您想停用這個網站嗎?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to disable this stream?"
 msgstr "您想停用這個網站嗎?"
 
-#: src/views/domain/components/RightSettings.vue:48
+#: src/views/domain/components/RightSettings.vue:47
 msgid "Do you want to enable this site?"
 msgstr "您要啟用此網站嗎?"
 
-#: src/views/stream/components/RightSettings.vue:48
+#: src/views/stream/components/RightSettings.vue:47
 #, fuzzy
 msgid "Do you want to enable this stream?"
 msgstr "您要啟用此網站嗎?"
@@ -553,9 +553,9 @@ msgid "Dry run mode enabled"
 msgstr "試運轉模式已啟用"
 
 #: src/views/domain/components/SiteDuplicate.vue:126
-#: src/views/domain/DomainList.vue:138
+#: src/views/domain/DomainList.vue:140
 #: src/views/stream/components/StreamDuplicate.vue:126
-#: src/views/stream/StreamList.vue:159
+#: src/views/stream/StreamList.vue:161
 msgid "Duplicate"
 msgstr "複製"
 
@@ -579,11 +579,11 @@ msgstr "複製成功"
 msgid "Duplicate to local successfully"
 msgstr "成功複製至本機"
 
-#: src/views/domain/DomainEdit.vue:171 src/views/stream/StreamEdit.vue:163
+#: src/views/domain/DomainEdit.vue:174 src/views/stream/StreamEdit.vue:166
 msgid "Edit %{n}"
 msgstr "編輯 %{n}"
 
-#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:82
+#: src/routes/index.ts:109 src/views/config/ConfigEdit.vue:81
 msgid "Edit Configuration"
 msgstr "編輯設定"
 
@@ -606,9 +606,9 @@ msgid "Email (*)"
 msgstr "電子郵件 (*)"
 
 #: src/views/domain/components/Deploy.vue:86
-#: src/views/domain/DomainList.vue:130
+#: src/views/domain/DomainList.vue:132
 #: src/views/stream/components/Deploy.vue:86
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:153
 msgid "Enable"
 msgstr "啟用"
 
@@ -640,18 +640,18 @@ msgid "Enable TLS"
 msgstr "啟用 TLS"
 
 #: src/views/domain/cert/ChangeCert.vue:41
-#: src/views/domain/components/RightSettings.vue:78
-#: src/views/domain/DomainEdit.vue:176 src/views/domain/DomainList.vue:29
+#: src/views/domain/components/RightSettings.vue:77
+#: src/views/domain/DomainEdit.vue:179 src/views/domain/DomainList.vue:29
 #: src/views/preference/LogrotateSettings.vue:20
-#: src/views/stream/components/RightSettings.vue:78
-#: src/views/stream/StreamEdit.vue:168 src/views/stream/StreamList.vue:29
+#: src/views/stream/components/RightSettings.vue:76
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:29
 msgid "Enabled"
 msgstr "已啟用"
 
-#: src/views/domain/components/RightSettings.vue:30
+#: src/views/domain/components/RightSettings.vue:29
 #: src/views/domain/components/SiteDuplicate.vue:98
 #: src/views/domain/DomainAdd.vue:42 src/views/domain/DomainList.vue:57
-#: src/views/stream/components/RightSettings.vue:30
+#: src/views/stream/components/RightSettings.vue:29
 #: src/views/stream/components/StreamDuplicate.vue:98
 #: src/views/stream/StreamList.vue:57
 msgid "Enabled successfully"
@@ -699,16 +699,16 @@ msgstr "匯出"
 msgid "Fail to obtain certificate"
 msgstr "取得憑證"
 
-#: src/views/domain/components/RightSettings.vue:42
+#: src/views/domain/components/RightSettings.vue:41
 #: src/views/domain/DomainList.vue:71
-#: src/views/stream/components/RightSettings.vue:42
+#: src/views/stream/components/RightSettings.vue:41
 #: src/views/stream/StreamList.vue:71
 msgid "Failed to disable %{msg}"
 msgstr "停用 %{msg} 失敗"
 
-#: src/views/domain/components/RightSettings.vue:33
+#: src/views/domain/components/RightSettings.vue:32
 #: src/views/domain/DomainList.vue:61
-#: src/views/stream/components/RightSettings.vue:33
+#: src/views/stream/components/RightSettings.vue:32
 #: src/views/stream/StreamList.vue:61
 msgid "Failed to enable %{msg}"
 msgstr "啟用 %{msg} 失敗"
@@ -717,7 +717,7 @@ msgstr "啟用 %{msg} 失敗"
 msgid "Failed to get certificate information"
 msgstr "取得憑證資訊失敗"
 
-#: src/views/domain/DomainEdit.vue:130 src/views/stream/StreamEdit.vue:122
+#: src/views/domain/DomainEdit.vue:132 src/views/stream/StreamEdit.vue:124
 msgid "Failed to save, syntax error(s) was detected in the configuration."
 msgstr "儲存失敗,在設定中檢測到語法錯誤。"
 
@@ -752,15 +752,15 @@ msgstr "完成"
 msgid "For Chinese user: https://mirror.ghproxy.com/"
 msgstr "中國使用者:https://mirror.ghproxy.com/"
 
-#: src/views/config/ConfigEdit.vue:91
+#: src/views/config/ConfigEdit.vue:90
 msgid "Format Code"
 msgstr "格式化程式碼"
 
-#: src/views/config/ConfigEdit.vue:69
+#: src/views/config/ConfigEdit.vue:68
 msgid "Format error %{msg}"
 msgstr "格式錯誤 %{msg}"
 
-#: src/views/config/ConfigEdit.vue:67
+#: src/views/config/ConfigEdit.vue:66
 msgid "Format successfully"
 msgstr "成功格式化"
 
@@ -1008,7 +1008,7 @@ msgstr ""
 msgid "Model"
 msgstr "執行模式"
 
-#: src/components/ChatGPT/ChatGPT.vue:253
+#: src/components/ChatGPT/ChatGPT.vue:244
 #: src/components/StdDesign/StdDataDisplay/StdCurd.vue:194
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:491
 msgid "Modify"
@@ -1037,14 +1037,14 @@ msgstr "多行指令"
 #: src/views/certificate/CertificateEditor.vue:146
 #: src/views/certificate/DNSCredential.vue:10 src/views/config/config.ts:7
 #: src/views/domain/cert/ChangeCert.vue:18
-#: src/views/domain/components/RightSettings.vue:84
+#: src/views/domain/components/RightSettings.vue:83
 #: src/views/domain/components/SiteDuplicate.vue:133
 #: src/views/domain/DomainList.vue:13
 #: src/views/domain/ngx_conf/NgxUpstream.vue:175
 #: src/views/environment/Environment.vue:12
-#: src/views/stream/components/RightSettings.vue:84
+#: src/views/stream/components/RightSettings.vue:82
 #: src/views/stream/components/StreamDuplicate.vue:133
-#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:185
+#: src/views/stream/StreamList.vue:13 src/views/stream/StreamList.vue:187
 msgid "Name"
 msgstr "名稱"
 
@@ -1082,7 +1082,7 @@ msgstr "Nginx"
 msgid "Nginx Access Log Path"
 msgstr "Nginx 存取日誌路徑"
 
-#: src/views/domain/DomainEdit.vue:214 src/views/stream/StreamEdit.vue:206
+#: src/views/domain/DomainEdit.vue:217 src/views/stream/StreamEdit.vue:209
 msgid "Nginx Configuration Parse Error"
 msgstr "Nginx 設定解析錯誤"
 
@@ -1106,15 +1106,15 @@ msgstr "Nginx 重新載入成功"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重啟成功"
 
-#: src/components/ChatGPT/ChatGPT.vue:274
+#: src/components/ChatGPT/ChatGPT.vue:265
 #: src/components/Notification/Notification.vue:82
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:507
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:521
-#: src/views/domain/DomainList.vue:142
+#: src/views/domain/DomainList.vue:144
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:90
 #: src/views/domain/ngx_conf/LocationEditor.vue:71
 #: src/views/notification/Notification.vue:68
-#: src/views/stream/StreamList.vue:163
+#: src/views/stream/StreamList.vue:165
 msgid "No"
 msgstr "取消"
 
@@ -1167,7 +1167,7 @@ msgstr "離線"
 msgid "Ok"
 msgstr ""
 
-#: src/components/ChatGPT/ChatGPT.vue:275
+#: src/components/ChatGPT/ChatGPT.vue:266
 #: src/components/Notification/Notification.vue:83
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:56
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:508
@@ -1175,15 +1175,15 @@ msgstr ""
 #: src/components/StdDesign/StdDataEntry/components/StdSelector.vue:103
 #: src/views/domain/cert/components/ObtainCert.vue:136
 #: src/views/domain/components/Deploy.vue:20
-#: src/views/domain/components/RightSettings.vue:51
-#: src/views/domain/DomainList.vue:143
+#: src/views/domain/components/RightSettings.vue:50
+#: src/views/domain/DomainList.vue:145
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:49
 #: src/views/domain/ngx_conf/NgxServer.vue:83
 #: src/views/domain/ngx_conf/NgxUpstream.vue:32
 #: src/views/notification/Notification.vue:69
 #: src/views/stream/components/Deploy.vue:20
-#: src/views/stream/components/RightSettings.vue:51
-#: src/views/stream/StreamList.vue:164
+#: src/views/stream/components/RightSettings.vue:50
+#: src/views/stream/StreamList.vue:166
 msgid "OK"
 msgstr "確定"
 
@@ -1232,7 +1232,7 @@ msgstr "密碼"
 msgid "Password (*)"
 msgstr "密碼 (*)"
 
-#: src/views/config/ConfigEdit.vue:119
+#: src/views/config/ConfigEdit.vue:118
 #: src/views/domain/ngx_conf/LocationEditor.vue:119
 #: src/views/domain/ngx_conf/LocationEditor.vue:91
 msgid "Path"
@@ -1337,7 +1337,7 @@ msgstr ""
 msgid "Recovered Successfully"
 msgstr "儲存成功"
 
-#: src/components/ChatGPT/ChatGPT.vue:287
+#: src/components/ChatGPT/ChatGPT.vue:278
 msgid "Regenerate response"
 msgstr "重新產生回應"
 
@@ -1373,7 +1373,7 @@ msgstr "重新安裝"
 msgid "Release Note"
 msgstr "發行公告"
 
-#: src/components/ChatGPT/ChatGPT.vue:263
+#: src/components/ChatGPT/ChatGPT.vue:254
 #: src/components/NginxControl/NginxControl.vue:97
 msgid "Reload"
 msgstr "重新載入"
@@ -1442,11 +1442,11 @@ msgstr "執行模式"
 msgid "Running"
 msgstr "執行中"
 
-#: src/components/ChatGPT/ChatGPT.vue:256
+#: src/components/ChatGPT/ChatGPT.vue:247
 #: src/views/certificate/CertificateEditor.vue:242
-#: src/views/config/ConfigEdit.vue:97 src/views/domain/DomainEdit.vue:260
+#: src/views/config/ConfigEdit.vue:96 src/views/domain/DomainEdit.vue:263
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:120
-#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:251
+#: src/views/preference/Preference.vue:122 src/views/stream/StreamEdit.vue:254
 msgid "Save"
 msgstr "儲存"
 
@@ -1454,7 +1454,7 @@ msgstr "儲存"
 msgid "Save Directive"
 msgstr "儲存指令"
 
-#: src/views/config/ConfigEdit.vue:58 src/views/domain/DomainAdd.vue:50
+#: src/views/config/ConfigEdit.vue:57 src/views/domain/DomainAdd.vue:50
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:41
 msgid "Save error %{msg}"
 msgstr "儲存錯誤 %{msg}"
@@ -1466,10 +1466,10 @@ msgstr "儲存錯誤 %{msg}"
 msgid "Save successfully"
 msgstr "儲存成功"
 
-#: src/views/config/ConfigEdit.vue:56 src/views/domain/DomainAdd.vue:38
-#: src/views/domain/DomainEdit.vue:146
+#: src/views/config/ConfigEdit.vue:55 src/views/domain/DomainAdd.vue:38
+#: src/views/domain/DomainEdit.vue:148
 #: src/views/domain/ngx_conf/directive/DirectiveEditorItem.vue:39
-#: src/views/stream/StreamEdit.vue:138
+#: src/views/stream/StreamEdit.vue:140
 msgid "Saved successfully"
 msgstr "儲存成功"
 
@@ -1493,7 +1493,7 @@ msgstr "傳送"
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:42
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:182
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:221
-#: src/views/config/ConfigEdit.vue:41 src/views/domain/DomainList.vue:81
+#: src/views/config/ConfigEdit.vue:40 src/views/domain/DomainList.vue:81
 #: src/views/other/Install.vue:70 src/views/preference/Preference.vue:62
 #: src/views/stream/StreamList.vue:113 src/views/stream/StreamList.vue:81
 #: src/views/system/Upgrade.vue:42
@@ -1722,10 +1722,10 @@ msgstr "類型"
 
 #: src/views/certificate/ACMEUser.vue:53
 #: src/views/certificate/DNSCredential.vue:23 src/views/config/config.ts:27
-#: src/views/config/ConfigEdit.vue:122
-#: src/views/domain/components/RightSettings.vue:87
+#: src/views/config/ConfigEdit.vue:121
+#: src/views/domain/components/RightSettings.vue:86
 #: src/views/domain/DomainList.vue:41 src/views/environment/Environment.vue:95
-#: src/views/stream/components/RightSettings.vue:87
+#: src/views/stream/components/RightSettings.vue:85
 #: src/views/stream/StreamList.vue:41 src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "更新時間"
@@ -1759,7 +1759,7 @@ msgstr "運作時間:"
 msgid "URL"
 msgstr "URL"
 
-#: src/components/ChatGPT/ChatGPT.vue:234
+#: src/components/ChatGPT/ChatGPT.vue:225
 msgid "User"
 msgstr "使用者名稱"
 

+ 1 - 0
app/src/views/config/Config.vue

@@ -50,6 +50,7 @@ watch(route, () => {
       :columns="configColumns"
       disable-delete
       disable_search
+      disabled-view
       row-key="name"
       :get_params="get_params"
       @click-edit="(r, row) => {

+ 5 - 6
app/src/views/config/ConfigEdit.vue

@@ -4,7 +4,6 @@ import { message } from 'ant-design-vue'
 import type { Ref } from 'vue'
 import { formatDateTime } from '@/lib/helper'
 import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
-
 import config from '@/api/config'
 import CodeEditor from '@/components/CodeEditor/CodeEditor.vue'
 import ngx from '@/api/ngx'
@@ -26,7 +25,7 @@ const name = computed(() => {
 
 const configText = ref('')
 const history_chatgpt_record = ref([]) as Ref<ChatComplicationMessage[]>
-const file_path = ref('')
+const filepath = ref('')
 const active_key = ref(['1', '2'])
 const modified_at = ref('')
 
@@ -35,7 +34,7 @@ function init() {
     config.get(name.value).then(r => {
       configText.value = r.content
       history_chatgpt_record.value = r.chatgpt_messages
-      file_path.value = r.file_path
+      filepath.value = r.filepath
       modified_at.value = r.modified_at
     }).catch(r => {
       message.error(r.message ?? $gettext('Server error'))
@@ -44,7 +43,7 @@ function init() {
   else {
     configText.value = ''
     history_chatgpt_record.value = []
-    file_path.value = ''
+    filepath.value = ''
   }
 }
 
@@ -117,7 +116,7 @@ function format_code() {
           >
             <AForm layout="vertical">
               <AFormItem :label="$gettext('Path')">
-                {{ file_path }}
+                {{ filepath }}
               </AFormItem>
               <AFormItem :label="$gettext('Updated at')">
                 {{ formatDateTime(modified_at) }}
@@ -131,7 +130,7 @@ function format_code() {
             <ChatGPT
               v-model:history-messages="history_chatgpt_record"
               :content="configText"
-              :path="file_path"
+              :path="filepath"
             />
           </ACollapsePanel>
         </ACollapse>

+ 3 - 0
app/src/views/domain/DomainEdit.vue

@@ -33,6 +33,7 @@ const cert_info_map: Record<string, CertificateInfo> = reactive({})
 
 const auto_cert = ref(false)
 const enabled = ref(false)
+const filepath = ref('')
 const configText = ref('')
 const advance_mode_ref = ref(false)
 const saving = ref(false)
@@ -67,6 +68,7 @@ function handle_response(r: Site) {
   parse_error_status.value = false
   parse_error_message.value = ''
   filename.value = r.name
+  filepath.value = r.filepath
   configText.value = r.config
   enabled.value = r.enabled
   auto_cert.value = r.auto_cert
@@ -156,6 +158,7 @@ provide('history_chatgpt_record', history_chatgpt_record)
 provide('enabled', enabled)
 provide('name', name)
 provide('filename', filename)
+provide('filepath', filepath)
 provide('data', data)
 </script>
 

+ 2 - 0
app/src/views/domain/DomainList.vue

@@ -108,11 +108,13 @@ watch(route, () => {
       :columns="columns"
       row-key="name"
       disable-delete
+      disabled-view
       @click-edit="r => $router.push({
         path: `/domain/${r}`,
       })"
     >
       <template #actions="{ record }">
+        <ADivider type="vertical" />
         <AButton
           v-if="record.enabled"
           type="link"

+ 2 - 3
app/src/views/domain/components/RightSettings.vue

@@ -8,15 +8,14 @@ import { formatDateTime } from '@/lib/helper'
 import Deploy from '@/views/domain/components/Deploy.vue'
 import { useSettingsStore } from '@/pinia'
 import type { ChatComplicationMessage } from '@/api/openai'
-import type { NgxConfig } from '@/api/ngx'
 import type { CheckedType } from '@/types'
 
 const settings = useSettingsStore()
 
 const configText = inject('configText') as Ref<string>
-const ngx_config = inject('ngx_config') as Ref<NgxConfig>
 const enabled = inject('enabled') as Ref<boolean>
 const name = inject('name') as Ref<string>
+const filepath = inject('filepath') as Ref<string>
 const history_chatgpt_record = inject('history_chatgpt_record') as Ref<ChatComplicationMessage[]>
 const filename = inject('filename') as Ref<string | number | undefined>
 const data = inject('data') as Ref<Site>
@@ -102,7 +101,7 @@ function on_change_enabled(checked: CheckedType) {
         <ChatGPT
           v-model:history-messages="history_chatgpt_record"
           :content="configText"
-          :path="ngx_config.file_name"
+          :path="filepath"
         />
       </ACollapsePanel>
     </ACollapse>

+ 3 - 0
app/src/views/stream/StreamEdit.vue

@@ -34,6 +34,7 @@ const configText = ref('')
 const advance_mode_ref = ref(false)
 const saving = ref(false)
 const filename = ref('')
+const filepath = ref('')
 const parse_error_status = ref(false)
 const parse_error_message = ref('')
 const data = ref({})
@@ -61,6 +62,7 @@ function handle_response(r: Stream) {
   parse_error_status.value = false
   parse_error_message.value = ''
   filename.value = r.name
+  filepath.value = r.filepath
   configText.value = r.config
   enabled.value = r.enabled
   history_chatgpt_record.value = r.chatgpt_messages
@@ -148,6 +150,7 @@ provide('history_chatgpt_record', history_chatgpt_record)
 provide('enabled', enabled)
 provide('name', name)
 provide('filename', filename)
+provide('filepath', filepath)
 provide('data', data)
 </script>
 

+ 2 - 0
app/src/views/stream/StreamList.vue

@@ -129,11 +129,13 @@ function handleAddStream() {
       :columns="columns"
       row-key="name"
       disable-delete
+      disabled-view
       @click-edit="r => $router.push({
         path: `/stream/${r}`,
       })"
     >
       <template #actions="{ record }">
+        <ADivider type="vertical" />
         <AButton
           v-if="record.enabled"
           type="link"

+ 3 - 5
app/src/views/stream/components/RightSettings.vue

@@ -8,17 +8,16 @@ import { formatDateTime } from '@/lib/helper'
 import Deploy from '@/views/stream/components/Deploy.vue'
 import { useSettingsStore } from '@/pinia'
 import type { ChatComplicationMessage } from '@/api/openai'
-import type { NgxConfig } from '@/api/ngx'
 import type { CheckedType } from '@/types'
 
 const settings = useSettingsStore()
 
 const configText = inject('configText') as Ref<string>
-const ngx_config = inject('ngx_config') as Ref<NgxConfig>
 const enabled = inject('enabled') as Ref<boolean>
 const name = inject('name') as Ref<string>
 const history_chatgpt_record = inject('history_chatgpt_record') as Ref<ChatComplicationMessage[]>
-const filename = inject('filename') as Ref<string | number | undefined>
+const filename = inject('filename') as Ref<string>
+const filepath = inject('filepath') as Ref<string>
 const data = inject('data') as Ref<Stream>
 
 const [modal, ContextHolder] = Modal.useModal()
@@ -58,7 +57,6 @@ function on_change_enabled(checked: CheckedType) {
     },
   })
 }
-
 </script>
 
 <template>
@@ -102,7 +100,7 @@ function on_change_enabled(checked: CheckedType) {
         <ChatGPT
           v-model:history-messages="history_chatgpt_record"
           :content="configText"
-          :path="ngx_config.file_name"
+          :path="filepath"
         />
       </ACollapsePanel>
     </ACollapse>

+ 102 - 0
internal/chatbot/context.go

@@ -0,0 +1,102 @@
+package chatbot
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/helper"
+	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"github.com/0xJacky/Nginx-UI/internal/nginx"
+	"github.com/sashabaranov/go-openai"
+	"os"
+	"regexp"
+	"strings"
+)
+
+type includeContext struct {
+	Paths    []string
+	PathsMap map[string]bool
+}
+
+func IncludeContext(filename string) (includes []string) {
+	c := &includeContext{
+		Paths:    make([]string, 0),
+		PathsMap: make(map[string]bool),
+	}
+
+	c.extractIncludes(filename)
+
+	return c.Paths
+}
+
+// extractIncludes extracts all include statements from the given nginx configuration file.
+func (c *includeContext) extractIncludes(filename string) {
+	if !helper.FileExists(filename) {
+		logger.Error("File does not exist: ", filename)
+		return
+	}
+
+	// Read the file content
+	content, err := os.ReadFile(filename)
+	if err != nil {
+		logger.Error(err)
+		return
+	}
+
+	// Find all include statements
+	pattern := regexp.MustCompile(`(?m)^\s*include\s+([^;]+);`)
+	matches := pattern.FindAllStringSubmatch(string(content), -1)
+	for _, match := range matches {
+		if len(match) > 1 {
+			// Resolve the path of the included file
+			includePath := match[1]
+
+			// to avoid infinite loop
+			if c.PathsMap[includePath] {
+				continue
+			}
+
+			c.push(includePath)
+
+			// Recursively extract includes from the included file
+			c.extractIncludes(includePath)
+		}
+	}
+
+	return
+}
+
+func (c *includeContext) push(path string) {
+	c.Paths = append(c.Paths, path)
+	c.PathsMap[path] = true
+}
+
+// getConfigIncludeContext returns the context of the given filename.
+func getConfigIncludeContext(filename string) (multiContent []openai.ChatMessagePart) {
+	multiContent = make([]openai.ChatMessagePart, 0)
+
+	if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {
+		return
+	}
+
+	includes := IncludeContext(filename)
+	logger.Debug(includes)
+	var sb strings.Builder
+	for _, include := range includes {
+		text, _ := os.ReadFile(nginx.GetConfPath(include))
+
+		if len(text) == 0 {
+			continue
+		}
+
+		sb.WriteString("The Content of ")
+		sb.WriteString(include)
+		sb.WriteString(",")
+		sb.WriteString(string(text))
+
+		multiContent = append(multiContent, openai.ChatMessagePart{
+			Type: openai.ChatMessagePartTypeText,
+			Text: sb.String(),
+		})
+
+		sb.Reset()
+	}
+	return
+}

+ 23 - 0
internal/chatbot/context_test.go

@@ -0,0 +1,23 @@
+package chatbot
+
+import (
+	"github.com/stretchr/testify/assert"
+	"regexp"
+	"testing"
+)
+
+func TestRegex(t *testing.T) {
+	content := `
+server {
+    listen 80;
+    listen [::]:80;
+    server_name _;
+    include error_json;
+}
+`
+	pattern := regexp.MustCompile(`(?m)^\s*include\s+([^;]+);`)
+	matches := pattern.FindAllStringSubmatch(content, -1)
+
+	assert.Equal(t, 1, len(matches))
+	assert.Equal(t, "error_json", matches[0][1])
+}

+ 22 - 0
internal/chatbot/messages.go

@@ -0,0 +1,22 @@
+package chatbot
+
+import (
+    "github.com/sashabaranov/go-openai"
+)
+
+func ChatCompletionWithContext(filename string, messages []openai.ChatCompletionMessage) []openai.ChatCompletionMessage {
+
+    for i := len(messages) - 1; i >= 0; i-- {
+        if messages[i].Role == openai.ChatMessageRoleUser {
+            // openai.ChatCompletionMessage: can't use both Content and MultiContent properties simultaneously
+            multiContent := getConfigIncludeContext(filename)
+            multiContent = append(multiContent, openai.ChatMessagePart{
+                Type: openai.ChatMessagePartTypeText,
+                Text: messages[i].Content,
+            })
+            messages[i].Content = ""
+            messages[i].MultiContent = multiContent
+        }
+    }
+    return messages
+}

+ 26 - 0
internal/chatbot/messages_test.go

@@ -0,0 +1,26 @@
+package chatbot
+
+import (
+	"github.com/sashabaranov/go-openai"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestChatCompletionWithContext(t *testing.T) {
+	filename := "test"
+	messages := []openai.ChatCompletionMessage{
+		{
+			Role: openai.ChatMessageRoleSystem,
+		},
+		{
+			Role: openai.ChatMessageRoleUser,
+		},
+		{
+			Role: openai.ChatMessageRoleAssistant,
+		},
+	}
+
+	messages = ChatCompletionWithContext(filename, messages)
+
+	assert.NotNil(t, messages[1].MultiContent)
+}

+ 1 - 1
internal/config/config.go

@@ -9,7 +9,7 @@ type Config struct {
 	Name            string                         `json:"name"`
 	Content         string                         `json:"content,omitempty"`
 	ChatGPTMessages []openai.ChatCompletionMessage `json:"chatgpt_messages,omitempty"`
-	FilePath        string                         `json:"file_path,omitempty"`
+	FilePath        string                         `json:"filepath,omitempty"`
 	ModifiedAt      time.Time                      `json:"modified_at"`
 	Size            int64                          `json:"size,omitempty"`
 	IsDir           bool                           `json:"is_dir"`

+ 25 - 0
internal/helper/directory.go

@@ -0,0 +1,25 @@
+package helper
+
+import (
+	"github.com/0xJacky/Nginx-UI/internal/logger"
+	"path/filepath"
+	"strings"
+)
+
+func IsUnderDirectory(path, directory string) bool {
+	absPath, err := filepath.Abs(path)
+	if err != nil {
+		logger.Error(err)
+		return false
+	}
+
+	absDirectory, err := filepath.Abs(directory)
+	if err != nil {
+		logger.Error(err)
+		return false
+	}
+
+	absDirectory = filepath.Clean(absDirectory) + string(filepath.Separator)
+
+	return strings.HasPrefix(absPath, absDirectory)
+}

+ 11 - 0
internal/helper/directory_test.go

@@ -0,0 +1,11 @@
+package helper
+
+import (
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestIsUnderDirectory(t *testing.T) {
+	assert.Equal(t, true, IsUnderDirectory("/etc/nginx/nginx.conf", "/etc/nginx"))
+	assert.Equal(t, false, IsUnderDirectory("../../root/nginx.conf", "/etc/nginx"))
+}

+ 2 - 2
model/config_backup.go

@@ -10,7 +10,7 @@ type ConfigBackup struct {
 	Model
 
 	Name     string `json:"name"`
-	FilePath string `json:"file_path"`
+	FilePath string `json:"filepath"`
 	Content  string `json:"content" gorm:"type:text"`
 }
 
@@ -18,7 +18,7 @@ type ConfigBackupListItem struct {
 	Model
 
 	Name     string `json:"name"`
-	FilePath string `json:"file_path"`
+	FilePath string `json:"filepath"`
 }
 
 func GetBackupList(path string) (configs []ConfigBackupListItem) {

+ 3 - 3
query/config_backups.gen.go

@@ -33,7 +33,7 @@ func newConfigBackup(db *gorm.DB, opts ...gen.DOOption) configBackup {
 	_configBackup.UpdatedAt = field.NewTime(tableName, "updated_at")
 	_configBackup.DeletedAt = field.NewField(tableName, "deleted_at")
 	_configBackup.Name = field.NewString(tableName, "name")
-	_configBackup.FilePath = field.NewString(tableName, "file_path")
+	_configBackup.FilePath = field.NewString(tableName, "filepath")
 	_configBackup.Content = field.NewString(tableName, "content")
 
 	_configBackup.fillFieldMap()
@@ -73,7 +73,7 @@ func (c *configBackup) updateTableName(table string) *configBackup {
 	c.UpdatedAt = field.NewTime(table, "updated_at")
 	c.DeletedAt = field.NewField(table, "deleted_at")
 	c.Name = field.NewString(table, "name")
-	c.FilePath = field.NewString(table, "file_path")
+	c.FilePath = field.NewString(table, "filepath")
 	c.Content = field.NewString(table, "content")
 
 	c.fillFieldMap()
@@ -97,7 +97,7 @@ func (c *configBackup) fillFieldMap() {
 	c.fieldMap["updated_at"] = c.UpdatedAt
 	c.fieldMap["deleted_at"] = c.DeletedAt
 	c.fieldMap["name"] = c.Name
-	c.fieldMap["file_path"] = c.FilePath
+	c.fieldMap["filepath"] = c.FilePath
 	c.fieldMap["content"] = c.Content
 }