Jelajahi Sumber

feat(cluster): add reload and restart for nginx

Jacky 3 bulan lalu
induk
melakukan
2d437ff0cc

+ 56 - 0
.cursor/rules/backend.mdc

@@ -0,0 +1,56 @@
+---
+description: backend
+globs: 
+alwaysApply: false
+---
+# Cursor Rules
+You are an expert in Go, Gin, Gorm, Gen, Cosy (https://cosy.uozi.org/) with a deep understanding of best practices and performance optimization techniques in these technologies.
+
+## 1. Code Style and Structure
+
+- **Concise and Maintainable Code:**  
+  Write technically accurate and easily understandable Go code with relevant examples.
+
+- **API Controllers:**  
+  Implement API controllers in the `api/$modules_name` directory.
+
+- **Database Models:**  
+  Define database table models in the `model/` folder.
+
+- **Query Simplification:**  
+  Use [Gen](mdc:https:/cosy.uozi.org) to streamline query operations, reducing boilerplate code.
+
+- **Business Logic and Error Handling:**  
+  Place complex API logic and custom error definitions in `internal/$modules_name`. Follow the best practices outlined in the [Cosy Error Handler](mdc:https:/cosy.uozi.org/error-handler).
+
+- **Routing:**  
+  Register all application routes in the `router/` directory.
+
+- **Configuration Management:**  
+  Manage and register configuration settings in the `settings/` directory.
+
+## 2. CRUD Operations
+
+- **Standardized Operations:**  
+  Utilize [Cosy](mdc:https:/cosy.uozi.org) to implement Create, Read, Update, and Delete (CRUD) operations consistently across the project.
+
+## 3. Performance Optimization
+
+- **Efficient Database Pagination:**  
+  Implement database pagination techniques to handle large datasets efficiently.
+
+- **Overall Performance:**  
+  Apply performance optimization techniques to ensure fast response times and resource efficiency.
+
+## 4. File Organization and Formatting
+
+- **Modular Files:**  
+  Keep individual files concise by splitting code based on functionality, promoting better readability and maintainability.
+
+- **Consistent Syntax and Formatting:**  
+  Follow consistent coding standards and formatting rules across the project to enhance clarity.
+
+## 5. Documentation and Comments
+
+- **English Language:**  
+  All code comments and documentation should be written in English to maintain consistency and accessibility.

+ 44 - 0
.cursor/rules/frontend.mdc

@@ -0,0 +1,44 @@
+---
+description: frontend
+globs: 
+alwaysApply: false
+---
+You are an expert in TypeScript, Node.js, Vite, Vue.js, Vue Router, Pinia, VueUse, Ant Design Vue, and UnoCSS, with a deep understanding of best practices and performance optimization techniques in these technologies.
+  
+    Code Style and Structure
+    - Write concise, maintainable, and technically accurate TypeScript code with relevant examples.
+    - Use functional and declarative programming patterns; avoid classes.
+    - Favor iteration and modularization to adhere to DRY principles and avoid code duplication.
+    - Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError).
+    - Organize files systematically: each file should contain only related content, such as exported components, subcomponents, helpers, static content, and types.
+    - Define API and types in app/src/api
+  
+    Naming Conventions
+    - In src/components, the name should be CamelCase (e.g., app/src/components/ChatGPT/ChatGPT.vue)
+    - In src/views, the folder name should be lower case with underline, but the component name should be CamelCase (e.g., app/src/views/system/About.vue)
+    - Favor named exports for functions.
+  
+    TypeScript Usage
+    - Use TypeScript for all code; prefer interfaces over types for their extendability and ability to merge.
+  
+    Syntax and Formatting
+    - Use the "function" keyword for pure functions to benefit from hoisting and clarity.
+    - Always use the Vue Composition API script setup style.
+    - Use Vue3.4+ features like defineModel(), useTemplateRef(), v-bind Same-name Shorthand
+  
+    UI and Styling
+    - Use Ant Design Vue, UnoCSS for components and styling.
+    - Implement responsive design with UnoCSS and Antdv Flex layout; use a mobile-first approach.
+  
+    Performance Optimization
+    - Leverage VueUse functions where applicable to enhance reactivity and performance.
+    - Wrap asynchronous components in Suspense with a fallback UI.
+    - Use dynamic loading for non-critical components.
+    - Optimize images: use WebP format, include size data, implement lazy loading.
+    - Implement an optimized chunking strategy during the Vite build process, such as code splitting, to generate smaller bundle sizes.
+  
+    Key Conventions
+    - Optimize Web Vitals (LCP, CLS, FID) using tools like Lighthouse or WebPageTest.
+
+    Comments
+    - Always response in English

+ 34 - 0
api/cluster/group.go

@@ -1,6 +1,8 @@
 package cluster
 package cluster
 
 
 import (
 import (
+	"net/http"
+
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/0xJacky/Nginx-UI/model"
 	"github.com/gin-gonic/gin"
 	"github.com/gin-gonic/gin"
 	"github.com/uozi-tech/cosy"
 	"github.com/uozi-tech/cosy"
@@ -17,6 +19,38 @@ func GetGroupList(c *gin.Context) {
 	}).PagingList()
 	}).PagingList()
 }
 }
 
 
+func ReloadNginx(c *gin.Context) {
+	var json struct {
+		NodeIDs []uint64 `json:"node_ids" binding:"required"`
+	}
+
+	if !cosy.BindAndValid(c, &json) {
+		return
+	}
+
+	go syncReload(json.NodeIDs)
+
+	c.JSON(http.StatusOK, gin.H{
+		"message": "ok",
+	})
+}
+
+func RestartNginx(c *gin.Context) {
+	var json struct {
+		NodeIDs []uint64 `json:"node_ids" binding:"required"`
+	}
+
+	if !cosy.BindAndValid(c, &json) {
+		return
+	}
+
+	go syncRestart(json.NodeIDs)
+
+	c.JSON(http.StatusOK, gin.H{
+		"message": "ok",
+	})
+}
+
 func AddGroup(c *gin.Context) {
 func AddGroup(c *gin.Context) {
 	cosy.Core[model.EnvGroup](c).
 	cosy.Core[model.EnvGroup](c).
 		SetValidRules(gin.H{
 		SetValidRules(gin.H{

+ 126 - 0
api/cluster/nginx.go

@@ -0,0 +1,126 @@
+package cluster
+
+import (
+	"net/http"
+	"runtime"
+	"sync"
+
+	"github.com/0xJacky/Nginx-UI/internal/notification"
+	"github.com/0xJacky/Nginx-UI/model"
+	"github.com/0xJacky/Nginx-UI/query"
+	"github.com/go-resty/resty/v2"
+	"github.com/uozi-tech/cosy/logger"
+)
+
+type syncResult struct {
+	Node string `json:"node"`
+	Resp string `json:"resp"`
+}
+
+// syncReload handle reload nginx on remote nodes
+func syncReload(nodeIDs []uint64) {
+	if len(nodeIDs) == 0 {
+		return
+	}
+
+	e := query.Environment
+	nodes, err := e.Where(e.ID.In(nodeIDs...)).Find()
+	if err != nil {
+		logger.Error("Failed to get environment nodes:", err)
+		return
+	}
+
+	wg := &sync.WaitGroup{}
+	wg.Add(len(nodes))
+
+	for _, node := range nodes {
+		go func(node *model.Environment) {
+			defer func() {
+				if err := recover(); err != nil {
+					buf := make([]byte, 1024)
+					runtime.Stack(buf, false)
+					logger.Error(err)
+				}
+			}()
+			defer wg.Done()
+
+			client := resty.New()
+			client.SetBaseURL(node.URL)
+			resp, err := client.R().
+				SetHeader("X-Node-Secret", node.Token).
+				Post("/api/nginx/reload")
+			if err != nil {
+				notification.Error("Reload Remote Nginx Error", "", err.Error())
+				return
+			}
+			if resp.StatusCode() != http.StatusOK {
+				notification.Error("Reload Remote Nginx Error",
+					"Reload Nginx on %{node} failed, response: %{resp}", syncResult{
+						Node: node.Name,
+						Resp: resp.String(),
+					})
+				return
+			}
+			notification.Success("Reload Remote Nginx Success",
+				"Reload Nginx on %{node} successfully", syncResult{
+					Node: node.Name,
+				})
+		}(node)
+	}
+
+	wg.Wait()
+}
+
+// syncRestart handle restart nginx on remote nodes
+func syncRestart(nodeIDs []uint64) {
+	if len(nodeIDs) == 0 {
+		return
+	}
+
+	e := query.Environment
+	nodes, err := e.Where(e.ID.In(nodeIDs...)).Find()
+	if err != nil {
+		logger.Error("Failed to get environment nodes:", err)
+		return
+	}
+
+	wg := &sync.WaitGroup{}
+	wg.Add(len(nodes))
+
+	for _, node := range nodes {
+		go func(node *model.Environment) {
+			defer func() {
+				if err := recover(); err != nil {
+					buf := make([]byte, 1024)
+					runtime.Stack(buf, false)
+					logger.Error(err)
+				}
+			}()
+			defer wg.Done()
+
+			client := resty.New()
+			client.SetBaseURL(node.URL)
+			resp, err := client.R().
+				SetHeader("X-Node-Secret", node.Token).
+				Post("/api/nginx/restart")
+			if err != nil {
+				notification.Error("Restart Remote Nginx Error", "", err.Error())
+				return
+			}
+			if resp.StatusCode() != http.StatusOK {
+				notification.Error("Restart Remote Nginx Error",
+					"Restart Nginx on %{node} failed, response: %{resp}", syncResult{
+						Node: node.Name,
+						Resp: resp.String(),
+					})
+				return
+			}
+			notification.Success("Restart Remote Nginx Success",
+				"Restart Nginx on %{node} successfully", syncResult{
+					Node: node.Name,
+				})
+		}(node)
+	}
+
+	wg.Wait()
+}

+ 3 - 0
api/cluster/router.go

@@ -17,6 +17,9 @@ func InitRouter(r *gin.RouterGroup) {
 	// Node
 	// Node
 	r.GET("node", GetCurrentNode)
 	r.GET("node", GetCurrentNode)
 
 
+	r.POST("environments/reload_nginx", ReloadNginx)
+	r.POST("environments/restart_nginx", RestartNginx)
+
 	r.GET("env_groups", GetGroupList)
 	r.GET("env_groups", GetGroupList)
 	r.GET("env_groups/:id", GetGroup)
 	r.GET("env_groups/:id", GetGroup)
 	r.POST("env_groups", AddGroup)
 	r.POST("env_groups", AddGroup)

+ 2 - 0
app/components.d.ts

@@ -77,6 +77,8 @@ declare module 'vue' {
     ChartUsageProgressLine: typeof import('./src/components/Chart/UsageProgressLine.vue')['default']
     ChartUsageProgressLine: typeof import('./src/components/Chart/UsageProgressLine.vue')['default']
     ChatGPTChatGPT: typeof import('./src/components/ChatGPT/ChatGPT.vue')['default']
     ChatGPTChatGPT: typeof import('./src/components/ChatGPT/ChatGPT.vue')['default']
     CodeEditorCodeEditor: typeof import('./src/components/CodeEditor/CodeEditor.vue')['default']
     CodeEditorCodeEditor: typeof import('./src/components/CodeEditor/CodeEditor.vue')['default']
+    EnvGroupTabs: typeof import('./src/components/EnvGroupTabs/EnvGroupTabs.vue')['default']
+    EnvGroupTabsEnvGroupTabs: typeof import('./src/components/EnvGroupTabs/EnvGroupTabs.vue')['default']
     EnvIndicatorEnvIndicator: typeof import('./src/components/EnvIndicator/EnvIndicator.vue')['default']
     EnvIndicatorEnvIndicator: typeof import('./src/components/EnvIndicator/EnvIndicator.vue')['default']
     FooterToolbarFooterToolBar: typeof import('./src/components/FooterToolbar/FooterToolBar.vue')['default']
     FooterToolbarFooterToolBar: typeof import('./src/components/FooterToolbar/FooterToolBar.vue')['default']
     ICPICP: typeof import('./src/components/ICP/ICP.vue')['default']
     ICPICP: typeof import('./src/components/ICP/ICP.vue')['default']

+ 14 - 0
app/src/api/node.ts

@@ -0,0 +1,14 @@
+import http from '@/lib/http'
+
+function reloadNginx(nodeIds: number[]) {
+  return http.post('/environments/reload_nginx', { node_ids: nodeIds })
+}
+
+function restartNginx(nodeIds: number[]) {
+  return http.post('/environments/restart_nginx', { node_ids: nodeIds })
+}
+
+export default {
+  reloadNginx,
+  restartNginx,
+}

+ 195 - 0
app/src/components/EnvGroupTabs/EnvGroupTabs.vue

@@ -0,0 +1,195 @@
+<script setup lang="ts">
+import type { EnvGroup } from '@/api/env_group'
+import type { Environment } from '@/api/environment'
+import nodeApi from '@/api/node'
+import { useUserStore } from '@/pinia'
+import { message } from 'ant-design-vue'
+import { SSE } from 'sse.js'
+
+const props = defineProps<{
+  envGroups: EnvGroup[]
+}>()
+
+const modelValue = defineModel<string | number>('activeKey')
+const { token } = storeToRefs(useUserStore())
+
+const environments = ref<Environment[]>([])
+const environmentsMap = ref<Record<number, Environment>>({})
+const sse = shallowRef<SSE>()
+const loading = ref({
+  reload: false,
+  restart: false,
+})
+
+// Get node data when tab is not 'All'
+watch(modelValue, newVal => {
+  if (newVal && newVal !== 0) {
+    connectSSE()
+  }
+  else {
+    disconnectSSE()
+  }
+}, { immediate: true })
+
+onUnmounted(() => {
+  disconnectSSE()
+})
+
+function connectSSE() {
+  disconnectSSE()
+
+  const s = new SSE('api/environments/enabled', {
+    headers: {
+      Authorization: token.value,
+    },
+  })
+
+  s.onmessage = e => {
+    environments.value = JSON.parse(e.data)
+    environmentsMap.value = environments.value.reduce((acc, node) => {
+      acc[node.id] = node
+      return acc
+    }, {} as Record<number, Environment>)
+  }
+
+  s.onerror = () => {
+    setTimeout(() => {
+      connectSSE()
+    }, 5000)
+  }
+
+  sse.value = s
+}
+
+function disconnectSSE() {
+  if (sse.value) {
+    sse.value.close()
+    sse.value = undefined
+  }
+}
+
+// Get the current environment group data
+const currentEnvGroup = computed(() => {
+  if (!modelValue.value || modelValue.value === 0)
+    return null
+  return props.envGroups.find(g => g.id === Number(modelValue.value))
+})
+
+// Get the list of nodes in the current group
+const syncNodes = computed(() => {
+  if (!currentEnvGroup.value)
+    return []
+
+  if (!currentEnvGroup.value.sync_node_ids)
+    return []
+
+  return currentEnvGroup.value.sync_node_ids
+    .map(id => environmentsMap.value[id])
+    .filter(Boolean)
+})
+
+// Handle reload Nginx on all sync nodes
+async function handleReloadNginx() {
+  if (!currentEnvGroup.value || !syncNodes.value.length)
+    return
+
+  const nodeIds = syncNodes.value.map(node => node.id)
+
+  loading.value.reload = true
+  try {
+    await nodeApi.reloadNginx(nodeIds)
+  }
+  catch (error) {
+    console.error(error)
+    message.error($gettext('Reload request failed, please check your network connection'))
+  }
+  finally {
+    loading.value.reload = false
+  }
+}
+
+// Handle restart Nginx on all sync nodes
+async function handleRestartNginx() {
+  if (!currentEnvGroup.value || !syncNodes.value.length)
+    return
+
+  const nodeIds = syncNodes.value.map(node => node.id)
+
+  loading.value.restart = true
+  try {
+    await nodeApi.restartNginx(nodeIds)
+  }
+  catch (error) {
+    console.error(error)
+    message.error($gettext('Restart request failed, please check your network connection'))
+  }
+  finally {
+    loading.value.restart = false
+  }
+}
+</script>
+
+<template>
+  <div>
+    <ATabs :active-key="modelValue" @update:active-key="modelValue = $event">
+      <ATabPane :key="0" :tab="$gettext('All')" />
+      <ATabPane v-for="c in envGroups" :key="c.id" :tab="c.name" />
+    </ATabs>
+
+    <!-- Display node information -->
+    <ACard
+      v-if="modelValue && modelValue !== 0 && syncNodes.length > 0"
+      :title="$gettext('Sync Nodes')"
+      size="small"
+      class="mb-4"
+    >
+      <template #extra>
+        <ASpace>
+          <APopconfirm
+            :title="$gettext('Are you sure you want to reload Nginx on the following sync nodes?')"
+            :ok-text="$gettext('Yes')"
+            :cancel-text="$gettext('No')"
+            placement="bottom"
+            @confirm="handleReloadNginx"
+          >
+            <AButton type="link" size="small" :loading="loading.reload">
+              {{ $gettext('Reload Nginx') }}
+            </AButton>
+          </APopconfirm>
+
+          <APopconfirm
+            :title="$gettext('Are you sure you want to restart Nginx on the following sync nodes?')"
+            :ok-text="$gettext('Yes')"
+            :cancel-text="$gettext('No')"
+            placement="bottomRight"
+            @confirm="handleRestartNginx"
+          >
+            <AButton type="link" danger size="small" :loading="loading.restart">
+              {{ $gettext('Restart Nginx') }}
+            </AButton>
+          </APopconfirm>
+        </ASpace>
+      </template>
+
+      <ARow :gutter="[16, 16]">
+        <ACol v-for="node in syncNodes" :key="node.id" :xs="24" :sm="12" :md="8" :lg="6" :xl="4">
+          <div class="node-item">
+            <span class="node-name">{{ node.name }}</span>
+            <ATag :color="node.status ? 'green' : 'error'">
+              {{ node.status ? $gettext('Online') : $gettext('Offline') }}
+            </ATag>
+          </div>
+        </ACol>
+      </ARow>
+    </ACard>
+  </div>
+</template>
+
+<style scoped>
+.node-name {
+  margin-right: 8px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>

+ 18 - 0
app/src/components/Notification/notifications.ts

@@ -10,6 +10,24 @@ const notifications: Record<string, { title: () => string, content: (args: any)
     content: (args: any) => $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.', args),
     content: (args: any) => $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.', args),
   },
   },
 
 
+  // cluster module notifications
+  'Reload Remote Nginx Error': {
+    title: () => $gettext('Reload Remote Nginx Error'),
+    content: (args: any) => $gettext('Reload Nginx on %{node} failed, response: %{resp}', args),
+  },
+  'Reload Remote Nginx Success': {
+    title: () => $gettext('Reload Remote Nginx Success'),
+    content: (args: any) => $gettext('Reload Nginx on %{node} successfully', args),
+  },
+  'Restart Remote Nginx Error': {
+    title: () => $gettext('Restart Remote Nginx Error'),
+    content: (args: any) => $gettext('Restart Nginx on %{node} failed, response: %{resp}', args),
+  },
+  'Restart Remote Nginx Success': {
+    title: () => $gettext('Restart Remote Nginx Success'),
+    content: (args: any) => $gettext('Restart Nginx on %{node} successfully', args),
+  },
+
   // cert module notifications
   // cert module notifications
   'Sync Certificate Error': {
   'Sync Certificate Error': {
     title: () => $gettext('Sync Certificate Error'),
     title: () => $gettext('Sync Certificate Error'),

+ 194 - 100
app/src/language/ar/app.po

@@ -48,7 +48,7 @@ msgstr "مستخدم ACME"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "إجراء"
 msgstr "إجراء"
@@ -59,7 +59,7 @@ msgstr "إجراء"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "إضافة"
 msgstr "إضافة"
 
 
@@ -86,11 +86,11 @@ msgstr "أضف مكان"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "أضف موقع"
 msgstr "أضف موقع"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "أضف Stream"
 msgstr "أضف Stream"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "تمت الإضافة بنجاح"
 msgstr "تمت الإضافة بنجاح"
 
 
@@ -107,8 +107,8 @@ msgstr "الوضع المتقدم"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر فوق إضافة مفتاح مرور مرة أخرى."
 msgstr "بعد ذلك، قم بتحديث هذه الصفحة وانقر فوق إضافة مفتاح مرور مرة أخرى."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "الكل"
 msgstr "الكل"
 
 
@@ -194,8 +194,8 @@ msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر نها
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر؟"
 msgstr "هل أنت متأكد أنك تريد حذف هذا العنصر؟"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "هل أنت متأكد أنك تريد الحذف؟"
 msgstr "هل أنت متأكد أنك تريد الحذف؟"
 
 
@@ -203,6 +203,11 @@ msgstr "هل أنت متأكد أنك تريد الحذف؟"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "هل أنت متأكد أنك تريد استرداد هذا العنصر؟"
 msgstr "هل أنت متأكد أنك تريد استرداد هذا العنصر؟"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "هل أنت متأكد أنك تريد الحذف؟"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "هل أنت متأكد أنك تريد إزالة هذا التوجيه؟"
 msgstr "هل أنت متأكد أنك تريد إزالة هذا التوجيه؟"
@@ -215,6 +220,11 @@ msgstr "هل أنت متأكد أنك تريد إزالة هذا العنصر؟"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "هل أنت متأكد أنك تريد إزالة هذا المكان؟"
 msgstr "هل أنت متأكد أنك تريد إزالة هذا المكان؟"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "هل أنت متأكد أنك تريد مسح كافة التنبيهات؟"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "اطلب المساعدة من ChatGPT"
 msgstr "اطلب المساعدة من ChatGPT"
@@ -700,8 +710,8 @@ msgstr "وصف"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "حذف"
 msgstr "حذف"
 
 
@@ -710,49 +720,49 @@ msgstr "حذف"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "حذف نهائي"
 msgstr "حذف نهائي"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "خطأ حذف الموقع البعيد"
 msgstr "خطأ حذف الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "نجح حذف الموقع البعيد"
 msgstr "نجح حذف الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "خطأ حذف الموقع البعيد"
 msgstr "خطأ حذف الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "نجح حذف الموقع البعيد"
 msgstr "نجح حذف الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح"
 msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "حذف الموقع: ‎%{site_name}"
 msgstr "حذف الموقع: ‎%{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح"
 msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "حذف البث: ‎%{stream_name}"
 msgstr "حذف البث: ‎%{stream_name}"
 
 
@@ -805,8 +815,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "توجيهات"
 msgstr "توجيهات"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "تعطيل"
 msgstr "تعطيل"
 
 
@@ -814,40 +824,40 @@ msgstr "تعطيل"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "فشل تعطيل التجديد التلقائي لـ {name}%"
 msgstr "فشل تعطيل التجديد التلقائي لـ {name}%"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "خطأ في تعطيل الموقع البعيد"
 msgstr "خطأ في تعطيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "تعطيل الموقع البعيد بنجاح"
 msgstr "تعطيل الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "خطأ في تعطيل الموقع البعيد"
 msgstr "خطأ في تعطيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "تعطيل الموقع البعيد بنجاح"
 msgstr "تعطيل الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
@@ -860,14 +870,14 @@ msgstr "تم تعطيل الموقع %{site} على %{node} بنجاح"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "معطل"
 msgstr "معطل"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "تم التعطيل بنجاح"
 msgstr "تم التعطيل بنجاح"
 
 
@@ -967,9 +977,9 @@ msgstr ""
 "الويب غير HTTPS، إلا عند التشغيل على localhost."
 "الويب غير HTTPS، إلا عند التشغيل على localhost."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "مكرر"
 msgstr "مكرر"
 
 
@@ -1009,8 +1019,8 @@ msgstr "بريد إلكتروني"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "البريد الإلكتروني (*)"
 msgstr "البريد الإلكتروني (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "تفعيل"
 msgstr "تفعيل"
 
 
@@ -1031,40 +1041,40 @@ msgstr "فشل التفعيل"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "تفعيل TOTP"
 msgstr "تفعيل TOTP"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "خطأ في تفعيل الموقع البعيد"
 msgstr "خطأ في تفعيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "نجح تفعيل الموقع البعيد"
 msgstr "نجح تفعيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "خطأ في تفعيل الموقع البعيد"
 msgstr "خطأ في تفعيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "نجح تفعيل الموقع البعيد"
 msgstr "نجح تفعيل الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح"
 msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 msgstr "فشل تفعيل %{conf_name} في %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح"
 msgstr "تم تفعيل الموقع %{site} على %{node} بنجاح"
@@ -1088,16 +1098,16 @@ msgstr "تفعيل TOTP"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "مفعل"
 msgstr "مفعل"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "تم التفعيل بنجاح"
 msgstr "تم التفعيل بنجاح"
 
 
@@ -1108,7 +1118,7 @@ msgstr "تشفير الموقع باستخدام Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "بيئة"
 msgstr "بيئة"
@@ -1124,7 +1134,7 @@ msgstr "تم تنظيف متغيرات البيئة"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "البيئات"
 msgstr "البيئات"
 
 
@@ -1299,16 +1309,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "فشل في تعطيل %{msg}"
 msgstr "فشل في تعطيل %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "فشل في التفعيل %{msg}"
 msgstr "فشل في التفعيل %{msg}"
 
 
@@ -1812,11 +1822,11 @@ msgstr "قائمة"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "متوسط التحميل:"
 msgstr "متوسط التحميل:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "تحميل من الإعدادات"
 msgstr "تحميل من الإعدادات"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "تم التحميل بنجاح"
 msgstr "تم التحميل بنجاح"
 
 
@@ -1887,11 +1897,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "إدارة التكوينات"
 msgstr "إدارة التكوينات"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "إدارة المواقع"
 msgstr "إدارة المواقع"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "إدارة التدفقات"
 msgstr "إدارة التدفقات"
 
 
@@ -1964,7 +1974,7 @@ msgstr "توجيه متعدد الأسطر"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "اسم"
 msgstr "اسم"
 
 
@@ -2091,6 +2101,10 @@ msgstr "مسار PID لـ Nginx"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "أمر إعادة تحميل Nginx"
 msgstr "أمر إعادة تحميل Nginx"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "تم إعادة تحميل Nginx بنجاح"
 msgstr "تم إعادة تحميل Nginx بنجاح"
@@ -2099,6 +2113,10 @@ msgstr "تم إعادة تحميل Nginx بنجاح"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "أمر إعادة تشغيل Nginx"
 msgstr "أمر إعادة تشغيل Nginx"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "تم إعادة تشغيل Nginx بنجاح"
 msgstr "تم إعادة تشغيل Nginx بنجاح"
@@ -2126,6 +2144,8 @@ msgid ""
 msgstr "خطأ في تحليل تكوين Nginx"
 msgstr "خطأ في تحليل تكوين Nginx"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2137,8 +2157,8 @@ msgstr "خطأ في تحليل تكوين Nginx"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "لا"
 msgstr "لا"
 
 
@@ -2215,6 +2235,7 @@ msgstr ""
 "قد يتسبب وجوب تثبيت OCSP في حدوث أخطاء لبعض المستخدمين عند الوصول لأول مرة "
 "قد يتسبب وجوب تثبيت OCSP في حدوث أخطاء لبعض المستخدمين عند الوصول لأول مرة "
 "باستخدام Firefox."
 "باستخدام Firefox."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2238,9 +2259,9 @@ msgstr "حسنًا"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "حسنًا"
 msgstr "حسنًا"
@@ -2249,6 +2270,7 @@ msgstr "حسنًا"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلات."
 msgstr "بمجرد اكتمال التحقق، سيتم إزالة السجلات."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2464,7 +2486,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "يرجى اختيار عقدة واحدة على الأقل!"
 msgstr "يرجى اختيار عقدة واحدة على الأقل!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "يرجى اختيار عقدة واحدة على الأقل للترقية"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "يرجى اختيار عقدة واحدة على الأقل للترقية"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "يرجى اختيار عقدة واحدة على الأقل للترقية"
 msgstr "يرجى اختيار عقدة واحدة على الأقل للترقية"
 
 
@@ -2604,6 +2638,37 @@ msgstr "ملاحظة الإصدار"
 msgid "Reload"
 msgid "Reload"
 msgstr "إعادة تحميل"
 msgstr "إعادة تحميل"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "إعادة تحميل nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "خطأ في إزالة الموقع %{site} من %{node}، الاستجابة: %{resp}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "تمت ترقية Nginx UI على %{node} بنجاح 🎉"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "خطأ في إعادة تسمية الموقع البعيد"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "إعادة التحميل"
 msgstr "إعادة التحميل"
@@ -2634,57 +2699,57 @@ msgstr "تمت الإزالة بنجاح"
 msgid "Rename"
 msgid "Rename"
 msgstr "إعادة تسمية"
 msgstr "إعادة تسمية"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح"
 msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح"
 msgstr "تم إعادة تسمية %{orig_path} إلى %{new_path} على %{env_name} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "خطأ في إعادة تسمية التكوين البعيد"
 msgstr "خطأ في إعادة تسمية التكوين البعيد"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "إعادة تسمية تكوين البعيد بنجاح"
 msgstr "إعادة تسمية تكوين البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "خطأ في إعادة تسمية الموقع البعيد"
 msgstr "خطأ في إعادة تسمية الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
 msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "خطأ في إعادة تسمية الموقع البعيد"
 msgstr "خطأ في إعادة تسمية الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
 msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
 msgstr "إعادة تسمية الموقع %{site} إلى %{new_site} على %{node} بنجاح"
@@ -2737,6 +2802,37 @@ msgstr "إعادة تعيين التحقق بخطوتين"
 msgid "Restart"
 msgid "Restart"
 msgstr "إعادة تشغيل"
 msgstr "إعادة تشغيل"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "إعادة التشغيل"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "خطأ في تفعيل الموقع %{site} على %{node}، الاستجابة: %{resp}"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "تمت ترقية Nginx UI على %{node} بنجاح 🎉"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "خطأ في إعادة تسمية الموقع البعيد"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "تم إعادة تسمية الموقع البعيد بنجاح"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "إعادة التشغيل"
 msgstr "إعادة التشغيل"
@@ -2809,40 +2905,40 @@ msgstr "حفظ التوجيه"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "خطأ في الحفظ %{msg}"
 msgstr "خطأ في الحفظ %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "خطأ في حفظ الموقع البعيد"
 msgstr "خطأ في حفظ الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "حفظ الموقع البعيد بنجاح"
 msgstr "حفظ الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "خطأ في حفظ الموقع البعيد"
 msgstr "خطأ في حفظ الموقع البعيد"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "حفظ الموقع البعيد بنجاح"
 msgstr "حفظ الموقع البعيد بنجاح"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 msgstr "فشل نشر {conf_name}% إلى {node_name}%"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
 msgstr "تم حفظ الموقع %{site} إلى %{node} بنجاح"
@@ -3072,7 +3168,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "الحالة"
 msgstr "الحالة"
 
 
@@ -3148,41 +3244,42 @@ msgstr "مزامنة"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "مزامنة الشهادة"
 msgstr "مزامنة الشهادة"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}"
 msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}"
 msgstr "نجح مزامنة الشهادة %{cert_name} إلى %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "خطأ في مزامنة الشهادة"
 msgstr "خطأ في مزامنة الشهادة"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "تمت مزامنة الشهادة بنجاح"
 msgstr "تمت مزامنة الشهادة بنجاح"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح"
 msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح"
 msgstr "تمت مزامنة التكوين %{config_name} إلى %{env_name} بنجاح"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "خطأ في تزامن التكوين"
 msgstr "خطأ في تزامن التكوين"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "تمت مزامنة التكوين بنجاح"
 msgstr "تمت مزامنة التكوين بنجاح"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr "مزامنة العقد"
 msgstr "مزامنة العقد"
@@ -3521,7 +3618,7 @@ msgstr "تم التحديث بنجاح"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "محدث في"
 msgstr "محدث في"
 
 
@@ -3530,7 +3627,8 @@ msgid "Updated successfully"
 msgstr "تم التحديث بنجاح"
 msgstr "تم التحديث بنجاح"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "ترقية"
 msgstr "ترقية"
@@ -3717,6 +3815,8 @@ msgstr "كتابة مفتاح الشهادة الخاص إلى القرص"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "كتابة الشهادة إلى القرص"
 msgstr "كتابة الشهادة إلى القرص"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3813,18 +3913,12 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "تم تفعيل %{conf_name} في %{node_name} بنجاح"
 #~ msgstr "تم تفعيل %{conf_name} في %{node_name} بنجاح"
 
 
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "خطأ في تفعيل الموقع %{site} على %{node}، الاستجابة: %{resp}"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "تم التفعيل بنجاح"
 #~ msgstr "تم التفعيل بنجاح"
 
 
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "يرجى ترقية واجهة Nginx البعيدة إلى أحدث إصدار"
 #~ msgstr "يرجى ترقية واجهة Nginx البعيدة إلى أحدث إصدار"
 
 
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "خطأ في إزالة الموقع %{site} من %{node}، الاستجابة: %{resp}"
-
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "%{resp}"
 #~ "%{resp}"

+ 194 - 102
app/src/language/de_DE/app.po

@@ -45,7 +45,7 @@ msgstr "Benutzername"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Aktion"
 msgstr "Aktion"
@@ -56,7 +56,7 @@ msgstr "Aktion"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Hinzufügen"
 msgstr "Hinzufügen"
 
 
@@ -84,12 +84,12 @@ msgstr "Ort hinzufügen"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Seite hinzufügen"
 msgstr "Seite hinzufügen"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 #, fuzzy
 #, fuzzy
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Seite hinzufügen"
 msgstr "Seite hinzufügen"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #, fuzzy
 #, fuzzy
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
@@ -110,8 +110,8 @@ msgstr ""
 "Anschließend diese Seite aktualisieren und erneut auf Passkey hinzufügen "
 "Anschließend diese Seite aktualisieren und erneut auf Passkey hinzufügen "
 "klicken."
 "klicken."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "Alle"
 msgstr "Alle"
 
 
@@ -203,8 +203,8 @@ msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 #, fuzzy
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
@@ -214,6 +214,11 @@ msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #, fuzzy
 #, fuzzy
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
@@ -229,6 +234,11 @@ msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "Bist du sicher, dass du diese Richtlinie löschen möchtest?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "Frage ChatGPT um Hilfe"
 msgstr "Frage ChatGPT um Hilfe"
@@ -725,8 +735,8 @@ msgstr "Beschreibung"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Löschen"
 msgstr "Löschen"
 
 
@@ -735,51 +745,51 @@ msgstr "Löschen"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "Permanent löschen"
 msgstr "Permanent löschen"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Seite löschen: %{site_name}"
 msgstr "Seite löschen: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Stream löschen: %{stream_name}"
 msgstr "Stream löschen: %{stream_name}"
 
 
@@ -833,8 +843,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Anweisung"
 msgstr "Anweisung"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 #, fuzzy
 #, fuzzy
 msgid "Disable"
 msgid "Disable"
 msgstr "Deaktiviert"
 msgstr "Deaktiviert"
@@ -843,42 +853,42 @@ msgstr "Deaktiviert"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Automatische Verlängerung deaktiviert für %{name}"
 msgstr "Automatische Verlängerung deaktiviert für %{name}"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
@@ -891,14 +901,14 @@ msgstr "Speichern erfolgreich"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Deaktiviert"
 msgstr "Deaktiviert"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Erfolgreich deaktiviert"
 msgstr "Erfolgreich deaktiviert"
 
 
@@ -1006,9 +1016,9 @@ msgstr ""
 "werden."
 "werden."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Duplizieren"
 msgstr "Duplizieren"
 
 
@@ -1051,8 +1061,8 @@ msgstr "Email (*)"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Email (*)"
 msgstr "Email (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 #, fuzzy
 #, fuzzy
 msgid "Enable"
 msgid "Enable"
 msgstr "Aktivieren"
 msgstr "Aktivieren"
@@ -1075,42 +1085,42 @@ msgstr "Aktivieren fehlgeschlagen"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Aktiviere TLS"
 msgstr "Aktiviere TLS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Erfolgreich gespeichert"
 msgstr "Erfolgreich gespeichert"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 msgstr "Aktivieren von %{conf_name} in %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Erfolgreich gespeichert"
 msgstr "Erfolgreich gespeichert"
@@ -1135,16 +1145,16 @@ msgstr "Aktiviere TLS"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Aktiviert"
 msgstr "Aktiviert"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Erfolgreich aktiviert"
 msgstr "Erfolgreich aktiviert"
 
 
@@ -1155,7 +1165,7 @@ msgstr "Webseite mit Let's Encrypt verschlüsseln"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Umgebung"
 msgstr "Umgebung"
@@ -1171,7 +1181,7 @@ msgstr "Umgebungsvariablen gesäubert"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 #, fuzzy
 #, fuzzy
 msgid "Environments"
 msgid "Environments"
 msgstr "Kommentare"
 msgstr "Kommentare"
@@ -1348,16 +1358,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
 
@@ -1875,11 +1885,11 @@ msgstr "Liste"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Lastdurchschnitt:"
 msgstr "Lastdurchschnitt:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "Aus Einstellungen laden"
 msgstr "Aus Einstellungen laden"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 #, fuzzy
 #, fuzzy
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
@@ -1955,11 +1965,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Verwalte Konfigurationen"
 msgstr "Verwalte Konfigurationen"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Verwalte Seiten"
 msgstr "Verwalte Seiten"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Verwalte Seiten"
 msgstr "Verwalte Seiten"
@@ -2039,7 +2049,7 @@ msgstr "Einzelne Anweisung"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Name"
 msgstr "Name"
 
 
@@ -2170,6 +2180,10 @@ msgstr "Nginx PID-Pfad"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Befehl zum Neuladen von Nginx"
 msgstr "Befehl zum Neuladen von Nginx"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 #, fuzzy
 #, fuzzy
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
@@ -2179,6 +2193,10 @@ msgstr "Speichern erfolgreich"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Beffehl zum Neustarten von Nginx"
 msgstr "Beffehl zum Neustarten von Nginx"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 #, fuzzy
 #, fuzzy
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
@@ -2207,6 +2225,8 @@ msgid ""
 msgstr "Name der Konfiguration"
 msgstr "Name der Konfiguration"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2218,8 +2238,8 @@ msgstr "Name der Konfiguration"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "Nein"
 msgstr "Nein"
 
 
@@ -2301,6 +2321,7 @@ msgstr ""
 "OCSP Must Staple kann bei einigen Benutzern beim ersten Zugriff mit Firefox "
 "OCSP Must Staple kann bei einigen Benutzern beim ersten Zugriff mit Firefox "
 "Fehler verursachen."
 "Fehler verursachen."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2324,9 +2345,9 @@ msgstr "OK"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "OK"
 msgstr "OK"
@@ -2336,6 +2357,7 @@ msgid "Once the verification is complete, the records will be removed."
 msgstr ""
 msgstr ""
 "Sobaöd die Überprüfung abgeschlossen ist, werden die Einträge entfernt."
 "Sobaöd die Überprüfung abgeschlossen ist, werden die Einträge entfernt."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2564,7 +2586,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Bitte wähle mindestens einen Knoten aus!"
 msgstr "Bitte wähle mindestens einen Knoten aus!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
 msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
 
 
@@ -2711,6 +2745,37 @@ msgstr "Änderungsprotokoll"
 msgid "Reload"
 msgid "Reload"
 msgstr "Neu laden"
 msgstr "Neu laden"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Lade Nginx neu"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Speichern erfolgreich"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Speichern erfolgreich"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Zertifikat ist gültig"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Zertifikat ist gültig"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Lade neu"
 msgstr "Lade neu"
@@ -2744,62 +2809,62 @@ msgstr "Speichern erfolgreich"
 msgid "Rename"
 msgid "Rename"
 msgstr "Benuztername"
 msgstr "Benuztername"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
@@ -2858,6 +2923,37 @@ msgstr "Setze 2FA zurück"
 msgid "Restart"
 msgid "Restart"
 msgstr "Neustart"
 msgstr "Neustart"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Starte neu"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Erfolgreich gespeichert"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Speichern erfolgreich"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Zertifikat ist gültig"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Zertifikat ist gültig"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Starte neu"
 msgstr "Starte neu"
@@ -2931,42 +3027,42 @@ msgstr "Anweisung speichern"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Fehler beim Speichern %{msg}"
 msgstr "Fehler beim Speichern %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 msgstr "Ausführen von %{conf_name} auf %{node_name} fehlgeschlagen"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
@@ -3203,7 +3299,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Status"
 msgstr "Status"
 
 
@@ -3278,46 +3374,47 @@ msgstr "Synchronisieren"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Zertifikat ist gültig"
 msgstr "Zertifikat ist gültig"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr "Synchrone Knoten"
 msgstr "Synchrone Knoten"
@@ -3660,7 +3757,7 @@ msgstr "Speichern erfolgreich"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Aktualisiert am"
 msgstr "Aktualisiert am"
 
 
@@ -3670,7 +3767,8 @@ msgid "Updated successfully"
 msgstr "Speichern erfolgreich"
 msgstr "Speichern erfolgreich"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "Upgrade"
 msgstr "Upgrade"
@@ -3865,6 +3963,8 @@ msgstr "Scrheibe Zertifikat-Privatschlüssel auf die Festplatte"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Schreibe Zertifikat auf die Festplatte"
 msgstr "Schreibe Zertifikat auf die Festplatte"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3964,10 +4064,6 @@ msgstr "Deine Passkeys"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Aktivieren von %{conf_name} in %{node_name} erfolgreich"
 #~ msgstr "Aktivieren von %{conf_name} in %{node_name} erfolgreich"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Erfolgreich gespeichert"
-
 #, fuzzy
 #, fuzzy
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Erfolgreich aktiviert"
 #~ msgstr "Erfolgreich aktiviert"
@@ -3976,10 +4072,6 @@ msgstr "Deine Passkeys"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "Speichern erfolgreich"
 #~ msgstr "Speichern erfolgreich"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Speichern erfolgreich"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 190 - 102
app/src/language/en/app.po

@@ -46,7 +46,7 @@ msgstr "Username"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Action"
 msgstr "Action"
@@ -57,7 +57,7 @@ msgstr "Action"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr ""
 msgstr ""
 
 
@@ -85,12 +85,12 @@ msgstr "Add Location"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Add Site"
 msgstr "Add Site"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 #, fuzzy
 #, fuzzy
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Add Site"
 msgstr "Add Site"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #, fuzzy
 #, fuzzy
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -109,8 +109,8 @@ msgstr "Advance Mode"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
@@ -202,8 +202,8 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 #, fuzzy
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
@@ -213,6 +213,11 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Are you sure you want to remove this directive?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
@@ -227,6 +232,11 @@ msgstr "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "Are you sure you want to remove this directive?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr ""
 msgstr ""
@@ -716,8 +726,8 @@ msgstr "Enable failed"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr ""
 msgstr ""
 
 
@@ -726,51 +736,51 @@ msgstr ""
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr ""
 msgstr ""
 
 
@@ -824,8 +834,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Directives"
 msgstr "Directives"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 #, fuzzy
 #, fuzzy
 msgid "Disable"
 msgid "Disable"
 msgstr "Disabled"
 msgstr "Disabled"
@@ -834,42 +844,42 @@ msgstr "Disabled"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -882,14 +892,14 @@ msgstr "Saved successfully"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Disabled"
 msgstr "Disabled"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
 msgstr "Disabled successfully"
 
 
@@ -991,9 +1001,9 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 #, fuzzy
 #, fuzzy
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Enable failed"
 msgstr "Enable failed"
@@ -1037,8 +1047,8 @@ msgstr "Email (*)"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Email (*)"
 msgstr "Email (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 #, fuzzy
 #, fuzzy
 msgid "Enable"
 msgid "Enable"
 msgstr "Enabled"
 msgstr "Enabled"
@@ -1061,42 +1071,42 @@ msgstr "Enable failed"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Enable TLS"
 msgstr "Enable TLS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -1121,16 +1131,16 @@ msgstr "Enable TLS"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Enabled"
 msgstr "Enabled"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Enabled successfully"
 msgstr "Enabled successfully"
 
 
@@ -1141,7 +1151,7 @@ msgstr "Encrypt website with Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Comments"
 msgstr "Comments"
@@ -1157,7 +1167,7 @@ msgstr ""
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 #, fuzzy
 #, fuzzy
 msgid "Environments"
 msgid "Environments"
 msgstr "Comments"
 msgstr "Comments"
@@ -1334,16 +1344,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 
 
@@ -1860,11 +1870,11 @@ msgstr ""
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Load Averages:"
 msgstr "Load Averages:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 #, fuzzy
 #, fuzzy
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -1932,11 +1942,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Manage Configs"
 msgstr "Manage Configs"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Manage Sites"
 msgstr "Manage Sites"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Manage Sites"
 msgstr "Manage Sites"
@@ -2016,7 +2026,7 @@ msgstr "Single Directive"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Name"
 msgstr "Name"
 
 
@@ -2148,6 +2158,10 @@ msgstr ""
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 #, fuzzy
 #, fuzzy
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
@@ -2157,6 +2171,10 @@ msgstr "Saved successfully"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 #, fuzzy
 #, fuzzy
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
@@ -2183,6 +2201,8 @@ msgid ""
 msgstr "Configuration Name"
 msgstr "Configuration Name"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2194,8 +2214,8 @@ msgstr "Configuration Name"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "No"
 msgstr "No"
 
 
@@ -2274,6 +2294,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2297,9 +2318,9 @@ msgstr ""
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr ""
 msgstr ""
@@ -2308,6 +2329,7 @@ msgstr ""
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2519,7 +2541,17 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Please input your username!"
 msgstr "Please input your username!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+msgid "Please select at least one node to reload Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+msgid "Please select at least one node to restart Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr ""
 msgstr ""
 
 
@@ -2666,6 +2698,36 @@ msgstr ""
 msgid "Reload"
 msgid "Reload"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+msgid "Reload Nginx"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Saved successfully"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Saved successfully"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Certificate is valid"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Certificate is valid"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr ""
 msgstr ""
@@ -2699,62 +2761,62 @@ msgstr "Saved successfully"
 msgid "Rename"
 msgid "Rename"
 msgstr "Username"
 msgstr "Username"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -2813,6 +2875,36 @@ msgstr ""
 msgid "Restart"
 msgid "Restart"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+msgid "Restart Nginx"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Saved successfully"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Saved successfully"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Certificate is valid"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Certificate is valid"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr ""
 msgstr ""
@@ -2886,42 +2978,42 @@ msgstr "Save Directive"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Save error %{msg}"
 msgstr "Save error %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
@@ -3158,7 +3250,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Status"
 msgstr "Status"
 
 
@@ -3235,46 +3327,47 @@ msgstr ""
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr ""
 msgstr ""
@@ -3593,7 +3686,7 @@ msgstr "Saved successfully"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Updated at"
 msgstr "Updated at"
 
 
@@ -3603,7 +3696,8 @@ msgid "Updated successfully"
 msgstr "Saved successfully"
 msgstr "Saved successfully"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr ""
 msgstr ""
@@ -3787,6 +3881,8 @@ msgstr ""
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Certificate is valid"
 msgstr "Certificate is valid"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3876,10 +3972,6 @@ msgstr ""
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Saved successfully"
 #~ msgstr "Saved successfully"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Saved successfully"
-
 #, fuzzy
 #, fuzzy
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Enabled successfully"
 #~ msgstr "Enabled successfully"
@@ -3888,10 +3980,6 @@ msgstr ""
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "Saved successfully"
 #~ msgstr "Saved successfully"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Saved successfully"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 194 - 102
app/src/language/es/app.po

@@ -51,7 +51,7 @@ msgstr "Usuario ACME"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Acción"
 msgstr "Acción"
@@ -62,7 +62,7 @@ msgstr "Acción"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Agregar"
 msgstr "Agregar"
 
 
@@ -89,11 +89,11 @@ msgstr "Agregar Ubicación"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Agregar Sitio"
 msgstr "Agregar Sitio"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Agregar Stream"
 msgstr "Agregar Stream"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Agregado exitoso"
 msgstr "Agregado exitoso"
 
 
@@ -112,8 +112,8 @@ msgstr ""
 "Luego, actualice esta página y haga clic nuevamente en Agregar llave de "
 "Luego, actualice esta página y haga clic nuevamente en Agregar llave de "
 "acceso."
 "acceso."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "Todo"
 msgstr "Todo"
 
 
@@ -199,8 +199,8 @@ msgstr "¿Está seguro de que desea eliminar este elemento de forma permanente?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "¿Está seguro de que quiere borrar este elemento?"
 msgstr "¿Está seguro de que quiere borrar este elemento?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "¿Está seguro de que quiere borrar?"
 msgstr "¿Está seguro de que quiere borrar?"
 
 
@@ -208,6 +208,11 @@ msgstr "¿Está seguro de que quiere borrar?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "¿Está seguro de que quiere recuperar este elemento?"
 msgstr "¿Está seguro de que quiere recuperar este elemento?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "¿Está seguro de que quiere borrar?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "¿Está seguro de que quiere borrar esta directiva?"
 msgstr "¿Está seguro de que quiere borrar esta directiva?"
@@ -220,6 +225,11 @@ msgstr "¿Está seguro de que desea eliminar este elemento?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "¿Está seguro de que quiere borrar esta ubicación?"
 msgstr "¿Está seguro de que quiere borrar esta ubicación?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "¿Está seguro de que desea borrar todas las notificaciones?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "Preguntar por ayuda a ChatGPT"
 msgstr "Preguntar por ayuda a ChatGPT"
@@ -701,8 +711,8 @@ msgstr "Descripción"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Eliminar"
 msgstr "Eliminar"
 
 
@@ -711,49 +721,49 @@ msgstr "Eliminar"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "Eliminar Permanentemente"
 msgstr "Eliminar Permanentemente"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Error al eliminar sitio remoto"
 msgstr "Error al eliminar sitio remoto"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Borrado del sitio remoto correcto"
 msgstr "Borrado del sitio remoto correcto"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Error al eliminar sitio remoto"
 msgstr "Error al eliminar sitio remoto"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Borrado del sitio remoto correcto"
 msgstr "Borrado del sitio remoto correcto"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Eliminar sitio: %{site_name}"
 msgstr "Eliminar sitio: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Eliminar stream: %{site_name}"
 msgstr "Eliminar stream: %{site_name}"
 
 
@@ -806,8 +816,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Directivas"
 msgstr "Directivas"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "Desactivar"
 msgstr "Desactivar"
 
 
@@ -815,40 +825,40 @@ msgstr "Desactivar"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "No se pudo desactivar la renovación automática por %{name}"
 msgstr "No se pudo desactivar la renovación automática por %{name}"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Error al deshabilitar el sitio remoto"
 msgstr "Error al deshabilitar el sitio remoto"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Deshabilitado de sitio remoto exitoso"
 msgstr "Deshabilitado de sitio remoto exitoso"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Error al deshabilitar el sitio remoto"
 msgstr "Error al deshabilitar el sitio remoto"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Deshabilitado de sitio remoto exitoso"
 msgstr "Deshabilitado de sitio remoto exitoso"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
@@ -861,14 +871,14 @@ msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Desactivado"
 msgstr "Desactivado"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Desactivado con éxito"
 msgstr "Desactivado con éxito"
 
 
@@ -967,9 +977,9 @@ msgstr ""
 "ejecutan en el host local."
 "ejecutan en el host local."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Duplicar"
 msgstr "Duplicar"
 
 
@@ -1009,8 +1019,8 @@ msgstr "Correo"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Correo (*)"
 msgstr "Correo (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "Habilitar"
 msgstr "Habilitar"
 
 
@@ -1031,42 +1041,42 @@ msgstr "Falló la habilitación"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Habilitar TLS"
 msgstr "Habilitar TLS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
@@ -1091,16 +1101,16 @@ msgstr "Habilitar TLS"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Habilitado"
 msgstr "Habilitado"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Habilitado con éxito"
 msgstr "Habilitado con éxito"
 
 
@@ -1111,7 +1121,7 @@ msgstr "Encriptar sitio web con Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Entorno"
 msgstr "Entorno"
@@ -1127,7 +1137,7 @@ msgstr "Variables de entorno limpiadas"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "Entornos"
 msgstr "Entornos"
 
 
@@ -1301,16 +1311,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Error al deshabilitar %{msg}"
 msgstr "Error al deshabilitar %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Error al habilitar %{msg}"
 msgstr "Error al habilitar %{msg}"
 
 
@@ -1814,11 +1824,11 @@ msgstr "Lista"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Promedios de carga:"
 msgstr "Promedios de carga:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "Cargar desde configuraciones"
 msgstr "Cargar desde configuraciones"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Cargado con éxito"
 msgstr "Cargado con éxito"
 
 
@@ -1890,11 +1900,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Administrar configuraciones"
 msgstr "Administrar configuraciones"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Administrar sitios"
 msgstr "Administrar sitios"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Administrar Transmisiones"
 msgstr "Administrar Transmisiones"
 
 
@@ -1967,7 +1977,7 @@ msgstr "Directiva multilínea"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Nombre"
 msgstr "Nombre"
 
 
@@ -2096,6 +2106,10 @@ msgstr "Ruta de registro de errores de Nginx"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Comando de recarga de Nginx"
 msgstr "Comando de recarga de Nginx"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "Nginx recargado con éxito"
 msgstr "Nginx recargado con éxito"
@@ -2105,6 +2119,10 @@ msgstr "Nginx recargado con éxito"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Comando de inicio de terminal"
 msgstr "Comando de inicio de terminal"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "Nginx reiniciado con éxito"
 msgstr "Nginx reiniciado con éxito"
@@ -2132,6 +2150,8 @@ msgid ""
 msgstr "Error de análisis de configuración de Nginx"
 msgstr "Error de análisis de configuración de Nginx"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2143,8 +2163,8 @@ msgstr "Error de análisis de configuración de Nginx"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "No"
 msgstr "No"
 
 
@@ -2223,6 +2243,7 @@ msgstr ""
 "OCSP Must Staple puede causar errores para algunos usuarios en el primer "
 "OCSP Must Staple puede causar errores para algunos usuarios en el primer "
 "acceso usando Firefox."
 "acceso usando Firefox."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2246,9 +2267,9 @@ msgstr "Ok"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "OK"
 msgstr "OK"
@@ -2257,6 +2278,7 @@ msgstr "OK"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "Una vez que se complete la verificación, los registros se eliminarán."
 msgstr "Una vez que se complete la verificación, los registros se eliminarán."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2484,7 +2506,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "¡Seleccione al menos un nodo!"
 msgstr "¡Seleccione al menos un nodo!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "Seleccione al menos un nodo para actualizar"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "Seleccione al menos un nodo para actualizar"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "Seleccione al menos un nodo para actualizar"
 msgstr "Seleccione al menos un nodo para actualizar"
 
 
@@ -2629,6 +2663,37 @@ msgstr "Nota de versión"
 msgid "Reload"
 msgid "Reload"
 msgstr "Recargar"
 msgstr "Recargar"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Recargando Nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Eliminar sitio: %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Interfaz de usuario de Nginx actualizada en %{node} con éxito 🎉"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Error al renombrar la configuración remota"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Renombrar Configuración Remota Exitosa"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Recargando"
 msgstr "Recargando"
@@ -2659,59 +2724,59 @@ msgstr "Eliminado con éxito"
 msgid "Rename"
 msgid "Rename"
 msgstr "Renombrar"
 msgstr "Renombrar"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
 msgstr "Renombrar %{orig_path} a %{new_path} en %{env_name} con éxito"
@@ -2765,6 +2830,37 @@ msgstr "Restablecer 2FA"
 msgid "Restart"
 msgid "Restart"
 msgstr "Reiniciar"
 msgstr "Reiniciar"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Reiniciando"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Interfaz de usuario de Nginx actualizada en %{node} con éxito 🎉"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Error al renombrar la configuración remota"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Renombrar Configuración Remota Exitosa"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Reiniciando"
 msgstr "Reiniciando"
@@ -2837,42 +2933,42 @@ msgstr "Guardar Directiva"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Error al guardar %{msg}"
 msgstr "Error al guardar %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Error al renombrar la configuración remota"
 msgstr "Error al renombrar la configuración remota"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Renombrar Configuración Remota Exitosa"
 msgstr "Renombrar Configuración Remota Exitosa"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 msgstr "Falló el desplegado de %{conf_name} a %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
 msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
@@ -3102,7 +3198,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Estado"
 msgstr "Estado"
 
 
@@ -3177,41 +3273,42 @@ msgstr "Sincronizar"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Sincronizar Certificado"
 msgstr "Sincronizar Certificado"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa"
 msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa"
 msgstr "Sincronización del Certificado %{cert_name} a %{env_name} exitosa"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Error de Certificado de Sincronización"
 msgstr "Error de Certificado de Sincronización"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Sincronización del Certificado exitosa"
 msgstr "Sincronización del Certificado exitosa"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente"
 msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente"
 msgstr "Sincronizar configuración %{config_name} con %{env_name} exitosamente"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Error de Configuración de Sincronización"
 msgstr "Error de Configuración de Sincronización"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Configuración de sincronización exitosa"
 msgstr "Configuración de sincronización exitosa"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 #, fuzzy
 #, fuzzy
 msgid "Sync Nodes"
 msgid "Sync Nodes"
@@ -3563,7 +3660,7 @@ msgstr "Actualización exitosa"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Actualizado a"
 msgstr "Actualizado a"
 
 
@@ -3572,7 +3669,8 @@ msgid "Updated successfully"
 msgstr "Actualización exitosa"
 msgstr "Actualización exitosa"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "Actualizar"
 msgstr "Actualizar"
@@ -3763,6 +3861,8 @@ msgstr "Escribir la clave privada del certificado a disco"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Escribir certificado a disco"
 msgstr "Escribir certificado a disco"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3858,10 +3958,6 @@ msgstr "Sus llaves de acceso"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 #~ msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Habilitado con Éxito"
 #~ msgstr "Habilitado con Éxito"
 
 
@@ -3872,10 +3968,6 @@ msgstr "Sus llaves de acceso"
 #~ "favor actualiza la interfaz de usuario de Nginx en el servidor remoto a "
 #~ "favor actualiza la interfaz de usuario de Nginx en el servidor remoto a "
 #~ "la última versión"
 #~ "la última versión"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Eliminar sitio: %{site_name}"
-
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "%{resp}"
 #~ "%{resp}"

+ 192 - 102
app/src/language/fr_FR/app.po

@@ -50,7 +50,7 @@ msgstr "Nom d'utilisateur"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Action"
 msgstr "Action"
@@ -61,7 +61,7 @@ msgstr "Action"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Ajouter"
 msgstr "Ajouter"
 
 
@@ -89,12 +89,12 @@ msgstr "Ajouter une localisation"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Ajouter un site"
 msgstr "Ajouter un site"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 #, fuzzy
 #, fuzzy
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Ajouter un site"
 msgstr "Ajouter un site"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #, fuzzy
 #, fuzzy
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Mis à jour avec succés"
 msgstr "Mis à jour avec succés"
@@ -114,8 +114,8 @@ msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 "Après, rechargez la page et cliquez de nouveau sur ajouter une clé d'accès."
 "Après, rechargez la page et cliquez de nouveau sur ajouter une clé d'accès."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "Tous"
 msgstr "Tous"
 
 
@@ -209,8 +209,8 @@ msgstr "Etes-vous sûr que vous voulez supprimer ?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
 
@@ -219,6 +219,11 @@ msgstr "Etes-vous sûr que vous voulez supprimer ?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Etes-vous sûr que vous voulez supprimer ?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
 msgstr "Voulez-vous vraiment supprimer cette directive ?"
@@ -232,6 +237,11 @@ msgstr "Voulez-vous vraiment supprimer cette directive ?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Voulez-vous vraiment supprimer cette localisation ?"
 msgstr "Voulez-vous vraiment supprimer cette localisation ?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 #, fuzzy
 #, fuzzy
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
@@ -730,8 +740,8 @@ msgstr "Description"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Supprimer"
 msgstr "Supprimer"
 
 
@@ -740,51 +750,51 @@ msgstr "Supprimer"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "Supprimer définitivement"
 msgstr "Supprimer définitivement"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Supprimer le site : %{site_name}"
 msgstr "Supprimer le site : %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 #, fuzzy
 #, fuzzy
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Supprimer le site : %{site_name}"
 msgstr "Supprimer le site : %{site_name}"
@@ -840,8 +850,8 @@ msgstr "DirectiveIdx hors limite"
 msgid "Directives"
 msgid "Directives"
 msgstr "Directives"
 msgstr "Directives"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 #, fuzzy
 #, fuzzy
 msgid "Disable"
 msgid "Disable"
 msgstr "Désactivé"
 msgstr "Désactivé"
@@ -850,42 +860,42 @@ msgstr "Désactivé"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "La désactivation du renouvellement automatique a échoué pour %{name}"
 msgstr "La désactivation du renouvellement automatique a échoué pour %{name}"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
@@ -898,14 +908,14 @@ msgstr "Dupliqué avec succès"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Désactivé"
 msgstr "Désactivé"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Désactivé avec succès"
 msgstr "Désactivé avec succès"
 
 
@@ -1010,9 +1020,9 @@ msgstr ""
 "exécuté sur localhost."
 "exécuté sur localhost."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Dupliquer"
 msgstr "Dupliquer"
 
 
@@ -1055,8 +1065,8 @@ msgstr "Email (*)"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Email (*)"
 msgstr "Email (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 #, fuzzy
 #, fuzzy
 msgid "Enable"
 msgid "Enable"
 msgstr "Activé"
 msgstr "Activé"
@@ -1079,42 +1089,42 @@ msgstr "Échec de l'activation"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Activer TLS"
 msgstr "Activer TLS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
@@ -1139,16 +1149,16 @@ msgstr "Activer TLS"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Activé"
 msgstr "Activé"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Activé avec succès"
 msgstr "Activé avec succès"
 
 
@@ -1159,7 +1169,7 @@ msgstr "Crypter le site Web avec Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Commentaires"
 msgstr "Commentaires"
@@ -1176,7 +1186,7 @@ msgstr "Définition des variables d'environnement"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 #, fuzzy
 #, fuzzy
 msgid "Environments"
 msgid "Environments"
 msgstr "Commentaires"
 msgstr "Commentaires"
@@ -1354,16 +1364,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Impossible de désactiver %{msg}"
 msgstr "Impossible de désactiver %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Impossible d'activer %{msg}"
 msgstr "Impossible d'activer %{msg}"
 
 
@@ -1890,11 +1900,11 @@ msgstr "Liste"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Charges moyennes :"
 msgstr "Charges moyennes :"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "Charger à partir des options"
 msgstr "Charger à partir des options"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 #, fuzzy
 #, fuzzy
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Enregistré avec succès"
 msgstr "Enregistré avec succès"
@@ -1965,11 +1975,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Gérer les configurations"
 msgstr "Gérer les configurations"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Gérer les sites"
 msgstr "Gérer les sites"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Gérer les sites"
 msgstr "Gérer les sites"
@@ -2047,7 +2057,7 @@ msgstr "Directive multiligne"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Nom"
 msgstr "Nom"
 
 
@@ -2181,6 +2191,10 @@ msgstr "Chemin du journal des erreurs Nginx"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Commande de démarrage du terminal"
 msgstr "Commande de démarrage du terminal"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "Nginx a été rechargé avec succès"
 msgstr "Nginx a été rechargé avec succès"
@@ -2190,6 +2204,10 @@ msgstr "Nginx a été rechargé avec succès"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Commande de démarrage du terminal"
 msgstr "Commande de démarrage du terminal"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "Nginx a redémarré avec succès"
 msgstr "Nginx a redémarré avec succès"
@@ -2216,6 +2234,8 @@ msgid ""
 msgstr "Erreur d'analyse de configuration Nginx"
 msgstr "Erreur d'analyse de configuration Nginx"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2227,8 +2247,8 @@ msgstr "Erreur d'analyse de configuration Nginx"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "Non"
 msgstr "Non"
 
 
@@ -2305,6 +2325,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2328,9 +2349,9 @@ msgstr ""
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "OK"
 msgstr "OK"
@@ -2339,6 +2360,7 @@ msgstr "OK"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2555,7 +2577,17 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Veuillez renseigner un nom de fichier"
 msgstr "Veuillez renseigner un nom de fichier"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+msgid "Please select at least one node to reload Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+msgid "Please select at least one node to restart Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr ""
 msgstr ""
 
 
@@ -2705,6 +2737,37 @@ msgstr "Note de version"
 msgid "Reload"
 msgid "Reload"
 msgstr "Recharger"
 msgstr "Recharger"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Rechargement de nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Supprimer le site : %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Mise à niveau réussie"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Changer de certificat"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Changer de certificat"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Rechargement"
 msgstr "Rechargement"
@@ -2738,62 +2801,62 @@ msgstr "Enregistré avec succès"
 msgid "Rename"
 msgid "Rename"
 msgstr "Nom d'utilisateur"
 msgstr "Nom d'utilisateur"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
@@ -2853,6 +2916,37 @@ msgstr "Réinitialiser"
 msgid "Restart"
 msgid "Restart"
 msgstr "Redémarrer"
 msgstr "Redémarrer"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Redémarrage"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Dupliqué avec succès"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Mise à niveau réussie"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Changer de certificat"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Changer de certificat"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Redémarrage"
 msgstr "Redémarrage"
@@ -2925,42 +3019,42 @@ msgstr "Enregistrer la directive"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Enregistrer l'erreur %{msg}"
 msgstr "Enregistrer l'erreur %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
@@ -3194,7 +3288,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Statut"
 msgstr "Statut"
 
 
@@ -3272,46 +3366,47 @@ msgstr ""
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Dupliqué avec succès"
 msgstr "Dupliqué avec succès"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Changer de certificat"
 msgstr "Changer de certificat"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr ""
 msgstr ""
@@ -3639,7 +3734,7 @@ msgstr "Mis à jour avec succés"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Mis à jour le"
 msgstr "Mis à jour le"
 
 
@@ -3648,7 +3743,8 @@ msgid "Updated successfully"
 msgstr "Mis à jour avec succés"
 msgstr "Mis à jour avec succés"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "Mettre à niveau"
 msgstr "Mettre à niveau"
@@ -3830,6 +3926,8 @@ msgstr "Écriture de la clé privée du certificat sur le disque"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Écriture du certificat sur le disque"
 msgstr "Écriture du certificat sur le disque"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3926,10 +4024,6 @@ msgstr ""
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Dupliqué avec succès"
 #~ msgstr "Dupliqué avec succès"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Dupliqué avec succès"
-
 #, fuzzy
 #, fuzzy
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Activé avec succès"
 #~ msgstr "Activé avec succès"
@@ -3938,10 +4032,6 @@ msgstr ""
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "Dupliqué avec succès"
 #~ msgstr "Dupliqué avec succès"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Supprimer le site : %{site_name}"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 194 - 102
app/src/language/ko_KR/app.po

@@ -49,7 +49,7 @@ msgstr "ACME 사용자"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "작업"
 msgstr "작업"
@@ -60,7 +60,7 @@ msgstr "작업"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "추가"
 msgstr "추가"
 
 
@@ -87,11 +87,11 @@ msgstr "위치 추가"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "사이트 추가"
 msgstr "사이트 추가"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "스트림 추가"
 msgstr "스트림 추가"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "성공적으로 추가됨"
 msgstr "성공적으로 추가됨"
 
 
@@ -108,8 +108,8 @@ msgstr "고급 모드"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
@@ -196,8 +196,8 @@ msgstr "이 항목을 영구적으로 삭제하시겠습니까?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "이 항목을 삭제하시겠습니까?"
 msgstr "이 항목을 삭제하시겠습니까?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "정말 삭제하시겠습니까?"
 msgstr "정말 삭제하시겠습니까?"
 
 
@@ -205,6 +205,11 @@ msgstr "정말 삭제하시겠습니까?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "이 항목을 복구하시겠습니까?"
 msgstr "이 항목을 복구하시겠습니까?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "정말 삭제하시겠습니까?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "이 지시문을 정말로 제거하시겠습니까?"
 msgstr "이 지시문을 정말로 제거하시겠습니까?"
@@ -217,6 +222,11 @@ msgstr "이 항목을 제거하시겠습니까?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "이 위치를 제거하시겠습니까?"
 msgstr "이 위치를 제거하시겠습니까?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "모든 알림을 지우시겠습니까?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "ChatGPT에게 도움 요청"
 msgstr "ChatGPT에게 도움 요청"
@@ -697,8 +707,8 @@ msgstr "설명"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "삭제"
 msgstr "삭제"
 
 
@@ -707,51 +717,51 @@ msgstr "삭제"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "사이트 삭제: %{site_name}"
 msgstr "사이트 삭제: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "스트림 삭제: %{stream_name}"
 msgstr "스트림 삭제: %{stream_name}"
 
 
@@ -804,8 +814,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "지시문들"
 msgstr "지시문들"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "비활성화"
 msgstr "비활성화"
 
 
@@ -813,42 +823,42 @@ msgstr "비활성화"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "%{name}의 자동 갱신 비활성화 실패"
 msgstr "%{name}의 자동 갱신 비활성화 실패"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
@@ -861,14 +871,14 @@ msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "비활성화됨"
 msgstr "비활성화됨"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "성공적으로 비활성화됨"
 msgstr "성공적으로 비활성화됨"
 
 
@@ -963,9 +973,9 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "복제"
 msgstr "복제"
 
 
@@ -1006,8 +1016,8 @@ msgstr "이메일 (*)"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "이메일 (*)"
 msgstr "이메일 (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "활성화"
 msgstr "활성화"
 
 
@@ -1029,42 +1039,42 @@ msgstr "활성화 실패"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "TLS 활성화"
 msgstr "TLS 활성화"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
@@ -1089,16 +1099,16 @@ msgstr "TLS 활성화"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "활성화됨"
 msgstr "활성화됨"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "성공적으로 활성화됨"
 msgstr "성공적으로 활성화됨"
 
 
@@ -1109,7 +1119,7 @@ msgstr "Let's Encrypt로 웹사이트 암호화"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "환경"
 msgstr "환경"
@@ -1126,7 +1136,7 @@ msgstr "환경 변수 설정"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "환경"
 msgstr "환경"
 
 
@@ -1302,16 +1312,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "%{msg} 비활성화 실패"
 msgstr "%{msg} 비활성화 실패"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "%{msg} 활성화 실패"
 msgstr "%{msg} 활성화 실패"
 
 
@@ -1817,11 +1827,11 @@ msgstr ""
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "부하 평균:"
 msgstr "부하 평균:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 #, fuzzy
 #, fuzzy
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "성공적으로 저장됨"
 msgstr "성공적으로 저장됨"
@@ -1894,11 +1904,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "구성 관리"
 msgstr "구성 관리"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "사이트 관리"
 msgstr "사이트 관리"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "스트림 관리"
 msgstr "스트림 관리"
@@ -1978,7 +1988,7 @@ msgstr "단일 지시문"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "이름"
 msgstr "이름"
 
 
@@ -2110,6 +2120,10 @@ msgstr "Nginx 오류 로그 경로"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 #, fuzzy
 #, fuzzy
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
@@ -2120,6 +2134,10 @@ msgstr "Nginx가 성공적으로 리로드됨"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "터미널 시작 명령"
 msgstr "터미널 시작 명령"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 #, fuzzy
 #, fuzzy
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
@@ -2147,6 +2165,8 @@ msgid ""
 msgstr "Nginx 구성 오류름"
 msgstr "Nginx 구성 오류름"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2158,8 +2178,8 @@ msgstr "Nginx 구성 오류름"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "아니요"
 msgstr "아니요"
 
 
@@ -2236,6 +2256,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2259,9 +2280,9 @@ msgstr ""
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "확인"
 msgstr "확인"
@@ -2270,6 +2291,7 @@ msgstr "확인"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "검증이 완료되면, 레코드는 제거됩니다."
 msgstr "검증이 완료되면, 레코드는 제거됩니다."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2483,7 +2505,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "적어도 하나의 노드를 선택해주세요!"
 msgstr "적어도 하나의 노드를 선택해주세요!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "적어도 하나의 노드를 선택해주세요!"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "적어도 하나의 노드를 선택해주세요!"
+
+#: src/views/environments/list/Environment.vue:91
 #, fuzzy
 #, fuzzy
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "적어도 하나의 노드를 선택해주세요!"
 msgstr "적어도 하나의 노드를 선택해주세요!"
@@ -2633,6 +2667,37 @@ msgstr "릴리스 노트"
 msgid "Reload"
 msgid "Reload"
 msgstr "리로드"
 msgstr "리로드"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Nginx 리로딩 중"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "사이트 삭제: %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "성공적으로 저장되었습니다"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "인증서 갱신 오류"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "인증서 갱신 성공"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "리로딩 중"
 msgstr "리로딩 중"
@@ -2666,62 +2731,62 @@ msgstr "성공적으로 제거됨"
 msgid "Rename"
 msgid "Rename"
 msgstr "이름 변경"
 msgstr "이름 변경"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
@@ -2781,6 +2846,37 @@ msgstr "재설정"
 msgid "Restart"
 msgid "Restart"
 msgstr "재시작"
 msgstr "재시작"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "재시작 중"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "성공적으로 저장되었습니다"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "인증서 갱신 오류"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "인증서 갱신 성공"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "재시작 중"
 msgstr "재시작 중"
@@ -2854,42 +2950,42 @@ msgstr "지시문 저장"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "저장 오류 %{msg}"
 msgstr "저장 오류 %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 배포 실패"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
@@ -3121,7 +3217,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "상태"
 msgstr "상태"
 
 
@@ -3197,46 +3293,47 @@ msgstr ""
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "인증서 갱신"
 msgstr "인증서 갱신"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "인증서 갱신 오류"
 msgstr "인증서 갱신 오류"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "인증서 갱신 성공"
 msgstr "인증서 갱신 성공"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr ""
 msgstr ""
@@ -3559,7 +3656,7 @@ msgstr "성공적으로 저장되었습니다"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "업데이트됨"
 msgstr "업데이트됨"
 
 
@@ -3569,7 +3666,8 @@ msgid "Updated successfully"
 msgstr "성공적으로 저장되었습니다"
 msgstr "성공적으로 저장되었습니다"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "업그레이드"
 msgstr "업그레이드"
@@ -3755,6 +3853,8 @@ msgstr "인증서 개인 키를 디스크에 쓰기"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "인증서를 디스크에 쓰기"
 msgstr "인증서를 디스크에 쓰기"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3843,10 +3943,6 @@ msgstr ""
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 #~ msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "성공적으로 활성화"
 #~ msgstr "성공적으로 활성화"
 
 
@@ -3854,10 +3950,6 @@ msgstr ""
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 #~ msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "사이트 삭제: %{site_name}"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 181 - 96
app/src/language/messages.pot

@@ -39,7 +39,7 @@ msgstr ""
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/site/site_list/columns.tsx:76
 #: src/views/site/site_list/columns.tsx:76
-#: src/views/stream/StreamList.vue:71
+#: src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr ""
 msgstr ""
@@ -50,7 +50,7 @@ msgstr ""
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr ""
 msgstr ""
 
 
@@ -79,11 +79,11 @@ msgstr ""
 msgid "Add Site"
 msgid "Add Site"
 msgstr ""
 msgstr ""
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr ""
 msgstr ""
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr ""
 msgstr ""
 
 
@@ -100,9 +100,8 @@ msgstr ""
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98
-#: src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
@@ -184,8 +183,8 @@ msgstr ""
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr ""
 msgstr ""
 
 
@@ -193,6 +192,10 @@ msgstr ""
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr ""
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr ""
 msgstr ""
@@ -205,6 +208,10 @@ msgstr ""
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr ""
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr ""
 msgstr ""
@@ -662,8 +669,8 @@ msgstr ""
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr ""
 msgstr ""
 
 
@@ -672,45 +679,45 @@ msgstr ""
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:43
+#: src/components/Notification/notifications.ts:61
 #: src/language/constants.ts:50
 #: src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:47
+#: src/components/Notification/notifications.ts:65
 #: src/language/constants.ts:49
 #: src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr ""
 msgstr ""
 
 
@@ -764,8 +771,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr ""
 msgstr ""
 
 
@@ -773,37 +780,37 @@ msgstr ""
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:51
+#: src/components/Notification/notifications.ts:69
 #: src/language/constants.ts:52
 #: src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:55
+#: src/components/Notification/notifications.ts:73
 #: src/language/constants.ts:51
 #: src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
 
 
@@ -816,15 +823,15 @@ msgstr ""
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62
 #: src/views/site/site_list/columns.tsx:62
 #: src/views/stream/StreamEdit.vue:177
 #: src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55
+#: src/views/stream/StreamList.vue:56
 #: src/views/user/userColumns.tsx:41
 #: src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr ""
 msgstr ""
 
 
@@ -915,9 +922,9 @@ msgid "Due to the security policies of some browsers, you cannot use passkeys on
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr ""
 msgstr ""
 
 
@@ -957,8 +964,8 @@ msgstr ""
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr ""
 msgstr ""
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr ""
 msgstr ""
 
 
@@ -978,37 +985,37 @@ msgstr ""
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:59
+#: src/components/Notification/notifications.ts:77
 #: src/language/constants.ts:54
 #: src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:63
+#: src/components/Notification/notifications.ts:81
 #: src/language/constants.ts:53
 #: src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr ""
 msgstr ""
 
 
@@ -1032,16 +1039,16 @@ msgstr ""
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/StreamEdit.vue:171
 #: src/views/stream/StreamEdit.vue:171
-#: src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr ""
 msgstr ""
 
 
@@ -1052,7 +1059,7 @@ msgstr ""
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr ""
 msgstr ""
 
 
@@ -1066,7 +1073,7 @@ msgstr ""
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr ""
 msgstr ""
 
 
@@ -1223,16 +1230,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr ""
 msgstr ""
 
 
@@ -1693,11 +1700,11 @@ msgstr ""
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr ""
 msgstr ""
 
 
@@ -1757,12 +1764,12 @@ msgid "Manage Configs"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/sites.ts:10
 #: src/routes/modules/sites.ts:10
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/streams.ts:10
 #: src/routes/modules/streams.ts:10
-#: src/views/stream/StreamList.vue:172
+#: src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr ""
 msgstr ""
 
 
@@ -1837,8 +1844,8 @@ msgstr ""
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18
-#: src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19
+#: src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr ""
 msgstr ""
 
 
@@ -1962,6 +1969,10 @@ msgstr ""
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr ""
 msgstr ""
@@ -1970,6 +1981,10 @@ msgstr ""
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr ""
 msgstr ""
@@ -1991,6 +2006,8 @@ msgid "Nginx UI configuration has been restored and will restart automatically i
 msgstr ""
 msgstr ""
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2002,8 +2019,8 @@ msgstr ""
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr ""
 msgstr ""
 
 
@@ -2070,6 +2087,7 @@ msgstr ""
 msgid "OCSP Must Staple may cause errors for some users on first access using Firefox."
 msgid "OCSP Must Staple may cause errors for some users on first access using Firefox."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2093,9 +2111,9 @@ msgstr ""
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr ""
 msgstr ""
@@ -2104,6 +2122,7 @@ msgstr ""
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2299,7 +2318,17 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+msgid "Please select at least one node to reload Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+msgid "Please select at least one node to restart Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr ""
 msgstr ""
 
 
@@ -2435,6 +2464,32 @@ msgstr ""
 msgid "Reload"
 msgid "Reload"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+msgid "Reload Nginx"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:16
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:20
+msgid "Reload Nginx on %{node} successfully"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:15
+msgid "Reload Remote Nginx Error"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:19
+msgid "Reload Remote Nginx Success"
+msgstr ""
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr ""
 msgstr ""
@@ -2465,55 +2520,55 @@ msgstr ""
 msgid "Rename"
 msgid "Rename"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:33
+#: src/components/Notification/notifications.ts:51
 #: src/language/constants.ts:42
 #: src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:37
+#: src/components/Notification/notifications.ts:55
 #: src/language/constants.ts:41
 #: src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:67
+#: src/components/Notification/notifications.ts:85
 #: src/language/constants.ts:56
 #: src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:71
+#: src/components/Notification/notifications.ts:89
 #: src/language/constants.ts:55
 #: src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr ""
 msgstr ""
 
 
@@ -2565,6 +2620,32 @@ msgstr ""
 msgid "Restart"
 msgid "Restart"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+msgid "Restart Nginx"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:24
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:28
+msgid "Restart Nginx on %{node} successfully"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:23
+msgid "Restart Remote Nginx Error"
+msgstr ""
+
+#: src/components/Notification/notifications.ts:27
+msgid "Restart Remote Nginx Success"
+msgstr ""
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr ""
 msgstr ""
@@ -2633,37 +2714,37 @@ msgstr ""
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:75
+#: src/components/Notification/notifications.ts:93
 #: src/language/constants.ts:48
 #: src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:79
+#: src/components/Notification/notifications.ts:97
 #: src/language/constants.ts:47
 #: src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr ""
 msgstr ""
 
 
@@ -2874,7 +2955,7 @@ msgstr ""
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/site/site_list/columns.tsx:42
 #: src/views/site/site_list/columns.tsx:42
-#: src/views/stream/StreamList.vue:44
+#: src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr ""
 msgstr ""
 
 
@@ -2942,42 +3023,43 @@ msgstr ""
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:15
+#: src/components/Notification/notifications.ts:33
 #: src/language/constants.ts:39
 #: src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:19
+#: src/components/Notification/notifications.ts:37
 #: src/language/constants.ts:38
 #: src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:25
+#: src/components/Notification/notifications.ts:43
 #: src/language/constants.ts:45
 #: src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:29
+#: src/components/Notification/notifications.ts:47
 #: src/language/constants.ts:44
 #: src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr ""
 msgstr ""
@@ -3239,7 +3321,7 @@ msgstr ""
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64
+#: src/views/stream/StreamList.vue:65
 #: src/views/user/userColumns.tsx:54
 #: src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr ""
 msgstr ""
@@ -3249,7 +3331,8 @@ msgid "Updated successfully"
 msgstr ""
 msgstr ""
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:143
 #: src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
@@ -3409,6 +3492,8 @@ msgstr ""
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96

+ 194 - 102
app/src/language/ru_RU/app.po

@@ -51,7 +51,7 @@ msgstr "Пользователь ACME"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Действие"
 msgstr "Действие"
@@ -62,7 +62,7 @@ msgstr "Действие"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Добавить"
 msgstr "Добавить"
 
 
@@ -89,11 +89,11 @@ msgstr "Добавить Location"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Добавить Сайт"
 msgstr "Добавить Сайт"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Добавить поток"
 msgstr "Добавить поток"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Добавлено успешно"
 msgstr "Добавлено успешно"
 
 
@@ -110,8 +110,8 @@ msgstr "Расширенный режим"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "Затем, обновите эту страницу и снова нажмите «Добавить ключ доступа»."
 msgstr "Затем, обновите эту страницу и снова нажмите «Добавить ключ доступа»."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "Все"
 msgstr "Все"
 
 
@@ -194,8 +194,8 @@ msgstr "Вы уверены, что хотите удалить этот эле
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Вы уверены, что хотите удалить этот элемент?"
 msgstr "Вы уверены, что хотите удалить этот элемент?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Вы уверены, что хотите удалить?"
 msgstr "Вы уверены, что хотите удалить?"
 
 
@@ -203,6 +203,11 @@ msgstr "Вы уверены, что хотите удалить?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Вы уверены, что хотите восстановить этот элемент?"
 msgstr "Вы уверены, что хотите восстановить этот элемент?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Вы уверены, что хотите удалить?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "Вы уверены, что хотите удалить эту директиву?"
 msgstr "Вы уверены, что хотите удалить эту директиву?"
@@ -215,6 +220,11 @@ msgstr "Вы уверены, что хотите удалить этот эле
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Вы уверены, что хотите удалить location?"
 msgstr "Вы уверены, что хотите удалить location?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "Вы уверены, что хотите очистить все уведомления?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "Обратитесь за помощью к ChatGPT"
 msgstr "Обратитесь за помощью к ChatGPT"
@@ -686,8 +696,8 @@ msgstr "Ошибка расшифровки"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Удалить"
 msgstr "Удалить"
 
 
@@ -696,49 +706,49 @@ msgstr "Удалить"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "Удалить навсегда"
 msgstr "Удалить навсегда"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Сайт %{name} успешно удалён с %{node}"
 msgstr "Сайт %{name} успешно удалён с %{node}"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Удалить сайт: %{site_name}"
 msgstr "Удалить сайт: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Поток %{name} успешно удалён с %{node}"
 msgstr "Поток %{name} успешно удалён с %{node}"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Удалить поток: %{stream_name}"
 msgstr "Удалить поток: %{stream_name}"
 
 
@@ -791,8 +801,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Директивы"
 msgstr "Директивы"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "Отключить"
 msgstr "Отключить"
 
 
@@ -800,42 +810,42 @@ msgstr "Отключить"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Не удалось отключить автоматическое продление для %{name}"
 msgstr "Не удалось отключить автоматическое продление для %{name}"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
 msgstr "Включение %{conf_name} in %{node_name} успешно"
@@ -848,14 +858,14 @@ msgstr "Включение %{conf_name} in %{node_name} успешно"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Отключено"
 msgstr "Отключено"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Отключено успешно"
 msgstr "Отключено успешно"
 
 
@@ -954,9 +964,9 @@ msgstr ""
 "запускаются на localhost."
 "запускаются на localhost."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Дублировать"
 msgstr "Дублировать"
 
 
@@ -996,8 +1006,8 @@ msgstr "Электронная почта"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Email (*)"
 msgstr "Email (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "Включить"
 msgstr "Включить"
 
 
@@ -1018,41 +1028,41 @@ msgstr "Не удалось включить"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Включить TOTP"
 msgstr "Включить TOTP"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Сайт %{name} успешно включён на %{node}"
 msgstr "Сайт %{name} успешно включён на %{node}"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 msgstr "Включение %{conf_name} in %{node_name} нипалучилася"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Поток %{name} успешно включён на %{node}"
 msgstr "Поток %{name} успешно включён на %{node}"
 
 
@@ -1075,16 +1085,16 @@ msgstr "Включить TOTP"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Включено"
 msgstr "Включено"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Активировано успешно"
 msgstr "Активировано успешно"
 
 
@@ -1095,7 +1105,7 @@ msgstr "Использовать для сайта Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Окружение"
 msgstr "Окружение"
@@ -1111,7 +1121,7 @@ msgstr "Переменные окружения очищены"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "Окружения"
 msgstr "Окружения"
 
 
@@ -1285,16 +1295,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Не удалось отключить %{msg}"
 msgstr "Не удалось отключить %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Не удалось включить %{msg}"
 msgstr "Не удалось включить %{msg}"
 
 
@@ -1795,11 +1805,11 @@ msgstr "Список"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Средняя нагрузка:"
 msgstr "Средняя нагрузка:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "Загрузить из настроек"
 msgstr "Загрузить из настроек"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Загружено успешно"
 msgstr "Загружено успешно"
 
 
@@ -1870,11 +1880,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Конфигурации"
 msgstr "Конфигурации"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Сайты"
 msgstr "Сайты"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Управление потоками"
 msgstr "Управление потоками"
 
 
@@ -1947,7 +1957,7 @@ msgstr "Многострочная директива"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Имя"
 msgstr "Имя"
 
 
@@ -2076,6 +2086,10 @@ msgstr "Путь для Nginx Error Log"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Команда перезагрузки Nginx"
 msgstr "Команда перезагрузки Nginx"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "Nginx успешно перезагружен"
 msgstr "Nginx успешно перезагружен"
@@ -2085,6 +2099,10 @@ msgstr "Nginx успешно перезагружен"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Терминальная команда запуска"
 msgstr "Терминальная команда запуска"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "Nginx успешно перезапущен"
 msgstr "Nginx успешно перезапущен"
@@ -2111,6 +2129,8 @@ msgid ""
 msgstr "Ошибка разбора конфигурации Nginx"
 msgstr "Ошибка разбора конфигурации Nginx"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2122,8 +2142,8 @@ msgstr "Ошибка разбора конфигурации Nginx"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "Нет"
 msgstr "Нет"
 
 
@@ -2200,6 +2220,7 @@ msgstr ""
 "OCSP Must Staple может вызвать ошибки у некоторых пользователей при первом "
 "OCSP Must Staple может вызвать ошибки у некоторых пользователей при первом "
 "доступе через Firefox."
 "доступе через Firefox."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2223,9 +2244,9 @@ msgstr "Ок"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "ОК"
 msgstr "ОК"
@@ -2234,6 +2255,7 @@ msgstr "ОК"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "После завершения проверки записи будут удалены."
 msgstr "После завершения проверки записи будут удалены."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2454,7 +2476,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Пожалуйста, выберите хотя бы один узел!"
 msgstr "Пожалуйста, выберите хотя бы один узел!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "Пожалуйста, выберите хотя бы один узел"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "Пожалуйста, выберите хотя бы один узел"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "Пожалуйста, выберите хотя бы один узел"
 msgstr "Пожалуйста, выберите хотя бы один узел"
 
 
@@ -2598,6 +2632,37 @@ msgstr "Что нового"
 msgid "Reload"
 msgid "Reload"
 msgstr "Перегрузить"
 msgstr "Перегрузить"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Перезагружается nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Удалить сайт: %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Интерфейс Nginx на %{node} успешно обновлен 🎉"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Ошибка переименования удаленной конфигурации"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Переименование удаленной конфигурации прошло успешно"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Перезагружается"
 msgstr "Перезагружается"
@@ -2628,58 +2693,58 @@ msgstr "Успешно удалено"
 msgid "Rename"
 msgid "Rename"
 msgstr "Переименовать"
 msgstr "Переименовать"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "%{orig_path} успешно переименован в %{new_path} на %{env_name}"
 msgstr "%{orig_path} успешно переименован в %{new_path} на %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Сайт %{name} успешно переименован в %{new_name} на %{node}"
 msgstr "Сайт %{name} успешно переименован в %{new_name} на %{node}"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 msgstr "Переименование %{orig_path} в %{new_path} на %{env_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Поток %{name} успешно переименован в %{new_name} на %{node}"
 msgstr "Поток %{name} успешно переименован в %{new_name} на %{node}"
 
 
@@ -2732,6 +2797,37 @@ msgstr "Сброс 2FA"
 msgid "Restart"
 msgid "Restart"
 msgstr "Перезапуск"
 msgstr "Перезапуск"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Перезапускается"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Включение %{conf_name} in %{node_name} успешно"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Интерфейс Nginx на %{node} успешно обновлен 🎉"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Ошибка переименования удаленной конфигурации"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Переименование удаленной конфигурации прошло успешно"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Перезапускается"
 msgstr "Перезапускается"
@@ -2804,41 +2900,41 @@ msgstr "Сохранить директиву"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Ошибка сохранения %{msg}"
 msgstr "Ошибка сохранения %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Ошибка переименования удаленной конфигурации"
 msgstr "Ошибка переименования удаленной конфигурации"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 msgstr "Переименование удаленной конфигурации прошло успешно"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Продублированно %{conf_name} в %{node_name}"
 msgstr "Продублированно %{conf_name} в %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Сайт %{name} успешно сохранён на %{node}"
 msgstr "Сайт %{name} успешно сохранён на %{node}"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 msgstr "Не удалось развернуть %{conf_name} на %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Поток %{name} успешно сохранён на %{node}"
 msgstr "Поток %{name} успешно сохранён на %{node}"
 
 
@@ -3066,7 +3162,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Статус"
 msgstr "Статус"
 
 
@@ -3141,41 +3237,42 @@ msgstr "Синхронизация"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Синхронизировать сертификат"
 msgstr "Синхронизировать сертификат"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}"
 msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}"
 msgstr "Сертификат %{cert_name} успешно синхронизирован с %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Ошибка синхронизации сертификата"
 msgstr "Ошибка синхронизации сертификата"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Сертификат успешно синхронизирован"
 msgstr "Сертификат успешно синхронизирован"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно"
 msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно"
 msgstr "Конфигурация синхронизирована %{config_name} с %{env_name} успешно"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Ошибка синхронизации конфигурации"
 msgstr "Ошибка синхронизации конфигурации"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Синхронизация конфигурации успешна"
 msgstr "Синхронизация конфигурации успешна"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 #, fuzzy
 #, fuzzy
 msgid "Sync Nodes"
 msgid "Sync Nodes"
@@ -3519,7 +3616,7 @@ msgstr "Успешно обновлено"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Обновлено в"
 msgstr "Обновлено в"
 
 
@@ -3528,7 +3625,8 @@ msgid "Updated successfully"
 msgstr "Успешно обновлено"
 msgstr "Успешно обновлено"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "Обновление"
 msgstr "Обновление"
@@ -3709,6 +3807,8 @@ msgstr "Запись закрытого ключа сертификата на 
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Запись сертификата на диск"
 msgstr "Запись сертификата на диск"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3801,10 +3901,6 @@ msgstr ""
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Включение %{conf_name} in %{node_name} успешно"
 #~ msgstr "Включение %{conf_name} in %{node_name} успешно"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Включение %{conf_name} in %{node_name} успешно"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Включено успешно"
 #~ msgstr "Включено успешно"
 
 
@@ -3814,10 +3910,6 @@ msgstr ""
 #~ "Синхронизация конфигурации %{cert_name} с %{env_name} не удалась, "
 #~ "Синхронизация конфигурации %{cert_name} с %{env_name} не удалась, "
 #~ "пожалуйста, обновите удаленный Nginx UI до последней версии"
 #~ "пожалуйста, обновите удаленный Nginx UI до последней версии"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Удалить сайт: %{site_name}"
-
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "%{resp}"
 #~ "%{resp}"

+ 196 - 104
app/src/language/tr_TR/app.po

@@ -47,7 +47,7 @@ msgstr "ACME Kullanıcısı"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Eylem"
 msgstr "Eylem"
@@ -58,7 +58,7 @@ msgstr "Eylem"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Ekle"
 msgstr "Ekle"
 
 
@@ -85,11 +85,11 @@ msgstr "Konum ekle"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Site Ekle"
 msgstr "Site Ekle"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Akış Ekle"
 msgstr "Akış Ekle"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Başarıyla eklendi"
 msgstr "Başarıyla eklendi"
 
 
@@ -107,8 +107,8 @@ msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 "Daha sonra, bu sayfayı yenileyin ve tekrar geçiş anahtarı ekle'ye tıklayın."
 "Daha sonra, bu sayfayı yenileyin ve tekrar geçiş anahtarı ekle'ye tıklayın."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
@@ -194,8 +194,8 @@ msgstr "Bu öğeyi kalıcı olarak silmek istediğinizden emin misiniz?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Bu öğeyi silmek istediğinizden emin misiniz?"
 msgstr "Bu öğeyi silmek istediğinizden emin misiniz?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Silmek istediğine emin misin?"
 msgstr "Silmek istediğine emin misin?"
 
 
@@ -203,6 +203,11 @@ msgstr "Silmek istediğine emin misin?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?"
 msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Silmek istediğine emin misin?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "Bu yönergeyi kaldırmak istediğinizden emin misiniz?"
 msgstr "Bu yönergeyi kaldırmak istediğinizden emin misiniz?"
@@ -215,6 +220,11 @@ msgstr "Bu öğeyi kaldırmak istediğinizden emin misiniz?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Bu konumu kaldırmak istediğinizden emin misiniz?"
 msgstr "Bu konumu kaldırmak istediğinizden emin misiniz?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "Tüm bildirimleri temizlemek istediğinizden emin misiniz?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "ChatGPT'den Yardım İsteyin"
 msgstr "ChatGPT'den Yardım İsteyin"
@@ -693,8 +703,8 @@ msgstr "Açıklama"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Sil"
 msgstr "Sil"
 
 
@@ -703,53 +713,53 @@ msgstr "Sil"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "Kalıcı Olarak Sil"
 msgstr "Kalıcı Olarak Sil"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Siteyi sil: %{site_name}"
 msgstr "Siteyi sil: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Akışı sil: %{stream_name}"
 msgstr "Akışı sil: %{stream_name}"
 
 
@@ -802,8 +812,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Yönergeler"
 msgstr "Yönergeler"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "Devre Dışı"
 msgstr "Devre Dışı"
 
 
@@ -811,48 +821,48 @@ msgstr "Devre Dışı"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "%{name} için otomatik yenilemeyi devre dışı bırakma başarısız oldu"
 msgstr "%{name} için otomatik yenilemeyi devre dışı bırakma başarısız oldu"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr ""
 msgstr ""
@@ -867,14 +877,14 @@ msgstr ""
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Devre dışı"
 msgstr "Devre dışı"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Başarıyla devre dışı bırakıldı"
 msgstr "Başarıyla devre dışı bırakıldı"
 
 
@@ -973,9 +983,9 @@ msgstr ""
 "kullanamazsınız."
 "kullanamazsınız."
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Kopyala"
 msgstr "Kopyala"
 
 
@@ -1015,8 +1025,8 @@ msgstr "E-posta"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "E-posta(*)"
 msgstr "E-posta(*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "Etkinleştir"
 msgstr "Etkinleştir"
 
 
@@ -1037,48 +1047,48 @@ msgstr "Etkinleştirme başarısız"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "TOTP'yi Etkinleştir"
 msgstr "TOTP'yi Etkinleştir"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarısız "
 "oldu"
 "oldu"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr ""
 msgstr ""
@@ -1104,16 +1114,16 @@ msgstr "TOTP'yi Etkinleştir"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Etkin"
 msgstr "Etkin"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Başarıyla etkinleştirildi"
 msgstr "Başarıyla etkinleştirildi"
 
 
@@ -1124,7 +1134,7 @@ msgstr "Let's Encrypt ile web sitesini şifreleyin"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Ortam"
 msgstr "Ortam"
@@ -1140,7 +1150,7 @@ msgstr "Ortam değişkenleri temizlendi"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "Ortamlar"
 msgstr "Ortamlar"
 
 
@@ -1314,16 +1324,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Devre dışı bırakılamadı %{msg}"
 msgstr "Devre dışı bırakılamadı %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Etkinleştirilemedi %{msg}"
 msgstr "Etkinleştirilemedi %{msg}"
 
 
@@ -1826,11 +1836,11 @@ msgstr "Liste"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Yük Ortalaması:"
 msgstr "Yük Ortalaması:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "Ayarlar'dan yükle"
 msgstr "Ayarlar'dan yükle"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Başarıyla yüklendi"
 msgstr "Başarıyla yüklendi"
 
 
@@ -1903,12 +1913,12 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Yapılandırmaları Yönet"
 msgstr "Yapılandırmaları Yönet"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 #, fuzzy
 #, fuzzy
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Siteleri Yönet"
 msgstr "Siteleri Yönet"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Akışları Yönet"
 msgstr "Akışları Yönet"
@@ -1994,7 +2004,7 @@ msgstr "Çok Hatlı Direktif"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 #, fuzzy
 #, fuzzy
 msgid "Name"
 msgid "Name"
 msgstr "İsim"
 msgstr "İsim"
@@ -2139,6 +2149,10 @@ msgstr "Nginx Hata Günlüğü Yolu"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 #, fuzzy
 #, fuzzy
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
@@ -2149,6 +2163,10 @@ msgstr "Nginx başarıyla yeniden yüklendi"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Terminal Başlatma Komutu"
 msgstr "Terminal Başlatma Komutu"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 #, fuzzy
 #, fuzzy
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
@@ -2176,6 +2194,8 @@ msgid ""
 msgstr "Nginx Yapılandırma Ayrıştırma Hatası"
 msgstr "Nginx Yapılandırma Ayrıştırma Hatası"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2187,8 +2207,8 @@ msgstr "Nginx Yapılandırma Ayrıştırma Hatası"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 #, fuzzy
 #, fuzzy
 msgid "No"
 msgid "No"
 msgstr "Hayır"
 msgstr "Hayır"
@@ -2276,6 +2296,7 @@ msgstr ""
 "OCSP Must Staple, Firefox kullanarak ilk erişimde bazı kullanıcılar için "
 "OCSP Must Staple, Firefox kullanarak ilk erişimde bazı kullanıcılar için "
 "hatalara neden olabilir."
 "hatalara neden olabilir."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2301,9 +2322,9 @@ msgstr "Tamam"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 #, fuzzy
 #, fuzzy
 msgid "OK"
 msgid "OK"
@@ -2314,6 +2335,7 @@ msgstr "Tamam"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "Doğrulama tamamlandıktan sonra kayıtlar kaldırılacaktır."
 msgstr "Doğrulama tamamlandıktan sonra kayıtlar kaldırılacaktır."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2567,7 +2589,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Lütfen en az bir düğüm seçin!"
 msgstr "Lütfen en az bir düğüm seçin!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
+
+#: src/views/environments/list/Environment.vue:91
 #, fuzzy
 #, fuzzy
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
 msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
@@ -2736,6 +2770,37 @@ msgstr "Yayın Notu"
 msgid "Reload"
 msgid "Reload"
 msgstr "Tekrar yükle"
 msgstr "Tekrar yükle"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Nginx'i yeniden yükleme"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Siteyi sil: %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Nginx kullanıcı arayüzü %{node} üzerinde başarıyla yükseltildi 🎉"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 #, fuzzy
 #, fuzzy
 msgid "Reloading"
 msgid "Reloading"
@@ -2772,67 +2837,67 @@ msgstr "Başarıyla kaldırıldı"
 msgid "Rename"
 msgid "Rename"
 msgstr "Yeniden Adlandır"
 msgstr "Yeniden Adlandır"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr ""
 msgstr ""
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr ""
 msgstr ""
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr ""
 msgstr ""
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr ""
 msgstr ""
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr ""
 msgstr ""
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 "2] üzerinde %{orig_path}'ı %{new_path} olarak başarıyla yeniden adlandırın"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr ""
 msgstr ""
@@ -2896,6 +2961,39 @@ msgstr "2FA'yı Sıfırla"
 msgid "Restart"
 msgid "Restart"
 msgstr "Yeniden başlat"
 msgstr "Yeniden başlat"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Yeniden Başlatma"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr ""
+"%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
+"oldu"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Nginx kullanıcı arayüzü %{node} üzerinde başarıyla yükseltildi 🎉"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 #, fuzzy
 #, fuzzy
 msgid "Restarting"
 msgid "Restarting"
@@ -2974,43 +3072,43 @@ msgstr "Direktifi Kaydet"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Hatayı kaydet %{msg}"
 msgstr "Hatayı kaydet %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandır Hatası"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 msgstr "Uzak Yapılandırmayı Yeniden Adlandırma Başarılı"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr ""
 msgstr ""
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 "%{conf_name} yapılandırmasını %{node_name} düğümüne dağıtma başarısız oldu"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
 msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
@@ -3262,7 +3360,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 #, fuzzy
 #, fuzzy
 msgid "Status"
 msgid "Status"
 msgstr "Durum"
 msgstr "Durum"
@@ -3346,46 +3444,47 @@ msgstr "Eşitle"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Senkronizasyon Sertifikası"
 msgstr "Senkronizasyon Sertifikası"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin"
 msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin"
 msgstr "Sertifika %{cert_name}'ı %{env_name} ile başarıyla senkronize edin"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Senkronizasyon Sertifikası Hatası"
 msgstr "Senkronizasyon Sertifikası Hatası"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Senkronizasyon Sertifikası Başarısı"
 msgstr "Senkronizasyon Sertifikası Başarısı"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin"
 msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin"
 msgstr "Config %{config_name} ile %{env_name}'i başarıyla senkronize edin"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Senkronizasyon Yapılandırma Hatası"
 msgstr "Senkronizasyon Yapılandırma Hatası"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Senkronizasyon Yapılandırması Başarılı"
 msgstr "Senkronizasyon Yapılandırması Başarılı"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 #, fuzzy
 #, fuzzy
 msgid "Sync Nodes"
 msgid "Sync Nodes"
@@ -3764,7 +3863,7 @@ msgstr "Güncellendi"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 #, fuzzy
 #, fuzzy
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Güncelleme"
 msgstr "Güncelleme"
@@ -3775,7 +3874,8 @@ msgid "Updated successfully"
 msgstr "Başarıyla güncellendi"
 msgstr "Başarıyla güncellendi"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #, fuzzy
 #, fuzzy
 msgid "Upgrade"
 msgid "Upgrade"
@@ -3983,6 +4083,8 @@ msgstr "Sertifika özel anahtarını diske yazma"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Sertifikayı diske yazma"
 msgstr "Sertifikayı diske yazma"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -4082,12 +4184,6 @@ msgstr "Geçiş anahtarlarınız"
 #~ "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme "
 #~ "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme "
 #~ "başarılı oldu"
 #~ "başarılı oldu"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr ""
-#~ "%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme "
-#~ "başarılı oldu"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Başarıyla etkinleştirildi"
 #~ msgstr "Başarıyla etkinleştirildi"
 
 
@@ -4097,10 +4193,6 @@ msgstr "Geçiş anahtarlarınız"
 #~ "0] yapılandırmasını %{env_name} ile eşitleme başarısız oldu, lütfen uzak "
 #~ "0] yapılandırmasını %{env_name} ile eşitleme başarısız oldu, lütfen uzak "
 #~ "Nginx kullanıcı arayüzünü en son sürüme yükseltin"
 #~ "Nginx kullanıcı arayüzünü en son sürüme yükseltin"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Siteyi sil: %{site_name}"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 192 - 102
app/src/language/vi_VN/app.po

@@ -45,7 +45,7 @@ msgstr "Người dùng"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "Hành động"
 msgstr "Hành động"
@@ -56,7 +56,7 @@ msgstr "Hành động"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "Thêm"
 msgstr "Thêm"
 
 
@@ -84,12 +84,12 @@ msgstr "Thêm Location"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "Thêm Website"
 msgstr "Thêm Website"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 #, fuzzy
 #, fuzzy
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "Thêm Website"
 msgstr "Thêm Website"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #, fuzzy
 #, fuzzy
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "Cập nhật thành công"
 msgstr "Cập nhật thành công"
@@ -108,8 +108,8 @@ msgstr "Nâng cao"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr ""
 msgstr ""
 
 
@@ -201,8 +201,8 @@ msgstr "Bạn chắc chắn muốn xóa nó "
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "Bạn chắc chắn muốn xóa nó "
 msgstr "Bạn chắc chắn muốn xóa nó "
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 #, fuzzy
 #, fuzzy
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "Bạn chắc chắn muốn xóa nó "
 msgstr "Bạn chắc chắn muốn xóa nó "
@@ -212,6 +212,11 @@ msgstr "Bạn chắc chắn muốn xóa nó "
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "Bạn chắc chắn muốn xóa nó "
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
 msgstr "Bạn chắc chắn muốn xoá directive này ?"
@@ -226,6 +231,11 @@ msgstr "Bạn chắc chắn muốn xoá directive này ?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "Bạn chắc chắn muốn xoá location này ?"
 msgstr "Bạn chắc chắn muốn xoá location này ?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+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:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "Hỏi ChatGPT"
 msgstr "Hỏi ChatGPT"
@@ -719,8 +729,8 @@ msgstr "Mô tả"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "Xoá"
 msgstr "Xoá"
 
 
@@ -729,51 +739,51 @@ msgstr "Xoá"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr ""
 msgstr ""
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 #, fuzzy
 #, fuzzy
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 #, fuzzy
 #, fuzzy
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "Xoá trang web: %{site_name}"
 msgstr "Xoá trang web: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 #, fuzzy
 #, fuzzy
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 #, fuzzy
 #, fuzzy
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "Xoá trang web: %{site_name}"
 msgstr "Xoá trang web: %{site_name}"
@@ -828,8 +838,8 @@ msgstr ""
 msgid "Directives"
 msgid "Directives"
 msgstr "Directives"
 msgstr "Directives"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 #, fuzzy
 #, fuzzy
 msgid "Disable"
 msgid "Disable"
 msgstr "Tắt"
 msgstr "Tắt"
@@ -838,42 +848,42 @@ msgstr "Tắt"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Tắt tự động gia hạn SSL cho %{name} thất bại"
 msgstr "Tắt tự động gia hạn SSL cho %{name} thất bại"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 #, fuzzy
 #, fuzzy
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
@@ -886,14 +896,14 @@ msgstr "Đã bật %{conf_name} trên %{node_name}"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "Đã tắt"
 msgstr "Đã tắt"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "Đã tắt thành công"
 msgstr "Đã tắt thành công"
 
 
@@ -996,9 +1006,9 @@ msgid ""
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "Nhân bản"
 msgstr "Nhân bản"
 
 
@@ -1041,8 +1051,8 @@ msgstr "Email (*)"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "Email (*)"
 msgstr "Email (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 #, fuzzy
 #, fuzzy
 msgid "Enable"
 msgid "Enable"
 msgstr "Đã bật"
 msgstr "Đã bật"
@@ -1065,42 +1075,42 @@ msgstr "Bật không thành công"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "Bật TLS"
 msgstr "Bật TLS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 msgstr "Không thể bật %{conf_name} trên %{node_name}"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
 msgstr "Đã bật %{conf_name} trên %{node_name}"
@@ -1125,16 +1135,16 @@ msgstr "Bật TLS"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "Đã bật"
 msgstr "Đã bật"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "Đã bật"
 msgstr "Đã bật"
 
 
@@ -1145,7 +1155,7 @@ msgstr "Bảo mật trang web với Let's Encrypt"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "Environment"
 msgstr "Environment"
@@ -1162,7 +1172,7 @@ msgstr "Đặt biến môi trường"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 #, fuzzy
 #, fuzzy
 msgid "Environments"
 msgid "Environments"
 msgstr "Environments"
 msgstr "Environments"
@@ -1339,16 +1349,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "Không thể tắt %{msg}"
 msgstr "Không thể tắt %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "Không thể bật %{msg}"
 msgstr "Không thể bật %{msg}"
 
 
@@ -1855,11 +1865,11 @@ msgstr ""
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "Tải trung bình:"
 msgstr "Tải trung bình:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr ""
 msgstr ""
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 #, fuzzy
 #, fuzzy
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "Lưu thành công"
 msgstr "Lưu thành công"
@@ -1927,11 +1937,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "Quản lý cấu hình"
 msgstr "Quản lý cấu hình"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "Quản lý Website"
 msgstr "Quản lý Website"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 #, fuzzy
 #, fuzzy
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "Quản lý Website"
 msgstr "Quản lý Website"
@@ -2010,7 +2020,7 @@ msgstr "Single Directive"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "Tên"
 msgstr "Tên"
 
 
@@ -2142,6 +2152,10 @@ msgstr "Vị trí lưu log lỗi (Error log) của Nginx"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 #, fuzzy
 #, fuzzy
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
@@ -2151,6 +2165,10 @@ msgstr "Reload Nginx thành công"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr ""
 msgstr ""
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 #, fuzzy
 #, fuzzy
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
@@ -2177,6 +2195,8 @@ msgid ""
 msgstr "Lỗi phân tích cú pháp cấu hình Nginx"
 msgstr "Lỗi phân tích cú pháp cấu hình Nginx"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2188,8 +2208,8 @@ msgstr "Lỗi phân tích cú pháp cấu hình Nginx"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "Không"
 msgstr "Không"
 
 
@@ -2266,6 +2286,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr ""
 msgstr ""
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2289,9 +2310,9 @@ msgstr ""
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr ""
 msgstr ""
@@ -2300,6 +2321,7 @@ msgstr ""
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa."
 msgstr "Sau khi quá trình xác minh hoàn tất, bản ghi sẽ bị xóa."
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2516,7 +2538,17 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "Vui lòng nhập username!"
 msgstr "Vui lòng nhập username!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+msgid "Please select at least one node to reload Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+msgid "Please select at least one node to restart Nginx"
+msgstr ""
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr ""
 msgstr ""
 
 
@@ -2663,6 +2695,37 @@ msgstr "Ghi chú phát hành"
 msgid "Reload"
 msgid "Reload"
 msgstr "Tải lại"
 msgstr "Tải lại"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "Tải lại nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "Xoá trang web: %{site_name}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "Cập nhật thành công"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "Gia hạn chứng chỉ SSL thất bại"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "Gia hạn chứng chỉ SSL thành công"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "Đang tải lại"
 msgstr "Đang tải lại"
@@ -2696,62 +2759,62 @@ msgstr "Xoá thành công"
 msgid "Rename"
 msgid "Rename"
 msgstr "Username"
 msgstr "Username"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
@@ -2811,6 +2874,37 @@ msgstr "Đặt lại"
 msgid "Restart"
 msgid "Restart"
 msgstr "Khởi động lại"
 msgstr "Khởi động lại"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "Đang khởi động lại"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "Đã bật %{conf_name} trên %{node_name}"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "Cập nhật thành công"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "Gia hạn chứng chỉ SSL thất bại"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "Gia hạn chứng chỉ SSL thành công"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "Đang khởi động lại"
 msgstr "Đang khởi động lại"
@@ -2884,42 +2978,42 @@ msgstr "Lưu Directive"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "Đã xảy ra lỗi khi lưu %{msg}"
 msgstr "Đã xảy ra lỗi khi lưu %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 msgstr "Triển khai %{conf_name} tới %{node_name} thất bại"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
@@ -3148,7 +3242,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "Trạng thái"
 msgstr "Trạng thái"
 
 
@@ -3224,46 +3318,47 @@ msgstr ""
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "Gia hạn chứng chỉ SSL"
 msgstr "Gia hạn chứng chỉ SSL"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 msgstr "Gia hạn chứng chỉ SSL thất bại"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 msgstr "Gia hạn chứng chỉ SSL thành công"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr ""
 msgstr ""
@@ -3582,7 +3677,7 @@ msgstr "Cập nhật thành công"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "Ngày cập nhật"
 msgstr "Ngày cập nhật"
 
 
@@ -3592,7 +3687,8 @@ msgid "Updated successfully"
 msgstr "Cập nhật thành công"
 msgstr "Cập nhật thành công"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "Cập nhật"
 msgstr "Cập nhật"
@@ -3778,6 +3874,8 @@ msgstr "Ghi Private Key vào disk"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "Ghi chứng chỉ vào disk"
 msgstr "Ghi chứng chỉ vào disk"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3869,10 +3967,6 @@ msgstr ""
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "Đã bật %{conf_name} trên %{node_name}"
 #~ msgstr "Đã bật %{conf_name} trên %{node_name}"
 
 
-#, fuzzy
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "Đã bật %{conf_name} trên %{node_name}"
-
 #, fuzzy
 #, fuzzy
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "Đã bật"
 #~ msgstr "Đã bật"
@@ -3881,10 +3975,6 @@ msgstr ""
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 #~ msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
 
 
-#, fuzzy
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "Xoá trang web: %{site_name}"
-
 #, fuzzy
 #, fuzzy
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "

+ 197 - 111
app/src/language/zh_CN/app.po

@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 msgstr ""
 "Project-Id-Version: \n"
 "Project-Id-Version: \n"
 "POT-Creation-Date: \n"
 "POT-Creation-Date: \n"
-"PO-Revision-Date: 2025-04-05 10:58+0800\n"
+"PO-Revision-Date: 2025-04-05 15:35+0800\n"
 "Last-Translator: 0xJacky <me@jackyu.cn>\n"
 "Last-Translator: 0xJacky <me@jackyu.cn>\n"
 "Language-Team: Chinese (Simplified Han script) <https://weblate.nginxui.com/"
 "Language-Team: Chinese (Simplified Han script) <https://weblate.nginxui.com/"
 "projects/nginx-ui/frontend/zh_Hans/>\n"
 "projects/nginx-ui/frontend/zh_Hans/>\n"
@@ -49,7 +49,7 @@ msgstr "ACME 用户"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "操作"
 msgstr "操作"
@@ -60,7 +60,7 @@ msgstr "操作"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "添加"
 msgstr "添加"
 
 
@@ -87,11 +87,11 @@ msgstr "添加 Location"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "添加站点"
 msgstr "添加站点"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "添加 Stream"
 msgstr "添加 Stream"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "添加成功"
 msgstr "添加成功"
 
 
@@ -108,8 +108,8 @@ msgstr "高级模式"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "然后,刷新此页面并再次点击添加 Passkey。"
 msgstr "然后,刷新此页面并再次点击添加 Passkey。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "全部"
 msgstr "全部"
 
 
@@ -190,8 +190,8 @@ msgstr "您确定要永久删除此项目吗?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "你确定要删除这个项目吗?"
 msgstr "你确定要删除这个项目吗?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 msgstr "您确定要删除吗?"
 
 
@@ -199,6 +199,10 @@ msgstr "您确定要删除吗?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "您确定要恢复这个项目吗?"
 msgstr "您确定要恢复这个项目吗?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "你确定要在以下同步节点上重载 Nginx?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "您确定要删除这条指令?"
 msgstr "您确定要删除这条指令?"
@@ -211,6 +215,10 @@ msgstr "您确定要删除这个项目吗?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "您确定要删除这个 Location?"
 msgstr "您确定要删除这个 Location?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "你确定要在以下同步节点上重启 Nginx 吗?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "与ChatGPT聊天"
 msgstr "与ChatGPT聊天"
@@ -675,8 +683,8 @@ msgstr "解密失败"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "删除"
 msgstr "删除"
 
 
@@ -685,43 +693,43 @@ msgstr "删除"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "彻底删除"
 msgstr "彻底删除"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "删除远程站点错误"
 msgstr "删除远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "删除远程站点成功"
 msgstr "删除远程站点成功"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "删除远程 Stream 错误"
 msgstr "删除远程 Stream 错误"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "删除远程 Stream 成功"
 msgstr "删除远程 Stream 成功"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "部署 %{name} 到 %{node} 失败"
 msgstr "部署 %{name} 到 %{node} 失败"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "成功从 %{node} 中删除站点 %{name}"
 msgstr "成功从 %{node} 中删除站点 %{name}"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "删除站点: %{site_name}"
 msgstr "删除站点: %{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "部署 %{name} 到 %{node} 失败"
 msgstr "部署 %{name} 到 %{node} 失败"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "成功从 %{node} 中删除站点 %{name}"
 msgstr "成功从 %{node} 中删除站点 %{name}"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "删除 Stream: %{stream_name}"
 msgstr "删除 Stream: %{stream_name}"
 
 
@@ -774,8 +782,8 @@ msgstr "指令 index 超出范围"
 msgid "Directives"
 msgid "Directives"
 msgstr "指令"
 msgstr "指令"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "禁用"
 msgstr "禁用"
 
 
@@ -783,35 +791,35 @@ msgstr "禁用"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "关闭 %{name} 自动续签失败"
 msgstr "关闭 %{name} 自动续签失败"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "禁用远程站点错误"
 msgstr "禁用远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "禁用远程站点成功"
 msgstr "禁用远程站点成功"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "禁用远程 Stream 错误"
 msgstr "禁用远程 Stream 错误"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "禁用远程 Stream成功"
 msgstr "禁用远程 Stream成功"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "在 %{node} 中启用 %{name} 失败"
 msgstr "在 %{node} 中启用 %{name} 失败"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 msgstr "在 %{node} 上禁用 %{name} 成功"
 
 
@@ -823,14 +831,14 @@ msgstr "在 %{node} 上禁用 %{name} 成功"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "禁用"
 msgstr "禁用"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "禁用成功"
 msgstr "禁用成功"
 
 
@@ -924,9 +932,9 @@ msgstr ""
 "使用 Passkey。"
 "使用 Passkey。"
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "复制"
 msgstr "复制"
 
 
@@ -965,8 +973,8 @@ msgstr "邮箱"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 msgstr "邮箱 (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "启用"
 msgstr "启用"
 
 
@@ -986,35 +994,35 @@ msgstr "启用失败"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "启用 HTTPS"
 msgstr "启用 HTTPS"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "启用远程站点错误"
 msgstr "启用远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "启用远程站点成功"
 msgstr "启用远程站点成功"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "启用远程 Steam 错误"
 msgstr "启用远程 Steam 错误"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "启用远程 Stream 成功"
 msgstr "启用远程 Stream 成功"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "在 %{node} 中启用 %{name} 失败"
 msgstr "在 %{node} 中启用 %{name} 失败"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "在 %{node} 上启用 %{name} 成功"
 msgstr "在 %{node} 上启用 %{name} 成功"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "在 %{node} 中启用 %{name} 失败"
 msgstr "在 %{node} 中启用 %{name} 失败"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "在 %{node} 上启用 %{name} 成功"
 msgstr "在 %{node} 上启用 %{name} 成功"
 
 
@@ -1037,16 +1045,16 @@ msgstr "启用 TOTP"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "启用"
 msgstr "启用"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "启用成功"
 msgstr "启用成功"
 
 
@@ -1057,7 +1065,7 @@ msgstr "用 Let's Encrypt 对网站进行加密"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "环境组"
 msgstr "环境组"
 
 
@@ -1071,7 +1079,7 @@ msgstr "环境变量已清理"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "环境"
 msgstr "环境"
 
 
@@ -1226,16 +1234,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr "解密 Nginx UI 目录失败:{0}"
 msgstr "解密 Nginx UI 目录失败:{0}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 msgstr "禁用失败 %{msg}"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 msgstr "启用失败 %{msg}"
 
 
@@ -1709,11 +1717,11 @@ msgstr "列表"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "系统负载:"
 msgstr "系统负载:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "从设置中加载"
 msgstr "从设置中加载"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "加载成功"
 msgstr "加载成功"
 
 
@@ -1781,11 +1789,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "配置管理"
 msgstr "配置管理"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "网站管理"
 msgstr "网站管理"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "管理 Stream"
 msgstr "管理 Stream"
 
 
@@ -1858,7 +1866,7 @@ msgstr "多行指令"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "名称"
 msgstr "名称"
 
 
@@ -1981,6 +1989,10 @@ msgstr "Nginx PID 路径"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Nginx 重载命令"
 msgstr "Nginx 重载命令"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr "Nginx 重载操作已发送到远程节点"
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "Nginx 重载成功"
 msgstr "Nginx 重载成功"
@@ -1989,6 +2001,10 @@ msgstr "Nginx 重载成功"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Nginx 重启命令"
 msgstr "Nginx 重启命令"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr "Nginx 重启操作已发送到远程节点"
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重启成功"
 msgstr "Nginx 重启成功"
@@ -2012,6 +2028,8 @@ msgid ""
 msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。"
 msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2023,8 +2041,8 @@ msgstr "Nginx UI 配置已恢复,几秒钟后将自动重启。"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "取消"
 msgstr "取消"
 
 
@@ -2095,6 +2113,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr "某些用户在使用 Firefox 首次访问时,OCSP Must Staple 可能会导致错误。"
 msgstr "某些用户在使用 Firefox 首次访问时,OCSP Must Staple 可能会导致错误。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2118,9 +2137,9 @@ msgstr "确定"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "确定"
 msgstr "确定"
@@ -2129,6 +2148,7 @@ msgstr "确定"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "一旦验证完成,这些记录将被删除。"
 msgstr "一旦验证完成,这些记录将被删除。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2337,7 +2357,17 @@ msgstr "请保存此安全令牌,恢复时会用到它:"
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "请选择备份文件"
 msgstr "请选择备份文件"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+msgid "Please select at least one node to reload Nginx"
+msgstr "请至少选择一个节点重载 Nginx"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+msgid "Please select at least one node to restart Nginx"
+msgstr "请至少选择一个节点重启 Nginx"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "请至少选择一个节点进行升级"
 msgstr "请至少选择一个节点进行升级"
 
 
@@ -2477,6 +2507,32 @@ msgstr "发行日志"
 msgid "Reload"
 msgid "Reload"
 msgstr "重载"
 msgstr "重载"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+msgid "Reload Nginx"
+msgstr "重载 Nginx"
+
+#: src/components/Notification/notifications.ts:16
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "在 %{node} 上重载 Nginx 失败,响应:%{resp}"
+
+#: src/components/Notification/notifications.ts:20
+msgid "Reload Nginx on %{node} successfully"
+msgstr "在 %{node} 上重载 Nginx 成功"
+
+#: src/components/Notification/notifications.ts:15
+msgid "Reload Remote Nginx Error"
+msgstr "重载远程 Nginx 错误"
+
+#: src/components/Notification/notifications.ts:19
+msgid "Reload Remote Nginx Success"
+msgstr "重载远程 Nginx 成功"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr "重载请求失败,请检查网络连接"
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "重载中"
 msgstr "重载中"
@@ -2507,51 +2563,51 @@ msgstr "删除成功"
 msgid "Rename"
 msgid "Rename"
 msgstr "重命名"
 msgstr "重命名"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}"
 msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}"
 msgstr "成功将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path}"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "远程配置重命名错误"
 msgstr "远程配置重命名错误"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "重命名远程配置成功"
 msgstr "重命名远程配置成功"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "重命名远程站点错误"
 msgstr "重命名远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "重命名远程站点成功"
 msgstr "重命名远程站点成功"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "重命名远程 Stream 错误"
 msgstr "重命名远程 Stream 错误"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "重命名远程 Stream成功"
 msgstr "重命名远程 Stream成功"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 msgstr "在 %{node} 上将站点 %{name} 重命名为 %{new_name} 成功"
 
 
@@ -2603,6 +2659,32 @@ msgstr "重置二步验证"
 msgid "Restart"
 msgid "Restart"
 msgstr "重启"
 msgstr "重启"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+msgid "Restart Nginx"
+msgstr "重启 Nginx"
+
+#: src/components/Notification/notifications.ts:24
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "在 %{node} 上重启 Nginx 失败,响应:%{resp}"
+
+#: src/components/Notification/notifications.ts:28
+msgid "Restart Nginx on %{node} successfully"
+msgstr "在 %{node} 上重启 Nginx 成功"
+
+#: src/components/Notification/notifications.ts:23
+msgid "Restart Remote Nginx Error"
+msgstr "重启远程 Nginx 错误"
+
+#: src/components/Notification/notifications.ts:27
+msgid "Restart Remote Nginx Success"
+msgstr "重启远程 Nginx 成功"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr "重启请求失败,请检查网络连接"
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "重启中"
 msgstr "重启中"
@@ -2671,35 +2753,35 @@ msgstr "保存指令"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
 msgstr "保存错误 %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "保存远程站点错误"
 msgstr "保存远程站点错误"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "保存远程站点成功"
 msgstr "保存远程站点成功"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "保存远程 Stream 错误"
 msgstr "保存远程 Stream 错误"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "保存远程 Stream 成功"
 msgstr "保存远程 Stream 成功"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "部署 %{name} 到 %{node} 失败"
 msgstr "部署 %{name} 到 %{node} 失败"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 msgstr "成功将站点 %{name} 保存到 %{node} 中"
 
 
@@ -2792,19 +2874,19 @@ msgstr "使用 HTTP01 challenge provider"
 
 
 #: src/constants/errors/nginx_log.ts:8
 #: src/constants/errors/nginx_log.ts:8
 msgid ""
 msgid ""
-"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://"
-"nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.AccessLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
 msgstr ""
-"Settings.NginxLogSettings.AccessLogPath 为空,更多信息请参阅 https://"
-"nginxui.com/guide/config-nginx.html"
+"Settings.NginxLogSettings.AccessLogPath 为空,更多信息请参阅 https://nginxui."
+"com/guide/config-nginx.html"
 
 
 #: src/constants/errors/nginx_log.ts:7
 #: src/constants/errors/nginx_log.ts:7
 msgid ""
 msgid ""
-"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://"
-"nginxui.com/guide/config-nginx.html for more information"
+"Settings.NginxLogSettings.ErrorLogPath is empty, refer to https://nginxui."
+"com/guide/config-nginx.html for more information"
 msgstr ""
 msgstr ""
-"Settings.NginxLogSettings.ErrorLogPath为空,更多信息请参阅 https://"
-"nginxui.com/guide/config-nginx.html"
+"Settings.NginxLogSettings.ErrorLogPath为空,更多信息请参阅 https://nginxui."
+"com/guide/config-nginx.html"
 
 
 #: src/components/SensitiveString/SensitiveString.vue:40
 #: src/components/SensitiveString/SensitiveString.vue:40
 msgid "Show"
 msgid "Show"
@@ -2917,7 +2999,7 @@ msgstr "开始还原"
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "状态"
 msgstr "状态"
 
 
@@ -2990,38 +3072,39 @@ msgstr "同步"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "同步证书"
 msgstr "同步证书"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "证书 %{cert_name} 已成功同步到 %{env_name}"
 msgstr "证书 %{cert_name} 已成功同步到 %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "证书 %{cert_name} 已成功同步到 %{env_name}"
 msgstr "证书 %{cert_name} 已成功同步到 %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "同步证书错误"
 msgstr "同步证书错误"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "同步证书成功"
 msgstr "同步证书成功"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "配置 %{config_name} 成功同步到 %{env_name}"
 msgstr "配置 %{config_name} 成功同步到 %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "配置 %{config_name} 成功同步到 %{env_name}"
 msgstr "配置 %{config_name} 成功同步到 %{env_name}"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "同步配置错误"
 msgstr "同步配置错误"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "同步配置成功"
 msgstr "同步配置成功"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr "同步节点"
 msgstr "同步节点"
@@ -3334,7 +3417,7 @@ msgstr "更新成功"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "修改时间"
 msgstr "修改时间"
 
 
@@ -3343,7 +3426,8 @@ msgid "Updated successfully"
 msgstr "更新成功"
 msgstr "更新成功"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "升级"
 msgstr "升级"
@@ -3525,6 +3609,8 @@ msgstr "正在将证书私钥写入磁盘"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "正在将证书写入磁盘"
 msgstr "正在将证书写入磁盘"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3585,6 +3671,12 @@ msgstr "您的旧代码将不再有效。"
 msgid "Your passkeys"
 msgid "Your passkeys"
 msgstr "你的 Passkeys"
 msgstr "你的 Passkeys"
 
 
+#~ msgid "Nginx has been reloaded on all sync nodes"
+#~ msgstr "已在所有同步节点上重新加载 Nginx"
+
+#~ msgid "Nginx has been restarted on all sync nodes"
+#~ msgstr "已在所有同步节点上重启 Nginx"
+
 #~ msgid "Category"
 #~ msgid "Category"
 #~ msgstr "分类"
 #~ msgstr "分类"
 
 
@@ -3616,21 +3708,15 @@ msgstr "你的 Passkeys"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "成功启用%{node_name}中的%{conf_name}"
 #~ msgstr "成功启用%{node_name}中的%{conf_name}"
 
 
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "在 %{node} 上启用 %{site} 失败,响应:%{resp}"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "启用成功"
 #~ msgstr "启用成功"
 
 
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "请将远程 Nginx UI 升级到最新版本"
 #~ msgstr "请将远程 Nginx UI 升级到最新版本"
 
 
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "从 %{node} 中删除站点 %{site} 错误,响应:%{resp}"
-
 #~ msgid ""
 #~ msgid ""
-#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: %"
-#~ "{resp}"
+#~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
+#~ "%{resp}"
 #~ msgstr ""
 #~ msgstr ""
 #~ "将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path} 失败,响应:%{resp}"
 #~ "将 %{env_name} 上的 %{orig_path} 重命名为 %{new_path} 失败,响应:%{resp}"
 
 

+ 194 - 100
app/src/language/zh_TW/app.po

@@ -54,7 +54,7 @@ msgstr "ACME 用戶"
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/nginx_log/NginxLogList.vue:53
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/notification/notificationColumns.tsx:66
 #: src/views/preference/AuthSettings.vue:30
 #: src/views/preference/AuthSettings.vue:30
-#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:71
+#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:72
 #: src/views/user/userColumns.tsx:60
 #: src/views/user/userColumns.tsx:60
 msgid "Action"
 msgid "Action"
 msgstr "操作"
 msgstr "操作"
@@ -65,7 +65,7 @@ msgstr "操作"
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/config_template/ConfigTemplate.vue:117
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxServer.vue:163
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
 #: src/views/site/ngx_conf/NgxUpstream.vue:154
-#: src/views/stream/StreamList.vue:174
+#: src/views/stream/StreamList.vue:175
 msgid "Add"
 msgid "Add"
 msgstr "新增"
 msgstr "新增"
 
 
@@ -92,11 +92,11 @@ msgstr "新增 Location"
 msgid "Add Site"
 msgid "Add Site"
 msgstr "新增網站"
 msgstr "新增網站"
 
 
-#: src/views/stream/StreamList.vue:243
+#: src/views/stream/StreamList.vue:241
 msgid "Add Stream"
 msgid "Add Stream"
 msgstr "新增 Stream"
 msgstr "新增 Stream"
 
 
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 msgid "Added successfully"
 msgid "Added successfully"
 msgstr "添加成功"
 msgstr "添加成功"
 
 
@@ -113,8 +113,8 @@ msgstr "進階模式"
 msgid "Afterwards, refresh this page and click add passkey again."
 msgid "Afterwards, refresh this page and click add passkey again."
 msgstr "然後,重新整理此頁面並再次點選新增通行密鑰。"
 msgstr "然後,重新整理此頁面並再次點選新增通行密鑰。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:135
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:419
-#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:180
 msgid "All"
 msgid "All"
 msgstr "全部"
 msgstr "全部"
 
 
@@ -196,8 +196,8 @@ msgstr "您確定要永久刪除此項目嗎?"
 msgid "Are you sure you want to delete this item?"
 msgid "Are you sure you want to delete this item?"
 msgstr "您確定要刪除此項目嗎?"
 msgstr "您確定要刪除此項目嗎?"
 
 
-#: src/views/site/site_list/SiteList.vue:145
-#: src/views/stream/StreamList.vue:227
+#: src/views/site/site_list/SiteList.vue:143
+#: src/views/stream/StreamList.vue:225
 msgid "Are you sure you want to delete?"
 msgid "Are you sure you want to delete?"
 msgstr "您確定要刪除嗎?"
 msgstr "您確定要刪除嗎?"
 
 
@@ -205,6 +205,11 @@ msgstr "您確定要刪除嗎?"
 msgid "Are you sure you want to recover this item?"
 msgid "Are you sure you want to recover this item?"
 msgstr "您確定要恢復此項目嗎?"
 msgstr "您確定要恢復此項目嗎?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:149
+#, fuzzy
+msgid "Are you sure you want to reload Nginx on the following sync nodes?"
+msgstr "您確定要應用於所有選擇項目嗎?"
+
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:95
 msgid "Are you sure you want to remove this directive?"
 msgid "Are you sure you want to remove this directive?"
 msgstr "您確定要刪除這條指令嗎?"
 msgstr "您確定要刪除這條指令嗎?"
@@ -217,6 +222,11 @@ msgstr "您確定要刪除此項目嗎?"
 msgid "Are you sure you want to remove this location?"
 msgid "Are you sure you want to remove this location?"
 msgstr "您確定要刪除此 Location 嗎?"
 msgstr "您確定要刪除此 Location 嗎?"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:161
+#, fuzzy
+msgid "Are you sure you want to restart Nginx on the following sync nodes?"
+msgstr "您確定要清除所有通知嗎?"
+
 #: src/components/ChatGPT/ChatGPT.vue:318
 #: src/components/ChatGPT/ChatGPT.vue:318
 msgid "Ask ChatGPT for Help"
 msgid "Ask ChatGPT for Help"
 msgstr "向 ChatGPT 尋求幫助"
 msgstr "向 ChatGPT 尋求幫助"
@@ -686,8 +696,8 @@ msgstr "解密失敗"
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/components/StdDesign/StdDataDisplay/StdTable.vue:519
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxServer.vue:110
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
 #: src/views/site/ngx_conf/NgxUpstream.vue:128
-#: src/views/site/site_list/SiteList.vue:154
-#: src/views/stream/StreamList.vue:236
+#: src/views/site/site_list/SiteList.vue:152
+#: src/views/stream/StreamList.vue:234
 msgid "Delete"
 msgid "Delete"
 msgstr "刪除"
 msgstr "刪除"
 
 
@@ -696,43 +706,43 @@ msgstr "刪除"
 msgid "Delete Permanently"
 msgid "Delete Permanently"
 msgstr "永久刪除"
 msgstr "永久刪除"
 
 
-#: src/components/Notification/notifications.ts:43 src/language/constants.ts:50
+#: src/components/Notification/notifications.ts:61 src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgid "Delete Remote Site Error"
 msgstr "刪除遠端網站錯誤"
 msgstr "刪除遠端網站錯誤"
 
 
-#: src/components/Notification/notifications.ts:47 src/language/constants.ts:49
+#: src/components/Notification/notifications.ts:65 src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgid "Delete Remote Site Success"
 msgstr "刪除遠端網站成功"
 msgstr "刪除遠端網站成功"
 
 
-#: src/components/Notification/notifications.ts:85
+#: src/components/Notification/notifications.ts:103
 msgid "Delete Remote Stream Error"
 msgid "Delete Remote Stream Error"
 msgstr "刪除遠端串流錯誤"
 msgstr "刪除遠端串流錯誤"
 
 
-#: src/components/Notification/notifications.ts:89
+#: src/components/Notification/notifications.ts:107
 msgid "Delete Remote Stream Success"
 msgid "Delete Remote Stream Success"
 msgstr "刪除遠端串流成功"
 msgstr "刪除遠端串流成功"
 
 
-#: src/components/Notification/notifications.ts:44
+#: src/components/Notification/notifications.ts:62
 msgid "Delete site %{name} from %{node} failed"
 msgid "Delete site %{name} from %{node} failed"
 msgstr "從 %{node} 刪除網站 %{name} 失敗"
 msgstr "從 %{node} 刪除網站 %{name} 失敗"
 
 
-#: src/components/Notification/notifications.ts:48
+#: src/components/Notification/notifications.ts:66
 msgid "Delete site %{name} from %{node} successfully"
 msgid "Delete site %{name} from %{node} successfully"
 msgstr "成功從 %{node} 移除站點 %{name}"
 msgstr "成功從 %{node} 移除站點 %{name}"
 
 
-#: src/views/site/site_list/SiteList.vue:67
+#: src/views/site/site_list/SiteList.vue:68
 msgid "Delete site: %{site_name}"
 msgid "Delete site: %{site_name}"
 msgstr "刪除網站:%{site_name}"
 msgstr "刪除網站:%{site_name}"
 
 
-#: src/components/Notification/notifications.ts:86
+#: src/components/Notification/notifications.ts:104
 msgid "Delete stream %{name} from %{node} failed"
 msgid "Delete stream %{name} from %{node} failed"
 msgstr "部署 %{conf_name} 至 %{node} 失敗"
 msgstr "部署 %{conf_name} 至 %{node} 失敗"
 
 
-#: src/components/Notification/notifications.ts:90
+#: src/components/Notification/notifications.ts:108
 msgid "Delete stream %{name} from %{node} successfully"
 msgid "Delete stream %{name} from %{node} successfully"
 msgstr "成功從 %{node} 移除站點 %{name}"
 msgstr "成功從 %{node} 移除站點 %{name}"
 
 
-#: src/views/stream/StreamList.vue:104
+#: src/views/stream/StreamList.vue:105
 msgid "Delete stream: %{stream_name}"
 msgid "Delete stream: %{stream_name}"
 msgstr "刪除 Stream:%{stream_name}"
 msgstr "刪除 Stream:%{stream_name}"
 
 
@@ -785,8 +795,8 @@ msgstr "指令索引超出範圍"
 msgid "Directives"
 msgid "Directives"
 msgstr "指令"
 msgstr "指令"
 
 
-#: src/views/site/site_list/SiteList.vue:125
-#: src/views/stream/StreamList.vue:207
+#: src/views/site/site_list/SiteList.vue:123
+#: src/views/stream/StreamList.vue:205
 msgid "Disable"
 msgid "Disable"
 msgstr "停用"
 msgstr "停用"
 
 
@@ -794,38 +804,38 @@ msgstr "停用"
 msgid "Disable auto-renewal failed for %{name}"
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "關閉 %{name} 自動續簽失敗"
 msgstr "關閉 %{name} 自動續簽失敗"
 
 
-#: src/components/Notification/notifications.ts:51 src/language/constants.ts:52
+#: src/components/Notification/notifications.ts:69 src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgid "Disable Remote Site Error"
 msgstr "禁用遠端站点錯誤"
 msgstr "禁用遠端站点錯誤"
 
 
-#: src/components/Notification/notifications.ts:55 src/language/constants.ts:51
+#: src/components/Notification/notifications.ts:73 src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgid "Disable Remote Site Success"
 msgstr "禁用遠端站点成功"
 msgstr "禁用遠端站点成功"
 
 
-#: src/components/Notification/notifications.ts:93
+#: src/components/Notification/notifications.ts:111
 msgid "Disable Remote Stream Error"
 msgid "Disable Remote Stream Error"
 msgstr "禁用遠端串流錯誤"
 msgstr "禁用遠端串流錯誤"
 
 
-#: src/components/Notification/notifications.ts:97
+#: src/components/Notification/notifications.ts:115
 msgid "Disable Remote Stream Success"
 msgid "Disable Remote Stream Success"
 msgstr "禁用遠端串流成功"
 msgstr "禁用遠端串流成功"
 
 
-#: src/components/Notification/notifications.ts:52
+#: src/components/Notification/notifications.ts:70
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} failed"
 msgid "Disable site %{name} from %{node} failed"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
 
 
-#: src/components/Notification/notifications.ts:56
+#: src/components/Notification/notifications.ts:74
 #, fuzzy
 #, fuzzy
 msgid "Disable site %{name} from %{node} successfully"
 msgid "Disable site %{name} from %{node} successfully"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
 
 
-#: src/components/Notification/notifications.ts:94
+#: src/components/Notification/notifications.ts:112
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} failed"
 msgid "Disable stream %{name} from %{node} failed"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 
 
-#: src/components/Notification/notifications.ts:98
+#: src/components/Notification/notifications.ts:116
 #, fuzzy
 #, fuzzy
 msgid "Disable stream %{name} from %{node} successfully"
 msgid "Disable stream %{name} from %{node} successfully"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
 msgstr "成功禁用 %{node} 中的站点 %{site}"
@@ -838,14 +848,14 @@ msgstr "成功禁用 %{node} 中的站点 %{site}"
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_edit/SiteEdit.vue:190
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:53
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
 #: src/views/site/site_list/columns.tsx:62 src/views/stream/StreamEdit.vue:177
-#: src/views/stream/StreamList.vue:55 src/views/user/userColumns.tsx:41
+#: src/views/stream/StreamList.vue:56 src/views/user/userColumns.tsx:41
 msgid "Disabled"
 msgid "Disabled"
 msgstr "停用"
 msgstr "停用"
 
 
 #: src/views/site/site_edit/RightSettings.vue:42
 #: src/views/site/site_edit/RightSettings.vue:42
-#: src/views/site/site_list/SiteList.vue:56
+#: src/views/site/site_list/SiteList.vue:57
 #: src/views/stream/components/RightSettings.vue:42
 #: src/views/stream/components/RightSettings.vue:42
-#: src/views/stream/StreamList.vue:93
+#: src/views/stream/StreamList.vue:94
 msgid "Disabled successfully"
 msgid "Disabled successfully"
 msgstr "成功停用"
 msgstr "成功停用"
 
 
@@ -939,9 +949,9 @@ msgstr ""
 "通行密鑰。"
 "通行密鑰。"
 
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:140
+#: src/views/site/site_list/SiteList.vue:138
 #: src/views/stream/components/StreamDuplicate.vue:64
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:222
+#: src/views/stream/StreamList.vue:220
 msgid "Duplicate"
 msgid "Duplicate"
 msgstr "複製"
 msgstr "複製"
 
 
@@ -980,8 +990,8 @@ msgstr "電子郵件"
 msgid "Email (*)"
 msgid "Email (*)"
 msgstr "電子郵件 (*)"
 msgstr "電子郵件 (*)"
 
 
-#: src/views/site/site_list/SiteList.vue:133
-#: src/views/stream/StreamList.vue:215
+#: src/views/site/site_list/SiteList.vue:131
+#: src/views/stream/StreamList.vue:213
 msgid "Enable"
 msgid "Enable"
 msgstr "啟用"
 msgstr "啟用"
 
 
@@ -1002,40 +1012,40 @@ msgstr "啟用失敗"
 msgid "Enable HTTPS"
 msgid "Enable HTTPS"
 msgstr "啟用 TOTP"
 msgstr "啟用 TOTP"
 
 
-#: src/components/Notification/notifications.ts:59 src/language/constants.ts:54
+#: src/components/Notification/notifications.ts:77 src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgid "Enable Remote Site Error"
 msgstr "啟用遠端站點錯誤"
 msgstr "啟用遠端站點錯誤"
 
 
-#: src/components/Notification/notifications.ts:63 src/language/constants.ts:53
+#: src/components/Notification/notifications.ts:81 src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgid "Enable Remote Site Success"
 msgstr "啟用遠端站點成功"
 msgstr "啟用遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:101
+#: src/components/Notification/notifications.ts:119
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Error"
 msgid "Enable Remote Stream Error"
 msgstr "啟用遠端站點錯誤"
 msgstr "啟用遠端站點錯誤"
 
 
-#: src/components/Notification/notifications.ts:105
+#: src/components/Notification/notifications.ts:123
 #, fuzzy
 #, fuzzy
 msgid "Enable Remote Stream Success"
 msgid "Enable Remote Stream Success"
 msgstr "啟用遠端站點成功"
 msgstr "啟用遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:60
+#: src/components/Notification/notifications.ts:78
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} failed"
 msgid "Enable site %{name} on %{node} failed"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 
 
-#: src/components/Notification/notifications.ts:64
+#: src/components/Notification/notifications.ts:82
 #, fuzzy
 #, fuzzy
 msgid "Enable site %{name} on %{node} successfully"
 msgid "Enable site %{name} on %{node} successfully"
 msgstr "成功啟用站點 %{site} 在 %{node}"
 msgstr "成功啟用站點 %{site} 在 %{node}"
 
 
-#: src/components/Notification/notifications.ts:102
+#: src/components/Notification/notifications.ts:120
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} failed"
 msgid "Enable stream %{name} on %{node} failed"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
 
 
-#: src/components/Notification/notifications.ts:106
+#: src/components/Notification/notifications.ts:124
 #, fuzzy
 #, fuzzy
 msgid "Enable stream %{name} on %{node} successfully"
 msgid "Enable stream %{name} on %{node} successfully"
 msgstr "成功啟用站點 %{site} 在 %{node}"
 msgstr "成功啟用站點 %{site} 在 %{node}"
@@ -1059,16 +1069,16 @@ msgstr "啟用 TOTP"
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:49
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/site/site_list/columns.tsx:61
 #: src/views/stream/components/RightSettings.vue:81
 #: src/views/stream/components/RightSettings.vue:81
-#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:51
+#: src/views/stream/StreamEdit.vue:171 src/views/stream/StreamList.vue:52
 #: src/views/user/userColumns.tsx:38
 #: src/views/user/userColumns.tsx:38
 msgid "Enabled"
 msgid "Enabled"
 msgstr "已啟用"
 msgstr "已啟用"
 
 
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_add/SiteAdd.vue:40
 #: src/views/site/site_edit/RightSettings.vue:33
 #: src/views/site/site_edit/RightSettings.vue:33
-#: src/views/site/site_list/SiteList.vue:46
+#: src/views/site/site_list/SiteList.vue:47
 #: src/views/stream/components/RightSettings.vue:33
 #: src/views/stream/components/RightSettings.vue:33
-#: src/views/stream/StreamList.vue:83
+#: src/views/stream/StreamList.vue:84
 msgid "Enabled successfully"
 msgid "Enabled successfully"
 msgstr "成功啟用"
 msgstr "成功啟用"
 
 
@@ -1079,7 +1089,7 @@ msgstr "用 Let's Encrypt 對網站進行加密"
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_edit/RightSettings.vue:91
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/site/site_list/columns.tsx:25
 #: src/views/stream/components/RightSettings.vue:90
 #: src/views/stream/components/RightSettings.vue:90
-#: src/views/stream/StreamList.vue:27
+#: src/views/stream/StreamList.vue:28
 #, fuzzy
 #, fuzzy
 msgid "Environment Group"
 msgid "Environment Group"
 msgstr "環境"
 msgstr "環境"
@@ -1095,7 +1105,7 @@ msgstr "環境變數已清理"
 
 
 #: src/routes/modules/environments.ts:11
 #: src/routes/modules/environments.ts:11
 #: src/views/dashboard/Environments.vue:83
 #: src/views/dashboard/Environments.vue:83
-#: src/views/environments/list/Environment.vue:43
+#: src/views/environments/list/Environment.vue:74
 msgid "Environments"
 msgid "Environments"
 msgstr "環境"
 msgstr "環境"
 
 
@@ -1269,16 +1279,16 @@ msgid "Failed to decrypt Nginx UI directory: {0}"
 msgstr ""
 msgstr ""
 
 
 #: src/views/site/site_edit/RightSettings.vue:45
 #: src/views/site/site_edit/RightSettings.vue:45
-#: src/views/site/site_list/SiteList.vue:60
+#: src/views/site/site_list/SiteList.vue:61
 #: src/views/stream/components/RightSettings.vue:45
 #: src/views/stream/components/RightSettings.vue:45
-#: src/views/stream/StreamList.vue:97
+#: src/views/stream/StreamList.vue:98
 msgid "Failed to disable %{msg}"
 msgid "Failed to disable %{msg}"
 msgstr "停用 %{msg} 失敗"
 msgstr "停用 %{msg} 失敗"
 
 
 #: src/views/site/site_edit/RightSettings.vue:36
 #: src/views/site/site_edit/RightSettings.vue:36
-#: src/views/site/site_list/SiteList.vue:50
+#: src/views/site/site_list/SiteList.vue:51
 #: src/views/stream/components/RightSettings.vue:36
 #: src/views/stream/components/RightSettings.vue:36
-#: src/views/stream/StreamList.vue:87
+#: src/views/stream/StreamList.vue:88
 msgid "Failed to enable %{msg}"
 msgid "Failed to enable %{msg}"
 msgstr "啟用 %{msg} 失敗"
 msgstr "啟用 %{msg} 失敗"
 
 
@@ -1776,11 +1786,11 @@ msgstr "列表"
 msgid "Load Average:"
 msgid "Load Average:"
 msgstr "負載平均值:"
 msgstr "負載平均值:"
 
 
-#: src/views/environments/list/Environment.vue:49
+#: src/views/environments/list/Environment.vue:80
 msgid "Load from settings"
 msgid "Load from settings"
 msgstr "從設置加載"
 msgstr "從設置加載"
 
 
-#: src/views/environments/list/Environment.vue:17
+#: src/views/environments/list/Environment.vue:20
 msgid "Load successfully"
 msgid "Load successfully"
 msgstr "加載成功"
 msgstr "加載成功"
 
 
@@ -1848,11 +1858,11 @@ msgstr ""
 msgid "Manage Configs"
 msgid "Manage Configs"
 msgstr "管理設定"
 msgstr "管理設定"
 
 
-#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:94
+#: src/routes/modules/sites.ts:10 src/views/site/site_list/SiteList.vue:95
 msgid "Manage Sites"
 msgid "Manage Sites"
 msgstr "管理網站"
 msgstr "管理網站"
 
 
-#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:172
+#: src/routes/modules/streams.ts:10 src/views/stream/StreamList.vue:173
 msgid "Manage Streams"
 msgid "Manage Streams"
 msgstr "管理 Stream"
 msgstr "管理 Stream"
 
 
@@ -1925,7 +1935,7 @@ msgstr "多行指令"
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/site/site_list/SiteDuplicate.vue:79
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/RightSettings.vue:87
 #: src/views/stream/components/StreamDuplicate.vue:71
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:18 src/views/stream/StreamList.vue:248
+#: src/views/stream/StreamList.vue:19 src/views/stream/StreamList.vue:246
 msgid "Name"
 msgid "Name"
 msgstr "名稱"
 msgstr "名稱"
 
 
@@ -2052,6 +2062,10 @@ msgstr "Nginx PID 路徑"
 msgid "Nginx Reload Command"
 msgid "Nginx Reload Command"
 msgstr "Nginx 重新載入指令"
 msgstr "Nginx 重新載入指令"
 
 
+#: src/views/environments/list/Environment.vue:41
+msgid "Nginx reload operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:26
 #: src/components/NginxControl/NginxControl.vue:26
 msgid "Nginx reloaded successfully"
 msgid "Nginx reloaded successfully"
 msgstr "Nginx 重新載入成功"
 msgstr "Nginx 重新載入成功"
@@ -2060,6 +2074,10 @@ msgstr "Nginx 重新載入成功"
 msgid "Nginx Restart Command"
 msgid "Nginx Restart Command"
 msgstr "Nginx 重啟指令"
 msgstr "Nginx 重啟指令"
 
 
+#: src/views/environments/list/Environment.vue:55
+msgid "Nginx restart operations have been dispatched to remote nodes"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:40
 #: src/components/NginxControl/NginxControl.vue:40
 msgid "Nginx restarted successfully"
 msgid "Nginx restarted successfully"
 msgstr "Nginx 重啟成功"
 msgstr "Nginx 重啟成功"
@@ -2087,6 +2105,8 @@ msgid ""
 msgstr "Nginx 設定解析錯誤"
 msgstr "Nginx 設定解析錯誤"
 
 
 #: src/components/ChatGPT/ChatGPT.vue:374
 #: src/components/ChatGPT/ChatGPT.vue:374
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:151
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:163
 #: src/components/Notification/Notification.vue:133
 #: src/components/Notification/Notification.vue:133
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBatchEdit.vue:63
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
 #: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:94
@@ -2098,8 +2118,8 @@ msgstr "Nginx 設定解析錯誤"
 #: src/views/preference/CertSettings.vue:73
 #: src/views/preference/CertSettings.vue:73
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
 #: src/views/site/ngx_conf/LocationEditor.vue:88
 #: src/views/site/ngx_conf/LocationEditor.vue:88
-#: src/views/site/site_list/SiteList.vue:143
-#: src/views/stream/StreamList.vue:225
+#: src/views/site/site_list/SiteList.vue:141
+#: src/views/stream/StreamList.vue:223
 msgid "No"
 msgid "No"
 msgstr "取消"
 msgstr "取消"
 
 
@@ -2172,6 +2192,7 @@ msgid ""
 "Firefox."
 "Firefox."
 msgstr "OCSP 必須裝訂可能會導致某些用戶在首次使用 Firefox 訪問時出現錯誤。"
 msgstr "OCSP 必須裝訂可能會導致某些用戶在首次使用 Firefox 訪問時出現錯誤。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:56
 #: src/views/environments/list/envColumns.tsx:56
@@ -2195,9 +2216,9 @@ msgstr "確定"
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxServer.vue:79
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/ngx_conf/NgxUpstream.vue:33
 #: src/views/site/site_edit/RightSettings.vue:54
 #: src/views/site/site_edit/RightSettings.vue:54
-#: src/views/site/site_list/SiteList.vue:144
+#: src/views/site/site_list/SiteList.vue:142
 #: src/views/stream/components/RightSettings.vue:54
 #: src/views/stream/components/RightSettings.vue:54
-#: src/views/stream/StreamList.vue:226
+#: src/views/stream/StreamList.vue:224
 #: src/views/system/Backup/BackupCreator.vue:149
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgid "OK"
 msgstr "確定"
 msgstr "確定"
@@ -2206,6 +2227,7 @@ msgstr "確定"
 msgid "Once the verification is complete, the records will be removed."
 msgid "Once the verification is complete, the records will be removed."
 msgstr "驗證完成後,記錄將被刪除。"
 msgstr "驗證完成後,記錄將被刪除。"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:179
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:103
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/components/NodeSelector/NodeSelector.vue:89
 #: src/views/dashboard/Environments.vue:100
 #: src/views/dashboard/Environments.vue:100
@@ -2417,7 +2439,19 @@ msgstr ""
 msgid "Please select a backup file"
 msgid "Please select a backup file"
 msgstr "請至少選擇一個節點!"
 msgstr "請至少選擇一個節點!"
 
 
-#: src/views/environments/list/Environment.vue:58
+#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:35
+#, fuzzy
+msgid "Please select at least one node to reload Nginx"
+msgstr "請至少選擇一個節點進行升級"
+
+#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:49
+#, fuzzy
+msgid "Please select at least one node to restart Nginx"
+msgstr "請至少選擇一個節點進行升級"
+
+#: src/views/environments/list/Environment.vue:91
 msgid "Please select at least one node to upgrade"
 msgid "Please select at least one node to upgrade"
 msgstr "請至少選擇一個節點進行升級"
 msgstr "請至少選擇一個節點進行升級"
 
 
@@ -2557,6 +2591,37 @@ msgstr "發行公告"
 msgid "Reload"
 msgid "Reload"
 msgstr "重新載入"
 msgstr "重新載入"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:156
+#: src/views/environments/list/Environment.vue:120
+#: src/views/environments/list/Environment.vue:128
+#, fuzzy
+msgid "Reload Nginx"
+msgstr "正在重新載入 Nginx"
+
+#: src/components/Notification/notifications.ts:16
+#, fuzzy
+msgid "Reload Nginx on %{node} failed, response: %{resp}"
+msgstr "從 %{node} 移除站點 %{site} 時發生錯誤,回應:%{resp}"
+
+#: src/components/Notification/notifications.ts:20
+#, fuzzy
+msgid "Reload Nginx on %{node} successfully"
+msgstr "成功升級 %{node} 上的 Nginx UI 🎉"
+
+#: src/components/Notification/notifications.ts:15
+#, fuzzy
+msgid "Reload Remote Nginx Error"
+msgstr "重命名遠端遠端站點時發生錯誤"
+
+#: src/components/Notification/notifications.ts:19
+#, fuzzy
+msgid "Reload Remote Nginx Success"
+msgstr "重新命名遠端站點成功"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:104
+msgid "Reload request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:73
 #: src/components/NginxControl/NginxControl.vue:73
 msgid "Reloading"
 msgid "Reloading"
 msgstr "重新載入中"
 msgstr "重新載入中"
@@ -2587,57 +2652,57 @@ msgstr "移除成功"
 msgid "Rename"
 msgid "Rename"
 msgstr "重命名"
 msgstr "重命名"
 
 
-#: src/components/Notification/notifications.ts:34
+#: src/components/Notification/notifications.ts:52
 #, fuzzy
 #, fuzzy
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
 msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}"
 msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}"
 
 
-#: src/components/Notification/notifications.ts:38
+#: src/components/Notification/notifications.ts:56
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
 msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}"
 msgstr "成功將 %{env_name} 上的 %{orig_path} 重命名為 %{new_path}"
 
 
-#: src/components/Notification/notifications.ts:33 src/language/constants.ts:42
+#: src/components/Notification/notifications.ts:51 src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgid "Rename Remote Config Error"
 msgstr "重命名遠端配置錯誤"
 msgstr "重命名遠端配置錯誤"
 
 
-#: src/components/Notification/notifications.ts:37 src/language/constants.ts:41
+#: src/components/Notification/notifications.ts:55 src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgid "Rename Remote Config Success"
 msgstr "重新命名遠端配置成功"
 msgstr "重新命名遠端配置成功"
 
 
-#: src/components/Notification/notifications.ts:67 src/language/constants.ts:56
+#: src/components/Notification/notifications.ts:85 src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgid "Rename Remote Site Error"
 msgstr "重命名遠端遠端站點時發生錯誤"
 msgstr "重命名遠端遠端站點時發生錯誤"
 
 
-#: src/components/Notification/notifications.ts:71 src/language/constants.ts:55
+#: src/components/Notification/notifications.ts:89 src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgid "Rename Remote Site Success"
 msgstr "重新命名遠端站點成功"
 msgstr "重新命名遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:109
+#: src/components/Notification/notifications.ts:127
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Error"
 msgid "Rename Remote Stream Error"
 msgstr "重命名遠端遠端站點時發生錯誤"
 msgstr "重命名遠端遠端站點時發生錯誤"
 
 
-#: src/components/Notification/notifications.ts:113
+#: src/components/Notification/notifications.ts:131
 #, fuzzy
 #, fuzzy
 msgid "Rename Remote Stream Success"
 msgid "Rename Remote Stream Success"
 msgstr "重新命名遠端站點成功"
 msgstr "重新命名遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:68
+#: src/components/Notification/notifications.ts:86
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgid "Rename site %{name} to %{new_name} on %{node} failed"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 
 
-#: src/components/Notification/notifications.ts:72
+#: src/components/Notification/notifications.ts:90
 #, fuzzy
 #, fuzzy
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgid "Rename site %{name} to %{new_name} on %{node} successfully"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 
 
-#: src/components/Notification/notifications.ts:110
+#: src/components/Notification/notifications.ts:128
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgid "Rename stream %{name} to %{new_name} on %{node} failed"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 
 
-#: src/components/Notification/notifications.ts:114
+#: src/components/Notification/notifications.ts:132
 #, fuzzy
 #, fuzzy
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
 msgstr "成功將站點 %{site} 重新命名為 %{new_site} 於 %{node}"
@@ -2690,6 +2755,37 @@ msgstr "重置多重因素驗證"
 msgid "Restart"
 msgid "Restart"
 msgstr "重新啟動"
 msgstr "重新啟動"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:168
+#: src/views/environments/list/Environment.vue:141
+#: src/views/environments/list/Environment.vue:149
+#, fuzzy
+msgid "Restart Nginx"
+msgstr "正在重新啟動"
+
+#: src/components/Notification/notifications.ts:24
+#, fuzzy
+msgid "Restart Nginx on %{node} failed, response: %{resp}"
+msgstr "啟用站點 %{site} 在 %{node} 時發生錯誤,回應:%{resp}"
+
+#: src/components/Notification/notifications.ts:28
+#, fuzzy
+msgid "Restart Nginx on %{node} successfully"
+msgstr "成功升級 %{node} 上的 Nginx UI 🎉"
+
+#: src/components/Notification/notifications.ts:23
+#, fuzzy
+msgid "Restart Remote Nginx Error"
+msgstr "重命名遠端遠端站點時發生錯誤"
+
+#: src/components/Notification/notifications.ts:27
+#, fuzzy
+msgid "Restart Remote Nginx Success"
+msgstr "重新命名遠端站點成功"
+
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:124
+msgid "Restart request failed, please check your network connection"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:78
 #: src/components/NginxControl/NginxControl.vue:78
 msgid "Restarting"
 msgid "Restarting"
 msgstr "正在重新啟動"
 msgstr "正在重新啟動"
@@ -2762,40 +2858,40 @@ msgstr "儲存指令"
 msgid "Save error %{msg}"
 msgid "Save error %{msg}"
 msgstr "儲存錯誤 %{msg}"
 msgstr "儲存錯誤 %{msg}"
 
 
-#: src/components/Notification/notifications.ts:75 src/language/constants.ts:48
+#: src/components/Notification/notifications.ts:93 src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgid "Save Remote Site Error"
 msgstr "儲存遠端站點時發生錯誤"
 msgstr "儲存遠端站點時發生錯誤"
 
 
-#: src/components/Notification/notifications.ts:79 src/language/constants.ts:47
+#: src/components/Notification/notifications.ts:97 src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgid "Save Remote Site Success"
 msgstr "儲存遠端站點成功"
 msgstr "儲存遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:117
+#: src/components/Notification/notifications.ts:135
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Error"
 msgid "Save Remote Stream Error"
 msgstr "儲存遠端站點時發生錯誤"
 msgstr "儲存遠端站點時發生錯誤"
 
 
-#: src/components/Notification/notifications.ts:121
+#: src/components/Notification/notifications.ts:139
 #, fuzzy
 #, fuzzy
 msgid "Save Remote Stream Success"
 msgid "Save Remote Stream Success"
 msgstr "儲存遠端站點成功"
 msgstr "儲存遠端站點成功"
 
 
-#: src/components/Notification/notifications.ts:76
+#: src/components/Notification/notifications.ts:94
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} failed"
 msgid "Save site %{name} to %{node} failed"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
 
 
-#: src/components/Notification/notifications.ts:80
+#: src/components/Notification/notifications.ts:98
 #, fuzzy
 #, fuzzy
 msgid "Save site %{name} to %{node} successfully"
 msgid "Save site %{name} to %{node} successfully"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
 
 
-#: src/components/Notification/notifications.ts:118
+#: src/components/Notification/notifications.ts:136
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} failed"
 msgid "Save stream %{name} to %{node} failed"
 msgstr "部署 %{conf_name} 至 %{node_name} 失敗"
 msgstr "部署 %{conf_name} 至 %{node_name} 失敗"
 
 
-#: src/components/Notification/notifications.ts:122
+#: src/components/Notification/notifications.ts:140
 #, fuzzy
 #, fuzzy
 msgid "Save stream %{name} to %{node} successfully"
 msgid "Save stream %{name} to %{node} successfully"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
 msgstr "成功將站點 %{site} 儲存至 %{node}"
@@ -3021,7 +3117,7 @@ msgstr ""
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/ACMEUser.vue:65
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/certificate/CertificateList/certColumns.tsx:68
 #: src/views/environments/list/envColumns.tsx:44
 #: src/views/environments/list/envColumns.tsx:44
-#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:44
+#: src/views/site/site_list/columns.tsx:42 src/views/stream/StreamList.vue:45
 msgid "Status"
 msgid "Status"
 msgstr "狀態"
 msgstr "狀態"
 
 
@@ -3097,41 +3193,42 @@ msgstr "同步"
 msgid "Sync Certificate"
 msgid "Sync Certificate"
 msgstr "同步憑證"
 msgstr "同步憑證"
 
 
-#: src/components/Notification/notifications.ts:16
+#: src/components/Notification/notifications.ts:34
 #, fuzzy
 #, fuzzy
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgid "Sync Certificate %{cert_name} to %{env_name} failed"
 msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功"
 msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:20
+#: src/components/Notification/notifications.ts:38
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
 msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功"
 msgstr "同步憑證 %{cert_name} 到 %{env_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:15 src/language/constants.ts:39
+#: src/components/Notification/notifications.ts:33 src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgid "Sync Certificate Error"
 msgstr "同步憑證錯誤"
 msgstr "同步憑證錯誤"
 
 
-#: src/components/Notification/notifications.ts:19 src/language/constants.ts:38
+#: src/components/Notification/notifications.ts:37 src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgid "Sync Certificate Success"
 msgstr "同步憑證成功"
 msgstr "同步憑證成功"
 
 
-#: src/components/Notification/notifications.ts:26
+#: src/components/Notification/notifications.ts:44
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgid "Sync config %{config_name} to %{env_name} failed"
 msgstr "同步配置 %{config_name} 到 %{env_name} 成功"
 msgstr "同步配置 %{config_name} 到 %{env_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:30
+#: src/components/Notification/notifications.ts:48
 #, fuzzy
 #, fuzzy
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgid "Sync config %{config_name} to %{env_name} successfully"
 msgstr "同步配置 %{config_name} 到 %{env_name} 成功"
 msgstr "同步配置 %{config_name} 到 %{env_name} 成功"
 
 
-#: src/components/Notification/notifications.ts:25 src/language/constants.ts:45
+#: src/components/Notification/notifications.ts:43 src/language/constants.ts:45
 msgid "Sync Config Error"
 msgid "Sync Config Error"
 msgstr "同步配置錯誤"
 msgstr "同步配置錯誤"
 
 
-#: src/components/Notification/notifications.ts:29 src/language/constants.ts:44
+#: src/components/Notification/notifications.ts:47 src/language/constants.ts:44
 msgid "Sync Config Success"
 msgid "Sync Config Success"
 msgstr "同步配置成功"
 msgstr "同步配置成功"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/views/environments/group/EnvGroup.vue:18
 #: src/views/environments/group/EnvGroup.vue:18
 msgid "Sync Nodes"
 msgid "Sync Nodes"
 msgstr "同步節點"
 msgstr "同步節點"
@@ -3448,7 +3545,7 @@ msgstr "更新成功"
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_edit/RightSettings.vue:100
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/site/site_list/columns.tsx:69
 #: src/views/stream/components/RightSettings.vue:99
 #: src/views/stream/components/RightSettings.vue:99
-#: src/views/stream/StreamList.vue:64 src/views/user/userColumns.tsx:54
+#: src/views/stream/StreamList.vue:65 src/views/user/userColumns.tsx:54
 msgid "Updated at"
 msgid "Updated at"
 msgstr "更新時間"
 msgstr "更新時間"
 
 
@@ -3457,7 +3554,8 @@ msgid "Updated successfully"
 msgstr "更新成功"
 msgstr "更新成功"
 
 
 #: src/routes/modules/system.ts:33
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:66
+#: src/views/environments/list/Environment.vue:107
+#: src/views/environments/list/Environment.vue:99
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 #: src/views/system/Upgrade.vue:143 src/views/system/Upgrade.vue:226
 msgid "Upgrade"
 msgid "Upgrade"
 msgstr "升級"
 msgstr "升級"
@@ -3640,6 +3738,8 @@ msgstr "將憑證私鑰寫入磁碟"
 msgid "Writing certificate to disk"
 msgid "Writing certificate to disk"
 msgstr "將憑證寫入磁碟"
 msgstr "將憑證寫入磁碟"
 
 
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:150
+#: src/components/EnvGroupTabs/EnvGroupTabs.vue:162
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/AuthSettings.vue:163
 #: src/views/preference/CertSettings.vue:72
 #: src/views/preference/CertSettings.vue:72
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
 #: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
@@ -3731,18 +3831,12 @@ msgstr "您的通行密鑰"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgid "Enable %{conf_name} in %{node_name} successfully"
 #~ msgstr "成功在 %{node_name} 啟用 %{conf_name}"
 #~ msgstr "成功在 %{node_name} 啟用 %{conf_name}"
 
 
-#~ msgid "Enable site %{site} on %{node} error, response: %{resp}"
-#~ msgstr "啟用站點 %{site} 在 %{node} 時發生錯誤,回應:%{resp}"
-
 #~ msgid "Enable successfully"
 #~ msgid "Enable successfully"
 #~ msgstr "啟用成功"
 #~ msgstr "啟用成功"
 
 
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgid "Please upgrade the remote Nginx UI to the latest version"
 #~ msgstr "請將遠端 Nginx UI 升級至最新版本"
 #~ msgstr "請將遠端 Nginx UI 升級至最新版本"
 
 
-#~ msgid "Remove site %{site} from %{node} error, response: %{resp}"
-#~ msgstr "從 %{node} 移除站點 %{site} 時發生錯誤,回應:%{resp}"
-
 #~ msgid ""
 #~ msgid ""
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "Rename %{orig_path} to %{new_path} on %{env_name} failed, response: "
 #~ "%{resp}"
 #~ "%{resp}"

+ 89 - 6
app/src/views/environments/list/Environment.vue

@@ -1,5 +1,6 @@
 <script setup lang="tsx">
 <script setup lang="tsx">
 import environment from '@/api/environment'
 import environment from '@/api/environment'
+import node from '@/api/node'
 import FooterToolBar from '@/components/FooterToolbar'
 import FooterToolBar from '@/components/FooterToolbar'
 import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
 import StdCurd from '@/components/StdDesign/StdDataDisplay/StdCurd.vue'
 import { message } from 'ant-design-vue'
 import { message } from 'ant-design-vue'
@@ -9,6 +10,8 @@ import envColumns from './envColumns'
 const route = useRoute()
 const route = useRoute()
 const curd = ref()
 const curd = ref()
 const loadingFromSettings = ref(false)
 const loadingFromSettings = ref(false)
+const loadingReload = ref(false)
+const loadingRestart = ref(false)
 
 
 function loadFromSettings() {
 function loadFromSettings() {
   loadingFromSettings.value = true
   loadingFromSettings.value = true
@@ -27,6 +30,34 @@ function batchUpgrade() {
   refUpgrader.value.open(selectedNodeIds, selectedNodes)
   refUpgrader.value.open(selectedNodeIds, selectedNodes)
 }
 }
 
 
+function reloadNginx() {
+  if (selectedNodeIds.value.length === 0) {
+    message.warning($gettext('Please select at least one node to reload Nginx'))
+    return
+  }
+
+  loadingReload.value = true
+  node.reloadNginx(selectedNodeIds.value).then(() => {
+    message.success($gettext('Nginx reload operations have been dispatched to remote nodes'))
+  }).finally(() => {
+    loadingReload.value = false
+  })
+}
+
+function restartNginx() {
+  if (selectedNodeIds.value.length === 0) {
+    message.warning($gettext('Please select at least one node to restart Nginx'))
+    return
+  }
+
+  loadingRestart.value = true
+  node.restartNginx(selectedNodeIds.value).then(() => {
+    message.success($gettext('Nginx restart operations have been dispatched to remote nodes'))
+  }).finally(() => {
+    loadingRestart.value = false
+  })
+}
+
 const inTrash = computed(() => {
 const inTrash = computed(() => {
   return route.query.trash === 'true'
   return route.query.trash === 'true'
 })
 })
@@ -54,18 +85,70 @@ const inTrash = computed(() => {
     <BatchUpgrader ref="refUpgrader" />
     <BatchUpgrader ref="refUpgrader" />
 
 
     <FooterToolBar v-if="!inTrash">
     <FooterToolBar v-if="!inTrash">
-      <ATooltip
-        :title="$gettext('Please select at least one node to upgrade')"
-        placement="topLeft"
-      >
+      <ASpace>
+        <ATooltip
+          v-if="selectedNodeIds.length === 0"
+          :title="$gettext('Please select at least one node to upgrade')"
+          placement="topLeft"
+        >
+          <AButton
+            :disabled="selectedNodeIds.length === 0"
+            type="primary"
+            @click="batchUpgrade"
+          >
+            {{ $gettext('Upgrade') }}
+          </AButton>
+        </ATooltip>
         <AButton
         <AButton
-          :disabled="selectedNodeIds.length === 0"
+          v-else
           type="primary"
           type="primary"
           @click="batchUpgrade"
           @click="batchUpgrade"
         >
         >
           {{ $gettext('Upgrade') }}
           {{ $gettext('Upgrade') }}
         </AButton>
         </AButton>
-      </ATooltip>
+
+        <ATooltip
+          v-if="selectedNodeIds.length === 0"
+          :title="$gettext('Please select at least one node to reload Nginx')"
+          placement="topLeft"
+        >
+          <AButton
+            :disabled="selectedNodeIds.length === 0"
+            :loading="loadingReload"
+            @click="reloadNginx"
+          >
+            {{ $gettext('Reload Nginx') }}
+          </AButton>
+        </ATooltip>
+        <AButton
+          v-else
+          :loading="loadingReload"
+          @click="reloadNginx"
+        >
+          {{ $gettext('Reload Nginx') }}
+        </AButton>
+
+        <ATooltip
+          v-if="selectedNodeIds.length === 0"
+          :title="$gettext('Please select at least one node to restart Nginx')"
+          placement="topLeft"
+        >
+          <AButton
+            :disabled="selectedNodeIds.length === 0"
+            :loading="loadingRestart"
+            @click="restartNginx"
+          >
+            {{ $gettext('Restart Nginx') }}
+          </AButton>
+        </ATooltip>
+        <AButton
+          v-else
+          :loading="loadingRestart"
+          @click="restartNginx"
+        >
+          {{ $gettext('Restart Nginx') }}
+        </AButton>
+      </ASpace>
     </FooterToolBar>
     </FooterToolBar>
   </div>
   </div>
 </template>
 </template>

+ 2 - 4
app/src/views/site/site_list/SiteList.vue

@@ -4,6 +4,7 @@ import type { Site } from '@/api/site'
 import type { Column } from '@/components/StdDesign/types'
 import type { Column } from '@/components/StdDesign/types'
 import env_group from '@/api/env_group'
 import env_group from '@/api/env_group'
 import site from '@/api/site'
 import site from '@/api/site'
+import EnvGroupTabs from '@/components/EnvGroupTabs/EnvGroupTabs.vue'
 import StdBatchEdit from '@/components/StdDesign/StdDataDisplay/StdBatchEdit.vue'
 import StdBatchEdit from '@/components/StdDesign/StdDataDisplay/StdBatchEdit.vue'
 import StdTable from '@/components/StdDesign/StdDataDisplay/StdTable.vue'
 import StdTable from '@/components/StdDesign/StdDataDisplay/StdTable.vue'
 import InspectConfig from '@/views/config/InspectConfig.vue'
 import InspectConfig from '@/views/config/InspectConfig.vue'
@@ -94,10 +95,7 @@ function handleBatchUpdated() {
   <ACard :title="$gettext('Manage Sites')">
   <ACard :title="$gettext('Manage Sites')">
     <InspectConfig ref="inspect_config" />
     <InspectConfig ref="inspect_config" />
 
 
-    <ATabs v-model:active-key="envGroupId">
-      <ATabPane :key="0" :tab="$gettext('All')" />
-      <ATabPane v-for="c in envGroups" :key="c.id" :tab="c.name" />
-    </ATabs>
+    <EnvGroupTabs v-model:active-key="envGroupId" :env-groups="envGroups" />
 
 
     <StdTable
     <StdTable
       ref="table"
       ref="table"

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

@@ -5,6 +5,7 @@ import type { CustomRender } from '@/components/StdDesign/StdDataDisplay/StdTabl
 import type { Column, JSXElements } from '@/components/StdDesign/types'
 import type { Column, JSXElements } from '@/components/StdDesign/types'
 import env_group from '@/api/env_group'
 import env_group from '@/api/env_group'
 import stream from '@/api/stream'
 import stream from '@/api/stream'
+import EnvGroupTabs from '@/components/EnvGroupTabs/EnvGroupTabs.vue'
 import StdBatchEdit from '@/components/StdDesign/StdDataDisplay/StdBatchEdit.vue'
 import StdBatchEdit from '@/components/StdDesign/StdDataDisplay/StdBatchEdit.vue'
 import StdTable from '@/components/StdDesign/StdDataDisplay/StdTable.vue'
 import StdTable from '@/components/StdDesign/StdDataDisplay/StdTable.vue'
 import { actualValueRender, datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
 import { actualValueRender, datetime } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
@@ -176,10 +177,7 @@ function handleBatchUpdated() {
 
 
     <InspectConfig ref="inspect_config" />
     <InspectConfig ref="inspect_config" />
 
 
-    <ATabs v-model:active-key="envGroupId">
-      <ATabPane :key="0" :tab="$gettext('All')" />
-      <ATabPane v-for="c in envGroups" :key="c.id" :tab="c.name" />
-    </ATabs>
+    <EnvGroupTabs v-model:active-key="envGroupId" :env-groups="envGroups" />
 
 
     <StdTable
     <StdTable
       ref="table"
       ref="table"