2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 12:40:25 +08:00

feat: 添加前端翻译

This commit is contained in:
2025-04-13 01:55:19 +08:00
parent 4dc943438e
commit 002104b0eb
13 changed files with 2118 additions and 276 deletions

View File

@@ -68,7 +68,9 @@ msgstr ""
#: src/views/database/ServerList.vue:135 src/views/database/UserList.vue:152
#: src/views/file/ListTable.vue:185 src/views/file/SearchModal.vue:48
#: src/views/firewall/ForwardView.vue:80 src/views/firewall/IpRuleView.vue:122
#: src/views/firewall/RuleView.vue:159 src/views/website/IndexView.vue:95
#: src/views/firewall/RuleView.vue:159 src/views/task/CronView.vue:103
#: src/views/task/SystemView.vue:96 src/views/task/TaskView.vue:55
#: src/views/website/IndexView.vue:95
msgid "Actions"
msgstr ""
@@ -158,14 +160,15 @@ msgstr ""
#: src/views/file/ToolBar.vue:282 src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:143 src/views/ssh/CreateModal.vue:98
#: src/views/ssh/UpdateModal.vue:104
#: src/views/ssh/UpdateModal.vue:104 src/views/task/CreateModal.vue:159
#: src/views/website/ProxyBuilderModal.vue:189
msgid "Submit"
msgstr ""
#: src/views/backup/IndexView.vue:37 src/views/backup/ListView.vue:217
#: src/views/backup/ListView.vue:250 src/views/cert/CertView.vue:464
#: src/views/cert/CertView.vue:527 src/views/cert/CreateCertModal.vue:86
#: src/views/dashboard/IndexView.vue:418
#: src/views/dashboard/IndexView.vue:418 src/views/task/CreateModal.vue:130
msgid "Website"
msgstr ""
@@ -205,6 +208,7 @@ msgstr ""
#: src/views/file/SearchModal.vue:98 src/views/file/ToolBar.vue:238
#: src/views/firewall/ForwardView.vue:105 src/views/firewall/IpRuleView.vue:147
#: src/views/firewall/RuleView.vue:184 src/views/ssh/IndexView.vue:93
#: src/views/task/CronView.vue:157 src/views/task/TaskView.vue:99
#: src/views/website/IndexView.vue:169
msgid "Delete"
msgstr ""
@@ -220,7 +224,7 @@ msgstr ""
#: src/views/database/CreateUserModal.vue:28 src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84 src/views/ssh/CreateModal.vue:38
#: src/views/website/IndexView.vue:309
#: src/views/task/CreateModal.vue:51 src/views/website/IndexView.vue:309
#, fuzzy
msgid "Created successfully"
msgstr "Saved successfully"
@@ -241,7 +245,8 @@ msgstr "Saved successfully"
#: src/views/firewall/ForwardView.vue:132
#: src/views/firewall/ForwardView.vue:150 src/views/firewall/IpRuleView.vue:174
#: src/views/firewall/IpRuleView.vue:192 src/views/firewall/RuleView.vue:211
#: src/views/firewall/RuleView.vue:229 src/views/website/IndexView.vue:270
#: src/views/firewall/RuleView.vue:229 src/views/task/CronView.vue:200
#: src/views/task/TaskView.vue:125 src/views/website/IndexView.vue:270
#: src/views/website/IndexView.vue:324
#, fuzzy
msgid "Deleted successfully"
@@ -261,7 +266,8 @@ msgstr ""
#: src/views/backup/ListView.vue:220
#: src/views/database/CreateDatabaseModal.vue:70
#: src/views/database/DatabaseList.vue:35 src/views/website/IndexView.vue:468
#: src/views/database/DatabaseList.vue:35 src/views/task/CreateModal.vue:146
#: src/views/task/CreateModal.vue:148 src/views/website/IndexView.vue:468
#: src/views/website/IndexView.vue:473
msgid "Database Name"
msgstr ""
@@ -273,7 +279,8 @@ msgstr ""
msgid "Enter database name"
msgstr ""
#: src/views/backup/ListView.vue:228
#: src/views/backup/ListView.vue:228 src/views/task/CreateModal.vue:150
#: src/views/task/CreateModal.vue:151
msgid "Save Directory"
msgstr ""
@@ -390,7 +397,7 @@ msgstr ""
#: src/views/cert/CertView.vue:64 src/views/cert/CertView.vue:448
#: src/views/cert/CreateCertModal.vue:70 src/views/cert/ObtainModal.vue:53
#: src/views/website/IndexView.vue:412
#: src/views/website/EditView.vue:228 src/views/website/IndexView.vue:412
msgid "Domain"
msgstr ""
@@ -422,7 +429,7 @@ msgstr ""
msgid "Associated Account"
msgstr ""
#: src/views/cert/CertView.vue:130
#: src/views/cert/CertView.vue:130 src/views/website/EditView.vue:297
msgid "Issuer"
msgstr ""
@@ -443,7 +450,7 @@ msgid "Deploy"
msgstr ""
#: src/views/cert/CertView.vue:233 src/views/cert/ObtainModal.vue:24
#: src/views/cert/ObtainModal.vue:77
#: src/views/cert/ObtainModal.vue:77 src/views/website/EditView.vue:133
msgid "Please wait..."
msgstr ""
@@ -505,11 +512,12 @@ msgstr ""
#: src/views/cert/CertView.vue:488 src/views/cert/CertView.vue:551
#: src/views/cert/route.ts:19 src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingHttps.vue:39
#: src/views/setting/SettingHttps.vue:39 src/views/website/EditView.vue:342
msgid "Certificate"
msgstr "Certificate"
#: src/views/cert/CertView.vue:492 src/views/cert/UploadCertModal.vue:42
#: src/views/website/EditView.vue:346
msgid "Enter the content of the PEM certificate file"
msgstr ""
@@ -517,10 +525,12 @@ msgstr ""
#: src/views/cert/UploadCertModal.vue:46 src/views/setting/SettingHttps.vue:46
#: src/views/ssh/CreateModal.vue:78 src/views/ssh/CreateModal.vue:89
#: src/views/ssh/UpdateModal.vue:84 src/views/ssh/UpdateModal.vue:95
#: src/views/website/EditView.vue:350
msgid "Private Key"
msgstr "Private Key"
#: src/views/cert/CertView.vue:500 src/views/cert/UploadCertModal.vue:50
#: src/views/website/EditView.vue:354
msgid "Enter the content of the KEY private key file"
msgstr ""
@@ -786,6 +796,7 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:55 src/views/file/ListTable.vue:99
#: src/views/file/SearchModal.vue:20 src/views/file/ToolBar.vue:257
#: src/views/ssh/CreateModal.vue:57 src/views/ssh/UpdateModal.vue:63
#: src/views/task/SystemView.vue:18
msgid "Name"
msgstr ""
@@ -797,19 +808,21 @@ msgstr ""
#: src/views/container/ComposeView.vue:58
#: src/views/container/ContainerView.vue:32
#: src/views/database/ServerList.vue:114 src/views/database/UserList.vue:131
#: src/views/firewall/RuleView.vue:62
#: src/views/firewall/RuleView.vue:62 src/views/task/SystemView.vue:43
#: src/views/task/TaskView.vue:22
msgid "Status"
msgstr ""
#: src/views/container/ComposeView.vue:65 src/views/container/ImageView.vue:60
#: src/views/container/NetworkView.vue:100
#: src/views/container/VolumeView.vue:54
#: src/views/container/VolumeView.vue:54 src/views/task/CronView.vue:84
#: src/views/task/TaskView.vue:37
msgid "Creation Time"
msgstr ""
#: src/views/container/ComposeView.vue:97 src/views/file/ListTable.vue:64
#: src/views/file/ListTable.vue:216 src/views/ssh/IndexView.vue:71
#: src/views/website/IndexView.vue:111
#: src/views/task/CronView.vue:135 src/views/website/IndexView.vue:111
msgid "Edit"
msgstr ""
@@ -1023,6 +1036,7 @@ msgstr ""
#: src/views/container/ContainerCreate.vue:291
#: src/views/dashboard/IndexView.vue:530 src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216 src/views/monitor/IndexView.vue:238
#: src/views/task/SystemView.vue:78
msgid "Memory"
msgstr ""
@@ -1082,7 +1096,8 @@ msgid "Running Status"
msgstr ""
#: src/views/container/ContainerView.vue:103
#: src/views/container/ContainerView.vue:439
#: src/views/container/ContainerView.vue:439 src/views/task/CronView.vue:122
#: src/views/task/TaskView.vue:75
msgid "Logs"
msgstr ""
@@ -1201,6 +1216,7 @@ msgstr ""
#: src/views/container/ImageView.vue:85 src/views/container/NetworkView.vue:125
#: src/views/container/VolumeView.vue:79 src/views/firewall/ForwardView.vue:94
#: src/views/firewall/IpRuleView.vue:136 src/views/firewall/RuleView.vue:173
#: src/views/task/TaskView.vue:88
msgid "Are you sure you want to delete?"
msgstr ""
@@ -1409,7 +1425,7 @@ msgstr "Saved successfully"
msgid "Current version is the latest"
msgstr ""
#: src/views/dashboard/IndexView.vue:431
#: src/views/dashboard/IndexView.vue:431 src/views/task/IndexView.vue:29
msgid "Scheduled Tasks"
msgstr ""
@@ -1830,12 +1846,13 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:21
#: src/views/database/UpdateUserModal.vue:18
#: src/views/database/UserList.vue:223 src/views/file/PermissionModal.vue:29
#: src/views/task/CronView.vue:182 src/views/task/CronView.vue:209
#: src/views/website/IndexView.vue:253 src/views/website/IndexView.vue:279
#, fuzzy
msgid "Modified successfully"
msgstr "Saved successfully"
#: src/views/database/IndexView.vue:48
#: src/views/database/IndexView.vue:48 src/views/task/SystemView.vue:37
msgid "User"
msgstr ""
@@ -1949,6 +1966,7 @@ msgstr ""
#: src/views/file/EditModal.vue:31 src/views/file/ListTable.vue:703
#: src/views/setting/SettingBase.vue:95 src/views/setting/SettingHttps.vue:56
#: src/views/website/EditView.vue:211
msgid "Save"
msgstr "Save"
@@ -2455,7 +2473,7 @@ msgstr "Saved successfully"
msgid "Clear Monitoring Records"
msgstr ""
#: src/views/monitor/IndexView.vue:449
#: src/views/monitor/IndexView.vue:449 src/views/website/EditView.vue:220
msgid "Are you sure you want to clear?"
msgstr ""
@@ -2489,6 +2507,7 @@ msgid "Panel Settings"
msgstr ""
#: src/views/setting/SettingBase.vue:35 src/views/setting/SettingHttps.vue:27
#: src/views/website/EditView.vue:115
msgid "Saved successfully"
msgstr "Saved successfully"
@@ -2604,14 +2623,345 @@ msgstr "Saved successfully"
msgid "Update Host"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
#: src/views/task/CreateModal.vue:22
msgid "# Enter your script content here"
msgstr ""
#: src/views/task/CreateModal.vue:89
#, fuzzy
msgid "Create Scheduled Task"
msgstr "Certificate"
#: src/views/task/CreateModal.vue:96 src/views/task/CronView.vue:36
msgid "Task Type"
msgstr ""
#: src/views/task/CreateModal.vue:100 src/views/task/CronView.vue:49
msgid "Run Script"
msgstr ""
#: src/views/task/CreateModal.vue:101 src/views/task/CronView.vue:51
msgid "Backup Data"
msgstr ""
#: src/views/task/CreateModal.vue:102 src/views/task/CronView.vue:52
msgid "Log Rotation"
msgstr ""
#: src/views/task/CreateModal.vue:107 src/views/task/CreateModal.vue:108
#: src/views/task/CronView.vue:29 src/views/task/CronView.vue:259
#: src/views/task/CronView.vue:260 src/views/task/TaskView.vue:15
msgid "Task Name"
msgstr ""
#: src/views/task/CreateModal.vue:110 src/views/task/CronView.vue:74
#: src/views/task/CronView.vue:262
msgid "Task Schedule"
msgstr ""
#: src/views/task/CreateModal.vue:114
msgid "Script Content"
msgstr ""
#: src/views/task/CreateModal.vue:128
msgid "Backup Type"
msgstr ""
#: src/views/task/CreateModal.vue:131
msgid "MySQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:132
msgid "PostgreSQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:140 src/views/task/CreateModal.vue:142
#, fuzzy
msgid "Select Website"
msgstr "Certificate"
#: src/views/task/CreateModal.vue:153
msgid "Retention Count"
msgstr ""
#: src/views/task/CronView.vue:59
msgid "Enabled"
msgstr ""
#: src/views/task/CronView.vue:94
msgid "Last Update Time"
msgstr ""
#: src/views/task/CronView.vue:146
msgid "Are you sure you want to delete this task?"
msgstr ""
#: src/views/task/CronView.vue:251
msgid "Edit Task"
msgstr ""
#: src/views/task/IndexView.vue:25
#, fuzzy
msgid "Create Task"
msgstr "Certificate"
#: src/views/task/IndexView.vue:32
msgid "System Processes"
msgstr ""
#: src/views/task/IndexView.vue:35
#, fuzzy
msgid "Panel Tasks"
msgstr "Panel HTTPS"
#: src/views/task/route.ts:19
msgid "Background Tasks"
msgstr ""
#: src/views/task/SystemView.vue:25
msgid "Parent PID"
msgstr ""
#: src/views/task/SystemView.vue:31
msgid "Threads"
msgstr ""
#: src/views/task/SystemView.vue:50 src/views/task/TaskView.vue:33
#: src/views/website/IndexView.vue:30
msgid "Running"
msgstr ""
#: src/views/task/SystemView.vue:52
msgid "Sleeping"
msgstr ""
#: src/views/task/SystemView.vue:54
msgid "Stopped"
msgstr ""
#: src/views/task/SystemView.vue:56
msgid "Idle"
msgstr ""
#: src/views/task/SystemView.vue:58
msgid "Zombie"
msgstr ""
#: src/views/task/SystemView.vue:60 src/views/task/TaskView.vue:30
msgid "Waiting"
msgstr ""
#: src/views/task/SystemView.vue:62
msgid "Locked"
msgstr ""
#: src/views/task/SystemView.vue:87
msgid "Start Time"
msgstr ""
#: src/views/task/SystemView.vue:108
msgid "Process %{ pid } has been terminated"
msgstr ""
#: src/views/task/SystemView.vue:114
msgid "Are you sure you want to terminate process %{ pid }?"
msgstr ""
#: src/views/task/SystemView.vue:124
msgid "Terminate"
msgstr ""
#: src/views/task/TaskView.vue:28
msgid "Completed"
msgstr ""
#: src/views/task/TaskView.vue:32
msgid "Failed"
msgstr ""
#: src/views/task/TaskView.vue:46
msgid "Completion Time"
msgstr ""
#: src/views/task/TaskView.vue:136
msgid "If logs cannot be loaded, please disable ad blockers!"
msgstr ""
#: src/views/website/EditView.vue:54 src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/EditView.vue:83
#, fuzzy
msgid "Edit Website - %{ name }"
msgstr "Certificate"
#: src/views/website/EditView.vue:85 src/views/website/route.ts:31
#, fuzzy
msgid "Edit Website"
msgstr "Certificate"
#: src/views/website/EditView.vue:122
#, fuzzy
msgid "Reset successfully"
msgstr "Saved successfully"
#: src/views/website/EditView.vue:139
#, fuzzy
msgid "Issued successfully"
msgstr "Saved successfully"
#: src/views/website/EditView.vue:153
msgid "The selected certificate is invalid"
msgstr ""
#: src/views/website/EditView.vue:160
#, fuzzy
msgid "Cleared successfully"
msgstr "Saved successfully"
#: src/views/website/EditView.vue:178
msgid ""
"If you modify the original text, other modifications will not take effect "
"after clicking save!"
msgstr ""
#: src/views/website/EditView.vue:184
msgid "Reset Configuration"
msgstr ""
#: src/views/website/EditView.vue:187
msgid "Are you sure you want to reset the configuration?"
msgstr ""
#: src/views/website/EditView.vue:196
#: src/views/website/ProxyBuilderModal.vue:121
msgid "Generate Reverse Proxy Configuration"
msgstr ""
#: src/views/website/EditView.vue:207
msgid "One-click Certificate Issuance"
msgstr ""
#: src/views/website/EditView.vue:217
msgid "Clear Logs"
msgstr ""
#: src/views/website/EditView.vue:226
msgid "Domain & Listening"
msgstr ""
#: src/views/website/EditView.vue:236
msgid "Listening Address"
msgstr ""
#: src/views/website/EditView.vue:254
msgid "Basic Settings"
msgstr ""
#: src/views/website/EditView.vue:256
msgid "Website Directory"
msgstr ""
#: src/views/website/EditView.vue:257
msgid "Enter website directory (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:259
msgid "Running Directory"
msgstr ""
#: src/views/website/EditView.vue:262
msgid "Enter running directory (needed for Laravel etc.) (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:265
msgid "Default Document"
msgstr ""
#: src/views/website/EditView.vue:268 src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/EditView.vue:273 src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/EditView.vue:278
msgid "Anti-XSS Attack (PHP)"
msgstr ""
#: src/views/website/EditView.vue:287
#, fuzzy
msgid "Certificate Information"
msgstr "Certificate"
#: src/views/website/EditView.vue:289
#, fuzzy
msgid "Certificate Validity"
msgstr "Certificate"
#: src/views/website/EditView.vue:303
msgid "Domains"
msgstr ""
#: src/views/website/EditView.vue:318
msgid "Main Switch"
msgstr ""
#: src/views/website/EditView.vue:321
#, fuzzy
msgid "Use Existing Certificate"
msgstr "Certificate"
#: src/views/website/EditView.vue:334
msgid "HTTP Redirect"
msgstr ""
#: src/views/website/EditView.vue:337
msgid "OCSP Stapling"
msgstr ""
#: src/views/website/EditView.vue:362
msgid "Rewrite"
msgstr ""
#: src/views/website/EditView.vue:365
msgid "Presets"
msgstr ""
#: src/views/website/EditView.vue:388
msgid "Configuration"
msgstr ""
#: src/views/website/EditView.vue:391
msgid ""
"If you do not understand the configuration rules, please do not modify them "
"arbitrarily, otherwise it may cause the website to be inaccessible or panel "
"function abnormalities! If you have already encountered a problem, try "
"resetting the configuration!"
msgstr ""
#: src/views/website/EditView.vue:407
msgid "Access Log"
msgstr ""
#: src/views/website/EditView.vue:411 src/views/website/EditView.vue:423
msgid "All logs can be viewed by downloading the file"
msgstr ""
#: src/views/website/EditView.vue:413 src/views/website/EditView.vue:425
msgid "view"
msgstr ""
#: src/views/website/EditView.vue:419
msgid "Error Log"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
msgstr ""
#: src/views/website/IndexView.vue:78 src/views/website/IndexView.vue:516
#: src/views/website/IndexView.vue:521
msgid "Remark"
@@ -2629,10 +2979,6 @@ msgstr ""
msgid "Delete local database with the same name"
msgstr ""
#: src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/IndexView.vue:240
msgid "Already %{ status }"
msgstr ""
@@ -2670,14 +3016,6 @@ msgid ""
"setting"
msgstr ""
#: src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:451
msgid "Select Database"
msgstr ""
@@ -2707,3 +3045,125 @@ msgstr ""
#: src/views/website/IndexView.vue:554
msgid "Stop Page"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:23
msgid "Disabled buffer and enabled cache cannot be used simultaneously"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:27
msgid "Matching expression cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:31
msgid "Proxy address cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:35
msgid "Exact match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:42
msgid "Prefix match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:48
msgid "Proxy address format error"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:100
#, fuzzy
msgid "Configuration generated successfully"
msgstr "Saved successfully"
#: src/views/website/ProxyBuilderModal.vue:128
msgid ""
"After generating the reverse proxy configuration, the original rewrite rules "
"will be overwritten."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:130
msgid ""
"If you need to proxy static resources like JS/CSS, please remove the static "
"log recording part from the original configuration."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:133
msgid "Auto Refresh Resolution"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:136
msgid "Enable SNI"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:139
msgid "Enable Cache"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:142
msgid "Disable Buffer"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:147
msgid "Match Type"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:151
msgid "Exact Match (=)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:152
msgid "Priority Prefix Match (^~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:153
msgid "Normal Prefix Match ( )"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:154
msgid "Case Sensitive Regex Match (~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:155
msgid "Case Insensitive Regex Match (~*)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:159
msgid "Match Expression"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:162
msgid "Proxy Address"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:165
msgid "Send Domain"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:168
msgid "Cache Time"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:174
msgid "Cache time (minutes)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:176
msgid "minutes"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:179
msgid "Content Replacement"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:184
msgid "Target content"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:185
msgid "Replacement content"
msgstr ""
#: src/views/website/route.ts:19
#, fuzzy
msgid "Websites"
msgstr "Certificate"

View File

@@ -69,6 +69,9 @@ msgstr ""
#: src/views/firewall/ForwardView.vue:80
#: src/views/firewall/IpRuleView.vue:122
#: src/views/firewall/RuleView.vue:159
#: src/views/task/CronView.vue:103
#: src/views/task/SystemView.vue:96
#: src/views/task/TaskView.vue:55
#: src/views/website/IndexView.vue:95
msgid "Actions"
msgstr ""
@@ -164,6 +167,8 @@ msgstr ""
#: src/views/firewall/CreateModal.vue:143
#: src/views/ssh/CreateModal.vue:98
#: src/views/ssh/UpdateModal.vue:104
#: src/views/task/CreateModal.vue:159
#: src/views/website/ProxyBuilderModal.vue:189
msgid "Submit"
msgstr ""
@@ -174,6 +179,7 @@ msgstr ""
#: src/views/cert/CertView.vue:527
#: src/views/cert/CreateCertModal.vue:86
#: src/views/dashboard/IndexView.vue:418
#: src/views/task/CreateModal.vue:130
msgid "Website"
msgstr ""
@@ -225,6 +231,8 @@ msgstr ""
#: src/views/firewall/IpRuleView.vue:147
#: src/views/firewall/RuleView.vue:184
#: src/views/ssh/IndexView.vue:93
#: src/views/task/CronView.vue:157
#: src/views/task/TaskView.vue:99
#: src/views/website/IndexView.vue:169
msgid "Delete"
msgstr ""
@@ -244,6 +252,7 @@ msgstr ""
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84
#: src/views/ssh/CreateModal.vue:38
#: src/views/task/CreateModal.vue:51
#: src/views/website/IndexView.vue:309
msgid "Created successfully"
msgstr ""
@@ -270,6 +279,8 @@ msgstr ""
#: src/views/firewall/IpRuleView.vue:192
#: src/views/firewall/RuleView.vue:211
#: src/views/firewall/RuleView.vue:229
#: src/views/task/CronView.vue:200
#: src/views/task/TaskView.vue:125
#: src/views/website/IndexView.vue:270
#: src/views/website/IndexView.vue:324
msgid "Deleted successfully"
@@ -293,6 +304,8 @@ msgstr ""
#: src/views/backup/ListView.vue:220
#: src/views/database/CreateDatabaseModal.vue:70
#: src/views/database/DatabaseList.vue:35
#: src/views/task/CreateModal.vue:146
#: src/views/task/CreateModal.vue:148
#: src/views/website/IndexView.vue:468
#: src/views/website/IndexView.vue:473
msgid "Database Name"
@@ -306,6 +319,8 @@ msgid "Enter database name"
msgstr ""
#: src/views/backup/ListView.vue:228
#: src/views/task/CreateModal.vue:150
#: src/views/task/CreateModal.vue:151
msgid "Save Directory"
msgstr ""
@@ -437,6 +452,7 @@ msgstr ""
#: src/views/cert/CertView.vue:448
#: src/views/cert/CreateCertModal.vue:70
#: src/views/cert/ObtainModal.vue:53
#: src/views/website/EditView.vue:228
#: src/views/website/IndexView.vue:412
msgid "Domain"
msgstr ""
@@ -479,6 +495,7 @@ msgid "Associated Account"
msgstr ""
#: src/views/cert/CertView.vue:130
#: src/views/website/EditView.vue:297
msgid "Issuer"
msgstr ""
@@ -502,6 +519,7 @@ msgstr ""
#: src/views/cert/CertView.vue:233
#: src/views/cert/ObtainModal.vue:24
#: src/views/cert/ObtainModal.vue:77
#: src/views/website/EditView.vue:133
msgid "Please wait..."
msgstr ""
@@ -565,11 +583,13 @@ msgstr ""
#: src/views/cert/route.ts:19
#: src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingHttps.vue:39
#: src/views/website/EditView.vue:342
msgid "Certificate"
msgstr ""
#: src/views/cert/CertView.vue:492
#: src/views/cert/UploadCertModal.vue:42
#: src/views/website/EditView.vue:346
msgid "Enter the content of the PEM certificate file"
msgstr ""
@@ -581,11 +601,13 @@ msgstr ""
#: src/views/ssh/CreateModal.vue:89
#: src/views/ssh/UpdateModal.vue:84
#: src/views/ssh/UpdateModal.vue:95
#: src/views/website/EditView.vue:350
msgid "Private Key"
msgstr ""
#: src/views/cert/CertView.vue:500
#: src/views/cert/UploadCertModal.vue:50
#: src/views/website/EditView.vue:354
msgid "Enter the content of the KEY private key file"
msgstr ""
@@ -869,6 +891,7 @@ msgstr ""
#: src/views/file/ToolBar.vue:257
#: src/views/ssh/CreateModal.vue:57
#: src/views/ssh/UpdateModal.vue:63
#: src/views/task/SystemView.vue:18
msgid "Name"
msgstr ""
@@ -883,6 +906,8 @@ msgstr ""
#: src/views/database/ServerList.vue:114
#: src/views/database/UserList.vue:131
#: src/views/firewall/RuleView.vue:62
#: src/views/task/SystemView.vue:43
#: src/views/task/TaskView.vue:22
msgid "Status"
msgstr ""
@@ -890,6 +915,8 @@ msgstr ""
#: src/views/container/ImageView.vue:60
#: src/views/container/NetworkView.vue:100
#: src/views/container/VolumeView.vue:54
#: src/views/task/CronView.vue:84
#: src/views/task/TaskView.vue:37
msgid "Creation Time"
msgstr ""
@@ -897,6 +924,7 @@ msgstr ""
#: src/views/file/ListTable.vue:64
#: src/views/file/ListTable.vue:216
#: src/views/ssh/IndexView.vue:71
#: src/views/task/CronView.vue:135
#: src/views/website/IndexView.vue:111
msgid "Edit"
msgstr ""
@@ -1114,6 +1142,7 @@ msgstr ""
#: src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216
#: src/views/monitor/IndexView.vue:238
#: src/views/task/SystemView.vue:78
msgid "Memory"
msgstr ""
@@ -1174,6 +1203,8 @@ msgstr ""
#: src/views/container/ContainerView.vue:103
#: src/views/container/ContainerView.vue:439
#: src/views/task/CronView.vue:122
#: src/views/task/TaskView.vue:75
msgid "Logs"
msgstr ""
@@ -1292,6 +1323,7 @@ msgstr ""
#: src/views/firewall/ForwardView.vue:94
#: src/views/firewall/IpRuleView.vue:136
#: src/views/firewall/RuleView.vue:173
#: src/views/task/TaskView.vue:88
msgid "Are you sure you want to delete?"
msgstr ""
@@ -1509,6 +1541,7 @@ msgid "Current version is the latest"
msgstr ""
#: src/views/dashboard/IndexView.vue:431
#: src/views/task/IndexView.vue:29
msgid "Scheduled Tasks"
msgstr ""
@@ -1948,12 +1981,15 @@ msgstr ""
#: src/views/database/UpdateUserModal.vue:18
#: src/views/database/UserList.vue:223
#: src/views/file/PermissionModal.vue:29
#: src/views/task/CronView.vue:182
#: src/views/task/CronView.vue:209
#: src/views/website/IndexView.vue:253
#: src/views/website/IndexView.vue:279
msgid "Modified successfully"
msgstr ""
#: src/views/database/IndexView.vue:48
#: src/views/task/SystemView.vue:37
msgid "User"
msgstr ""
@@ -2070,6 +2106,7 @@ msgstr ""
#: src/views/file/ListTable.vue:703
#: src/views/setting/SettingBase.vue:95
#: src/views/setting/SettingHttps.vue:56
#: src/views/website/EditView.vue:211
msgid "Save"
msgstr ""
@@ -2629,6 +2666,7 @@ msgid "Clear Monitoring Records"
msgstr ""
#: src/views/monitor/IndexView.vue:449
#: src/views/website/EditView.vue:220
msgid "Are you sure you want to clear?"
msgstr ""
@@ -2662,6 +2700,7 @@ msgstr ""
#: src/views/setting/SettingBase.vue:35
#: src/views/setting/SettingHttps.vue:27
#: src/views/website/EditView.vue:115
msgid "Saved successfully"
msgstr ""
@@ -2775,15 +2814,345 @@ msgstr ""
msgid "Update Host"
msgstr ""
#: src/views/task/CreateModal.vue:22
msgid "# Enter your script content here"
msgstr ""
#: src/views/task/CreateModal.vue:89
msgid "Create Scheduled Task"
msgstr ""
#: src/views/task/CreateModal.vue:96
#: src/views/task/CronView.vue:36
msgid "Task Type"
msgstr ""
#: src/views/task/CreateModal.vue:100
#: src/views/task/CronView.vue:49
msgid "Run Script"
msgstr ""
#: src/views/task/CreateModal.vue:101
#: src/views/task/CronView.vue:51
msgid "Backup Data"
msgstr ""
#: src/views/task/CreateModal.vue:102
#: src/views/task/CronView.vue:52
msgid "Log Rotation"
msgstr ""
#: src/views/task/CreateModal.vue:107
#: src/views/task/CreateModal.vue:108
#: src/views/task/CronView.vue:29
#: src/views/task/CronView.vue:259
#: src/views/task/CronView.vue:260
#: src/views/task/TaskView.vue:15
msgid "Task Name"
msgstr ""
#: src/views/task/CreateModal.vue:110
#: src/views/task/CronView.vue:74
#: src/views/task/CronView.vue:262
msgid "Task Schedule"
msgstr ""
#: src/views/task/CreateModal.vue:114
msgid "Script Content"
msgstr ""
#: src/views/task/CreateModal.vue:128
msgid "Backup Type"
msgstr ""
#: src/views/task/CreateModal.vue:131
msgid "MySQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:132
msgid "PostgreSQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:140
#: src/views/task/CreateModal.vue:142
msgid "Select Website"
msgstr ""
#: src/views/task/CreateModal.vue:153
msgid "Retention Count"
msgstr ""
#: src/views/task/CronView.vue:59
msgid "Enabled"
msgstr ""
#: src/views/task/CronView.vue:94
msgid "Last Update Time"
msgstr ""
#: src/views/task/CronView.vue:146
msgid "Are you sure you want to delete this task?"
msgstr ""
#: src/views/task/CronView.vue:251
msgid "Edit Task"
msgstr ""
#: src/views/task/IndexView.vue:25
msgid "Create Task"
msgstr ""
#: src/views/task/IndexView.vue:32
msgid "System Processes"
msgstr ""
#: src/views/task/IndexView.vue:35
msgid "Panel Tasks"
msgstr ""
#: src/views/task/route.ts:19
msgid "Background Tasks"
msgstr ""
#: src/views/task/SystemView.vue:25
msgid "Parent PID"
msgstr ""
#: src/views/task/SystemView.vue:31
msgid "Threads"
msgstr ""
#: src/views/task/SystemView.vue:50
#: src/views/task/TaskView.vue:33
#: src/views/website/IndexView.vue:30
msgid "Running"
msgstr ""
#: src/views/task/SystemView.vue:52
msgid "Sleeping"
msgstr ""
#: src/views/task/SystemView.vue:54
msgid "Stopped"
msgstr ""
#: src/views/task/SystemView.vue:56
msgid "Idle"
msgstr ""
#: src/views/task/SystemView.vue:58
msgid "Zombie"
msgstr ""
#: src/views/task/SystemView.vue:60
#: src/views/task/TaskView.vue:30
msgid "Waiting"
msgstr ""
#: src/views/task/SystemView.vue:62
msgid "Locked"
msgstr ""
#: src/views/task/SystemView.vue:87
msgid "Start Time"
msgstr ""
#: src/views/task/SystemView.vue:108
msgid "Process %{ pid } has been terminated"
msgstr ""
#: src/views/task/SystemView.vue:114
msgid "Are you sure you want to terminate process %{ pid }?"
msgstr ""
#: src/views/task/SystemView.vue:124
msgid "Terminate"
msgstr ""
#: src/views/task/TaskView.vue:28
msgid "Completed"
msgstr ""
#: src/views/task/TaskView.vue:32
msgid "Failed"
msgstr ""
#: src/views/task/TaskView.vue:46
msgid "Completion Time"
msgstr ""
#: src/views/task/TaskView.vue:136
msgid "If logs cannot be loaded, please disable ad blockers!"
msgstr ""
#: src/views/website/EditView.vue:54
#: src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/EditView.vue:83
msgid "Edit Website - %{ name }"
msgstr ""
#: src/views/website/EditView.vue:85
#: src/views/website/route.ts:31
msgid "Edit Website"
msgstr ""
#: src/views/website/EditView.vue:122
msgid "Reset successfully"
msgstr ""
#: src/views/website/EditView.vue:139
msgid "Issued successfully"
msgstr ""
#: src/views/website/EditView.vue:153
msgid "The selected certificate is invalid"
msgstr ""
#: src/views/website/EditView.vue:160
msgid "Cleared successfully"
msgstr ""
#: src/views/website/EditView.vue:178
msgid "If you modify the original text, other modifications will not take effect after clicking save!"
msgstr ""
#: src/views/website/EditView.vue:184
msgid "Reset Configuration"
msgstr ""
#: src/views/website/EditView.vue:187
msgid "Are you sure you want to reset the configuration?"
msgstr ""
#: src/views/website/EditView.vue:196
#: src/views/website/ProxyBuilderModal.vue:121
msgid "Generate Reverse Proxy Configuration"
msgstr ""
#: src/views/website/EditView.vue:207
msgid "One-click Certificate Issuance"
msgstr ""
#: src/views/website/EditView.vue:217
msgid "Clear Logs"
msgstr ""
#: src/views/website/EditView.vue:226
msgid "Domain & Listening"
msgstr ""
#: src/views/website/EditView.vue:236
msgid "Listening Address"
msgstr ""
#: src/views/website/EditView.vue:254
msgid "Basic Settings"
msgstr ""
#: src/views/website/EditView.vue:256
msgid "Website Directory"
msgstr ""
#: src/views/website/EditView.vue:257
msgid "Enter website directory (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:259
msgid "Running Directory"
msgstr ""
#: src/views/website/EditView.vue:262
msgid "Enter running directory (needed for Laravel etc.) (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:265
msgid "Default Document"
msgstr ""
#: src/views/website/EditView.vue:268
#: src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/EditView.vue:273
#: src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/EditView.vue:278
msgid "Anti-XSS Attack (PHP)"
msgstr ""
#: src/views/website/EditView.vue:287
msgid "Certificate Information"
msgstr ""
#: src/views/website/EditView.vue:289
msgid "Certificate Validity"
msgstr ""
#: src/views/website/EditView.vue:303
msgid "Domains"
msgstr ""
#: src/views/website/EditView.vue:318
msgid "Main Switch"
msgstr ""
#: src/views/website/EditView.vue:321
msgid "Use Existing Certificate"
msgstr ""
#: src/views/website/EditView.vue:334
msgid "HTTP Redirect"
msgstr ""
#: src/views/website/EditView.vue:337
msgid "OCSP Stapling"
msgstr ""
#: src/views/website/EditView.vue:362
msgid "Rewrite"
msgstr ""
#: src/views/website/EditView.vue:365
msgid "Presets"
msgstr ""
#: src/views/website/EditView.vue:388
msgid "Configuration"
msgstr ""
#: src/views/website/EditView.vue:391
msgid "If you do not understand the configuration rules, please do not modify them arbitrarily, otherwise it may cause the website to be inaccessible or panel function abnormalities! If you have already encountered a problem, try resetting the configuration!"
msgstr ""
#: src/views/website/EditView.vue:407
msgid "Access Log"
msgstr ""
#: src/views/website/EditView.vue:411
#: src/views/website/EditView.vue:423
msgid "All logs can be viewed by downloading the file"
msgstr ""
#: src/views/website/EditView.vue:413
#: src/views/website/EditView.vue:425
msgid "view"
msgstr ""
#: src/views/website/EditView.vue:419
msgid "Error Log"
msgstr ""
#: src/views/website/IndexView.vue:23
#: src/views/website/IndexView.vue:398
msgid "Website Name"
msgstr ""
#: src/views/website/IndexView.vue:30
msgid "Running"
msgstr ""
#: src/views/website/IndexView.vue:78
#: src/views/website/IndexView.vue:516
#: src/views/website/IndexView.vue:521
@@ -2802,10 +3171,6 @@ msgstr ""
msgid "Delete local database with the same name"
msgstr ""
#: src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/IndexView.vue:240
msgid "Already %{ status }"
msgstr ""
@@ -2840,14 +3205,6 @@ msgstr ""
msgid "Recommended to use English for the website name, it cannot be modified after setting"
msgstr ""
#: src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:451
msgid "Select Database"
msgstr ""
@@ -2879,3 +3236,119 @@ msgstr ""
#: src/views/website/IndexView.vue:554
msgid "Stop Page"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:23
msgid "Disabled buffer and enabled cache cannot be used simultaneously"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:27
msgid "Matching expression cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:31
msgid "Proxy address cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:35
msgid "Exact match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:42
msgid "Prefix match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:48
msgid "Proxy address format error"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:100
msgid "Configuration generated successfully"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:128
msgid "After generating the reverse proxy configuration, the original rewrite rules will be overwritten."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:130
msgid "If you need to proxy static resources like JS/CSS, please remove the static log recording part from the original configuration."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:133
msgid "Auto Refresh Resolution"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:136
msgid "Enable SNI"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:139
msgid "Enable Cache"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:142
msgid "Disable Buffer"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:147
msgid "Match Type"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:151
msgid "Exact Match (=)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:152
msgid "Priority Prefix Match (^~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:153
msgid "Normal Prefix Match ( )"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:154
msgid "Case Sensitive Regex Match (~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:155
msgid "Case Insensitive Regex Match (~*)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:159
msgid "Match Expression"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:162
msgid "Proxy Address"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:165
msgid "Send Domain"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:168
msgid "Cache Time"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:174
msgid "Cache time (minutes)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:176
msgid "minutes"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:179
msgid "Content Replacement"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:184
msgid "Target content"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:185
msgid "Replacement content"
msgstr ""
#: src/views/website/route.ts:19
msgid "Websites"
msgstr ""

View File

@@ -67,7 +67,9 @@ msgstr ""
#: src/views/database/ServerList.vue:135 src/views/database/UserList.vue:152
#: src/views/file/ListTable.vue:185 src/views/file/SearchModal.vue:48
#: src/views/firewall/ForwardView.vue:80 src/views/firewall/IpRuleView.vue:122
#: src/views/firewall/RuleView.vue:159 src/views/website/IndexView.vue:95
#: src/views/firewall/RuleView.vue:159 src/views/task/CronView.vue:103
#: src/views/task/SystemView.vue:96 src/views/task/TaskView.vue:55
#: src/views/website/IndexView.vue:95
msgid "Actions"
msgstr ""
@@ -155,14 +157,15 @@ msgstr ""
#: src/views/file/ToolBar.vue:282 src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:143 src/views/ssh/CreateModal.vue:98
#: src/views/ssh/UpdateModal.vue:104
#: src/views/ssh/UpdateModal.vue:104 src/views/task/CreateModal.vue:159
#: src/views/website/ProxyBuilderModal.vue:189
msgid "Submit"
msgstr ""
#: src/views/backup/IndexView.vue:37 src/views/backup/ListView.vue:217
#: src/views/backup/ListView.vue:250 src/views/cert/CertView.vue:464
#: src/views/cert/CertView.vue:527 src/views/cert/CreateCertModal.vue:86
#: src/views/dashboard/IndexView.vue:418
#: src/views/dashboard/IndexView.vue:418 src/views/task/CreateModal.vue:130
msgid "Website"
msgstr ""
@@ -202,6 +205,7 @@ msgstr ""
#: src/views/file/SearchModal.vue:98 src/views/file/ToolBar.vue:238
#: src/views/firewall/ForwardView.vue:105 src/views/firewall/IpRuleView.vue:147
#: src/views/firewall/RuleView.vue:184 src/views/ssh/IndexView.vue:93
#: src/views/task/CronView.vue:157 src/views/task/TaskView.vue:99
#: src/views/website/IndexView.vue:169
msgid "Delete"
msgstr ""
@@ -217,7 +221,7 @@ msgstr ""
#: src/views/database/CreateUserModal.vue:28 src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84 src/views/ssh/CreateModal.vue:38
#: src/views/website/IndexView.vue:309
#: src/views/task/CreateModal.vue:51 src/views/website/IndexView.vue:309
msgid "Created successfully"
msgstr ""
@@ -236,7 +240,8 @@ msgstr ""
#: src/views/firewall/ForwardView.vue:132
#: src/views/firewall/ForwardView.vue:150 src/views/firewall/IpRuleView.vue:174
#: src/views/firewall/IpRuleView.vue:192 src/views/firewall/RuleView.vue:211
#: src/views/firewall/RuleView.vue:229 src/views/website/IndexView.vue:270
#: src/views/firewall/RuleView.vue:229 src/views/task/CronView.vue:200
#: src/views/task/TaskView.vue:125 src/views/website/IndexView.vue:270
#: src/views/website/IndexView.vue:324
msgid "Deleted successfully"
msgstr ""
@@ -255,7 +260,8 @@ msgstr ""
#: src/views/backup/ListView.vue:220
#: src/views/database/CreateDatabaseModal.vue:70
#: src/views/database/DatabaseList.vue:35 src/views/website/IndexView.vue:468
#: src/views/database/DatabaseList.vue:35 src/views/task/CreateModal.vue:146
#: src/views/task/CreateModal.vue:148 src/views/website/IndexView.vue:468
#: src/views/website/IndexView.vue:473
msgid "Database Name"
msgstr ""
@@ -267,7 +273,8 @@ msgstr ""
msgid "Enter database name"
msgstr ""
#: src/views/backup/ListView.vue:228
#: src/views/backup/ListView.vue:228 src/views/task/CreateModal.vue:150
#: src/views/task/CreateModal.vue:151
msgid "Save Directory"
msgstr ""
@@ -382,7 +389,7 @@ msgstr ""
#: src/views/cert/CertView.vue:64 src/views/cert/CertView.vue:448
#: src/views/cert/CreateCertModal.vue:70 src/views/cert/ObtainModal.vue:53
#: src/views/website/IndexView.vue:412
#: src/views/website/EditView.vue:228 src/views/website/IndexView.vue:412
msgid "Domain"
msgstr ""
@@ -414,7 +421,7 @@ msgstr ""
msgid "Associated Account"
msgstr ""
#: src/views/cert/CertView.vue:130
#: src/views/cert/CertView.vue:130 src/views/website/EditView.vue:297
msgid "Issuer"
msgstr ""
@@ -435,7 +442,7 @@ msgid "Deploy"
msgstr ""
#: src/views/cert/CertView.vue:233 src/views/cert/ObtainModal.vue:24
#: src/views/cert/ObtainModal.vue:77
#: src/views/cert/ObtainModal.vue:77 src/views/website/EditView.vue:133
msgid "Please wait..."
msgstr ""
@@ -494,11 +501,12 @@ msgstr ""
#: src/views/cert/CertView.vue:488 src/views/cert/CertView.vue:551
#: src/views/cert/route.ts:19 src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingHttps.vue:39
#: src/views/setting/SettingHttps.vue:39 src/views/website/EditView.vue:342
msgid "Certificate"
msgstr ""
#: src/views/cert/CertView.vue:492 src/views/cert/UploadCertModal.vue:42
#: src/views/website/EditView.vue:346
msgid "Enter the content of the PEM certificate file"
msgstr ""
@@ -506,10 +514,12 @@ msgstr ""
#: src/views/cert/UploadCertModal.vue:46 src/views/setting/SettingHttps.vue:46
#: src/views/ssh/CreateModal.vue:78 src/views/ssh/CreateModal.vue:89
#: src/views/ssh/UpdateModal.vue:84 src/views/ssh/UpdateModal.vue:95
#: src/views/website/EditView.vue:350
msgid "Private Key"
msgstr ""
#: src/views/cert/CertView.vue:500 src/views/cert/UploadCertModal.vue:50
#: src/views/website/EditView.vue:354
msgid "Enter the content of the KEY private key file"
msgstr ""
@@ -768,6 +778,7 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:55 src/views/file/ListTable.vue:99
#: src/views/file/SearchModal.vue:20 src/views/file/ToolBar.vue:257
#: src/views/ssh/CreateModal.vue:57 src/views/ssh/UpdateModal.vue:63
#: src/views/task/SystemView.vue:18
msgid "Name"
msgstr ""
@@ -779,19 +790,21 @@ msgstr ""
#: src/views/container/ComposeView.vue:58
#: src/views/container/ContainerView.vue:32
#: src/views/database/ServerList.vue:114 src/views/database/UserList.vue:131
#: src/views/firewall/RuleView.vue:62
#: src/views/firewall/RuleView.vue:62 src/views/task/SystemView.vue:43
#: src/views/task/TaskView.vue:22
msgid "Status"
msgstr ""
#: src/views/container/ComposeView.vue:65 src/views/container/ImageView.vue:60
#: src/views/container/NetworkView.vue:100
#: src/views/container/VolumeView.vue:54
#: src/views/container/VolumeView.vue:54 src/views/task/CronView.vue:84
#: src/views/task/TaskView.vue:37
msgid "Creation Time"
msgstr ""
#: src/views/container/ComposeView.vue:97 src/views/file/ListTable.vue:64
#: src/views/file/ListTable.vue:216 src/views/ssh/IndexView.vue:71
#: src/views/website/IndexView.vue:111
#: src/views/task/CronView.vue:135 src/views/website/IndexView.vue:111
msgid "Edit"
msgstr ""
@@ -1001,6 +1014,7 @@ msgstr ""
#: src/views/container/ContainerCreate.vue:291
#: src/views/dashboard/IndexView.vue:530 src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216 src/views/monitor/IndexView.vue:238
#: src/views/task/SystemView.vue:78
msgid "Memory"
msgstr ""
@@ -1060,7 +1074,8 @@ msgid "Running Status"
msgstr ""
#: src/views/container/ContainerView.vue:103
#: src/views/container/ContainerView.vue:439
#: src/views/container/ContainerView.vue:439 src/views/task/CronView.vue:122
#: src/views/task/TaskView.vue:75
msgid "Logs"
msgstr ""
@@ -1173,6 +1188,7 @@ msgstr ""
#: src/views/container/ImageView.vue:85 src/views/container/NetworkView.vue:125
#: src/views/container/VolumeView.vue:79 src/views/firewall/ForwardView.vue:94
#: src/views/firewall/IpRuleView.vue:136 src/views/firewall/RuleView.vue:173
#: src/views/task/TaskView.vue:88
msgid "Are you sure you want to delete?"
msgstr ""
@@ -1379,7 +1395,7 @@ msgstr ""
msgid "Current version is the latest"
msgstr ""
#: src/views/dashboard/IndexView.vue:431
#: src/views/dashboard/IndexView.vue:431 src/views/task/IndexView.vue:29
msgid "Scheduled Tasks"
msgstr ""
@@ -1798,11 +1814,12 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:21
#: src/views/database/UpdateUserModal.vue:18
#: src/views/database/UserList.vue:223 src/views/file/PermissionModal.vue:29
#: src/views/task/CronView.vue:182 src/views/task/CronView.vue:209
#: src/views/website/IndexView.vue:253 src/views/website/IndexView.vue:279
msgid "Modified successfully"
msgstr ""
#: src/views/database/IndexView.vue:48
#: src/views/database/IndexView.vue:48 src/views/task/SystemView.vue:37
msgid "User"
msgstr ""
@@ -1911,6 +1928,7 @@ msgstr ""
#: src/views/file/EditModal.vue:31 src/views/file/ListTable.vue:703
#: src/views/setting/SettingBase.vue:95 src/views/setting/SettingHttps.vue:56
#: src/views/website/EditView.vue:211
msgid "Save"
msgstr ""
@@ -2406,7 +2424,7 @@ msgstr ""
msgid "Clear Monitoring Records"
msgstr ""
#: src/views/monitor/IndexView.vue:449
#: src/views/monitor/IndexView.vue:449 src/views/website/EditView.vue:220
msgid "Are you sure you want to clear?"
msgstr ""
@@ -2439,6 +2457,7 @@ msgid "Panel Settings"
msgstr ""
#: src/views/setting/SettingBase.vue:35 src/views/setting/SettingHttps.vue:27
#: src/views/website/EditView.vue:115
msgid "Saved successfully"
msgstr ""
@@ -2551,14 +2570,333 @@ msgstr ""
msgid "Update Host"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
#: src/views/task/CreateModal.vue:22
msgid "# Enter your script content here"
msgstr ""
#: src/views/task/CreateModal.vue:89
msgid "Create Scheduled Task"
msgstr ""
#: src/views/task/CreateModal.vue:96 src/views/task/CronView.vue:36
msgid "Task Type"
msgstr ""
#: src/views/task/CreateModal.vue:100 src/views/task/CronView.vue:49
msgid "Run Script"
msgstr ""
#: src/views/task/CreateModal.vue:101 src/views/task/CronView.vue:51
msgid "Backup Data"
msgstr ""
#: src/views/task/CreateModal.vue:102 src/views/task/CronView.vue:52
msgid "Log Rotation"
msgstr ""
#: src/views/task/CreateModal.vue:107 src/views/task/CreateModal.vue:108
#: src/views/task/CronView.vue:29 src/views/task/CronView.vue:259
#: src/views/task/CronView.vue:260 src/views/task/TaskView.vue:15
msgid "Task Name"
msgstr ""
#: src/views/task/CreateModal.vue:110 src/views/task/CronView.vue:74
#: src/views/task/CronView.vue:262
msgid "Task Schedule"
msgstr ""
#: src/views/task/CreateModal.vue:114
msgid "Script Content"
msgstr ""
#: src/views/task/CreateModal.vue:128
msgid "Backup Type"
msgstr ""
#: src/views/task/CreateModal.vue:131
msgid "MySQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:132
msgid "PostgreSQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:140 src/views/task/CreateModal.vue:142
msgid "Select Website"
msgstr ""
#: src/views/task/CreateModal.vue:153
msgid "Retention Count"
msgstr ""
#: src/views/task/CronView.vue:59
msgid "Enabled"
msgstr ""
#: src/views/task/CronView.vue:94
msgid "Last Update Time"
msgstr ""
#: src/views/task/CronView.vue:146
msgid "Are you sure you want to delete this task?"
msgstr ""
#: src/views/task/CronView.vue:251
msgid "Edit Task"
msgstr ""
#: src/views/task/IndexView.vue:25
msgid "Create Task"
msgstr ""
#: src/views/task/IndexView.vue:32
msgid "System Processes"
msgstr ""
#: src/views/task/IndexView.vue:35
msgid "Panel Tasks"
msgstr ""
#: src/views/task/route.ts:19
msgid "Background Tasks"
msgstr ""
#: src/views/task/SystemView.vue:25
msgid "Parent PID"
msgstr ""
#: src/views/task/SystemView.vue:31
msgid "Threads"
msgstr ""
#: src/views/task/SystemView.vue:50 src/views/task/TaskView.vue:33
#: src/views/website/IndexView.vue:30
msgid "Running"
msgstr ""
#: src/views/task/SystemView.vue:52
msgid "Sleeping"
msgstr ""
#: src/views/task/SystemView.vue:54
msgid "Stopped"
msgstr ""
#: src/views/task/SystemView.vue:56
msgid "Idle"
msgstr ""
#: src/views/task/SystemView.vue:58
msgid "Zombie"
msgstr ""
#: src/views/task/SystemView.vue:60 src/views/task/TaskView.vue:30
msgid "Waiting"
msgstr ""
#: src/views/task/SystemView.vue:62
msgid "Locked"
msgstr ""
#: src/views/task/SystemView.vue:87
msgid "Start Time"
msgstr ""
#: src/views/task/SystemView.vue:108
msgid "Process %{ pid } has been terminated"
msgstr ""
#: src/views/task/SystemView.vue:114
msgid "Are you sure you want to terminate process %{ pid }?"
msgstr ""
#: src/views/task/SystemView.vue:124
msgid "Terminate"
msgstr ""
#: src/views/task/TaskView.vue:28
msgid "Completed"
msgstr ""
#: src/views/task/TaskView.vue:32
msgid "Failed"
msgstr ""
#: src/views/task/TaskView.vue:46
msgid "Completion Time"
msgstr ""
#: src/views/task/TaskView.vue:136
msgid "If logs cannot be loaded, please disable ad blockers!"
msgstr ""
#: src/views/website/EditView.vue:54 src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/EditView.vue:83
msgid "Edit Website - %{ name }"
msgstr ""
#: src/views/website/EditView.vue:85 src/views/website/route.ts:31
msgid "Edit Website"
msgstr ""
#: src/views/website/EditView.vue:122
msgid "Reset successfully"
msgstr ""
#: src/views/website/EditView.vue:139
msgid "Issued successfully"
msgstr ""
#: src/views/website/EditView.vue:153
msgid "The selected certificate is invalid"
msgstr ""
#: src/views/website/EditView.vue:160
msgid "Cleared successfully"
msgstr ""
#: src/views/website/EditView.vue:178
msgid ""
"If you modify the original text, other modifications will not take effect "
"after clicking save!"
msgstr ""
#: src/views/website/EditView.vue:184
msgid "Reset Configuration"
msgstr ""
#: src/views/website/EditView.vue:187
msgid "Are you sure you want to reset the configuration?"
msgstr ""
#: src/views/website/EditView.vue:196
#: src/views/website/ProxyBuilderModal.vue:121
msgid "Generate Reverse Proxy Configuration"
msgstr ""
#: src/views/website/EditView.vue:207
msgid "One-click Certificate Issuance"
msgstr ""
#: src/views/website/EditView.vue:217
msgid "Clear Logs"
msgstr ""
#: src/views/website/EditView.vue:226
msgid "Domain & Listening"
msgstr ""
#: src/views/website/EditView.vue:236
msgid "Listening Address"
msgstr ""
#: src/views/website/EditView.vue:254
msgid "Basic Settings"
msgstr ""
#: src/views/website/EditView.vue:256
msgid "Website Directory"
msgstr ""
#: src/views/website/EditView.vue:257
msgid "Enter website directory (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:259
msgid "Running Directory"
msgstr ""
#: src/views/website/EditView.vue:262
msgid "Enter running directory (needed for Laravel etc.) (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:265
msgid "Default Document"
msgstr ""
#: src/views/website/EditView.vue:268 src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/EditView.vue:273 src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/EditView.vue:278
msgid "Anti-XSS Attack (PHP)"
msgstr ""
#: src/views/website/EditView.vue:287
msgid "Certificate Information"
msgstr ""
#: src/views/website/EditView.vue:289
msgid "Certificate Validity"
msgstr ""
#: src/views/website/EditView.vue:303
msgid "Domains"
msgstr ""
#: src/views/website/EditView.vue:318
msgid "Main Switch"
msgstr ""
#: src/views/website/EditView.vue:321
msgid "Use Existing Certificate"
msgstr ""
#: src/views/website/EditView.vue:334
msgid "HTTP Redirect"
msgstr ""
#: src/views/website/EditView.vue:337
msgid "OCSP Stapling"
msgstr ""
#: src/views/website/EditView.vue:362
msgid "Rewrite"
msgstr ""
#: src/views/website/EditView.vue:365
msgid "Presets"
msgstr ""
#: src/views/website/EditView.vue:388
msgid "Configuration"
msgstr ""
#: src/views/website/EditView.vue:391
msgid ""
"If you do not understand the configuration rules, please do not modify them "
"arbitrarily, otherwise it may cause the website to be inaccessible or panel "
"function abnormalities! If you have already encountered a problem, try "
"resetting the configuration!"
msgstr ""
#: src/views/website/EditView.vue:407
msgid "Access Log"
msgstr ""
#: src/views/website/EditView.vue:411 src/views/website/EditView.vue:423
msgid "All logs can be viewed by downloading the file"
msgstr ""
#: src/views/website/EditView.vue:413 src/views/website/EditView.vue:425
msgid "view"
msgstr ""
#: src/views/website/EditView.vue:419
msgid "Error Log"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
msgstr ""
#: src/views/website/IndexView.vue:78 src/views/website/IndexView.vue:516
#: src/views/website/IndexView.vue:521
msgid "Remark"
@@ -2576,10 +2914,6 @@ msgstr ""
msgid "Delete local database with the same name"
msgstr ""
#: src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/IndexView.vue:240
msgid "Already %{ status }"
msgstr ""
@@ -2616,14 +2950,6 @@ msgid ""
"setting"
msgstr ""
#: src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:451
msgid "Select Database"
msgstr ""
@@ -2653,3 +2979,123 @@ msgstr ""
#: src/views/website/IndexView.vue:554
msgid "Stop Page"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:23
msgid "Disabled buffer and enabled cache cannot be used simultaneously"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:27
msgid "Matching expression cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:31
msgid "Proxy address cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:35
msgid "Exact match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:42
msgid "Prefix match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:48
msgid "Proxy address format error"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:100
msgid "Configuration generated successfully"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:128
msgid ""
"After generating the reverse proxy configuration, the original rewrite rules "
"will be overwritten."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:130
msgid ""
"If you need to proxy static resources like JS/CSS, please remove the static "
"log recording part from the original configuration."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:133
msgid "Auto Refresh Resolution"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:136
msgid "Enable SNI"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:139
msgid "Enable Cache"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:142
msgid "Disable Buffer"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:147
msgid "Match Type"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:151
msgid "Exact Match (=)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:152
msgid "Priority Prefix Match (^~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:153
msgid "Normal Prefix Match ( )"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:154
msgid "Case Sensitive Regex Match (~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:155
msgid "Case Insensitive Regex Match (~*)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:159
msgid "Match Expression"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:162
msgid "Proxy Address"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:165
msgid "Send Domain"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:168
msgid "Cache Time"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:174
msgid "Cache time (minutes)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:176
msgid "minutes"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:179
msgid "Content Replacement"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:184
msgid "Target content"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:185
msgid "Replacement content"
msgstr ""
#: src/views/website/route.ts:19
msgid "Websites"
msgstr ""

View File

@@ -67,7 +67,9 @@ msgstr ""
#: src/views/database/ServerList.vue:135 src/views/database/UserList.vue:152
#: src/views/file/ListTable.vue:185 src/views/file/SearchModal.vue:48
#: src/views/firewall/ForwardView.vue:80 src/views/firewall/IpRuleView.vue:122
#: src/views/firewall/RuleView.vue:159 src/views/website/IndexView.vue:95
#: src/views/firewall/RuleView.vue:159 src/views/task/CronView.vue:103
#: src/views/task/SystemView.vue:96 src/views/task/TaskView.vue:55
#: src/views/website/IndexView.vue:95
msgid "Actions"
msgstr ""
@@ -155,14 +157,15 @@ msgstr ""
#: src/views/file/ToolBar.vue:282 src/views/firewall/CreateForwardModal.vue:88
#: src/views/firewall/CreateIpModal.vue:122
#: src/views/firewall/CreateModal.vue:143 src/views/ssh/CreateModal.vue:98
#: src/views/ssh/UpdateModal.vue:104
#: src/views/ssh/UpdateModal.vue:104 src/views/task/CreateModal.vue:159
#: src/views/website/ProxyBuilderModal.vue:189
msgid "Submit"
msgstr ""
#: src/views/backup/IndexView.vue:37 src/views/backup/ListView.vue:217
#: src/views/backup/ListView.vue:250 src/views/cert/CertView.vue:464
#: src/views/cert/CertView.vue:527 src/views/cert/CreateCertModal.vue:86
#: src/views/dashboard/IndexView.vue:418
#: src/views/dashboard/IndexView.vue:418 src/views/task/CreateModal.vue:130
msgid "Website"
msgstr ""
@@ -202,6 +205,7 @@ msgstr ""
#: src/views/file/SearchModal.vue:98 src/views/file/ToolBar.vue:238
#: src/views/firewall/ForwardView.vue:105 src/views/firewall/IpRuleView.vue:147
#: src/views/firewall/RuleView.vue:184 src/views/ssh/IndexView.vue:93
#: src/views/task/CronView.vue:157 src/views/task/TaskView.vue:99
#: src/views/website/IndexView.vue:169
msgid "Delete"
msgstr ""
@@ -217,7 +221,7 @@ msgstr ""
#: src/views/database/CreateUserModal.vue:28 src/views/file/ToolBar.vue:45
#: src/views/firewall/CreateForwardModal.vue:41
#: src/views/firewall/CreateModal.vue:84 src/views/ssh/CreateModal.vue:38
#: src/views/website/IndexView.vue:309
#: src/views/task/CreateModal.vue:51 src/views/website/IndexView.vue:309
msgid "Created successfully"
msgstr ""
@@ -236,7 +240,8 @@ msgstr ""
#: src/views/firewall/ForwardView.vue:132
#: src/views/firewall/ForwardView.vue:150 src/views/firewall/IpRuleView.vue:174
#: src/views/firewall/IpRuleView.vue:192 src/views/firewall/RuleView.vue:211
#: src/views/firewall/RuleView.vue:229 src/views/website/IndexView.vue:270
#: src/views/firewall/RuleView.vue:229 src/views/task/CronView.vue:200
#: src/views/task/TaskView.vue:125 src/views/website/IndexView.vue:270
#: src/views/website/IndexView.vue:324
msgid "Deleted successfully"
msgstr ""
@@ -255,7 +260,8 @@ msgstr ""
#: src/views/backup/ListView.vue:220
#: src/views/database/CreateDatabaseModal.vue:70
#: src/views/database/DatabaseList.vue:35 src/views/website/IndexView.vue:468
#: src/views/database/DatabaseList.vue:35 src/views/task/CreateModal.vue:146
#: src/views/task/CreateModal.vue:148 src/views/website/IndexView.vue:468
#: src/views/website/IndexView.vue:473
msgid "Database Name"
msgstr ""
@@ -267,7 +273,8 @@ msgstr ""
msgid "Enter database name"
msgstr ""
#: src/views/backup/ListView.vue:228
#: src/views/backup/ListView.vue:228 src/views/task/CreateModal.vue:150
#: src/views/task/CreateModal.vue:151
msgid "Save Directory"
msgstr ""
@@ -382,7 +389,7 @@ msgstr ""
#: src/views/cert/CertView.vue:64 src/views/cert/CertView.vue:448
#: src/views/cert/CreateCertModal.vue:70 src/views/cert/ObtainModal.vue:53
#: src/views/website/IndexView.vue:412
#: src/views/website/EditView.vue:228 src/views/website/IndexView.vue:412
msgid "Domain"
msgstr ""
@@ -414,7 +421,7 @@ msgstr ""
msgid "Associated Account"
msgstr ""
#: src/views/cert/CertView.vue:130
#: src/views/cert/CertView.vue:130 src/views/website/EditView.vue:297
msgid "Issuer"
msgstr ""
@@ -435,7 +442,7 @@ msgid "Deploy"
msgstr ""
#: src/views/cert/CertView.vue:233 src/views/cert/ObtainModal.vue:24
#: src/views/cert/ObtainModal.vue:77
#: src/views/cert/ObtainModal.vue:77 src/views/website/EditView.vue:133
msgid "Please wait..."
msgstr ""
@@ -494,11 +501,12 @@ msgstr ""
#: src/views/cert/CertView.vue:488 src/views/cert/CertView.vue:551
#: src/views/cert/route.ts:19 src/views/cert/UploadCertModal.vue:38
#: src/views/setting/SettingHttps.vue:39
#: src/views/setting/SettingHttps.vue:39 src/views/website/EditView.vue:342
msgid "Certificate"
msgstr ""
#: src/views/cert/CertView.vue:492 src/views/cert/UploadCertModal.vue:42
#: src/views/website/EditView.vue:346
msgid "Enter the content of the PEM certificate file"
msgstr ""
@@ -506,10 +514,12 @@ msgstr ""
#: src/views/cert/UploadCertModal.vue:46 src/views/setting/SettingHttps.vue:46
#: src/views/ssh/CreateModal.vue:78 src/views/ssh/CreateModal.vue:89
#: src/views/ssh/UpdateModal.vue:84 src/views/ssh/UpdateModal.vue:95
#: src/views/website/EditView.vue:350
msgid "Private Key"
msgstr ""
#: src/views/cert/CertView.vue:500 src/views/cert/UploadCertModal.vue:50
#: src/views/website/EditView.vue:354
msgid "Enter the content of the KEY private key file"
msgstr ""
@@ -768,6 +778,7 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:55 src/views/file/ListTable.vue:99
#: src/views/file/SearchModal.vue:20 src/views/file/ToolBar.vue:257
#: src/views/ssh/CreateModal.vue:57 src/views/ssh/UpdateModal.vue:63
#: src/views/task/SystemView.vue:18
msgid "Name"
msgstr ""
@@ -779,19 +790,21 @@ msgstr ""
#: src/views/container/ComposeView.vue:58
#: src/views/container/ContainerView.vue:32
#: src/views/database/ServerList.vue:114 src/views/database/UserList.vue:131
#: src/views/firewall/RuleView.vue:62
#: src/views/firewall/RuleView.vue:62 src/views/task/SystemView.vue:43
#: src/views/task/TaskView.vue:22
msgid "Status"
msgstr ""
#: src/views/container/ComposeView.vue:65 src/views/container/ImageView.vue:60
#: src/views/container/NetworkView.vue:100
#: src/views/container/VolumeView.vue:54
#: src/views/container/VolumeView.vue:54 src/views/task/CronView.vue:84
#: src/views/task/TaskView.vue:37
msgid "Creation Time"
msgstr ""
#: src/views/container/ComposeView.vue:97 src/views/file/ListTable.vue:64
#: src/views/file/ListTable.vue:216 src/views/ssh/IndexView.vue:71
#: src/views/website/IndexView.vue:111
#: src/views/task/CronView.vue:135 src/views/website/IndexView.vue:111
msgid "Edit"
msgstr ""
@@ -1001,6 +1014,7 @@ msgstr ""
#: src/views/container/ContainerCreate.vue:291
#: src/views/dashboard/IndexView.vue:530 src/views/monitor/IndexView.vue:205
#: src/views/monitor/IndexView.vue:216 src/views/monitor/IndexView.vue:238
#: src/views/task/SystemView.vue:78
msgid "Memory"
msgstr ""
@@ -1060,7 +1074,8 @@ msgid "Running Status"
msgstr ""
#: src/views/container/ContainerView.vue:103
#: src/views/container/ContainerView.vue:439
#: src/views/container/ContainerView.vue:439 src/views/task/CronView.vue:122
#: src/views/task/TaskView.vue:75
msgid "Logs"
msgstr ""
@@ -1173,6 +1188,7 @@ msgstr ""
#: src/views/container/ImageView.vue:85 src/views/container/NetworkView.vue:125
#: src/views/container/VolumeView.vue:79 src/views/firewall/ForwardView.vue:94
#: src/views/firewall/IpRuleView.vue:136 src/views/firewall/RuleView.vue:173
#: src/views/task/TaskView.vue:88
msgid "Are you sure you want to delete?"
msgstr ""
@@ -1379,7 +1395,7 @@ msgstr ""
msgid "Current version is the latest"
msgstr ""
#: src/views/dashboard/IndexView.vue:431
#: src/views/dashboard/IndexView.vue:431 src/views/task/IndexView.vue:29
msgid "Scheduled Tasks"
msgstr ""
@@ -1798,11 +1814,12 @@ msgstr ""
#: src/views/database/UpdateServerModal.vue:21
#: src/views/database/UpdateUserModal.vue:18
#: src/views/database/UserList.vue:223 src/views/file/PermissionModal.vue:29
#: src/views/task/CronView.vue:182 src/views/task/CronView.vue:209
#: src/views/website/IndexView.vue:253 src/views/website/IndexView.vue:279
msgid "Modified successfully"
msgstr ""
#: src/views/database/IndexView.vue:48
#: src/views/database/IndexView.vue:48 src/views/task/SystemView.vue:37
msgid "User"
msgstr ""
@@ -1911,6 +1928,7 @@ msgstr ""
#: src/views/file/EditModal.vue:31 src/views/file/ListTable.vue:703
#: src/views/setting/SettingBase.vue:95 src/views/setting/SettingHttps.vue:56
#: src/views/website/EditView.vue:211
msgid "Save"
msgstr ""
@@ -2406,7 +2424,7 @@ msgstr ""
msgid "Clear Monitoring Records"
msgstr ""
#: src/views/monitor/IndexView.vue:449
#: src/views/monitor/IndexView.vue:449 src/views/website/EditView.vue:220
msgid "Are you sure you want to clear?"
msgstr ""
@@ -2439,6 +2457,7 @@ msgid "Panel Settings"
msgstr ""
#: src/views/setting/SettingBase.vue:35 src/views/setting/SettingHttps.vue:27
#: src/views/website/EditView.vue:115
msgid "Saved successfully"
msgstr ""
@@ -2551,14 +2570,333 @@ msgstr ""
msgid "Update Host"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
#: src/views/task/CreateModal.vue:22
msgid "# Enter your script content here"
msgstr ""
#: src/views/task/CreateModal.vue:89
msgid "Create Scheduled Task"
msgstr ""
#: src/views/task/CreateModal.vue:96 src/views/task/CronView.vue:36
msgid "Task Type"
msgstr ""
#: src/views/task/CreateModal.vue:100 src/views/task/CronView.vue:49
msgid "Run Script"
msgstr ""
#: src/views/task/CreateModal.vue:101 src/views/task/CronView.vue:51
msgid "Backup Data"
msgstr ""
#: src/views/task/CreateModal.vue:102 src/views/task/CronView.vue:52
msgid "Log Rotation"
msgstr ""
#: src/views/task/CreateModal.vue:107 src/views/task/CreateModal.vue:108
#: src/views/task/CronView.vue:29 src/views/task/CronView.vue:259
#: src/views/task/CronView.vue:260 src/views/task/TaskView.vue:15
msgid "Task Name"
msgstr ""
#: src/views/task/CreateModal.vue:110 src/views/task/CronView.vue:74
#: src/views/task/CronView.vue:262
msgid "Task Schedule"
msgstr ""
#: src/views/task/CreateModal.vue:114
msgid "Script Content"
msgstr ""
#: src/views/task/CreateModal.vue:128
msgid "Backup Type"
msgstr ""
#: src/views/task/CreateModal.vue:131
msgid "MySQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:132
msgid "PostgreSQL Database"
msgstr ""
#: src/views/task/CreateModal.vue:140 src/views/task/CreateModal.vue:142
msgid "Select Website"
msgstr ""
#: src/views/task/CreateModal.vue:153
msgid "Retention Count"
msgstr ""
#: src/views/task/CronView.vue:59
msgid "Enabled"
msgstr ""
#: src/views/task/CronView.vue:94
msgid "Last Update Time"
msgstr ""
#: src/views/task/CronView.vue:146
msgid "Are you sure you want to delete this task?"
msgstr ""
#: src/views/task/CronView.vue:251
msgid "Edit Task"
msgstr ""
#: src/views/task/IndexView.vue:25
msgid "Create Task"
msgstr ""
#: src/views/task/IndexView.vue:32
msgid "System Processes"
msgstr ""
#: src/views/task/IndexView.vue:35
msgid "Panel Tasks"
msgstr ""
#: src/views/task/route.ts:19
msgid "Background Tasks"
msgstr ""
#: src/views/task/SystemView.vue:25
msgid "Parent PID"
msgstr ""
#: src/views/task/SystemView.vue:31
msgid "Threads"
msgstr ""
#: src/views/task/SystemView.vue:50 src/views/task/TaskView.vue:33
#: src/views/website/IndexView.vue:30
msgid "Running"
msgstr ""
#: src/views/task/SystemView.vue:52
msgid "Sleeping"
msgstr ""
#: src/views/task/SystemView.vue:54
msgid "Stopped"
msgstr ""
#: src/views/task/SystemView.vue:56
msgid "Idle"
msgstr ""
#: src/views/task/SystemView.vue:58
msgid "Zombie"
msgstr ""
#: src/views/task/SystemView.vue:60 src/views/task/TaskView.vue:30
msgid "Waiting"
msgstr ""
#: src/views/task/SystemView.vue:62
msgid "Locked"
msgstr ""
#: src/views/task/SystemView.vue:87
msgid "Start Time"
msgstr ""
#: src/views/task/SystemView.vue:108
msgid "Process %{ pid } has been terminated"
msgstr ""
#: src/views/task/SystemView.vue:114
msgid "Are you sure you want to terminate process %{ pid }?"
msgstr ""
#: src/views/task/SystemView.vue:124
msgid "Terminate"
msgstr ""
#: src/views/task/TaskView.vue:28
msgid "Completed"
msgstr ""
#: src/views/task/TaskView.vue:32
msgid "Failed"
msgstr ""
#: src/views/task/TaskView.vue:46
msgid "Completion Time"
msgstr ""
#: src/views/task/TaskView.vue:136
msgid "If logs cannot be loaded, please disable ad blockers!"
msgstr ""
#: src/views/website/EditView.vue:54 src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/EditView.vue:83
msgid "Edit Website - %{ name }"
msgstr ""
#: src/views/website/EditView.vue:85 src/views/website/route.ts:31
msgid "Edit Website"
msgstr ""
#: src/views/website/EditView.vue:122
msgid "Reset successfully"
msgstr ""
#: src/views/website/EditView.vue:139
msgid "Issued successfully"
msgstr ""
#: src/views/website/EditView.vue:153
msgid "The selected certificate is invalid"
msgstr ""
#: src/views/website/EditView.vue:160
msgid "Cleared successfully"
msgstr ""
#: src/views/website/EditView.vue:178
msgid ""
"If you modify the original text, other modifications will not take effect "
"after clicking save!"
msgstr ""
#: src/views/website/EditView.vue:184
msgid "Reset Configuration"
msgstr ""
#: src/views/website/EditView.vue:187
msgid "Are you sure you want to reset the configuration?"
msgstr ""
#: src/views/website/EditView.vue:196
#: src/views/website/ProxyBuilderModal.vue:121
msgid "Generate Reverse Proxy Configuration"
msgstr ""
#: src/views/website/EditView.vue:207
msgid "One-click Certificate Issuance"
msgstr ""
#: src/views/website/EditView.vue:217
msgid "Clear Logs"
msgstr ""
#: src/views/website/EditView.vue:226
msgid "Domain & Listening"
msgstr ""
#: src/views/website/EditView.vue:236
msgid "Listening Address"
msgstr ""
#: src/views/website/EditView.vue:254
msgid "Basic Settings"
msgstr ""
#: src/views/website/EditView.vue:256
msgid "Website Directory"
msgstr ""
#: src/views/website/EditView.vue:257
msgid "Enter website directory (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:259
msgid "Running Directory"
msgstr ""
#: src/views/website/EditView.vue:262
msgid "Enter running directory (needed for Laravel etc.) (absolute path)"
msgstr ""
#: src/views/website/EditView.vue:265
msgid "Default Document"
msgstr ""
#: src/views/website/EditView.vue:268 src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/EditView.vue:273 src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/EditView.vue:278
msgid "Anti-XSS Attack (PHP)"
msgstr ""
#: src/views/website/EditView.vue:287
msgid "Certificate Information"
msgstr ""
#: src/views/website/EditView.vue:289
msgid "Certificate Validity"
msgstr ""
#: src/views/website/EditView.vue:303
msgid "Domains"
msgstr ""
#: src/views/website/EditView.vue:318
msgid "Main Switch"
msgstr ""
#: src/views/website/EditView.vue:321
msgid "Use Existing Certificate"
msgstr ""
#: src/views/website/EditView.vue:334
msgid "HTTP Redirect"
msgstr ""
#: src/views/website/EditView.vue:337
msgid "OCSP Stapling"
msgstr ""
#: src/views/website/EditView.vue:362
msgid "Rewrite"
msgstr ""
#: src/views/website/EditView.vue:365
msgid "Presets"
msgstr ""
#: src/views/website/EditView.vue:388
msgid "Configuration"
msgstr ""
#: src/views/website/EditView.vue:391
msgid ""
"If you do not understand the configuration rules, please do not modify them "
"arbitrarily, otherwise it may cause the website to be inaccessible or panel "
"function abnormalities! If you have already encountered a problem, try "
"resetting the configuration!"
msgstr ""
#: src/views/website/EditView.vue:407
msgid "Access Log"
msgstr ""
#: src/views/website/EditView.vue:411 src/views/website/EditView.vue:423
msgid "All logs can be viewed by downloading the file"
msgstr ""
#: src/views/website/EditView.vue:413 src/views/website/EditView.vue:425
msgid "view"
msgstr ""
#: src/views/website/EditView.vue:419
msgid "Error Log"
msgstr ""
#: src/views/website/IndexView.vue:23 src/views/website/IndexView.vue:398
msgid "Website Name"
msgstr ""
#: src/views/website/IndexView.vue:78 src/views/website/IndexView.vue:516
#: src/views/website/IndexView.vue:521
msgid "Remark"
@@ -2576,10 +2914,6 @@ msgstr ""
msgid "Delete local database with the same name"
msgstr ""
#: src/views/website/IndexView.vue:210
msgid "Not used"
msgstr ""
#: src/views/website/IndexView.vue:240
msgid "Already %{ status }"
msgstr ""
@@ -2616,14 +2950,6 @@ msgid ""
"setting"
msgstr ""
#: src/views/website/IndexView.vue:435
msgid "PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:439
msgid "Select PHP Version"
msgstr ""
#: src/views/website/IndexView.vue:451
msgid "Select Database"
msgstr ""
@@ -2653,3 +2979,123 @@ msgstr ""
#: src/views/website/IndexView.vue:554
msgid "Stop Page"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:23
msgid "Disabled buffer and enabled cache cannot be used simultaneously"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:27
msgid "Matching expression cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:31
msgid "Proxy address cannot be empty"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:35
msgid "Exact match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:42
msgid "Prefix match expression must start with /"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:48
msgid "Proxy address format error"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:100
msgid "Configuration generated successfully"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:128
msgid ""
"After generating the reverse proxy configuration, the original rewrite rules "
"will be overwritten."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:130
msgid ""
"If you need to proxy static resources like JS/CSS, please remove the static "
"log recording part from the original configuration."
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:133
msgid "Auto Refresh Resolution"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:136
msgid "Enable SNI"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:139
msgid "Enable Cache"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:142
msgid "Disable Buffer"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:147
msgid "Match Type"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:151
msgid "Exact Match (=)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:152
msgid "Priority Prefix Match (^~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:153
msgid "Normal Prefix Match ( )"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:154
msgid "Case Sensitive Regex Match (~)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:155
msgid "Case Insensitive Regex Match (~*)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:159
msgid "Match Expression"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:162
msgid "Proxy Address"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:165
msgid "Send Domain"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:168
msgid "Cache Time"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:174
msgid "Cache time (minutes)"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:176
msgid "minutes"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:179
msgid "Content Replacement"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:184
msgid "Target content"
msgstr ""
#: src/views/website/ProxyBuilderModal.vue:185
msgid "Replacement content"
msgstr ""
#: src/views/website/route.ts:19
msgid "Websites"
msgstr ""

View File

@@ -6,7 +6,9 @@ import website from '@/api/panel/website'
import Editor from '@guolao/vue-monaco-editor'
import { CronNaive } from '@vue-js-cron/naive-ui'
import { NInput } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
const { $gettext } = useGettext()
const show = defineModel<boolean>('show', { type: Boolean, required: true })
const loading = ref(false)
@@ -17,7 +19,7 @@ const createModel = ref({
save: 1,
backup_type: 'website',
backup_path: '',
script: '# 在此输入您要执行的脚本内容',
script: $gettext('# Enter your script content here'),
time: '* * * * *'
})
@@ -46,7 +48,7 @@ const handleSubmit = async () => {
loading.value = true
useRequest(cron.create(createModel.value))
.onSuccess(() => {
window.$message.success('创建成功')
window.$message.success($gettext('Created successfully'))
window.$bus.emit('task:refresh-cron')
})
.onComplete(() => {
@@ -84,32 +86,32 @@ onMounted(() => {
<n-modal
v-model:show="show"
preset="card"
title="创建计划任务"
:title="$gettext('Create Scheduled Task')"
style="width: 60vw"
size="huge"
:bordered="false"
:segmented="false"
>
<n-form>
<n-form-item label="任务类型">
<n-form-item :label="$gettext('Task Type')">
<n-select
v-model:value="createModel.type"
:options="[
{ label: '运行脚本', value: 'shell' },
{ label: '备份数据', value: 'backup' },
{ label: '切割日志', value: 'cutoff' }
{ label: $gettext('Run Script'), value: 'shell' },
{ label: $gettext('Backup Data'), value: 'backup' },
{ label: $gettext('Log Rotation'), value: 'cutoff' }
]"
>
</n-select>
</n-form-item>
<n-form-item label="任务名称">
<n-input v-model:value="createModel.name" placeholder="任务名称" />
<n-form-item :label="$gettext('Task Name')">
<n-input v-model:value="createModel.name" :placeholder="$gettext('Task Name')" />
</n-form-item>
<n-form-item label="任务周期">
<n-form-item :label="$gettext('Task Schedule')">
<cron-naive v-model="createModel.time" locale="zh-cn"></cron-naive>
</n-form-item>
<div v-if="createModel.type === 'shell'">
<n-text>脚本内容</n-text>
<n-text>{{ $gettext('Script Content') }}</n-text>
<Editor
v-model:value="createModel.script"
language="shell"
@@ -123,11 +125,11 @@ onMounted(() => {
}"
/>
</div>
<n-form-item v-if="createModel.type === 'backup'" label="备份类型">
<n-form-item v-if="createModel.type === 'backup'" :label="$gettext('Backup Type')">
<n-radio-group v-model:value="createModel.backup_type">
<n-radio value="website">网站</n-radio>
<n-radio value="mysql" :disabled="!mySQLInstalled"> MySQL 数据库</n-radio>
<n-radio value="postgres" :disabled="!postgreSQLInstalled"> PostgreSQL 数据库 </n-radio>
<n-radio value="website">{{ $gettext('Website') }}</n-radio>
<n-radio value="mysql" :disabled="!mySQLInstalled"> {{ $gettext('MySQL Database') }}</n-radio>
<n-radio value="postgres" :disabled="!postgreSQLInstalled"> {{ $gettext('PostgreSQL Database') }} </n-radio>
</n-radio-group>
</n-form-item>
<n-form-item
@@ -135,26 +137,26 @@ onMounted(() => {
(createModel.backup_type === 'website' && createModel.type === 'backup') ||
createModel.type === 'cutoff'
"
label="选择网站"
:label="$gettext('Select Website')"
>
<n-select v-model:value="createModel.target" :options="websites" placeholder="选择网站" />
<n-select v-model:value="createModel.target" :options="websites" :placeholder="$gettext('Select Website')" />
</n-form-item>
<n-form-item
v-if="createModel.backup_type !== 'website' && createModel.type === 'backup'"
label="数据库名"
:label="$gettext('Database Name')"
>
<n-input v-model:value="createModel.target" placeholder="数据库名" />
<n-input v-model:value="createModel.target" :placeholder="$gettext('Database Name')" />
</n-form-item>
<n-form-item v-if="createModel.type === 'backup'" label="保存目录">
<n-input v-model:value="createModel.backup_path" placeholder="保存目录" />
<n-form-item v-if="createModel.type === 'backup'" :label="$gettext('Save Directory')">
<n-input v-model:value="createModel.backup_path" :placeholder="$gettext('Save Directory')" />
</n-form-item>
<n-form-item v-if="createModel.type !== 'shell'" label="保留份数">
<n-form-item v-if="createModel.type !== 'shell'" :label="$gettext('Retention Count')">
<n-input-number v-model:value="createModel.save" />
</n-form-item>
</n-form>
<n-row :gutter="[0, 24]" pt-20>
<n-col :span="24">
<n-button type="info" block :loading="loading" @click="handleSubmit"> 提交 </n-button>
<n-button type="info" block :loading="loading" @click="handleSubmit"> {{ $gettext('Submit') }} </n-button>
</n-col>
</n-row>
</n-modal>

View File

@@ -4,12 +4,14 @@ import 'cronstrue/locales/zh_CN'
import Editor from '@guolao/vue-monaco-editor'
import { NButton, NDataTable, NInput, NPopconfirm, NSwitch, NTag } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import cron from '@/api/panel/cron'
import file from '@/api/panel/file'
import { decodeBase64, formatDateTime, renderIcon } from '@/utils'
import { CronNaive } from '@vue-js-cron/naive-ui'
const { $gettext } = useGettext()
const logPath = ref('')
const logModal = ref(false)
const editModal = ref(false)
@@ -24,14 +26,14 @@ const editTask = ref({
const columns: any = [
{ type: 'selection', fixed: 'left' },
{
title: '任务名',
title: $gettext('Task Name'),
key: 'name',
minWidth: 150,
resizable: true,
ellipsis: { tooltip: true }
},
{
title: '任务类型',
title: $gettext('Task Type'),
key: 'type',
width: 100,
resizable: true,
@@ -44,17 +46,17 @@ const columns: any = [
{
default: () => {
return row.type === 'shell'
? '运行脚本'
? $gettext('Run Script')
: row.type === 'backup'
? '备份数据'
: '切割日志'
? $gettext('Backup Data')
: $gettext('Log Rotation')
}
}
)
}
},
{
title: '启用',
title: $gettext('Enabled'),
key: 'status',
width: 100,
align: 'center',
@@ -69,7 +71,7 @@ const columns: any = [
}
},
{
title: '任务周期',
title: $gettext('Task Schedule'),
key: 'time',
width: 200,
resizable: true,
@@ -79,7 +81,7 @@ const columns: any = [
}
},
{
title: '创建时间',
title: $gettext('Creation Time'),
key: 'created_at',
width: 200,
resizable: true,
@@ -89,7 +91,7 @@ const columns: any = [
}
},
{
title: '最后更新时间',
title: $gettext('Last Update Time'),
key: 'updated_at',
width: 200,
ellipsis: { tooltip: true },
@@ -98,7 +100,7 @@ const columns: any = [
}
},
{
title: '操作',
title: $gettext('Actions'),
key: 'actions',
width: 280,
align: 'center',
@@ -117,7 +119,7 @@ const columns: any = [
}
},
{
default: () => '日志',
default: () => $gettext('Logs'),
icon: renderIcon('majesticons:eye-line', { size: 14 })
}
),
@@ -130,7 +132,7 @@ const columns: any = [
onClick: () => handleEdit(row)
},
{
default: () => '修改',
default: () => $gettext('Edit'),
icon: renderIcon('material-symbols:edit-outline', { size: 14 })
}
),
@@ -141,7 +143,7 @@ const columns: any = [
},
{
default: () => {
return '确定删除任务吗?'
return $gettext('Are you sure you want to delete this task?')
},
trigger: () => {
return h(
@@ -152,7 +154,7 @@ const columns: any = [
style: 'margin-left: 15px;'
},
{
default: () => '删除',
default: () => $gettext('Delete'),
icon: renderIcon('material-symbols:delete-outline', { size: 14 })
}
)
@@ -177,7 +179,7 @@ const { loading, data, page, total, pageSize, pageCount, refresh } = usePaginati
const handleStatusChange = (row: any) => {
useRequest(cron.status(row.id, !row.status)).onSuccess(() => {
row.status = !row.status
window.$message.success('修改成功')
window.$message.success($gettext('Modified successfully'))
})
}
@@ -195,7 +197,7 @@ const handleEdit = (row: any) => {
const handleDelete = async (id: number) => {
useRequest(cron.delete(id)).onSuccess(() => {
window.$message.success('删除成功')
window.$message.success($gettext('Deleted successfully'))
window.$bus.emit('task:refresh-cron')
})
}
@@ -204,7 +206,7 @@ const saveTaskEdit = async () => {
useRequest(
cron.update(editTask.value.id, editTask.value.name, editTask.value.time, editTask.value.script)
).onSuccess(() => {
window.$message.success('修改成功')
window.$message.success($gettext('Modified successfully'))
window.$bus.emit('task:refresh-cron')
})
}
@@ -246,7 +248,7 @@ onUnmounted(() => {
<n-modal
v-model:show="editModal"
preset="card"
title="编辑任务"
:title="$gettext('Edit Task')"
style="width: 80vw"
size="huge"
:bordered="false"
@@ -254,10 +256,10 @@ onUnmounted(() => {
@close="saveTaskEdit"
>
<n-form inline>
<n-form-item label="任务名称">
<n-input v-model:value="editTask.name" placeholder="任务名称" />
<n-form-item :label="$gettext('Task Name')">
<n-input v-model:value="editTask.name" :placeholder="$gettext('Task Name')" />
</n-form-item>
<n-form-item label="任务周期">
<n-form-item :label="$gettext('Task Schedule')">
<cron-naive v-model="editTask.time" locale="zh-cn"></cron-naive>
</n-form-item>
</n-form>

View File

@@ -9,7 +9,9 @@ import CronView from '@/views/task/CronView.vue'
import SystemView from '@/views/task/SystemView.vue'
import TaskView from '@/views/task/TaskView.vue'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
const { $gettext } = useGettext()
const current = ref('cron')
const create = ref(false)
@@ -20,17 +22,17 @@ const create = ref(false)
<template #action>
<n-button v-if="current == 'cron'" type="primary" @click="create = true">
<TheIcon :size="18" icon="material-symbols:add" />
创建任务
{{ $gettext('Create Task') }}
</n-button>
</template>
<n-tabs v-model:value="current" type="line" animated>
<n-tab-pane name="cron" tab="计划任务">
<n-tab-pane name="cron" :tab="$gettext('Scheduled Tasks')">
<cron-view />
</n-tab-pane>
<n-tab-pane name="system" tab="系统进程">
<n-tab-pane name="system" :tab="$gettext('System Processes')">
<system-view />
</n-tab-pane>
<n-tab-pane name="task" tab="面板任务">
<n-tab-pane name="task" :tab="$gettext('Panel Tasks')">
<task-view />
</n-tab-pane>
</n-tabs>

View File

@@ -1,9 +1,12 @@
<script setup lang="ts">
import { NButton, NDataTable, NPopconfirm, NTag } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import process from '@/api/panel/process'
import { formatBytes, formatDateTime, formatPercent, renderIcon } from '@/utils'
const { $gettext } = useGettext()
const columns: any = [
{
title: 'PID',
@@ -12,51 +15,51 @@ const columns: any = [
ellipsis: { tooltip: true }
},
{
title: '名称',
title: $gettext('Name'),
key: 'name',
minWidth: 250,
resizable: true,
ellipsis: { tooltip: true }
},
{
title: '父进程 ID',
title: $gettext('Parent PID'),
key: 'ppid',
width: 120,
ellipsis: { tooltip: true }
},
{
title: '线程数',
title: $gettext('Threads'),
key: 'num_threads',
width: 100,
ellipsis: { tooltip: true }
},
{
title: '用户',
title: $gettext('User'),
key: 'username',
minWidth: 100,
ellipsis: { tooltip: true }
},
{
title: '状态',
title: $gettext('Status'),
key: 'status',
minWidth: 150,
ellipsis: { tooltip: true },
render(row: any) {
switch (row.status) {
case 'R':
return h(NTag, { type: 'success' }, { default: () => '运行' })
return h(NTag, { type: 'success' }, { default: () => $gettext('Running') })
case 'S':
return h(NTag, { type: 'warning' }, { default: () => '睡眠' })
return h(NTag, { type: 'warning' }, { default: () => $gettext('Sleeping') })
case 'T':
return h(NTag, { type: 'error' }, { default: () => '停止' })
return h(NTag, { type: 'error' }, { default: () => $gettext('Stopped') })
case 'I':
return h(NTag, { type: 'primary' }, { default: () => '空闲' })
return h(NTag, { type: 'primary' }, { default: () => $gettext('Idle') })
case 'Z':
return h(NTag, { type: 'error' }, { default: () => '僵尸' })
return h(NTag, { type: 'error' }, { default: () => $gettext('Zombie') })
case 'W':
return h(NTag, { type: 'warning' }, { default: () => '等待' })
return h(NTag, { type: 'warning' }, { default: () => $gettext('Waiting') })
case 'L':
return h(NTag, { type: 'info' }, { default: () => '锁定' })
return h(NTag, { type: 'info' }, { default: () => $gettext('Locked') })
default:
return h(NTag, { type: 'default' }, { default: () => row.status })
}
@@ -72,7 +75,7 @@ const columns: any = [
}
},
{
title: '内存',
title: $gettext('Memory'),
key: 'rss',
minWidth: 100,
ellipsis: { tooltip: true },
@@ -81,7 +84,7 @@ const columns: any = [
}
},
{
title: '启动时间',
title: $gettext('Start Time'),
key: 'start_time',
width: 160,
ellipsis: { tooltip: true },
@@ -90,7 +93,7 @@ const columns: any = [
}
},
{
title: '操作',
title: $gettext('Actions'),
key: 'actions',
width: 150,
align: 'center',
@@ -102,13 +105,13 @@ const columns: any = [
onPositiveClick: () => {
useRequest(process.kill(row.pid)).onSuccess(() => {
refresh()
window.$message.success(`进程 ${row.pid} 已终止`)
window.$message.success($gettext('Process %{ pid } has been terminated', { pid: row.pid }))
})
}
},
{
default: () => {
return '确定终止进程 ' + row.pid + ' ?'
return $gettext('Are you sure you want to terminate process %{ pid }?', { pid: row.pid })
},
trigger: () => {
return h(
@@ -118,7 +121,7 @@ const columns: any = [
type: 'error'
},
{
default: () => '终止',
default: () => $gettext('Terminate'),
icon: renderIcon('material-symbols:stop-circle-outline-rounded', { size: 14 })
}
)

View File

@@ -1,38 +1,40 @@
<script setup lang="ts">
import { NButton, NDataTable, NPopconfirm } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import task from '@/api/panel/task'
import RealtimeLogModal from '@/components/common/RealtimeLogModal.vue'
import { formatDateTime, renderIcon } from '@/utils'
const { $gettext } = useGettext()
const logModal = ref(false)
const logPath = ref('')
const columns: any = [
{
title: '任务名',
title: $gettext('Task Name'),
key: 'name',
minWidth: 200,
resizable: true,
ellipsis: { tooltip: true }
},
{
title: '状态',
title: $gettext('Status'),
key: 'status',
width: 150,
ellipsis: { tooltip: true },
render(row: any) {
return row.status === 'finished'
? '已完成'
? $gettext('Completed')
: row.status === 'waiting'
? '等待中'
? $gettext('Waiting')
: row.status === 'failed'
? '已失败'
: '运行中'
? $gettext('Failed')
: $gettext('Running')
}
},
{
title: '创建时间',
title: $gettext('Creation Time'),
key: 'created_at',
width: 200,
ellipsis: { tooltip: true },
@@ -41,7 +43,7 @@ const columns: any = [
}
},
{
title: '完成时间',
title: $gettext('Completion Time'),
key: 'updated_at',
width: 200,
ellipsis: { tooltip: true },
@@ -50,7 +52,7 @@ const columns: any = [
}
},
{
title: '操作',
title: $gettext('Actions'),
key: 'actions',
width: 200,
align: 'center',
@@ -70,7 +72,7 @@ const columns: any = [
}
},
{
default: () => '日志',
default: () => $gettext('Logs'),
icon: renderIcon('material-symbols:visibility', { size: 14 })
}
)
@@ -83,7 +85,7 @@ const columns: any = [
},
{
default: () => {
return '确定要删除吗?'
return $gettext('Are you sure you want to delete?')
},
trigger: () => {
return h(
@@ -94,7 +96,7 @@ const columns: any = [
style: 'margin-left: 15px;'
},
{
default: () => '删除',
default: () => $gettext('Delete'),
icon: renderIcon('material-symbols:delete-outline', { size: 14 })
}
)
@@ -120,7 +122,7 @@ const { loading, data, page, total, pageSize, pageCount, refresh } = usePaginati
const handleDelete = (id: number) => {
useRequest(task.delete(id)).onSuccess(() => {
refresh()
window.$message.success('删除成功')
window.$message.success($gettext('Deleted successfully'))
})
}
@@ -131,7 +133,7 @@ onMounted(() => {
<template>
<n-flex vertical>
<n-alert type="info">若日志无法加载请关闭广告拦截应用</n-alert>
<n-alert type="info">{{ $gettext('If logs cannot be loaded, please disable ad blockers!') }}</n-alert>
<n-data-table
striped
remote

View File

@@ -1,4 +1,5 @@
import type { RouteType } from '~/types/router'
import { $gettext } from '@/utils/gettext'
const Layout = () => import('@/layout/IndexView.vue')
@@ -15,7 +16,7 @@ export default {
path: '',
component: () => import('./IndexView.vue'),
meta: {
title: '后台任务',
title: $gettext('Background Tasks'),
icon: 'mdi:timetable',
role: ['admin'],
requireAuth: true

View File

@@ -6,12 +6,14 @@ defineOptions({
import Editor from '@guolao/vue-monaco-editor'
import type { MessageReactive } from 'naive-ui'
import { NButton } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import cert from '@/api/panel/cert'
import dashboard from '@/api/panel/dashboard'
import website from '@/api/panel/website'
import ProxyBuilderModal from '@/views/website/ProxyBuilderModal.vue'
const { $gettext } = useGettext()
let messageReactive: MessageReactive | null = null
const current = ref('listen')
@@ -49,7 +51,7 @@ const { data: installedDbAndPhp } = useRequest(dashboard.installedDbAndPhp, {
initialData: {
php: [
{
label: '不使用',
label: $gettext('Not used'),
value: 0
}
],
@@ -78,9 +80,9 @@ const rewriteOptions = computed(() => {
const rewriteValue = ref(null)
const title = computed(() => {
if (setting.value) {
return `编辑网站 - ${setting.value.name}`
return $gettext('Edit Website - %{ name }', { name: setting.value.name })
}
return '编辑网站'
return $gettext('Edit Website')
})
const certOptions = computed(() => {
return certs.value.map((item: any) => ({
@@ -110,14 +112,14 @@ const handleSave = () => {
useRequest(website.saveConfig(Number(id), setting.value)).onSuccess(() => {
fetchSetting()
window.$message.success('保存成功')
window.$message.success($gettext('Saved successfully'))
})
}
const handleReset = () => {
useRequest(website.resetConfig(Number(id))).onSuccess(() => {
fetchSetting()
window.$message.success('重置成功')
window.$message.success($gettext('Reset successfully'))
})
}
@@ -128,13 +130,13 @@ const handleRewrite = (value: string) => {
const isObtainCert = ref(false)
const handleObtainCert = () => {
isObtainCert.value = true
messageReactive = window.$message.loading('请稍后...', {
messageReactive = window.$message.loading($gettext('Please wait...'), {
duration: 0
})
useRequest(website.obtainCert(Number(id)))
.onSuccess(() => {
fetchSetting()
window.$message.success('签发成功')
window.$message.success($gettext('Issued successfully'))
})
.onComplete(() => {
isObtainCert.value = false
@@ -148,14 +150,14 @@ const handleSelectCert = (value: number) => {
setting.value.ssl_certificate = cert.cert
setting.value.ssl_certificate_key = cert.key
} else {
window.$message.error('选择的证书无效')
window.$message.error($gettext('The selected certificate is invalid'))
}
}
const clearLog = async () => {
useRequest(website.clearLog(Number(id))).onSuccess(() => {
fetchSetting()
window.$message.success('清空成功')
window.$message.success($gettext('Cleared successfully'))
})
}
@@ -173,16 +175,16 @@ const onCreateListen = () => {
<template #action>
<n-flex>
<n-tag v-if="current === 'config'" type="warning">
如果您修改了原文那么点击保存后其余的修改将不会生效
{{ $gettext('If you modify the original text, other modifications will not take effect after clicking save!') }}
</n-tag>
<n-popconfirm v-if="current === 'config'" @positive-click="handleReset">
<template #trigger>
<n-button type="success">
<TheIcon :size="18" icon="material-symbols:refresh" />
重置配置
{{ $gettext('Reset Configuration') }}
</n-button>
</template>
确定要重置配置吗
{{ $gettext('Are you sure you want to reset the configuration?') }}
</n-popconfirm>
<n-button
v-if="current === 'rewrite'"
@@ -191,7 +193,7 @@ const onCreateListen = () => {
@click="proxyBuilderModal = true"
>
<TheIcon :size="18" icon="material-symbols:build-outline-rounded" />
生成反代配置
{{ $gettext('Generate Reverse Proxy Configuration') }}
</n-button>
<n-button
v-if="current === 'https'"
@@ -202,28 +204,28 @@ const onCreateListen = () => {
@click="handleObtainCert"
>
<TheIcon :size="18" icon="material-symbols:done-rounded" />
一键签发证书
{{ $gettext('One-click Certificate Issuance') }}
</n-button>
<n-button v-if="current !== 'log'" class="ml-16" type="primary" @click="handleSave">
<TheIcon :size="18" icon="material-symbols:save-outline" />
保存
{{ $gettext('Save') }}
</n-button>
<n-popconfirm v-if="current === 'log'" @positive-click="clearLog">
<template #trigger>
<n-button type="primary">
<TheIcon :size="18" icon="material-symbols:delete-outline" />
清空日志
{{ $gettext('Clear Logs') }}
</n-button>
</template>
确定要清空吗
{{ $gettext('Are you sure you want to clear?') }}
</n-popconfirm>
</n-flex>
</template>
<n-tabs v-model:value="current" type="line" animated>
<n-tab-pane name="listen" tab="域名监听">
<n-tab-pane name="listen" :tab="$gettext('Domain & Listening')">
<n-form v-if="setting">
<n-form-item label="域名">
<n-form-item :label="$gettext('Domain')">
<n-dynamic-input
v-model:value="setting.domains"
placeholder="example.com"
@@ -231,7 +233,7 @@ const onCreateListen = () => {
show-sort-button
/>
</n-form-item>
<n-form-item label="监听地址">
<n-form-item :label="$gettext('Listening Address')">
<n-dynamic-input
v-model:value="setting.listens"
show-sort-button
@@ -249,31 +251,31 @@ const onCreateListen = () => {
</n-form>
<n-skeleton v-else text :repeat="10" />
</n-tab-pane>
<n-tab-pane name="basic" tab="基本设置">
<n-tab-pane name="basic" :tab="$gettext('Basic Settings')">
<n-form v-if="setting">
<n-form-item label="网站目录">
<n-input v-model:value="setting.path" placeholder="输入网站目录(绝对路径)" />
<n-form-item :label="$gettext('Website Directory')">
<n-input v-model:value="setting.path" :placeholder="$gettext('Enter website directory (absolute path)')" />
</n-form-item>
<n-form-item label="运行目录">
<n-form-item :label="$gettext('Running Directory')">
<n-input
v-model:value="setting.root"
placeholder="输入运行目录Laravel 等程序需要)(绝对路径)"
:placeholder="$gettext('Enter running directory (needed for Laravel etc.) (absolute path)')"
/>
</n-form-item>
<n-form-item label="默认文档">
<n-form-item :label="$gettext('Default Document')">
<n-dynamic-tags v-model:value="setting.index" />
</n-form-item>
<n-form-item label="PHP 版本">
<n-form-item :label="$gettext('PHP Version')">
<n-select
v-model:value="setting.php"
:default-value="0"
:options="installedDbAndPhp.php"
placeholder="选择PHP版本"
:placeholder="$gettext('Select PHP Version')"
@keydown.enter.prevent
>
</n-select>
</n-form-item>
<n-form-item label="防跨站攻击PHP">
<n-form-item :label="$gettext('Anti-XSS Attack (PHP)')">
<n-switch v-model:value="setting.open_basedir" />
</n-form-item>
</n-form>
@@ -282,9 +284,9 @@ const onCreateListen = () => {
<n-tab-pane name="https" tab="HTTPS">
<n-flex vertical v-if="setting">
<n-card v-if="setting.https && setting.ssl_issuer != ''">
<n-descriptions title="证书信息" :column="2">
<n-descriptions :title="$gettext('Certificate Information')" :column="2">
<n-descriptions-item>
<template #label>证书有效期</template>
<template #label>{{ $gettext('Certificate Validity') }}</template>
<n-flex>
<n-tag>{{ setting.ssl_not_before }}</n-tag>
-
@@ -292,13 +294,13 @@ const onCreateListen = () => {
</n-flex>
</n-descriptions-item>
<n-descriptions-item>
<template #label>颁发者</template>
<template #label>{{ $gettext('Issuer') }}</template>
<n-flex>
<n-tag>{{ setting.ssl_issuer }}</n-tag>
</n-flex>
</n-descriptions-item>
<n-descriptions-item>
<template #label>域名</template>
<template #label>{{ $gettext('Domains') }}</template>
<n-flex>
<n-tag v-for="item in setting.ssl_dns_names" :key="item">{{ item }}</n-tag>
</n-flex>
@@ -313,10 +315,10 @@ const onCreateListen = () => {
</n-card>
<n-form>
<n-grid :cols="24" :x-gap="24">
<n-form-item-gi :span="12" label="总开关">
<n-form-item-gi :span="12" :label="$gettext('Main Switch')">
<n-switch v-model:value="setting.https" />
</n-form-item-gi>
<n-form-item-gi v-if="setting.https" :span="12" label="使用已有证书">
<n-form-item-gi v-if="setting.https" :span="12" :label="$gettext('Use Existing Certificate')">
<n-select
v-model:value="selectedCert"
:options="certOptions"
@@ -329,27 +331,27 @@ const onCreateListen = () => {
<n-form-item label="HSTS">
<n-switch v-model:value="setting.hsts" />
</n-form-item>
<n-form-item label="HTTP 跳转">
<n-form-item :label="$gettext('HTTP Redirect')">
<n-switch v-model:value="setting.http_redirect" />
</n-form-item>
<n-form-item label="OCSP 装订">
<n-form-item :label="$gettext('OCSP Stapling')">
<n-switch v-model:value="setting.ocsp" />
</n-form-item>
</n-form>
<n-form v-if="setting.https">
<n-form-item label="证书">
<n-form-item :label="$gettext('Certificate')">
<n-input
v-model:value="setting.ssl_certificate"
type="textarea"
placeholder="输入 PEM 证书文件的内容"
:placeholder="$gettext('Enter the content of the PEM certificate file')"
:autosize="{ minRows: 10, maxRows: 15 }"
/>
</n-form-item>
<n-form-item label="私钥">
<n-form-item :label="$gettext('Private Key')">
<n-input
v-model:value="setting.ssl_certificate_key"
type="textarea"
placeholder="输入 KEY 私钥文件的内容"
:placeholder="$gettext('Enter the content of the KEY private key file')"
:autosize="{ minRows: 10, maxRows: 15 }"
/>
</n-form-item>
@@ -357,10 +359,10 @@ const onCreateListen = () => {
</n-flex>
<n-skeleton v-else text :repeat="10" />
</n-tab-pane>
<n-tab-pane name="rewrite" tab="伪静态">
<n-tab-pane name="rewrite" :tab="$gettext('Rewrite')">
<n-flex vertical>
<n-form label-placement="left" label-width="auto">
<n-form-item label="预设">
<n-form-item :label="$gettext('Presets')">
<n-select
v-model:value="rewriteValue"
clearable
@@ -383,10 +385,10 @@ const onCreateListen = () => {
/>
</n-flex>
</n-tab-pane>
<n-tab-pane name="config" tab="配置原文">
<n-tab-pane name="config" :tab="$gettext('Configuration')">
<n-flex vertical>
<n-alert type="warning" w-full>
如果您不了解配置规则请勿随意修改否则可能会导致网站无法访问或面板功能异常如果已经遇到问题可尝试重置配置
{{ $gettext('If you do not understand the configuration rules, please do not modify them arbitrarily, otherwise it may cause the website to be inaccessible or panel function abnormalities! If you have already encountered a problem, try resetting the configuration!') }}
</n-alert>
<Editor
v-if="setting"
@@ -402,25 +404,25 @@ const onCreateListen = () => {
/>
</n-flex>
</n-tab-pane>
<n-tab-pane name="log" tab="访问日志">
<n-tab-pane name="log" :tab="$gettext('Access Log')">
<n-flex vertical>
<n-flex flex items-center>
<n-alert type="warning" w-full>
全部日志可通过下载文件
{{ $gettext('All logs can be viewed by downloading the file') }}
<n-tag>{{ setting.log }}</n-tag>
查看
{{ $gettext('view') }}.
</n-alert>
</n-flex>
<realtime-log :path="setting.log" />
</n-flex>
</n-tab-pane>
<n-tab-pane name="error_log" tab="错误日志">
<n-tab-pane name="error_log" :tab="$gettext('Error Log')">
<n-flex vertical>
<n-flex flex items-center>
<n-alert type="warning" w-full>
全部日志可通过下载文件
{{ $gettext('All logs can be viewed by downloading the file') }}
<n-tag>{{ setting.error_log }}</n-tag>
查看
{{ $gettext('view') }}.
</n-alert>
</n-flex>
<realtime-log :path="setting.error_log" />

View File

@@ -1,6 +1,8 @@
<script setup lang="ts">
import { NInput } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
const { $gettext } = useGettext()
const show = defineModel<boolean>('show', { type: Boolean, required: true })
const config = defineModel<string>('config', { type: String, required: true })
const setting = ref({
@@ -18,32 +20,32 @@ const setting = ref({
const handleSubmit = () => {
if (setting.value.cache && setting.value.no_buffer) {
window.$message.error('禁用缓冲区与启用缓存不能同时使用')
window.$message.error($gettext('Disabled buffer and enabled cache cannot be used simultaneously'))
return
}
if (setting.value.match.length === 0) {
window.$message.error('匹配表达式不能为空')
window.$message.error($gettext('Matching expression cannot be empty'))
return
}
if (setting.value.proxy_pass.length === 0) {
window.$message.error('代理地址不能为空')
window.$message.error($gettext('Proxy address cannot be empty'))
return
}
if (setting.value.match_type === '=' && setting.value.match[0] !== '/') {
window.$message.error('精确匹配的表达式必须以 / 开头')
window.$message.error($gettext('Exact match expression must start with /'))
return
}
if (
(setting.value.match_type === '^~' || setting.value.match_type === ' ') &&
setting.value.match[0] !== '/'
) {
window.$message.error('前缀匹配的表达式必须以 / 开头')
window.$message.error($gettext('Prefix match expression must start with /'))
return
}
try {
new URL(setting.value.proxy_pass)
} catch (error) {
window.$message.error('代理地址格式错误')
window.$message.error($gettext('Proxy address format error'))
return
}
@@ -95,7 +97,7 @@ const handleSubmit = () => {
builder += `}\n`
config.value = builder
show.value = false
window.$message.success('配置生成成功')
window.$message.success($gettext('Configuration generated successfully'))
}
// 通过代理地址尝试自动获取发送域名
@@ -116,75 +118,75 @@ watch(
<n-modal
v-model:show="show"
preset="card"
title="生成反代配置"
:title="$gettext('Generate Reverse Proxy Configuration')"
style="width: 40vw"
size="huge"
:bordered="false"
:segmented="false"
>
<n-flex vertical>
<n-alert type="warning"> 生成反代配置后原有伪静态规则将被覆盖 </n-alert>
<n-alert type="warning"> {{ $gettext('After generating the reverse proxy configuration, the original rewrite rules will be overwritten.') }} </n-alert>
<n-alert type="info">
如需反代 JS/CSS 等静态资源请移除配置原文中的不记录静态日志部分
{{ $gettext('If you need to proxy static resources like JS/CSS, please remove the static log recording part from the original configuration.') }}
</n-alert>
<n-form inline>
<n-form-item label="自动刷新解析">
<n-form-item :label="$gettext('Auto Refresh Resolution')">
<n-switch v-model:value="setting.auto_resolve" />
</n-form-item>
<n-form-item label="启用 SNI">
<n-form-item :label="$gettext('Enable SNI')">
<n-switch v-model:value="setting.sni" />
</n-form-item>
<n-form-item label="启用缓存">
<n-form-item :label="$gettext('Enable Cache')">
<n-switch v-model:value="setting.cache" />
</n-form-item>
<n-form-item label="禁用缓冲区">
<n-form-item :label="$gettext('Disable Buffer')">
<n-switch v-model:value="setting.no_buffer" />
</n-form-item>
</n-form>
<n-form>
<n-form-item label="匹配方式">
<n-form-item :label="$gettext('Match Type')">
<n-select
v-model:value="setting.match_type"
:options="[
{ label: '精确匹配 (=)', value: '=' },
{ label: '优先前缀匹配 (^~)', value: '^~' },
{ label: '普通前缀匹配 ( )', value: ' ' },
{ label: '区分大小写正则匹配 (~)', value: '~' },
{ label: '不区分大小写正则匹配 (~*)', value: '~*' }
{ label: $gettext('Exact Match (=)'), value: '=' },
{ label: $gettext('Priority Prefix Match (^~)'), value: '^~' },
{ label: $gettext('Normal Prefix Match ( )'), value: ' ' },
{ label: $gettext('Case Sensitive Regex Match (~)'), value: '~' },
{ label: $gettext('Case Insensitive Regex Match (~*)'), value: '~*' }
]"
/>
</n-form-item>
<n-form-item label="匹配表达式">
<n-form-item :label="$gettext('Match Expression')">
<n-input v-model:value="setting.match" placeholder="/" />
</n-form-item>
<n-form-item label="代理地址">
<n-form-item :label="$gettext('Proxy Address')">
<n-input v-model:value="setting.proxy_pass" placeholder="http://127.0.0.1:3000" />
</n-form-item>
<n-form-item label="发送域名">
<n-form-item :label="$gettext('Send Domain')">
<n-input v-model:value="setting.host" placeholder="$host" />
</n-form-item>
<n-form-item v-if="setting.cache" label="缓存时间">
<n-form-item v-if="setting.cache" :label="$gettext('Cache Time')">
<n-input-number
v-model:value="setting.cache_time"
w-full
:min="1"
:step="1"
:placeholder="'缓存时间(分钟)'"
:placeholder="$gettext('Cache time (minutes)')"
>
<template #suffix> 分钟 </template>
<template #suffix> {{ $gettext('minutes') }} </template>
</n-input-number>
</n-form-item>
<n-form-item label="内容替换">
<n-form-item :label="$gettext('Content Replacement')">
<n-dynamic-input
v-model:value="setting.replace"
preset="pair"
:max="5"
key-placeholder="目标内容"
value-placeholder="替换内容"
:key-placeholder="$gettext('Target content')"
:value-placeholder="$gettext('Replacement content')"
/>
</n-form-item>
</n-form>
<n-button type="info" block @click="handleSubmit"> 提交 </n-button>
<n-button type="info" block @click="handleSubmit"> {{ $gettext('Submit') }} </n-button>
</n-flex>
</n-modal>
</template>

View File

@@ -1,4 +1,5 @@
import type { RouteType } from '~/types/router'
import { $gettext } from '@/utils/gettext'
const Layout = () => import('@/layout/IndexView.vue')
@@ -15,7 +16,7 @@ export default {
path: '',
component: () => import('./IndexView.vue'),
meta: {
title: '网站',
title: $gettext('Websites'),
icon: 'mdi:web',
role: ['admin'],
requireAuth: true
@@ -27,7 +28,7 @@ export default {
component: () => import('./EditView.vue'),
isHidden: true,
meta: {
title: '编辑网站',
title: $gettext('Edit Website'),
icon: 'mdi:web',
role: ['admin'],
requireAuth: true