Przeglądaj źródła

feat(external_notify): add WeCom supports

0xJacky 1 tydzień temu
rodzic
commit
5ea20871c9

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

@@ -5,6 +5,7 @@ export interface ExternalNotify extends ModelBase {
   type: string
   language: string
   config: Record<string, string>
+  enabled: boolean
 }
 
 export interface TestMessageRequest {

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

@@ -3,196 +3,6 @@
 /* eslint-disable ts/no-explicit-any */
 
 const notifications: Record<string, { title: () => string, content: (args: any) => string }> = {
-
-  // general module notifications
-  'Reload Remote Nginx Error': {
-    title: () => $gettext('Reload Remote Nginx Error'),
-    content: (args: any) => $gettext('Reload Nginx on %{node} failed, response: %{resp}', args, true),
-  },
-  'Reload Remote Nginx Success': {
-    title: () => $gettext('Reload Remote Nginx Success'),
-    content: (args: any) => $gettext('Reload Nginx on %{node} successfully', args, true),
-  },
-  'Restart Remote Nginx Error': {
-    title: () => $gettext('Restart Remote Nginx Error'),
-    content: (args: any) => $gettext('Restart Nginx on %{node} failed, response: %{resp}', args, true),
-  },
-  'Restart Remote Nginx Success': {
-    title: () => $gettext('Restart Remote Nginx Success'),
-    content: (args: any) => $gettext('Restart Nginx on %{node} successfully', args, true),
-  },
-  'Auto Backup Configuration Error': {
-    title: () => $gettext('Auto Backup Configuration Error'),
-    content: (args: any) => $gettext('Storage configuration validation failed for backup task %{backup_name}, error: %{error}', args, true),
-  },
-  'Auto Backup Failed': {
-    title: () => $gettext('Auto Backup Failed'),
-    content: (args: any) => $gettext('Backup task %{backup_name} failed to execute, error: %{error}', args, true),
-  },
-  'Auto Backup Storage Failed': {
-    title: () => $gettext('Auto Backup Storage Failed'),
-    content: (args: any) => $gettext('Backup task %{backup_name} failed during storage upload, error: %{error}', args, true),
-  },
-  'Auto Backup Completed': {
-    title: () => $gettext('Auto Backup Completed'),
-    content: (args: any) => $gettext('Backup task %{backup_name} completed successfully, file: %{file_path}', args, true),
-  },
-  'Certificate Expired': {
-    title: () => $gettext('Certificate Expired'),
-    content: (args: any) => $gettext('Certificate %{name} has expired', args, true),
-  },
-  'Certificate Expiration Notice': {
-    title: () => $gettext('Certificate Expiration Notice'),
-    content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args, true),
-  },
-  'Certificate Expiring Soon': {
-    title: () => $gettext('Certificate Expiring Soon'),
-    content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args, true),
-  },
-  'Certificate Expiring Soon_1': {
-    title: () => $gettext('Certificate Expiring Soon'),
-    content: (args: any) => $gettext('Certificate %{name} will expire in %{days} days', args, true),
-  },
-  'Certificate Expiring Soon_2': {
-    title: () => $gettext('Certificate Expiring Soon'),
-    content: (args: any) => $gettext('Certificate %{name} will expire in 1 day', args, true),
-  },
-  'Sync Certificate Error': {
-    title: () => $gettext('Sync Certificate Error'),
-    content: (args: any) => $gettext('Sync Certificate %{cert_name} to %{env_name} failed', args, true),
-  },
-  'Sync Certificate Success': {
-    title: () => $gettext('Sync Certificate Success'),
-    content: (args: any) => $gettext('Sync Certificate %{cert_name} to %{env_name} successfully', args, true),
-  },
-  'Sync Config Error': {
-    title: () => $gettext('Sync Config Error'),
-    content: (args: any) => $gettext('Sync config %{config_name} to %{env_name} failed', args, true),
-  },
-  'Sync Config Success': {
-    title: () => $gettext('Sync Config Success'),
-    content: (args: any) => $gettext('Sync config %{config_name} to %{env_name} successfully', args, true),
-  },
-  'Rename Remote Config Error': {
-    title: () => $gettext('Rename Remote Config Error'),
-    content: (args: any) => $gettext('Rename %{orig_path} to %{new_path} on %{env_name} failed', args, true),
-  },
-  'Rename Remote Config Success': {
-    title: () => $gettext('Rename Remote Config Success'),
-    content: (args: any) => $gettext('Rename %{orig_path} to %{new_path} on %{env_name} successfully', args, true),
-  },
-  'Delete Remote Config Error': {
-    title: () => $gettext('Delete Remote Config Error'),
-    content: (args: any) => $gettext('Delete %{path} on %{env_name} failed', args, true),
-  },
-  'Delete Remote Config Success': {
-    title: () => $gettext('Delete Remote Config Success'),
-    content: (args: any) => $gettext('Delete %{path} on %{env_name} successfully', args, true),
-  },
-  'External Notification Test': {
-    title: () => $gettext('External Notification Test'),
-    content: (args: any) => $gettext('This is a test message sent at %{timestamp} from Nginx UI.', args, true),
-  },
-  'Delete Remote Site Error': {
-    title: () => $gettext('Delete Remote Site Error'),
-    content: (args: any) => $gettext('Delete site %{name} from %{node} failed', args, true),
-  },
-  'Delete Remote Site Success': {
-    title: () => $gettext('Delete Remote Site Success'),
-    content: (args: any) => $gettext('Delete site %{name} from %{node} successfully', args, true),
-  },
-  'Disable Remote Site Error': {
-    title: () => $gettext('Disable Remote Site Error'),
-    content: (args: any) => $gettext('Disable site %{name} from %{node} failed', args, true),
-  },
-  'Disable Remote Site Success': {
-    title: () => $gettext('Disable Remote Site Success'),
-    content: (args: any) => $gettext('Disable site %{name} from %{node} successfully', args, true),
-  },
-  'Enable Remote Site Error': {
-    title: () => $gettext('Enable Remote Site Error'),
-    content: (args: any) => $gettext('Enable site %{name} on %{node} failed', args, true),
-  },
-  'Enable Remote Site Success': {
-    title: () => $gettext('Enable Remote Site Success'),
-    content: (args: any) => $gettext('Enable site %{name} on %{node} successfully', args, true),
-  },
-  'Enable Remote Site Maintenance Error': {
-    title: () => $gettext('Enable Remote Site Maintenance Error'),
-    content: (args: any) => $gettext('Enable site %{name} maintenance on %{node} failed', args, true),
-  },
-  'Enable Remote Site Maintenance Success': {
-    title: () => $gettext('Enable Remote Site Maintenance Success'),
-    content: (args: any) => $gettext('Enable site %{name} maintenance on %{node} successfully', args, true),
-  },
-  'Disable Remote Site Maintenance Error': {
-    title: () => $gettext('Disable Remote Site Maintenance Error'),
-    content: (args: any) => $gettext('Disable site %{name} maintenance on %{node} failed', args, true),
-  },
-  'Disable Remote Site Maintenance Success': {
-    title: () => $gettext('Disable Remote Site Maintenance Success'),
-    content: (args: any) => $gettext('Disable site %{name} maintenance on %{node} successfully', args, true),
-  },
-  'Rename Remote Site Error': {
-    title: () => $gettext('Rename Remote Site Error'),
-    content: (args: any) => $gettext('Rename site %{name} to %{new_name} on %{node} failed', args, true),
-  },
-  'Rename Remote Site Success': {
-    title: () => $gettext('Rename Remote Site Success'),
-    content: (args: any) => $gettext('Rename site %{name} to %{new_name} on %{node} successfully', args, true),
-  },
-  'Save Remote Site Error': {
-    title: () => $gettext('Save Remote Site Error'),
-    content: (args: any) => $gettext('Save site %{name} to %{node} failed', args, true),
-  },
-  'Save Remote Site Success': {
-    title: () => $gettext('Save Remote Site Success'),
-    content: (args: any) => $gettext('Save site %{name} to %{node} successfully', args, true),
-  },
-  'Delete Remote Stream Error': {
-    title: () => $gettext('Delete Remote Stream Error'),
-    content: (args: any) => $gettext('Delete stream %{name} from %{node} failed', args, true),
-  },
-  'Delete Remote Stream Success': {
-    title: () => $gettext('Delete Remote Stream Success'),
-    content: (args: any) => $gettext('Delete stream %{name} from %{node} successfully', args, true),
-  },
-  'Disable Remote Stream Error': {
-    title: () => $gettext('Disable Remote Stream Error'),
-    content: (args: any) => $gettext('Disable stream %{name} from %{node} failed', args, true),
-  },
-  'Disable Remote Stream Success': {
-    title: () => $gettext('Disable Remote Stream Success'),
-    content: (args: any) => $gettext('Disable stream %{name} from %{node} successfully', args, true),
-  },
-  'Enable Remote Stream Error': {
-    title: () => $gettext('Enable Remote Stream Error'),
-    content: (args: any) => $gettext('Enable stream %{name} on %{node} failed', args, true),
-  },
-  'Enable Remote Stream Success': {
-    title: () => $gettext('Enable Remote Stream Success'),
-    content: (args: any) => $gettext('Enable stream %{name} on %{node} successfully', args, true),
-  },
-  'Rename Remote Stream Error': {
-    title: () => $gettext('Rename Remote Stream Error'),
-    content: (args: any) => $gettext('Rename stream %{name} to %{new_name} on %{node} failed', args, true),
-  },
-  'Rename Remote Stream Success': {
-    title: () => $gettext('Rename Remote Stream Success'),
-    content: (args: any) => $gettext('Rename stream %{name} to %{new_name} on %{node} successfully', args, true),
-  },
-  'Save Remote Stream Error': {
-    title: () => $gettext('Save Remote Stream Error'),
-    content: (args: any) => $gettext('Save stream %{name} to %{node} failed', args, true),
-  },
-  'Save Remote Stream Success': {
-    title: () => $gettext('Save Remote Stream Success'),
-    content: (args: any) => $gettext('Save stream %{name} to %{node} successfully', args, true),
-  },
-  'All Recovery Codes Have Been Used': {
-    title: () => $gettext('All Recovery Codes Have Been Used'),
-    content: (args: any) => $gettext('Please generate new recovery codes in the preferences immediately to prevent lockout.', args, true),
-  },
 }
 
 export default notifications

Plik diff jest za duży
+ 50 - 591
app/src/language/ar/app.po


Plik diff jest za duży
+ 66 - 537
app/src/language/de_DE/app.po


+ 33 - 556
app/src/language/en/app.po

@@ -1,88 +1,3 @@
-#: src/language/generate.ts:33
-msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
-msgstr ""
-
-#: src/language/generate.ts:34
-msgid "[Nginx UI] Backing up current certificate for later revocation"
-msgstr ""
-
-#: src/language/generate.ts:35
-msgid "[Nginx UI] Certificate renewed successfully"
-msgstr ""
-
-#: src/language/generate.ts:36
-msgid "[Nginx UI] Certificate successfully revoked"
-msgstr ""
-
-#: src/language/generate.ts:37
-msgid ""
-"[Nginx UI] Certificate was used for server, reloading server TLS certificate"
-msgstr ""
-
-#: src/language/generate.ts:38
-msgid "[Nginx UI] Creating client facilitates communication with the CA server"
-msgstr ""
-
-#: src/language/generate.ts:39
-msgid "[Nginx UI] Environment variables cleaned"
-msgstr ""
-
-#: src/language/generate.ts:40
-msgid "[Nginx UI] Finished"
-msgstr ""
-
-#: src/language/generate.ts:41
-msgid "[Nginx UI] Issued certificate successfully"
-msgstr ""
-
-#: src/language/generate.ts:42
-msgid "[Nginx UI] Obtaining certificate"
-msgstr ""
-
-#: src/language/generate.ts:43
-msgid "[Nginx UI] Preparing for certificate revocation"
-msgstr ""
-
-#: src/language/generate.ts:44
-msgid "[Nginx UI] Preparing lego configurations"
-msgstr ""
-
-#: src/language/generate.ts:45
-msgid "[Nginx UI] Reloading nginx"
-msgstr ""
-
-#: src/language/generate.ts:46
-msgid "[Nginx UI] Revocation completed"
-msgstr ""
-
-#: src/language/generate.ts:47
-msgid "[Nginx UI] Revoking certificate"
-msgstr ""
-
-#: src/language/generate.ts:48
-msgid "[Nginx UI] Revoking old certificate"
-msgstr ""
-
-#: src/language/generate.ts:49
-msgid "[Nginx UI] Setting DNS01 challenge provider"
-msgstr ""
-
-#: src/language/generate.ts:51
-msgid "[Nginx UI] Setting environment variables"
-msgstr ""
-
-#: src/language/generate.ts:50
-msgid "[Nginx UI] Setting HTTP01 challenge provider"
-msgstr ""
-
-#: src/language/generate.ts:52
-msgid "[Nginx UI] Writing certificate private key to disk"
-msgstr ""
-
-#: src/language/generate.ts:53
-msgid "[Nginx UI] Writing certificate to disk"
-msgstr ""
-
 #: src/components/SyncNodesPreview/SyncNodesPreview.vue:59
 msgid "* Includes nodes from group %{groupName} and manually selected nodes"
 msgstr ""
@@ -130,7 +45,7 @@ msgstr ""
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:68
 #: src/views/notification/notificationColumns.tsx:72
-#: src/views/preference/components/ExternalNotify/columns.tsx:73
+#: src/views/preference/components/ExternalNotify/columns.tsx:85
 #: src/views/site/site_list/columns.tsx:160 src/views/stream/columns.tsx:123
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
@@ -214,7 +129,6 @@ msgstr ""
 msgid "All"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:193
 #: src/language/constants.ts:58
 msgid "All Recovery Codes Have Been Used"
 msgstr ""
@@ -363,22 +277,6 @@ msgstr ""
 msgid "Auto Backup"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:37
-msgid "Auto Backup Completed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:25
-msgid "Auto Backup Configuration Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:29
-msgid "Auto Backup Failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:33
-msgid "Auto Backup Storage Failed"
-msgstr ""
-
 #: src/views/environments/list/Environment.vue:165
 #: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
@@ -474,19 +372,6 @@ msgstr ""
 msgid "Backup Schedule"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:38
-msgid "Backup task %{backup_name} completed successfully, file: %{file_path}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:34
-msgid ""
-"Backup task %{backup_name} failed during storage upload, error: %{error}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:30
-msgid "Backup task %{backup_name} failed to execute, error: %{error}"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:24
 msgid "Backup Type"
 msgstr ""
@@ -657,20 +542,6 @@ msgstr ""
 msgid "certificate"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:42
-msgid "Certificate %{name} has expired"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:46
-#: src/components/Notification/notifications.ts:50
-#: src/components/Notification/notifications.ts:54
-msgid "Certificate %{name} will expire in %{days} days"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:58
-msgid "Certificate %{name} will expire in 1 day"
-msgstr ""
-
 #: src/views/certificate/components/CertificateDownload.vue:36
 msgid "Certificate content and private key content cannot be empty"
 msgstr ""
@@ -679,20 +550,6 @@ msgstr ""
 msgid "Certificate decode error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:45
-msgid "Certificate Expiration Notice"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:41
-msgid "Certificate Expired"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:49
-#: src/components/Notification/notifications.ts:53
-#: src/components/Notification/notifications.ts:57
-msgid "Certificate Expiring Soon"
-msgstr ""
-
 #: src/views/certificate/components/CertificateDownload.vue:70
 msgid "Certificate files downloaded successfully"
 msgstr ""
@@ -701,10 +558,6 @@ msgstr ""
 msgid "Certificate name cannot be empty"
 msgstr ""
 
-#: src/language/generate.ts:4
-msgid "Certificate not found: %{error}"
-msgstr ""
-
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgstr ""
@@ -726,10 +579,6 @@ msgstr ""
 msgid "Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:5
-msgid "Certificate revoked successfully"
-msgstr ""
-
 #: src/views/certificate/components/AutoCertManagement.vue:67
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
@@ -797,90 +646,12 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
-#: src/language/generate.ts:6
-msgid ""
-"Check if /var/run/docker.sock exists. If you are using Nginx UI Official "
-"Docker Image, please make sure the docker socket is mounted like this: `-v /"
-"var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/"
-"run/docker.sock to communicate with the host Docker Engine via Docker Client "
-"API. This feature is used to control Nginx in another container and perform "
-"container replacement rather than binary replacement during OTA upgrades of "
-"Nginx UI to ensure container dependencies are also upgraded. If you don't "
-"need this feature, please add the environment variable "
-"NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
-msgstr ""
-
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid ""
 "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and "
 "prevents using Passkeys and clipboard features"
 msgstr ""
 
-#: src/language/generate.ts:8
-msgid ""
-"Check if the nginx access log path exists. By default, this path is obtained "
-"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
-"point to a valid, existing file, an error will be reported. In this case, "
-"you need to modify the configuration file to specify the access log path."
-"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
-"nginx.html#accesslogpath"
-msgstr ""
-
-#: src/language/generate.ts:9
-msgid "Check if the nginx configuration directory exists"
-msgstr ""
-
-#: src/language/generate.ts:10
-msgid "Check if the nginx configuration entry file exists"
-msgstr ""
-
-#: src/language/generate.ts:11
-msgid ""
-"Check if the nginx error log path exists. By default, this path is obtained "
-"from 'nginx -V'. If it cannot be obtained or the obtained path does not "
-"point to a valid, existing file, an error will be reported. In this case, "
-"you need to modify the configuration file to specify the error log path. "
-"Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-"
-"nginx.html#errorlogpath"
-msgstr ""
-
-#: src/language/generate.ts:7
-msgid ""
-"Check if the nginx PID path exists. By default, this path is obtained from "
-"'nginx -V'. If it cannot be obtained, an error will be reported. In this "
-"case, you need to modify the configuration file to specify the Nginx PID "
-"path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/"
-"config-nginx.html#pidpath"
-msgstr ""
-
-#: src/language/generate.ts:12
-msgid "Check if the nginx sbin path exists"
-msgstr ""
-
-#: src/language/generate.ts:13
-msgid "Check if the nginx.conf includes the conf.d directory"
-msgstr ""
-
-#: src/language/generate.ts:14
-msgid "Check if the nginx.conf includes the sites-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:15
-msgid "Check if the nginx.conf includes the streams-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:16
-msgid ""
-"Check if the sites-available and sites-enabled directories are under the "
-"nginx configuration directory"
-msgstr ""
-
-#: src/language/generate.ts:17
-msgid ""
-"Check if the streams-available and streams-enabled directories are under the "
-"nginx configuration directory"
-msgstr ""
-
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgstr ""
@@ -988,7 +759,7 @@ msgstr ""
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgstr ""
 
-#: src/views/preference/components/ExternalNotify/columns.tsx:46
+#: src/views/preference/components/ExternalNotify/columns.tsx:58
 msgid "Config"
 msgstr ""
 
@@ -1130,7 +901,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:72
 #: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
-#: src/views/preference/components/ExternalNotify/columns.tsx:68
+#: src/views/preference/components/ExternalNotify/columns.tsx:80
 #: src/views/user/userColumns.tsx:46
 msgid "Created at"
 msgstr ""
@@ -1257,14 +1028,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:86
-msgid "Delete %{path} on %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:90
-msgid "Delete %{path} on %{env_name} successfully"
-msgstr ""
-
 #: src/views/certificate/components/RemoveCert.vue:95
 msgid "Delete Certificate"
 msgstr ""
@@ -1277,51 +1040,18 @@ msgstr ""
 msgid "Delete Permanently"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:85
-msgid "Delete Remote Config Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:89
-msgid "Delete Remote Config Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:97 src/language/constants.ts:50
+#: src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:101
 #: src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:153
-msgid "Delete Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:157
-msgid "Delete Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:98
-msgid "Delete site %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:102
-msgid "Delete site %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/site/site_list/SiteList.vue:48
 msgid "Delete site: %{site_name}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:154
-msgid "Delete stream %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:158
-msgid "Delete stream %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/stream/StreamList.vue:47
 msgid "Delete stream: %{stream_name}"
 msgstr ""
@@ -1408,56 +1138,14 @@ msgstr ""
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:105
 #: src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:129
-msgid "Disable Remote Site Maintenance Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:133
-msgid "Disable Remote Site Maintenance Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:109
 #: src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:161
-msgid "Disable Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:165
-msgid "Disable Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:106
-msgid "Disable site %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:110
-msgid "Disable site %{name} from %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:130
-msgid "Disable site %{name} maintenance on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:134
-msgid "Disable site %{name} maintenance on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:162
-msgid "Disable stream %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:166
-msgid "Disable stream %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:175
 #: src/views/environments/list/envColumns.tsx:60
 #: src/views/environments/list/envColumns.tsx:78
@@ -1528,10 +1216,6 @@ msgstr ""
 msgid "Docker client not initialized"
 msgstr ""
 
-#: src/language/generate.ts:18
-msgid "Docker socket exists"
-msgstr ""
-
 #: src/constants/errors/self_check.ts:16
 msgid "Docker socket not exist"
 msgstr ""
@@ -1679,56 +1363,14 @@ msgstr ""
 msgid "Enable Proxy Cache"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:113
 #: src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:121
-msgid "Enable Remote Site Maintenance Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:125
-msgid "Enable Remote Site Maintenance Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:117
 #: src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:169
-msgid "Enable Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:173
-msgid "Enable Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:122
-msgid "Enable site %{name} maintenance on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:126
-msgid "Enable site %{name} maintenance on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:114
-msgid "Enable site %{name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:118
-msgid "Enable site %{name} on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:170
-msgid "Enable stream %{name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:174
-msgid "Enable stream %{name} on %{node} successfully"
-msgstr ""
-
 #: src/views/dashboard/NginxDashBoard.vue:172
 msgid "Enable stub_status module"
 msgstr ""
@@ -1744,6 +1386,7 @@ msgstr ""
 #: src/views/backup/AutoBackup/AutoBackup.vue:174
 #: src/views/environments/list/envColumns.tsx:69
 #: src/views/environments/list/envColumns.tsx:75
+#: src/views/preference/components/ExternalNotify/columns.tsx:47
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
@@ -1880,12 +1523,8 @@ msgstr ""
 msgid "External notification configuration not found"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:93
-msgid "External Notification Test"
-msgstr ""
-
 #: src/views/preference/Preference.vue:58
-#: src/views/preference/tabs/ExternalNotify.vue:36
+#: src/views/preference/tabs/ExternalNotify.vue:41
 msgid "External Notify"
 msgstr ""
 
@@ -2038,10 +1677,6 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
-#: src/language/generate.ts:19
-msgid "Failed to delete certificate from database: %{error}"
-msgstr ""
-
 #: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/StreamStatusSelect.vue:45
 msgid "Failed to disable %{msg}"
@@ -2208,15 +1843,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
-#: src/language/generate.ts:20
-msgid "Failed to revoke certificate: %{error}"
-msgstr ""
-
 #: src/views/dashboard/components/ParamsOptimization.vue:91
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 
-#: src/views/preference/tabs/ExternalNotify.vue:26
+#: src/views/preference/tabs/ExternalNotify.vue:31
 msgid "Failed to send test message"
 msgstr ""
 
@@ -2224,6 +1855,10 @@ msgstr ""
 msgid "Failed to start temp container: {0}"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/EnabledSwitch.vue:29
+msgid "Failed to update status"
+msgstr ""
+
 #: src/views/certificate/components/CertificateFileUpload.vue:103
 msgid "Failed to upload file"
 msgstr ""
@@ -2695,7 +2330,7 @@ msgstr ""
 msgid "Key Type"
 msgstr ""
 
-#: src/views/preference/components/ExternalNotify/columns.tsx:32
+#: src/views/preference/components/ExternalNotify/columns.tsx:33
 msgid "Language"
 msgstr ""
 
@@ -2841,13 +2476,6 @@ msgstr ""
 msgid "Log"
 msgstr ""
 
-#: src/language/generate.ts:21
-msgid ""
-"Log file %{log_path} is not a regular file. If you are using nginx-ui in "
-"docker container, please refer to https://nginxui.com/zh_CN/guide/config-"
-"nginx-log.html for more information."
-msgstr ""
-
 #: src/routes/modules/nginx_log.ts:39 src/views/nginx_log/NginxLogList.vue:88
 msgid "Log List"
 msgstr ""
@@ -3185,10 +2813,6 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/language/generate.ts:23
-msgid "Nginx access log path exists"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:28
 #: src/views/backup/AutoBackup/AutoBackup.vue:40
 msgid "Nginx and Nginx UI Config"
@@ -3218,14 +2842,6 @@ msgstr ""
 msgid "Nginx config directory is not set"
 msgstr ""
 
-#: src/language/generate.ts:24
-msgid "Nginx configuration directory exists"
-msgstr ""
-
-#: src/language/generate.ts:25
-msgid "Nginx configuration entry file exists"
-msgstr ""
-
 #: src/components/SystemRestore/SystemRestoreContent.vue:138
 msgid "Nginx configuration has been restored"
 msgstr ""
@@ -3260,10 +2876,6 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/language/generate.ts:26
-msgid "Nginx error log path exists"
-msgstr ""
-
 #: src/constants/errors/nginx.ts:2
 msgid "Nginx error: {0}"
 msgstr ""
@@ -3301,10 +2913,6 @@ msgstr ""
 msgid "Nginx PID Path"
 msgstr ""
 
-#: src/language/generate.ts:22
-msgid "Nginx PID path exists"
-msgstr ""
-
 #: src/views/preference/tabs/NginxSettings.vue:40
 msgid "Nginx Reload Command"
 msgstr ""
@@ -3334,10 +2942,6 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr ""
 
-#: src/language/generate.ts:27
-msgid "Nginx sbin path exists"
-msgstr ""
-
 #: src/views/preference/tabs/NginxSettings.vue:37
 msgid "Nginx Test Config Command"
 msgstr ""
@@ -3365,18 +2969,6 @@ msgid ""
 "few seconds."
 msgstr ""
 
-#: src/language/generate.ts:28
-msgid "Nginx.conf includes conf.d directory"
-msgstr ""
-
-#: src/language/generate.ts:29
-msgid "Nginx.conf includes sites-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:30
-msgid "Nginx.conf includes streams-enabled directory"
-msgstr ""
-
 #: src/components/ChatGPT/ChatMessageInput.vue:17
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:111
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:99
@@ -3834,7 +3426,6 @@ msgid ""
 "select one of the credentialsbelow to request the API of the DNS provider."
 msgstr ""
 
-#: src/components/Notification/notifications.ts:194
 #: src/language/constants.ts:59
 msgid ""
 "Please generate new recovery codes in the preferences immediately to prevent "
@@ -4145,22 +3736,6 @@ msgstr ""
 msgid "Reload nginx failed: {0}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:10
-msgid "Reload Nginx on %{node} failed, response: %{resp}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:14
-msgid "Reload Nginx on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:9
-msgid "Reload Remote Nginx Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:13
-msgid "Reload Remote Nginx Success"
-msgstr ""
-
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:52
 msgid "Reload request failed, please check your network connection"
 msgstr ""
@@ -4200,56 +3775,22 @@ msgstr ""
 msgid "Rename"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:78
-msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:82
-msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:77 src/language/constants.ts:42
+#: src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:81 src/language/constants.ts:41
+#: src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:137
 #: src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:141
 #: src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:177
-msgid "Rename Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:181
-msgid "Rename Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:138
-msgid "Rename site %{name} to %{new_name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:142
-msgid "Rename site %{name} to %{new_name} on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:178
-msgid "Rename stream %{name} to %{new_name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:182
-msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
-msgstr ""
-
 #: src/views/config/components/Rename.vue:43
 msgid "Rename successfully"
 msgstr ""
@@ -4328,22 +3869,6 @@ msgstr ""
 msgid "Restart Nginx"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:18
-msgid "Restart Nginx on %{node} failed, response: %{resp}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:22
-msgid "Restart Nginx on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:17
-msgid "Restart Remote Nginx Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:21
-msgid "Restart Remote Nginx Success"
-msgstr ""
-
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:72
 msgid "Restart request failed, please check your network connection"
 msgstr ""
@@ -4553,40 +4078,14 @@ msgstr ""
 msgid "Save Directive"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:145
 #: src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:149
 #: src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:185
-msgid "Save Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:189
-msgid "Save Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:146
-msgid "Save site %{name} to %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:150
-msgid "Save site %{name} to %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:186
-msgid "Save stream %{name} to %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:190
-msgid "Save stream %{name} to %{node} successfully"
-msgstr ""
-
 #: src/language/curd.ts:36
 msgid "Save successful"
 msgstr ""
@@ -4829,10 +4328,6 @@ msgstr ""
 msgid "Site not found"
 msgstr ""
 
-#: src/language/generate.ts:31
-msgid "Sites directory exists"
-msgstr ""
-
 #: src/routes/modules/sites.ts:19
 msgid "Sites List"
 msgstr ""
@@ -4945,6 +4440,10 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/EnabledSwitch.vue:23
+msgid "Status updated successfully"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr ""
@@ -4958,12 +4457,6 @@ msgstr ""
 msgid "Storage Configuration"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:26
-msgid ""
-"Storage configuration validation failed for backup task %{backup_name}, "
-"error: %{error}"
-msgstr ""
-
 #: src/views/backup/AutoBackup/components/StorageConfigEditor.vue:120
 #: src/views/backup/AutoBackup/components/StorageConfigEditor.vue:54
 msgid "Storage Path"
@@ -4991,10 +4484,6 @@ msgstr ""
 msgid "Stream not found"
 msgstr ""
 
-#: src/language/generate.ts:32
-msgid "Streams directory exists"
-msgstr ""
-
 #: src/constants/errors/self_check.ts:13
 msgid "Streams-available directory not exist"
 msgstr ""
@@ -5073,35 +4562,19 @@ msgstr ""
 msgid "Sync Certificate"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:62
-msgid "Sync Certificate %{cert_name} to %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:66
-msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:61 src/language/constants.ts:39
+#: src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:65 src/language/constants.ts:38
+#: src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:70
-msgid "Sync config %{config_name} to %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:74
-msgid "Sync config %{config_name} to %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:69 src/language/constants.ts:45
+#: src/language/constants.ts:45
 msgid "Sync Config Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:73 src/language/constants.ts:44
+#: src/language/constants.ts:44
 msgid "Sync Config Success"
 msgstr ""
 
@@ -5177,12 +4650,12 @@ msgstr ""
 msgid "Terminal Start Command"
 msgstr ""
 
-#: src/views/preference/tabs/ExternalNotify.vue:51
+#: src/views/preference/tabs/ExternalNotify.vue:56
 msgid "Test"
 msgstr ""
 
 #: src/views/preference/components/ExternalNotify/ExternalNotifyEditor.vue:52
-#: src/views/preference/tabs/ExternalNotify.vue:22
+#: src/views/preference/tabs/ExternalNotify.vue:27
 msgid "Test message sent successfully"
 msgstr ""
 
@@ -5335,16 +4808,16 @@ msgid ""
 "_./:"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:94
-msgid "This is a test message sent at %{timestamp} from Nginx UI."
-msgstr ""
-
 #: src/views/dashboard/NginxDashBoard.vue:175
 msgid ""
 "This module provides Nginx request statistics, connection count, etc. data. "
 "After enabling it, you can view performance statistics"
 msgstr ""
 
+#: src/views/preference/tabs/ExternalNotify.vue:15
+msgid "This notification is disabled"
+msgstr ""
+
 #: src/views/certificate/components/RemoveCert.vue:106
 msgid ""
 "This operation will only remove the certificate from the database. The "
@@ -5534,7 +5007,7 @@ msgstr ""
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:28
 #: src/views/notification/notificationColumns.tsx:8
-#: src/views/preference/components/ExternalNotify/columns.tsx:18
+#: src/views/preference/components/ExternalNotify/columns.tsx:19
 msgid "Type"
 msgstr ""
 
@@ -5770,6 +5243,10 @@ msgstr ""
 msgid "WebSocket connection error"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/wecom.ts:5
+msgid "WeCom"
+msgstr ""
+
 #: src/views/backup/AutoBackup/components/CronEditor.vue:29
 msgid "Wednesday"
 msgstr ""

Plik diff jest za duży
+ 64 - 527
app/src/language/es/app.po


Plik diff jest za duży
+ 57 - 530
app/src/language/fr_FR/app.po


+ 0 - 50
app/src/language/generate.ts

@@ -1,54 +1,4 @@
 // This file is auto-generated. DO NOT EDIT MANUALLY.
 
 export const msg = [
-  $gettext('Certificate not found: %{error}'),
-  $gettext('Certificate revoked successfully'),
-  $gettext('Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/run/docker.sock to communicate with the host Docker Engine via Docker Client API. This feature is used to control Nginx in another container and perform container replacement rather than binary replacement during OTA upgrades of Nginx UI to ensure container dependencies are also upgraded. If you don\'t need this feature, please add the environment variable NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container.'),
-  $gettext('Check if the nginx PID path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained, an error will be reported. In this case, you need to modify the configuration file to specify the Nginx PID path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath'),
-  $gettext('Check if the nginx access log path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the access log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath'),
-  $gettext('Check if the nginx configuration directory exists'),
-  $gettext('Check if the nginx configuration entry file exists'),
-  $gettext('Check if the nginx error log path exists. By default, this path is obtained from \'nginx -V\'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the error log path. Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath'),
-  $gettext('Check if the nginx sbin path exists'),
-  $gettext('Check if the nginx.conf includes the conf.d directory'),
-  $gettext('Check if the nginx.conf includes the sites-enabled directory'),
-  $gettext('Check if the nginx.conf includes the streams-enabled directory'),
-  $gettext('Check if the sites-available and sites-enabled directories are under the nginx configuration directory'),
-  $gettext('Check if the streams-available and streams-enabled directories are under the nginx configuration directory'),
-  $gettext('Docker socket exists'),
-  $gettext('Failed to delete certificate from database: %{error}'),
-  $gettext('Failed to revoke certificate: %{error}'),
-  $gettext('Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information.'),
-  $gettext('Nginx PID path exists'),
-  $gettext('Nginx access log path exists'),
-  $gettext('Nginx configuration directory exists'),
-  $gettext('Nginx configuration entry file exists'),
-  $gettext('Nginx error log path exists'),
-  $gettext('Nginx sbin path exists'),
-  $gettext('Nginx.conf includes conf.d directory'),
-  $gettext('Nginx.conf includes sites-enabled directory'),
-  $gettext('Nginx.conf includes streams-enabled directory'),
-  $gettext('Sites directory exists'),
-  $gettext('Streams directory exists'),
-  $gettext('[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}'),
-  $gettext('[Nginx UI] Backing up current certificate for later revocation'),
-  $gettext('[Nginx UI] Certificate renewed successfully'),
-  $gettext('[Nginx UI] Certificate successfully revoked'),
-  $gettext('[Nginx UI] Certificate was used for server, reloading server TLS certificate'),
-  $gettext('[Nginx UI] Creating client facilitates communication with the CA server'),
-  $gettext('[Nginx UI] Environment variables cleaned'),
-  $gettext('[Nginx UI] Finished'),
-  $gettext('[Nginx UI] Issued certificate successfully'),
-  $gettext('[Nginx UI] Obtaining certificate'),
-  $gettext('[Nginx UI] Preparing for certificate revocation'),
-  $gettext('[Nginx UI] Preparing lego configurations'),
-  $gettext('[Nginx UI] Reloading nginx'),
-  $gettext('[Nginx UI] Revocation completed'),
-  $gettext('[Nginx UI] Revoking certificate'),
-  $gettext('[Nginx UI] Revoking old certificate'),
-  $gettext('[Nginx UI] Setting DNS01 challenge provider'),
-  $gettext('[Nginx UI] Setting HTTP01 challenge provider'),
-  $gettext('[Nginx UI] Setting environment variables'),
-  $gettext('[Nginx UI] Writing certificate private key to disk'),
-  $gettext('[Nginx UI] Writing certificate to disk'),
 ]

Plik diff jest za duży
+ 60 - 549
app/src/language/ja_JP/app.po


Plik diff jest za duży
+ 61 - 536
app/src/language/ko_KR/app.po


+ 26 - 519
app/src/language/messages.pot

@@ -2,90 +2,6 @@ msgid ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 
-#: src/language/generate.ts:33
-msgid "[Nginx UI] ACME User: %{name}, Email: %{email}, CA Dir: %{caDir}"
-msgstr ""
-
-#: src/language/generate.ts:34
-msgid "[Nginx UI] Backing up current certificate for later revocation"
-msgstr ""
-
-#: src/language/generate.ts:35
-msgid "[Nginx UI] Certificate renewed successfully"
-msgstr ""
-
-#: src/language/generate.ts:36
-msgid "[Nginx UI] Certificate successfully revoked"
-msgstr ""
-
-#: src/language/generate.ts:37
-msgid "[Nginx UI] Certificate was used for server, reloading server TLS certificate"
-msgstr ""
-
-#: src/language/generate.ts:38
-msgid "[Nginx UI] Creating client facilitates communication with the CA server"
-msgstr ""
-
-#: src/language/generate.ts:39
-msgid "[Nginx UI] Environment variables cleaned"
-msgstr ""
-
-#: src/language/generate.ts:40
-msgid "[Nginx UI] Finished"
-msgstr ""
-
-#: src/language/generate.ts:41
-msgid "[Nginx UI] Issued certificate successfully"
-msgstr ""
-
-#: src/language/generate.ts:42
-msgid "[Nginx UI] Obtaining certificate"
-msgstr ""
-
-#: src/language/generate.ts:43
-msgid "[Nginx UI] Preparing for certificate revocation"
-msgstr ""
-
-#: src/language/generate.ts:44
-msgid "[Nginx UI] Preparing lego configurations"
-msgstr ""
-
-#: src/language/generate.ts:45
-msgid "[Nginx UI] Reloading nginx"
-msgstr ""
-
-#: src/language/generate.ts:46
-msgid "[Nginx UI] Revocation completed"
-msgstr ""
-
-#: src/language/generate.ts:47
-msgid "[Nginx UI] Revoking certificate"
-msgstr ""
-
-#: src/language/generate.ts:48
-msgid "[Nginx UI] Revoking old certificate"
-msgstr ""
-
-#: src/language/generate.ts:49
-msgid "[Nginx UI] Setting DNS01 challenge provider"
-msgstr ""
-
-#: src/language/generate.ts:51
-msgid "[Nginx UI] Setting environment variables"
-msgstr ""
-
-#: src/language/generate.ts:50
-msgid "[Nginx UI] Setting HTTP01 challenge provider"
-msgstr ""
-
-#: src/language/generate.ts:52
-msgid "[Nginx UI] Writing certificate private key to disk"
-msgstr ""
-
-#: src/language/generate.ts:53
-msgid "[Nginx UI] Writing certificate to disk"
-msgstr ""
-
 #: src/components/SyncNodesPreview/SyncNodesPreview.vue:59
 msgid "* Includes nodes from group %{groupName} and manually selected nodes"
 msgstr ""
@@ -134,7 +50,7 @@ msgstr ""
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:68
 #: src/views/notification/notificationColumns.tsx:72
-#: src/views/preference/components/ExternalNotify/columns.tsx:73
+#: src/views/preference/components/ExternalNotify/columns.tsx:85
 #: src/views/site/site_list/columns.tsx:160
 #: src/views/stream/columns.tsx:123
 #: src/views/user/userColumns.tsx:58
@@ -222,7 +138,6 @@ msgstr ""
 msgid "All"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:193
 #: src/language/constants.ts:58
 msgid "All Recovery Codes Have Been Used"
 msgstr ""
@@ -369,22 +284,6 @@ msgstr ""
 msgid "Auto Backup"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:37
-msgid "Auto Backup Completed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:25
-msgid "Auto Backup Configuration Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:29
-msgid "Auto Backup Failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:33
-msgid "Auto Backup Storage Failed"
-msgstr ""
-
 #: src/views/environments/list/Environment.vue:165
 #: src/views/nginx_log/NginxLog.vue:150
 msgid "Auto Refresh"
@@ -482,18 +381,6 @@ msgstr ""
 msgid "Backup Schedule"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:38
-msgid "Backup task %{backup_name} completed successfully, file: %{file_path}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:34
-msgid "Backup task %{backup_name} failed during storage upload, error: %{error}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:30
-msgid "Backup task %{backup_name} failed to execute, error: %{error}"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:24
 msgid "Backup Type"
 msgstr ""
@@ -663,20 +550,6 @@ msgstr ""
 msgid "certificate"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:42
-msgid "Certificate %{name} has expired"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:46
-#: src/components/Notification/notifications.ts:50
-#: src/components/Notification/notifications.ts:54
-msgid "Certificate %{name} will expire in %{days} days"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:58
-msgid "Certificate %{name} will expire in 1 day"
-msgstr ""
-
 #: src/views/certificate/components/CertificateDownload.vue:36
 msgid "Certificate content and private key content cannot be empty"
 msgstr ""
@@ -685,20 +558,6 @@ msgstr ""
 msgid "Certificate decode error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:45
-msgid "Certificate Expiration Notice"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:41
-msgid "Certificate Expired"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:49
-#: src/components/Notification/notifications.ts:53
-#: src/components/Notification/notifications.ts:57
-msgid "Certificate Expiring Soon"
-msgstr ""
-
 #: src/views/certificate/components/CertificateDownload.vue:70
 msgid "Certificate files downloaded successfully"
 msgstr ""
@@ -707,10 +566,6 @@ msgstr ""
 msgid "Certificate name cannot be empty"
 msgstr ""
 
-#: src/language/generate.ts:4
-msgid "Certificate not found: %{error}"
-msgstr ""
-
 #: src/constants/errors/cert.ts:5
 msgid "Certificate parse error"
 msgstr ""
@@ -732,10 +587,6 @@ msgstr ""
 msgid "Certificate renewed successfully"
 msgstr ""
 
-#: src/language/generate.ts:5
-msgid "Certificate revoked successfully"
-msgstr ""
-
 #: src/views/certificate/components/AutoCertManagement.vue:67
 #: src/views/site/site_edit/components/Cert/Cert.vue:58
 msgid "Certificate Status"
@@ -803,58 +654,10 @@ msgstr ""
 msgid "Check again"
 msgstr ""
 
-#: src/language/generate.ts:6
-msgid "Check if /var/run/docker.sock exists. If you are using Nginx UI Official Docker Image, please make sure the docker socket is mounted like this: `-v /var/run/docker.sock:/var/run/docker.sock`. Nginx UI official image uses /var/run/docker.sock to communicate with the host Docker Engine via Docker Client API. This feature is used to control Nginx in another container and perform container replacement rather than binary replacement during OTA upgrades of Nginx UI to ensure container dependencies are also upgraded. If you don't need this feature, please add the environment variable NGINX_UI_IGNORE_DOCKER_SOCKET=true to the container."
-msgstr ""
-
 #: src/components/SelfCheck/tasks/frontend/https-check.ts:14
 msgid "Check if HTTPS is enabled. Using HTTP outside localhost is insecure and prevents using Passkeys and clipboard features"
 msgstr ""
 
-#: src/language/generate.ts:8
-msgid "Check if the nginx access log path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the access log path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#accesslogpath"
-msgstr ""
-
-#: src/language/generate.ts:9
-msgid "Check if the nginx configuration directory exists"
-msgstr ""
-
-#: src/language/generate.ts:10
-msgid "Check if the nginx configuration entry file exists"
-msgstr ""
-
-#: src/language/generate.ts:11
-msgid "Check if the nginx error log path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained or the obtained path does not point to a valid, existing file, an error will be reported. In this case, you need to modify the configuration file to specify the error log path. Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#errorlogpath"
-msgstr ""
-
-#: src/language/generate.ts:7
-msgid "Check if the nginx PID path exists. By default, this path is obtained from 'nginx -V'. If it cannot be obtained, an error will be reported. In this case, you need to modify the configuration file to specify the Nginx PID path.Refer to the docs for more details: https://nginxui.com/zh_CN/guide/config-nginx.html#pidpath"
-msgstr ""
-
-#: src/language/generate.ts:12
-msgid "Check if the nginx sbin path exists"
-msgstr ""
-
-#: src/language/generate.ts:13
-msgid "Check if the nginx.conf includes the conf.d directory"
-msgstr ""
-
-#: src/language/generate.ts:14
-msgid "Check if the nginx.conf includes the sites-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:15
-msgid "Check if the nginx.conf includes the streams-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:16
-msgid "Check if the sites-available and sites-enabled directories are under the nginx configuration directory"
-msgstr ""
-
-#: src/language/generate.ts:17
-msgid "Check if the streams-available and streams-enabled directories are under the nginx configuration directory"
-msgstr ""
-
 #: src/constants/errors/crypto.ts:3
 msgid "Cipher text is too short"
 msgstr ""
@@ -965,7 +768,7 @@ msgstr ""
 msgid "Compression level, 1 is lowest, 9 is highest"
 msgstr ""
 
-#: src/views/preference/components/ExternalNotify/columns.tsx:46
+#: src/views/preference/components/ExternalNotify/columns.tsx:58
 msgid "Config"
 msgstr ""
 
@@ -1106,7 +909,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:72
 #: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
-#: src/views/preference/components/ExternalNotify/columns.tsx:68
+#: src/views/preference/components/ExternalNotify/columns.tsx:80
 #: src/views/user/userColumns.tsx:46
 msgid "Created at"
 msgstr ""
@@ -1232,14 +1035,6 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:86
-msgid "Delete %{path} on %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:90
-msgid "Delete %{path} on %{env_name} successfully"
-msgstr ""
-
 #: src/views/certificate/components/RemoveCert.vue:95
 msgid "Delete Certificate"
 msgstr ""
@@ -1252,52 +1047,18 @@ msgstr ""
 msgid "Delete Permanently"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:85
-msgid "Delete Remote Config Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:89
-msgid "Delete Remote Config Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:97
 #: src/language/constants.ts:50
 msgid "Delete Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:101
 #: src/language/constants.ts:49
 msgid "Delete Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:153
-msgid "Delete Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:157
-msgid "Delete Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:98
-msgid "Delete site %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:102
-msgid "Delete site %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/site/site_list/SiteList.vue:48
 msgid "Delete site: %{site_name}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:154
-msgid "Delete stream %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:158
-msgid "Delete stream %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/stream/StreamList.vue:47
 msgid "Delete stream: %{stream_name}"
 msgstr ""
@@ -1386,56 +1147,14 @@ msgstr ""
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:105
 #: src/language/constants.ts:52
 msgid "Disable Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:129
-msgid "Disable Remote Site Maintenance Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:133
-msgid "Disable Remote Site Maintenance Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:109
 #: src/language/constants.ts:51
 msgid "Disable Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:161
-msgid "Disable Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:165
-msgid "Disable Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:106
-msgid "Disable site %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:110
-msgid "Disable site %{name} from %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:130
-msgid "Disable site %{name} maintenance on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:134
-msgid "Disable site %{name} maintenance on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:162
-msgid "Disable stream %{name} from %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:166
-msgid "Disable stream %{name} from %{node} successfully"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:175
 #: src/views/environments/list/envColumns.tsx:60
 #: src/views/environments/list/envColumns.tsx:78
@@ -1507,10 +1226,6 @@ msgstr ""
 msgid "Docker client not initialized"
 msgstr ""
 
-#: src/language/generate.ts:18
-msgid "Docker socket exists"
-msgstr ""
-
 #: src/constants/errors/self_check.ts:16
 msgid "Docker socket not exist"
 msgstr ""
@@ -1656,56 +1371,14 @@ msgstr ""
 msgid "Enable Proxy Cache"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:113
 #: src/language/constants.ts:54
 msgid "Enable Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:121
-msgid "Enable Remote Site Maintenance Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:125
-msgid "Enable Remote Site Maintenance Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:117
 #: src/language/constants.ts:53
 msgid "Enable Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:169
-msgid "Enable Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:173
-msgid "Enable Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:122
-msgid "Enable site %{name} maintenance on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:126
-msgid "Enable site %{name} maintenance on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:114
-msgid "Enable site %{name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:118
-msgid "Enable site %{name} on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:170
-msgid "Enable stream %{name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:174
-msgid "Enable stream %{name} on %{node} successfully"
-msgstr ""
-
 #: src/views/dashboard/NginxDashBoard.vue:172
 msgid "Enable stub_status module"
 msgstr ""
@@ -1721,6 +1394,7 @@ msgstr ""
 #: src/views/backup/AutoBackup/AutoBackup.vue:174
 #: src/views/environments/list/envColumns.tsx:69
 #: src/views/environments/list/envColumns.tsx:75
+#: src/views/preference/components/ExternalNotify/columns.tsx:47
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
@@ -1855,12 +1529,8 @@ msgstr ""
 msgid "External notification configuration not found"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:93
-msgid "External Notification Test"
-msgstr ""
-
 #: src/views/preference/Preference.vue:58
-#: src/views/preference/tabs/ExternalNotify.vue:36
+#: src/views/preference/tabs/ExternalNotify.vue:41
 msgid "External Notify"
 msgstr ""
 
@@ -2013,10 +1683,6 @@ msgstr ""
 msgid "Failed to delete certificate"
 msgstr ""
 
-#: src/language/generate.ts:19
-msgid "Failed to delete certificate from database: %{error}"
-msgstr ""
-
 #: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/StreamStatusSelect.vue:45
 msgid "Failed to disable %{msg}"
@@ -2183,15 +1849,11 @@ msgstr ""
 msgid "Failed to revoke certificate"
 msgstr ""
 
-#: src/language/generate.ts:20
-msgid "Failed to revoke certificate: %{error}"
-msgstr ""
-
 #: src/views/dashboard/components/ParamsOptimization.vue:91
 msgid "Failed to save Nginx performance settings"
 msgstr ""
 
-#: src/views/preference/tabs/ExternalNotify.vue:26
+#: src/views/preference/tabs/ExternalNotify.vue:31
 msgid "Failed to send test message"
 msgstr ""
 
@@ -2199,6 +1861,10 @@ msgstr ""
 msgid "Failed to start temp container: {0}"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/EnabledSwitch.vue:29
+msgid "Failed to update status"
+msgstr ""
+
 #: src/views/certificate/components/CertificateFileUpload.vue:103
 msgid "Failed to upload file"
 msgstr ""
@@ -2654,7 +2320,7 @@ msgstr ""
 msgid "Key Type"
 msgstr ""
 
-#: src/views/preference/components/ExternalNotify/columns.tsx:32
+#: src/views/preference/components/ExternalNotify/columns.tsx:33
 msgid "Language"
 msgstr ""
 
@@ -2802,10 +2468,6 @@ msgstr ""
 msgid "Log"
 msgstr ""
 
-#: src/language/generate.ts:21
-msgid "Log file %{log_path} is not a regular file. If you are using nginx-ui in docker container, please refer to https://nginxui.com/zh_CN/guide/config-nginx-log.html for more information."
-msgstr ""
-
 #: src/routes/modules/nginx_log.ts:39
 #: src/views/nginx_log/NginxLogList.vue:88
 msgid "Log List"
@@ -3142,10 +2804,6 @@ msgstr ""
 msgid "Nginx Access Log Path"
 msgstr ""
 
-#: src/language/generate.ts:23
-msgid "Nginx access log path exists"
-msgstr ""
-
 #: src/views/backup/AutoBackup/AutoBackup.vue:28
 #: src/views/backup/AutoBackup/AutoBackup.vue:40
 msgid "Nginx and Nginx UI Config"
@@ -3175,14 +2833,6 @@ msgstr ""
 msgid "Nginx config directory is not set"
 msgstr ""
 
-#: src/language/generate.ts:24
-msgid "Nginx configuration directory exists"
-msgstr ""
-
-#: src/language/generate.ts:25
-msgid "Nginx configuration entry file exists"
-msgstr ""
-
 #: src/components/SystemRestore/SystemRestoreContent.vue:138
 msgid "Nginx configuration has been restored"
 msgstr ""
@@ -3217,10 +2867,6 @@ msgstr ""
 msgid "Nginx Error Log Path"
 msgstr ""
 
-#: src/language/generate.ts:26
-msgid "Nginx error log path exists"
-msgstr ""
-
 #: src/constants/errors/nginx.ts:2
 msgid "Nginx error: {0}"
 msgstr ""
@@ -3259,10 +2905,6 @@ msgstr ""
 msgid "Nginx PID Path"
 msgstr ""
 
-#: src/language/generate.ts:22
-msgid "Nginx PID path exists"
-msgstr ""
-
 #: src/views/preference/tabs/NginxSettings.vue:40
 msgid "Nginx Reload Command"
 msgstr ""
@@ -3293,10 +2935,6 @@ msgstr ""
 msgid "Nginx restarted successfully"
 msgstr ""
 
-#: src/language/generate.ts:27
-msgid "Nginx sbin path exists"
-msgstr ""
-
 #: src/views/preference/tabs/NginxSettings.vue:37
 msgid "Nginx Test Config Command"
 msgstr ""
@@ -3323,18 +2961,6 @@ msgstr ""
 msgid "Nginx UI configuration has been restored and will restart automatically in a few seconds."
 msgstr ""
 
-#: src/language/generate.ts:28
-msgid "Nginx.conf includes conf.d directory"
-msgstr ""
-
-#: src/language/generate.ts:29
-msgid "Nginx.conf includes sites-enabled directory"
-msgstr ""
-
-#: src/language/generate.ts:30
-msgid "Nginx.conf includes streams-enabled directory"
-msgstr ""
-
 #: src/components/ChatGPT/ChatMessageInput.vue:17
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:111
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:99
@@ -3781,7 +3407,6 @@ msgstr ""
 msgid "Please first add credentials in Certification > DNS Credentials, and then select one of the credentialsbelow to request the API of the DNS provider."
 msgstr ""
 
-#: src/components/Notification/notifications.ts:194
 #: src/language/constants.ts:59
 msgid "Please generate new recovery codes in the preferences immediately to prevent lockout."
 msgstr ""
@@ -4086,22 +3711,6 @@ msgstr ""
 msgid "Reload nginx failed: {0}"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:10
-msgid "Reload Nginx on %{node} failed, response: %{resp}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:14
-msgid "Reload Nginx on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:9
-msgid "Reload Remote Nginx Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:13
-msgid "Reload Remote Nginx Success"
-msgstr ""
-
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:52
 msgid "Reload request failed, please check your network connection"
 msgstr ""
@@ -4141,58 +3750,22 @@ msgstr ""
 msgid "Rename"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:78
-msgid "Rename %{orig_path} to %{new_path} on %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:82
-msgid "Rename %{orig_path} to %{new_path} on %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:77
 #: src/language/constants.ts:42
 msgid "Rename Remote Config Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:81
 #: src/language/constants.ts:41
 msgid "Rename Remote Config Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:137
 #: src/language/constants.ts:56
 msgid "Rename Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:141
 #: src/language/constants.ts:55
 msgid "Rename Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:177
-msgid "Rename Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:181
-msgid "Rename Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:138
-msgid "Rename site %{name} to %{new_name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:142
-msgid "Rename site %{name} to %{new_name} on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:178
-msgid "Rename stream %{name} to %{new_name} on %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:182
-msgid "Rename stream %{name} to %{new_name} on %{node} successfully"
-msgstr ""
-
 #: src/views/config/components/Rename.vue:43
 msgid "Rename successfully"
 msgstr ""
@@ -4269,22 +3842,6 @@ msgstr ""
 msgid "Restart Nginx"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:18
-msgid "Restart Nginx on %{node} failed, response: %{resp}"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:22
-msgid "Restart Nginx on %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:17
-msgid "Restart Remote Nginx Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:21
-msgid "Restart Remote Nginx Success"
-msgstr ""
-
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:72
 msgid "Restart request failed, please check your network connection"
 msgstr ""
@@ -4492,40 +4049,14 @@ msgstr ""
 msgid "Save Directive"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:145
 #: src/language/constants.ts:48
 msgid "Save Remote Site Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:149
 #: src/language/constants.ts:47
 msgid "Save Remote Site Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:185
-msgid "Save Remote Stream Error"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:189
-msgid "Save Remote Stream Success"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:146
-msgid "Save site %{name} to %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:150
-msgid "Save site %{name} to %{node} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:186
-msgid "Save stream %{name} to %{node} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:190
-msgid "Save stream %{name} to %{node} successfully"
-msgstr ""
-
 #: src/language/curd.ts:36
 msgid "Save successful"
 msgstr ""
@@ -4766,10 +4297,6 @@ msgstr ""
 msgid "Site not found"
 msgstr ""
 
-#: src/language/generate.ts:31
-msgid "Sites directory exists"
-msgstr ""
-
 #: src/routes/modules/sites.ts:19
 msgid "Sites List"
 msgstr ""
@@ -4884,6 +4411,10 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/EnabledSwitch.vue:23
+msgid "Status updated successfully"
+msgstr ""
+
 #: src/components/NginxControl/NginxControl.vue:87
 msgid "Stopped"
 msgstr ""
@@ -4897,10 +4428,6 @@ msgstr ""
 msgid "Storage Configuration"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:26
-msgid "Storage configuration validation failed for backup task %{backup_name}, error: %{error}"
-msgstr ""
-
 #: src/views/backup/AutoBackup/components/StorageConfigEditor.vue:120
 #: src/views/backup/AutoBackup/components/StorageConfigEditor.vue:54
 msgid "Storage Path"
@@ -4928,10 +4455,6 @@ msgstr ""
 msgid "Stream not found"
 msgstr ""
 
-#: src/language/generate.ts:32
-msgid "Streams directory exists"
-msgstr ""
-
 #: src/constants/errors/self_check.ts:13
 msgid "Streams-available directory not exist"
 msgstr ""
@@ -5005,38 +4528,18 @@ msgstr ""
 msgid "Sync Certificate"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:62
-msgid "Sync Certificate %{cert_name} to %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:66
-msgid "Sync Certificate %{cert_name} to %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:61
 #: src/language/constants.ts:39
 msgid "Sync Certificate Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:65
 #: src/language/constants.ts:38
 msgid "Sync Certificate Success"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:70
-msgid "Sync config %{config_name} to %{env_name} failed"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:74
-msgid "Sync config %{config_name} to %{env_name} successfully"
-msgstr ""
-
-#: src/components/Notification/notifications.ts:69
 #: src/language/constants.ts:45
 msgid "Sync Config Error"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:73
 #: src/language/constants.ts:44
 msgid "Sync Config Success"
 msgstr ""
@@ -5114,12 +4617,12 @@ msgstr ""
 msgid "Terminal Start Command"
 msgstr ""
 
-#: src/views/preference/tabs/ExternalNotify.vue:51
+#: src/views/preference/tabs/ExternalNotify.vue:56
 msgid "Test"
 msgstr ""
 
 #: src/views/preference/components/ExternalNotify/ExternalNotifyEditor.vue:52
-#: src/views/preference/tabs/ExternalNotify.vue:22
+#: src/views/preference/tabs/ExternalNotify.vue:27
 msgid "Test message sent successfully"
 msgstr ""
 
@@ -5251,14 +4754,14 @@ msgstr ""
 msgid "This field should only contain letters, unicode characters, numbers, and -_./:"
 msgstr ""
 
-#: src/components/Notification/notifications.ts:94
-msgid "This is a test message sent at %{timestamp} from Nginx UI."
-msgstr ""
-
 #: src/views/dashboard/NginxDashBoard.vue:175
 msgid "This module provides Nginx request statistics, connection count, etc. data. After enabling it, you can view performance statistics"
 msgstr ""
 
+#: src/views/preference/tabs/ExternalNotify.vue:15
+msgid "This notification is disabled"
+msgstr ""
+
 #: src/views/certificate/components/RemoveCert.vue:106
 msgid "This operation will only remove the certificate from the database. The certificate files on the file system will not be deleted."
 msgstr ""
@@ -5418,7 +4921,7 @@ msgstr ""
 #: src/views/dashboard/components/ModulesTable.vue:83
 #: src/views/nginx_log/NginxLogList.vue:28
 #: src/views/notification/notificationColumns.tsx:8
-#: src/views/preference/components/ExternalNotify/columns.tsx:18
+#: src/views/preference/components/ExternalNotify/columns.tsx:19
 msgid "Type"
 msgstr ""
 
@@ -5650,6 +5153,10 @@ msgstr ""
 msgid "WebSocket connection error"
 msgstr ""
 
+#: src/views/preference/components/ExternalNotify/wecom.ts:5
+msgid "WeCom"
+msgstr ""
+
 #: src/views/backup/AutoBackup/components/CronEditor.vue:29
 msgid "Wednesday"
 msgstr ""

Plik diff jest za duży
+ 61 - 532
app/src/language/pt_PT/app.po


Plik diff jest za duży
+ 63 - 540
app/src/language/ru_RU/app.po


Plik diff jest za duży
+ 56 - 578
app/src/language/tr_TR/app.po


Plik diff jest za duży
+ 59 - 525
app/src/language/uk_UA/app.po


Plik diff jest za duży
+ 60 - 565
app/src/language/vi_VN/app.po


Plik diff jest za duży
+ 51 - 554
app/src/language/zh_CN/app.po


Plik diff jest za duży
+ 52 - 552
app/src/language/zh_TW/app.po


+ 44 - 0
app/src/views/preference/components/ExternalNotify/EnabledSwitch.vue

@@ -0,0 +1,44 @@
+<script setup lang="ts">
+import type { ExternalNotify } from '@/api/external_notify'
+import { message } from 'ant-design-vue'
+import externalNotify from '@/api/external_notify'
+
+const props = defineProps<{
+  record: ExternalNotify
+}>()
+
+const loading = ref(false)
+const enabled = defineModel<boolean>('enabled')
+
+async function handleChange(checked) {
+  if (!props.record.id)
+    return
+
+  loading.value = true
+  try {
+    await externalNotify.updateItem(props.record.id, {
+      enabled: checked,
+    })
+    // 更新本地状态
+    message.success($gettext('Status updated successfully'))
+  }
+  catch (error) {
+    console.error('Update enabled status error:', error)
+    // 出错时恢复原状态
+    enabled.value = props.record.enabled
+    message.error($gettext('Failed to update status'))
+  }
+  finally {
+    loading.value = false
+  }
+}
+</script>
+
+<template>
+  <ASwitch
+    v-model:checked="enabled"
+    :loading="loading"
+    size="small"
+    @change="handleChange"
+  />
+</template>

+ 12 - 0
app/src/views/preference/components/ExternalNotify/columns.tsx

@@ -2,6 +2,7 @@ import type { StdTableColumn } from '@uozi-admin/curd'
 import type { ExternalNotify } from '@/api/external_notify'
 import { datetimeRender, maskRender } from '@uozi-admin/curd'
 import gettext from '@/gettext'
+import EnabledSwitch from './EnabledSwitch.vue'
 import ExternalNotifyEditor from './ExternalNotifyEditor.vue'
 import configMap from './index'
 
@@ -41,6 +42,17 @@ const columns: StdTableColumn[] = [
       },
     },
   },
+  {
+    dataIndex: 'enabled',
+    title: () => $gettext('Enabled'),
+    customRender: ({ record }: { record: ExternalNotify }) => (
+      <EnabledSwitch v-model:enabled={record.enabled} record={record} />
+    ),
+    edit: {
+      type: 'switch',
+    },
+    width: 100,
+  },
   {
     dataIndex: 'config',
     title: () => $gettext('Config'),

+ 2 - 0
app/src/views/preference/components/ExternalNotify/index.ts

@@ -5,6 +5,7 @@ import GotifyConfig from './gotify'
 import LarkConfig from './lark'
 import LarkCustomConfig from './lark_custom'
 import TelegramConfig from './telegram'
+import WeComConfig from './wecom'
 
 const configMap = {
   bark: BarkConfig,
@@ -13,6 +14,7 @@ const configMap = {
   lark: LarkConfig,
   lark_custom: LarkCustomConfig,
   telegram: TelegramConfig,
+  wecom: WeComConfig,
 }
 
 export default configMap

+ 14 - 0
app/src/views/preference/components/ExternalNotify/wecom.ts

@@ -0,0 +1,14 @@
+// This file is auto-generated by notification generator. DO NOT EDIT.
+import type { ExternalNotifyConfig } from './types'
+
+const WeComConfig: ExternalNotifyConfig = {
+  name: () => $gettext('WeCom'),
+  config: [
+    {
+      key: 'webhook_url',
+      label: 'Webhook URL',
+    },
+  ],
+}
+
+export default WeComConfig

+ 5 - 0
app/src/views/preference/tabs/ExternalNotify.vue

@@ -11,6 +11,11 @@ async function handleTestSingleMessage(record: ExternalNotify) {
   if (!record.id)
     return
 
+  if (!record.enabled) {
+    message.warning($gettext('This notification is disabled'))
+    return
+  }
+
   loadingStates.value[record.id] = true
   try {
     // Use new API with direct parameters instead of ID

+ 1 - 1
cmd/errdef/generate.go

@@ -1,4 +1,4 @@
-//go:generate go run . -project ../../ -type ts -output ../../app/src/constants/errors -ignore-dirs .devcontainer,app,.github,cmd
+//go:generate go run . -project ../../ -type ts -output ../../app/src/constants/errors -ignore-dirs .devcontainer,app,.github,cmd,.go,.claude,.cunzhi-memory,.cursor,.github,.idea,.vscode,.pnpm-store
 package main
 
 import "github.com/uozi-tech/cosy/errdef"

+ 3 - 1
cmd/notification/generate.go

@@ -25,7 +25,9 @@ type NotificationCall struct {
 // Directories to exclude
 var excludeDirs = []string{
 	".devcontainer", ".github", ".idea", ".pnpm-store",
-	".vscode", "app", "query", "tmp", "cmd",
+	".vscode", "app", "query", "tmp", "cmd", ".git", ".go", ".claude",
+	".cunzhi-memory", ".cursor", ".github", ".idea",
+	".vscode", ".pnpm-store",
 }
 
 // Main function

+ 3 - 1
cmd/translation/gettext.go

@@ -17,7 +17,9 @@ import (
 // Directories to exclude
 var excludeDirs = []string{
 	".devcontainer", ".github", ".idea", ".pnpm-store",
-	".vscode", "app", "query", "tmp", "cmd",
+	".vscode", "app", "query", "tmp", "cmd", ".git", ".go", ".claude",
+	".cunzhi-memory", ".cursor", ".github", ".idea",
+	".vscode", ".pnpm-store",
 }
 
 // Regular expression to match import statements for translation package

+ 1 - 1
internal/notification/external.go

@@ -39,7 +39,7 @@ type ExternalMessage struct {
 
 func (n *ExternalMessage) Send() {
 	en := query.ExternalNotify
-	externalNotifies, err := en.Find()
+	externalNotifies, err := en.Where(en.Enabled.Is(true)).Find()
 	if err != nil {
 		logger.Error(err)
 		return

+ 79 - 0
internal/notification/wecom.go

@@ -0,0 +1,79 @@
+package notification
+
+import (
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	"github.com/0xJacky/Nginx-UI/model"
+	"github.com/uozi-tech/cosy/map2struct"
+)
+
+// @external_notifier(WeCom)
+type WeCom struct {
+	WebhookURL string `json:"webhook_url" title:"Webhook URL"`
+}
+
+type wecomMessage struct {
+	MsgType string `json:"msgtype"`
+	Text    struct {
+		Content string `json:"content"`
+	} `json:"text"`
+}
+
+func init() {
+	RegisterExternalNotifier("wecom", func(ctx context.Context, n *model.ExternalNotify, msg *ExternalMessage) error {
+		wecomConfig := &WeCom{}
+		err := map2struct.WeakDecode(n.Config, wecomConfig)
+		if err != nil {
+			return err
+		}
+		if wecomConfig.WebhookURL == "" {
+			return ErrInvalidNotifierConfig
+		}
+
+		// Create message payload
+		message := wecomMessage{
+			MsgType: "text",
+		}
+		
+		title := msg.GetTitle(n.Language)
+		content := msg.GetContent(n.Language)
+		
+		// Combine title and content
+		fullMessage := title
+		if content != "" {
+			fullMessage = fmt.Sprintf("%s\n\n%s", title, content)
+		}
+		
+		message.Text.Content = fullMessage
+
+		// Marshal to JSON
+		payload, err := json.Marshal(message)
+		if err != nil {
+			return err
+		}
+
+		// Send HTTP POST request
+		req, err := http.NewRequestWithContext(ctx, "POST", wecomConfig.WebhookURL, bytes.NewBuffer(payload))
+		if err != nil {
+			return err
+		}
+		req.Header.Set("Content-Type", "application/json")
+
+		client := &http.Client{}
+		resp, err := client.Do(req)
+		if err != nil {
+			return err
+		}
+		defer resp.Body.Close()
+
+		if resp.StatusCode != http.StatusOK {
+			return fmt.Errorf("weCom webhook returned status code: %d", resp.StatusCode)
+		}
+
+		return nil
+	})
+}

+ 1 - 0
model/external_notify.go

@@ -5,4 +5,5 @@ type ExternalNotify struct {
 	Type     string            `json:"type" cosy:"add:required;update:omitempty" gorm:"index"`
 	Language string            `json:"language" cosy:"add:required;update:omitempty" gorm:"index"`
 	Config   map[string]string `json:"config" cosy:"add:required;update:omitempty" gorm:"serializer:json[aes]"`
+	Enabled  bool              `json:"enabled" cosy:"add:omitempty;update:omitempty" gorm:"default:1"`
 }

+ 5 - 1
query/external_notifies.gen.go

@@ -35,6 +35,7 @@ func newExternalNotify(db *gorm.DB, opts ...gen.DOOption) externalNotify {
 	_externalNotify.Type = field.NewString(tableName, "type")
 	_externalNotify.Language = field.NewString(tableName, "language")
 	_externalNotify.Config = field.NewField(tableName, "config")
+	_externalNotify.Enabled = field.NewBool(tableName, "enabled")
 
 	_externalNotify.fillFieldMap()
 
@@ -52,6 +53,7 @@ type externalNotify struct {
 	Type      field.String
 	Language  field.String
 	Config    field.Field
+	Enabled   field.Bool
 
 	fieldMap map[string]field.Expr
 }
@@ -75,6 +77,7 @@ func (e *externalNotify) updateTableName(table string) *externalNotify {
 	e.Type = field.NewString(table, "type")
 	e.Language = field.NewString(table, "language")
 	e.Config = field.NewField(table, "config")
+	e.Enabled = field.NewBool(table, "enabled")
 
 	e.fillFieldMap()
 
@@ -91,7 +94,7 @@ func (e *externalNotify) GetFieldByName(fieldName string) (field.OrderExpr, bool
 }
 
 func (e *externalNotify) fillFieldMap() {
-	e.fieldMap = make(map[string]field.Expr, 7)
+	e.fieldMap = make(map[string]field.Expr, 8)
 	e.fieldMap["id"] = e.ID
 	e.fieldMap["created_at"] = e.CreatedAt
 	e.fieldMap["updated_at"] = e.UpdatedAt
@@ -99,6 +102,7 @@ func (e *externalNotify) fillFieldMap() {
 	e.fieldMap["type"] = e.Type
 	e.fieldMap["language"] = e.Language
 	e.fieldMap["config"] = e.Config
+	e.fieldMap["enabled"] = e.Enabled
 }
 
 func (e externalNotify) clone(db *gorm.DB) externalNotify {

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików