瀏覽代碼

wip: force theme #40

0xJacky 2 年之前
父節點
當前提交
bc247ffd23

+ 1 - 1
frontend/package.json

@@ -1,7 +1,7 @@
 {
     "name": "nginx-ui-frontend-next",
     "private": true,
-    "version": "1.6.8",
+    "version": "1.7.0",
     "type": "commonjs",
     "scripts": {
         "dev": "vite",

+ 11 - 6
frontend/src/App.vue

@@ -5,17 +5,22 @@ import {useSettingsStore} from '@/pinia'
 import {dark_mode} from '@/lib/theme'
 
 let media = window.matchMedia('(prefers-color-scheme: dark)')
+
 const callback = (media: { matches: any; }) => {
     const settings = useSettingsStore()
-    if (media.matches) {
-        dark_mode(true)
-        settings.set_theme('dark')
-    } else {
-        dark_mode(false)
-        settings.set_theme('default')
+    if (settings.preference_theme === 'auto') {
+        if (media.matches) {
+            dark_mode(true)
+            settings.set_theme('dark')
+        } else {
+            dark_mode(false)
+            settings.set_theme('auto')
+        }
     }
 }
+
 callback(media)
+
 if (typeof media.addEventListener === 'function') {
     media.addEventListener('change', callback)
 } else if (typeof media.addListener === 'function') {

+ 7 - 4
frontend/src/components/FooterToolbar/FooterToolBar.vue

@@ -26,6 +26,13 @@ export default {
 </script>
 
 <style lang="less" scoped>
+.dark {
+    .ant-pro-footer-toolbar {
+        background: rgba(24, 24, 24, 0.62);
+        border-top: unset;
+    }
+}
+
 .ant-pro-footer-toolbar {
     position: fixed;
     width: 100%;
@@ -36,10 +43,6 @@ export default {
     box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03);
     background: #ffffff8c;
     border-top: 1px solid #e8e8e8;
-    @media (prefers-color-scheme: dark) {
-        background: rgba(24, 24, 24, 0.62);
-        border-top: unset;
-    }
     padding: 0 24px;
     z-index: 9;
 

+ 8 - 5
frontend/src/components/Logo/Logo.vue

@@ -10,6 +10,14 @@ import logo from '@/assets/img/logo.png'</script>
 </template>
 
 <style lang="less" scoped>
+.dark {
+    .logo {
+        background-color: transparent;
+        -webkit-box-shadow: 1px 1px 0 0 #404040;
+        box-shadow: 1px 1px 0 0 #404040;
+    }
+}
+
 .logo {
     padding: 8px 25px;
     -webkit-box-shadow: 1px 1px 0 0 #e8e8e8;
@@ -20,11 +28,6 @@ import logo from '@/assets/img/logo.png'</script>
     overflow: hidden;
     display: inline-block;
     background-color: #ffffff;
-    @media (prefers-color-scheme: dark) {
-        background-color: transparent;
-        -webkit-box-shadow: 1px 1px 0 0 #404040;
-        box-shadow: 1px 1px 0 0 #404040;
-    }
 
     img {
         height: 46px;

+ 8 - 5
frontend/src/components/PageHeader/PageHeader.vue

@@ -40,18 +40,21 @@ watch(() => route.name, () => {
 </template>
 
 <style lang="less" scoped>
-.page-header {
-    background: #fff;
-    padding: 16px 32px 0;
-    border-bottom: 1px solid #e8e8e8;
-    @media (prefers-color-scheme: dark) {
+.dark {
+    .page-header {
         background: #28292c !important;
         border-bottom: unset;
+
         h1 {
             color: #fafafa;
         }
     }
+}
 
+.page-header {
+    background: #fff;
+    padding: 16px 32px 0;
+    border-bottom: 1px solid #e8e8e8;
 
     .breadcrumb {
         margin-bottom: 16px;

+ 21 - 26
frontend/src/components/StdDataEntry/components/StdSelector.vue

@@ -79,28 +79,28 @@ const _selectedKey = computed({
                 {{ M_value }}
             </div>
             <a-modal
-                    :mask="false"
-                    :visible="visible"
-                    :cancel-text="$gettext('Cancel')"
-                    :ok-text="$gettext('OK')"
-                    :title="$gettext('Selector')"
-                    @cancel="visible=false"
-                    @ok="ok()"
-                    :width="800"
-                    destroyOnClose
+                :mask="false"
+                :visible="visible"
+                :cancel-text="$gettext('Cancel')"
+                :ok-text="$gettext('OK')"
+                :title="$gettext('Selector')"
+                @cancel="visible=false"
+                @ok="ok()"
+                :width="800"
+                destroyOnClose
             >
                 {{ description }}
                 <std-table
-                        :api="api"
-                        :columns="columns"
-                        :data_key="data_key"
-                        :disable_search="disable_search"
-                        :pithy="true"
-                        :get_params="get_params"
-                        :selectionType="selectionType"
-                        :disable_query_params="true"
-                        @onSelected="onSelect"
-                        @onSelectedRecord="onSelectedRecord"
+                    :api="api"
+                    :columns="columns"
+                    :data_key="data_key"
+                    :disable_search="disable_search"
+                    :pithy="true"
+                    :get_params="get_params"
+                    :selectionType="selectionType"
+                    :disable_query_params="true"
+                    @onSelected="onSelect"
+                    @onSelectedRecord="onSelectedRecord"
                 />
             </a-modal>
         </div>
@@ -108,6 +108,7 @@ const _selectedKey = computed({
 </template>
 
 <style lang="less" scoped>
+.dark .std-selector-container
 .std-selector-container {
     height: 39.9px;
     display: flex;
@@ -132,15 +133,9 @@ const _selectedKey = computed({
         cursor: pointer;
         min-width: 180px;
 
-        @media (prefers-color-scheme: dark) {
-            background-color: #1e1f20;
-            border: 1px solid #666666;
-            color: rgba(255, 255, 255, 0.99);
-        }
-
         .value {
 
         }
     }
 }
-</style>
+</style>

+ 26 - 26
frontend/src/components/StdDataEntry/compontents/StdSelector.vue

@@ -70,28 +70,28 @@ watch(props, () => {
                 {{ M_value }}
             </div>
             <a-modal
-                    :mask="false"
-                    :visible="visible"
-                    :cancel-text="$gettext('Cancel')"
-                    :ok-text="$gettext('OK')"
-                    :title="$gettext('Selector')"
-                    @cancel="visible=false"
-                    @ok="ok()"
-                    :width="800"
-                    destroyOnClose
+                :mask="false"
+                :visible="visible"
+                :cancel-text="$gettext('Cancel')"
+                :ok-text="$gettext('OK')"
+                :title="$gettext('Selector')"
+                @cancel="visible=false"
+                @ok="ok()"
+                :width="800"
+                destroyOnClose
             >
                 {{ description }}
                 <std-table
-                        :api="api"
-                        :columns="columns"
-                        :data_key="data_key"
-                        :disable_search="disable_search"
-                        :pithy="true"
-                        :get_params="get_params"
-                        :selectionType="selectionType"
-                        :disable_query_params="true"
-                        @onSelected="onSelect"
-                        @onSelectedRecord="onSelectedRecord"
+                    :api="api"
+                    :columns="columns"
+                    :data_key="data_key"
+                    :disable_search="disable_search"
+                    :pithy="true"
+                    :get_params="get_params"
+                    :selectionType="selectionType"
+                    :disable_query_params="true"
+                    @onSelected="onSelect"
+                    @onSelectedRecord="onSelectedRecord"
                 />
             </a-modal>
         </div>
@@ -99,6 +99,12 @@ watch(props, () => {
 </template>
 
 <style lang="less" scoped>
+.dark .std-selector-container {
+    background-color: #1e1f20;
+    border: 1px solid #666666;
+    color: rgba(255, 255, 255, 0.99);
+}
+
 .std-selector-container {
     height: 39.9px;
     display: flex;
@@ -123,15 +129,9 @@ watch(props, () => {
         cursor: pointer;
         min-width: 180px;
 
-        @media (prefers-color-scheme: dark) {
-            background-color: #1e1f20;
-            border: 1px solid #666666;
-            color: rgba(255, 255, 255, 0.99);
-        }
-
         .value {
 
         }
     }
 }
-</style>
+</style>

+ 163 - 97
frontend/src/language/en/app.po

@@ -9,21 +9,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/routes/index.ts:116
+#: src/routes/index.ts:125
 msgid "About"
 msgstr "About"
 
-#: src/routes/index.ts:99 src/views/domain/ngx_conf/LogEntry.vue:64
+#: src/routes/index.ts:100 src/views/domain/ngx_conf/LogEntry.vue:64
 msgid "Access Logs"
 msgstr ""
 
-#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:42
+#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
 msgstr "Action"
 
-#: src/components/StdDataDisplay/StdCurd.vue:134
-#: src/components/StdDataDisplay/StdCurd.vue:26
+#: src/components/StdDataDisplay/StdCurd.vue:145
+#: src/components/StdDataDisplay/StdCurd.vue:25
 msgid "Add"
 msgstr ""
 
@@ -33,47 +33,53 @@ msgstr ""
 msgid "Add Directive Below"
 msgstr "Add Directive Below"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:33
-#: src/views/domain/ngx_conf/LocationEditor.vue:48
+#: src/views/domain/ngx_conf/LocationEditor.vue:45
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
+#: src/views/domain/ngx_conf/LocationEditor.vue:51
+#: src/views/domain/ngx_conf/LocationEditor.vue:60
 msgid "Add Location"
 msgstr "Add Location"
 
-#: src/routes/index.ts:55 src/views/domain/DomainAdd.vue:2
+#: src/routes/index.ts:56 src/views/domain/DomainAdd.vue:2
 msgid "Add Site"
 msgstr "Add Site"
 
-#: src/views/domain/DomainEdit.vue:19
+#: src/views/domain/DomainEdit.vue:18 src/views/domain/DomainEdit.vue:19
 msgid "Advance Mode"
 msgstr "Advance Mode"
 
-#: src/components/StdDataDisplay/StdTable.vue:44
-#: src/views/domain/DomainList.vue:27
+#: src/components/StdDataDisplay/StdTable.vue:54
+#: src/views/domain/DomainList.vue:26
 #, fuzzy
-msgid "Are you sure you want to delete ?"
+msgid "Are you sure you want to delete?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:15
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:27
 msgid "Are you sure you want to remove this directive?"
 msgstr "Are you sure you want to remove this directive?"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:9
+#: src/views/domain/ngx_conf/LocationEditor.vue:19
 #, fuzzy
 msgid "Are you sure you want to remove this location?"
 msgstr "Are you sure you want to remove this directive?"
 
+#: src/views/preference/Preference.vue:7 src/views/preference/Preference.vue:8
+msgid "Auto"
+msgstr ""
+
 #: src/views/nginx_log/NginxLog.vue:4
 msgid "Auto Refresh"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:78
+#: src/views/domain/cert/IssueCert.vue:72
 msgid "Auto-renewal disabled for %{name}"
 msgstr "Auto-renewal disabled for %{name}"
 
-#: src/views/domain/cert/IssueCert.vue:72
+#: src/views/domain/cert/IssueCert.vue:66
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Auto-renewal enabled for %{name}"
 
-#: src/views/domain/DomainEdit.vue:178 src/views/nginx_log/NginxLog.vue:172
+#: src/views/domain/DomainEdit.vue:187 src/views/nginx_log/NginxLog.vue:173
 msgid "Back"
 msgstr "Back"
 
@@ -86,15 +92,25 @@ msgstr "Back"
 msgid "Base information"
 msgstr "Base information"
 
-#: src/views/domain/DomainEdit.vue:22
+#: src/views/domain/DomainEdit.vue:21 src/views/domain/DomainEdit.vue:22
 msgid "Basic Mode"
 msgstr "Basic Mode"
 
+#: src/components/StdDataDisplay/StdBatchEdit.vue:5
+#: src/components/StdDataDisplay/StdTable.vue:12
+#: src/components/StdDataDisplay/StdTable.vue:13
+#: src/components/StdDataDisplay/StdTable.vue:18
+#, fuzzy
+msgid "Batch Modify"
+msgstr "Modify Config"
+
 #: src/views/other/About.vue:21
 msgid "Build with"
 msgstr "Build with"
 
-#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdBatchEdit.vue:7
+#: src/components/StdDataDisplay/StdCurd.vue:27
+#: src/components/StdDataEntry/components/StdSelector.vue:11
 #: src/components/StdDataEntry/compontents/StdSelector.vue:11
 #: src/views/config/ConfigEdit.vue:49
 msgid "Cancel"
@@ -112,9 +128,9 @@ msgstr "Certificate is valid"
 msgid "Certificate Status"
 msgstr "Certificate Status"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
-#: src/views/domain/ngx_conf/LocationEditor.vue:21
-#: src/views/domain/ngx_conf/LocationEditor.vue:35
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:31
+#: src/views/domain/ngx_conf/LocationEditor.vue:47
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:175
 msgid "Comments"
 msgstr "Comments"
@@ -131,8 +147,8 @@ msgstr "Configurations"
 msgid "Configure SSL"
 msgstr "Configure SSL"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:27
-#: src/views/domain/ngx_conf/LocationEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:37
+#: src/views/domain/ngx_conf/LocationEditor.vue:53
 msgid "Content"
 msgstr "Content"
 
@@ -156,7 +172,12 @@ msgstr "Created at"
 msgid "Creating client facilitates communication with the CA server"
 msgstr ""
 
-#: src/routes/index.ts:27
+#: src/views/preference/Preference.vue:13
+#: src/views/preference/Preference.vue:14
+msgid "Dark"
+msgstr ""
+
+#: src/routes/index.ts:28
 msgid "Dashboard"
 msgstr "Dashboard"
 
@@ -164,16 +185,16 @@ msgstr "Dashboard"
 msgid "Database (Optional, default: database)"
 msgstr "Database (Optional, default: database)"
 
-#: src/components/StdDataDisplay/StdTable.vue:366
-#: src/views/domain/DomainList.vue:111
+#: src/components/StdDataDisplay/StdTable.vue:527
+#: src/views/domain/DomainList.vue:115
 msgid "Delete"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:120
+#: src/components/StdDataDisplay/StdTable.vue:132
 msgid "Delete ID: %{id}"
 msgstr ""
 
-#: src/views/domain/DomainList.vue:76
+#: src/views/domain/DomainList.vue:81
 msgid "Delete site: %{site_name}"
 msgstr ""
 
@@ -185,20 +206,23 @@ msgstr "Development Mode"
 msgid "Directive"
 msgstr "Directive"
 
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:1
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:2
 msgid "Directives"
 msgstr "Directives"
 
-#: src/views/domain/cert/IssueCert.vue:80
+#: src/views/domain/cert/IssueCert.vue:74
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "Disable auto-renewal failed for %{name}"
 
-#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainList.vue:17
-#: src/views/domain/DomainList.vue:29
+#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:9
+#: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
+#: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
+#: src/views/domain/DomainList.vue:9
 msgid "Disabled"
 msgstr "Disabled"
 
-#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:118 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
 
@@ -210,15 +234,15 @@ msgstr "Disk IO"
 msgid "Domain Config Created Successfully"
 msgstr "Domain Config Created Successfully"
 
-#: src/views/domain/DomainEdit.vue:5
+#: src/views/domain/DomainEdit.vue:4 src/views/domain/DomainEdit.vue:5
 msgid "Edit %{n}"
 msgstr "Edit %{n}"
 
-#: src/routes/index.ts:77 src/views/config/ConfigEdit.vue:2
+#: src/routes/index.ts:78 src/views/config/ConfigEdit.vue:2
 msgid "Edit Configuration"
 msgstr "Edit Configuration"
 
-#: src/routes/index.ts:59
+#: src/routes/index.ts:60
 msgid "Edit Site"
 msgstr "Edit Site"
 
@@ -226,7 +250,7 @@ msgstr "Edit Site"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/domain/cert/IssueCert.vue:74
+#: src/views/domain/cert/IssueCert.vue:68
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "Enable auto-renewal failed for %{name}"
 
@@ -238,14 +262,15 @@ msgstr "Enable failed"
 msgid "Enable TLS"
 msgstr "Enable TLS"
 
-#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:7
-#: src/views/domain/DomainList.vue:12 src/views/domain/DomainList.vue:20
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:6
+#: src/views/domain/DomainEdit.vue:7 src/views/domain/DomainList.vue:10
+#: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
+#: src/views/domain/DomainList.vue:19 src/views/domain/DomainList.vue:31
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
-#: src/views/domain/DomainList.vue:54
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:109
+#: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "Enabled successfully"
 
@@ -253,7 +278,7 @@ msgstr "Enabled successfully"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "Encrypt website with Let's Encrypt"
 
-#: src/routes/index.ts:103 src/views/domain/ngx_conf/LogEntry.vue:68
+#: src/routes/index.ts:104 src/views/domain/ngx_conf/LogEntry.vue:68
 msgid "Error Logs"
 msgstr ""
 
@@ -262,15 +287,17 @@ msgid "Expiration Date: %{date}"
 msgstr "Expiration Date: %{date}"
 
 #: src/components/StdDataDisplay/StdTable.vue:12
-#: src/components/StdDataDisplay/StdTable.vue:317
+#: src/components/StdDataDisplay/StdTable.vue:362
+#: src/components/StdDataDisplay/StdTable.vue:6
+#: src/components/StdDataDisplay/StdTable.vue:7
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:121 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
-#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 
@@ -290,6 +317,7 @@ msgstr ""
 msgid "Finished"
 msgstr "Finished"
 
+#: src/components/StdDataEntry/components/StdPassword.vue:42
 #: src/components/StdDataEntry/compontents/StdPassword.vue:42
 msgid "Generate"
 msgstr ""
@@ -298,15 +326,15 @@ msgstr ""
 msgid "Generating private key for registering account"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:103
+#: src/views/domain/cert/IssueCert.vue:97
 msgid "Getting the certificate, please wait..."
 msgstr "Getting the certificate, please wait..."
 
-#: src/routes/index.ts:20
+#: src/routes/index.ts:21
 msgid "Home"
 msgstr "Home"
 
-#: src/routes/index.ts:126 src/views/other/Install.vue:128
+#: src/routes/index.ts:135 src/views/other/Install.vue:128
 msgid "Install"
 msgstr "Install"
 
@@ -328,19 +356,26 @@ msgstr "Enabled successfully"
 msgid "Leave blank for no change"
 msgstr "Leave blank for no change"
 
+#: src/views/preference/Preference.vue:10
+#: src/views/preference/Preference.vue:11
+msgid "Light"
+msgstr ""
+
 #: src/views/dashboard/DashBoard.vue:141
 msgid "Load Averages:"
 msgstr "Load Averages:"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:5
+#: src/views/domain/ngx_conf/LocationEditor.vue:15
+#: src/views/domain/ngx_conf/LocationEditor.vue:8
+#: src/views/domain/ngx_conf/LocationEditor.vue:9
 msgid "Location"
 msgstr "Location"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:39
+#: src/views/domain/ngx_conf/LocationEditor.vue:40
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:132 src/views/other/Login.vue:103
+#: src/routes/index.ts:141 src/views/other/Login.vue:103
 msgid "Login"
 msgstr "Login"
 
@@ -352,7 +387,7 @@ msgstr "Login successful"
 msgid "Logout successful"
 msgstr "Logout successful"
 
-#: src/views/domain/cert/IssueCert.vue:226
+#: src/views/domain/cert/IssueCert.vue:209
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort (default: 9180) before getting the certificate."
@@ -360,15 +395,15 @@ msgstr ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort (default: 9180) before getting the certificate."
 
-#: src/routes/index.ts:68
+#: src/routes/index.ts:69
 msgid "Manage Configs"
 msgstr "Manage Configs"
 
-#: src/routes/index.ts:43 src/views/domain/DomainList.vue:2
+#: src/routes/index.ts:44 src/views/domain/DomainList.vue:2
 msgid "Manage Sites"
 msgstr "Manage Sites"
 
-#: src/routes/index.ts:35 src/views/user/User.vue:2
+#: src/routes/index.ts:36 src/views/user/User.vue:2
 msgid "Manage Users"
 msgstr "Manage Users"
 
@@ -380,12 +415,12 @@ msgstr "Memory"
 msgid "Memory and Storage"
 msgstr "Memory and Storage"
 
-#: src/components/StdDataDisplay/StdCurd.vue:26
-#: src/components/StdDataDisplay/StdTable.vue:18
-#: src/components/StdDataDisplay/StdTable.vue:19
-#: src/components/StdDataDisplay/StdTable.vue:24
-#: src/components/StdDataDisplay/StdTable.vue:34
-#: src/components/StdDataDisplay/StdTable.vue:36
+#: src/components/StdDataDisplay/StdCurd.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:26
+#: src/components/StdDataDisplay/StdTable.vue:31
+#: src/components/StdDataDisplay/StdTable.vue:44
+#: src/components/StdDataDisplay/StdTable.vue:46
 #, fuzzy
 msgid "Modify"
 msgstr "Modify Config"
@@ -394,7 +429,8 @@ msgstr "Modify Config"
 msgid "Modify Config"
 msgstr "Modify Config"
 
-#: src/views/config/Config.vue:12 src/views/domain/DomainList.vue:14
+#: src/views/config/Config.vue:12 src/views/domain/DomainEdit.vue:36
+#: src/views/domain/DomainList.vue:15
 msgid "Name"
 msgstr "Name"
 
@@ -418,18 +454,18 @@ msgstr "Network Total Send"
 msgid "Next"
 msgstr "Next"
 
-#: src/routes/index.ts:93 src/views/nginx_log/NginxLog.vue:2
+#: src/routes/index.ts:94 src/views/nginx_log/NginxLog.vue:2
 msgid "Nginx Log"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:42
-#: src/views/domain/DomainList.vue:25
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:17
-#: src/views/domain/ngx_conf/LocationEditor.vue:11
+#: src/components/StdDataDisplay/StdTable.vue:52
+#: src/views/domain/DomainList.vue:24
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
+#: src/views/domain/ngx_conf/LocationEditor.vue:21
 msgid "No"
 msgstr "No"
 
-#: src/routes/index.ts:138 src/routes/index.ts:140
+#: src/routes/index.ts:147 src/routes/index.ts:149
 msgid "Not Found"
 msgstr "Not Found"
 
@@ -437,7 +473,7 @@ msgstr "Not Found"
 msgid "Not Valid Before: %{date}"
 msgstr "Not Valid Before: %{date}"
 
-#: src/views/domain/cert/IssueCert.vue:218
+#: src/views/domain/cert/IssueCert.vue:201
 msgid ""
 "Note: The server_name in the current configuration must be the domain name "
 "you need to get the certificate."
@@ -449,10 +485,12 @@ msgstr ""
 msgid "Obtaining certificate"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:29
-#: src/components/StdDataDisplay/StdTable.vue:43
+#: src/components/StdDataDisplay/StdBatchEdit.vue:8
+#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdTable.vue:53
+#: src/components/StdDataEntry/components/StdSelector.vue:12
 #: src/components/StdDataEntry/compontents/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainList.vue:25
 msgid "OK"
 msgstr ""
 
@@ -472,8 +510,8 @@ msgstr "Password"
 msgid "Password (*)"
 msgstr "Password (*)"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:24
-#: src/views/domain/ngx_conf/LocationEditor.vue:38
+#: src/views/domain/ngx_conf/LocationEditor.vue:34
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
 msgid "Path"
 msgstr "Path"
 
@@ -489,6 +527,10 @@ msgstr "Please input your password!"
 msgid "Please input your username!"
 msgstr "Please input your username!"
 
+#: src/routes/index.ts:117 src/views/preference/Preference.vue:2
+msgid "Preference"
+msgstr ""
+
 #: src/language/constants.ts:12
 #, fuzzy
 msgid "Preparing lego configurations"
@@ -522,11 +564,15 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
+#: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
+#: src/components/StdDataDisplay/StdTable.vue:9
 msgid "Reset"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:190
+#: src/views/preference/Preference.vue:22
+#: src/views/preference/Preference.vue:23
 msgid "Save"
 msgstr "Save"
 
@@ -540,16 +586,22 @@ msgstr "Save Directive"
 msgid "Save error %{msg}"
 msgstr "Save error %{msg}"
 
-#: src/components/StdDataDisplay/StdCurd.vue:102
+#: src/components/StdDataDisplay/StdBatchEdit.vue:40
+#, fuzzy
+msgid "Save successfully"
+msgstr "Saved successfully"
+
+#: src/components/StdDataDisplay/StdCurd.vue:108
 #, fuzzy
 msgid "Save Successfully"
 msgstr "Saved successfully"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:91
+#: src/views/domain/DomainEdit.vue:97
 msgid "Saved successfully"
 msgstr "Saved successfully"
 
+#: src/components/StdDataEntry/components/StdSelector.vue:13
 #: src/components/StdDataEntry/compontents/StdSelector.vue:13
 msgid "Selector"
 msgstr ""
@@ -558,11 +610,13 @@ msgstr ""
 msgid "Send"
 msgstr "Send"
 
-#: src/components/StdDataDisplay/StdTable.vue:140
-#: src/components/StdDataDisplay/StdTable.vue:298
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
-#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
-#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
+#: src/components/StdDataDisplay/StdBatchEdit.vue:43
+#: src/components/StdDataDisplay/StdTable.vue:168
+#: src/components/StdDataDisplay/StdTable.vue:343
+#: src/components/StdDataDisplay/StdTable.vue:463
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:100
+#: src/views/domain/DomainEdit.vue:62 src/views/domain/DomainEdit.vue:74
+#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "Server error"
@@ -575,29 +629,25 @@ msgstr "Server Info"
 msgid "server_name not found in directives"
 msgstr "server_name not found in directives"
 
-#: src/views/domain/cert/IssueCert.vue:209 src/views/domain/DomainAdd.vue:112
+#: src/views/domain/cert/IssueCert.vue:195 src/views/domain/DomainAdd.vue:112
 msgid "server_name parameter is required"
 msgstr "server_name parameter is required"
 
-#: src/views/domain/cert/IssueCert.vue:212
-#: src/views/domain/cert/IssueCert.vue:35
-msgid "server_name parameters more than one"
-msgstr "server_name parameters more than one"
-
+#: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:6
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:7
 msgid "Single Directive"
 msgstr "Single Directive"
 
-#: src/routes/index.ts:107
+#: src/routes/index.ts:108
 #, fuzzy
 msgid "Site Logs"
 msgstr "Sites List"
 
-#: src/routes/index.ts:51
+#: src/routes/index.ts:52
 msgid "Sites List"
 msgstr "Sites List"
 
-#: src/views/domain/DomainList.vue:19
+#: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "Status"
 
@@ -618,11 +668,11 @@ msgstr "Swap"
 msgid "Table"
 msgstr "Enabled"
 
-#: src/routes/index.ts:85 src/views/pty/Terminal.vue:2
+#: src/routes/index.ts:86 src/views/pty/Terminal.vue:2
 msgid "Terminal"
 msgstr "Terminal"
 
-#: src/views/domain/cert/IssueCert.vue:222
+#: src/views/domain/cert/IssueCert.vue:205
 msgid ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
@@ -638,11 +688,20 @@ msgstr "The filename cannot contain the following characters: %{c}"
 msgid "The username or password is incorrect"
 msgstr ""
 
-#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:36
+#: src/views/preference/Preference.vue:5
+msgid "Theme"
+msgstr ""
+
+#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "Updated at"
 
+#: src/components/StdDataDisplay/StdTable.vue:461
+#, fuzzy
+msgid "Updated successfully"
+msgstr "Saved successfully"
+
 #: src/views/dashboard/DashBoard.vue:137
 msgid "Uptime:"
 msgstr "Uptime:"
@@ -676,8 +735,8 @@ msgstr ""
 msgid "Writing certificate to disk"
 msgstr ""
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
-#: src/views/domain/ngx_conf/LocationEditor.vue:10
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:28
+#: src/views/domain/ngx_conf/LocationEditor.vue:20
 msgid "Yes"
 msgstr "Yes"
 
@@ -686,6 +745,13 @@ msgctxt "Project"
 msgid "License"
 msgstr "License"
 
+#, fuzzy
+#~ msgid "Are you sure you want to delete ?"
+#~ msgstr "Are you sure you want to remove this directive?"
+
+#~ msgid "server_name parameters more than one"
+#~ msgstr "server_name parameters more than one"
+
 #~ msgid "404 Not Found"
 #~ msgstr "404 Not Found"
 

+ 165 - 100
frontend/src/language/messages.pot

@@ -2,23 +2,23 @@ msgid ""
 msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 
-#: src/routes/index.ts:116
+#: src/routes/index.ts:125
 msgid "About"
 msgstr ""
 
-#: src/routes/index.ts:99
+#: src/routes/index.ts:100
 #: src/views/domain/ngx_conf/LogEntry.vue:64
 msgid "Access Logs"
 msgstr ""
 
 #: src/views/config/Config.vue:24
-#: src/views/domain/DomainList.vue:42
+#: src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:134
-#: src/components/StdDataDisplay/StdCurd.vue:26
+#: src/components/StdDataDisplay/StdCurd.vue:145
+#: src/components/StdDataDisplay/StdCurd.vue:25
 msgid "Add"
 msgstr ""
 
@@ -28,47 +28,55 @@ msgstr ""
 msgid "Add Directive Below"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:33
-#: src/views/domain/ngx_conf/LocationEditor.vue:48
+#: src/views/domain/ngx_conf/LocationEditor.vue:45
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
+#: src/views/domain/ngx_conf/LocationEditor.vue:51
+#: src/views/domain/ngx_conf/LocationEditor.vue:60
 msgid "Add Location"
 msgstr ""
 
-#: src/routes/index.ts:55
+#: src/routes/index.ts:56
 #: src/views/domain/DomainAdd.vue:2
 msgid "Add Site"
 msgstr ""
 
+#: src/views/domain/DomainEdit.vue:18
 #: src/views/domain/DomainEdit.vue:19
 msgid "Advance Mode"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:44
-#: src/views/domain/DomainList.vue:27
-msgid "Are you sure you want to delete ?"
+#: src/components/StdDataDisplay/StdTable.vue:54
+#: src/views/domain/DomainList.vue:26
+msgid "Are you sure you want to delete?"
 msgstr ""
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:15
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:27
 msgid "Are you sure you want to remove this directive?"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:9
+#: src/views/domain/ngx_conf/LocationEditor.vue:19
 msgid "Are you sure you want to remove this location?"
 msgstr ""
 
+#: src/views/preference/Preference.vue:7
+#: src/views/preference/Preference.vue:8
+msgid "Auto"
+msgstr ""
+
 #: src/views/nginx_log/NginxLog.vue:4
 msgid "Auto Refresh"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:78
+#: src/views/domain/cert/IssueCert.vue:72
 msgid "Auto-renewal disabled for %{name}"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:72
+#: src/views/domain/cert/IssueCert.vue:66
 msgid "Auto-renewal enabled for %{name}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:178
-#: src/views/nginx_log/NginxLog.vue:172
+#: src/views/domain/DomainEdit.vue:187
+#: src/views/nginx_log/NginxLog.vue:173
 msgid "Back"
 msgstr ""
 
@@ -80,15 +88,25 @@ msgstr ""
 msgid "Base information"
 msgstr ""
 
+#: src/views/domain/DomainEdit.vue:21
 #: src/views/domain/DomainEdit.vue:22
 msgid "Basic Mode"
 msgstr ""
 
+#: src/components/StdDataDisplay/StdBatchEdit.vue:5
+#: src/components/StdDataDisplay/StdTable.vue:12
+#: src/components/StdDataDisplay/StdTable.vue:13
+#: src/components/StdDataDisplay/StdTable.vue:18
+msgid "Batch Modify"
+msgstr ""
+
 #: src/views/other/About.vue:21
 msgid "Build with"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdBatchEdit.vue:7
+#: src/components/StdDataDisplay/StdCurd.vue:27
+#: src/components/StdDataEntry/components/StdSelector.vue:11
 #: src/components/StdDataEntry/compontents/StdSelector.vue:11
 #: src/views/config/ConfigEdit.vue:49
 msgid "Cancel"
@@ -106,9 +124,9 @@ msgstr ""
 msgid "Certificate Status"
 msgstr ""
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
-#: src/views/domain/ngx_conf/LocationEditor.vue:21
-#: src/views/domain/ngx_conf/LocationEditor.vue:35
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:31
+#: src/views/domain/ngx_conf/LocationEditor.vue:47
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:175
 msgid "Comments"
 msgstr ""
@@ -125,8 +143,8 @@ msgstr ""
 msgid "Configure SSL"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:27
-#: src/views/domain/ngx_conf/LocationEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:37
+#: src/views/domain/ngx_conf/LocationEditor.vue:53
 msgid "Content"
 msgstr ""
 
@@ -150,7 +168,12 @@ msgstr ""
 msgid "Creating client facilitates communication with the CA server"
 msgstr ""
 
-#: src/routes/index.ts:27
+#: src/views/preference/Preference.vue:13
+#: src/views/preference/Preference.vue:14
+msgid "Dark"
+msgstr ""
+
+#: src/routes/index.ts:28
 msgid "Dashboard"
 msgstr ""
 
@@ -158,16 +181,16 @@ msgstr ""
 msgid "Database (Optional, default: database)"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:366
-#: src/views/domain/DomainList.vue:111
+#: src/components/StdDataDisplay/StdTable.vue:527
+#: src/views/domain/DomainList.vue:115
 msgid "Delete"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:120
+#: src/components/StdDataDisplay/StdTable.vue:132
 msgid "Delete ID: %{id}"
 msgstr ""
 
-#: src/views/domain/DomainList.vue:76
+#: src/views/domain/DomainList.vue:81
 msgid "Delete site: %{site_name}"
 msgstr ""
 
@@ -180,22 +203,27 @@ msgstr ""
 msgid "Directive"
 msgstr ""
 
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:1
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:2
 msgid "Directives"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:80
+#: src/views/domain/cert/IssueCert.vue:74
 msgid "Disable auto-renewal failed for %{name}"
 msgstr ""
 
 #: src/views/domain/DomainEdit.vue:10
-#: src/views/domain/DomainList.vue:17
-#: src/views/domain/DomainList.vue:29
+#: src/views/domain/DomainEdit.vue:9
+#: src/views/domain/DomainList.vue:16
+#: src/views/domain/DomainList.vue:34
+#: src/views/domain/DomainList.vue:7
+#: src/views/domain/DomainList.vue:8
+#: src/views/domain/DomainList.vue:9
 msgid "Disabled"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:112
-#: src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:118
+#: src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr ""
 
@@ -207,16 +235,17 @@ msgstr ""
 msgid "Domain Config Created Successfully"
 msgstr ""
 
+#: src/views/domain/DomainEdit.vue:4
 #: src/views/domain/DomainEdit.vue:5
 msgid "Edit %{n}"
 msgstr ""
 
-#: src/routes/index.ts:77
+#: src/routes/index.ts:78
 #: src/views/config/ConfigEdit.vue:2
 msgid "Edit Configuration"
 msgstr ""
 
-#: src/routes/index.ts:59
+#: src/routes/index.ts:60
 msgid "Edit Site"
 msgstr ""
 
@@ -224,7 +253,7 @@ msgstr ""
 msgid "Email (*)"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:74
+#: src/views/domain/cert/IssueCert.vue:68
 msgid "Enable auto-renewal failed for %{name}"
 msgstr ""
 
@@ -237,16 +266,19 @@ msgid "Enable TLS"
 msgstr ""
 
 #: src/views/domain/DomainEdit.vue:33
+#: src/views/domain/DomainEdit.vue:6
 #: src/views/domain/DomainEdit.vue:7
+#: src/views/domain/DomainList.vue:10
+#: src/views/domain/DomainList.vue:11
 #: src/views/domain/DomainList.vue:12
-#: src/views/domain/DomainList.vue:20
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainList.vue:19
+#: src/views/domain/DomainList.vue:31
 msgid "Enabled"
 msgstr ""
 
 #: src/views/domain/DomainAdd.vue:46
-#: src/views/domain/DomainEdit.vue:103
-#: src/views/domain/DomainList.vue:54
+#: src/views/domain/DomainEdit.vue:109
+#: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr ""
 
@@ -254,7 +286,7 @@ msgstr ""
 msgid "Encrypt website with Let's Encrypt"
 msgstr ""
 
-#: src/routes/index.ts:103
+#: src/routes/index.ts:104
 #: src/views/domain/ngx_conf/LogEntry.vue:68
 msgid "Error Logs"
 msgstr ""
@@ -264,17 +296,19 @@ msgid "Expiration Date: %{date}"
 msgstr ""
 
 #: src/components/StdDataDisplay/StdTable.vue:12
-#: src/components/StdDataDisplay/StdTable.vue:317
+#: src/components/StdDataDisplay/StdTable.vue:362
+#: src/components/StdDataDisplay/StdTable.vue:6
+#: src/components/StdDataDisplay/StdTable.vue:7
 msgid "Export"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:115
-#: src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:121
+#: src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:106
-#: src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:112
+#: src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr ""
 
@@ -296,6 +330,7 @@ msgstr ""
 msgid "Finished"
 msgstr ""
 
+#: src/components/StdDataEntry/components/StdPassword.vue:42
 #: src/components/StdDataEntry/compontents/StdPassword.vue:42
 msgid "Generate"
 msgstr ""
@@ -304,15 +339,15 @@ msgstr ""
 msgid "Generating private key for registering account"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:103
+#: src/views/domain/cert/IssueCert.vue:97
 msgid "Getting the certificate, please wait..."
 msgstr ""
 
-#: src/routes/index.ts:20
+#: src/routes/index.ts:21
 msgid "Home"
 msgstr ""
 
-#: src/routes/index.ts:126
+#: src/routes/index.ts:135
 #: src/views/other/Install.vue:128
 msgid "Install"
 msgstr ""
@@ -333,19 +368,26 @@ msgstr ""
 msgid "Leave blank for no change"
 msgstr ""
 
+#: src/views/preference/Preference.vue:10
+#: src/views/preference/Preference.vue:11
+msgid "Light"
+msgstr ""
+
 #: src/views/dashboard/DashBoard.vue:141
 msgid "Load Averages:"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:5
+#: src/views/domain/ngx_conf/LocationEditor.vue:15
+#: src/views/domain/ngx_conf/LocationEditor.vue:8
+#: src/views/domain/ngx_conf/LocationEditor.vue:9
 msgid "Location"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:39
+#: src/views/domain/ngx_conf/LocationEditor.vue:40
 msgid "Locations"
 msgstr ""
 
-#: src/routes/index.ts:132
+#: src/routes/index.ts:141
 #: src/views/other/Login.vue:103
 msgid "Login"
 msgstr ""
@@ -358,20 +400,20 @@ msgstr ""
 msgid "Logout successful"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:226
+#: src/views/domain/cert/IssueCert.vue:209
 msgid "Make sure you have configured a reverse proxy for .well-known directory to HTTPChallengePort (default: 9180) before getting the certificate."
 msgstr ""
 
-#: src/routes/index.ts:68
+#: src/routes/index.ts:69
 msgid "Manage Configs"
 msgstr ""
 
-#: src/routes/index.ts:43
+#: src/routes/index.ts:44
 #: src/views/domain/DomainList.vue:2
 msgid "Manage Sites"
 msgstr ""
 
-#: src/routes/index.ts:35
+#: src/routes/index.ts:36
 #: src/views/user/User.vue:2
 msgid "Manage Users"
 msgstr ""
@@ -384,12 +426,12 @@ msgstr ""
 msgid "Memory and Storage"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:26
-#: src/components/StdDataDisplay/StdTable.vue:18
-#: src/components/StdDataDisplay/StdTable.vue:19
-#: src/components/StdDataDisplay/StdTable.vue:24
-#: src/components/StdDataDisplay/StdTable.vue:34
-#: src/components/StdDataDisplay/StdTable.vue:36
+#: src/components/StdDataDisplay/StdCurd.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:26
+#: src/components/StdDataDisplay/StdTable.vue:31
+#: src/components/StdDataDisplay/StdTable.vue:44
+#: src/components/StdDataDisplay/StdTable.vue:46
 msgid "Modify"
 msgstr ""
 
@@ -398,7 +440,8 @@ msgid "Modify Config"
 msgstr ""
 
 #: src/views/config/Config.vue:12
-#: src/views/domain/DomainList.vue:14
+#: src/views/domain/DomainEdit.vue:36
+#: src/views/domain/DomainList.vue:15
 msgid "Name"
 msgstr ""
 
@@ -422,20 +465,20 @@ msgstr ""
 msgid "Next"
 msgstr ""
 
-#: src/routes/index.ts:93
+#: src/routes/index.ts:94
 #: src/views/nginx_log/NginxLog.vue:2
 msgid "Nginx Log"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:42
-#: src/views/domain/DomainList.vue:25
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:17
-#: src/views/domain/ngx_conf/LocationEditor.vue:11
+#: src/components/StdDataDisplay/StdTable.vue:52
+#: src/views/domain/DomainList.vue:24
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
+#: src/views/domain/ngx_conf/LocationEditor.vue:21
 msgid "No"
 msgstr ""
 
-#: src/routes/index.ts:138
-#: src/routes/index.ts:140
+#: src/routes/index.ts:147
+#: src/routes/index.ts:149
 msgid "Not Found"
 msgstr ""
 
@@ -443,7 +486,7 @@ msgstr ""
 msgid "Not Valid Before: %{date}"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:218
+#: src/views/domain/cert/IssueCert.vue:201
 msgid "Note: The server_name in the current configuration must be the domain name you need to get the certificate."
 msgstr ""
 
@@ -452,10 +495,12 @@ msgstr ""
 msgid "Obtaining certificate"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:29
-#: src/components/StdDataDisplay/StdTable.vue:43
+#: src/components/StdDataDisplay/StdBatchEdit.vue:8
+#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdTable.vue:53
+#: src/components/StdDataEntry/components/StdSelector.vue:12
 #: src/components/StdDataEntry/compontents/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainList.vue:25
 msgid "OK"
 msgstr ""
 
@@ -476,8 +521,8 @@ msgstr ""
 msgid "Password (*)"
 msgstr ""
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:24
-#: src/views/domain/ngx_conf/LocationEditor.vue:38
+#: src/views/domain/ngx_conf/LocationEditor.vue:34
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
 msgid "Path"
 msgstr ""
 
@@ -495,6 +540,11 @@ msgstr ""
 msgid "Please input your username!"
 msgstr ""
 
+#: src/routes/index.ts:117
+#: src/views/preference/Preference.vue:2
+msgid "Preference"
+msgstr ""
+
 #: src/language/constants.ts:12
 msgid "Preparing lego configurations"
 msgstr ""
@@ -528,12 +578,16 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
+#: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
+#: src/components/StdDataDisplay/StdTable.vue:9
 msgid "Reset"
 msgstr ""
 
 #: src/views/config/ConfigEdit.vue:52
-#: src/views/domain/DomainEdit.vue:181
+#: src/views/domain/DomainEdit.vue:190
+#: src/views/preference/Preference.vue:22
+#: src/views/preference/Preference.vue:23
 msgid "Save"
 msgstr ""
 
@@ -548,16 +602,21 @@ msgstr ""
 msgid "Save error %{msg}"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdCurd.vue:102
+#: src/components/StdDataDisplay/StdBatchEdit.vue:40
+msgid "Save successfully"
+msgstr ""
+
+#: src/components/StdDataDisplay/StdCurd.vue:108
 msgid "Save Successfully"
 msgstr ""
 
 #: src/views/config/ConfigEdit.vue:34
 #: src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:91
+#: src/views/domain/DomainEdit.vue:97
 msgid "Saved successfully"
 msgstr ""
 
+#: src/components/StdDataEntry/components/StdSelector.vue:13
 #: src/components/StdDataEntry/compontents/StdSelector.vue:13
 msgid "Selector"
 msgstr ""
@@ -567,14 +626,16 @@ msgstr ""
 msgid "Send"
 msgstr ""
 
-#: src/components/StdDataDisplay/StdTable.vue:140
-#: src/components/StdDataDisplay/StdTable.vue:298
+#: src/components/StdDataDisplay/StdBatchEdit.vue:43
+#: src/components/StdDataDisplay/StdTable.vue:168
+#: src/components/StdDataDisplay/StdTable.vue:343
+#: src/components/StdDataDisplay/StdTable.vue:463
 #: src/views/config/ConfigEdit.vue:22
-#: src/views/domain/DomainEdit.vue:56
-#: src/views/domain/DomainEdit.vue:68
-#: src/views/domain/DomainEdit.vue:77
-#: src/views/domain/DomainEdit.vue:94
-#: src/views/domain/DomainList.vue:78
+#: src/views/domain/DomainEdit.vue:100
+#: src/views/domain/DomainEdit.vue:62
+#: src/views/domain/DomainEdit.vue:74
+#: src/views/domain/DomainEdit.vue:83
+#: src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr ""
@@ -587,29 +648,25 @@ msgstr ""
 msgid "server_name not found in directives"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:209
+#: src/views/domain/cert/IssueCert.vue:195
 #: src/views/domain/DomainAdd.vue:112
 msgid "server_name parameter is required"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:212
-#: src/views/domain/cert/IssueCert.vue:35
-msgid "server_name parameters more than one"
-msgstr ""
-
+#: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:6
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:7
 msgid "Single Directive"
 msgstr ""
 
-#: src/routes/index.ts:107
+#: src/routes/index.ts:108
 msgid "Site Logs"
 msgstr ""
 
-#: src/routes/index.ts:51
+#: src/routes/index.ts:52
 msgid "Sites List"
 msgstr ""
 
-#: src/views/domain/DomainList.vue:19
+#: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr ""
 
@@ -629,12 +686,12 @@ msgstr ""
 msgid "Table"
 msgstr ""
 
-#: src/routes/index.ts:85
+#: src/routes/index.ts:86
 #: src/views/pty/Terminal.vue:2
 msgid "Terminal"
 msgstr ""
 
-#: src/views/domain/cert/IssueCert.vue:222
+#: src/views/domain/cert/IssueCert.vue:205
 msgid "The certificate for the domain will be checked every hour, and will be renewed if it has been more than 1 month since it was last issued."
 msgstr ""
 
@@ -646,12 +703,20 @@ msgstr ""
 msgid "The username or password is incorrect"
 msgstr ""
 
+#: src/views/preference/Preference.vue:5
+msgid "Theme"
+msgstr ""
+
 #: src/views/config/Config.vue:17
-#: src/views/domain/DomainList.vue:36
+#: src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
 msgstr ""
 
+#: src/components/StdDataDisplay/StdTable.vue:461
+msgid "Updated successfully"
+msgstr ""
+
 #: src/views/dashboard/DashBoard.vue:137
 msgid "Uptime:"
 msgstr ""
@@ -688,8 +753,8 @@ msgstr ""
 msgid "Writing certificate to disk"
 msgstr ""
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
-#: src/views/domain/ngx_conf/LocationEditor.vue:10
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:28
+#: src/views/domain/ngx_conf/LocationEditor.vue:20
 msgid "Yes"
 msgstr ""
 

File diff suppressed because it is too large
+ 0 - 0
frontend/src/language/translations.json


二進制
frontend/src/language/zh_CN/app.mo


+ 163 - 101
frontend/src/language/zh_CN/app.po

@@ -10,23 +10,23 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: easygettext\n"
-"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Poedit 3.2.2\n"
 
-#: src/routes/index.ts:116
+#: src/routes/index.ts:125
 msgid "About"
 msgstr "关于"
 
-#: src/routes/index.ts:99 src/views/domain/ngx_conf/LogEntry.vue:64
+#: src/routes/index.ts:100 src/views/domain/ngx_conf/LogEntry.vue:64
 msgid "Access Logs"
 msgstr "访问日志"
 
-#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:42
+#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
 msgstr "操作"
 
-#: src/components/StdDataDisplay/StdCurd.vue:134
-#: src/components/StdDataDisplay/StdCurd.vue:26
+#: src/components/StdDataDisplay/StdCurd.vue:145
+#: src/components/StdDataDisplay/StdCurd.vue:25
 msgid "Add"
 msgstr "添加"
 
@@ -36,45 +36,51 @@ msgstr "添加"
 msgid "Add Directive Below"
 msgstr "在下面添加指令"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:33
-#: src/views/domain/ngx_conf/LocationEditor.vue:48
+#: src/views/domain/ngx_conf/LocationEditor.vue:45
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
+#: src/views/domain/ngx_conf/LocationEditor.vue:51
+#: src/views/domain/ngx_conf/LocationEditor.vue:60
 msgid "Add Location"
 msgstr "添加 Location"
 
-#: src/routes/index.ts:55 src/views/domain/DomainAdd.vue:2
+#: src/routes/index.ts:56 src/views/domain/DomainAdd.vue:2
 msgid "Add Site"
 msgstr "添加站点"
 
-#: src/views/domain/DomainEdit.vue:19
+#: src/views/domain/DomainEdit.vue:18 src/views/domain/DomainEdit.vue:19
 msgid "Advance Mode"
 msgstr "高级模式"
 
-#: src/components/StdDataDisplay/StdTable.vue:44
-#: src/views/domain/DomainList.vue:27
-msgid "Are you sure you want to delete ?"
+#: src/components/StdDataDisplay/StdTable.vue:54
+#: src/views/domain/DomainList.vue:26
+msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:15
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:27
 msgid "Are you sure you want to remove this directive?"
 msgstr "您确定要删除这条指令?"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:9
+#: src/views/domain/ngx_conf/LocationEditor.vue:19
 msgid "Are you sure you want to remove this location?"
 msgstr "您确定要删除这个 Location?"
 
+#: src/views/preference/Preference.vue:7 src/views/preference/Preference.vue:8
+msgid "Auto"
+msgstr "自动"
+
 #: src/views/nginx_log/NginxLog.vue:4
 msgid "Auto Refresh"
 msgstr "自动刷新"
 
-#: src/views/domain/cert/IssueCert.vue:78
+#: src/views/domain/cert/IssueCert.vue:72
 msgid "Auto-renewal disabled for %{name}"
 msgstr "成功关闭 %{name} 自动续签"
 
-#: src/views/domain/cert/IssueCert.vue:72
+#: src/views/domain/cert/IssueCert.vue:66
 msgid "Auto-renewal enabled for %{name}"
 msgstr "成功启用 %{name} 自动续签"
 
-#: src/views/domain/DomainEdit.vue:178 src/views/nginx_log/NginxLog.vue:172
+#: src/views/domain/DomainEdit.vue:187 src/views/nginx_log/NginxLog.vue:173
 msgid "Back"
 msgstr "返回"
 
@@ -86,15 +92,24 @@ msgstr "返回首页"
 msgid "Base information"
 msgstr "基本信息"
 
-#: src/views/domain/DomainEdit.vue:22
+#: src/views/domain/DomainEdit.vue:21 src/views/domain/DomainEdit.vue:22
 msgid "Basic Mode"
 msgstr "基本模式"
 
+#: src/components/StdDataDisplay/StdBatchEdit.vue:5
+#: src/components/StdDataDisplay/StdTable.vue:12
+#: src/components/StdDataDisplay/StdTable.vue:13
+#: src/components/StdDataDisplay/StdTable.vue:18
+msgid "Batch Modify"
+msgstr "批量修改"
+
 #: src/views/other/About.vue:21
 msgid "Build with"
 msgstr "构建基于"
 
-#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdBatchEdit.vue:7
+#: src/components/StdDataDisplay/StdCurd.vue:27
+#: src/components/StdDataEntry/components/StdSelector.vue:11
 #: src/components/StdDataEntry/compontents/StdSelector.vue:11
 #: src/views/config/ConfigEdit.vue:49
 msgid "Cancel"
@@ -112,9 +127,9 @@ msgstr "此证书有效"
 msgid "Certificate Status"
 msgstr "证书状态"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
-#: src/views/domain/ngx_conf/LocationEditor.vue:21
-#: src/views/domain/ngx_conf/LocationEditor.vue:35
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:31
+#: src/views/domain/ngx_conf/LocationEditor.vue:47
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:175
 msgid "Comments"
 msgstr "注释"
@@ -131,8 +146,8 @@ msgstr "配置"
 msgid "Configure SSL"
 msgstr "配置 SSL"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:27
-#: src/views/domain/ngx_conf/LocationEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:37
+#: src/views/domain/ngx_conf/LocationEditor.vue:53
 msgid "Content"
 msgstr "内容"
 
@@ -142,7 +157,7 @@ msgstr "CPU 状态"
 
 #: src/views/dashboard/DashBoard.vue:153
 msgid "CPU:"
-msgstr ""
+msgstr "CPU:"
 
 #: src/views/domain/DomainAdd.vue:150
 msgid "Create Another"
@@ -156,7 +171,12 @@ msgstr "创建时间"
 msgid "Creating client facilitates communication with the CA server"
 msgstr "正在创建客户端用于与 CA 服务器通信"
 
-#: src/routes/index.ts:27
+#: src/views/preference/Preference.vue:13
+#: src/views/preference/Preference.vue:14
+msgid "Dark"
+msgstr "深色"
+
+#: src/routes/index.ts:28
 msgid "Dashboard"
 msgstr "仪表盘"
 
@@ -164,16 +184,16 @@ msgstr "仪表盘"
 msgid "Database (Optional, default: database)"
 msgstr "数据库 (可选,默认: database)"
 
-#: src/components/StdDataDisplay/StdTable.vue:366
-#: src/views/domain/DomainList.vue:111
+#: src/components/StdDataDisplay/StdTable.vue:527
+#: src/views/domain/DomainList.vue:115
 msgid "Delete"
 msgstr "删除"
 
-#: src/components/StdDataDisplay/StdTable.vue:120
+#: src/components/StdDataDisplay/StdTable.vue:132
 msgid "Delete ID: %{id}"
 msgstr "删除 ID: %{id}"
 
-#: src/views/domain/DomainList.vue:76
+#: src/views/domain/DomainList.vue:81
 msgid "Delete site: %{site_name}"
 msgstr "删除站点: %{site_name}"
 
@@ -185,20 +205,23 @@ msgstr "开发模式"
 msgid "Directive"
 msgstr "指令"
 
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:1
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:2
 msgid "Directives"
 msgstr "指令"
 
-#: src/views/domain/cert/IssueCert.vue:80
+#: src/views/domain/cert/IssueCert.vue:74
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "关闭 %{name} 自动续签失败"
 
-#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainList.vue:17
-#: src/views/domain/DomainList.vue:29
+#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:9
+#: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
+#: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
+#: src/views/domain/DomainList.vue:9
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:118 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -210,15 +233,15 @@ msgstr "磁盘 IO"
 msgid "Domain Config Created Successfully"
 msgstr "域名配置文件创建成功"
 
-#: src/views/domain/DomainEdit.vue:5
+#: src/views/domain/DomainEdit.vue:4 src/views/domain/DomainEdit.vue:5
 msgid "Edit %{n}"
 msgstr "编辑 %{n}"
 
-#: src/routes/index.ts:77 src/views/config/ConfigEdit.vue:2
+#: src/routes/index.ts:78 src/views/config/ConfigEdit.vue:2
 msgid "Edit Configuration"
 msgstr "编辑配置"
 
-#: src/routes/index.ts:59
+#: src/routes/index.ts:60
 msgid "Edit Site"
 msgstr "编辑站点"
 
@@ -226,7 +249,7 @@ msgstr "编辑站点"
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 
-#: src/views/domain/cert/IssueCert.vue:74
+#: src/views/domain/cert/IssueCert.vue:68
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "启用 %{name} 自动续签失败"
 
@@ -238,14 +261,15 @@ msgstr "启用失败"
 msgid "Enable TLS"
 msgstr "启用 TLS"
 
-#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:7
-#: src/views/domain/DomainList.vue:12 src/views/domain/DomainList.vue:20
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:6
+#: src/views/domain/DomainEdit.vue:7 src/views/domain/DomainList.vue:10
+#: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
+#: src/views/domain/DomainList.vue:19 src/views/domain/DomainList.vue:31
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
-#: src/views/domain/DomainList.vue:54
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:109
+#: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "启用成功"
 
@@ -253,7 +277,7 @@ msgstr "启用成功"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 对网站进行加密"
 
-#: src/routes/index.ts:103 src/views/domain/ngx_conf/LogEntry.vue:68
+#: src/routes/index.ts:104 src/views/domain/ngx_conf/LogEntry.vue:68
 msgid "Error Logs"
 msgstr "错误日志"
 
@@ -262,15 +286,17 @@ msgid "Expiration Date: %{date}"
 msgstr "过期时间: %{date}"
 
 #: src/components/StdDataDisplay/StdTable.vue:12
-#: src/components/StdDataDisplay/StdTable.vue:317
+#: src/components/StdDataDisplay/StdTable.vue:362
+#: src/components/StdDataDisplay/StdTable.vue:6
+#: src/components/StdDataDisplay/StdTable.vue:7
 msgid "Export"
 msgstr "导出"
 
-#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:121 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 
@@ -290,6 +316,7 @@ msgstr "过滤"
 msgid "Finished"
 msgstr "完成"
 
+#: src/components/StdDataEntry/components/StdPassword.vue:42
 #: src/components/StdDataEntry/compontents/StdPassword.vue:42
 msgid "Generate"
 msgstr "生成"
@@ -298,15 +325,15 @@ msgstr "生成"
 msgid "Generating private key for registering account"
 msgstr "正在生成私钥用于注册账户"
 
-#: src/views/domain/cert/IssueCert.vue:103
+#: src/views/domain/cert/IssueCert.vue:97
 msgid "Getting the certificate, please wait..."
 msgstr "正在获取证书,请稍等..."
 
-#: src/routes/index.ts:20
+#: src/routes/index.ts:21
 msgid "Home"
 msgstr "首页"
 
-#: src/routes/index.ts:126 src/views/other/Install.vue:128
+#: src/routes/index.ts:135 src/views/other/Install.vue:128
 msgid "Install"
 msgstr "安装"
 
@@ -326,19 +353,26 @@ msgstr "证书申请成功"
 msgid "Leave blank for no change"
 msgstr "留空表示不修改"
 
+#: src/views/preference/Preference.vue:10
+#: src/views/preference/Preference.vue:11
+msgid "Light"
+msgstr "浅色"
+
 #: src/views/dashboard/DashBoard.vue:141
 msgid "Load Averages:"
 msgstr "系统负载:"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:5
+#: src/views/domain/ngx_conf/LocationEditor.vue:15
+#: src/views/domain/ngx_conf/LocationEditor.vue:8
+#: src/views/domain/ngx_conf/LocationEditor.vue:9
 msgid "Location"
 msgstr "Location"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:39
+#: src/views/domain/ngx_conf/LocationEditor.vue:40
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:132 src/views/other/Login.vue:103
+#: src/routes/index.ts:141 src/views/other/Login.vue:103
 msgid "Login"
 msgstr "登录"
 
@@ -350,7 +384,7 @@ msgstr "登录成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/domain/cert/IssueCert.vue:226
+#: src/views/domain/cert/IssueCert.vue:209
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort (default: 9180) before getting the certificate."
@@ -358,15 +392,15 @@ msgstr ""
 "在获取签发证书前,请确保配置文件中已将 .well-known 目录反向代理到 "
 "HTTPChallengePort (默认: 9180)"
 
-#: src/routes/index.ts:68
+#: src/routes/index.ts:69
 msgid "Manage Configs"
 msgstr "配置管理"
 
-#: src/routes/index.ts:43 src/views/domain/DomainList.vue:2
+#: src/routes/index.ts:44 src/views/domain/DomainList.vue:2
 msgid "Manage Sites"
 msgstr "网站管理"
 
-#: src/routes/index.ts:35 src/views/user/User.vue:2
+#: src/routes/index.ts:36 src/views/user/User.vue:2
 msgid "Manage Users"
 msgstr "用户管理"
 
@@ -378,12 +412,12 @@ msgstr "内存"
 msgid "Memory and Storage"
 msgstr "内存与存储"
 
-#: src/components/StdDataDisplay/StdCurd.vue:26
-#: src/components/StdDataDisplay/StdTable.vue:18
-#: src/components/StdDataDisplay/StdTable.vue:19
-#: src/components/StdDataDisplay/StdTable.vue:24
-#: src/components/StdDataDisplay/StdTable.vue:34
-#: src/components/StdDataDisplay/StdTable.vue:36
+#: src/components/StdDataDisplay/StdCurd.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:26
+#: src/components/StdDataDisplay/StdTable.vue:31
+#: src/components/StdDataDisplay/StdTable.vue:44
+#: src/components/StdDataDisplay/StdTable.vue:46
 msgid "Modify"
 msgstr "修改"
 
@@ -391,7 +425,8 @@ msgstr "修改"
 msgid "Modify Config"
 msgstr "修改配置文件"
 
-#: src/views/config/Config.vue:12 src/views/domain/DomainList.vue:14
+#: src/views/config/Config.vue:12 src/views/domain/DomainEdit.vue:36
+#: src/views/domain/DomainList.vue:15
 msgid "Name"
 msgstr "名称"
 
@@ -415,18 +450,18 @@ msgstr "上传流量"
 msgid "Next"
 msgstr "下一步"
 
-#: src/routes/index.ts:93 src/views/nginx_log/NginxLog.vue:2
+#: src/routes/index.ts:94 src/views/nginx_log/NginxLog.vue:2
 msgid "Nginx Log"
 msgstr "Nginx 日志"
 
-#: src/components/StdDataDisplay/StdTable.vue:42
-#: src/views/domain/DomainList.vue:25
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:17
-#: src/views/domain/ngx_conf/LocationEditor.vue:11
+#: src/components/StdDataDisplay/StdTable.vue:52
+#: src/views/domain/DomainList.vue:24
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
+#: src/views/domain/ngx_conf/LocationEditor.vue:21
 msgid "No"
 msgstr "取消"
 
-#: src/routes/index.ts:138 src/routes/index.ts:140
+#: src/routes/index.ts:147 src/routes/index.ts:149
 msgid "Not Found"
 msgstr "找不到页面"
 
@@ -434,7 +469,7 @@ msgstr "找不到页面"
 msgid "Not Valid Before: %{date}"
 msgstr "此前无效: %{date}"
 
-#: src/views/domain/cert/IssueCert.vue:218
+#: src/views/domain/cert/IssueCert.vue:201
 msgid ""
 "Note: The server_name in the current configuration must be the domain name "
 "you need to get the certificate."
@@ -444,16 +479,18 @@ msgstr "注意:当前配置中的 server_name 必须为需要申请证书的
 msgid "Obtaining certificate"
 msgstr "正在获取证书"
 
-#: src/components/StdDataDisplay/StdCurd.vue:29
-#: src/components/StdDataDisplay/StdTable.vue:43
+#: src/components/StdDataDisplay/StdBatchEdit.vue:8
+#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdTable.vue:53
+#: src/components/StdDataEntry/components/StdSelector.vue:12
 #: src/components/StdDataEntry/compontents/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainList.vue:25
 msgid "OK"
 msgstr "确定"
 
 #: src/views/dashboard/DashBoard.vue:147
 msgid "OS:"
-msgstr ""
+msgstr "OS:"
 
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:22
 msgid "Params"
@@ -467,8 +504,8 @@ msgstr "密码"
 msgid "Password (*)"
 msgstr "密码 (*)"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:24
-#: src/views/domain/ngx_conf/LocationEditor.vue:38
+#: src/views/domain/ngx_conf/LocationEditor.vue:34
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
 msgid "Path"
 msgstr "路径"
 
@@ -484,6 +521,10 @@ msgstr "请输入您的密码!"
 msgid "Please input your username!"
 msgstr "请输入您的用户名!"
 
+#: src/routes/index.ts:117 src/views/preference/Preference.vue:2
+msgid "Preference"
+msgstr "偏好设置"
+
 #: src/language/constants.ts:12
 msgid "Preparing lego configurations"
 msgstr "正在准备 Lego 的配置"
@@ -516,11 +557,15 @@ msgstr "正在注册用户"
 msgid "Reloading nginx"
 msgstr "正在重载 Nginx"
 
+#: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
+#: src/components/StdDataDisplay/StdTable.vue:9
 msgid "Reset"
 msgstr "重置"
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:190
+#: src/views/preference/Preference.vue:22
+#: src/views/preference/Preference.vue:23
 msgid "Save"
 msgstr "保存"
 
@@ -534,15 +579,20 @@ msgstr "保存指令"
 msgid "Save error %{msg}"
 msgstr "保存错误 %{msg}"
 
-#: src/components/StdDataDisplay/StdCurd.vue:102
+#: src/components/StdDataDisplay/StdBatchEdit.vue:40
+msgid "Save successfully"
+msgstr "保存成功"
+
+#: src/components/StdDataDisplay/StdCurd.vue:108
 msgid "Save Successfully"
 msgstr "保存成功"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:91
+#: src/views/domain/DomainEdit.vue:97
 msgid "Saved successfully"
 msgstr "保存成功"
 
+#: src/components/StdDataEntry/components/StdSelector.vue:13
 #: src/components/StdDataEntry/compontents/StdSelector.vue:13
 msgid "Selector"
 msgstr "选择器"
@@ -551,11 +601,13 @@ msgstr "选择器"
 msgid "Send"
 msgstr "上传"
 
-#: src/components/StdDataDisplay/StdTable.vue:140
-#: src/components/StdDataDisplay/StdTable.vue:298
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
-#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
-#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
+#: src/components/StdDataDisplay/StdBatchEdit.vue:43
+#: src/components/StdDataDisplay/StdTable.vue:168
+#: src/components/StdDataDisplay/StdTable.vue:343
+#: src/components/StdDataDisplay/StdTable.vue:463
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:100
+#: src/views/domain/DomainEdit.vue:62 src/views/domain/DomainEdit.vue:74
+#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "服务器错误"
@@ -568,28 +620,24 @@ msgstr "服务器信息"
 msgid "server_name not found in directives"
 msgstr "未在指令集合中找到 server_name"
 
-#: src/views/domain/cert/IssueCert.vue:209 src/views/domain/DomainAdd.vue:112
+#: src/views/domain/cert/IssueCert.vue:195 src/views/domain/DomainAdd.vue:112
 msgid "server_name parameter is required"
 msgstr "必须为 server_name 指令指明参数"
 
-#: src/views/domain/cert/IssueCert.vue:212
-#: src/views/domain/cert/IssueCert.vue:35
-msgid "server_name parameters more than one"
-msgstr "server_name 指令包含多个参数"
-
+#: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:6
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:7
 msgid "Single Directive"
 msgstr "单行指令"
 
-#: src/routes/index.ts:107
+#: src/routes/index.ts:108
 msgid "Site Logs"
 msgstr "站点列表"
 
-#: src/routes/index.ts:51
+#: src/routes/index.ts:52
 msgid "Sites List"
 msgstr "站点列表"
 
-#: src/views/domain/DomainList.vue:19
+#: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "状态"
 
@@ -603,17 +651,17 @@ msgstr "主体名称: %{name}"
 
 #: src/views/dashboard/DashBoard.vue:36
 msgid "Swap"
-msgstr ""
+msgstr "Swap"
 
 #: src/components/StdDataDisplay/StdCurd.vue:3
 msgid "Table"
 msgstr "列表"
 
-#: src/routes/index.ts:85 src/views/pty/Terminal.vue:2
+#: src/routes/index.ts:86 src/views/pty/Terminal.vue:2
 msgid "Terminal"
 msgstr "终端"
 
-#: src/views/domain/cert/IssueCert.vue:222
+#: src/views/domain/cert/IssueCert.vue:205
 msgid ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
@@ -628,11 +676,19 @@ msgstr "文件名不能包含以下字符: %{c}"
 msgid "The username or password is incorrect"
 msgstr "用户名或密码错误"
 
-#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:36
+#: src/views/preference/Preference.vue:5
+msgid "Theme"
+msgstr "主题"
+
+#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "修改时间"
 
+#: src/components/StdDataDisplay/StdTable.vue:461
+msgid "Updated successfully"
+msgstr "更新成功"
+
 #: src/views/dashboard/DashBoard.vue:137
 msgid "Uptime:"
 msgstr "运行时间:"
@@ -666,8 +722,8 @@ msgstr "正在将证书私钥写入磁盘"
 msgid "Writing certificate to disk"
 msgstr "正在将证书写入磁盘"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
-#: src/views/domain/ngx_conf/LocationEditor.vue:10
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:28
+#: src/views/domain/ngx_conf/LocationEditor.vue:20
 msgid "Yes"
 msgstr "是的"
 
@@ -676,6 +732,12 @@ msgctxt "Project"
 msgid "License"
 msgstr "开源许可"
 
+#~ msgid "Are you sure you want to delete ?"
+#~ msgstr "您确定要删除吗?"
+
+#~ msgid "server_name parameters more than one"
+#~ msgstr "server_name 指令包含多个参数"
+
 #~ msgid "All logs"
 #~ msgstr "所有日志"
 

二進制
frontend/src/language/zh_TW/app.mo


+ 199 - 150
frontend/src/language/zh_TW/app.po

@@ -11,25 +11,25 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: easygettext\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Poedit 3.2.2\n"
 
-#: src/routes/index.ts:116
+#: src/routes/index.ts:125
 msgid "About"
 msgstr "關於"
 
-#: src/routes/index.ts:99 src/views/domain/ngx_conf/LogEntry.vue:64
+#: src/routes/index.ts:100 src/views/domain/ngx_conf/LogEntry.vue:64
 msgid "Access Logs"
-msgstr ""
+msgstr "訪問日誌"
 
-#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:42
+#: src/views/config/Config.vue:24 src/views/domain/DomainList.vue:47
 #: src/views/user/User.vue:43
 msgid "Action"
 msgstr "操作"
 
-#: src/components/StdDataDisplay/StdCurd.vue:134
-#: src/components/StdDataDisplay/StdCurd.vue:26
+#: src/components/StdDataDisplay/StdCurd.vue:145
+#: src/components/StdDataDisplay/StdCurd.vue:25
 msgid "Add"
-msgstr ""
+msgstr "新增"
 
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:31
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:32
@@ -37,68 +37,80 @@ msgstr ""
 msgid "Add Directive Below"
 msgstr "在下面新增指令"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:33
-#: src/views/domain/ngx_conf/LocationEditor.vue:48
+#: src/views/domain/ngx_conf/LocationEditor.vue:45
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
+#: src/views/domain/ngx_conf/LocationEditor.vue:51
+#: src/views/domain/ngx_conf/LocationEditor.vue:60
 msgid "Add Location"
 msgstr "新增 Location"
 
-#: src/routes/index.ts:55 src/views/domain/DomainAdd.vue:2
+#: src/routes/index.ts:56 src/views/domain/DomainAdd.vue:2
 msgid "Add Site"
 msgstr "新增站點"
 
-#: src/views/domain/DomainEdit.vue:19
+#: src/views/domain/DomainEdit.vue:18 src/views/domain/DomainEdit.vue:19
 msgid "Advance Mode"
 msgstr "高階模式"
 
-#: src/components/StdDataDisplay/StdTable.vue:44
-#: src/views/domain/DomainList.vue:27
-#, fuzzy
-msgid "Are you sure you want to delete ?"
-msgstr "您确定要删除?"
+#: src/components/StdDataDisplay/StdTable.vue:54
+#: src/views/domain/DomainList.vue:26
+msgid "Are you sure you want to delete?"
+msgstr "你確定你要刪除?"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:15
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:27
 msgid "Are you sure you want to remove this directive?"
 msgstr "您確定要刪除這條指令?"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:9
-#, fuzzy
+#: src/views/domain/ngx_conf/LocationEditor.vue:19
 msgid "Are you sure you want to remove this location?"
-msgstr "您確定要刪除這條指令?"
+msgstr "您確定要刪除此 Location 嗎?"
+
+#: src/views/preference/Preference.vue:7 src/views/preference/Preference.vue:8
+msgid "Auto"
+msgstr "自動"
 
 #: src/views/nginx_log/NginxLog.vue:4
 msgid "Auto Refresh"
-msgstr ""
+msgstr "自動刷新"
 
-#: src/views/domain/cert/IssueCert.vue:78
+#: src/views/domain/cert/IssueCert.vue:72
 msgid "Auto-renewal disabled for %{name}"
 msgstr "已關閉 %{name} 自動續簽"
 
-#: src/views/domain/cert/IssueCert.vue:72
+#: src/views/domain/cert/IssueCert.vue:66
 msgid "Auto-renewal enabled for %{name}"
 msgstr "已啟用 %{name} 自動續簽"
 
-#: src/views/domain/DomainEdit.vue:178 src/views/nginx_log/NginxLog.vue:172
+#: src/views/domain/DomainEdit.vue:187 src/views/nginx_log/NginxLog.vue:173
 msgid "Back"
 msgstr "返回"
 
 #: src/views/other/Error.vue:12
-#, fuzzy
 msgid "Back Home"
-msgstr "回"
+msgstr "回到首頁"
 
 #: src/views/domain/DomainAdd.vue:5
 msgid "Base information"
 msgstr "基本訊息"
 
-#: src/views/domain/DomainEdit.vue:22
+#: src/views/domain/DomainEdit.vue:21 src/views/domain/DomainEdit.vue:22
 msgid "Basic Mode"
 msgstr "基本模式"
 
+#: src/components/StdDataDisplay/StdBatchEdit.vue:5
+#: src/components/StdDataDisplay/StdTable.vue:12
+#: src/components/StdDataDisplay/StdTable.vue:13
+#: src/components/StdDataDisplay/StdTable.vue:18
+msgid "Batch Modify"
+msgstr "批量修改"
+
 #: src/views/other/About.vue:21
 msgid "Build with"
 msgstr "構建基於"
 
-#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdBatchEdit.vue:7
+#: src/components/StdDataDisplay/StdCurd.vue:27
+#: src/components/StdDataEntry/components/StdSelector.vue:11
 #: src/components/StdDataEntry/compontents/StdSelector.vue:11
 #: src/views/config/ConfigEdit.vue:49
 msgid "Cancel"
@@ -116,9 +128,9 @@ msgstr "此憑證有效"
 msgid "Certificate Status"
 msgstr "憑證狀態"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
-#: src/views/domain/ngx_conf/LocationEditor.vue:21
-#: src/views/domain/ngx_conf/LocationEditor.vue:35
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:31
+#: src/views/domain/ngx_conf/LocationEditor.vue:47
 #: src/views/domain/ngx_conf/NgxConfigEditor.vue:175
 msgid "Comments"
 msgstr "註釋"
@@ -135,8 +147,8 @@ msgstr "配置"
 msgid "Configure SSL"
 msgstr "配置 SSL"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:27
-#: src/views/domain/ngx_conf/LocationEditor.vue:41
+#: src/views/domain/ngx_conf/LocationEditor.vue:37
+#: src/views/domain/ngx_conf/LocationEditor.vue:53
 msgid "Content"
 msgstr "內容"
 
@@ -158,9 +170,14 @@ msgstr "建立時間"
 
 #: src/language/constants.ts:13
 msgid "Creating client facilitates communication with the CA server"
-msgstr ""
+msgstr "創建客戶端方便與CA服務器通信"
 
-#: src/routes/index.ts:27
+#: src/views/preference/Preference.vue:13
+#: src/views/preference/Preference.vue:14
+msgid "Dark"
+msgstr "深色"
+
+#: src/routes/index.ts:28
 msgid "Dashboard"
 msgstr "儀表盤"
 
@@ -168,19 +185,18 @@ msgstr "儀表盤"
 msgid "Database (Optional, default: database)"
 msgstr "資料庫 (可選,預設: database)"
 
-#: src/components/StdDataDisplay/StdTable.vue:366
-#: src/views/domain/DomainList.vue:111
+#: src/components/StdDataDisplay/StdTable.vue:527
+#: src/views/domain/DomainList.vue:115
 msgid "Delete"
-msgstr ""
+msgstr "刪除"
 
-#: src/components/StdDataDisplay/StdTable.vue:120
+#: src/components/StdDataDisplay/StdTable.vue:132
 msgid "Delete ID: %{id}"
 msgstr "刪除 ID: %{id}"
 
-#: src/views/domain/DomainList.vue:76
-#, fuzzy
+#: src/views/domain/DomainList.vue:81
 msgid "Delete site: %{site_name}"
-msgstr "刪除 ID: %{id}"
+msgstr "刪除站點:%{site_name}"
 
 #: src/views/other/About.vue:7 src/views/other/About.vue:8
 msgid "Development Mode"
@@ -190,20 +206,23 @@ msgstr "開發模式"
 msgid "Directive"
 msgstr "指令"
 
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:1
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:2
 msgid "Directives"
 msgstr "指令"
 
-#: src/views/domain/cert/IssueCert.vue:80
+#: src/views/domain/cert/IssueCert.vue:74
 msgid "Disable auto-renewal failed for %{name}"
 msgstr "關閉 %{name} 自動續簽失敗"
 
-#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainList.vue:17
-#: src/views/domain/DomainList.vue:29
+#: src/views/domain/DomainEdit.vue:10 src/views/domain/DomainEdit.vue:9
+#: src/views/domain/DomainList.vue:16 src/views/domain/DomainList.vue:34
+#: src/views/domain/DomainList.vue:7 src/views/domain/DomainList.vue:8
+#: src/views/domain/DomainList.vue:9
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:118 src/views/domain/DomainList.vue:69
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -215,15 +234,15 @@ msgstr "磁碟 IO"
 msgid "Domain Config Created Successfully"
 msgstr "域名配置文件創建成功"
 
-#: src/views/domain/DomainEdit.vue:5
+#: src/views/domain/DomainEdit.vue:4 src/views/domain/DomainEdit.vue:5
 msgid "Edit %{n}"
 msgstr "編輯 %{n}"
 
-#: src/routes/index.ts:77 src/views/config/ConfigEdit.vue:2
+#: src/routes/index.ts:78 src/views/config/ConfigEdit.vue:2
 msgid "Edit Configuration"
 msgstr "編輯配置"
 
-#: src/routes/index.ts:59
+#: src/routes/index.ts:60
 msgid "Edit Site"
 msgstr "編輯站點"
 
@@ -231,7 +250,7 @@ msgstr "編輯站點"
 msgid "Email (*)"
 msgstr "郵箱 (*)"
 
-#: src/views/domain/cert/IssueCert.vue:74
+#: src/views/domain/cert/IssueCert.vue:68
 msgid "Enable auto-renewal failed for %{name}"
 msgstr "啟用 %{name} 自動續簽失敗"
 
@@ -243,14 +262,15 @@ msgstr "啟用失敗"
 msgid "Enable TLS"
 msgstr "啟用 TLS"
 
-#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:7
-#: src/views/domain/DomainList.vue:12 src/views/domain/DomainList.vue:20
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainEdit.vue:33 src/views/domain/DomainEdit.vue:6
+#: src/views/domain/DomainEdit.vue:7 src/views/domain/DomainList.vue:10
+#: src/views/domain/DomainList.vue:11 src/views/domain/DomainList.vue:12
+#: src/views/domain/DomainList.vue:19 src/views/domain/DomainList.vue:31
 msgid "Enabled"
 msgstr "啟用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
-#: src/views/domain/DomainList.vue:54
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:109
+#: src/views/domain/DomainList.vue:59
 msgid "Enabled successfully"
 msgstr "啟用成功"
 
@@ -258,30 +278,32 @@ msgstr "啟用成功"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 對網站進行加密"
 
-#: src/routes/index.ts:103 src/views/domain/ngx_conf/LogEntry.vue:68
+#: src/routes/index.ts:104 src/views/domain/ngx_conf/LogEntry.vue:68
 msgid "Error Logs"
-msgstr ""
+msgstr "錯誤日志"
 
 #: src/views/domain/cert/CertInfo.vue:17
 msgid "Expiration Date: %{date}"
 msgstr "過期時間: %{date}"
 
 #: src/components/StdDataDisplay/StdTable.vue:12
-#: src/components/StdDataDisplay/StdTable.vue:317
+#: src/components/StdDataDisplay/StdTable.vue:362
+#: src/components/StdDataDisplay/StdTable.vue:6
+#: src/components/StdDataDisplay/StdTable.vue:7
 msgid "Export"
-msgstr ""
+msgstr "導出"
 
-#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:121 src/views/domain/DomainList.vue:73
 msgid "Failed to disable %{msg}"
 msgstr "禁用失敗 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:63
 msgid "Failed to enable %{msg}"
 msgstr "啟用失敗 %{msg}"
 
 #: src/language/constants.ts:9
 msgid "Failed to get certificate information"
-msgstr ""
+msgstr "獲取證書信息失敗"
 
 #: src/views/other/Error.vue:3 src/views/other/Error.vue:4
 msgid "File Not Found"
@@ -289,63 +311,69 @@ msgstr "未找到檔案"
 
 #: src/views/nginx_log/NginxLog.vue:7
 msgid "Filter"
-msgstr ""
+msgstr "篩選"
 
 #: src/language/constants.ts:20 src/views/domain/DomainAdd.vue:7
 msgid "Finished"
 msgstr "完成"
 
+#: src/components/StdDataEntry/components/StdPassword.vue:42
 #: src/components/StdDataEntry/compontents/StdPassword.vue:42
 msgid "Generate"
-msgstr ""
+msgstr "生成"
 
 #: src/language/constants.ts:11
 msgid "Generating private key for registering account"
-msgstr ""
+msgstr "生成註冊賬號私鑰"
 
-#: src/views/domain/cert/IssueCert.vue:103
+#: src/views/domain/cert/IssueCert.vue:97
 msgid "Getting the certificate, please wait..."
 msgstr "正在獲取憑證,請稍等..."
 
-#: src/routes/index.ts:20
+#: src/routes/index.ts:21
 msgid "Home"
 msgstr "首頁"
 
-#: src/routes/index.ts:126 src/views/other/Install.vue:128
+#: src/routes/index.ts:135 src/views/other/Install.vue:128
 msgid "Install"
 msgstr "安裝"
 
 #: src/views/other/Install.vue:68
-#, fuzzy
 msgid "Install successfully"
-msgstr "啟用成功"
+msgstr "安裝成功"
 
 #: src/views/domain/cert/CertInfo.vue:15
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中級憑證頒發機構: %{issuer}"
 
 #: src/language/constants.ts:21
-#, fuzzy
 msgid "Issued certificate successfully"
-msgstr "啟用成功"
+msgstr "頒發證書成功"
 
 #: src/views/user/User.vue:26
 msgid "Leave blank for no change"
 msgstr "留空表示不修改"
 
+#: src/views/preference/Preference.vue:10
+#: src/views/preference/Preference.vue:11
+msgid "Light"
+msgstr "淺色"
+
 #: src/views/dashboard/DashBoard.vue:141
 msgid "Load Averages:"
 msgstr "系統負載:"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:5
+#: src/views/domain/ngx_conf/LocationEditor.vue:15
+#: src/views/domain/ngx_conf/LocationEditor.vue:8
+#: src/views/domain/ngx_conf/LocationEditor.vue:9
 msgid "Location"
 msgstr "Location"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:39
+#: src/views/domain/ngx_conf/LocationEditor.vue:40
 msgid "Locations"
 msgstr "Locations"
 
-#: src/routes/index.ts:132 src/views/other/Login.vue:103
+#: src/routes/index.ts:141 src/views/other/Login.vue:103
 msgid "Login"
 msgstr "登入"
 
@@ -357,24 +385,23 @@ msgstr "登入成功"
 msgid "Logout successful"
 msgstr "登出成功"
 
-#: src/views/domain/cert/IssueCert.vue:226
-#, fuzzy
+#: src/views/domain/cert/IssueCert.vue:209
 msgid ""
 "Make sure you have configured a reverse proxy for .well-known directory to "
 "HTTPChallengePort (default: 9180) before getting the certificate."
 msgstr ""
-"在獲取證前,請確保配置檔案中已將 .well-known 目錄反向代理到 "
+"在獲取證前,請確保配置檔案中已將 .well-known 目錄反向代理到 "
 "HTTPChallengePort (預設: 9180)"
 
-#: src/routes/index.ts:68
+#: src/routes/index.ts:69
 msgid "Manage Configs"
 msgstr "配置管理"
 
-#: src/routes/index.ts:43 src/views/domain/DomainList.vue:2
+#: src/routes/index.ts:44 src/views/domain/DomainList.vue:2
 msgid "Manage Sites"
 msgstr "網站管理"
 
-#: src/routes/index.ts:35 src/views/user/User.vue:2
+#: src/routes/index.ts:36 src/views/user/User.vue:2
 msgid "Manage Users"
 msgstr "使用者管理"
 
@@ -386,21 +413,21 @@ msgstr "記憶體"
 msgid "Memory and Storage"
 msgstr "記憶體和存儲"
 
-#: src/components/StdDataDisplay/StdCurd.vue:26
-#: src/components/StdDataDisplay/StdTable.vue:18
-#: src/components/StdDataDisplay/StdTable.vue:19
-#: src/components/StdDataDisplay/StdTable.vue:24
-#: src/components/StdDataDisplay/StdTable.vue:34
-#: src/components/StdDataDisplay/StdTable.vue:36
-#, fuzzy
+#: src/components/StdDataDisplay/StdCurd.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:25
+#: src/components/StdDataDisplay/StdTable.vue:26
+#: src/components/StdDataDisplay/StdTable.vue:31
+#: src/components/StdDataDisplay/StdTable.vue:44
+#: src/components/StdDataDisplay/StdTable.vue:46
 msgid "Modify"
-msgstr "修改配置"
+msgstr "修改"
 
 #: src/views/domain/DomainAdd.vue:147
 msgid "Modify Config"
 msgstr "修改配置"
 
-#: src/views/config/Config.vue:12 src/views/domain/DomainList.vue:14
+#: src/views/config/Config.vue:12 src/views/domain/DomainEdit.vue:36
+#: src/views/domain/DomainList.vue:15
 msgid "Name"
 msgstr "名稱"
 
@@ -424,18 +451,18 @@ msgstr "上傳流量"
 msgid "Next"
 msgstr "下一步"
 
-#: src/routes/index.ts:93 src/views/nginx_log/NginxLog.vue:2
+#: src/routes/index.ts:94 src/views/nginx_log/NginxLog.vue:2
 msgid "Nginx Log"
-msgstr ""
+msgstr "Nginx 日誌"
 
-#: src/components/StdDataDisplay/StdTable.vue:42
-#: src/views/domain/DomainList.vue:25
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:17
-#: src/views/domain/ngx_conf/LocationEditor.vue:11
+#: src/components/StdDataDisplay/StdTable.vue:52
+#: src/views/domain/DomainList.vue:24
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
+#: src/views/domain/ngx_conf/LocationEditor.vue:21
 msgid "No"
 msgstr "取消"
 
-#: src/routes/index.ts:138 src/routes/index.ts:140
+#: src/routes/index.ts:147 src/routes/index.ts:149
 msgid "Not Found"
 msgstr "找不到頁面"
 
@@ -443,21 +470,22 @@ msgstr "找不到頁面"
 msgid "Not Valid Before: %{date}"
 msgstr "此前無效: %{date}"
 
-#: src/views/domain/cert/IssueCert.vue:218
-#, fuzzy
+#: src/views/domain/cert/IssueCert.vue:201
 msgid ""
 "Note: The server_name in the current configuration must be the domain name "
 "you need to get the certificate."
-msgstr "注意:當前配置中的 server_name 必須為需要申請證的域名。"
+msgstr "注意:當前配置中的 server_name 必須為需要申請證的域名。"
 
 #: src/language/constants.ts:16 src/views/domain/cert/IssueCert.vue:3
 msgid "Obtaining certificate"
-msgstr ""
+msgstr "正在獲取證書,請稍等..."
 
-#: src/components/StdDataDisplay/StdCurd.vue:29
-#: src/components/StdDataDisplay/StdTable.vue:43
+#: src/components/StdDataDisplay/StdBatchEdit.vue:8
+#: src/components/StdDataDisplay/StdCurd.vue:28
+#: src/components/StdDataDisplay/StdTable.vue:53
+#: src/components/StdDataEntry/components/StdSelector.vue:12
 #: src/components/StdDataEntry/compontents/StdSelector.vue:12
-#: src/views/domain/DomainList.vue:26
+#: src/views/domain/DomainList.vue:25
 msgid "OK"
 msgstr "確定"
 
@@ -477,8 +505,8 @@ msgstr "密碼"
 msgid "Password (*)"
 msgstr "密碼 (*)"
 
-#: src/views/domain/ngx_conf/LocationEditor.vue:24
-#: src/views/domain/ngx_conf/LocationEditor.vue:38
+#: src/views/domain/ngx_conf/LocationEditor.vue:34
+#: src/views/domain/ngx_conf/LocationEditor.vue:50
 msgid "Path"
 msgstr "路徑"
 
@@ -494,18 +522,21 @@ msgstr "請輸入您的密碼!"
 msgid "Please input your username!"
 msgstr "請輸入您的使用者名稱!"
 
+#: src/routes/index.ts:117 src/views/preference/Preference.vue:2
+msgid "Preference"
+msgstr "設定"
+
 #: src/language/constants.ts:12
-#, fuzzy
 msgid "Preparing lego configurations"
-msgstr "配置"
+msgstr "準備 Lego 配置"
 
 #: src/language/constants.ts:7
 msgid "Prohibit changing root password in demo"
-msgstr ""
+msgstr "禁止在demo中修改root密碼"
 
 #: src/language/constants.ts:8
 msgid "Prohibit deleting the default user"
-msgstr ""
+msgstr "禁止刪除默認用戶"
 
 #: src/views/other/About.vue:19
 msgid "Project Team"
@@ -521,17 +552,21 @@ msgstr "下載"
 
 #: src/language/constants.ts:15
 msgid "Registering user"
-msgstr ""
+msgstr "註冊用戶"
 
 #: src/language/constants.ts:19
 msgid "Reloading nginx"
-msgstr ""
+msgstr "重载 Nginx"
 
+#: src/components/StdDataDisplay/StdTable.vue:10
 #: src/components/StdDataDisplay/StdTable.vue:15
+#: src/components/StdDataDisplay/StdTable.vue:9
 msgid "Reset"
-msgstr ""
+msgstr "重設"
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:190
+#: src/views/preference/Preference.vue:22
+#: src/views/preference/Preference.vue:23
 msgid "Save"
 msgstr "儲存"
 
@@ -545,29 +580,35 @@ msgstr "儲存指令"
 msgid "Save error %{msg}"
 msgstr "儲存錯誤 %{msg}"
 
-#: src/components/StdDataDisplay/StdCurd.vue:102
-#, fuzzy
+#: src/components/StdDataDisplay/StdBatchEdit.vue:40
+msgid "Save successfully"
+msgstr "保存成功"
+
+#: src/components/StdDataDisplay/StdCurd.vue:108
 msgid "Save Successfully"
-msgstr "儲存成功"
+msgstr "存成功"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:91
+#: src/views/domain/DomainEdit.vue:97
 msgid "Saved successfully"
 msgstr "儲存成功"
 
+#: src/components/StdDataEntry/components/StdSelector.vue:13
 #: src/components/StdDataEntry/compontents/StdSelector.vue:13
 msgid "Selector"
-msgstr ""
+msgstr "選擇器"
 
 #: src/views/dashboard/DashBoard.vue:21 src/views/dashboard/DashBoard.vue:85
 msgid "Send"
 msgstr "上傳"
 
-#: src/components/StdDataDisplay/StdTable.vue:140
-#: src/components/StdDataDisplay/StdTable.vue:298
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
-#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
-#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
+#: src/components/StdDataDisplay/StdBatchEdit.vue:43
+#: src/components/StdDataDisplay/StdTable.vue:168
+#: src/components/StdDataDisplay/StdTable.vue:343
+#: src/components/StdDataDisplay/StdTable.vue:463
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:100
+#: src/views/domain/DomainEdit.vue:62 src/views/domain/DomainEdit.vue:74
+#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:83
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "伺服器錯誤"
@@ -580,29 +621,24 @@ msgstr "伺服器資訊"
 msgid "server_name not found in directives"
 msgstr "未在指令集合中找到 server_name"
 
-#: src/views/domain/cert/IssueCert.vue:209 src/views/domain/DomainAdd.vue:112
+#: src/views/domain/cert/IssueCert.vue:195 src/views/domain/DomainAdd.vue:112
 msgid "server_name parameter is required"
 msgstr "必須為 server_name 指令指明參數"
 
-#: src/views/domain/cert/IssueCert.vue:212
-#: src/views/domain/cert/IssueCert.vue:35
-msgid "server_name parameters more than one"
-msgstr "server_name 指令包含多個參數"
-
+#: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:6
 #: src/views/domain/ngx_conf/directive/DirectiveAdd.vue:7
 msgid "Single Directive"
 msgstr "單行指令"
 
-#: src/routes/index.ts:107
-#, fuzzy
+#: src/routes/index.ts:108
 msgid "Site Logs"
-msgstr "站點列表"
+msgstr "網站日誌"
 
-#: src/routes/index.ts:51
+#: src/routes/index.ts:52
 msgid "Sites List"
 msgstr "站點列表"
 
-#: src/views/domain/DomainList.vue:19
+#: src/views/domain/DomainList.vue:24
 msgid "Status"
 msgstr "狀態"
 
@@ -619,22 +655,20 @@ msgid "Swap"
 msgstr "交換空間"
 
 #: src/components/StdDataDisplay/StdCurd.vue:3
-#, fuzzy
 msgid "Table"
-msgstr "啟用"
+msgstr "表格"
 
-#: src/routes/index.ts:85 src/views/pty/Terminal.vue:2
+#: src/routes/index.ts:86 src/views/pty/Terminal.vue:2
 msgid "Terminal"
 msgstr "終端"
 
-#: src/views/domain/cert/IssueCert.vue:222
-#, fuzzy
+#: src/views/domain/cert/IssueCert.vue:205
 msgid ""
 "The certificate for the domain will be checked every hour, and will be "
 "renewed if it has been more than 1 month since it was last issued."
 msgstr ""
-"系統將會每小時檢測一次該域名證,若距離上次簽發已超過1個月,則將自動續簽。"
-"<br/>如果您之前沒有證,請先點選「從 Let's Encrypt 獲取證」。"
+"系統將會每小時檢測一次該域名證,若距離上次簽發已超過1個月,則將自動續簽。"
+"<br/>如果您之前沒有證,請先點選「從 Let's Encrypt 獲取證」。"
 
 #: src/views/other/Install.vue:54
 msgid "The filename cannot contain the following characters: %{c}"
@@ -642,13 +676,21 @@ msgstr "檔名不能包含以下字元: %{c}"
 
 #: src/language/constants.ts:6
 msgid "The username or password is incorrect"
-msgstr ""
+msgstr "用戶名或密碼不正確"
+
+#: src/views/preference/Preference.vue:5
+msgid "Theme"
+msgstr "外觀樣式"
 
-#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:36
+#: src/views/config/Config.vue:17 src/views/domain/DomainList.vue:41
 #: src/views/user/User.vue:37
 msgid "Updated at"
 msgstr "修改時間"
 
+#: src/components/StdDataDisplay/StdTable.vue:461
+msgid "Updated successfully"
+msgstr "已成功更新"
+
 #: src/views/dashboard/DashBoard.vue:137
 msgid "Uptime:"
 msgstr "執行時間:"
@@ -663,7 +705,7 @@ msgstr "使用者名稱 (*)"
 
 #: src/language/constants.ts:14
 msgid "Using HTTP01 challenge provider"
-msgstr ""
+msgstr "使用 HTTP01 挑戰提供者"
 
 #: src/views/domain/cert/IssueCert.vue:26 src/views/domain/DomainAdd.vue:24
 msgid "Warning"
@@ -676,14 +718,14 @@ msgstr "寫"
 
 #: src/language/constants.ts:18
 msgid "Writing certificate private key to disk"
-msgstr ""
+msgstr "將證書私鑰寫入磁盤"
 
 #: src/language/constants.ts:17
 msgid "Writing certificate to disk"
-msgstr ""
+msgstr "將證書寫入磁盤"
 
-#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
-#: src/views/domain/ngx_conf/LocationEditor.vue:10
+#: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:28
+#: src/views/domain/ngx_conf/LocationEditor.vue:20
 msgid "Yes"
 msgstr "是的"
 
@@ -692,6 +734,13 @@ msgctxt "Project"
 msgid "License"
 msgstr "開源軟體授權條款"
 
+#, fuzzy
+#~ msgid "Are you sure you want to delete ?"
+#~ msgstr "您确定要删除?"
+
+#~ msgid "server_name parameters more than one"
+#~ msgstr "server_name 指令包含多個參數"
+
 #~ msgid "404 Not Found"
 #~ msgstr "404 未找到頁面"
 

+ 31 - 27
frontend/src/layouts/BaseLayout.vue

@@ -122,37 +122,36 @@ const lang = computed(() => {
 </style>
 
 <style lang="less">
-@dark: ~"(prefers-color-scheme: dark)";
-
 body {
     overflow: unset !important;
 }
 
-@media @dark {
+.dark {
     h1, h2, h3, h4, h5, h6, p {
         color: #fafafa !important;
     }
 
-}
+    .ant-checkbox-indeterminate {
+        .ant-checkbox-inner {
+            background-color: transparent !important;
+        }
+    }
 
-.ant-layout-header {
-    padding: 0 !important;
-    background-color: #fff !important;
-    @media @dark {
+    .ant-menu {
+        background: unset !important;
+    }
+
+    .ant-layout-header {
         background-color: #1f1f1f !important;
     }
-}
 
-.ant-card {
-    @media @dark {
+    .ant-card {
         background-color: #1f1f1f !important;
     }
-}
 
-.ant-layout-sider {
-    background-color: #ffffff;
-    @media @dark {
+    .ant-layout-sider {
         background-color: rgb(20, 20, 20) !important;
+
         .ant-layout-sider-trigger {
             background-color: rgb(20, 20, 20) !important;
         }
@@ -160,8 +159,25 @@ body {
         .ant-menu {
             border-right: 0 !important;
         }
+
+        &.ant-layout-sider-has-trigger {
+            padding-bottom: 0;
+        }
+
+        box-shadow: 2px 0 8px rgba(29, 35, 41, 0.05);
     }
 
+}
+
+.ant-layout-header {
+    padding: 0 !important;
+    background-color: #fff !important;
+}
+
+
+.ant-layout-sider {
+    background-color: #ffffff;
+
     &.ant-layout-sider-has-trigger {
         padding-bottom: 0;
     }
@@ -179,18 +195,6 @@ body {
     }
 }
 
-@media @dark {
-    .ant-checkbox-indeterminate {
-        .ant-checkbox-inner {
-            background-color: transparent !important;
-        }
-    }
-
-    .ant-menu {
-        background: unset !important;
-    }
-
-}
 
 .ant-table-small {
     font-size: 13px;

+ 1 - 1
frontend/src/layouts/HeaderLayout.vue

@@ -55,7 +55,7 @@ function logout() {
     }
 }
 
-@media (prefers-color-scheme: dark) {
+.dark {
     .header {
         box-shadow: 1px 1px 0 0 #404040;
 

+ 1 - 0
frontend/src/lib/theme/index.ts

@@ -13,6 +13,7 @@ function changeTheme(theme: string) {
 }
 
 export const dark_mode = async (enabled: Boolean) => {
+    document.body.setAttribute('class', enabled ? 'dark' : 'light')
     if (enabled) {
         changeTheme((await import('@/dark.less?inline')).default)
         changeCss('--page-bg-color', '#141414')

+ 4 - 0
frontend/src/pinia/moudule/settings.ts

@@ -4,6 +4,7 @@ export const useSettingsStore = defineStore('settings', {
     state: () => ({
         language: '',
         theme: 'light',
+        preference_theme: 'auto'
     }),
     getters: {},
     actions: {
@@ -12,6 +13,9 @@ export const useSettingsStore = defineStore('settings', {
         },
         set_theme(t: string) {
             this.theme = t
+        },
+        set_preference_theme(t: string) {
+            this.preference_theme = t
         }
     },
     persist: true

+ 20 - 11
frontend/src/routes/index.ts

@@ -9,7 +9,8 @@ import {
     HomeOutlined,
     InfoCircleOutlined,
     UserOutlined,
-    FileTextOutlined
+    FileTextOutlined,
+    SettingOutlined
 } from '@ant-design/icons-vue'
 
 const {$gettext} = gettext
@@ -36,7 +37,7 @@ export const routes = [
                 component: () => import('@/views/user/User.vue'),
                 meta: {
                     icon: UserOutlined
-                },
+                }
             },
             {
                 path: 'domain',
@@ -49,11 +50,11 @@ export const routes = [
                 children: [{
                     path: 'list',
                     name: () => $gettext('Sites List'),
-                    component: () => import('@/views/domain/DomainList.vue'),
+                    component: () => import('@/views/domain/DomainList.vue')
                 }, {
                     path: 'add',
                     name: () => $gettext('Add Site'),
-                    component: () => import('@/views/domain/DomainAdd.vue'),
+                    component: () => import('@/views/domain/DomainAdd.vue')
                 }, {
                     path: ':name',
                     name: () => $gettext('Edit Site'),
@@ -61,7 +62,7 @@ export const routes = [
                     meta: {
                         hiddenInSidebar: true
                     }
-                },]
+                }]
             },
             {
                 path: 'config',
@@ -78,7 +79,7 @@ export const routes = [
                 component: () => import('@/views/config/ConfigEdit.vue'),
                 meta: {
                     hiddenInSidebar: true
-                },
+                }
             },
             {
                 path: 'terminal',
@@ -97,20 +98,28 @@ export const routes = [
                 children: [{
                     path: 'access',
                     name: () => $gettext('Access Logs'),
-                    component: () => import('@/views/nginx_log/NginxLog.vue'),
+                    component: () => import('@/views/nginx_log/NginxLog.vue')
                 }, {
                     path: 'error',
                     name: () => $gettext('Error Logs'),
-                    component: () => import('@/views/nginx_log/NginxLog.vue'),
+                    component: () => import('@/views/nginx_log/NginxLog.vue')
                 }, {
                     path: 'site',
                     name: () => $gettext('Site Logs'),
                     component: () => import('@/views/nginx_log/NginxLog.vue'),
                     meta: {
                         hiddenInSidebar: true
-                    },
+                    }
                 }]
             },
+            {
+                path: 'preference',
+                name: () => $gettext('Preference'),
+                component: () => import('@/views/preference/Preference.vue'),
+                meta: {
+                    icon: SettingOutlined
+                }
+            },
             {
                 path: 'about',
                 name: () => $gettext('About'),
@@ -118,7 +127,7 @@ export const routes = [
                 meta: {
                     icon: InfoCircleOutlined
                 }
-            },
+            }
         ]
     },
     {
@@ -144,7 +153,7 @@ export const routes = [
 const router = createRouter({
     history: createWebHistory(),
     // @ts-ignore
-    routes: routes,
+    routes: routes
 })
 
 router.beforeEach((to, from, next) => {

+ 1 - 1
frontend/src/version.json

@@ -1 +1 @@
-{"version":"1.6.8","build_id":57,"total_build":127}
+{"version":"1.7.0","build_id":61,"total_build":131}

+ 1 - 1
frontend/src/views/domain/DomainList.vue

@@ -110,7 +110,7 @@ function destroy(site_name: any) {
                     <a-popconfirm
                         :cancelText="$gettext('No')"
                         :okText="$gettext('OK')"
-                        :title="$gettext('Are you sure you want to delete ?')"
+                        :title="$gettext('Are you sure you want to delete?')"
                         @confirm="destroy(record['name'])">
                         <a v-translate>Delete</a>
                     </a-popconfirm>

+ 58 - 0
frontend/src/views/preference/Preference.vue

@@ -0,0 +1,58 @@
+<script setup lang="ts">
+import {useGettext} from 'vue3-gettext'
+import {reactive} from 'vue'
+import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
+import {useSettingsStore} from '@/pinia'
+import {dark_mode} from '@/lib/theme'
+
+const {$gettext} = useGettext()
+
+const settingsStore = useSettingsStore()
+
+const data = reactive({
+    theme: settingsStore.theme
+})
+
+
+function save() {
+    settingsStore.set_theme(data.theme)
+    settingsStore.set_preference_theme(data.theme)
+    dark_mode(data.theme === 'dark')
+}
+</script>
+
+<template>
+    <a-card :title="$gettext('Preference')">
+        <div class="preference-container">
+            <a-form layout="vertical">
+                <a-form-item :label="$gettext('Theme')">
+                    <a-select v-model:value="data.theme">
+                        <a-select-option value="auto">
+                            {{ $gettext('Auto') }}
+                        </a-select-option>
+                        <a-select-option value="light">
+                            {{ $gettext('Light') }}
+                        </a-select-option>
+                        <a-select-option value="dark">
+                            {{ $gettext('Dark') }}
+                        </a-select-option>
+                    </a-select>
+                </a-form-item>
+            </a-form>
+        </div>
+    </a-card>
+    <footer-tool-bar>
+        <a-button type="primary" @click="save">
+            {{ $gettext('Save') }}
+        </a-button>
+    </footer-tool-bar>
+</template>
+
+<style lang="less" scoped>
+.preference-container {
+    width: 100%;
+    max-width: 600px;
+    margin: 0 auto;
+    padding: 0 10px;
+}
+</style>

+ 1 - 1
frontend/version.json

@@ -1 +1 @@
-{"version":"1.6.8","build_id":57,"total_build":127}
+{"version":"1.7.0","build_id":61,"total_build":131}

Some files were not shown because too many files changed in this diff