Просмотр исходного кода

feat: implement user profile management

Jacky 2 месяцев назад
Родитель
Сommit
0808eb09c3

+ 74 - 0
api/user/current_user.go

@@ -0,0 +1,74 @@
+package user
+
+import (
+	"net/http"
+
+	"github.com/0xJacky/Nginx-UI/api"
+	"github.com/0xJacky/Nginx-UI/model"
+	"github.com/gin-gonic/gin"
+	"github.com/uozi-tech/cosy"
+	"golang.org/x/crypto/bcrypt"
+)
+
+func GetCurrentUser(c *gin.Context) {
+	user := api.CurrentUser(c)
+	c.JSON(http.StatusOK, user)
+}
+
+func UpdateCurrentUser(c *gin.Context) {
+	cosy.Core[model.User](c).
+		SetValidRules(gin.H{
+			"name": "required",
+		}).
+		Custom(func(c *cosy.Ctx[model.User]) {
+			user := api.CurrentUser(c.Context)
+			user.Name = c.Model.Name
+
+			db := cosy.UseDB()
+			err := db.Where("id = ?", user.ID).Updates(user).Error
+			if err != nil {
+				cosy.ErrHandler(c.Context, err)
+				return
+			}
+
+			c.JSON(http.StatusOK, user)
+		})
+}
+
+func UpdateCurrentUserPassword(c *gin.Context) {
+	var json struct {
+		OldPassword string `json:"old_password" binding:"required"`
+		NewPassword string `json:"new_password" binding:"required"`
+	}
+
+	if !cosy.BindAndValid(c, &json) {
+		return
+	}
+
+	user := api.CurrentUser(c)
+	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(json.OldPassword)); err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	user.Password = json.NewPassword
+
+	pwdBytes, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
+	if err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	db := cosy.UseDB()
+	err = db.Where("id = ?", user.ID).Updates(&model.User{
+		Password: string(pwdBytes),
+	}).Error
+	if err != nil {
+		cosy.ErrHandler(c, err)
+		return
+	}
+
+	c.JSON(http.StatusOK, gin.H{
+		"message": "ok",
+	})
+}

+ 4 - 0
api/user/router.go

@@ -42,4 +42,8 @@ func InitUserRouter(r *gin.RouterGroup) {
 		o.GET("/recovery_codes", ViewRecoveryCodes)
 		o.GET("/recovery_codes_generate", GenerateRecoveryCodes)
 	}
+
+	r.GET("/user", GetCurrentUser)
+	r.POST("/user", middleware.RequireSecureSession(), UpdateCurrentUser)
+	r.POST("/user/password", middleware.RequireSecureSession(), UpdateCurrentUserPassword)
 }

+ 12 - 2
app/src/api/user.ts

@@ -1,5 +1,5 @@
 import type { ModelBase } from '@/api/curd'
-import { useCurdApi } from '@uozi-admin/request'
+import { extendCurdApi, http, useCurdApi } from '@uozi-admin/request'
 
 export interface User extends ModelBase {
   name: string
@@ -8,6 +8,16 @@ export interface User extends ModelBase {
   status: boolean
 }
 
-const user = useCurdApi<User>('/users')
+const user = extendCurdApi(useCurdApi<User>('/users'), {
+  getCurrentUser: () => {
+    return http.get('/user')
+  },
+  updateCurrentUser: (data: User) => {
+    return http.post('/user', data)
+  },
+  updateCurrentUserPassword: (data: { old_password: string, new_password: string }) => {
+    return http.post('/user/password', data)
+  },
+})
 
 export default user

+ 127 - 85
app/src/language/ar/app.po

@@ -103,7 +103,7 @@ msgstr "[Nginx UI] كتابة الشهادة على القرص"
 msgid "2FA"
 msgstr "المصادقة الثنائية"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "إعدادات المصادقة الثنائية"
 
@@ -129,8 +129,7 @@ msgstr "سجلات الدخول"
 msgid "ACME User"
 msgstr "مستخدم ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "إجراء"
 
@@ -141,9 +140,9 @@ msgstr "إجراء"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "الإجراءات"
@@ -158,10 +157,10 @@ msgid "Actual worker to configured ratio"
 msgstr "النسبة الفعلية للعامل إلى المُهيأ"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "إضافة"
 
@@ -188,7 +187,7 @@ msgstr "أضف مكان"
 msgid "Add Site"
 msgstr "أضف موقع"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "أضف Stream"
 
@@ -246,7 +245,7 @@ msgstr "التطبيق"
 msgid "Arch"
 msgstr "\"أرك\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "هل أنت متأكد من حذف عنوان IP المحظور هذا على الفور؟"
 
@@ -275,8 +274,8 @@ msgstr "هل أنت متأكد أنك تريد مسح سجل المحادثة؟"
 msgid "Are you sure you want to delete permanently?"
 msgstr "هل أنت متأكد أنك تريد الحذف نهائيًا؟"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "هل أنت متأكد أنك تريد الحذف؟"
 
@@ -316,7 +315,7 @@ msgstr "المساعد"
 msgid "Attempt to fix"
 msgstr "محاولة الإصلاح"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "محاولات"
 
@@ -328,7 +327,7 @@ msgstr "مصادقة"
 msgid "Authenticate with a passkey"
 msgstr "المصادقة باستخدام مفتاح المرور"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "إعدادات المصادقة"
 
@@ -403,15 +402,15 @@ msgstr "لم يتم العثور على ملف النسخ الاحتياطي: {0
 msgid "Backup has been downloaded successfully"
 msgstr "تم تنزيل النسخة الاحتياطية بنجاح"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "دقائق حد الحظر"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "عناوين IP المحظورة"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "محظور حتى"
 
@@ -521,7 +520,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -644,6 +643,10 @@ msgstr "طريقة التحدي"
 msgid "Change Certificate"
 msgstr "تغيير الشهادة"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "تغيير كلمة المرور"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -812,13 +815,11 @@ msgstr "تم المسح بنجاح"
 msgid "Click or drag backup file to this area to upload"
 msgstr "انقر فوق أو اسحب ملف النسخ الاحتياطي إلى هذه المنطقة للتحميل"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "انقر أو اسحب الملفات إلى هذه المنطقة للتحميل"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "انقر أو اسحب المجلدات إلى هذه المنطقة للتحميل"
 
@@ -938,6 +939,10 @@ msgstr "التكوينات"
 msgid "Configure SSL"
 msgstr "تكوين SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "تأكيد كلمة المرور الجديدة"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "متصل"
@@ -946,7 +951,7 @@ msgstr "متصل"
 msgid "Connection error, trying to reconnect..."
 msgstr "خطأ في الاتصال، جاري محاولة إعادة الاتصال..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "تم فقدان الاتصال، يرجى تحديث الصفحة."
 
@@ -1002,7 +1007,7 @@ msgstr "استخدام وحدة المعالجة المركزية مرتفع ن
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "إنشاء"
 
@@ -1031,7 +1036,7 @@ msgstr ""
 "سيتم تنزيل ملفات النسخ الاحتياطي تلقائيًا إلى جهاز الكمبيوتر الخاص بك."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1070,6 +1075,10 @@ msgstr "الاتصالات النشطة الحالية"
 msgid "Current Content"
 msgstr "المحتوى الحالي"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "كلمة المرور الحالية"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "الاستخدام الحالي"
@@ -1109,8 +1118,8 @@ msgstr "حدد اسم منطقة الذاكرة المشتركة والحجم،
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "حذف"
 
@@ -1187,7 +1196,7 @@ msgstr "الملف الوجهة موجود بالفعل"
 msgid "Destination file: {0} already exists"
 msgstr "الملف الوجهة: {0} موجود بالفعل"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "تفاصيل"
 
@@ -1231,11 +1240,11 @@ msgstr "مستويات الدليل"
 msgid "Directory path to store cache files"
 msgstr "مسار الدليل لتخزين ملفات الذاكرة المؤقتة"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "تعطيل"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "تعطيل"
 
@@ -1296,7 +1305,7 @@ msgstr "تم تعطيل الدفق %{name} من %{node} بنجاح"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1304,7 +1313,7 @@ msgstr "تم تعطيل الدفق %{name} من %{node} بنجاح"
 msgid "Disabled"
 msgstr "معطل"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1332,7 +1341,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "لا تقم بتمكين هذا الخيار إلا إذا كنت متأكدًا من أنك بحاجة إليه."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "هل تريد %{action} هذا الموقع؟"
 
@@ -1409,9 +1418,9 @@ msgstr ""
 "مواقع الويب غير HTTPS، إلا عند التشغيل على localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "مكرر"
 
@@ -1455,11 +1464,11 @@ msgstr "بريد إلكتروني"
 msgid "Email (*)"
 msgstr "البريد الإلكتروني (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "تمكين"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "تفعيل"
 
@@ -1557,7 +1566,7 @@ msgstr "تفعيل TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1566,7 +1575,7 @@ msgstr "تفعيل TOTP"
 msgid "Enabled"
 msgstr "مفعل"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1775,23 +1784,23 @@ msgstr "فشل في حذف الشهادة"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "فشل حذف الشهادة من قاعدة البيانات: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "فشل في تعطيل %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "فشل تعطيل وضع الصيانة %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "فشل في التفعيل %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "فشل تمكين وضع الصيانة %{msg}"
 
@@ -2102,7 +2111,7 @@ msgstr "رقم ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "إذا تُرك فارغًا، سيتم استخدام دليل CA الافتراضي."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2269,7 +2278,7 @@ msgstr "تنسيق الطلب غير صالح"
 msgid "Invalid security token format"
 msgstr "تنسيق رمز الأمان غير صالح"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2384,7 +2393,7 @@ msgstr "قائمة"
 msgid "Load Average:"
 msgstr "متوسط التحميل:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "تحميل من الإعدادات"
 
@@ -2481,17 +2490,17 @@ msgstr ""
 "يدويًا. سيقوم مجدول المهام crontab الخاص بواجهة Nginx UI بتنفيذ أمر تدوير "
 "السجلات في الفاصل الزمني الذي تحدده بالدقائق."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "صيانة"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "تم تعطيل وضع الصيانة بنجاح"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "تم تمكين وضع الصيانة بنجاح"
 
@@ -2558,7 +2567,7 @@ msgstr "العملية الرئيسية"
 msgid "Master Process"
 msgstr "العملية الرئيسية"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "الحد الأقصى للمحاولات"
 
@@ -2657,7 +2666,7 @@ msgstr "الوحدات"
 msgid "Multi-line Directive"
 msgstr "توجيه متعدد الأسطر"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2674,7 +2683,7 @@ msgstr "توجيه متعدد الأسطر"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "اسم"
 
@@ -2706,6 +2715,10 @@ msgstr "تثبيت جديد"
 msgid "New name"
 msgstr "اسم جديد"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "كلمة مرور جديدة"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "مسار جديد"
@@ -2919,9 +2932,9 @@ msgstr "يتضمن Nginx.conf دليل streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "لا"
 
@@ -3054,6 +3067,7 @@ msgid "Off"
 msgstr "إيقاف"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3065,13 +3079,13 @@ msgstr "غير متصل"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "حسنًا"
@@ -3190,6 +3204,14 @@ msgstr "كلمة المرور غير صحيحة"
 msgid "Password length cannot exceed 20 characters"
 msgstr "يجب ألا يتجاوز طول كلمة المرور 20 حرفًا"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "تم تحديث كلمة المرور بنجاح"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "كلمات المرور غير متطابقة"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3229,6 +3251,10 @@ msgstr "تم حفظ إعدادات الأداء بنجاح"
 msgid "Performing core upgrade"
 msgstr "تنفيذ ترقية النواة"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "المعلومات الشخصية"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "مسار PID غير موجود"
@@ -3347,17 +3373,17 @@ msgstr "الرجاء تحديد ملف النسخ الاحتياطي"
 msgid "Please select at least one item"
 msgstr "الرجاء تحديد عنصر واحد على الأقل"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "الرجاء تحديد عقدة واحدة على الأقل لإعادة تحميل Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "الرجاء تحديد عقدة واحدة على الأقل لإعادة تشغيل Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "يرجى اختيار عقدة واحدة على الأقل للترقية"
 
@@ -3521,8 +3547,8 @@ msgstr "إعادة تحميل"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "إعادة تحميل Nginx"
 
@@ -3558,12 +3584,12 @@ msgstr "إعادة التحميل"
 msgid "Reloading nginx"
 msgstr "إعادة تحميل nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "إزالة"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "إزالة بنجاح"
 
@@ -3701,8 +3727,8 @@ msgid "Restart"
 msgstr "إعادة تشغيل"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "إعادة تشغيل Nginx"
 
@@ -3782,15 +3808,15 @@ msgstr ""
 "إلغاء الشهادة سيؤثر على أي خدمات تستخدمها حالياً. لا يمكن التراجع عن هذا "
 "الإجراء."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "اسم العرض RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "أصول RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "معرّف الجهاز عن بُعد"
 
@@ -3895,6 +3921,10 @@ msgstr "اسم وحدة البحث"
 msgid "Secret has been copied"
 msgstr "تم نسخ السر"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "إعدادات الأمان"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3970,7 +4000,7 @@ msgstr ""
 "قم بتعيين خوادم الأسماء التكرارية لتجاوز خوادم الأسماء الخاصة بالنظام لخطوة "
 "تحدي DNS."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "تم تعيينه في وضع الصيانة"
 
@@ -4207,13 +4237,11 @@ msgstr ""
 "Nginx عبر وكيل عكسي لـ Nginx، يرجى الرجوع إلى هذا الرابط لكتابة ملف التكوين "
 "المقابل: https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "يدعم تحميل ملف واحد أو مجموعة من الملفات"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "دعم تحميل المجلدات بأكملها"
 
@@ -4552,12 +4580,12 @@ msgstr ""
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "سيتم ترقية أو إعادة تثبيت Nginx UI على %{nodeNames} إلى %{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "كبح"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "نصائح"
@@ -4570,7 +4598,7 @@ msgstr ""
 "نصيحة: يمكنك زيادة سعة معالجة التزامن عن طريق زيادة worker_processes أو "
 "worker_connections"
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "عنوان"
 
@@ -4688,6 +4716,14 @@ msgstr "نوع"
 msgid "Unknown"
 msgstr "غير معروف"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "تحديث كلمة المرور"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "تحديث الملف الشخصي"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "تم التحديث بنجاح"
@@ -4705,8 +4741,8 @@ msgid "Updated at"
 msgstr "محدث في"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "ترقية"
@@ -4732,7 +4768,7 @@ msgstr "تحميل الملفات"
 msgid "Upload Folders"
 msgstr "تحميل المجلدات"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "اسم المنبع"
 
@@ -4764,11 +4800,20 @@ msgstr "مستخدم"
 msgid "User banned"
 msgstr "تم حظر المستخدم"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "تم تحديث معلومات المستخدم بنجاح"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "المستخدم لم يتم تفعيل OTP كعامل ثنائي"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "ملف المستخدم"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "اسم المستخدم"
 
@@ -4856,7 +4901,7 @@ msgstr ""
 "سنقوم بإزالة تكوين HTTPChallenge من هذا الملف وإعادة تحميل Nginx. هل أنت "
 "متأكد أنك تريد المتابعة؟"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "ويب أوثن"
 
@@ -4934,12 +4979,12 @@ msgstr "كتابة الشهادة إلى القرص"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "نعم"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5042,9 +5087,6 @@ msgstr "مفاتيح المرور الخاصة بك"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "إجمالي %{total} عنصر"
 
-#~ msgid "Updated successfully"
-#~ msgstr "تم التحديث بنجاح"
-
 #~ msgid "View Details"
 #~ msgstr "عرض التفاصيل"
 

+ 127 - 85
app/src/language/de_DE/app.po

@@ -103,7 +103,7 @@ msgstr "[Nginx UI] Zertifikat wird auf die Festplatte geschrieben"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "2FA-Einstellungen"
 
@@ -129,8 +129,7 @@ msgstr "Zugriffslog"
 msgid "ACME User"
 msgstr "ACME-Benutzer"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Aktion"
 
@@ -141,9 +140,9 @@ msgstr "Aktion"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Aktionen"
@@ -158,10 +157,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Tatsächliches Verhältnis von Arbeitern zu konfigurierten"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Hinzufügen"
 
@@ -188,7 +187,7 @@ msgstr "Ort hinzufügen"
 msgid "Add Site"
 msgstr "Seite hinzufügen"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Stream hinzufügen"
 
@@ -248,7 +247,7 @@ msgstr "App"
 msgid "Arch"
 msgstr "\"Arch\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Sind Sie sicher, dass Sie diese gesperrte IP sofort löschen möchten?"
 
@@ -277,8 +276,8 @@ msgstr "Sind Sie sicher, dass Sie den Chatverlauf löschen möchten?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Sind Sie sicher, dass Sie dauerhaft löschen möchten?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Sind Sie sicher, dass Sie löschen möchten?"
 
@@ -322,7 +321,7 @@ msgstr "Assistent"
 msgid "Attempt to fix"
 msgstr "Versuchen zu beheben"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Versuche"
 
@@ -334,7 +333,7 @@ msgstr "Authentifizierung"
 msgid "Authenticate with a passkey"
 msgstr "Mit Passkey authentifizieren"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Authentifizierungseinstellungen"
 
@@ -411,15 +410,15 @@ msgstr "Sicherungsdatei nicht gefunden: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "Die Sicherung wurde erfolgreich heruntergeladen"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Schwellenwert für Minuten sperren"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "Gesperrte IPs"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Gesperrt bis"
 
@@ -531,7 +530,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -649,6 +648,10 @@ msgstr "Challenge-Methode"
 msgid "Change Certificate"
 msgstr "Zertifikat ändern"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Passwort ändern"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -820,13 +823,11 @@ msgstr ""
 "Klicken Sie auf oder ziehen Sie die Sicherungsdatei in diesen Bereich, um "
 "hochzuladen"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Klicken oder ziehen Sie Dateien in diesen Bereich zum Hochladen"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Klicken Sie oder ziehen Sie Ordner in diesen Bereich zum Hochladen"
 
@@ -946,6 +947,10 @@ msgstr "Konfigurationen"
 msgid "Configure SSL"
 msgstr "SSL konfigurieren"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Neues Passwort bestätigen"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Verbunden"
@@ -954,7 +959,7 @@ msgstr "Verbunden"
 msgid "Connection error, trying to reconnect..."
 msgstr "Verbindungsfehler, versuche erneut zu verbinden..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Ver"
 
@@ -1012,7 +1017,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Erstellen"
 
@@ -1042,7 +1047,7 @@ msgstr ""
 "Computer heruntergeladen."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1081,6 +1086,10 @@ msgstr "Aktive Verbindungen"
 msgid "Current Content"
 msgstr "Aktueller Inhalt"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Aktuelles Passwort"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Aktuelle Nutzung"
@@ -1122,8 +1131,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Löschen"
 
@@ -1200,7 +1209,7 @@ msgstr "Die Zieldatei existiert bereits"
 msgid "Destination file: {0} already exists"
 msgstr "Zieldatei: {0} existiert bereits"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Details"
 
@@ -1244,11 +1253,11 @@ msgstr "Verzeichnisebenen"
 msgid "Directory path to store cache files"
 msgstr "Verzeichnispfad zum Speichern der Cache-Dateien"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Deaktivieren"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Deaktivieren"
 
@@ -1309,7 +1318,7 @@ msgstr "Stream %{name} von %{node} erfolgreich deaktiviert"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1317,7 +1326,7 @@ msgstr "Stream %{name} von %{node} erfolgreich deaktiviert"
 msgid "Disabled"
 msgstr "Deaktiviert"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1347,7 +1356,7 @@ msgstr ""
 "Aktiviere diese Option nicht, es sei denn, du bist sicher, dass du sie "
 "benötigst."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Möchten Sie diese Website %{action}?"
 
@@ -1427,9 +1436,9 @@ msgstr ""
 "ausgeführt werden."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Duplizieren"
 
@@ -1473,11 +1482,11 @@ msgstr "E-Mail"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "aktivieren"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Aktivieren"
 
@@ -1575,7 +1584,7 @@ msgstr "TOTP aktivieren"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1584,7 +1593,7 @@ msgstr "TOTP aktivieren"
 msgid "Enabled"
 msgstr "Aktiviert"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1793,23 +1802,23 @@ msgstr "Zertifikat konnte nicht gelöscht werden"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Löschen des Zertifikats aus der Datenbank fehlgeschlagen: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Deaktivierung von %{msg} fehlgeschlagen"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Deaktivierung des Wartungsmodus fehlgeschlagen: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Aktiviern von %{msg} fehlgeschlagen"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Wartungsmodus konnte nicht aktiviert werden: %{msg}"
 
@@ -2122,7 +2131,7 @@ msgstr "ICP-Nummer"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Wenn leer, wird das Standard-CA-Verzeichnis verwendet."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2294,7 +2303,7 @@ msgstr "Ungültiges Anforderungsformat"
 msgid "Invalid security token format"
 msgstr "Ungültiges Sicherheitstoken-Format"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2409,7 +2418,7 @@ msgstr "Liste"
 msgid "Load Average:"
 msgstr "Durchschnittliche Last:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Aus Einstellungen laden"
 
@@ -2506,17 +2515,17 @@ msgstr ""
 "aktivieren. Der Crontab-Aufgabenplaner von Nginx UI führt den "
 "Logrotate-Befehl in dem von dir in Minuten festgelegten Intervall aus."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Wartung"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Wartungsmodus erfolgreich deaktiviert"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Wartungsmodus erfolgreich aktiviert"
 
@@ -2584,7 +2593,7 @@ msgstr "Master-Prozess"
 msgid "Master Process"
 msgstr "Master-Prozess"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Maximale Versuche"
 
@@ -2683,7 +2692,7 @@ msgstr "Module"
 msgid "Multi-line Directive"
 msgstr "Mehrzeilige Direktive"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2700,7 +2709,7 @@ msgstr "Mehrzeilige Direktive"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Name"
 
@@ -2732,6 +2741,10 @@ msgstr "Neue Installation"
 msgid "New name"
 msgstr "Neuer Name"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Neues Passwort"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Neuer Pfad"
@@ -2947,9 +2960,9 @@ msgstr "Nginx.conf enthält das streams-enabled-Verzeichnis"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Nein"
 
@@ -3085,6 +3098,7 @@ msgid "Off"
 msgstr "Aus"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3096,13 +3110,13 @@ msgstr "Offline"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "OK"
@@ -3221,6 +3235,14 @@ msgstr "Falsches Passwort"
 msgid "Password length cannot exceed 20 characters"
 msgstr "Passwort darf nicht länger als 20 Zeichen sein"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Passwort erfolgreich aktualisiert"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Passwörter stimmen nicht überein"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3260,6 +3282,10 @@ msgstr "Leistungseinstellungen erfolgreich gespeichert"
 msgid "Performing core upgrade"
 msgstr "Führe Core-Upgrade aus"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Persönliche Informationen"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID-Pfad existiert nicht"
@@ -3393,17 +3419,17 @@ msgstr "Bitte wählen Sie eine Sicherungsdatei aus"
 msgid "Please select at least one item"
 msgstr "Bitte wählen Sie mindestens einen Artikel aus"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Bitte wählen Sie mindestens einen Knoten aus, um Nginx neu zu laden"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Bitte wählen Sie mindestens einen Knoten aus, um Nginx neu zu starten"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Bitte wähle mindestens einen Knoten zum Upgrade aus"
 
@@ -3570,8 +3596,8 @@ msgstr "Neu laden"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Nginx neu laden"
 
@@ -3609,12 +3635,12 @@ msgstr "Lade neu"
 msgid "Reloading nginx"
 msgstr "Lade Nginx neu"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Löschen"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Erfolgreich entfernt"
 
@@ -3753,8 +3779,8 @@ msgid "Restart"
 msgstr "Neustart"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Nginx neu starten"
 
@@ -3836,15 +3862,15 @@ msgstr ""
 "Das Widerrufen eines Zertifikats wirkt sich auf alle Dienste aus, die es "
 "derzeit verwenden. Diese Aktion kann nicht rückgängig gemacht werden."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "RP-Anzeigename"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "RP-Ursprünge"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3949,6 +3975,10 @@ msgstr "Modulname suchen"
 msgid "Secret has been copied"
 msgstr "Schlüssel wurde kopiert"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Sicherheitseinstellungen"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4026,7 +4056,7 @@ msgstr ""
 "Setze die rekursiven Nameserver, um die System-Nameserver für den Schritt "
 "der DNS-Herausforderung zu überschreiben."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "In den Wartungsmodus versetzen"
 
@@ -4270,13 +4300,11 @@ msgstr ""
 "bitte diesen Link, um die entsprechende Konfigurationsdatei zu schreiben: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Einzel- oder Stapel-Upload von Dateien unterstützen"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Unterstützt das Hochladen ganzer Ordner"
 
@@ -4622,12 +4650,12 @@ msgstr ""
 "Dies wird das Nginx UI auf %{nodeNames} auf %{version} aktualisieren oder "
 "neu installieren."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Begrenzung"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Tipps"
@@ -4640,7 +4668,7 @@ msgstr ""
 "Tipp: Sie können die Nebenläufigkeitsverarbeitungskapazität erhöhen, indem "
 "Sie worker_processes oder worker_connections erhöhen."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Titel"
 
@@ -4761,6 +4789,14 @@ msgstr "Typ"
 msgid "Unknown"
 msgstr "Unbekannt"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Passwort aktualisieren"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Profil aktualisieren"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Erfolgreich aktualisiert"
@@ -4778,8 +4814,8 @@ msgid "Updated at"
 msgstr "Aktualisiert am"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Upgrade"
@@ -4805,7 +4841,7 @@ msgstr "Dateien hochladen"
 msgid "Upload Folders"
 msgstr "Ordner hochladen"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Upstream-Name"
 
@@ -4837,11 +4873,20 @@ msgstr "Benutzer"
 msgid "User banned"
 msgstr "Benutzer gesperrt"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Benutzerinformationen erfolgreich aktualisiert"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Benutzer hat OTP nicht als 2FA aktiviert"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Benutzerprofil"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Benutzername"
 
@@ -4933,7 +4978,7 @@ msgstr ""
 "Wir werden die HTTPChallenge-Konfiguration aus dieser Datei entfernen und "
 "das Nginx neu laden. Möchtest du fortfahren?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -5017,12 +5062,12 @@ msgstr "Schreibe Zertifikat auf die Festplatte"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Ja"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5130,9 +5175,6 @@ msgstr "Deine Passkeys"
 #~ msgstr[0] "Gesamt %{total} Element"
 #~ msgstr[1] "Gesamt %{total} Elemente"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Erfolgreich aktualisiert"
-
 #~ msgid "View Details"
 #~ msgstr "Details anzeigen"
 

+ 122 - 72
app/src/language/en/app.po

@@ -87,7 +87,7 @@ msgstr ""
 msgid "2FA"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr ""
 
@@ -113,8 +113,7 @@ msgstr ""
 msgid "ACME User"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr ""
 
@@ -125,6 +124,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
 #: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
@@ -141,10 +141,10 @@ msgid "Actual worker to configured ratio"
 msgstr ""
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr ""
 
@@ -171,7 +171,7 @@ msgstr ""
 msgid "Add Site"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr ""
 
@@ -229,7 +229,7 @@ msgstr ""
 msgid "Arch"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr ""
 
@@ -258,8 +258,8 @@ msgstr ""
 msgid "Are you sure you want to delete permanently?"
 msgstr ""
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr ""
 
@@ -299,7 +299,7 @@ msgstr ""
 msgid "Attempt to fix"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr ""
 
@@ -311,7 +311,7 @@ msgstr ""
 msgid "Authenticate with a passkey"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr ""
 
@@ -386,15 +386,15 @@ msgstr ""
 msgid "Backup has been downloaded successfully"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr ""
 
@@ -502,7 +502,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -621,6 +621,10 @@ msgstr ""
 msgid "Change Certificate"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr ""
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -878,6 +882,10 @@ msgstr ""
 msgid "Configure SSL"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr ""
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr ""
@@ -886,7 +894,7 @@ msgstr ""
 msgid "Connection error, trying to reconnect..."
 msgstr ""
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
@@ -942,7 +950,7 @@ msgstr ""
 msgid "CPU:"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr ""
 
@@ -969,7 +977,7 @@ msgid ""
 msgstr ""
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1008,6 +1016,10 @@ msgstr ""
 msgid "Current Content"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr ""
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr ""
@@ -1047,8 +1059,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr ""
 
@@ -1125,7 +1137,7 @@ msgstr ""
 msgid "Destination file: {0} already exists"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr ""
 
@@ -1169,11 +1181,11 @@ msgstr ""
 msgid "Directory path to store cache files"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr ""
 
@@ -1234,7 +1246,7 @@ msgstr ""
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1242,7 +1254,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1270,7 +1282,7 @@ msgstr ""
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr ""
 
@@ -1346,9 +1358,9 @@ msgid ""
 msgstr ""
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr ""
 
@@ -1392,11 +1404,11 @@ msgstr ""
 msgid "Email (*)"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr ""
 
@@ -1494,7 +1506,7 @@ msgstr ""
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1503,7 +1515,7 @@ msgstr ""
 msgid "Enabled"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1712,23 +1724,23 @@ msgstr ""
 msgid "Failed to delete certificate from database: %{error}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr ""
 
@@ -2039,7 +2051,7 @@ msgstr ""
 msgid "If left blank, the default CA Dir will be used."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2198,7 +2210,7 @@ msgstr ""
 msgid "Invalid security token format"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr ""
 
@@ -2311,7 +2323,7 @@ msgstr ""
 msgid "Load Average:"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr ""
 
@@ -2399,17 +2411,17 @@ msgid ""
 "minutes."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr ""
 
@@ -2474,7 +2486,7 @@ msgstr ""
 msgid "Master Process"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr ""
 
@@ -2573,7 +2585,7 @@ msgstr ""
 msgid "Multi-line Directive"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2590,7 +2602,7 @@ msgstr ""
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr ""
 
@@ -2622,6 +2634,10 @@ msgstr ""
 msgid "New name"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr ""
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr ""
@@ -2835,9 +2851,9 @@ msgstr ""
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr ""
 
@@ -2966,6 +2982,7 @@ msgid "Off"
 msgstr ""
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -2977,13 +2994,13 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr ""
@@ -3099,6 +3116,14 @@ msgstr ""
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr ""
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr ""
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3138,6 +3163,10 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr ""
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr ""
@@ -3253,17 +3282,17 @@ msgstr ""
 msgid "Please select at least one item"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr ""
 
@@ -3425,8 +3454,8 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr ""
 
@@ -3462,12 +3491,12 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr ""
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr ""
 
@@ -3603,8 +3632,8 @@ msgid "Restart"
 msgstr ""
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr ""
 
@@ -3682,15 +3711,15 @@ msgid ""
 "action cannot be undone."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr ""
 
@@ -3795,6 +3824,10 @@ msgstr ""
 msgid "Secret has been copied"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr ""
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3868,7 +3901,7 @@ msgid ""
 "step of DNS challenge."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr ""
 
@@ -4409,12 +4442,12 @@ msgid ""
 "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr ""
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr ""
@@ -4425,7 +4458,7 @@ msgid ""
 "worker_processes or worker_connections"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr ""
 
@@ -4531,6 +4564,14 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr ""
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr ""
@@ -4548,8 +4589,8 @@ msgid "Updated at"
 msgstr ""
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr ""
@@ -4575,7 +4616,7 @@ msgstr ""
 msgid "Upload Folders"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr ""
 
@@ -4607,11 +4648,20 @@ msgstr ""
 msgid "User banned"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr ""
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr ""
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr ""
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr ""
 
@@ -4695,7 +4745,7 @@ msgid ""
 "Nginx. Are you sure you want to continue?"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr ""
 
@@ -4768,12 +4818,12 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr ""
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a non-"
 "localhost domain. This may expose sensitive information."

+ 127 - 85
app/src/language/es/app.po

@@ -110,7 +110,7 @@ msgstr "[Nginx UI] Escribiendo certificado en el disco"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "Configuración de 2FA"
 
@@ -136,8 +136,7 @@ msgstr "Logs de acceso"
 msgid "ACME User"
 msgstr "Usuario ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Acción"
 
@@ -148,9 +147,9 @@ msgstr "Acción"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Acciones"
@@ -165,10 +164,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Proporción real de trabajadores a configurados"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Agregar"
 
@@ -195,7 +194,7 @@ msgstr "Agregar Ubicación"
 msgid "Add Site"
 msgstr "Agregar Sitio"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Agregar Stream"
 
@@ -255,7 +254,7 @@ msgstr "Aplicación"
 msgid "Arch"
 msgstr "\"Arquitectura\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "¿Está seguro de eliminar esta IP bloqueada inmediatamente?"
 
@@ -284,8 +283,8 @@ msgstr "¿Está seguro de que desea borrar el registro del chat?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "¿Estás seguro de que quieres eliminar permanentemente?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "¿Está seguro de que quiere borrar?"
 
@@ -329,7 +328,7 @@ msgstr "Asistente"
 msgid "Attempt to fix"
 msgstr "Intentar solucionar"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Intentos"
 
@@ -341,7 +340,7 @@ msgstr "Autenticación"
 msgid "Authenticate with a passkey"
 msgstr "Autenticarse con una llave de acceso"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Configuración de autenticación"
 
@@ -418,15 +417,15 @@ msgstr "Archivo de respaldo no encontrado: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "La copia de seguridad se ha descargado correctamente"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Umbral de Prohibición en Minutos"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "IPs prohibidas"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Bloqueado hasta"
 
@@ -540,7 +539,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -661,6 +660,10 @@ msgstr "Método de desafío"
 msgid "Change Certificate"
 msgstr "Cambiar Certificado"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Cambiar contraseña"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -829,13 +832,11 @@ msgstr ""
 "Haga clic o arrastre el archivo de copia de seguridad a esta área para "
 "cargar"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Haz clic o arrastra archivos a esta área para subirlos"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Haz clic o arrastra carpetas a esta área para subir"
 
@@ -955,6 +956,10 @@ msgstr "Configuraciones"
 msgid "Configure SSL"
 msgstr "Configurar SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Confirmar nueva contraseña"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Conectado"
@@ -963,7 +968,7 @@ msgstr "Conectado"
 msgid "Connection error, trying to reconnect..."
 msgstr "Error de conexión, intentando reconectar..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Conexión perdida, por favor actualice la página."
 
@@ -1021,7 +1026,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Crear"
 
@@ -1051,7 +1056,7 @@ msgstr ""
 "automáticamente en tu computadora."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1090,6 +1095,10 @@ msgstr "Conexiones activas actuales"
 msgid "Current Content"
 msgstr "Contenido actual"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Contraseña actual"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Uso actual"
@@ -1133,8 +1142,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -1211,7 +1220,7 @@ msgstr "El archivo de destino ya existe"
 msgid "Destination file: {0} already exists"
 msgstr "Archivo de destino: {0} ya existe"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Detalles"
 
@@ -1255,11 +1264,11 @@ msgstr "Niveles de directorio"
 msgid "Directory path to store cache files"
 msgstr "Ruta del directorio para almacenar archivos de caché"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Desactivar"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Desactivar"
 
@@ -1320,7 +1329,7 @@ msgstr "Deshabilitar el flujo %{name} desde %{node} con éxito"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1328,7 +1337,7 @@ msgstr "Deshabilitar el flujo %{name} desde %{node} con éxito"
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1356,7 +1365,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "No habilite esta opción a menos que esté seguro de que la necesita."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "¿Desea %{action} este sitio?"
 
@@ -1436,9 +1445,9 @@ msgstr ""
 "se ejecutan en el host local."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Duplicar"
 
@@ -1482,11 +1491,11 @@ msgstr "Correo"
 msgid "Email (*)"
 msgstr "Correo (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "habilitar"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Habilitar"
 
@@ -1584,7 +1593,7 @@ msgstr "Habilitar TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1593,7 +1602,7 @@ msgstr "Habilitar TOTP"
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1804,23 +1813,23 @@ msgstr "No se pudo eliminar el certificado"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Error al eliminar el certificado de la base de datos: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Error al deshabilitar %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Error al desactivar el modo de mantenimiento: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Error al habilitar %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "No se pudo activar el modo de mantenimiento: %{msg}"
 
@@ -2133,7 +2142,7 @@ msgstr "Número ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Si se deja en blanco, se utilizará el directorio CA predeterminado."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2301,7 +2310,7 @@ msgstr "Formato de solicitud no válido"
 msgid "Invalid security token format"
 msgstr "Formato de token de seguridad no válido"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2416,7 +2425,7 @@ msgstr "Lista"
 msgid "Load Average:"
 msgstr "Promedios de carga:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Cargar desde configuraciones"
 
@@ -2515,17 +2524,17 @@ msgstr ""
 "de Nginx UI ejecutará el comando logrotate en el intervalo que establezca "
 "en minutos."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Mantenimiento"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Modo de mantenimiento desactivado correctamente"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Modo de mantenimiento activado correctamente"
 
@@ -2592,7 +2601,7 @@ msgstr "Proceso maestro"
 msgid "Master Process"
 msgstr "Proceso maestro"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Intentos máximos"
 
@@ -2691,7 +2700,7 @@ msgstr "Módulos"
 msgid "Multi-line Directive"
 msgstr "Directiva multilínea"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2708,7 +2717,7 @@ msgstr "Directiva multilínea"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Nombre"
 
@@ -2740,6 +2749,10 @@ msgstr "Nueva instalación"
 msgid "New name"
 msgstr "Nuevo nombre"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Nueva contraseña"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Nueva ruta"
@@ -2955,9 +2968,9 @@ msgstr "Nginx.conf incluye el directorio streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "No"
 
@@ -3093,6 +3106,7 @@ msgid "Off"
 msgstr "Apagado"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3104,13 +3118,13 @@ msgstr "Desconectado"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "OK"
@@ -3230,6 +3244,14 @@ msgstr "Contraseña incorrecta"
 msgid "Password length cannot exceed 20 characters"
 msgstr "La longitud de la contraseña no puede exceder los 20 caracteres"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Contraseña actualizada correctamente"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Las contraseñas no coinciden"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3269,6 +3291,10 @@ msgstr "Configuración de rendimiento guardada correctamente"
 msgid "Performing core upgrade"
 msgstr "Realizando la actualizaciónd el kernel"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Información personal"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "La ruta del PID no existe"
@@ -3404,17 +3430,17 @@ msgstr "Por favor, seleccione un archivo de respaldo"
 msgid "Please select at least one item"
 msgstr "Por favor seleccione al menos un elemento"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Por favor, seleccione al menos un nodo para recargar Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Por favor, seleccione al menos un nodo para reiniciar Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Seleccione al menos un nodo para actualizar"
 
@@ -3581,8 +3607,8 @@ msgstr "Recargar"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Recargar Nginx"
 
@@ -3618,12 +3644,12 @@ msgstr "Recargando"
 msgid "Reloading nginx"
 msgstr "Recargando Nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Eliminar"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Eliminado con éxito"
 
@@ -3762,8 +3788,8 @@ msgid "Restart"
 msgstr "Reiniciar"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Reiniciar Nginx"
 
@@ -3843,15 +3869,15 @@ msgstr ""
 "La revocación de un certificado afectará a cualquier servicio que lo esté "
 "utilizando actualmente. Esta acción no se puede deshacer."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Nombre RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Orígenes RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3958,6 +3984,10 @@ msgstr "Nombre del módulo de búsqueda"
 msgid "Secret has been copied"
 msgstr "El secreto ha sido copiado"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Configuración de seguridad"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4035,7 +4065,7 @@ msgstr ""
 "Establezca los servidores de nombres recursivos para anular los servidores "
 "de nombres del sistema en el paso del desafío DNS."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "establecer en modo de mantenimiento"
 
@@ -4279,13 +4309,11 @@ msgstr ""
 "consulte este enlace para escribir el archivo de configuración "
 "correspondiente: https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Soporta carga única o múltiple de archivos"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Soporta la carga de carpetas completas"
 
@@ -4629,12 +4657,12 @@ msgstr ""
 "Esto actualizará o reinstalará la interfaz de usuario de Nginx en "
 "%{nodeNames} a %{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Acelerador"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Consejos"
@@ -4647,7 +4675,7 @@ msgstr ""
 "Consejo: Puede aumentar la capacidad de procesamiento concurrente "
 "incrementando worker_processes o worker_connections."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Título"
 
@@ -4769,6 +4797,14 @@ msgstr "Tipo"
 msgid "Unknown"
 msgstr "Desconocido"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Actualizar contraseña"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Actualizar perfil"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Actualización exitosa"
@@ -4786,8 +4822,8 @@ msgid "Updated at"
 msgstr "Actualizado a"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Actualizar"
@@ -4813,7 +4849,7 @@ msgstr "Subir archivos"
 msgid "Upload Folders"
 msgstr "Subir carpetas"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Nombre de la Transmisión"
 
@@ -4845,11 +4881,20 @@ msgstr "Usuario"
 msgid "User banned"
 msgstr "Usuario bloqueado"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Información del usuario actualizada correctamente"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Usuario no ha habilitado OTP como 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Perfil de usuario"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nombre de usuario"
 
@@ -4940,7 +4985,7 @@ msgstr ""
 "Eliminaremos la configuración de HTTPChallenge de este archivo y "
 "recargaremos Nginx. ¿Estás seguro de que quieres continuar?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -5021,12 +5066,12 @@ msgstr "Escribir certificado a disco"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Si"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5123,9 +5168,6 @@ msgstr "Sus llaves de acceso"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Total %{total} elemento"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Actualización exitosa"
-
 #~ msgid "View Details"
 #~ msgstr "Ver detalles"
 

+ 127 - 85
app/src/language/fr_FR/app.po

@@ -108,7 +108,7 @@ msgstr "[Nginx UI] Écriture du certificat sur le disque"
 msgid "2FA"
 msgstr "2fa"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "Options 2FA"
 
@@ -134,8 +134,7 @@ msgstr "Journaux d'accès"
 msgid "ACME User"
 msgstr "Utilisateur ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Action"
 
@@ -146,9 +145,9 @@ msgstr "Action"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Actions"
@@ -163,10 +162,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Ratio réel des travailleurs par rapport à la configuration"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Ajouter"
 
@@ -193,7 +192,7 @@ msgstr "Ajouter une localisation"
 msgid "Add Site"
 msgstr "Ajouter un site"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Ajouter un flux"
 
@@ -253,7 +252,7 @@ msgstr "Application"
 msgid "Arch"
 msgstr "\"Arch\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Êtes-vous sûr de vouloir supprimer immédiatement cette IP bannie ?"
 
@@ -282,8 +281,8 @@ msgstr "Voulez-vous vraiment effacer l'historique du chat ?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Êtes-vous sûr de vouloir supprimer définitivement ?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Etes-vous sûr que vous voulez supprimer ?"
 
@@ -327,7 +326,7 @@ msgstr "Assistant"
 msgid "Attempt to fix"
 msgstr "Tenter de corriger"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Tentatives"
 
@@ -339,7 +338,7 @@ msgstr "Authentification"
 msgid "Authenticate with a passkey"
 msgstr "S'authentifier avec une clé d'accès"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Paramètres d'authentification"
 
@@ -416,15 +415,15 @@ msgstr "Fichier de sauvegarde introuvable : {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "La sauvegarde a été téléchargée avec succès"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Minutes seuil de bannissement"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "IPs bannies"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Banni durant"
 
@@ -535,7 +534,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -653,6 +652,10 @@ msgstr "Méthode de challenge"
 msgid "Change Certificate"
 msgstr "Changer de certificat"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Changer le mot de passe"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -823,13 +826,11 @@ msgstr ""
 "Cliquez sur ou faites glisser le fichier de sauvegarde vers cette zone pour "
 "télécharger"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Cliquez ou faites glisser des fichiers dans cette zone pour les télécharger"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Cliquez ou faites glisser des dossiers dans cette zone pour télécharger"
 
@@ -951,6 +952,10 @@ msgstr "Configurations"
 msgid "Configure SSL"
 msgstr "Configurer SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Confirmer le nouveau mot de passe"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Connecté"
@@ -959,7 +964,7 @@ msgstr "Connecté"
 msgid "Connection error, trying to reconnect..."
 msgstr "Erreur de connexion, tentative de reconnexion..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Connexion perdue, merci de recharger la page."
 
@@ -1017,7 +1022,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU :"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Créer"
 
@@ -1047,7 +1052,7 @@ msgstr ""
 "téléchargés sur votre ordinateur."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1086,6 +1091,10 @@ msgstr "Connexions actives actuelles"
 msgid "Current Content"
 msgstr "Contenu actuel"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Mot de passe actuel"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Utilisation actuelle"
@@ -1129,8 +1138,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Supprimer"
 
@@ -1207,7 +1216,7 @@ msgstr "Le fichier de destination existe déjà"
 msgid "Destination file: {0} already exists"
 msgstr "Fichier de destination : {0} existe déjà"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Détails"
 
@@ -1251,11 +1260,11 @@ msgstr "Niveaux de répertoire"
 msgid "Directory path to store cache files"
 msgstr "Chemin du répertoire pour stocker les fichiers de cache"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Désactiver"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Désactiver"
 
@@ -1316,7 +1325,7 @@ msgstr "Désactivation du flux %{name} depuis %{node} réussie"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1324,7 +1333,7 @@ msgstr "Désactivation du flux %{name} depuis %{node} réussie"
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1352,7 +1361,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "N'activez pas cette option sauf si vous êtes sûr d'en avoir avez besoin."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Voulez-vous %{action} ce site ?"
 
@@ -1430,9 +1439,9 @@ msgstr ""
 "exécuté sur localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Dupliquer"
 
@@ -1476,11 +1485,11 @@ msgstr "E-mail"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "activer"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Activer"
 
@@ -1578,7 +1587,7 @@ msgstr "Activer TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1587,7 +1596,7 @@ msgstr "Activer TOTP"
 msgid "Enabled"
 msgstr "Activé"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1796,23 +1805,23 @@ msgstr "Échec de la suppression du certificat"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Échec de la suppression du certificat de la base de données : %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Impossible de désactiver %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Échec de la désactivation du mode maintenance : %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Impossible d'activer %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Échec de l'activation du mode maintenance : %{msg}"
 
@@ -2127,7 +2136,7 @@ msgstr "Numéro ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Si vide, le répertoire CA sera utilisé."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2299,7 +2308,7 @@ msgstr "Format de la requête invalide"
 msgid "Invalid security token format"
 msgstr "Format de jeton de sécurité invalide"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2414,7 +2423,7 @@ msgstr "Liste"
 msgid "Load Average:"
 msgstr "Charge moyenne :"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Charger à partir des options"
 
@@ -2513,17 +2522,17 @@ msgstr ""
 "planificateur de tâches crontab de Nginx UI exécutera la commande logrotate "
 "à l'intervalle que vous avez défini en minutes."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Maintenance"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Mode maintenance désactivé avec succès"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Mode maintenance activé avec succès"
 
@@ -2590,7 +2599,7 @@ msgstr "Processus maître"
 msgid "Master Process"
 msgstr "Processus maître"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Tentatives maximum"
 
@@ -2689,7 +2698,7 @@ msgstr "Modules"
 msgid "Multi-line Directive"
 msgstr "Directive multiligne"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2706,7 +2715,7 @@ msgstr "Directive multiligne"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Nom"
 
@@ -2738,6 +2747,10 @@ msgstr "Nouvelle installation"
 msgid "New name"
 msgstr "Nouveau nom"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Nouveau mot de passe"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Nouveau chemin"
@@ -2953,9 +2966,9 @@ msgstr "Nginx.conf inclut le répertoire streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Non"
 
@@ -3090,6 +3103,7 @@ msgid "Off"
 msgstr "Désactivé"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3101,13 +3115,13 @@ msgstr "Hors ligne"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "OK"
@@ -3227,6 +3241,14 @@ msgstr "Mot de passe incorrect"
 msgid "Password length cannot exceed 20 characters"
 msgstr "La longueur du mot de passe ne peut pas dépasser 20 caractères"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Mot de passe mis à jour avec succès"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Les mots de passe ne correspondent pas"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3268,6 +3290,10 @@ msgstr "Paramètres de performance enregistrés avec succès"
 msgid "Performing core upgrade"
 msgstr "Exécution de la mise à niveau du core"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Informations personnelles"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "Le chemin du PID n'existe pas"
@@ -3401,17 +3427,17 @@ msgstr "Veuillez sélectionner un fichier de sauvegarde"
 msgid "Please select at least one item"
 msgstr "Veuillez sélectionner au moins un élément"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Veuillez sélectionner au moins un nœud pour recharger Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Veuillez sélectionner au moins un nœud pour redémarrer Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Veuillez sélectionner au moins un nœud à mettre à niveau"
 
@@ -3578,8 +3604,8 @@ msgstr "Recharger"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Recharger nginx"
 
@@ -3617,12 +3643,12 @@ msgstr "Rechargement"
 msgid "Reloading nginx"
 msgstr "Rechargement de nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Supprimer"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Suppression réussie"
 
@@ -3761,8 +3787,8 @@ msgid "Restart"
 msgstr "Redémarrer"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Redémarrer Nginx"
 
@@ -3842,15 +3868,15 @@ msgstr ""
 "La révocation d'un certificat affectera tous les services qui l'utilisent "
 "actuellement. Cette action ne peut pas être annulée."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Nom d'affichage RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Origines RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3957,6 +3983,10 @@ msgstr "Nom du module de recherche"
 msgid "Secret has been copied"
 msgstr "Le secret a été copié"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Paramètres de sécurité"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4034,7 +4064,7 @@ msgstr ""
 "Définissez les serveurs de noms récursifs pour remplacer les serveurs de "
 "noms du système lors de l'étape du défi DNS."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "passer en mode maintenance"
 
@@ -4278,13 +4308,11 @@ msgstr ""
 "Nginx, veuillez consulter ce lien pour écrire le fichier de configuration "
 "correspondant : https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Prise en charge du téléchargement unique ou en lot de fichiers"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Prend en charge le téléchargement de dossiers entiers"
 
@@ -4636,12 +4664,12 @@ msgstr ""
 "Cela mettra à jour ou réinstallera l'interface Nginx sur %{nodeNames} vers "
 "la version %{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Limitation"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Conseils"
@@ -4654,7 +4682,7 @@ msgstr ""
 "Astuce : Vous pouvez augmenter la capacité de traitement concurrent en "
 "augmentant worker_processes ou worker_connections."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Titre"
 
@@ -4777,6 +4805,14 @@ msgstr "Type"
 msgid "Unknown"
 msgstr "Inconnu"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Mettre à jour le mot de passe"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Mettre à jour le profil"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Mise à jour réussie"
@@ -4794,8 +4830,8 @@ msgid "Updated at"
 msgstr "Mis à jour le"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Mettre à niveau"
@@ -4821,7 +4857,7 @@ msgstr "Téléverser des fichiers"
 msgid "Upload Folders"
 msgstr "Télécharger des dossiers"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Nom de l'amont"
 
@@ -4853,11 +4889,20 @@ msgstr "Utilisateur"
 msgid "User banned"
 msgstr "Utilisateur banni"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Informations utilisateur mises à jour avec succès"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "L'utilisateur n'a pas activé l'OTP comme 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Profil utilisateur"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
@@ -4948,7 +4993,7 @@ msgstr ""
 "Nous allons supprimer la configuration HTTPChallenge de ce fichier et "
 "recharger le Nginx. Êtes-vous sûr de vouloir continuer?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -5032,12 +5077,12 @@ msgstr "Écriture du certificat sur le disque"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Oui"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5134,9 +5179,6 @@ msgstr "Vos clés d'accès"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Total %{total} élément"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Mis à jour avec succés"
-
 #~ msgid "View Details"
 #~ msgstr "Afficher les détails"
 

+ 127 - 85
app/src/language/ja_JP/app.po

@@ -104,7 +104,7 @@ msgstr "[Nginx UI] 証明書をディスクに書き込み中"
 msgid "2FA"
 msgstr "二要素認証"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "ニ要素認証設定"
 
@@ -130,8 +130,7 @@ msgstr "アクセスログ"
 msgid "ACME User"
 msgstr "ACMEユーザー"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "操作"
 
@@ -142,9 +141,9 @@ msgstr "操作"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "操作"
@@ -159,10 +158,10 @@ msgid "Actual worker to configured ratio"
 msgstr "実際のワーカー数と設定値の比率"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "追加"
 
@@ -189,7 +188,7 @@ msgstr "Locationを追加"
 msgid "Add Site"
 msgstr "サイトを追加"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Streamを追加"
 
@@ -247,7 +246,7 @@ msgstr "アプリ"
 msgid "Arch"
 msgstr "\"アーキテクチャ\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "このIPアドレス制限を削除してもよろしいですか?"
 
@@ -276,8 +275,8 @@ msgstr "チャットの記録をクリアしてもよろしいですか?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "完全に削除してもよろしいですか?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "削除してもよろしいですか?"
 
@@ -317,7 +316,7 @@ msgstr "アシスタント"
 msgid "Attempt to fix"
 msgstr "修正を試みる"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "試行回数"
 
@@ -329,7 +328,7 @@ msgstr "認証"
 msgid "Authenticate with a passkey"
 msgstr "「パスキーで認証する」"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "認証設定"
 
@@ -404,15 +403,15 @@ msgstr "バックアップファイルが見つかりません:{0}"
 msgid "Backup has been downloaded successfully"
 msgstr "バックアップは正常にダウンロードされました"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "制限閾値(分)"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "IPアドレス制限"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "ブロック期限"
 
@@ -522,7 +521,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -640,6 +639,10 @@ msgstr "チャレンジタイプ"
 msgid "Change Certificate"
 msgstr "証明書を変更する"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "パスワードを変更する"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -794,13 +797,11 @@ msgstr "正常に削除しました"
 msgid "Click or drag backup file to this area to upload"
 msgstr "この領域にバックアップファイルをクリックまたはドラッグしてアップロードします"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "クリックまたはドラッグしてファイルをこのエリアにアップロード"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "フォルダをクリックまたはドラッグしてこのエリアにアップロード"
 
@@ -920,6 +921,10 @@ msgstr "設定"
 msgid "Configure SSL"
 msgstr "SSLを設定する"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "新しいパスワードを確認"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "接続済み"
@@ -928,7 +933,7 @@ msgstr "接続済み"
 msgid "Connection error, trying to reconnect..."
 msgstr "接続エラー、再接続を試みています..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "接続が失われました。ページを再読み込みしてください。"
 
@@ -984,7 +989,7 @@ msgstr "CPU使用率が比較的高いため、Nginxの設定を最適化する
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "作成"
 
@@ -1011,7 +1016,7 @@ msgid ""
 msgstr "Nginx 設定と Nginx UI 設定を含むシステムバックアップを作成します。バックアップファイルは自動的にコンピュータにダウンロードされます。"
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1050,6 +1055,10 @@ msgstr "現在のアクティブな接続"
 msgid "Current Content"
 msgstr "現在の内容"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "現在のパスワード"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "現在の使用率"
@@ -1089,8 +1098,8 @@ msgstr "共有メモリゾーンの名前とサイズを定義します(例: p
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "削除"
 
@@ -1167,7 +1176,7 @@ msgstr "宛先ファイルは既に存在します"
 msgid "Destination file: {0} already exists"
 msgstr "宛先ファイル: {0} は既に存在します"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "詳細"
 
@@ -1211,11 +1220,11 @@ msgstr "ディレクトリレベル"
 msgid "Directory path to store cache files"
 msgstr "キャッシュファイルを保存するディレクトリパス"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "無効化"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "無効化"
 
@@ -1276,7 +1285,7 @@ msgstr "ストリーム %{name} を %{node} から無効化しました"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1284,7 +1293,7 @@ msgstr "ストリーム %{name} を %{node} から無効化しました"
 msgid "Disabled"
 msgstr "無効"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1312,7 +1321,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "このオプションは必要な場合以外は有効にしないでください。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "このサイトを%{action}しますか?"
 
@@ -1387,9 +1396,9 @@ msgid ""
 msgstr "一部のブラウザのセキュリティポリシーのため、localhostで実行している場合を除き、非HTTPSウェブサイトではパスキーを使用できません。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "複製"
 
@@ -1433,11 +1442,11 @@ msgstr "メール"
 msgid "Email (*)"
 msgstr "メールアドレス (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "有効にする"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "有効にする"
 
@@ -1535,7 +1544,7 @@ msgstr "TOTP を有効にする"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1544,7 +1553,7 @@ msgstr "TOTP を有効にする"
 msgid "Enabled"
 msgstr "有効"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1753,23 +1762,23 @@ msgstr "証明書の削除に失敗しました"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "データベースから証明書の削除に失敗しました: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "%{msg}の無効化に失敗しました"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "メンテナンスモードの無効化に失敗しました: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "有効化に失敗しました %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "メンテナンスモードの有効化に失敗しました: %{msg}"
 
@@ -2080,7 +2089,7 @@ msgstr "ICP番号"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "空白の場合、デフォルトの CA ディレクトリが使用されます。"
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2239,7 +2248,7 @@ msgstr "無効なリクエスト形式"
 msgid "Invalid security token format"
 msgstr "無効なセキュリティトークンフォーマット"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2352,7 +2361,7 @@ msgstr "リスト"
 msgid "Load Average:"
 msgstr "平均負荷:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "設定から読み込む"
 
@@ -2446,17 +2455,17 @@ msgstr ""
 "Nginx UI をインストールするユーザーは、このオプションを手動で有効にすることができます。Nginx UI の crontab "
 "タスクスケジューラは、設定した間隔(分単位)で logrotate コマンドを実行します。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "メンテナンス"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "メンテナンスモードを無効にしました"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "メンテナンスモードが有効になりました"
 
@@ -2523,7 +2532,7 @@ msgstr "マスタープロセス"
 msgid "Master Process"
 msgstr "マスタープロセス"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "最大試行回数"
 
@@ -2622,7 +2631,7 @@ msgstr "モジュール"
 msgid "Multi-line Directive"
 msgstr "複数行ディレクティブ"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2639,7 +2648,7 @@ msgstr "複数行ディレクティブ"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "名前"
 
@@ -2671,6 +2680,10 @@ msgstr "新規インストール"
 msgid "New name"
 msgstr "新しい名前"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "新しいパスワード"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "新しいパス"
@@ -2884,9 +2897,9 @@ msgstr "Nginx.conf には streams-enabled ディレクトリが含まれてい
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "いいえ"
 
@@ -3015,6 +3028,7 @@ msgid "Off"
 msgstr "オフ"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3026,13 +3040,13 @@ msgstr "オフライン"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "OK"
@@ -3150,6 +3164,14 @@ msgstr "パスワードが間違っています"
 msgid "Password length cannot exceed 20 characters"
 msgstr "パスワードの長さは20文字を超えることはできません"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "パスワードが正常に更新されました"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "パスワードが一致しません"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3189,6 +3211,10 @@ msgstr "パフォーマンス設定が正常に保存されました"
 msgid "Performing core upgrade"
 msgstr "コアアップグレードを実行中"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "個人情報"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID パスが存在しません"
@@ -3305,17 +3331,17 @@ msgstr "バックアップファイルを選択してください"
 msgid "Please select at least one item"
 msgstr "少なくとも1つの項目を選択してください"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Nginxをリロードするには、少なくとも1つのノードを選択してください"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Nginx を再起動するには、少なくとも 1 つのノードを選択してください"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "少なくとも1つのノードを選択してアップグレードしてください"
 
@@ -3477,8 +3503,8 @@ msgstr "再読み込み"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Nginx をリロード"
 
@@ -3514,12 +3540,12 @@ msgstr "再読み込み中"
 msgid "Reloading nginx"
 msgstr "nginx をリロード中"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "削除"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "削除に成功しました"
 
@@ -3655,8 +3681,8 @@ msgid "Restart"
 msgstr "再起動"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Nginx を再起動"
 
@@ -3734,15 +3760,15 @@ msgid ""
 "action cannot be undone."
 msgstr "証明書を失効させると、現在それを使用しているすべてのサービスに影響します。この操作は元に戻せません。"
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "RP 表示名"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "RP オリジン"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3847,6 +3873,10 @@ msgstr "検索モジュール名"
 msgid "Secret has been copied"
 msgstr "シークレットがコピーされました"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "セキュリティ設定"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3920,7 +3950,7 @@ msgid ""
 "step of DNS challenge."
 msgstr "DNSチャレンジのステップでシステムのネームサーバーを上書きするために、再帰的なネームサーバーを設定してください。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "メンテナンスモードに設定"
 
@@ -4157,13 +4187,11 @@ msgstr ""
 "リバースプロキシ経由で使用されている場合は、このリンクを参照して対応する設定ファイルを作成してください: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "単一または一括ファイルアップロードをサポート"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "フォルダ全体のアップロードをサポート"
 
@@ -4475,12 +4503,12 @@ msgstr "これにより設定ファイルとデータベースが復元されま
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "これにより、%{nodeNames} 上の Nginx UI が %{version} にアップグレードまたは再インストールされます。"
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "スロットル"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "ヒント"
@@ -4491,7 +4519,7 @@ msgid ""
 "worker_processes or worker_connections"
 msgstr "ヒント: worker_processes または worker_connections を増やすことで、並列処理能力を向上させることができます"
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "タイトル"
 
@@ -4605,6 +4633,14 @@ msgstr "タイプ"
 msgid "Unknown"
 msgstr "不明"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "パスワードを更新"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "プロフィールを更新"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "更新に成功しました"
@@ -4622,8 +4658,8 @@ msgid "Updated at"
 msgstr "更新日時"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "アップグレード"
@@ -4649,7 +4685,7 @@ msgstr "ファイルをアップロード"
 msgid "Upload Folders"
 msgstr "フォルダをアップロード"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "アップストリーム名"
 
@@ -4681,11 +4717,20 @@ msgstr "ユーザー"
 msgid "User banned"
 msgstr "ユーザーが禁止されました"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "ユーザー情報が正常に更新されました"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "ユーザーはOTPを2FAとして有効にしていません"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "ユーザープロフィール"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "ユーザー名"
 
@@ -4769,7 +4814,7 @@ msgid ""
 "the Nginx. Are you sure you want to continue?"
 msgstr "このファイルからHTTPChallengeの設定を削除し、Nginxを再読み込みします。続行してもよろしいですか?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "WebAuthn"
 
@@ -4844,12 +4889,12 @@ msgstr "証明書をディスクに書き込み中"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "はい"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -4937,9 +4982,6 @@ msgstr "あなたのパスキー"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "合計 %{total} アイテム"
 
-#~ msgid "Updated successfully"
-#~ msgstr "更新が成功しました"
-
 #~ msgid "View Details"
 #~ msgstr "詳細を表示します"
 

+ 127 - 85
app/src/language/ko_KR/app.po

@@ -102,7 +102,7 @@ msgstr "[Nginx UI] 인증서를 디스크에 작성 중"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "2FA 설정"
 
@@ -128,8 +128,7 @@ msgstr "접근 로그"
 msgid "ACME User"
 msgstr "ACME 사용자"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "작업"
 
@@ -140,9 +139,9 @@ msgstr "작업"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "작업"
@@ -157,10 +156,10 @@ msgid "Actual worker to configured ratio"
 msgstr "실제 작업자 대 구성 비율"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "추가"
 
@@ -187,7 +186,7 @@ msgstr "위치 추가"
 msgid "Add Site"
 msgstr "사이트 추가"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "스트림 추가"
 
@@ -245,7 +244,7 @@ msgstr "앱"
 msgid "Arch"
 msgstr "\"아키텍처\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "차단된 IP를 즉시 삭제하시겠습니까?"
 
@@ -274,8 +273,8 @@ msgstr "채팅 기록을 지우시겠습니까?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "정말 영구적으로 삭제하시겠습니까?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "정말 삭제하시겠습니까?"
 
@@ -315,7 +314,7 @@ msgstr "어시스턴트"
 msgid "Attempt to fix"
 msgstr "수정 시도"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "시도 횟수"
 
@@ -327,7 +326,7 @@ msgstr "인증"
 msgid "Authenticate with a passkey"
 msgstr "패스키로 인증"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "인증 설정"
 
@@ -402,15 +401,15 @@ msgstr "백업 파일을 찾을 수 없음: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "백업이 성공적으로 다운로드되었습니다"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "차단 시간(분)"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "차단된 IP"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "차단될 시간"
 
@@ -520,7 +519,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -639,6 +638,10 @@ msgstr "인증 방법"
 msgid "Change Certificate"
 msgstr "인증서 변경"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "비밀번호 변경"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -790,13 +793,11 @@ msgstr "성공적으로 제거됨"
 msgid "Click or drag backup file to this area to upload"
 msgstr "이 영역으로 백업 파일을 클릭하거나 드래그하여 업로드하십시오."
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "파일을 클릭하거나 이 영역으로 드래그하여 업로드하세요"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "폴더를 클릭하거나 이 영역으로 드래그하여 업로드"
 
@@ -916,6 +917,10 @@ msgstr "구성들"
 msgid "Configure SSL"
 msgstr "SSL 구성하기"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "새 비밀번호 확인"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "연결됨"
@@ -924,7 +929,7 @@ msgstr "연결됨"
 msgid "Connection error, trying to reconnect..."
 msgstr "연결 오류, 다시 연결 시도 중..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "연결이 끊어졌습니다. 페이지를 새로 고침하세요."
 
@@ -980,7 +985,7 @@ msgstr "CPU 사용률이 비교적 높으므로 Nginx 설정 최적화를 고려
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "생성"
 
@@ -1007,7 +1012,7 @@ msgid ""
 msgstr "Nginx 구성 및 Nginx UI 설정을 포함한 시스템 백업을 생성합니다. 백업 파일은 자동으로 컴퓨터에 다운로드됩니다."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1046,6 +1051,10 @@ msgstr "현재 활성 연결"
 msgid "Current Content"
 msgstr "현재 내용"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "현재 비밀번호"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "현재 사용량"
@@ -1085,8 +1094,8 @@ msgstr "공유 메모리 영역 이름과 크기를 정의합니다(예: proxy_c
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "삭제"
 
@@ -1163,7 +1172,7 @@ msgstr "대상 파일이 이미 존재합니다"
 msgid "Destination file: {0} already exists"
 msgstr "대상 파일: {0} 이미 존재합니다"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "세부 사항"
 
@@ -1207,11 +1216,11 @@ msgstr "디렉토리 레벨"
 msgid "Directory path to store cache files"
 msgstr "캐시 파일을 저장할 디렉터리 경로"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "비활성화"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "비활성화"
 
@@ -1272,7 +1281,7 @@ msgstr "스트림 %{name}을(를) %{node}에서 비활성화했습니다"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1280,7 +1289,7 @@ msgstr "스트림 %{name}을(를) %{node}에서 비활성화했습니다"
 msgid "Disabled"
 msgstr "비활성화됨"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1308,7 +1317,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "이 옵션은 필요한 경우가 아니라면 활성화하지 마세요."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "이 사이트를 %{action}하시겠습니까?"
 
@@ -1385,9 +1394,9 @@ msgstr ""
 "없습니다."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "복제"
 
@@ -1431,11 +1440,11 @@ msgstr "이메일"
 msgid "Email (*)"
 msgstr "이메일 (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "활성화"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "활성화"
 
@@ -1533,7 +1542,7 @@ msgstr "TOTP 활성화"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1542,7 +1551,7 @@ msgstr "TOTP 활성화"
 msgid "Enabled"
 msgstr "활성화됨"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1751,23 +1760,23 @@ msgstr "인증서 삭제 실패"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "데이터베이스에서 인증서 삭제 실패: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "%{msg} 비활성화 실패"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "점검 모드 비활성화 실패: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "%{msg} 활성화 실패"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "유지 보수 모드 활성화 실패: %{msg}"
 
@@ -2078,7 +2087,7 @@ msgstr "ICP 번호"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "비워 둘 경우 기본 CA 디렉터리가 사용됩니다."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2237,7 +2246,7 @@ msgstr "잘못된 요청 형식"
 msgid "Invalid security token format"
 msgstr "잘못된 보안 토큰 형식"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2350,7 +2359,7 @@ msgstr "목록"
 msgid "Load Average:"
 msgstr "평균 부하:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "설정에서 불러오기"
 
@@ -2443,17 +2452,17 @@ msgstr ""
 "페이지의 매개 변수를 수정할 필요가 없습니다. 도커 컨테이너를 사용하여 Nginx UI를 설치하는사용자는이 옵션을 수동으로 활성화할 수 "
 "있습니다. Nginx UI의 크론탭 작업 스케줄러는설정한 간격 (분 단위)에서 logrotate 명령을 실행합니다."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "유지보수"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "유지 관리 모드가 비활성화되었습니다"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "유지 보수 모드가 성공적으로 활성화되었습니다"
 
@@ -2518,7 +2527,7 @@ msgstr "마스터 프로세스"
 msgid "Master Process"
 msgstr "마스터 프로세스"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "최대 시도 횟수"
 
@@ -2617,7 +2626,7 @@ msgstr "모듈"
 msgid "Multi-line Directive"
 msgstr "여러 줄 지시문"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2634,7 +2643,7 @@ msgstr "여러 줄 지시문"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "이름"
 
@@ -2666,6 +2675,10 @@ msgstr "새 설치"
 msgid "New name"
 msgstr "새 이름"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "새 비밀번호"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "새 경로"
@@ -2879,9 +2892,9 @@ msgstr "Nginx.conf에는 streams-enabled 디렉토리가 포함됩니다"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "아니요"
 
@@ -3010,6 +3023,7 @@ msgid "Off"
 msgstr "끔"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3021,13 +3035,13 @@ msgstr "오프라인"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "확인"
@@ -3145,6 +3159,14 @@ msgstr "잘못된 비밀번호"
 msgid "Password length cannot exceed 20 characters"
 msgstr "비밀번호 길이는 20자를 초과할 수 없습니다"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "비밀번호가 성공적으로 업데이트되었습니다"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "비밀번호가 일치하지 않습니다"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3184,6 +3206,10 @@ msgstr "성능 설정이 성공적으로 저장되었습니다"
 msgid "Performing core upgrade"
 msgstr "핵심 업그레이드 수행 중"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "개인 정보"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID 경로가 존재하지 않습니다"
@@ -3298,17 +3324,17 @@ msgstr "백업 파일을 선택해 주세요"
 msgid "Please select at least one item"
 msgstr "최소한 하나의 항목을 선택해 주세요"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Nginx를 다시 로드하려면 최소한 하나의 노드를 선택하십시오"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Nginx를 다시 시작하려면 최소한 하나의 노드를 선택하세요"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "업그레이드할 노드를 최소한 하나 이상 선택해 주세요"
 
@@ -3470,8 +3496,8 @@ msgstr "리로드"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Nginx 다시 로드"
 
@@ -3507,12 +3533,12 @@ msgstr "리로딩 중"
 msgid "Reloading nginx"
 msgstr "Nginx 리로딩 중"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "제거"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "성공적으로 제거되었습니다"
 
@@ -3650,8 +3676,8 @@ msgid "Restart"
 msgstr "재시작"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Nginx 다시 시작"
 
@@ -3729,15 +3755,15 @@ msgid ""
 "action cannot be undone."
 msgstr "인증서를 취소하면 현재 이를 사용 중인 모든 서비스에 영향을 미칩니다. 이 작업은 취소할 수 없습니다."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "RP 표시 이름"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "RP 오리진"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3842,6 +3868,10 @@ msgstr "모듈 이름 검색"
 msgid "Secret has been copied"
 msgstr "비밀번호가 복사되었습니다"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "보안 설정"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3915,7 +3945,7 @@ msgid ""
 "step of DNS challenge."
 msgstr "DNS 챌린지 단계에서 시스템 네임서버를 재정의하기 위해 재귀 네임서버를 설정하세요."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "유지 보수 모드로 설정"
 
@@ -4152,13 +4182,11 @@ msgstr ""
 "링크를 참조하여 해당 구성 파일을 작성하십시오: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "단일 또는 일괄 파일 업로드 지원"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "전체 폴더 업로드 지원"
 
@@ -4470,12 +4498,12 @@ msgstr "이 작업은 구성 파일과 데이터베이스를 복원합니다. 
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "이 작업은 %{nodeNames}의 Nginx UI를 %{version}으로 업그레이드하거나 재설치합니다."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "제한"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "팁"
@@ -4486,7 +4514,7 @@ msgid ""
 "worker_processes or worker_connections"
 msgstr "팁: worker_processes 또는 worker_connections를 증가시켜 동시 처리 능력을 향상시킬 수 있습니다."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "제목"
 
@@ -4598,6 +4626,14 @@ msgstr "유형"
 msgid "Unknown"
 msgstr "알 수 없음"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "비밀번호 업데이트"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "프로필 업데이트"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "성공적으로 업데이트되었습니다"
@@ -4615,8 +4651,8 @@ msgid "Updated at"
 msgstr "업데이트됨"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "업그레이드"
@@ -4642,7 +4678,7 @@ msgstr "파일 업로드"
 msgid "Upload Folders"
 msgstr "폴더 업로드"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "업스트림 이름"
 
@@ -4674,11 +4710,20 @@ msgstr "사용자"
 msgid "User banned"
 msgstr "사용자가 차단되었습니다"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "사용자 정보가 성공적으로 업데이트되었습니다"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "사용자가 OTP를 2FA로 활성화하지 않음"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "사용자 프로필"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "사용자 이름"
 
@@ -4762,7 +4807,7 @@ msgid ""
 "the Nginx. Are you sure you want to continue?"
 msgstr "이 파일에서 HTTPChallenge 구성을 제거하고 Nginx를 다시 로드할 예정입니다. 계속하시겠습니까?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "웹인증"
 
@@ -4837,12 +4882,12 @@ msgstr "인증서를 디스크에 쓰기"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "예"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -4932,9 +4977,6 @@ msgstr "귀하의 패스키"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "총 %{total} 항목"
 
-#~ msgid "Updated successfully"
-#~ msgstr "성공적으로 업데이트되었습니다"
-
 #~ msgid "View Details"
 #~ msgstr "상세 보기"
 

+ 124 - 73
app/src/language/messages.pot

@@ -90,7 +90,7 @@ msgstr ""
 msgid "2FA"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr ""
 
@@ -117,8 +117,7 @@ msgstr ""
 msgid "ACME User"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr ""
 
@@ -129,6 +128,7 @@ msgstr ""
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
 #: src/views/site/site_list/columns.tsx:129
 #: src/views/stream/columns.tsx:64
@@ -146,11 +146,11 @@ msgid "Actual worker to configured ratio"
 msgstr ""
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159
 #: src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr ""
 
@@ -179,7 +179,7 @@ msgstr ""
 msgid "Add Site"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr ""
 
@@ -237,7 +237,7 @@ msgstr ""
 msgid "Arch"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr ""
 
@@ -267,8 +267,8 @@ msgid "Are you sure you want to delete permanently?"
 msgstr ""
 
 #: src/language/curd.ts:25
-#: src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr ""
 
@@ -308,7 +308,7 @@ msgstr ""
 msgid "Attempt to fix"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr ""
 
@@ -320,7 +320,7 @@ msgstr ""
 msgid "Authenticate with a passkey"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr ""
 
@@ -397,15 +397,15 @@ msgstr ""
 msgid "Backup has been downloaded successfully"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr ""
 
@@ -511,7 +511,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -630,6 +630,10 @@ msgstr ""
 msgid "Change Certificate"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr ""
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -858,6 +862,10 @@ msgstr ""
 msgid "Configure SSL"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr ""
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr ""
@@ -866,7 +874,7 @@ msgstr ""
 msgid "Connection error, trying to reconnect..."
 msgstr ""
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr ""
 
@@ -922,7 +930,7 @@ msgstr ""
 msgid "CPU:"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr ""
 
@@ -948,7 +956,7 @@ msgid "Create system backups including Nginx configuration and Nginx UI settings
 msgstr ""
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -987,6 +995,10 @@ msgstr ""
 msgid "Current Content"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr ""
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr ""
@@ -1027,8 +1039,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129
 #: src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr ""
 
@@ -1108,7 +1120,7 @@ msgstr ""
 msgid "Destination file: {0} already exists"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr ""
 
@@ -1152,11 +1164,11 @@ msgstr ""
 msgid "Directory path to store cache files"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr ""
 
@@ -1219,7 +1231,7 @@ msgstr ""
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114
 #: src/views/stream/columns.tsx:48
@@ -1228,7 +1240,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1256,7 +1268,7 @@ msgstr ""
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr ""
 
@@ -1330,9 +1342,9 @@ msgid "Due to the security policies of some browsers, you cannot use passkeys on
 msgstr ""
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr ""
 
@@ -1377,11 +1389,11 @@ msgstr ""
 msgid "Email (*)"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr ""
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr ""
 
@@ -1481,7 +1493,7 @@ msgstr ""
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110
 #: src/views/stream/columns.tsx:44
@@ -1491,7 +1503,7 @@ msgstr ""
 msgid "Enabled"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1701,23 +1713,23 @@ msgstr ""
 msgid "Failed to delete certificate from database: %{error}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr ""
 
@@ -2027,7 +2039,7 @@ msgstr ""
 msgid "If left blank, the default CA Dir will be used."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid "If the number of login failed attempts from a ip reach the max attempts in ban threshold minutes, the ip will be banned for a period of time."
 msgstr ""
 
@@ -2177,7 +2189,7 @@ msgstr ""
 msgid "Invalid security token format"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr ""
 
@@ -2288,7 +2300,7 @@ msgstr ""
 msgid "Load Average:"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr ""
 
@@ -2370,17 +2382,17 @@ msgstr ""
 msgid "Logrotate, by default, is enabled in most mainstream Linux distributions for users who install Nginx UI on the host machine, so you don't need to modify the parameters on this page. For users who install Nginx UI using Docker containers, you can manually enable this option. The crontab task scheduler of Nginx UI will execute the logrotate command at the interval you set in minutes."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr ""
 
@@ -2448,7 +2460,7 @@ msgstr ""
 msgid "Master Process"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr ""
 
@@ -2548,7 +2560,7 @@ msgstr ""
 msgid "Multi-line Directive"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2566,7 +2578,7 @@ msgstr ""
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr ""
 
@@ -2598,6 +2610,10 @@ msgstr ""
 msgid "New name"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr ""
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr ""
@@ -2814,10 +2830,10 @@ msgstr ""
 #: src/components/Notification/Notification.vue:109
 #: src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97
-#: src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98
+#: src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr ""
 
@@ -2943,6 +2959,7 @@ msgid "Off"
 msgstr ""
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -2955,13 +2972,13 @@ msgstr ""
 #: src/components/Notification/Notification.vue:110
 #: src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr ""
@@ -3076,6 +3093,14 @@ msgstr ""
 msgid "Password length cannot exceed 20 characters"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr ""
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr ""
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59
@@ -3117,6 +3142,10 @@ msgstr ""
 msgid "Performing core upgrade"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr ""
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr ""
@@ -3219,17 +3248,17 @@ msgstr ""
 msgid "Please select at least one item"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr ""
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr ""
 
@@ -3390,8 +3419,8 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr ""
 
@@ -3427,12 +3456,12 @@ msgstr ""
 msgid "Reloading nginx"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr ""
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr ""
 
@@ -3568,8 +3597,8 @@ msgid "Restart"
 msgstr ""
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr ""
 
@@ -3645,15 +3674,15 @@ msgstr ""
 msgid "Revoking a certificate will affect any services currently using it. This action cannot be undone."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr ""
 
@@ -3762,6 +3791,10 @@ msgstr ""
 msgid "Secret has been copied"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr ""
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3835,7 +3868,7 @@ msgstr ""
 msgid "Set the recursive nameservers to override the systems nameservers for the step of DNS challenge."
 msgstr ""
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr ""
 
@@ -4343,12 +4376,12 @@ msgstr ""
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr ""
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr ""
@@ -4357,7 +4390,7 @@ msgstr ""
 msgid "Tips: You can increase the concurrency processing capacity by increasing worker_processes or worker_connections"
 msgstr ""
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr ""
 
@@ -4449,6 +4482,14 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr ""
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr ""
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr ""
@@ -4468,8 +4509,8 @@ msgid "Updated at"
 msgstr ""
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154
 #: src/views/system/Upgrade.vue:159
 msgid "Upgrade"
@@ -4496,7 +4537,7 @@ msgstr ""
 msgid "Upload Folders"
 msgstr ""
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr ""
 
@@ -4528,12 +4569,22 @@ msgstr ""
 msgid "User banned"
 msgstr ""
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr ""
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr ""
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr ""
+
 #: src/views/other/Login.vue:173
 #: src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127
+#: src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr ""
 
@@ -4612,7 +4663,7 @@ msgstr ""
 msgid "We will remove the HTTPChallenge configuration from this file and reload the Nginx. Are you sure you want to continue?"
 msgstr ""
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr ""
 
@@ -4679,12 +4730,12 @@ msgstr ""
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr ""
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid "You are accessing this terminal over an insecure HTTP connection on a non-localhost domain. This may expose sensitive information."
 msgstr ""
 

+ 127 - 85
app/src/language/pt_PT/app.po

@@ -104,7 +104,7 @@ msgstr "[Nginx UI] A escrever o certificado no disco"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "Definições 2FA"
 
@@ -130,8 +130,7 @@ msgstr "Logs de Acesso"
 msgid "ACME User"
 msgstr "Utilizador ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Acção"
 
@@ -142,9 +141,9 @@ msgstr "Acção"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Ações"
@@ -159,10 +158,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Rácio real de workers para configurado"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Adicionar"
 
@@ -189,7 +188,7 @@ msgstr "Adicionar Local"
 msgid "Add Site"
 msgstr "Adicionar Site"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Adicionar Stream"
 
@@ -249,7 +248,7 @@ msgstr "Aplicação"
 msgid "Arch"
 msgstr "\"Arquitetura\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Tem certeza que pretende eliminar este IP banido imediatamente?"
 
@@ -278,8 +277,8 @@ msgstr "Tem certeza que pretende limpar o registo do chat?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Tem a certeza de que pretende eliminar permanentemente?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Tem certeza que pretende eliminar?"
 
@@ -323,7 +322,7 @@ msgstr "Assistente"
 msgid "Attempt to fix"
 msgstr "Tentar corrigir"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Tentativas"
 
@@ -335,7 +334,7 @@ msgstr "Auth"
 msgid "Authenticate with a passkey"
 msgstr "Autenticar com uma chave de acesso"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Definições de Autenticação"
 
@@ -412,15 +411,15 @@ msgstr "Ficheiro de cópia de segurança não encontrado: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "O backup foi descarregado com sucesso"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Minutos Limite para Banir"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "IPs Banidos"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Banido Até"
 
@@ -530,7 +529,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -651,6 +650,10 @@ msgstr "Método do Challenge"
 msgid "Change Certificate"
 msgstr "Alterar Certificado"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Alterar senha"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -820,13 +823,11 @@ msgstr "Limpo com sucesso"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Clique ou arraste o arquivo de backup para esta área para fazer o upload"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Clique ou arraste ficheiros para esta área para carregar"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Clique ou arraste pastas para esta área para carregar"
 
@@ -946,6 +947,10 @@ msgstr "Configurações"
 msgid "Configure SSL"
 msgstr "Configurar SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Confirmar nova palavra-passe"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Conectado"
@@ -954,7 +959,7 @@ msgstr "Conectado"
 msgid "Connection error, trying to reconnect..."
 msgstr "Erro de conexão, tentando reconectar..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Ligação perdida, por favor actualize a página."
 
@@ -1012,7 +1017,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Criar"
 
@@ -1042,7 +1047,7 @@ msgstr ""
 "automaticamente para o seu computador."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1081,6 +1086,10 @@ msgstr "Ligações ativas atuais"
 msgid "Current Content"
 msgstr "Conteúdo atual"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Palavra-passe atual"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Utilização atual"
@@ -1122,8 +1131,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Eliminar"
 
@@ -1200,7 +1209,7 @@ msgstr "O ficheiro de destino já existe"
 msgid "Destination file: {0} already exists"
 msgstr "Ficheiro de destino: {0} já existe"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Detalhes"
 
@@ -1244,11 +1253,11 @@ msgstr "Níveis de diretório"
 msgid "Directory path to store cache files"
 msgstr "Caminho do diretório para armazenar ficheiros de cache"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Desativar"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Desativar"
 
@@ -1309,7 +1318,7 @@ msgstr "Desativar o fluxo %{name} de %{node} com sucesso"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1317,7 +1326,7 @@ msgstr "Desativar o fluxo %{name} de %{node} com sucesso"
 msgid "Disabled"
 msgstr "Desativado"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1345,7 +1354,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "Não ative esta opção a menos que tenha a certeza de que precisa dela."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Deseja %{action} este site?"
 
@@ -1423,9 +1432,9 @@ msgstr ""
 "localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Duplicado"
 
@@ -1469,11 +1478,11 @@ msgstr "E-mail"
 msgid "Email (*)"
 msgstr "E-mail (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "ativar"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Activar"
 
@@ -1571,7 +1580,7 @@ msgstr "Ativar TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1580,7 +1589,7 @@ msgstr "Ativar TOTP"
 msgid "Enabled"
 msgstr "Activado"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1789,23 +1798,23 @@ msgstr "Falha ao eliminar o certificado"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Falha ao eliminar o certificado da base de dados: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Falha ao desactivar %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Falha ao desativar o modo de manutenção: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Falha ao Activar %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Falha ao ativar o modo de manutenção: %{msg}"
 
@@ -2118,7 +2127,7 @@ msgstr "Número ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Se for deixado em branco, será utilizado o diretório CA padrão."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2288,7 +2297,7 @@ msgstr "Formato de pedido inválido"
 msgid "Invalid security token format"
 msgstr "Formato de token de segurança inválido"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2403,7 +2412,7 @@ msgstr "Lista"
 msgid "Load Average:"
 msgstr "Média de Carga:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Carregar a partir das configurações"
 
@@ -2501,17 +2510,17 @@ msgstr ""
 "activar manualmente esta opção. O agendador de tarefas crontab do Nginx UI "
 "executará o comando logrotate no intervalo que definir em minutos."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Manutenção"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Modo de manutenção desativado com sucesso"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Modo de manutenção ativado com sucesso"
 
@@ -2578,7 +2587,7 @@ msgstr "Processo principal"
 msgid "Master Process"
 msgstr "Processo mestre"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Máximo de Tentativas"
 
@@ -2677,7 +2686,7 @@ msgstr "Módulos"
 msgid "Multi-line Directive"
 msgstr "Diretiva Multilinha"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2694,7 +2703,7 @@ msgstr "Diretiva Multilinha"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Nome"
 
@@ -2726,6 +2735,10 @@ msgstr "Nova instalação"
 msgid "New name"
 msgstr "Novo nome"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Nova senha"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Novo Caminho"
@@ -2941,9 +2954,9 @@ msgstr "Nginx.conf inclui o diretório streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Não"
 
@@ -3078,6 +3091,7 @@ msgid "Off"
 msgstr "Desligado"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3089,13 +3103,13 @@ msgstr "Off-line"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "OK"
@@ -3215,6 +3229,14 @@ msgstr "Palavra-passe incorreta"
 msgid "Password length cannot exceed 20 characters"
 msgstr "O comprimento da palavra-passe não pode exceder 20 caracteres"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Palavra-passe atualizada com sucesso"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "As palavras-passe não coincidem"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3254,6 +3276,10 @@ msgstr "Configurações de desempenho guardadas com sucesso"
 msgid "Performing core upgrade"
 msgstr "Executando actualização do core"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Informações pessoais"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "O caminho do PID não existe"
@@ -3384,17 +3410,17 @@ msgstr "Por favor, selecione um ficheiro de cópia de segurança"
 msgid "Please select at least one item"
 msgstr "Por favor, selecione pelo menos um item"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Por favor, selecione pelo menos um nó para recarregar o Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Por favor, selecione pelo menos um nó para reiniciar o Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Por favor, selecione pelo menos um nó para atualizar"
 
@@ -3560,8 +3586,8 @@ msgstr "Recarregar"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Recarregar Nginx"
 
@@ -3597,12 +3623,12 @@ msgstr "Recarregando"
 msgid "Reloading nginx"
 msgstr "Recarregando Nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Remover"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Removido com sucesso"
 
@@ -3743,8 +3769,8 @@ msgid "Restart"
 msgstr "Reiniciar"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Reiniciar Nginx"
 
@@ -3824,15 +3850,15 @@ msgstr ""
 "A revogação de um certificado afetará quaisquer serviços que o estejam a "
 "utilizar atualmente. Esta ação não pode ser desfeita."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Nome de Exibição RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Origens RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3939,6 +3965,10 @@ msgstr "Nome do módulo de pesquisa"
 msgid "Secret has been copied"
 msgstr "O segredo foi copiado"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Configurações de segurança"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4016,7 +4046,7 @@ msgstr ""
 "Configure os nameservers recursivos para substituir os nameservers dos "
 "sistemas na etapa de DNS challenge."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "definir como modo de manutenção"
 
@@ -4259,13 +4289,11 @@ msgstr ""
 "consulte este link para escrever o ficheiro de configuração correspondente: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Suporta upload único ou em lote de ficheiros"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Suporta o carregamento de pastas inteiras"
 
@@ -4608,12 +4636,12 @@ msgstr ""
 "Isto vai actualizar ou reinstalar o Nginx UI em %{nodeNames} para "
 "%{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Limitação"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Dicas"
@@ -4626,7 +4654,7 @@ msgstr ""
 "Dica: Pode aumentar a capacidade de processamento concorrente aumentando "
 "worker_processes ou worker_connections."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Título"
 
@@ -4746,6 +4774,14 @@ msgstr "Tipo"
 msgid "Unknown"
 msgstr "Desconhecido"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Atualizar senha"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Atualizar perfil"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Atualização bem-sucedida"
@@ -4763,8 +4799,8 @@ msgid "Updated at"
 msgstr "Actualizado em"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Actualizar"
@@ -4790,7 +4826,7 @@ msgstr "Carregar ficheiros"
 msgid "Upload Folders"
 msgstr "Carregar pastas"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Nome do Upstream"
 
@@ -4822,11 +4858,20 @@ msgstr "Utilizador"
 msgid "User banned"
 msgstr "Utilizador banido"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Informações do utilizador atualizadas com sucesso"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Utilizador não ativou OTP como 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Perfil do utilizador"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Nome de Utilizador"
 
@@ -4917,7 +4962,7 @@ msgstr ""
 "Removeremos a configuração HTTPChallenge deste ficheiro e reiniciaremos o "
 "Nginx. Tem a certeza de que quer continuar?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -4997,12 +5042,12 @@ msgstr "Escrevendo certificado no disco"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Sim"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5099,9 +5144,6 @@ msgstr "As suas chaves de acesso"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Total %{total} item"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Actualizado com sucesso"
-
 #~ msgid "View Details"
 #~ msgstr "Ver Detalhes"
 

+ 127 - 85
app/src/language/ru_RU/app.po

@@ -108,7 +108,7 @@ msgstr "[Nginx UI] Запись сертификата на диск"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "Настройки 2FA"
 
@@ -134,8 +134,7 @@ msgstr "Журналы доступа"
 msgid "ACME User"
 msgstr "Пользователь ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Действие"
 
@@ -146,9 +145,9 @@ msgstr "Действие"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Действия"
@@ -163,10 +162,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Фактическое соотношение рабочих к настроенным"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Добавить"
 
@@ -193,7 +192,7 @@ msgstr "Добавить Location"
 msgid "Add Site"
 msgstr "Добавить Сайт"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Добавить поток"
 
@@ -251,7 +250,7 @@ msgstr "Приложение"
 msgid "Arch"
 msgstr "\"Архитектура\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Вы уверены, что хотите немедленно удалить этот заблокированный IP?"
 
@@ -280,8 +279,8 @@ msgstr "Вы уверены, что хотите очистить сообщен
 msgid "Are you sure you want to delete permanently?"
 msgstr "Вы уверены, что хотите удалить безвозвратно?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Вы уверены, что хотите удалить?"
 
@@ -325,7 +324,7 @@ msgstr "Ассистент"
 msgid "Attempt to fix"
 msgstr "Попытка исправить"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Попытки"
 
@@ -337,7 +336,7 @@ msgstr "Авторизация"
 msgid "Authenticate with a passkey"
 msgstr "Аутентификация с помощью ключа доступа"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Настройки аутентификации"
 
@@ -414,15 +413,15 @@ msgstr "Файл резервной копии не найден: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "Резервная копия успешно загружена"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Порог блокировки в минутах"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "Заблокированные IP-адреса"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Заблокирован до"
 
@@ -534,7 +533,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -653,6 +652,10 @@ msgstr "Метод Challenge"
 msgid "Change Certificate"
 msgstr "Изменить сертификат"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Изменить пароль"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -821,13 +824,11 @@ msgstr ""
 "Нажмите или перетащите файл резервного копирования в эту область, чтобы "
 "загрузить"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Нажмите или перетащите файлы в эту область для загрузки"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Нажмите или перетащите папки в эту область для загрузки"
 
@@ -947,6 +948,10 @@ msgstr "Конфигурации"
 msgid "Configure SSL"
 msgstr "Настроить SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Подтвердите новый пароль"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Подключено"
@@ -955,7 +960,7 @@ msgstr "Подключено"
 msgid "Connection error, trying to reconnect..."
 msgstr "Ошибка соединения, попытка переподключения..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Соединение потеряно, пожалуйста, обновите страницу."
 
@@ -1013,7 +1018,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Создать"
 
@@ -1043,7 +1048,7 @@ msgstr ""
 "компьютер."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1082,6 +1087,10 @@ msgstr "Текущие активные подключения"
 msgid "Current Content"
 msgstr "Текущее содержимое"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Текущий пароль"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Текущее использование"
@@ -1121,8 +1130,8 @@ msgstr "Определите имя и размер зоны общей памя
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Удалить"
 
@@ -1199,7 +1208,7 @@ msgstr "Файл назначения уже существует"
 msgid "Destination file: {0} already exists"
 msgstr "Файл назначения: {0} уже существует"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Детали"
 
@@ -1243,11 +1252,11 @@ msgstr "Уровни каталога"
 msgid "Directory path to store cache files"
 msgstr "Путь к каталогу для хранения кэшированных файлов"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Отключить"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Отключить"
 
@@ -1308,7 +1317,7 @@ msgstr "Поток %{name} отключен от %{node} успешно"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1316,7 +1325,7 @@ msgstr "Поток %{name} отключен от %{node} успешно"
 msgid "Disabled"
 msgstr "Отключено"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1344,7 +1353,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "Не включайте эту опцию, если не уверены, что она вам нужна."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Вы хотите %{action} этот сайт?"
 
@@ -1422,9 +1431,9 @@ msgstr ""
 "запускаются на localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Дублировать"
 
@@ -1468,11 +1477,11 @@ msgstr "Электронная почта"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "включить"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Включить"
 
@@ -1570,7 +1579,7 @@ msgstr "Включить TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1579,7 +1588,7 @@ msgstr "Включить TOTP"
 msgid "Enabled"
 msgstr "Включено"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1788,23 +1797,23 @@ msgstr "Не удалось удалить сертификат"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Не удалось удалить сертификат из базы данных: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Не удалось отключить %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Не удалось отключить режим обслуживания: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Не удалось включить %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Не удалось включить режим обслуживания: %{msg}"
 
@@ -2117,7 +2126,7 @@ msgstr "ICP номер"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Если оставить пустым, будет использоваться каталог CA по умолчанию."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2285,7 +2294,7 @@ msgstr "Неверный формат запроса"
 msgid "Invalid security token format"
 msgstr "Неверный формат токена безопасности"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2400,7 +2409,7 @@ msgstr "Список"
 msgid "Load Average:"
 msgstr "Средняя нагрузка:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Загрузить из настроек"
 
@@ -2498,17 +2507,17 @@ msgstr ""
 "можете вручную включить эту опцию. Планировщик задач crontab Nginx UI будет "
 "выполнять команду logrotate с интервалом, который вы установите в минутах."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Техническое обслуживание"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Режим обслуживания успешно отключен"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Режим обслуживания успешно включен"
 
@@ -2575,7 +2584,7 @@ msgstr "Главный процесс"
 msgid "Master Process"
 msgstr "Главный процесс"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Максимальное количество попыток"
 
@@ -2674,7 +2683,7 @@ msgstr "Модули"
 msgid "Multi-line Directive"
 msgstr "Многострочная директива"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2691,7 +2700,7 @@ msgstr "Многострочная директива"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Имя"
 
@@ -2723,6 +2732,10 @@ msgstr "Новая установка"
 msgid "New name"
 msgstr "Новое имя"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Новый пароль"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Новый путь"
@@ -2938,9 +2951,9 @@ msgstr "Nginx.conf включает каталог streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Нет"
 
@@ -3075,6 +3088,7 @@ msgid "Off"
 msgstr "Выкл"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3086,13 +3100,13 @@ msgstr "Оффлайн"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "ОК"
@@ -3212,6 +3226,14 @@ msgstr "Неверный пароль"
 msgid "Password length cannot exceed 20 characters"
 msgstr "Длина пароля не может превышать 20 символов"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Пароль успешно обновлен"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Пароли не совпадают"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3251,6 +3273,10 @@ msgstr "Настройки производительности успешно 
 msgid "Performing core upgrade"
 msgstr "Выполнение обновления ядра"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Личная информация"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "Путь PID не существует"
@@ -3386,17 +3412,17 @@ msgstr "Пожалуйста, выберите файл резервной ко
 msgid "Please select at least one item"
 msgstr "Пожалуйста, выберите хотя бы один элемент"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Пожалуйста, выберите хотя бы один узел для перезагрузки Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Пожалуйста, выберите хотя бы один узел для перезапуска Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Пожалуйста, выберите хотя бы один узел"
 
@@ -3562,8 +3588,8 @@ msgstr "Перегрузить"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Перезагрузить Nginx"
 
@@ -3599,12 +3625,12 @@ msgstr "Перезагружается"
 msgid "Reloading nginx"
 msgstr "Перезагружается nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Удалить"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Удалено успешно"
 
@@ -3743,8 +3769,8 @@ msgid "Restart"
 msgstr "Перезапуск"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Перезапустить Nginx"
 
@@ -3824,15 +3850,15 @@ msgstr ""
 "Отзыв сертификата затронет все службы, которые его используют в данный "
 "момент. Это действие нельзя отменить."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Отображаемое имя RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Истоки RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3939,6 +3965,10 @@ msgstr "Название модуля поиска"
 msgid "Secret has been copied"
 msgstr "Секрет скопирован"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Настройки безопасности"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4014,7 +4044,7 @@ msgstr ""
 "Установите рекурсивные серверы имен, чтобы переопределить системные серверы "
 "имен для шага проверки DNS."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "перевести в режим обслуживания"
 
@@ -4253,13 +4283,11 @@ msgstr ""
 "написать соответствующий конфигурационный файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Поддержка одиночной или пакетной загрузки файлов"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Поддержка загрузки целых папок"
 
@@ -4603,12 +4631,12 @@ msgstr ""
 "Это обновит или переустановит интерфейс Nginx на %{nodeNames} до версии "
 "%{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Ограничение"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Советы"
@@ -4621,7 +4649,7 @@ msgstr ""
 "Совет: Вы можете увеличить пропускную способность обработки параллельных "
 "запросов, увеличив worker_processes или worker_connections."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Заголовок"
 
@@ -4741,6 +4769,14 @@ msgstr "Тип"
 msgid "Unknown"
 msgstr "Неизвестно"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Обновить пароль"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Обновить профиль"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Успешно обновлено"
@@ -4758,8 +4794,8 @@ msgid "Updated at"
 msgstr "Обновлено в"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Обновление"
@@ -4785,7 +4821,7 @@ msgstr "Загрузить файлы"
 msgid "Upload Folders"
 msgstr "Загрузить папки"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Имя Upstream"
 
@@ -4817,11 +4853,20 @@ msgstr "Пользователь"
 msgid "User banned"
 msgstr "Пользователь заблокирован"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Информация о пользователе успешно обновлена"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Пользователь не включил OTP в качестве 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Профиль пользователя"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Имя пользователя"
 
@@ -4912,7 +4957,7 @@ msgstr ""
 "Мы удалим конфигурацию HTTPChallenge из этого файла и перезагрузим Nginx. "
 "Вы уверены, что хотите продолжить?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "WebAuthn"
 
@@ -4992,12 +5037,12 @@ msgstr "Запись сертификата на диск"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Да"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5093,9 +5138,6 @@ msgstr "Ваши ключи доступа"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Всего %{total} элемент"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Успешно обновлено"
-
 #~ msgid "View Details"
 #~ msgstr "Подробно"
 

+ 127 - 85
app/src/language/tr_TR/app.po

@@ -104,7 +104,7 @@ msgstr "[Nginx UI] Sertifika diske yazılıyor"
 msgid "2FA"
 msgstr "İki aşamalı kimlik doğrulaması(2FA)"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "2FA Ayarları"
 
@@ -130,8 +130,7 @@ msgstr "Erişim Günlükleri"
 msgid "ACME User"
 msgstr "ACME Kullanıcısı"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Eylem"
 
@@ -142,9 +141,9 @@ msgstr "Eylem"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "İşlemler"
@@ -159,10 +158,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Gerçek çalışanın yapılandırılmışa oranı"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Ekle"
 
@@ -189,7 +188,7 @@ msgstr "Konum ekle"
 msgid "Add Site"
 msgstr "Site Ekle"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Akış Ekle"
 
@@ -247,7 +246,7 @@ msgstr "Uygulama"
 msgid "Arch"
 msgstr "\"Mimari\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Bu yasaklı IP'yi hemen sileceğinizden emin misiniz?"
 
@@ -276,8 +275,8 @@ msgstr "Sohbet kaydını silmek istediğinizden emin misiniz?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Kalıcı olarak silmek istediğinizden emin misiniz?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Silmek istediğine emin misin?"
 
@@ -321,7 +320,7 @@ msgstr "Asistan"
 msgid "Attempt to fix"
 msgstr "Düzeltmeyi dene"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Girişimler"
 
@@ -333,7 +332,7 @@ msgstr "Kimlik Doğrulama"
 msgid "Authenticate with a passkey"
 msgstr "Geçiş anahtarıyla kimlik doğrulama"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Kimlik Doğrulama Ayarları"
 
@@ -408,15 +407,15 @@ msgstr "Yedek dosya bulunamadı: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "Yedek başarıyla indirildi"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Yasaklama Eşiği Süresi (Dakika)"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "Yasaklı IP'ler"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Şu Zamana Kadar Yasaklı"
 
@@ -526,7 +525,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -645,6 +644,10 @@ msgstr "Doğrulama Yöntemi"
 msgid "Change Certificate"
 msgstr "Sertifika Değiştir"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Şifreyi Değiştir"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -816,13 +819,11 @@ msgstr "Başarıyla temizlendi"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Yüklemek için bu alana yedekleme dosyasını tıklayın veya sürükleyin"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Yüklemek için dosyaları bu alana tıklayın veya sürükleyin"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Yüklemek için klasörleri bu alana tıklayın veya sürükleyin"
 
@@ -942,6 +943,10 @@ msgstr "Yapılandırmalar"
 msgid "Configure SSL"
 msgstr "SSL'yi Yapılandırma"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Yeni Şifreyi Onayla"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Bağlandı"
@@ -950,7 +955,7 @@ msgstr "Bağlandı"
 msgid "Connection error, trying to reconnect..."
 msgstr "Bağlantı hatası, yeniden bağlanılmaya çalışılıyor..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Bağlantı kesildi, lütfen sayfayı yenileyin."
 
@@ -1008,7 +1013,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Oluştur"
 
@@ -1037,7 +1042,7 @@ msgstr ""
 "oluşturun. Yedek dosyaları otomatik olarak bilgisayarınıza indirilecektir."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1076,6 +1081,10 @@ msgstr "Mevcut aktif bağlantılar"
 msgid "Current Content"
 msgstr "Mevcut İçerik"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Mevcut Şifre"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Mevcut kullanım"
@@ -1117,8 +1126,8 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Sil"
 
@@ -1195,7 +1204,7 @@ msgstr "Hedef dosya zaten mevcut"
 msgid "Destination file: {0} already exists"
 msgstr "Hedef dosya: {0} zaten mevcut"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Detaylar"
 
@@ -1239,11 +1248,11 @@ msgstr "Dizin Seviyeleri"
 msgid "Directory path to store cache files"
 msgstr "Önbellek dosyalarını depolamak için dizin yolu"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Devre dışı bırak"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Devre Dışı Bırak"
 
@@ -1304,7 +1313,7 @@ msgstr "Akış %{name}, %{node} üzerinden başarıyla devre dışı bırakıld
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1312,7 +1321,7 @@ msgstr "Akış %{name}, %{node} üzerinden başarıyla devre dışı bırakıld
 msgid "Disabled"
 msgstr "Devre dışı"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1340,7 +1349,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "Bu seçeneği, ihtiyacınız olduğundan emin olmadıkça etkinleştirmeyin."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Bu siteyi %{action} etmek istiyor musunuz?"
 
@@ -1420,9 +1429,9 @@ msgstr ""
 "kullanamazsınız."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Kopyala"
 
@@ -1466,11 +1475,11 @@ msgstr "E-posta"
 msgid "Email (*)"
 msgstr "E-posta(*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "etkinleştir"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Etkinleştir"
 
@@ -1568,7 +1577,7 @@ msgstr "TOTP'yi Etkinleştir"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1577,7 +1586,7 @@ msgstr "TOTP'yi Etkinleştir"
 msgid "Enabled"
 msgstr "Etkin"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1786,23 +1795,23 @@ msgstr "Sertifika silinemedi"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Sertifika veritabanından silinemedi: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Devre dışı bırakılamadı %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Bakım modu devre dışı bırakılamadı: %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Etkinleştirilemedi %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Bakım modu etkinleştirilemedi: %{msg}"
 
@@ -2115,7 +2124,7 @@ msgstr "ICP Numarası"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Boş bırakılırsa, varsayılan CA Dir kullanılır."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2287,7 +2296,7 @@ msgstr "Geçersiz istek biçimi"
 msgid "Invalid security token format"
 msgstr "Geçersiz güvenlik belirteci biçimi"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2402,7 +2411,7 @@ msgstr "Liste"
 msgid "Load Average:"
 msgstr "Yük Ortalaması:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Ayarlar'dan yükle"
 
@@ -2499,17 +2508,17 @@ msgstr ""
 "olarak etkinleştirebilir. Nginx UI'nin crontab görev zamanlayıcısı, "
 "belirlediğiniz dakika aralığında logrotate komutunu çalıştıracaktır."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Bakım"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Bakım modu başarıyla devre dışı bırakıldı"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Bakım modu başarıyla etkinleştirildi"
 
@@ -2576,7 +2585,7 @@ msgstr "Ana süreç"
 msgid "Master Process"
 msgstr "Ana Süreç"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Maksimum Deneme Sayısı"
 
@@ -2675,7 +2684,7 @@ msgstr "Modüller"
 msgid "Multi-line Directive"
 msgstr "Çok Satırlı Yönergeler"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2692,7 +2701,7 @@ msgstr "Çok Satırlı Yönergeler"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "İsim"
 
@@ -2724,6 +2733,10 @@ msgstr "Yeni Kurulum"
 msgid "New name"
 msgstr "Yeni ad"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Yeni Şifre"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Yeni Yol"
@@ -2939,9 +2952,9 @@ msgstr "Nginx.conf, streams-enabled dizinini içerir"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Hayır"
 
@@ -3076,6 +3089,7 @@ msgid "Off"
 msgstr "Kapalı"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3087,13 +3101,13 @@ msgstr "Çevrimdışı"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "Tamam"
@@ -3212,6 +3226,14 @@ msgstr "Yanlış şifre"
 msgid "Password length cannot exceed 20 characters"
 msgstr "Şifre uzunluğu 20 karakteri geçemez"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Şifre başarıyla güncellendi"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Şifreler eşleşmiyor"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3251,6 +3273,10 @@ msgstr "Performans ayarları başarıyla kaydedildi"
 msgid "Performing core upgrade"
 msgstr "Çekirdek yükseltme gerçekleştiriliyor"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Kişisel Bilgiler"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID yolu mevcut değil"
@@ -3382,17 +3408,17 @@ msgstr "Lütfen bir yedekleme dosyası seçin"
 msgid "Please select at least one item"
 msgstr "Lütfen en az bir öğe seçin"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Lütfen Nginx'i yeniden yüklemek için en az bir düğüm seçin"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Lütfen Nginx'i yeniden başlatmak için en az bir düğüm seçin"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Lütfen yükseltmek için en az bir düğüm seçin"
 
@@ -3558,8 +3584,8 @@ msgstr "Yeniden Yükle"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Nginx'i Yeniden Yükle"
 
@@ -3595,12 +3621,12 @@ msgstr "Yeniden Yükleniyor"
 msgid "Reloading nginx"
 msgstr "nginx yeniden yükleniyor"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Kaldır"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Başarıyla kaldırıldı"
 
@@ -3748,8 +3774,8 @@ msgid "Restart"
 msgstr "Yeniden Başlat"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Nginx'i Yeniden Başlat"
 
@@ -3829,15 +3855,15 @@ msgstr ""
 "Bir sertifikanın iptal edilmesi, şu anda onu kullanan tüm hizmetleri "
 "etkileyecektir. Bu işlem geri alınamaz."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "RP Görünen Adı"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "RP Kökenleri"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3942,6 +3968,10 @@ msgstr "Modül adı ara"
 msgid "Secret has been copied"
 msgstr "Gizli kod kopyalandı"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Güvenlik Ayarları"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4017,7 +4047,7 @@ msgstr ""
 "DNS sorgulama adımında sistem ad sunucularını geçersiz kılmak için "
 "özyinelemeli ad sunucularını ayarlayın."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "bakım moduna ayarla"
 
@@ -4256,13 +4286,11 @@ msgstr ""
 "dosyasını yazmak için bu bağlantıya bakın: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Tek veya toplu dosya yüklemeyi destekler"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Tüm klasörlerin yüklenmesini destekler"
 
@@ -4607,12 +4635,12 @@ msgstr ""
 "Bu işlem, %{nodeNames} üzerindeki Nginx UI'yi %{version} sürümüne "
 "yükseltecek veya yeniden yükleyecektir."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Kısıtlama"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "İpuçları"
@@ -4625,7 +4653,7 @@ msgstr ""
 "İpucu: worker_processes veya worker_connections değerlerini artırarak "
 "eşzamanlı işleme kapasitesini artırabilirsiniz."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Başlık"
 
@@ -4745,6 +4773,14 @@ msgstr "Tür"
 msgid "Unknown"
 msgstr "Bilinmeyen"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Şifreyi Güncelle"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Profili Güncelle"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Başarıyla güncellendi"
@@ -4762,8 +4798,8 @@ msgid "Updated at"
 msgstr "Güncellenme Tarihi"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Yükselt"
@@ -4789,7 +4825,7 @@ msgstr "Dosyaları Yükle"
 msgid "Upload Folders"
 msgstr "Klasörleri Yükle"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Yukarı Akış Adı"
 
@@ -4821,11 +4857,20 @@ msgstr "Kullanıcı"
 msgid "User banned"
 msgstr "Kullanıcı yasaklandı"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Kullanıcı bilgileri başarıyla güncellendi"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Kullanıcı OTP'yi 2FA olarak etkinleştirmedi"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Kullanıcı Profili"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Kullanıcı Adı"
 
@@ -4916,7 +4961,7 @@ msgstr ""
 "Bu dosyadan HTTPChallenge yapılandırmasını kaldıracağız ve Nginx'i yeniden "
 "yükleyeceğiz. Devam etmek istediğinizden emin misiniz?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "WebAuthn"
 
@@ -4997,12 +5042,12 @@ msgstr "Sertifika diske yazılıyor"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Evet"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5099,9 +5144,6 @@ msgstr "Geçiş Anahtarlarınız"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Toplam %{total} öğe"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Başarıyla güncellendi"
-
 #~ msgid "View Details"
 #~ msgstr "Detayları Görüntüle"
 

+ 127 - 85
app/src/language/uk_UA/app.po

@@ -108,7 +108,7 @@ msgstr "[Nginx UI] Запис сертифіката на диск"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "2FA Налаштування"
 
@@ -134,8 +134,7 @@ msgstr "Логи доступу"
 msgid "ACME User"
 msgstr "ACME Логін"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Дія"
 
@@ -146,9 +145,9 @@ msgstr "Дія"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Дії"
@@ -163,10 +162,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Фактичне співвідношення робочих до налаштованих"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Додати"
 
@@ -193,7 +192,7 @@ msgstr "Додати локацію"
 msgid "Add Site"
 msgstr "Додати сайт"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Додати стрім"
 
@@ -251,7 +250,7 @@ msgstr "Додаток"
 msgid "Arch"
 msgstr "\"Архітектура\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Ви впевнені, що хочите видалити цю заборонену IP-адресу?"
 
@@ -280,8 +279,8 @@ msgstr "Ви впевнені, що бажаєте очистити запис 
 msgid "Are you sure you want to delete permanently?"
 msgstr "Ви впевнені, що хочете видалити назавжди?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Ви впевнені, що хочете видалити?"
 
@@ -325,7 +324,7 @@ msgstr "Помічник"
 msgid "Attempt to fix"
 msgstr "Спробувати виправити"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Спроби"
 
@@ -337,7 +336,7 @@ msgstr "Авторизація"
 msgid "Authenticate with a passkey"
 msgstr "Автентифікація пасоком"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Налаштування аутентифікації"
 
@@ -412,15 +411,15 @@ msgstr "Файл резервної копії не знайдено: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "Резервну копію успішно завантажено"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Хвилини до блокування"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "Заблоковані IP-адреси"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Заблоковано до"
 
@@ -531,7 +530,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -649,6 +648,10 @@ msgstr "Метод перевірки"
 msgid "Change Certificate"
 msgstr "Змінити сертифікат"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Змінити пароль"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -815,13 +818,11 @@ msgstr ""
 "Клацніть або перетягніть файл резервного копіювання в цю область, щоб "
 "завантажити"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Натисніть або перетягніть файли в цю область для завантаження"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Натисніть або перетягніть папки в цю область для завантаження"
 
@@ -941,6 +942,10 @@ msgstr "Конфігурації"
 msgid "Configure SSL"
 msgstr "Налаштувати SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Підтвердити новий пароль"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Підключено"
@@ -949,7 +954,7 @@ msgstr "Підключено"
 msgid "Connection error, trying to reconnect..."
 msgstr "Помилка з'єднання, спроба повторного підключення..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "З'єднання, будь ласка, оновіть сторінку."
 
@@ -1007,7 +1012,7 @@ msgstr ""
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Створити"
 
@@ -1037,7 +1042,7 @@ msgstr ""
 "комп’ютер."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1112,6 +1117,10 @@ msgstr ""
 "  - Без будь-яких пояснень, коментарів чи іншого тексту\n"
 "  - Чисте форматування"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Поточний пароль"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Поточне використання"
@@ -1151,8 +1160,8 @@ msgstr "Вкажіть назву та розмір зони спільної п
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Видалити"
 
@@ -1265,7 +1274,7 @@ msgstr "Файл призначення вже існує"
 msgid "Destination file: {0} already exists"
 msgstr "Файл призначення: {0} вже існує"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Деталі"
 
@@ -1309,11 +1318,11 @@ msgstr "Рівні каталогу"
 msgid "Directory path to store cache files"
 msgstr "Шлях до каталогу для зберігання файлів кешу"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Вимкнути"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Вимкнути"
 
@@ -1374,7 +1383,7 @@ msgstr "Потік %{name} успішно вимкнено з %{node}"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1382,7 +1391,7 @@ msgstr "Потік %{name} успішно вимкнено з %{node}"
 msgid "Disabled"
 msgstr "Вимкнено"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1410,7 +1419,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "Не вмикайте цю опцію, якщо ви не впевнені, що вона вам потрібна."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Ви хочете %{action} цей сайт?"
 
@@ -1488,9 +1497,9 @@ msgstr ""
 "localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Дублювати"
 
@@ -1534,11 +1543,11 @@ msgstr "Електронна пошта"
 msgid "Email (*)"
 msgstr "Електронна пошта (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "увімкнути"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Увімкнути"
 
@@ -1636,7 +1645,7 @@ msgstr "Увімкнути TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1645,7 +1654,7 @@ msgstr "Увімкнути TOTP"
 msgid "Enabled"
 msgstr "Увімкнено"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1854,23 +1863,23 @@ msgstr "Не вдалося видалити сертифікат"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Не вдалося видалити сертифікат з бази даних: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Не вдалося вимкнути %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Не вдалося вимкнути режим обслуговування %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Не вдалося увімкнути %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Не вдалося увімкнути режим обслуговування %{msg}"
 
@@ -2183,7 +2192,7 @@ msgstr "Номер ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Якщо залишити порожнім, буде використовуватися стандартний каталог CA."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2351,7 +2360,7 @@ msgstr "Недійсний формат запиту"
 msgid "Invalid security token format"
 msgstr "Недійсний формат токена безпеки"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2466,7 +2475,7 @@ msgstr "Список"
 msgid "Load Average:"
 msgstr "Середнє навантаження:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Завантажити з налаштувань"
 
@@ -2564,17 +2573,17 @@ msgstr ""
 "можете вручну активувати цю опцію. Планувальник завдань crontab у Nginx UI "
 "виконуватиме команду logrotate з інтервалом, який ви встановите у хвилинах."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Технічне обслуговування"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Режим обслуговування успішно вимкнено"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Режим обслуговування успішно ввімкнено"
 
@@ -2641,7 +2650,7 @@ msgstr "Головний процес"
 msgid "Master Process"
 msgstr "Головний процес"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Максимальна кількість спроб"
 
@@ -2740,7 +2749,7 @@ msgstr "Модулі"
 msgid "Multi-line Directive"
 msgstr "Багаторядкова директива"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2757,7 +2766,7 @@ msgstr "Багаторядкова директива"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Ім'я"
 
@@ -2789,6 +2798,10 @@ msgstr "Нове встановлення"
 msgid "New name"
 msgstr "Нова назва"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Новий пароль"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Новий шлях"
@@ -3004,9 +3017,9 @@ msgstr "Nginx.conf включає каталог streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Ні"
 
@@ -3141,6 +3154,7 @@ msgid "Off"
 msgstr "Вимкнено"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3152,13 +3166,13 @@ msgstr "Офлайн"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "Гаразд"
@@ -3278,6 +3292,14 @@ msgstr "Невірний пароль"
 msgid "Password length cannot exceed 20 characters"
 msgstr "Довжина пароля не може перевищувати 20 символів"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Пароль успішно оновлено"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Паролі не збігаються"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3317,6 +3339,10 @@ msgstr "Налаштування продуктивності успішно з
 msgid "Performing core upgrade"
 msgstr "Виконується оновлення ядра"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Особиста інформація"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "Шлях PID не існує"
@@ -3448,17 +3474,17 @@ msgstr "Будь ласка, виберіть файл резервної коп
 msgid "Please select at least one item"
 msgstr "Будь ласка, виберіть хоча б один елемент"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Будь ласка, виберіть принаймні один вузол для перезавантаження Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Будь ласка, виберіть принаймні один вузол для перезапуску Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Будь ласка, виберіть принаймні один вузол для оновлення"
 
@@ -3625,8 +3651,8 @@ msgstr "Перезавантажити"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Перезавантажити Nginx"
 
@@ -3664,12 +3690,12 @@ msgstr "Перезавантаження"
 msgid "Reloading nginx"
 msgstr "Перезавантаження nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Видалити"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Успішно видалено"
 
@@ -3808,8 +3834,8 @@ msgid "Restart"
 msgstr "Перезавантажити"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Перезапустити Nginx"
 
@@ -3891,15 +3917,15 @@ msgstr ""
 "Відкликання сертифіката вплине на всі служби, які його використовують. Цю "
 "дію не можна скасувати."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Відображуване ім’я RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Джерела RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -4006,6 +4032,10 @@ msgstr "Назва модуля пошуку"
 msgid "Secret has been copied"
 msgstr "Секрет скопійовано"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Налаштування безпеки"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -4081,7 +4111,7 @@ msgstr ""
 "Встановіть рекурсивні сервери імен, щоб перевизначити системні сервери імен "
 "на етапі DNS-виклику."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "перевести в режим обслуговування"
 
@@ -4322,13 +4352,11 @@ msgstr ""
 "щоб написати відповідний конфігураційний файл: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Підтримка одиночного або пакетного завантаження файлів"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Підтримка завантаження цілих папок"
 
@@ -4671,12 +4699,12 @@ msgstr ""
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "Це оновить або перевстановить Nginx UI на %{nodeNames} до версії %{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Обмеження"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Поради"
@@ -4689,7 +4717,7 @@ msgstr ""
 "Порада: Ви можете збільшити потужність обробки паралельних запитів, "
 "збільшивши worker_processes або worker_connections."
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Назва"
 
@@ -4809,6 +4837,14 @@ msgstr "Тип"
 msgid "Unknown"
 msgstr "Невідомо"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Оновити пароль"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Оновити профіль"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Успішно оновлено"
@@ -4826,8 +4862,8 @@ msgid "Updated at"
 msgstr "Оновлено"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Оновити"
@@ -4853,7 +4889,7 @@ msgstr "Завантажити файли"
 msgid "Upload Folders"
 msgstr "Завантажити папки"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Назва апстріму"
 
@@ -4885,11 +4921,20 @@ msgstr "Користувач"
 msgid "User banned"
 msgstr "Користувача заблоковано"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Інформацію про користувача успішно оновлено"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Користувач не увімкнув OTP як 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Профіль користувача"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Ім’я користувача"
 
@@ -4980,7 +5025,7 @@ msgstr ""
 "Ми видалимо конфігурацію HTTPChallenge з цього файлу та перезавантажимо "
 "Nginx. Ви впевнені, що хочете продовжити?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "WebAuthn"
 
@@ -5060,12 +5105,12 @@ msgstr "Запис сертифіката на диск"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Так"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5160,9 +5205,6 @@ msgstr "Ваші ключі доступу"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Всього %{total} елемент"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Успішно оновлено"
-
 #~ msgid "View Details"
 #~ msgstr "Переглянути деталі"
 

+ 127 - 85
app/src/language/vi_VN/app.po

@@ -99,7 +99,7 @@ msgstr "[Nginx UI] Đang ghi chứng chỉ vào ổ đĩa"
 msgid "2FA"
 msgstr "2fa"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "Cài đặt 2FA"
 
@@ -125,8 +125,7 @@ msgstr "Log truy cập"
 msgid "ACME User"
 msgstr "Người dùng ACME"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "Hành động"
 
@@ -137,9 +136,9 @@ msgstr "Hành động"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "Hành động"
@@ -154,10 +153,10 @@ msgid "Actual worker to configured ratio"
 msgstr "Tỷ lệ công nhân thực tế so với cấu hình"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "Thêm"
 
@@ -184,7 +183,7 @@ msgstr "Thêm Location"
 msgid "Add Site"
 msgstr "Thêm Website"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "Thêm luồng"
 
@@ -242,7 +241,7 @@ msgstr "Ứng dụng"
 msgid "Arch"
 msgstr "\"Kiến trúc\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "Bạn có chắc chắn muốn xóa IP bị cấm này ngay lập tức không?"
 
@@ -271,8 +270,8 @@ msgstr "Bạn có chắc chắn muốn xóa lịch sử trò chuyện không?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "Bạn có chắc chắn muốn xóa vĩnh viễn không?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "Bạn có chắc chắn muốn xóa không?"
 
@@ -312,7 +311,7 @@ msgstr "Trợ lý"
 msgid "Attempt to fix"
 msgstr "Cố gắng sửa chữa"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "Nỗ lực"
 
@@ -324,7 +323,7 @@ msgstr "Xác thực"
 msgid "Authenticate with a passkey"
 msgstr "Xác thực với một cô ấy"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "Cài đặt xác thực"
 
@@ -399,15 +398,15 @@ msgstr "Không tìm thấy tệp sao lưu: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "Đã tải xuống bản sao lưu thành công"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "Phút Ngưỡng Cấm"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "Danh sách IP bị cấm"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "Bị cấm đến"
 
@@ -517,7 +516,7 @@ msgstr ""
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -635,6 +634,10 @@ msgstr "Phương pháp xác thực"
 msgid "Change Certificate"
 msgstr "Thay đổi chứng chỉ"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "Đổi mật khẩu"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -800,13 +803,11 @@ msgstr "Đã xóa thành công"
 msgid "Click or drag backup file to this area to upload"
 msgstr "Nhấp hoặc kéo tệp sao lưu vào khu vực này để tải lên"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "Nhấp hoặc kéo thả tệp vào khu vực này để tải lên"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "Nhấp hoặc kéo thư mục vào khu vực này để tải lên"
 
@@ -926,6 +927,10 @@ msgstr "Cấu hình"
 msgid "Configure SSL"
 msgstr "Cấu hình SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "Xác nhận mật khẩu mới"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "Đã kết nối"
@@ -934,7 +939,7 @@ msgstr "Đã kết nối"
 msgid "Connection error, trying to reconnect..."
 msgstr "Lỗi kết nối, đang thử kết nối lại..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "Kết nối bị mất, xin vui lòng làm mới trang."
 
@@ -990,7 +995,7 @@ msgstr "Mức sử dụng CPU tương đối cao, hãy cân nhắc tối ưu c
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "Tạo"
 
@@ -1019,7 +1024,7 @@ msgstr ""
 "tệp sao lưu sẽ tự động được tải xuống máy tính của bạn."
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1058,6 +1063,10 @@ msgstr "Kết nối đang hoạt động hiện tại"
 msgid "Current Content"
 msgstr "Nội dung hiện tại"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "Mật khẩu hiện tại"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "Mức sử dụng hiện tại"
@@ -1097,8 +1106,8 @@ msgstr "Xác định tên và kích thước vùng bộ nhớ dùng chung, ví d
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "Xoá"
 
@@ -1175,7 +1184,7 @@ msgstr "Tệp đích đã tồn tại"
 msgid "Destination file: {0} already exists"
 msgstr "Tệp đích: {0} đã tồn tại"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "Chi tiết"
 
@@ -1219,11 +1228,11 @@ msgstr "Cấp độ thư mục"
 msgid "Directory path to store cache files"
 msgstr "Đường dẫn thư mục để lưu trữ các tệp bộ nhớ đệm"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "Vô hiệu hóa"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "Vô hiệu hóa"
 
@@ -1284,7 +1293,7 @@ msgstr "Đã vô hiệu hóa luồng %{name} từ %{node} thành công"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1292,7 +1301,7 @@ msgstr "Đã vô hiệu hóa luồng %{name} từ %{node} thành công"
 msgid "Disabled"
 msgstr "Đã tắt"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1320,7 +1329,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "Không bật tùy chọn này trừ khi bạn chắc chắn cần đến nó."
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "Bạn có muốn %{action} trang web này không?"
 
@@ -1399,9 +1408,9 @@ msgstr ""
 "trên các trang web không phải HTTPS, trừ khi chạy trên localhost."
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "Nhân bản"
 
@@ -1445,11 +1454,11 @@ msgstr "Email"
 msgid "Email (*)"
 msgstr "Email (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "bật"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "Bật"
 
@@ -1547,7 +1556,7 @@ msgstr "Bật TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1556,7 +1565,7 @@ msgstr "Bật TOTP"
 msgid "Enabled"
 msgstr "Đã bật"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1765,23 +1774,23 @@ msgstr "Xóa chứng chỉ không thành công"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "Xóa chứng chỉ từ cơ sở dữ liệu thất bại: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "Không thể tắt %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "Không thể tắt chế độ bảo trì %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "Không thể bật %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "Không thể bật chế độ bảo trì %{msg}"
 
@@ -2094,7 +2103,7 @@ msgstr "Số ICP"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "Nếu để trống, thư mục CA mặc định sẽ được sử dụng."
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2261,7 +2270,7 @@ msgstr "Định dạng yêu cầu không hợp lệ"
 msgid "Invalid security token format"
 msgstr "Định dạng mã bảo mật không hợp lệ"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2376,7 +2385,7 @@ msgstr "Danh sách"
 msgid "Load Average:"
 msgstr "Tải trung bình:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "Tải từ cài đặt"
 
@@ -2474,17 +2483,17 @@ msgstr ""
 "chọn này. Bộ lập lịch tác vụ crontab của Nginx UI sẽ thực thi lệnh "
 "logrotate theo khoảng thời gian bạn đặt (tính bằng phút)."
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "Bảo trì"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "Đã tắt chế độ bảo trì thành công"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "Đã bật chế độ bảo trì thành công"
 
@@ -2551,7 +2560,7 @@ msgstr "Tiến trình chính"
 msgid "Master Process"
 msgstr "Tiến trình chính"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "Số lần thử tối đa"
 
@@ -2650,7 +2659,7 @@ msgstr "Mô-đun"
 msgid "Multi-line Directive"
 msgstr "Chỉ thị nhiều dòng"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2667,7 +2676,7 @@ msgstr "Chỉ thị nhiều dòng"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "Tên"
 
@@ -2699,6 +2708,10 @@ msgstr "Cài đặt mới"
 msgid "New name"
 msgstr "Tên mới"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "Mật khẩu mới"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "Đường dẫn mới"
@@ -2914,9 +2927,9 @@ msgstr "Nginx.conf bao gồm thư mục streams-enabled"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "Không"
 
@@ -3049,6 +3062,7 @@ msgid "Off"
 msgstr "Tắt"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3060,13 +3074,13 @@ msgstr "Ngoại tuyến"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "Đồng ý"
@@ -3186,6 +3200,14 @@ msgstr "Mật khẩu không đúng"
 msgid "Password length cannot exceed 20 characters"
 msgstr "Độ dài mật khẩu không được vượt quá 20 ký tự"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "Cập nhật mật khẩu thành công"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "Mật khẩu không khớp"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3225,6 +3247,10 @@ msgstr "Đã lưu cài đặt hiệu suất thành công"
 msgid "Performing core upgrade"
 msgstr "Nâng cấp core"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "Thông tin cá nhân"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "Đường dẫn PID không tồn tại"
@@ -3347,17 +3373,17 @@ msgstr "Vui lòng chọn tệp sao lưu"
 msgid "Please select at least one item"
 msgstr "Vui lòng chọn ít nhất một mục"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "Vui lòng chọn ít nhất một nút để tải lại Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "Vui lòng chọn ít nhất một nút để khởi động lại Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "Vui lòng chọn ít nhất một nút để nâng cấp"
 
@@ -3523,8 +3549,8 @@ msgstr "Tải lại"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "Tải lại Nginx"
 
@@ -3560,12 +3586,12 @@ msgstr "Đang tải lại"
 msgid "Reloading nginx"
 msgstr "Tải lại nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "Xóa"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "Xóa thành công"
 
@@ -3704,8 +3730,8 @@ msgid "Restart"
 msgstr "Khởi động lại"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "Khởi động lại Nginx"
 
@@ -3785,15 +3811,15 @@ msgstr ""
 "Việc thu hồi chứng chỉ sẽ ảnh hưởng đến bất kỳ dịch vụ nào hiện đang sử "
 "dụng nó. Hành động này không thể hoàn tác."
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "Tên hiển thị RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "Nguồn gốc RP"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3898,6 +3924,10 @@ msgstr "Tên mô-đun tìm kiếm"
 msgid "Secret has been copied"
 msgstr "Mật khẩu đã được sao chép"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "Cài đặt bảo mật"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3973,7 +4003,7 @@ msgstr ""
 "Đặt các máy chủ tên đệ quy để ghi đè các máy chủ tên hệ thống trong bước "
 "thử thách DNS."
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "đặt vào chế độ bảo trì"
 
@@ -4212,13 +4242,11 @@ msgstr ""
 "liên kết này để viết tệp cấu hình tương ứng: "
 "https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "Hỗ trợ tải lên một hoặc nhiều tệp"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "Hỗ trợ tải lên toàn bộ thư mục"
 
@@ -4561,12 +4589,12 @@ msgstr ""
 "Thao tác này sẽ nâng cấp hoặc cài đặt lại Nginx UI trên %{nodeNames} lên "
 "phiên bản %{version}."
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "Hạn chế"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "Mẹo"
@@ -4579,7 +4607,7 @@ msgstr ""
 "Mẹo: Bạn có thể tăng khả năng xử lý đồng thời bằng cách tăng "
 "worker_processes hoặc worker_connections"
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "Tiêu đề"
 
@@ -4699,6 +4727,14 @@ msgstr "Loại"
 msgid "Unknown"
 msgstr "Không xác định"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "Cập nhật mật khẩu"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "Cập nhật hồ sơ"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "Cập nhật thành công"
@@ -4716,8 +4752,8 @@ msgid "Updated at"
 msgstr "Ngày cập nhật"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "Cập nhật"
@@ -4743,7 +4779,7 @@ msgstr "Tải lên tệp"
 msgid "Upload Folders"
 msgstr "Tải lên thư mục"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Tên Upstream"
 
@@ -4775,11 +4811,20 @@ msgstr "Người dùng"
 msgid "User banned"
 msgstr "Người dùng bị cấm"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "Cập nhật thông tin người dùng thành công"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "Người dùng chưa bật OTP làm 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "Hồ sơ người dùng"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "Username"
 
@@ -4870,7 +4915,7 @@ msgstr ""
 "Chúng tôi sẽ xóa cấu hình HTTPChallenge khỏi tệp này và tải lại Nginx. Bạn "
 "có muốn tiếp tục không?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "WebAuthn"
 
@@ -4948,12 +4993,12 @@ msgstr "Ghi chứng chỉ vào disk"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "Có"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -5048,9 +5093,6 @@ msgstr "Khóa truy cập của bạn"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "Tổng %{total} mục"
 
-#~ msgid "Updated successfully"
-#~ msgstr "Cập nhật thành công"
-
 #~ msgid "View Details"
 #~ msgstr "Xem chi tiết"
 

+ 127 - 85
app/src/language/zh_CN/app.po

@@ -103,7 +103,7 @@ msgstr "[Nginx UI] 正在将证书写入磁盘"
 msgid "2FA"
 msgstr "2FA"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "2FA 设置"
 
@@ -129,8 +129,7 @@ msgstr "访问日志"
 msgid "ACME User"
 msgstr "ACME 用户"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "操作"
 
@@ -141,9 +140,9 @@ msgstr "操作"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "操作"
@@ -158,10 +157,10 @@ msgid "Actual worker to configured ratio"
 msgstr "实际工作进程与配置比例"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "添加"
 
@@ -188,7 +187,7 @@ msgstr "添加 Location"
 msgid "Add Site"
 msgstr "添加站点"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "添加 Stream"
 
@@ -246,7 +245,7 @@ msgstr "应用"
 msgid "Arch"
 msgstr "\"架构\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "您确定要立即删除这个被禁用的 IP 吗?"
 
@@ -275,8 +274,8 @@ msgstr "你确定你要清除聊天记录吗?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "确定要永久删除吗?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "您确定要删除吗?"
 
@@ -316,7 +315,7 @@ msgstr "助手"
 msgid "Attempt to fix"
 msgstr "尝试修复"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "尝试次数"
 
@@ -328,7 +327,7 @@ msgstr "认证"
 msgid "Authenticate with a passkey"
 msgstr "通过 Passkey 认证"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "认证设置"
 
@@ -403,15 +402,15 @@ msgstr "未找到备份文件: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "已成功下载备份"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "禁止阈值(分钟)"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "禁止 IP 列表"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "禁用至"
 
@@ -519,7 +518,7 @@ msgstr "基于 worker_processes * worker_connections 计算得出。实际性能
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -637,6 +636,10 @@ msgstr "挑战方法"
 msgid "Change Certificate"
 msgstr "更改证书"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "更改密码"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -784,13 +787,11 @@ msgstr "清除成功"
 msgid "Click or drag backup file to this area to upload"
 msgstr "单击或拖动备份文件到此区域上传"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "点击或拖拽文件到此处上传"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "点击或拖拽文件夹到此处上传"
 
@@ -910,6 +911,10 @@ msgstr "配置"
 msgid "Configure SSL"
 msgstr "配置 SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "确认新密码"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "已连接"
@@ -918,7 +923,7 @@ msgstr "已连接"
 msgid "Connection error, trying to reconnect..."
 msgstr "连接错误,正在尝试重新连接..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "连接中断,请刷新页面。"
 
@@ -974,7 +979,7 @@ msgstr "CPU 使用率相对较高,请考虑优化 Nginx 配置"
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "创建"
 
@@ -1001,7 +1006,7 @@ msgid ""
 msgstr "创建系统备份,包括 Nginx 配置和 Nginx UI 设置。备份文件将自动下载到你的电脑。"
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1040,6 +1045,10 @@ msgstr "当前活动连接"
 msgid "Current Content"
 msgstr "当前内容"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "当前密码"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "当前用量"
@@ -1079,8 +1088,8 @@ msgstr "定义共享内存区名称和大小,例如 proxy_cache:10m"
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "删除"
 
@@ -1157,7 +1166,7 @@ msgstr "目标文件已存在"
 msgid "Destination file: {0} already exists"
 msgstr "目标文件: {0} 已存在"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "详情"
 
@@ -1201,11 +1210,11 @@ msgstr "目录层级"
 msgid "Directory path to store cache files"
 msgstr "存储缓存文件的目录路径"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "禁用"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "禁用"
 
@@ -1266,7 +1275,7 @@ msgstr "在 %{node} 上禁用 %{name} 成功"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1274,7 +1283,7 @@ msgstr "在 %{node} 上禁用 %{name} 成功"
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1302,7 +1311,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "除非确定需要,否则不要启用该选项。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "您想将这个网站%{action}吗?"
 
@@ -1377,9 +1386,9 @@ msgid ""
 msgstr "由于某些浏览器的安全策略,除非在 localhost 上使用,否则不能在非 HTTPS 网站上使用 Passkey。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "复制"
 
@@ -1423,11 +1432,11 @@ msgstr "邮箱"
 msgid "Email (*)"
 msgstr "邮箱 (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "启用"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "启用"
 
@@ -1525,7 +1534,7 @@ msgstr "启用 TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1534,7 +1543,7 @@ msgstr "启用 TOTP"
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1743,23 +1752,23 @@ msgstr "删除证书失败"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "从数据库中删除证书失败:%{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "停用维护模式失败 %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "启用维护模式失败 %{msg}"
 
@@ -2070,7 +2079,7 @@ msgstr "ICP备案号"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "如果留空,则使用默认 CA Dir。"
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2229,7 +2238,7 @@ msgstr "无效的请求格式"
 msgid "Invalid security token format"
 msgstr "安全令牌格式无效"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2342,7 +2351,7 @@ msgstr "列表"
 msgid "Load Average:"
 msgstr "系统负载:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "从设置中加载"
 
@@ -2435,17 +2444,17 @@ msgstr ""
 "定时任务,因此您无需修改本页面的参数。对于使用 Docker 容器安装 Nginx 用户界面的用户,您可以手动启用该选项。Nginx UI "
 "的定时任务任务调度器将按照您设置的时间间隔(以分钟为单位)执行 logrotate 命令。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "维护模式"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "成功禁用维护模式"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "成功启用维护模式"
 
@@ -2510,7 +2519,7 @@ msgstr "主进程"
 msgid "Master Process"
 msgstr "主进程"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "最大尝试次数"
 
@@ -2609,7 +2618,7 @@ msgstr "模块"
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2626,7 +2635,7 @@ msgstr "多行指令"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "名称"
 
@@ -2658,6 +2667,10 @@ msgstr "新安装"
 msgid "New name"
 msgstr "新名称"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "新密码"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "新路径"
@@ -2871,9 +2884,9 @@ msgstr "检查 nginx.conf 是否包含 streams-enabled 的目录"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "取消"
 
@@ -3002,6 +3015,7 @@ msgid "Off"
 msgstr "关闭"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3013,13 +3027,13 @@ msgstr "离线"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "确定"
@@ -3135,6 +3149,14 @@ msgstr "用户名和密码错误"
 msgid "Password length cannot exceed 20 characters"
 msgstr "密码长度不能超过 20 个字符"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "密码更新成功"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "密码不匹配"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3174,6 +3196,10 @@ msgstr "性能调优参数保存成功"
 msgid "Performing core upgrade"
 msgstr "正在进行核心升级"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "个人信息"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID 路径不存在"
@@ -3288,17 +3314,17 @@ msgstr "请选择备份文件"
 msgid "Please select at least one item"
 msgstr "请至少选择一项"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "请至少选择一个节点重载 Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "请至少选择一个节点重启 Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "请至少选择一个节点进行升级"
 
@@ -3460,8 +3486,8 @@ msgstr "重载"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "重载 Nginx"
 
@@ -3497,12 +3523,12 @@ msgstr "重载中"
 msgid "Reloading nginx"
 msgstr "正在重载 Nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "删除"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "移除成功"
 
@@ -3638,8 +3664,8 @@ msgid "Restart"
 msgstr "重启"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "重启 Nginx"
 
@@ -3717,15 +3743,15 @@ msgid ""
 "action cannot be undone."
 msgstr "撤销证书将影响当前使用该证书的任何服务。该操作无法撤销。"
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "依赖方显示名称"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "依赖方的源"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "依赖方 ID"
 
@@ -3830,6 +3856,10 @@ msgstr "搜索模块名称"
 msgid "Secret has been copied"
 msgstr "密钥已复制"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "安全设置"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3903,7 +3933,7 @@ msgid ""
 "step of DNS challenge."
 msgstr "为 DNS 挑战步骤设置递归域名服务器以覆盖操作系统的域名服务器设置。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "设置为维护模式"
 
@@ -4138,13 +4168,11 @@ msgstr ""
 "支持通过 WebSocket 协议与后端通信,如果您正在使用 Nginx 反向代理了 Nginx UI "
 "请参考:https://nginxui.com/guide/nginx-proxy-example.html 编写配置文件"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "支持单个或多个文件上传"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "支持上传整个文件夹"
 
@@ -4452,12 +4480,12 @@ msgstr "这将恢复配置文件和数据库。恢复完成后,Nginx UI 将重
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "将 %{nodeNames} 上的 Nginx UI 升级或重新安装到 %{version} 版本。"
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "限流"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "提示"
@@ -4468,7 +4496,7 @@ msgid ""
 "worker_processes or worker_connections"
 msgstr "提示您可以通过增加 worker_processes 或 worker_connections 来提高并发处理能力"
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "标题"
 
@@ -4578,6 +4606,14 @@ msgstr "类型"
 msgid "Unknown"
 msgstr "未知"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "更新密码"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "更新资料"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "更新成功"
@@ -4595,8 +4631,8 @@ msgid "Updated at"
 msgstr "修改时间"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "升级"
@@ -4622,7 +4658,7 @@ msgstr "上传文件"
 msgid "Upload Folders"
 msgstr "上传文件夹"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Upstream 名称"
 
@@ -4654,11 +4690,20 @@ msgstr "用户"
 msgid "User banned"
 msgstr "用户被禁止"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "用户信息更新成功"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "用户未启用 OTP 作为 2FA"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "用户资料"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "用户名"
 
@@ -4742,7 +4787,7 @@ msgid ""
 "the Nginx. Are you sure you want to continue?"
 msgstr "我们将从这个文件中删除HTTPChallenge的配置,并重新加载Nginx。你确定要继续吗?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -4815,12 +4860,12 @@ msgstr "正在将证书写入磁盘"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "是的"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -4908,9 +4953,6 @@ msgstr "你的 Passkeys"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "共 %{total} 个项目"
 
-#~ msgid "Updated successfully"
-#~ msgstr "更新成功"
-
 #~ msgid "View Details"
 #~ msgstr "查看详情"
 

+ 127 - 85
app/src/language/zh_TW/app.po

@@ -107,7 +107,7 @@ msgstr "[Nginx UI] 正在將憑證寫入磁碟"
 msgid "2FA"
 msgstr "雙因素驗證"
 
-#: src/views/preference/tabs/AuthSettings.vue:69
+#: src/views/user/UserProfile.vue:151
 msgid "2FA Settings"
 msgstr "多重要素驗證設定"
 
@@ -133,8 +133,7 @@ msgstr "存取日誌"
 msgid "ACME User"
 msgstr "ACME 使用者"
 
-#: src/views/notification/notificationColumns.tsx:66
-#: src/views/preference/tabs/AuthSettings.vue:29
+#: src/views/preference/tabs/AuthSettings.vue:26
 msgid "Action"
 msgstr "操作"
 
@@ -145,9 +144,9 @@ msgstr "操作"
 #: src/views/environments/group/columns.ts:41
 #: src/views/environments/list/envColumns.tsx:96
 #: src/views/nginx_log/NginxLogList.vue:52
+#: src/views/notification/notificationColumns.tsx:72
 #: src/views/preference/components/ExternalNotify/columns.tsx:76
-#: src/views/site/site_list/columns.tsx:129
-#: src/views/stream/columns.tsx:64
+#: src/views/site/site_list/columns.tsx:129 src/views/stream/columns.tsx:64
 #: src/views/user/userColumns.tsx:58
 msgid "Actions"
 msgstr "操作"
@@ -162,10 +161,10 @@ msgid "Actual worker to configured ratio"
 msgstr "實際工作進程與配置比例"
 
 #: src/components/NgxConfigEditor/NgxServer.vue:112
-#: src/components/NgxConfigEditor/NgxUpstream.vue:155 src/language/curd.ts:19
+#: src/components/NgxConfigEditor/NgxUpstream.vue:159 src/language/curd.ts:19
 #: src/views/preference/tabs/CertSettings.vue:45
 #: src/views/site/site_edit/components/ConfigTemplate/ConfigTemplate.vue:94
-#: src/views/stream/StreamList.vue:120
+#: src/views/stream/StreamList.vue:121
 msgid "Add"
 msgstr "新增"
 
@@ -192,7 +191,7 @@ msgstr "新增 Location"
 msgid "Add Site"
 msgstr "新增網站"
 
-#: src/views/stream/StreamList.vue:173
+#: src/views/stream/StreamList.vue:174
 msgid "Add Stream"
 msgstr "新增 Stream"
 
@@ -250,7 +249,7 @@ msgstr "應用"
 msgid "Arch"
 msgstr "\"架構\""
 
-#: src/views/preference/tabs/AuthSettings.vue:161
+#: src/views/preference/tabs/AuthSettings.vue:130
 msgid "Are you sure to delete this banned IP immediately?"
 msgstr "您確定要刪除這個被停用的 IP 嗎?"
 
@@ -279,8 +278,8 @@ msgstr "您確定要清除聊天記錄嗎?"
 msgid "Are you sure you want to delete permanently?"
 msgstr "確定要永久刪除嗎?"
 
-#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:99
-#: src/views/stream/StreamList.vue:156
+#: src/language/curd.ts:25 src/views/site/site_list/SiteList.vue:100
+#: src/views/stream/StreamList.vue:157
 msgid "Are you sure you want to delete?"
 msgstr "您確定要刪除嗎?"
 
@@ -320,7 +319,7 @@ msgstr "助理"
 msgid "Attempt to fix"
 msgstr "嘗試修復"
 
-#: src/views/preference/tabs/AuthSettings.vue:20
+#: src/views/preference/tabs/AuthSettings.vue:17
 msgid "Attempts"
 msgstr "嘗試次數"
 
@@ -332,7 +331,7 @@ msgstr "身份驗證"
 msgid "Authenticate with a passkey"
 msgstr "使用通行金鑰認證"
 
-#: src/views/preference/tabs/AuthSettings.vue:87
+#: src/views/preference/tabs/AuthSettings.vue:56
 msgid "Authentication Settings"
 msgstr "認證設定"
 
@@ -407,15 +406,15 @@ msgstr "找不到備份檔案: {0}"
 msgid "Backup has been downloaded successfully"
 msgstr "備份已成功下載"
 
-#: src/views/preference/tabs/AuthSettings.vue:128
+#: src/views/preference/tabs/AuthSettings.vue:97
 msgid "Ban Threshold Minutes"
 msgstr "封禁閾值分鐘數"
 
-#: src/views/preference/tabs/AuthSettings.vue:149
+#: src/views/preference/tabs/AuthSettings.vue:118
 msgid "Banned IPs"
 msgstr "被禁止的 IP"
 
-#: src/views/preference/tabs/AuthSettings.vue:23
+#: src/views/preference/tabs/AuthSettings.vue:20
 msgid "Banned Until"
 msgstr "禁止至"
 
@@ -523,7 +522,7 @@ msgstr "基於 worker_processes * worker_connections 計算得出。實際效能
 #: src/components/NgxConfigEditor/NgxServer.vue:54
 #: src/components/NgxConfigEditor/NgxUpstream.vue:37
 #: src/views/preference/components/AuthSettings/Passkey.vue:141
-#: src/views/site/components/SiteStatusSegmented.vue:97
+#: src/views/site/components/SiteStatusSelect.vue:124
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:40
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:143
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:21
@@ -641,6 +640,10 @@ msgstr "驗證方式"
 msgid "Change Certificate"
 msgstr "更換憑證"
 
+#: src/views/user/UserProfile.vue:181
+msgid "Change Password"
+msgstr "更改密碼"
+
 #: src/views/site/site_edit/components/Cert/Cert.vue:77
 msgid "Changed Certificate"
 msgid_plural "Changed Certificates"
@@ -788,13 +791,11 @@ msgstr "清除成功"
 msgid "Click or drag backup file to this area to upload"
 msgstr "點選或拖曳備份檔案至此區域上傳"
 
-#: src/language/curd.ts:49
-#: src/language/curd.ts:53
+#: src/language/curd.ts:49 src/language/curd.ts:53
 msgid "Click or drag files to this area to upload"
 msgstr "點擊或拖拽文件到此處上傳"
 
-#: src/language/curd.ts:50
-#: src/language/curd.ts:54
+#: src/language/curd.ts:50 src/language/curd.ts:54
 msgid "Click or drag folders to this area to upload"
 msgstr "點擊或拖拽文件夾到此處上傳"
 
@@ -914,6 +915,10 @@ msgstr "設定"
 msgid "Configure SSL"
 msgstr "設定 SSL"
 
+#: src/views/user/UserProfile.vue:204
+msgid "Confirm New Password"
+msgstr "確認新密碼"
+
 #: src/views/dashboard/Environments.vue:141
 msgid "Connected"
 msgstr "已連線"
@@ -922,7 +927,7 @@ msgstr "已連線"
 msgid "Connection error, trying to reconnect..."
 msgstr "連線錯誤,正在嘗試重新連線..."
 
-#: src/views/terminal/Terminal.vue:142
+#: src/views/terminal/Terminal.vue:139
 msgid "Connection lost, please refresh the page."
 msgstr "連線中斷,請重新整理此頁面。"
 
@@ -978,7 +983,7 @@ msgstr "CPU 使用率較高,建議優化 Nginx 配置"
 msgid "CPU:"
 msgstr "CPU:"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:166
+#: src/components/NgxConfigEditor/NgxUpstream.vue:170
 msgid "Create"
 msgstr "建立"
 
@@ -1005,7 +1010,7 @@ msgid ""
 msgstr "建立系統備份,包括 Nginx 設定與 Nginx UI 設定。備份檔案將自動下載至您的電腦。"
 
 #: src/views/environments/group/columns.ts:29
-#: src/views/notification/notificationColumns.tsx:45
+#: src/views/notification/notificationColumns.tsx:51
 #: src/views/preference/components/AuthSettings/Passkey.vue:95
 #: src/views/preference/components/ExternalNotify/columns.tsx:71
 #: src/views/user/userColumns.tsx:46
@@ -1044,6 +1049,10 @@ msgstr "目前使用中連線數"
 msgid "Current Content"
 msgstr "目前內容"
 
+#: src/views/user/UserProfile.vue:186
+msgid "Current Password"
+msgstr "當前密碼"
+
 #: src/views/dashboard/components/PerformanceStatisticsCard.vue:65
 msgid "Current usage"
 msgstr "目前用量"
@@ -1083,8 +1092,8 @@ msgstr "定義共享記憶體區域名稱和大小,例如 proxy_cache:10m"
 #: src/components/NgxConfigEditor/NgxServer.vue:78
 #: src/components/NgxConfigEditor/NgxUpstream.vue:129 src/language/curd.ts:9
 #: src/views/certificate/components/RemoveCert.vue:88
-#: src/views/site/site_list/SiteList.vue:108
-#: src/views/stream/StreamList.vue:165
+#: src/views/site/site_list/SiteList.vue:109
+#: src/views/stream/StreamList.vue:166
 msgid "Delete"
 msgstr "刪除"
 
@@ -1161,7 +1170,7 @@ msgstr "目的檔案已存在"
 msgid "Destination file: {0} already exists"
 msgstr "目標檔案: {0} 已存在"
 
-#: src/views/notification/notificationColumns.tsx:60
+#: src/views/notification/notificationColumns.tsx:66
 msgid "Details"
 msgstr "細節"
 
@@ -1205,11 +1214,11 @@ msgstr "目錄層級"
 msgid "Directory path to store cache files"
 msgstr "儲存快取檔案的目錄路徑"
 
-#: src/views/site/components/SiteStatusSegmented.vue:88
+#: src/views/site/components/SiteStatusSelect.vue:115
 msgid "disable"
 msgstr "禁用"
 
-#: src/views/stream/StreamList.vue:136
+#: src/views/stream/StreamList.vue:137
 msgid "Disable"
 msgstr "停用"
 
@@ -1270,7 +1279,7 @@ msgstr "已成功從 %{node} 停用串流 %{name}"
 #: src/views/preference/tabs/HTTPSettings.vue:24
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:134
+#: src/views/site/components/SiteStatusSelect.vue:162
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:62
 #: src/views/site/site_list/columns.tsx:114 src/views/stream/columns.tsx:48
 #: src/views/stream/components/StreamEditor.vue:30
@@ -1278,7 +1287,7 @@ msgstr "已成功從 %{node} 停用串流 %{name}"
 msgid "Disabled"
 msgstr "停用"
 
-#: src/views/site/components/SiteStatusSegmented.vue:40
+#: src/views/site/components/SiteStatusSelect.vue:67
 #: src/views/stream/components/RightPanel/Basic.vue:34
 #: src/views/stream/StreamList.vue:56
 msgid "Disabled successfully"
@@ -1306,7 +1315,7 @@ msgstr "DNS01"
 msgid "Do not enable this option unless you are sure that you need it."
 msgstr "除非您確定需要,否則不要啟用此選項。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:93
+#: src/views/site/components/SiteStatusSelect.vue:120
 msgid "Do you want to %{action} this site?"
 msgstr "您想要%{action}這個網站嗎?"
 
@@ -1381,9 +1390,9 @@ msgid ""
 msgstr "基於部分瀏覽器的安全政策,您無法在未啟用 HTTPS 網站,特別是 localhost 上使用通行金鑰。"
 
 #: src/views/site/site_list/SiteDuplicate.vue:72
-#: src/views/site/site_list/SiteList.vue:94
+#: src/views/site/site_list/SiteList.vue:95
 #: src/views/stream/components/StreamDuplicate.vue:64
-#: src/views/stream/StreamList.vue:151
+#: src/views/stream/StreamList.vue:152
 msgid "Duplicate"
 msgstr "複製"
 
@@ -1427,11 +1436,11 @@ msgstr "電子郵件"
 msgid "Email (*)"
 msgstr "電子郵件 (*)"
 
-#: src/views/site/components/SiteStatusSegmented.vue:87
+#: src/views/site/components/SiteStatusSelect.vue:114
 msgid "enable"
 msgstr "啟用"
 
-#: src/views/stream/StreamList.vue:144
+#: src/views/stream/StreamList.vue:145
 msgid "Enable"
 msgstr "啟用"
 
@@ -1529,7 +1538,7 @@ msgstr "啟用 TOTP"
 #: src/views/preference/tabs/LogrotateSettings.vue:20
 #: src/views/preference/tabs/NodeSettings.vue:25
 #: src/views/preference/tabs/NodeSettings.vue:30
-#: src/views/site/components/SiteStatusSegmented.vue:130
+#: src/views/site/components/SiteStatusSelect.vue:159
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:56
 #: src/views/site/site_list/columns.tsx:110 src/views/stream/columns.tsx:44
 #: src/views/stream/components/RightPanel/Basic.vue:62
@@ -1538,7 +1547,7 @@ msgstr "啟用 TOTP"
 msgid "Enabled"
 msgstr "已啟用"
 
-#: src/views/site/components/SiteStatusSegmented.vue:27
+#: src/views/site/components/SiteStatusSelect.vue:54
 #: src/views/site/site_add/SiteAdd.vue:32
 #: src/views/stream/components/RightPanel/Basic.vue:25
 #: src/views/stream/StreamList.vue:46
@@ -1747,23 +1756,23 @@ msgstr "憑證刪除失敗"
 msgid "Failed to delete certificate from database: %{error}"
 msgstr "從資料庫刪除憑證失敗: %{error}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:46
+#: src/views/site/components/SiteStatusSelect.vue:73
 #: src/views/stream/components/RightPanel/Basic.vue:37
 #: src/views/stream/StreamList.vue:60
 msgid "Failed to disable %{msg}"
 msgstr "停用 %{msg} 失敗"
 
-#: src/views/site/components/SiteStatusSegmented.vue:72
+#: src/views/site/components/SiteStatusSelect.vue:99
 msgid "Failed to disable maintenance mode %{msg}"
 msgstr "無法停用維護模式 %{msg}"
 
-#: src/views/site/components/SiteStatusSegmented.vue:33
+#: src/views/site/components/SiteStatusSelect.vue:60
 #: src/views/stream/components/RightPanel/Basic.vue:28
 #: src/views/stream/StreamList.vue:50
 msgid "Failed to enable %{msg}"
 msgstr "啟用 %{msg} 失敗"
 
-#: src/views/site/components/SiteStatusSegmented.vue:59
+#: src/views/site/components/SiteStatusSelect.vue:86
 msgid "Failed to enable maintenance mode %{msg}"
 msgstr "無法啟用維護模式 %{msg}"
 
@@ -2074,7 +2083,7 @@ msgstr "ICP 編號"
 msgid "If left blank, the default CA Dir will be used."
 msgstr "如果留空,將使用預設的 CA Dir。"
 
-#: src/views/preference/tabs/AuthSettings.vue:144
+#: src/views/preference/tabs/AuthSettings.vue:113
 msgid ""
 "If the number of login failed attempts from a ip reach the max attempts in "
 "ban threshold minutes, the ip will be banned for a period of time."
@@ -2233,7 +2242,7 @@ msgstr "無效的請求格式"
 msgid "Invalid security token format"
 msgstr "無效的安全令牌格式"
 
-#: src/views/preference/tabs/AuthSettings.vue:17
+#: src/views/preference/tabs/AuthSettings.vue:14
 msgid "IP"
 msgstr "IP"
 
@@ -2346,7 +2355,7 @@ msgstr "列表"
 msgid "Load Average:"
 msgstr "負載平均值:"
 
-#: src/views/environments/list/Environment.vue:80
+#: src/views/environments/list/Environment.vue:81
 msgid "Load from settings"
 msgstr "從設定載入"
 
@@ -2439,17 +2448,17 @@ msgstr ""
 "logrotate,因此您無需修改此頁面的參數。對於使用 Docker 容器安裝 Nginx UI 的使用者,您可以手動啟用此選項。Nginx UI "
 "的 crontab 任務排程器將按照您設定的分鐘間隔執行 logrotate 命令。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:138
+#: src/views/site/components/SiteStatusSelect.vue:165
 #: src/views/site/site_edit/components/SiteEditor/SiteEditor.vue:68
 #: src/views/site/site_list/columns.tsx:118
 msgid "Maintenance"
 msgstr "維護"
 
-#: src/views/site/components/SiteStatusSegmented.vue:66
+#: src/views/site/components/SiteStatusSelect.vue:93
 msgid "Maintenance mode disabled successfully"
 msgstr "維護模式已成功停用"
 
-#: src/views/site/components/SiteStatusSegmented.vue:53
+#: src/views/site/components/SiteStatusSelect.vue:80
 msgid "Maintenance mode enabled successfully"
 msgstr "維護模式已成功啟用"
 
@@ -2514,7 +2523,7 @@ msgstr "主行程"
 msgid "Master Process"
 msgstr "主行程"
 
-#: src/views/preference/tabs/AuthSettings.vue:134
+#: src/views/preference/tabs/AuthSettings.vue:103
 msgid "Max Attempts"
 msgstr "最大嘗試次數"
 
@@ -2613,7 +2622,7 @@ msgstr "模組"
 msgid "Multi-line Directive"
 msgstr "多行指令"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:178
+#: src/components/NgxConfigEditor/NgxUpstream.vue:182
 #: src/views/certificate/ACMEUser.vue:11
 #: src/views/certificate/CertificateEditor.vue:162
 #: src/views/certificate/CertificateList/certColumns.tsx:9
@@ -2630,7 +2639,7 @@ msgstr "多行指令"
 #: src/views/stream/columns.tsx:10
 #: src/views/stream/components/RightPanel/Basic.vue:69
 #: src/views/stream/components/StreamDuplicate.vue:71
-#: src/views/stream/StreamList.vue:178
+#: src/views/stream/StreamList.vue:179
 msgid "Name"
 msgstr "名稱"
 
@@ -2662,6 +2671,10 @@ msgstr "新安裝"
 msgid "New name"
 msgstr "新名稱"
 
+#: src/views/user/UserProfile.vue:195
+msgid "New Password"
+msgstr "新密碼"
+
 #: src/views/config/ConfigEditor.vue:328
 msgid "New Path"
 msgstr "新路徑"
@@ -2875,9 +2888,9 @@ msgstr "Nginx.conf 包含 streams-enabled 目錄"
 #: src/components/NgxConfigEditor/LocationEditor.vue:89
 #: src/components/Notification/Notification.vue:109 src/language/curd.ts:38
 #: src/views/notification/Notification.vue:38
-#: src/views/preference/tabs/AuthSettings.vue:163
+#: src/views/preference/tabs/AuthSettings.vue:132
 #: src/views/preference/tabs/CertSettings.vue:73
-#: src/views/site/site_list/SiteList.vue:97 src/views/stream/StreamList.vue:154
+#: src/views/site/site_list/SiteList.vue:98 src/views/stream/StreamList.vue:155
 msgid "No"
 msgstr "取消"
 
@@ -3006,6 +3019,7 @@ msgid "Off"
 msgstr "關"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:159
+#: src/components/NgxConfigEditor/NgxUpstream.vue:145
 #: src/components/NodeSelector/NodeSelector.vue:109
 #: src/views/dashboard/Environments.vue:107
 #: src/views/environments/list/envColumns.tsx:55
@@ -3017,13 +3031,13 @@ msgstr "離線"
 #: src/components/NgxConfigEditor/NgxUpstream.vue:36
 #: src/components/Notification/Notification.vue:110 src/language/curd.ts:15
 #: src/views/notification/Notification.vue:39
-#: src/views/site/components/SiteStatusSegmented.vue:96
+#: src/views/site/components/SiteStatusSelect.vue:123
 #: src/views/site/site_edit/components/Cert/IssueCert.vue:39
 #: src/views/site/site_edit/components/Cert/ObtainCert.vue:142
 #: src/views/site/site_edit/components/EnableTLS/EnableTLS.vue:20
-#: src/views/site/site_list/SiteList.vue:98
+#: src/views/site/site_list/SiteList.vue:99
 #: src/views/stream/components/RightPanel/Basic.vue:46
-#: src/views/stream/StreamList.vue:155
+#: src/views/stream/StreamList.vue:156
 #: src/views/system/Backup/BackupCreator.vue:149
 msgid "OK"
 msgstr "確定"
@@ -3141,6 +3155,14 @@ msgstr "密碼錯誤"
 msgid "Password length cannot exceed 20 characters"
 msgstr "密碼長度不能超過 20 個字元"
 
+#: src/views/user/UserProfile.vue:96
+msgid "Password updated successfully"
+msgstr "密碼更新成功"
+
+#: src/views/user/UserProfile.vue:75
+msgid "Passwords do not match"
+msgstr "密碼不匹配"
+
 #: src/components/NgxConfigEditor/LocationEditor.vue:110
 #: src/components/NgxConfigEditor/LocationEditor.vue:138
 #: src/language/curd.ts:59 src/views/config/ConfigEditor.vue:322
@@ -3180,6 +3202,10 @@ msgstr "效能設定已成功儲存"
 msgid "Performing core upgrade"
 msgstr "正在執行核心升級"
 
+#: src/views/user/UserProfile.vue:121
+msgid "Personal Information"
+msgstr "個人資訊"
+
 #: src/constants/errors/self_check.ts:19
 msgid "PID path not exist"
 msgstr "PID 路徑不存在"
@@ -3294,17 +3320,17 @@ msgstr "請選擇備份檔案"
 msgid "Please select at least one item"
 msgstr "請至少選擇一項"
 
-#: src/views/environments/list/Environment.vue:112
+#: src/views/environments/list/Environment.vue:113
 #: src/views/environments/list/Environment.vue:35
 msgid "Please select at least one node to reload Nginx"
 msgstr "請至少選擇一個節點以重新載入 Nginx"
 
-#: src/views/environments/list/Environment.vue:133
+#: src/views/environments/list/Environment.vue:134
 #: src/views/environments/list/Environment.vue:49
 msgid "Please select at least one node to restart Nginx"
 msgstr "請至少選擇一個節點以重啟 Nginx"
 
-#: src/views/environments/list/Environment.vue:91
+#: src/views/environments/list/Environment.vue:92
 msgid "Please select at least one node to upgrade"
 msgstr "請至少選擇一個節點進行升級"
 
@@ -3466,8 +3492,8 @@ msgstr "重新載入"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:136
 #: src/views/environments/group/columns.ts:22
 #: src/views/environments/group/EnvGroup.vue:50
-#: src/views/environments/list/Environment.vue:120
-#: src/views/environments/list/Environment.vue:128
+#: src/views/environments/list/Environment.vue:121
+#: src/views/environments/list/Environment.vue:129
 msgid "Reload Nginx"
 msgstr "重新載入 Nginx"
 
@@ -3503,12 +3529,12 @@ msgstr "重新載入中"
 msgid "Reloading nginx"
 msgstr "正在重新載入 Nginx"
 
-#: src/views/preference/tabs/AuthSettings.vue:168
+#: src/views/preference/tabs/AuthSettings.vue:137
 msgid "Remove"
 msgstr "移除"
 
 #: src/views/preference/components/AuthSettings/Passkey.vue:46
-#: src/views/preference/tabs/AuthSettings.vue:50
+#: src/views/preference/tabs/AuthSettings.vue:47
 msgid "Remove successfully"
 msgstr "移除成功"
 
@@ -3644,8 +3670,8 @@ msgid "Restart"
 msgstr "重新啟動"
 
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:148
-#: src/views/environments/list/Environment.vue:141
-#: src/views/environments/list/Environment.vue:149
+#: src/views/environments/list/Environment.vue:142
+#: src/views/environments/list/Environment.vue:150
 msgid "Restart Nginx"
 msgstr "重新啟動 Nginx"
 
@@ -3723,15 +3749,15 @@ msgid ""
 "action cannot be undone."
 msgstr "撤銷憑證將會影響目前使用它的所有服務。此動作無法復原。"
 
-#: src/views/preference/tabs/AuthSettings.vue:106
+#: src/views/preference/tabs/AuthSettings.vue:75
 msgid "RP Display Name"
 msgstr "RP 顯示名稱"
 
-#: src/views/preference/tabs/AuthSettings.vue:112
+#: src/views/preference/tabs/AuthSettings.vue:81
 msgid "RP Origins"
 msgstr "RP 源站"
 
-#: src/views/preference/tabs/AuthSettings.vue:100
+#: src/views/preference/tabs/AuthSettings.vue:69
 msgid "RPID"
 msgstr "RPID"
 
@@ -3836,6 +3862,10 @@ msgstr "搜尋模組名稱"
 msgid "Secret has been copied"
 msgstr "金鑰已複製"
 
+#: src/views/user/UserProfile.vue:175
+msgid "Security Settings"
+msgstr "安全設定"
+
 #: src/components/SystemRestore/SystemRestoreContent.vue:207
 #: src/components/SystemRestore/SystemRestoreContent.vue:284
 msgid "Security Token"
@@ -3909,7 +3939,7 @@ msgid ""
 "step of DNS challenge."
 msgstr "設定遞迴名稱伺服器以覆蓋系統名稱伺服器以進行 DNS 驗證步驟。"
 
-#: src/views/site/components/SiteStatusSegmented.vue:89
+#: src/views/site/components/SiteStatusSelect.vue:116
 msgid "set to maintenance mode"
 msgstr "設定為維護模式"
 
@@ -4144,13 +4174,11 @@ msgstr ""
 "支援透過 WebSocket 協議與後端進行通訊。如果您的 Nginx UI 是透過 Nginx "
 "反向代理使用,請參考此連結編寫對應的設定文件:https://nginxui.com/guide/nginx-proxy-example.html"
 
-#: src/language/curd.ts:51
-#: src/language/curd.ts:55
+#: src/language/curd.ts:51 src/language/curd.ts:55
 msgid "Support single or batch upload of files"
 msgstr "支援單個或多個檔案上傳"
 
-#: src/language/curd.ts:52
-#: src/language/curd.ts:56
+#: src/language/curd.ts:52 src/language/curd.ts:56
 msgid "Support uploading entire folders"
 msgstr "支援上傳整個資料夾"
 
@@ -4458,12 +4486,12 @@ msgstr "這將恢復設定檔案和資料庫。恢復完成後,Nginx UI 將重
 msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
 msgstr "這將在 %{nodeNames} 上升級或重新安裝 Nginx UI 到 %{version}。"
 
-#: src/views/preference/tabs/AuthSettings.vue:123
+#: src/views/preference/tabs/AuthSettings.vue:92
 msgid "Throttle"
 msgstr "節流"
 
 #: src/views/preference/components/AuthSettings/AddPasskey.vue:65
-#: src/views/preference/tabs/AuthSettings.vue:143
+#: src/views/preference/tabs/AuthSettings.vue:112
 #: src/views/preference/tabs/LogrotateSettings.vue:12
 msgid "Tips"
 msgstr "提示"
@@ -4474,7 +4502,7 @@ msgid ""
 "worker_processes or worker_connections"
 msgstr "提示:您可以通過增加 worker_processes 或 worker_connections 來提高並行處理能力"
 
-#: src/views/notification/notificationColumns.tsx:52
+#: src/views/notification/notificationColumns.tsx:58
 msgid "Title"
 msgstr "標題"
 
@@ -4584,6 +4612,14 @@ msgstr "類型"
 msgid "Unknown"
 msgstr "未知"
 
+#: src/views/user/UserProfile.vue:218
+msgid "Update Password"
+msgstr "更新密碼"
+
+#: src/views/user/UserProfile.vue:142
+msgid "Update Profile"
+msgstr "更新資料"
+
 #: src/views/preference/components/AuthSettings/Passkey.vue:39
 msgid "Update successfully"
 msgstr "更新成功"
@@ -4601,8 +4637,8 @@ msgid "Updated at"
 msgstr "更新時間"
 
 #: src/routes/modules/system.ts:33
-#: src/views/environments/list/Environment.vue:107
-#: src/views/environments/list/Environment.vue:99
+#: src/views/environments/list/Environment.vue:100
+#: src/views/environments/list/Environment.vue:108
 #: src/views/system/Upgrade.vue:154 src/views/system/Upgrade.vue:159
 msgid "Upgrade"
 msgstr "升級"
@@ -4628,7 +4664,7 @@ msgstr "上傳檔案"
 msgid "Upload Folders"
 msgstr "上傳資料夾"
 
-#: src/components/NgxConfigEditor/NgxUpstream.vue:173
+#: src/components/NgxConfigEditor/NgxUpstream.vue:177
 msgid "Upstream Name"
 msgstr "Upstream 名稱"
 
@@ -4660,11 +4696,20 @@ msgstr "使用者名稱"
 msgid "User banned"
 msgstr "使用者被禁止"
 
+#: src/views/user/UserProfile.vue:62
+msgid "User info updated successfully"
+msgstr "用戶資訊更新成功"
+
 #: src/constants/errors/user.ts:8
 msgid "User not enabled otp as 2fa"
 msgstr "使用者未啟用 OTP 作為雙重身份驗證 (2FA)"
 
+#: src/routes/modules/user.ts:19
+msgid "User Profile"
+msgstr "用戶資料"
+
 #: src/views/other/Login.vue:173 src/views/user/userColumns.tsx:7
+#: src/views/user/UserProfile.vue:127 src/views/user/UserProfile.vue:131
 msgid "Username"
 msgstr "使用者名稱"
 
@@ -4748,7 +4793,7 @@ msgid ""
 "the Nginx. Are you sure you want to continue?"
 msgstr "我們將從該檔案中刪除 HTTPChallenge 設定並重新載入 Nginx 設定檔案。你確定你要繼續嗎?"
 
-#: src/views/preference/tabs/AuthSettings.vue:96
+#: src/views/preference/tabs/AuthSettings.vue:65
 msgid "Webauthn"
 msgstr "Webauthn"
 
@@ -4821,12 +4866,12 @@ msgstr "將憑證寫入磁碟"
 #: src/components/EnvGroupTabs/EnvGroupTabs.vue:142
 #: src/components/NgxConfigEditor/directive/DirectiveEditorItem.vue:98
 #: src/components/NgxConfigEditor/LocationEditor.vue:88
-#: src/views/preference/tabs/AuthSettings.vue:162
+#: src/views/preference/tabs/AuthSettings.vue:131
 #: src/views/preference/tabs/CertSettings.vue:72
 msgid "Yes"
 msgstr "是的"
 
-#: src/views/terminal/Terminal.vue:135
+#: src/views/terminal/Terminal.vue:132
 msgid ""
 "You are accessing this terminal over an insecure HTTP connection on a "
 "non-localhost domain. This may expose sensitive information."
@@ -4914,9 +4959,6 @@ msgstr "您的通行金鑰"
 #~ msgid_plural "Total %{total} items"
 #~ msgstr[0] "總計 %{total} 項"
 
-#~ msgid "Updated successfully"
-#~ msgstr "更新成功"
-
 #~ msgid "View Details"
 #~ msgstr "檢視詳細資訊"
 

+ 43 - 0
app/src/pinia/moudule/user.ts

@@ -1,6 +1,8 @@
 import type { CookieChangeOptions } from 'universal-cookie'
+import type { User } from '@/api/user'
 import { useCookies } from '@vueuse/integrations/useCookies'
 import { defineStore } from 'pinia'
+import user from '@/api/user'
 
 export const useUserStore = defineStore('user', () => {
   const cookies = useCookies(['nginx-ui'])
@@ -27,6 +29,7 @@ export const useUserStore = defineStore('user', () => {
   cookies.addChangeListener(handleCookieChange)
 
   const passkeyRawId = ref('')
+  const info = ref<User>({} as User)
 
   const unreadCount = ref(0)
   const isLogin = computed(() => !!token.value)
@@ -46,6 +49,42 @@ export const useUserStore = defineStore('user', () => {
     passkeyRawId.value = ''
     secureSessionId.value = ''
     unreadCount.value = 0
+    info.value = {} as User
+  }
+
+  async function getCurrentUser() {
+    try {
+      const data = await user.getCurrentUser()
+      info.value = data
+      return data
+    }
+    catch (error) {
+      console.error('Failed to get current user:', error)
+      throw error
+    }
+  }
+
+  async function updateCurrentUser(userData: Partial<User>) {
+    try {
+      const response = await user.updateCurrentUser(userData as User)
+      info.value = { ...info.value, ...userData }
+      return response.data
+    }
+    catch (error) {
+      console.error('Failed to update current user:', error)
+      throw error
+    }
+  }
+
+  async function updateCurrentUserPassword(data: { old_password: string, new_password: string }) {
+    try {
+      const response = await user.updateCurrentUserPassword(data)
+      return response.data
+    }
+    catch (error) {
+      console.error('Failed to update password:', error)
+      throw error
+    }
   }
 
   return {
@@ -53,11 +92,15 @@ export const useUserStore = defineStore('user', () => {
     unreadCount,
     secureSessionId,
     passkeyRawId,
+    info,
     isLogin,
     passkeyLoginAvailable,
     passkeyLogin,
     login,
     logout,
+    getCurrentUser,
+    updateCurrentUser,
+    updateCurrentUserPassword,
   }
 }, {
   persist: true,

+ 11 - 2
app/src/routes/modules/user.ts

@@ -1,13 +1,22 @@
 import type { RouteRecordRaw } from 'vue-router'
-import { UserOutlined } from '@ant-design/icons-vue'
+import { UsergroupAddOutlined, UserOutlined } from '@ant-design/icons-vue'
 
 export const userRoutes: RouteRecordRaw[] = [
   {
-    path: 'user',
+    path: 'users',
     name: 'Manage Users',
     component: () => import('@/views/user/User.vue'),
     meta: {
       name: () => $gettext('Manage Users'),
+      icon: UsergroupAddOutlined,
+    },
+  },
+  {
+    path: 'profile',
+    name: 'User Profile',
+    component: () => import('@/views/user/UserProfile.vue'),
+    meta: {
+      name: () => $gettext('User Profile'),
       icon: UserOutlined,
     },
   },

+ 1 - 32
app/src/views/preference/tabs/AuthSettings.vue

@@ -1,13 +1,10 @@
 <script setup lang="tsx">
 import type { Ref } from 'vue'
-import type { TwoFAStatus } from '@/api/2fa'
-import type { RecoveryCode } from '@/api/recovery'
+
 import type { BannedIP } from '@/api/settings'
 import { message } from 'ant-design-vue'
 import dayjs from 'dayjs'
-import twoFA from '@/api/2fa'
 import setting from '@/api/settings'
-import { Passkey, RecoveryCodes, TOTP } from '../components/AuthSettings'
 import useSystemSettingsStore from '../store'
 
 const systemSettingsStore = useSystemSettingsStore()
@@ -50,39 +47,11 @@ function removeBannedIP(ip: string) {
     message.success($gettext('Remove successfully'))
   })
 }
-
-const twoFAStatus = ref<TwoFAStatus>({} as TwoFAStatus)
-const recoveryCodes = ref<RecoveryCode[]>()
-
-function get2FAStatus() {
-  twoFA.status().then(r => {
-    twoFAStatus.value = r
-  })
-}
-
-get2FAStatus()
 </script>
 
 <template>
   <div class="flex justify-center">
     <div>
-      <h2>{{ $gettext('2FA Settings') }}</h2>
-      <Passkey class="mb-4" />
-
-      <TOTP
-        v-model:recovery-codes="recoveryCodes"
-        class="mb-4"
-        :status="twoFAStatus?.otp_status"
-        @refresh="get2FAStatus"
-      />
-
-      <RecoveryCodes
-        class="mb-4"
-        :two-f-a-status="twoFAStatus"
-        :recovery-codes="recoveryCodes"
-        @refresh="get2FAStatus"
-      />
-
       <h2>
         {{ $gettext('Authentication Settings') }}
       </h2>

+ 0 - 3
app/src/views/terminal/Terminal.vue

@@ -3,7 +3,6 @@ import type ReconnectingWebSocket from 'reconnecting-websocket'
 import { FitAddon } from '@xterm/addon-fit'
 import { Terminal } from '@xterm/xterm'
 import { throttle } from 'lodash'
-import twoFA from '@/api/2fa'
 import use2FAModal from '@/components/TwoFA/use2FAModal'
 import ws from '@/lib/websocket'
 import '@xterm/xterm/css/xterm.css'
@@ -31,8 +30,6 @@ onMounted(() => {
   // Check connection security
   checkSecureConnection()
 
-  twoFA.secure_session_status()
-
   const otpModal = use2FAModal()
 
   otpModal.open().then(secureSessionId => {

+ 231 - 0
app/src/views/user/UserProfile.vue

@@ -0,0 +1,231 @@
+<script setup lang="tsx">
+import type { TwoFAStatus } from '@/api/2fa'
+import type { RecoveryCode } from '@/api/recovery'
+import { message } from 'ant-design-vue'
+import twoFA from '@/api/2fa'
+import { use2FAModal } from '@/components/TwoFA'
+import { useUserStore } from '@/pinia'
+import { Passkey, RecoveryCodes, TOTP } from '@/views/preference/components/AuthSettings'
+
+const twoFAStatus = ref<TwoFAStatus>({} as TwoFAStatus)
+const recoveryCodes = ref<RecoveryCode[]>()
+
+const userStore = useUserStore()
+const { info } = storeToRefs(userStore)
+
+// Form data
+const userForm = ref({
+  name: '',
+})
+
+const passwordForm = ref({
+  old_password: '',
+  new_password: '',
+  confirm_password: '',
+})
+
+const loading = ref(false)
+const passwordLoading = ref(false)
+
+function get2FAStatus() {
+  twoFA.status().then(r => {
+    twoFAStatus.value = r
+  })
+}
+
+async function getCurrentUser() {
+  try {
+    loading.value = true
+    await userStore.getCurrentUser()
+    // Update form with current user data
+    userForm.value.name = info.value.name || ''
+  }
+  catch (error) {
+    console.error('Failed to get current user:', error)
+    // Handle error (could show notification)
+  }
+  finally {
+    loading.value = false
+  }
+}
+
+async function updateUserInfo() {
+  try {
+    loading.value = true
+    const otpModal = use2FAModal()
+
+    otpModal.open().then(() => {
+      userStore.updateCurrentUser({
+        name: userForm.value.name,
+      })
+      // Show success message
+      message.success($gettext('User info updated successfully'))
+    })
+  }
+  catch (error) {
+    console.error('Failed to update user info:', error)
+  }
+  finally {
+    loading.value = false
+  }
+}
+
+async function changePassword() {
+  if (passwordForm.value.new_password !== passwordForm.value.confirm_password) {
+    message.error($gettext('Passwords do not match'))
+    return
+  }
+
+  try {
+    passwordLoading.value = true
+    const otpModal = use2FAModal()
+
+    otpModal.open().then(async () => {
+      await userStore.updateCurrentUserPassword({
+        old_password: passwordForm.value.old_password,
+        new_password: passwordForm.value.new_password,
+      })
+
+      // Clear password form
+      passwordForm.value = {
+        old_password: '',
+        new_password: '',
+        confirm_password: '',
+      }
+
+      message.success($gettext('Password updated successfully'))
+    })
+  }
+  catch (error) {
+    console.error('Failed to update password:', error)
+    // Handle error (could show notification)
+  }
+  finally {
+    passwordLoading.value = false
+  }
+}
+
+// Initialize data on mount
+onMounted(() => {
+  getCurrentUser()
+  get2FAStatus()
+})
+</script>
+
+<template>
+  <div>
+    <div class="max-w-4xl mx-auto">
+      <!-- Personal Information Section -->
+      <div class="mb-8">
+        <h2 class="text-xl font-semibold mb-4">
+          {{ $gettext('Personal Information') }}
+        </h2>
+        <ACard class="mb-4">
+          <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
+            <div>
+              <label class="block text-sm font-medium mb-2">
+                {{ $gettext('Username') }}
+              </label>
+              <AInput
+                v-model:value="userForm.name"
+                :placeholder="$gettext('Username')"
+                class="w-full"
+              />
+            </div>
+          </div>
+          <div class="mt-4">
+            <AButton
+              type="primary"
+              :loading="loading"
+              @click="updateUserInfo"
+            >
+              {{ $gettext('Update Profile') }}
+            </AButton>
+          </div>
+        </ACard>
+      </div>
+
+      <!-- 2FA Settings Section -->
+      <div class="mb-8">
+        <h2 class="text-xl font-semibold mb-4">
+          {{ $gettext('2FA Settings') }}
+        </h2>
+        <ACard>
+          <Passkey class="mb-4" />
+
+          <TOTP
+            v-model:recovery-codes="recoveryCodes"
+            class="mb-4"
+            :status="twoFAStatus?.otp_status"
+            @refresh="get2FAStatus"
+          />
+
+          <RecoveryCodes
+            class="mb-4"
+            :two-f-a-status="twoFAStatus"
+            :recovery-codes="recoveryCodes"
+            @refresh="get2FAStatus"
+          />
+        </ACard>
+      </div>
+
+      <!-- Security Settings Section -->
+      <div class="mb-8">
+        <h2 class="text-xl font-semibold mb-4">
+          {{ $gettext('Security Settings') }}
+        </h2>
+        <ACard>
+          <div class="space-y-4">
+            <div>
+              <h3 class="text-lg font-medium mb-2">
+                {{ $gettext('Change Password') }}
+              </h3>
+              <div class="grid grid-cols-1 gap-4">
+                <div>
+                  <label class="block text-sm font-medium mb-2">
+                    {{ $gettext('Current Password') }}
+                  </label>
+                  <AInputPassword
+                    v-model:value="passwordForm.old_password"
+                    class="w-full max-w-xs"
+                  />
+                </div>
+                <div>
+                  <label class="block text-sm font-medium mb-2">
+                    {{ $gettext('New Password') }}
+                  </label>
+                  <AInputPassword
+                    v-model:value="passwordForm.new_password"
+                    class="w-full max-w-xs"
+                  />
+                </div>
+                <div>
+                  <label class="block text-sm font-medium mb-2">
+                    {{ $gettext('Confirm New Password') }}
+                  </label>
+                  <AInputPassword
+                    v-model:value="passwordForm.confirm_password"
+                    class="w-full max-w-xs"
+                  />
+                </div>
+                <div>
+                  <AButton
+                    type="primary"
+                    :loading="passwordLoading"
+                    :disabled="!passwordForm.old_password || !passwordForm.new_password || !passwordForm.confirm_password"
+                    @click="changePassword"
+                  >
+                    {{ $gettext('Update Password') }}
+                  </AButton>
+                </div>
+              </div>
+            </div>
+          </div>
+        </ACard>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style lang="less" scoped>
+</style>