feat: new recovery codes

This commit is contained in:
Hintay 2025-02-09 23:36:28 +09:00
parent 3738bebca7
commit 0d1f56a43e
No known key found for this signature in database
GPG key ID: 120FC7FF121F2F2D
24 changed files with 1882 additions and 713 deletions

View file

@ -2,6 +2,10 @@ package user
import (
"encoding/base64"
"net/http"
"strings"
"time"
"github.com/0xJacky/Nginx-UI/api"
"github.com/0xJacky/Nginx-UI/internal/cache"
"github.com/0xJacky/Nginx-UI/internal/passkey"
@ -12,15 +16,14 @@ import (
"github.com/go-webauthn/webauthn/webauthn"
"github.com/google/uuid"
"github.com/uozi-tech/cosy"
"net/http"
"strings"
"time"
)
type Status2FA struct {
Enabled bool `json:"enabled"`
OTPStatus bool `json:"otp_status"`
PasskeyStatus bool `json:"passkey_status"`
Enabled bool `json:"enabled"`
OTPStatus bool `json:"otp_status"`
PasskeyStatus bool `json:"passkey_status"`
RecoveryCodesGenerated bool `json:"recovery_codes_generated"`
RecoveryCodesViewed bool `json:"recovery_codes_viewed"`
}
func get2FAStatus(c *gin.Context) (status Status2FA) {
@ -31,6 +34,8 @@ func get2FAStatus(c *gin.Context) (status Status2FA) {
status.OTPStatus = userPtr.EnabledOTP()
status.PasskeyStatus = userPtr.EnabledPasskey() && passkey.Enabled()
status.Enabled = status.OTPStatus || status.PasskeyStatus
status.RecoveryCodesGenerated = userPtr.RecoveryCodeGenerated()
status.RecoveryCodesViewed = userPtr.RecoveryCodeViewed()
}
return
}

View file

@ -1,15 +1,15 @@
package user
import (
"bytes"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
"github.com/0xJacky/Nginx-UI/api"
"github.com/0xJacky/Nginx-UI/internal/crypto"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/0xJacky/Nginx-UI/settings"
"github.com/gin-gonic/gin"
@ -59,22 +59,22 @@ func EnrollTOTP(c *gin.Context) {
return
}
var json struct {
var twoFA struct {
Secret string `json:"secret" binding:"required"`
Passcode string `json:"passcode" binding:"required"`
}
if !cosy.BindAndValid(c, &json) {
if !cosy.BindAndValid(c, &twoFA) {
return
}
if ok := totp.Validate(json.Passcode, json.Secret); !ok {
if ok := totp.Validate(twoFA.Passcode, twoFA.Secret); !ok {
c.JSON(http.StatusNotAcceptable, gin.H{
"message": "Invalid passcode",
})
return
}
ciphertext, err := crypto.AesEncrypt([]byte(json.Secret))
ciphertext, err := crypto.AesEncrypt([]byte(twoFA.Secret))
if err != nil {
api.ErrHandler(c, err)
return
@ -87,37 +87,30 @@ func EnrollTOTP(c *gin.Context) {
return
}
recoveryCode := sha1.Sum(ciphertext)
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"recovery_code": hex.EncodeToString(recoveryCode[:]),
})
}
func ResetOTP(c *gin.Context) {
var json struct {
RecoveryCode string `json:"recovery_code"`
}
if !cosy.BindAndValid(c, &json) {
return
}
recoverCode, err := hex.DecodeString(json.RecoveryCode)
t := time.Now()
recoveryCodes := model.RecoveryCodes{Codes: generateRecoveryCodes(16), LastViewed: &t}
codesJson, err := json.Marshal(&recoveryCodes)
if err != nil {
api.ErrHandler(c, err)
return
}
cUser := api.CurrentUser(c)
k := sha1.Sum(cUser.OTPSecret)
if !bytes.Equal(k[:], recoverCode) {
c.JSON(http.StatusBadRequest, gin.H{
"message": "Invalid recovery code",
})
_, err = u.Where(u.ID.Eq(cUser.ID)).Update(u.RecoveryCodes, codesJson)
if err != nil {
api.ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, RecoveryCodesResponse{
Message: "ok",
RecoveryCodes: recoveryCodes,
})
}
func ResetOTP(c *gin.Context) {
cUser := api.CurrentUser(c)
u := query.User
_, err = u.Where(u.ID.Eq(cUser.ID)).UpdateSimple(u.OTPSecret.Null())
_, err := u.Where(u.ID.Eq(cUser.ID)).UpdateSimple(u.OTPSecret.Null(), u.RecoveryCodes.Null())
if err != nil {
api.ErrHandler(c, err)
return

81
api/user/recovery.go Normal file
View file

@ -0,0 +1,81 @@
package user
import (
"encoding/json"
"fmt"
"math/rand"
"net/http"
"time"
"github.com/0xJacky/Nginx-UI/api"
"github.com/0xJacky/Nginx-UI/model"
"github.com/0xJacky/Nginx-UI/query"
"github.com/gin-gonic/gin"
)
type RecoveryCodesResponse struct {
Message string `json:"message"`
model.RecoveryCodes
}
func generateRecoveryCode() string {
// generate recovery code, 10 hex numbers
return fmt.Sprintf("%010x", rand.Intn(0x10000000000))
}
func generateRecoveryCodes(count int) []model.RecoveryCode {
recoveryCodes := make([]model.RecoveryCode, count)
for i := 0; i < count; i++ {
recoveryCodes[i].Code = generateRecoveryCode()
}
return recoveryCodes
}
func ViewRecoveryCodes(c *gin.Context) {
user := api.CurrentUser(c)
u := query.User
user, err := u.Where(u.ID.Eq(user.ID)).First()
if err != nil {
api.ErrHandler(c, err)
return
}
// update last viewed time
t := time.Now()
user.RecoveryCodes.LastViewed = &t
_, err = u.Where(u.ID.Eq(user.ID)).Updates(user)
if err != nil {
api.ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, RecoveryCodesResponse{
Message: "ok",
RecoveryCodes: user.RecoveryCodes,
})
}
func GenerateRecoveryCodes(c *gin.Context) {
user := api.CurrentUser(c)
t := time.Now()
recoveryCodes := model.RecoveryCodes{Codes: generateRecoveryCodes(16), LastViewed: &t}
codesJson, err := json.Marshal(&recoveryCodes)
if err != nil {
api.ErrHandler(c, err)
return
}
u := query.User
_, err = u.Where(u.ID.Eq(user.ID)).Update(u.RecoveryCodes, codesJson)
if err != nil {
api.ErrHandler(c, err)
return
}
c.JSON(http.StatusOK, RecoveryCodesResponse{
Message: "ok",
RecoveryCodes: recoveryCodes,
})
}

View file

@ -1,6 +1,7 @@
package user
import (
"github.com/0xJacky/Nginx-UI/internal/middleware"
"github.com/gin-gonic/gin"
)
@ -26,7 +27,6 @@ func InitUserRouter(r *gin.RouterGroup) {
r.GET("/otp_secret", GenerateTOTP)
r.POST("/otp_enroll", EnrollTOTP)
r.POST("/otp_reset", ResetOTP)
r.GET("/begin_passkey_register", BeginPasskeyRegistration)
r.POST("/finish_passkey_register", FinishPasskeyRegistration)
@ -34,4 +34,12 @@ func InitUserRouter(r *gin.RouterGroup) {
r.GET("/passkeys", GetPasskeyList)
r.POST("/passkeys/:id", UpdatePasskey)
r.DELETE("/passkeys/:id", DeletePasskey)
o := r.Group("", middleware.RequireSecureSession())
{
o.GET("/otp_reset", ResetOTP)
o.GET("/recovery_codes", ViewRecoveryCodes)
o.GET("/recovery_codes_generate", GenerateRecoveryCodes)
}
}

View file

@ -1,14 +1,16 @@
import type { AuthenticationResponseJSON } from '@simplewebauthn/browser'
import http from '@/lib/http'
export interface TwoFAStatusResponse {
export interface TwoFAStatus {
enabled: boolean
otp_status: boolean
passkey_status: boolean
recovery_codes_generated: boolean
recovery_codes_viewed: boolean
}
const twoFA = {
status(): Promise<TwoFAStatusResponse> {
status(): Promise<TwoFAStatus> {
return http.get('/2fa_status')
},
start_secure_session_by_otp(passcode: string, recovery_code: string): Promise<{ session_id: string }> {

View file

@ -1,3 +1,4 @@
import type { RecoveryCodesResponse } from '@/api/recovery'
import http from '@/lib/http'
export interface OTPGenerateSecretResponse {
@ -9,11 +10,11 @@ const otp = {
generate_secret(): Promise<OTPGenerateSecretResponse> {
return http.get('/otp_secret')
},
enroll_otp(secret: string, passcode: string): Promise<{ recovery_code: string }> {
enroll_otp(secret: string, passcode: string): Promise<RecoveryCodesResponse> {
return http.post('/otp_enroll', { secret, passcode })
},
reset(recovery_code: string) {
return http.post('/otp_reset', { recovery_code })
reset() {
return http.get('/otp_reset')
},
}

27
app/src/api/recovery.ts Normal file
View file

@ -0,0 +1,27 @@
import http from '@/lib/http'
export interface RecoveryCode {
code: string
used_time?: number
}
export interface RecoveryCodes {
codes: RecoveryCode[]
last_viewed?: number
last_downloaded?: number
}
export interface RecoveryCodesResponse extends RecoveryCodes {
message: string
}
const recovery = {
generate(): Promise<RecoveryCodesResponse> {
return http.get('/recovery_codes_generate')
},
view(): Promise<RecoveryCodesResponse> {
return http.get('/recovery_codes')
},
}
export default recovery

View file

@ -1,5 +1,5 @@
<script setup lang="ts">
import type { TwoFAStatusResponse } from '@/api/2fa'
import type { TwoFAStatus } from '@/api/2fa'
import twoFA from '@/api/2fa'
import OTPInput from '@/components/OTPInput/OTPInput.vue'
import { useUserStore } from '@/pinia'
@ -7,7 +7,7 @@ import { KeyOutlined } from '@ant-design/icons-vue'
import { startAuthentication } from '@simplewebauthn/browser'
defineProps<{
twoFAStatus: TwoFAStatusResponse
twoFAStatus: TwoFAStatus
}>()
const emit = defineEmits(['submitOTP', 'submitSecureSessionID'])

View file

@ -17,7 +17,7 @@ msgstr ""
msgid "2FA"
msgstr "المصادقة الثنائية"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "إعدادات المصادقة الثنائية"
@ -40,7 +40,7 @@ msgstr "مستخدم ACME"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -140,7 +140,7 @@ msgstr "تم التكرار بنجاح"
msgid "Arch"
msgstr "بنية"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "هل أنت متأكد من حذف عنوان IP المحظور هذا على الفور؟"
@ -148,6 +148,16 @@ msgstr "هل أنت متأكد من حذف عنوان IP المحظور هذا
msgid "Are you sure to delete this passkey immediately?"
msgstr "هل أنت متأكد من حذف مفتاح المرور هذا على الفور؟"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "هل أنت متأكد أنك تريد استرداد هذا العنصر؟"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "هل أنت متأكد أنك تريد الحذف؟"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -204,7 +214,7 @@ msgstr "المساعد"
msgid "Attempt to fix"
msgstr "محاولات"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "محاولات"
@ -216,7 +226,7 @@ msgstr "مصادقة"
msgid "Authenticate with a passkey"
msgstr "المصادقة باستخدام مفتاح المرور"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "إعدادات المصادقة"
@ -253,15 +263,15 @@ msgstr "العودة إلى الصفحة الرئيسية"
msgid "Back to list"
msgstr "العودة إلى القائمة"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "دقائق حد الحظر"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "عناوين IP المحظورة"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "محظور حتى"
@ -457,7 +467,7 @@ msgstr "مسح"
msgid "Cleared successfully"
msgstr "تم المسح بنجاح"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -508,6 +518,7 @@ msgstr "محتوى"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "تم النسخ"
@ -515,6 +526,11 @@ msgstr "تم النسخ"
msgid "Copy"
msgstr "نسخ"
#: src/views/preference/components/RecoveryCodes.vue:121
#, fuzzy
msgid "Copy Codes"
msgstr "رمز الاسترداد"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "ترقية نواة"
@ -565,11 +581,11 @@ msgstr "بيان الاعتماد"
msgid "Credentials"
msgstr "بيانات الاعتماد"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr "TOTP مفعل للحساب الحالي."
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr "TOTP معطل للحساب الحالي."
@ -906,7 +922,7 @@ msgstr "فشل تفعيل %{conf_name} في %{node_name}"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "تم تفعيل %{conf_name} في %{node_name} بنجاح"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "تم تفعيل المصادقة الثنائية بنجاح"
@ -942,7 +958,7 @@ msgstr "تم التفعيل بنجاح"
msgid "Enable TLS"
msgstr "تفعيل TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
msgid "Enable TOTP"
msgstr "تفعيل TOTP"
@ -1067,6 +1083,10 @@ msgstr "تصفيه"
msgid "Finished"
msgstr "انتهى"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1102,6 +1122,22 @@ msgstr "شهادة عامة"
msgid "Generate"
msgstr "توليد"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate New Recovery Codes"
msgstr "رمز الاسترداد"
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "رمز الاسترداد"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "تم الاسترداد بنجاح"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "توليد مفتاح خاص لتسجيل الحساب"
@ -1150,7 +1186,7 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr "إذا تُرك فارغًا، سيتم استخدام دليل CA الافتراضي."
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1158,14 +1194,6 @@ msgstr ""
"إذا وصل عدد محاولات تسجيل الدخول الفاشلة من عنوان IP إلى الحد الأقصى "
"للمحاولات في حد دقائق الحظر، سيتم حظر عنوان IP لفترة من الوقت."
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
"إذا فقدت هاتفك المحمول، يمكنك استخدام رمز الاسترداد لإعادة تعيين المصادقة "
"الثنائية."
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr "إذا كان متصفحك يدعم WebAuthn Passkey، ستظهر نافذة حوار."
@ -1199,12 +1227,11 @@ msgstr "خطأ في ترقية النواة الأولية"
msgid "Initialing core upgrader"
msgstr "بدء ترقية النواة"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "أدخل الرمز من التطبيق:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "أدخل رمز الاسترداد:"
@ -1247,7 +1274,7 @@ msgstr "رمز المرور أو رمز الاسترداد غير صالح"
msgid "Invalid recovery code"
msgstr "رمز 2FA أو الاسترداد غير صالح"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1271,6 +1298,12 @@ msgstr "المُصدر: %{issuer}"
msgid "Jwt Secret"
msgstr "سر JWT"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1412,7 +1445,7 @@ msgstr "إدارة المستخدمين"
msgid "Managed Certificate"
msgstr "شهادة مُدارة"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr "الحد الأقصى للمحاولات"
@ -1598,7 +1631,7 @@ msgstr "تم إعادة تشغيل Nginx بنجاح"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1717,7 +1750,7 @@ msgstr "أوبن أي آي"
msgid "Or"
msgstr "أو"
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -1960,17 +1993,19 @@ msgid "Recovered Successfully"
msgstr "تم الاسترداد بنجاح"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr "استرداد"
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "رمز الاسترداد"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
msgstr "رمز الاسترداد:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
msgid "Recursive Nameservers"
@ -2035,7 +2070,7 @@ msgstr "إعادة التحميل"
msgid "Reloading nginx"
msgstr "إعادة تحميل nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr "إزالة"
@ -2047,7 +2082,7 @@ msgstr "خطأ في إزالة الموقع %{site} من %{node}، الاستج
msgid "Remove Site %{site} from %{node} successfully"
msgstr "تمت إزالة الموقع %{site} من %{node} بنجاح"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr "إزالة بنجاح"
@ -2136,7 +2171,7 @@ msgstr "تم الطلب باستخدام عوامل خاطئة"
msgid "Reset"
msgstr "إعادة تعيين"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr "إعادة تعيين التحقق بخطوتين"
@ -2148,15 +2183,15 @@ msgstr "إعادة تشغيل"
msgid "Restarting"
msgstr "إعادة التشغيل"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr "اسم العرض RP"
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr "أصول RP"
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr "معرّف الجهاز عن بُعد"
@ -2223,7 +2258,7 @@ msgstr "تم الحفظ بنجاح"
msgid "Saved successfully"
msgstr "تم الحفظ بنجاح"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr "امسح رمز الاستجابة السريعة بهاتفك المحمول لإضافة الحساب إلى التطبيق."
@ -2231,7 +2266,7 @@ msgstr "امسح رمز الاستجابة السريعة بهاتفك المح
msgid "SDK"
msgstr "حزمة تطوير البرمجيات SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr "تم نسخ السر"
@ -2590,11 +2625,6 @@ msgstr ""
"يجب أن يحتوي اسم العقدة على حروف وأحرف يونيكود وأرقام وشرطات وعلامات وصل "
"ونقاط فقط."
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr "رمز الاسترداد يُعرض مرة واحدة فقط، يرجى حفظه في مكان آمن."
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2626,6 +2656,13 @@ msgstr "عنوان URL غير صالح."
msgid "The username or password is incorrect"
msgstr "اسم المستخدم أو كلمة المرور غير صحيحة"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "هذا العنصر في الشهادة التلقائية غير صالح، يرجى إزالته."
@ -2667,11 +2704,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "سيتم ترقية أو إعادة تثبيت Nginx UI على %{nodeNames} إلى %{version}."
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr "كبح"
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2681,7 +2718,7 @@ msgstr "نصائح"
msgid "Title"
msgstr "عنوان"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2734,11 +2771,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr "كلمة مرور لمرة واحدة تعتمد على الوقت"
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2864,6 +2901,16 @@ msgstr "عرض التفاصيل"
msgid "View Mode"
msgstr "وضع العرض"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "رمز الاسترداد"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "عرض"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2885,7 +2932,7 @@ msgstr ""
"سنقوم بإزالة تكوين HTTPChallenge من هذا الملف وإعادة تحميل Nginx. هل أنت "
"متأكد أنك تريد المتابعة؟"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr "ويب أوثن"
@ -2911,6 +2958,12 @@ msgstr ""
"عند تفعيل/تعطيل، حذف، أو حفظ هذا الموقع، سيتم مزامنة العقد المحددة في فئة "
"الموقع والعقد المحددة أدناه."
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2924,7 +2977,7 @@ msgstr "كتابة مفتاح الشهادة الخاص إلى القرص"
msgid "Writing certificate to disk"
msgstr "كتابة الشهادة إلى القرص"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -2945,10 +2998,44 @@ msgid ""
"passkey."
msgstr "لم تقم بتكوين إعدادات Webauthn، لذا لا يمكنك إضافة مفتاح مرور."
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr "مفاتيح المرور الخاصة بك"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr ""
#~ "إذا فقدت هاتفك المحمول، يمكنك استخدام رمز الاسترداد لإعادة تعيين المصادقة "
#~ "الثنائية."
#~ msgid "Recovery Code:"
#~ msgstr "رمز الاسترداد:"
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr "رمز الاسترداد يُعرض مرة واحدة فقط، يرجى حفظه في مكان آمن."
#~ msgid "Can't scan? Use text key binding"
#~ msgstr "لا يمكن المسح؟ استخدم ربط مفتاح النص"

View file

@ -13,7 +13,7 @@ msgstr ""
msgid "2FA"
msgstr ""
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr ""
@ -38,7 +38,7 @@ msgstr "Username"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -142,7 +142,7 @@ msgstr "Saved successfully"
msgid "Arch"
msgstr ""
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
#, fuzzy
msgid "Are you sure to delete this banned IP immediately?"
msgstr "Are you sure you want to remove this directive?"
@ -152,6 +152,16 @@ msgstr "Are you sure you want to remove this directive?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "Are you sure you want to remove this directive?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "Are you sure you want to remove this directive?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "Are you sure you want to remove this directive?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -215,7 +225,7 @@ msgstr ""
msgid "Attempt to fix"
msgstr ""
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr ""
@ -227,7 +237,7 @@ msgstr ""
msgid "Authenticate with a passkey"
msgstr ""
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr ""
@ -265,15 +275,15 @@ msgstr "Back"
msgid "Back to list"
msgstr ""
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr ""
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr ""
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr ""
@ -469,7 +479,7 @@ msgstr ""
msgid "Cleared successfully"
msgstr "Disabled successfully"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -522,6 +532,7 @@ msgstr "Content"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr ""
@ -529,6 +540,10 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr ""
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr ""
@ -583,11 +598,11 @@ msgstr ""
msgid "Credentials"
msgstr ""
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr ""
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr ""
@ -944,7 +959,7 @@ msgstr "Saved successfully"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "Saved successfully"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
#, fuzzy
msgid "Enable 2FA successfully"
msgstr "Enabled successfully"
@ -986,7 +1001,7 @@ msgstr "Enabled successfully"
msgid "Enable TLS"
msgstr "Enable TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "Enable TLS"
@ -1116,6 +1131,10 @@ msgstr ""
msgid "Finished"
msgstr "Finished"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1154,6 +1173,21 @@ msgstr "Certificate is valid"
msgid "Generate"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "Invalid E-mail!"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Saved successfully"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr ""
@ -1203,18 +1237,12 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr ""
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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 ""
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1247,12 +1275,11 @@ msgstr ""
msgid "Initialing core upgrader"
msgstr ""
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr ""
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr ""
@ -1299,7 +1326,7 @@ msgstr ""
msgid "Invalid recovery code"
msgstr "Invalid E-mail!"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr ""
@ -1326,6 +1353,12 @@ msgstr ""
msgid "Jwt Secret"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1474,7 +1507,7 @@ msgstr "Manage Users"
msgid "Managed Certificate"
msgstr "Certificate is valid"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr ""
@ -1672,7 +1705,7 @@ msgstr "Saved successfully"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1793,7 +1826,7 @@ msgstr ""
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -2036,16 +2069,18 @@ msgid "Recovered Successfully"
msgstr "Saved successfully"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr ""
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "Invalid E-mail!"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
@ -2117,7 +2152,7 @@ msgstr ""
msgid "Reloading nginx"
msgstr ""
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr ""
@ -2131,7 +2166,7 @@ msgstr "Saved successfully"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "Saved successfully"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
#, fuzzy
msgid "Remove successfully"
@ -2233,7 +2268,7 @@ msgstr ""
msgid "Reset"
msgstr ""
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr ""
@ -2245,15 +2280,15 @@ msgstr ""
msgid "Restarting"
msgstr ""
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2326,7 +2361,7 @@ msgstr "Saved successfully"
msgid "Saved successfully"
msgstr "Saved successfully"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
@ -2334,7 +2369,7 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2704,11 +2739,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr ""
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2740,6 +2770,13 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "Password"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr ""
@ -2782,11 +2819,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "Saved successfully"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2796,7 +2833,7 @@ msgstr ""
msgid "Title"
msgstr ""
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2834,11 +2871,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2971,6 +3008,16 @@ msgstr ""
msgid "View Mode"
msgstr "Basic Mode"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "Invalid E-mail!"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Basic Mode"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2990,7 +3037,7 @@ msgid ""
"Nginx. Are you sure you want to continue?"
msgstr ""
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -3011,6 +3058,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -3025,7 +3078,7 @@ msgstr ""
msgid "Writing certificate to disk"
msgstr "Certificate is valid"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3046,6 +3099,26 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr ""

View file

@ -20,7 +20,7 @@ msgstr ""
msgid "2FA"
msgstr "2FA"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "Configuración de 2FA"
@ -43,7 +43,7 @@ msgstr "Usuario ACME"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -145,7 +145,7 @@ msgstr "Duplicado con éxito"
msgid "Arch"
msgstr "Arquitectura"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "¿Está seguro de eliminar esta IP bloqueada inmediatamente?"
@ -153,6 +153,16 @@ msgstr "¿Está seguro de eliminar esta IP bloqueada inmediatamente?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "¿Está seguro de eliminar esta llave de acceso inmediatamente?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "¿Está seguro de que quiere recuperar este elemento?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "¿Está seguro de que quiere borrar?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -209,7 +219,7 @@ msgstr "Asistente"
msgid "Attempt to fix"
msgstr "Intentos"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "Intentos"
@ -221,7 +231,7 @@ msgstr "Autenticación"
msgid "Authenticate with a passkey"
msgstr "Autenticarse con una llave de acceso"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "Configuración de autenticación"
@ -258,15 +268,15 @@ msgstr "Volver al Inicio"
msgid "Back to list"
msgstr "Volver a la lista"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "Umbral de Prohibición en Minutos"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "IPs prohibidas"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "Bloqueado hasta"
@ -456,7 +466,7 @@ msgstr "Borrar"
msgid "Cleared successfully"
msgstr "Limpiado exitoso"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -507,6 +517,7 @@ msgstr "Contenido"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "Copiado"
@ -514,6 +525,11 @@ msgstr "Copiado"
msgid "Copy"
msgstr "Copiar"
#: src/views/preference/components/RecoveryCodes.vue:121
#, fuzzy
msgid "Copy Codes"
msgstr "Código de Recuperación"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "Actualización del kernel"
@ -564,11 +580,11 @@ msgstr "Credencial"
msgid "Credentials"
msgstr "Credenciales"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr "La cuenta actual tiene habilitada TOTP."
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr "La cuenta actual no tiene habilitada TOTP."
@ -903,7 +919,7 @@ msgstr "Falló el habilitado de %{conf_name} en %{node_name}"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "Habilitado exitoso de %{conf_name} en %{node_name}"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "Habilitar 2FA exitoso"
@ -943,7 +959,7 @@ msgstr "Habilitado con Éxito"
msgid "Enable TLS"
msgstr "Habilitar TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "Habilitar TLS"
@ -1070,6 +1086,10 @@ msgstr "Filtro"
msgid "Finished"
msgstr "Terminado"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1107,6 +1127,22 @@ msgstr "Certificado General"
msgid "Generate"
msgstr "Generar"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate New Recovery Codes"
msgstr "Código de Recuperación"
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "Código de Recuperación"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Recuperado con éxito"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "Generando clave privada para registrar cuenta"
@ -1155,7 +1191,7 @@ msgstr ""
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/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1164,14 +1200,6 @@ msgstr ""
"el máximo de intentos en los minutos del umbral de prohibición, la IP será "
"bloqueada por un período de tiempo."
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
"Si pierde su teléfono móvil, puede usar el código de recuperación para "
"restablecer su 2FA."
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1206,12 +1234,11 @@ msgstr "Error de actualización de kernel inicial"
msgid "Initialing core upgrader"
msgstr "Inicializando la actualización del kernel"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "Ingrese el código de la aplicación:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "Ingrese el código de recuperación:"
@ -1254,7 +1281,7 @@ msgstr "Código de acceso o código de recuperación inválido"
msgid "Invalid recovery code"
msgstr "Código 2FA o de recuperación inválido"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1278,6 +1305,12 @@ msgstr "Emisor: %{issuer}"
msgid "Jwt Secret"
msgstr "Secreto Jwt"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1422,7 +1455,7 @@ msgstr "Administrar usuarios"
msgid "Managed Certificate"
msgstr "Certificado Administrado"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr "Intentos máximos"
@ -1611,7 +1644,7 @@ msgstr "Nginx reiniciado con éxito"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1732,7 +1765,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr "O"
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -1992,17 +2025,19 @@ msgid "Recovered Successfully"
msgstr "Recuperado con éxito"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr "Recuperación"
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "Código de Recuperación"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
msgstr "Código de Recuperación:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
msgid "Recursive Nameservers"
@ -2071,7 +2106,7 @@ msgstr "Recargando"
msgid "Reloading nginx"
msgstr "Recargando Nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr "Eliminar"
@ -2085,7 +2120,7 @@ msgstr "Eliminar sitio: %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "Duplicado con éxito de %{conf_name} a %{node_name}"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr "Eliminado con éxito"
@ -2176,7 +2211,7 @@ msgstr "Pedido con parámetros incorrectos"
msgid "Reset"
msgstr "Limpiar"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr "Restablecer 2FA"
@ -2188,15 +2223,15 @@ msgstr "Reiniciar"
msgid "Restarting"
msgstr "Reiniciando"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr "Nombre RP"
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr "Orígenes RP"
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr "RPID"
@ -2269,7 +2304,7 @@ msgstr "Guardado con éxito"
msgid "Saved successfully"
msgstr "Guardado con éxito"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
"Escanee el código QR con su teléfono móvil para agregar la cuenta a la "
@ -2279,7 +2314,7 @@ msgstr ""
msgid "SDK"
msgstr "SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr "El secreto ha sido copiado"
@ -2648,13 +2683,6 @@ msgstr ""
"El nombre del servidor solo debe contener letras, Unicode, números, guiones, "
"rayas y puntos."
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
"El código de recuperación se muestra solo una vez, por favor guárdalo en un "
"lugar seguro."
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2687,6 +2715,13 @@ msgstr "La URL no es válida."
msgid "The username or password is incorrect"
msgstr "El nombre de usuario o contraseña son incorrectos"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "Este elemento de Auto Cert es inválido, elimínelo por favor."
@ -2735,11 +2770,11 @@ msgstr ""
"Esto actualizará o reinstalará la interfaz de usuario de Nginx en "
"%{nodeNames} a %{version}."
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr "Acelerador"
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2749,7 +2784,7 @@ msgstr "Consejos"
msgid "Title"
msgstr "Título"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2800,11 +2835,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr "TOTP"
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2931,6 +2966,16 @@ msgstr "Ver detalles"
msgid "View Mode"
msgstr "Modo de vista"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "Código de Recuperación"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Ver"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2954,7 +2999,7 @@ msgstr ""
"Eliminaremos la configuración de HTTPChallenge de este archivo y "
"recargaremos Nginx. ¿Estás seguro de que quieres continuar?"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr "Webauthn"
@ -2981,6 +3026,12 @@ msgstr ""
"configurados en la categoría del sitio y los nodos seleccionados a "
"continuación se sincronizarán."
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2994,7 +3045,7 @@ msgstr "Escribir la clave privada del certificado a disco"
msgid "Writing certificate to disk"
msgstr "Escribir certificado a disco"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3017,10 +3068,46 @@ msgstr ""
"No ha configurado los ajustes de Webauthn, por lo que no puede agregar una "
"llave de acceso."
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr "Sus llaves de acceso"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr ""
#~ "Si pierde su teléfono móvil, puede usar el código de recuperación para "
#~ "restablecer su 2FA."
#~ msgid "Recovery Code:"
#~ msgstr "Código de Recuperación:"
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr ""
#~ "El código de recuperación se muestra solo una vez, por favor guárdalo en "
#~ "un lugar seguro."
#~ msgid "Can't scan? Use text key binding"
#~ msgstr "¿No puede escanear? Utilice la vinculación con una llave de texto"

View file

@ -15,7 +15,7 @@ msgstr ""
msgid "2FA"
msgstr ""
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr ""
@ -39,7 +39,7 @@ msgstr "Nom d'utilisateur"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -145,7 +145,7 @@ msgstr "Dupliqué avec succès"
msgid "Arch"
msgstr "Arch"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
#, fuzzy
msgid "Are you sure to delete this banned IP immediately?"
msgstr "Etes-vous sûr que vous voulez supprimer ?"
@ -155,6 +155,16 @@ msgstr "Etes-vous sûr que vous voulez supprimer ?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "Etes-vous sûr que vous voulez supprimer ?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "Voulez-vous vraiment supprimer cette directive ?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "Etes-vous sûr que vous voulez supprimer ?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -216,7 +226,7 @@ msgstr ""
msgid "Attempt to fix"
msgstr ""
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr ""
@ -229,7 +239,7 @@ msgstr "Autheur"
msgid "Authenticate with a passkey"
msgstr ""
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr ""
@ -266,15 +276,15 @@ msgstr "Retour au menu principal"
msgid "Back to list"
msgstr ""
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr ""
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr ""
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr ""
@ -471,7 +481,7 @@ msgstr "Effacer"
msgid "Cleared successfully"
msgstr "Désactivé avec succès"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -523,6 +533,7 @@ msgstr "Contenu"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr ""
@ -530,6 +541,10 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr ""
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "Mise à jour du core"
@ -584,11 +599,11 @@ msgstr "Identifiant"
msgid "Credentials"
msgstr "Identifiants"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr ""
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr ""
@ -943,7 +958,7 @@ msgstr "Dupliqué avec succès"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "Dupliqué avec succès"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
#, fuzzy
msgid "Enable 2FA successfully"
msgstr "Activé avec succès"
@ -985,7 +1000,7 @@ msgstr "Activé avec succès"
msgid "Enable TLS"
msgstr "Activer TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "Activer TLS"
@ -1117,6 +1132,10 @@ msgstr "Filtrer"
msgid "Finished"
msgstr "Finie"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1154,6 +1173,20 @@ msgstr "Changer de certificat"
msgid "Generate"
msgstr "Générer"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Enregistré avec succès"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "Génération de clé privée pour l'enregistrement du compte"
@ -1202,18 +1235,12 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr ""
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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 ""
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1247,12 +1274,11 @@ msgstr "Erreur du programme de mise à niveau initial du core"
msgid "Initialing core upgrader"
msgstr "Initialisation du programme de mise à niveau du core"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr ""
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr ""
@ -1294,7 +1320,7 @@ msgstr ""
msgid "Invalid recovery code"
msgstr ""
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr ""
@ -1320,6 +1346,12 @@ msgstr ""
msgid "Jwt Secret"
msgstr "Secret Jwt"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
#, fuzzy
@ -1470,7 +1502,7 @@ msgstr "Gérer les utilisateurs"
msgid "Managed Certificate"
msgstr "Changer de certificat"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr ""
@ -1667,7 +1699,7 @@ msgstr "Nginx a redémarré avec succès"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1786,7 +1818,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -2040,16 +2072,17 @@ msgid "Recovered Successfully"
msgstr "Enregistré avec succès"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr ""
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
msgid "Recovery Codes"
msgstr ""
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
@ -2121,7 +2154,7 @@ msgstr "Rechargement"
msgid "Reloading nginx"
msgstr "Rechargement de nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr ""
@ -2135,7 +2168,7 @@ msgstr "Supprimer le site : %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "Dupliqué avec succès"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
#, fuzzy
msgid "Remove successfully"
@ -2237,7 +2270,7 @@ msgstr ""
msgid "Reset"
msgstr "Réinitialiser"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
#, fuzzy
msgid "Reset 2FA"
msgstr "Réinitialiser"
@ -2250,15 +2283,15 @@ msgstr "Redémarrer"
msgid "Restarting"
msgstr "Redémarrage"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2329,7 +2362,7 @@ msgstr "Sauvegarde réussie"
msgid "Saved successfully"
msgstr "Enregistré avec succès"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
@ -2337,7 +2370,7 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2706,11 +2739,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr ""
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2742,6 +2770,13 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "Le pseudo ou mot de passe est incorect"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
@ -2787,11 +2822,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "Dupliqué avec succès"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2801,7 +2836,7 @@ msgstr ""
msgid "Title"
msgstr ""
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2843,11 +2878,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2977,6 +3012,15 @@ msgstr ""
msgid "View Mode"
msgstr "Mode simple"
#: src/views/preference/components/RecoveryCodes.vue:134
msgid "View Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Voir"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2998,7 +3042,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/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -3019,6 +3063,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -3032,7 +3082,7 @@ msgstr "Écriture de la clé privée du certificat sur le disque"
msgid "Writing certificate to disk"
msgstr "Écriture du certificat sur le disque"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3053,6 +3103,26 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr ""

View file

@ -18,7 +18,7 @@ msgstr ""
msgid "2FA"
msgstr "2FA"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "2FA 설정"
@ -41,7 +41,7 @@ msgstr "ACME 사용자"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -141,7 +141,7 @@ msgstr "성공적으로 복제됨"
msgid "Arch"
msgstr "아키텍처"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "차단된 IP를 즉시 삭제하시겠습니까?"
@ -150,6 +150,16 @@ msgstr "차단된 IP를 즉시 삭제하시겠습니까?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "차단된 IP를 즉시 삭제하시겠습니까?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "이 항목을 복구하시겠습니까?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "정말 삭제하시겠습니까?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -206,7 +216,7 @@ msgstr "조수"
msgid "Attempt to fix"
msgstr "시도 횟수"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "시도 횟수"
@ -218,7 +228,7 @@ msgstr "인증"
msgid "Authenticate with a passkey"
msgstr ""
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr ""
@ -255,15 +265,15 @@ msgstr "홈으로"
msgid "Back to list"
msgstr "목록으로 돌아가기"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "차단 시간(분)"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "차단된 IP"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "차단될 시간"
@ -453,7 +463,7 @@ msgstr "클리어"
msgid "Cleared successfully"
msgstr "성공적으로 제거됨"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -504,6 +514,7 @@ msgstr "내용"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr ""
@ -511,6 +522,10 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr ""
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "코어 업그레이드"
@ -564,11 +579,11 @@ msgstr "인증 정보"
msgid "Credentials"
msgstr "인증 정보들"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr ""
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr ""
@ -904,7 +919,7 @@ msgstr "%{node_name}에서 %{conf_name} 활성화 실패"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "%{node_name}에서 %{conf_name} 성공적으로 활성화됨"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
#, fuzzy
msgid "Enable 2FA successfully"
msgstr "성공적으로 활성화"
@ -945,7 +960,7 @@ msgstr "성공적으로 활성화"
msgid "Enable TLS"
msgstr "TLS 활성화"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "TLS 활성화"
@ -1074,6 +1089,10 @@ msgstr "필터"
msgid "Finished"
msgstr "완료됨"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1112,6 +1131,21 @@ msgstr "일반 인증서"
msgid "Generate"
msgstr "생성"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "유효함"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "성공적으로 제거됨"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "계정 등록을 위한 개인 키 생성 중"
@ -1161,18 +1195,12 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr ""
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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 ""
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1205,12 +1233,11 @@ msgstr "초기 코어 업그레이더 오류"
msgid "Initialing core upgrader"
msgstr "코어 업그레이더 초기화"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr ""
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr ""
@ -1257,7 +1284,7 @@ msgstr ""
msgid "Invalid recovery code"
msgstr "유효함"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr ""
@ -1284,6 +1311,12 @@ msgstr ""
msgid "Jwt Secret"
msgstr "Jwt 토큰"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1436,7 +1469,7 @@ msgstr "사용자 관리"
msgid "Managed Certificate"
msgstr "인증서 유효"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
#, fuzzy
msgid "Max Attempts"
msgstr "시도 횟수"
@ -1638,7 +1671,7 @@ msgstr "Nginx가 성공적으로 재시작됨"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1757,7 +1790,7 @@ msgstr "오픈AI"
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -2004,16 +2037,18 @@ msgid "Recovered Successfully"
msgstr "성공적으로 제거됨"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr ""
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "유효함"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
@ -2086,7 +2121,7 @@ msgstr "리로딩 중"
msgid "Reloading nginx"
msgstr "Nginx 리로딩 중"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr ""
@ -2100,7 +2135,7 @@ msgstr "사이트 삭제: %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
#, fuzzy
msgid "Remove successfully"
@ -2202,7 +2237,7 @@ msgstr "잘못된 매개변수로 요청됨"
msgid "Reset"
msgstr "재설정"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
#, fuzzy
msgid "Reset 2FA"
msgstr "재설정"
@ -2215,15 +2250,15 @@ msgstr "재시작"
msgid "Restarting"
msgstr "재시작 중"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2296,7 +2331,7 @@ msgstr "성공적으로 저장됨"
msgid "Saved successfully"
msgstr "성공적으로 저장됨"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
@ -2304,7 +2339,7 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2670,11 +2705,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr ""
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2707,6 +2737,13 @@ msgstr "유효한 URL이 아닙니다"
msgid "The username or password is incorrect"
msgstr "사용자 이름 또는 비밀번호가 올바르지 않습니다"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "이 자동 인증 항목이 유효하지 않습니다. 제거해주세요."
@ -2751,11 +2788,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "%{conf_name}을(를) %{node_name}(으)로 성공적으로 복제함"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2765,7 +2802,7 @@ msgstr "팁"
msgid "Title"
msgstr "제목"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2806,11 +2843,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2943,6 +2980,16 @@ msgstr "세부 사항"
msgid "View Mode"
msgstr "기본 모드"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "유효함"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "보기"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2966,7 +3013,7 @@ msgstr ""
"이 파일에서 HTTPChallenge 구성을 제거하고 Nginx를 다시 로드할 예정입니다. 계"
"속하시겠습니까?"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -2987,6 +3034,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -3000,7 +3053,7 @@ msgstr "인증서 개인 키를 디스크에 쓰기"
msgid "Writing certificate to disk"
msgstr "인증서를 디스크에 쓰기"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3021,6 +3074,26 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr ""

View file

@ -6,7 +6,7 @@ msgstr ""
msgid "2FA"
msgstr ""
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr ""
@ -31,7 +31,7 @@ msgstr ""
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76
#: src/views/stream/StreamList.vue:49
@ -132,7 +132,7 @@ msgstr ""
msgid "Arch"
msgstr ""
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr ""
@ -140,6 +140,14 @@ msgstr ""
msgid "Are you sure to delete this passkey immediately?"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:154
msgid "Are you sure to generate new recovery codes?"
msgstr ""
#: src/views/preference/components/TOTP.vue:85
msgid "Are you sure to reset 2FA?"
msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
msgid "Are you sure you want to apply to all selected?"
msgstr ""
@ -194,7 +202,7 @@ msgstr ""
msgid "Attempt to fix"
msgstr ""
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr ""
@ -206,7 +214,7 @@ msgstr ""
msgid "Authenticate with a passkey"
msgstr ""
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr ""
@ -245,15 +253,15 @@ msgstr ""
msgid "Back to list"
msgstr ""
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr ""
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr ""
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr ""
@ -433,7 +441,7 @@ msgstr ""
msgid "Cleared successfully"
msgstr ""
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -484,6 +492,7 @@ msgstr ""
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr ""
@ -491,6 +500,10 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr ""
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr ""
@ -543,11 +556,11 @@ msgstr ""
msgid "Credentials"
msgstr ""
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr ""
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr ""
@ -875,7 +888,7 @@ msgstr ""
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr ""
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr ""
@ -911,7 +924,7 @@ msgstr ""
msgid "Enable TLS"
msgstr ""
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
msgid "Enable TOTP"
msgstr ""
@ -1040,6 +1053,10 @@ msgstr ""
msgid "Finished"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid "Follow the instructions in the dialog to complete the passkey registration process."
msgstr ""
@ -1073,6 +1090,19 @@ msgstr ""
msgid "Generate"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:32
msgid "Generate recovery codes successfully"
msgstr ""
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr ""
@ -1122,14 +1152,10 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr ""
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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 ""
#: src/views/preference/components/TOTP.vue:87
msgid "If you lose your mobile phone, you can use the recovery code to reset your 2FA."
msgstr ""
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1161,12 +1187,11 @@ msgstr ""
msgid "Initialing core upgrader"
msgstr ""
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr ""
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr ""
@ -1208,7 +1233,7 @@ msgstr ""
msgid "Invalid recovery code"
msgstr ""
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr ""
@ -1232,6 +1257,10 @@ msgstr ""
msgid "Jwt Secret"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:74
msgid "Keep your recovery codes as safe as your password. We recommend saving them with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1364,7 +1393,7 @@ msgstr ""
msgid "Managed Certificate"
msgstr ""
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr ""
@ -1554,7 +1583,7 @@ msgstr ""
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1667,7 +1696,7 @@ msgstr ""
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -1894,16 +1923,15 @@ msgid "Recovered Successfully"
msgstr ""
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr ""
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
msgid "Recovery Codes"
msgstr ""
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid "Recovery codes are used to access your account when you lose access to your 2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
@ -1967,7 +1995,7 @@ msgstr ""
msgid "Reloading nginx"
msgstr ""
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr ""
@ -1979,7 +2007,7 @@ msgstr ""
msgid "Remove Site %{site} from %{node} successfully"
msgstr ""
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr ""
@ -2063,7 +2091,7 @@ msgstr ""
msgid "Reset"
msgstr ""
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr ""
@ -2075,15 +2103,15 @@ msgstr ""
msgid "Restarting"
msgstr ""
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2151,7 +2179,7 @@ msgstr ""
msgid "Saved successfully"
msgstr ""
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
@ -2159,7 +2187,7 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2474,10 +2502,6 @@ msgstr ""
msgid "The Public Security Number should only contain letters, unicode, numbers, hyphens, dashes, colons, and dots."
msgstr ""
#: src/views/preference/components/TOTP.vue:88
msgid "The recovery code is only displayed once, please save it in a safe place."
msgstr ""
#: src/views/dashboard/Environments.vue:148
msgid "The remote Nginx UI version is not compatible with the local Nginx UI version. To avoid potential errors, please upgrade the remote Nginx UI to match the local version."
msgstr ""
@ -2500,6 +2524,10 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:104
msgid "These codes are the last resort for accessing your account in case you lose your password and second factors. If you cannot find these codes, you will lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr ""
@ -2539,11 +2567,11 @@ msgstr ""
msgid "This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr ""
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2553,7 +2581,7 @@ msgstr ""
msgid "Title"
msgstr ""
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid "To enable it, you need to install the Google or Microsoft Authenticator app on your mobile phone."
msgstr ""
@ -2579,11 +2607,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid "TOTP is a two-factor authentication method that uses a time-based one-time password algorithm."
msgstr ""
@ -2710,6 +2738,14 @@ msgstr ""
msgid "View Mode"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:134
msgid "View Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "Viewed"
msgstr ""
#: src/constants/index.ts:17
#: src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
@ -2726,7 +2762,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/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -2742,6 +2778,10 @@ msgstr ""
msgid "When you enable/disable, delete, or save this site, the nodes set in the site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid "When you generate new recovery codes, you must download or print the new codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2755,7 +2795,7 @@ msgstr ""
msgid "Writing certificate to disk"
msgstr ""
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -2774,6 +2814,23 @@ msgstr ""
msgid "You have not configured the settings of Webauthn, so you cannot add a passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid "You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid "Your current recovery code might be outdated and insecure. Please generate new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr ""

View file

@ -19,7 +19,7 @@ msgstr ""
msgid "2FA"
msgstr "2FA"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "Настройки 2FA"
@ -42,7 +42,7 @@ msgstr "Пользователь ACME"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -142,7 +142,7 @@ msgstr "Продублированно"
msgid "Arch"
msgstr "Архитектура"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "Вы уверены, что хотите немедленно удалить этот заблокированный IP?"
@ -151,6 +151,16 @@ msgstr "Вы уверены, что хотите немедленно удали
msgid "Are you sure to delete this passkey immediately?"
msgstr "Вы уверены, что хотите немедленно удалить этот заблокированный IP?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "Вы уверены, что хотите восстановить этот элемент?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "Вы уверены, что хотите удалить?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -208,7 +218,7 @@ msgstr "Ассистент"
msgid "Attempt to fix"
msgstr "Попытки"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "Попытки"
@ -220,7 +230,7 @@ msgstr "Авторизация"
msgid "Authenticate with a passkey"
msgstr "Аутентификация с помощью ключа доступа"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "Настройки аутентификации"
@ -257,15 +267,15 @@ msgstr "Вернуться на главную"
msgid "Back to list"
msgstr "Возврат к списку"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "Порог блокировки в минутах"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "Заблокированные IP-адреса"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "Заблокирован до"
@ -455,7 +465,7 @@ msgstr "Очистить"
msgid "Cleared successfully"
msgstr "Очищено успешно"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -506,6 +516,7 @@ msgstr "Содержание"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "Скопировано"
@ -513,6 +524,11 @@ msgstr "Скопировано"
msgid "Copy"
msgstr "Копировать"
#: src/views/preference/components/RecoveryCodes.vue:121
#, fuzzy
msgid "Copy Codes"
msgstr "Код восстановления"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "Обновление ядра"
@ -563,12 +579,12 @@ msgstr "Учетные данные"
msgid "Credentials"
msgstr "Учетные данные"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
#, fuzzy
msgid "Current account is enabled TOTP."
msgstr "Текущая учетная запись имеет включенную 2ФА."
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
#, fuzzy
msgid "Current account is not enabled TOTP."
msgstr ""
@ -911,7 +927,7 @@ msgstr "Включение %{conf_name} in %{node_name} нипалучилася
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "Включение %{conf_name} in %{node_name} успешно"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "Двухфакторная аутентификация успешно включена"
@ -951,7 +967,7 @@ msgstr "Включено успешно"
msgid "Enable TLS"
msgstr "Включить TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "Включить TLS"
@ -1077,6 +1093,10 @@ msgstr "Фильтр"
msgid "Finished"
msgstr "Готово"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1114,6 +1134,22 @@ msgstr "Общий сертификат"
msgid "Generate"
msgstr "Сгенерировать"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate New Recovery Codes"
msgstr "Код восстановления"
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "Код восстановления"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Восстановлено успешно"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "Генерация приватного ключа для регистрации учетной записи"
@ -1162,7 +1198,7 @@ msgstr "ICP номер"
msgid "If left blank, the default CA Dir will be used."
msgstr "Если оставить пустым, будет использоваться каталог CA по умолчанию."
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1171,14 +1207,6 @@ msgstr ""
"количества попыток в течение пороговых минут блокировки, IP будет "
"заблокирован на определенный период времени."
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
"Если вы потеряете свой мобильный телефон, вы можете использовать код "
"восстановления для сброса 2FA."
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1213,12 +1241,11 @@ msgstr "Ошибка первоначального обновления ядр
msgid "Initialing core upgrader"
msgstr "Инициализация программы обновления ядра"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "Введите код из приложения:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "Введите код восстановления:"
@ -1261,7 +1288,7 @@ msgstr "Неверный пароль или код восстановления
msgid "Invalid recovery code"
msgstr "Неверный 2FA или код восстановления"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1285,6 +1312,12 @@ msgstr "Издатель: %{issuer}"
msgid "Jwt Secret"
msgstr "Jwt секрет"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1428,7 +1461,7 @@ msgstr "Пользователи"
msgid "Managed Certificate"
msgstr "Управление сертификатом"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr "Максимальное количество попыток"
@ -1617,7 +1650,7 @@ msgstr "Nginx успешно перезапущен"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1736,7 +1769,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -1990,17 +2023,19 @@ msgid "Recovered Successfully"
msgstr "Восстановлено успешно"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr "Восстановление"
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "Код восстановления"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
msgstr "Код восстановления:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
msgid "Recursive Nameservers"
@ -2067,7 +2102,7 @@ msgstr "Перезагружается"
msgid "Reloading nginx"
msgstr "Перезагружается nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr "Удалить"
@ -2081,7 +2116,7 @@ msgstr "Удалить сайт: %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "Продублированно %{conf_name} в %{node_name}"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr "Удалено успешно"
@ -2173,7 +2208,7 @@ msgstr "Запрос с неправильными параметрами"
msgid "Reset"
msgstr "Сброс"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr "Сброс 2FA"
@ -2185,15 +2220,15 @@ msgstr "Перезапуск"
msgid "Restarting"
msgstr "Перезапускается"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2266,7 +2301,7 @@ msgstr "Сохранено успешно"
msgid "Saved successfully"
msgstr "Успешно сохранено"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
"Отсканируйте QR-код с помощью мобильного телефона, чтобы добавить учетную "
@ -2276,7 +2311,7 @@ msgstr ""
msgid "SDK"
msgstr "SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2646,13 +2681,6 @@ msgstr ""
"Имя сервера должно содержать только буквы, юникод, цифры, дефисы, тире и "
"точки."
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
"Код восстановления отображается только один раз, пожалуйста, сохраните его в "
"безопасном месте."
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2685,6 +2713,13 @@ msgstr "URL недействителен."
msgid "The username or password is incorrect"
msgstr "Имя пользователя или пароль неверны"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "Этот элемент автосертификата недействителен, удалите его.."
@ -2733,11 +2768,11 @@ msgstr ""
"Это обновит или переустановит интерфейс Nginx на %{nodeNames} до версии "
"%{version}."
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2747,7 +2782,7 @@ msgstr "Советы"
msgid "Title"
msgstr "Заголовок"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2791,11 +2826,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2923,6 +2958,16 @@ msgstr "Подробно"
msgid "View Mode"
msgstr "Простой режим"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "Код восстановления"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Просмотр"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2946,7 +2991,7 @@ msgstr ""
"Мы удалим конфигурацию HTTPChallenge из этого файла и перезагрузим Nginx. Вы "
"уверены, что хотите продолжить?"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -2967,6 +3012,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2980,7 +3031,7 @@ msgstr "Запись закрытого ключа сертификата на
msgid "Writing certificate to disk"
msgstr "Запись сертификата на диск"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3001,11 +3052,47 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
#, fuzzy
msgid "Your passkeys"
msgstr "Добавить ключ доступа"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr ""
#~ "Если вы потеряете свой мобильный телефон, вы можете использовать код "
#~ "восстановления для сброса 2FA."
#~ msgid "Recovery Code:"
#~ msgstr "Код восстановления:"
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr ""
#~ "Код восстановления отображается только один раз, пожалуйста, сохраните "
#~ "его в безопасном месте."
#~ msgid "Directory"
#~ msgstr "Каталог"

View file

@ -16,7 +16,7 @@ msgstr ""
msgid "2FA"
msgstr "İki aşamalı kimlik doğrulaması(2FA)"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "2FA Ayarları"
@ -39,7 +39,7 @@ msgstr "ACME Kullanıcısı"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -140,7 +140,7 @@ msgstr "Başarıyla kopyalandı"
msgid "Arch"
msgstr "Mimari"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "Bu yasaklı IP'yi hemen sileceğinizden emin misiniz?"
@ -148,6 +148,16 @@ msgstr "Bu yasaklı IP'yi hemen sileceğinizden emin misiniz?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "Bu geçiş anahtarını hemen silmek istediğinizden emin misiniz?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "Bu öğeyi kurtarmak istediğinizden emin misiniz?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "Silmek istediğine emin misin?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -204,7 +214,7 @@ msgstr "Asistan"
msgid "Attempt to fix"
msgstr "Girişimler"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "Girişimler"
@ -216,7 +226,7 @@ msgstr "Kimlik Doğrulama"
msgid "Authenticate with a passkey"
msgstr "Geçiş anahtarıyla kimlik doğrulama"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "Kimlik Doğrulama Ayarları"
@ -253,15 +263,15 @@ msgstr "Ana Sayfaya Dön"
msgid "Back to list"
msgstr "Listeye geri dön"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "Yasaklama Eşiği Süresi (Dakika)"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "Yasaklı IP'ler"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "Şu Zamana Kadar Yasaklı"
@ -449,7 +459,7 @@ msgstr "Temizle"
msgid "Cleared successfully"
msgstr "Başarıyla temizlendi"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -500,6 +510,7 @@ msgstr "İçerik"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "Kopyalandı"
@ -507,6 +518,11 @@ msgstr "Kopyalandı"
msgid "Copy"
msgstr "Kopya"
#: src/views/preference/components/RecoveryCodes.vue:121
#, fuzzy
msgid "Copy Codes"
msgstr "Kurtarma Kodu"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "Çekirdek Yükseltme"
@ -557,11 +573,11 @@ msgstr "Kimlik bilgisi"
msgid "Credentials"
msgstr "Kimlik bilgileri"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr "Mevcut hesap için TOTP etkinleştirildi."
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr "Mevcut hesap için TOTP etkin değil."
@ -909,7 +925,7 @@ msgstr ""
"%{conf_name} yapılandırmasını %{node_name} düğümünde etkinleştirme başarılı "
"oldu"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "2FA'yı başarıyla etkinleştirildi"
@ -953,7 +969,7 @@ msgstr "Başarıyla etkinleştirildi"
msgid "Enable TLS"
msgstr "TLS'yi Etkinleştir"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
msgid "Enable TOTP"
msgstr "TOTP'yi Etkinleştir"
@ -1078,6 +1094,10 @@ msgstr "Filtre"
msgid "Finished"
msgstr "Bitmiş"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1115,6 +1135,22 @@ msgstr "Genel Sertifika"
msgid "Generate"
msgstr "Oluştur"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate New Recovery Codes"
msgstr "Kurtarma Kodu"
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "Kurtarma Kodu"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Başarıyla Kurtarıldı"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "Hesap kaydı için özel anahtar oluşturuluyor"
@ -1163,7 +1199,7 @@ msgstr ""
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/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1172,14 +1208,6 @@ msgstr ""
"yasaklama eşiği dakikaları içinde maksimum deneme sayısına ulaşırsa, IP "
"adresi belirli bir süre için yasaklanacaktır."
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
"Cep telefonunuzu kaybederseniz, 2FA'nızı sıfırlamak için kurtarma kodunu "
"kullanabilirsiniz."
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1215,12 +1243,11 @@ msgstr "İlk çekirdek yükseltici hatası"
msgid "Initialing core upgrader"
msgstr "Çekirdek yükseltici başlatılıyor"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "Uygulamadan kodu girin:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "Kurtarma kodunu girin:"
@ -1263,7 +1290,7 @@ msgstr "Geçersiz parola veya kurtarma kodu"
msgid "Invalid recovery code"
msgstr "Geçersiz 2FA veya kurtarma kodu"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1287,6 +1314,12 @@ msgstr "Düzenleyen: %{issuer}"
msgid "Jwt Secret"
msgstr "Jwt Secret"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1435,7 +1468,7 @@ msgstr "Kullanıcıları Yönet"
msgid "Managed Certificate"
msgstr "Yönetilen Sertifika"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
#, fuzzy
msgid "Max Attempts"
msgstr "Maksimum Deneme"
@ -1654,7 +1687,7 @@ msgstr "Nginx başarıyla yeniden başlatıldı"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1791,7 +1824,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr "Veya"
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -2086,20 +2119,20 @@ msgid "Recovered Successfully"
msgstr "Başarıyla Kurtarıldı"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
#, fuzzy
msgid "Recovery"
msgstr "Kurtarma"
#: src/views/preference/components/TOTP.vue:80
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Code"
msgid "Recovery Codes"
msgstr "Kurtarma Kodu"
#: src/views/preference/components/TOTP.vue:89
#, fuzzy
msgid "Recovery Code:"
msgstr "Kurtarma Kodu:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
#, fuzzy
@ -2181,7 +2214,7 @@ msgstr "Yeniden Yükleme"
msgid "Reloading nginx"
msgstr "Nginx'i yeniden yükleme"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
#, fuzzy
msgid "Remove"
msgstr "Kaldır"
@ -2196,7 +2229,7 @@ msgstr "Siteyi sil: %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "%{conf_name} başarıyla %{node_name} düğümüne kopyalandı"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
#, fuzzy
msgid "Remove successfully"
@ -2305,7 +2338,7 @@ msgstr "Yanlış parametrelerle talep edildi"
msgid "Reset"
msgstr "Sıfırla"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
#, fuzzy
msgid "Reset 2FA"
msgstr "2FA'yı Sıfırla"
@ -2320,15 +2353,15 @@ msgstr "Yeniden başlat"
msgid "Restarting"
msgstr "Yeniden Başlatma"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2408,7 +2441,7 @@ msgstr "Başarıyla kaydedin"
msgid "Saved successfully"
msgstr "Başarıyla Kaydedildi"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
#, fuzzy
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr "Hesabı uygulamaya eklemek için QR kodunu cep telefonunuzla tarayın."
@ -2418,7 +2451,7 @@ msgstr "Hesabı uygulamaya eklemek için QR kodunu cep telefonunuzla tarayın."
msgid "SDK"
msgstr "SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
#, fuzzy
msgid "Secret has been copied"
msgstr "Sır kopyalandı"
@ -2834,14 +2867,6 @@ msgstr ""
"Sunucu adı yalnızca harf, unicode, sayı, kısa çizgi, tire ve nokta "
"içermelidir."
#: src/views/preference/components/TOTP.vue:88
#, fuzzy
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
"Kurtarma kodu yalnızca bir kez görüntülenir, lütfen güvenli bir yere "
"kaydedin."
#: src/views/dashboard/Environments.vue:148
#, fuzzy
msgid ""
@ -2879,6 +2904,13 @@ msgstr "URL geçersiz."
msgid "The username or password is incorrect"
msgstr "Kullanıcı adı veya şifre yanlış"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
#, fuzzy
msgid "This Auto Cert item is invalid, please remove it."
@ -2931,11 +2963,11 @@ msgstr ""
"Bu, %{nodeNames} üzerindeki Nginx kullanıcı arayüzünü %{version}'e "
"yükseltecek veya yeniden yükleyecektir."
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
#, fuzzy
@ -2947,7 +2979,7 @@ msgstr "İpuçları"
msgid "Title"
msgstr "Başlık"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
#, fuzzy
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
@ -3002,12 +3034,12 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
#, fuzzy
msgid "TOTP"
msgstr "TOTP"
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
#, fuzzy
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
@ -3158,6 +3190,16 @@ msgstr "Detayları göster"
msgid "View Mode"
msgstr "Görünüm Modu"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "Kurtarma Kodu"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Görünüm"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -3184,7 +3226,7 @@ msgstr ""
"HTTPChallenge yapılandırmasını bu dosyadan kaldıracağız ve Nginx'i yeniden "
"yükleyeceğiz. Devam etmek istediğinizden emin misiniz?"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -3209,6 +3251,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
#, fuzzy
@ -3225,7 +3273,7 @@ msgstr "Sertifika özel anahtarını diske yazma"
msgid "Writing certificate to disk"
msgstr "Sertifikayı diske yazma"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3252,11 +3300,49 @@ msgstr ""
"Webauthn ayarlarını yapılandırmadınız, bu nedenle bir geçiş anahtarı "
"ekleyemezsiniz."
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
#, fuzzy
msgid "Your passkeys"
msgstr "Geçiş anahtarlarınız"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr ""
#~ "Cep telefonunuzu kaybederseniz, 2FA'nızı sıfırlamak için kurtarma kodunu "
#~ "kullanabilirsiniz."
#, fuzzy
#~ msgid "Recovery Code:"
#~ msgstr "Kurtarma Kodu:"
#, fuzzy
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr ""
#~ "Kurtarma kodu yalnızca bir kez görüntülenir, lütfen güvenli bir yere "
#~ "kaydedin."
#~ msgid "Can't scan? Use text key binding"
#~ msgstr "Tarayamıyor musunuz? Metin anahtar bağlamasını kullanın"

View file

@ -13,7 +13,7 @@ msgstr ""
msgid "2FA"
msgstr ""
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr ""
@ -37,7 +37,7 @@ msgstr "Người dùng"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -143,7 +143,7 @@ msgstr "Nhân bản thành công"
msgid "Arch"
msgstr ""
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
#, fuzzy
msgid "Are you sure to delete this banned IP immediately?"
msgstr "Bạn chắc chắn muốn xóa nó "
@ -153,6 +153,16 @@ msgstr "Bạn chắc chắn muốn xóa nó "
msgid "Are you sure to delete this passkey immediately?"
msgstr "Bạn chắc chắn muốn xóa nó "
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "Bạn chắc chắn muốn xoá directive này ?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "Bạn chắc chắn muốn xóa nó "
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -216,7 +226,7 @@ msgstr "Trợ lý"
msgid "Attempt to fix"
msgstr ""
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr ""
@ -229,7 +239,7 @@ msgstr "Tác giả"
msgid "Authenticate with a passkey"
msgstr ""
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr ""
@ -267,15 +277,15 @@ msgstr "Quay lại"
msgid "Back to list"
msgstr ""
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr ""
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr ""
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr ""
@ -474,7 +484,7 @@ msgstr "Xoá"
msgid "Cleared successfully"
msgstr "Đã xóa thành công"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -527,6 +537,7 @@ msgstr "Nội dung"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr ""
@ -534,6 +545,10 @@ msgstr ""
msgid "Copy"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr ""
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "Cập nhật core"
@ -588,11 +603,11 @@ msgstr "Chứng chỉ"
msgid "Credentials"
msgstr "Chứng chỉ"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr ""
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr ""
@ -946,7 +961,7 @@ msgstr "Không thể bật %{conf_name} trên %{node_name}"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "Đã bật %{conf_name} trên %{node_name}"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
#, fuzzy
msgid "Enable 2FA successfully"
msgstr "Đã bật"
@ -988,7 +1003,7 @@ msgstr "Đã bật"
msgid "Enable TLS"
msgstr "Bật TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "Bật TLS"
@ -1118,6 +1133,10 @@ msgstr "Lọc"
msgid "Finished"
msgstr "Đã hoàn thành"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1157,6 +1176,21 @@ msgstr "Chứng chỉ chung"
msgid "Generate"
msgstr "Tạo"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "Hợp lệ"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "Xoá thành công"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "Tạo khóa riêng để đăng ký tài khoản"
@ -1207,18 +1241,12 @@ msgstr ""
msgid "If left blank, the default CA Dir will be used."
msgstr ""
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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 ""
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr ""
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1252,12 +1280,11 @@ msgstr "Không thể khởi tạo trình nâng cấp"
msgid "Initialing core upgrader"
msgstr "Đang khởi tạo trình nâng cấp"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr ""
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr ""
@ -1304,7 +1331,7 @@ msgstr ""
msgid "Invalid recovery code"
msgstr "Hợp lệ"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr ""
@ -1331,6 +1358,12 @@ msgstr ""
msgid "Jwt Secret"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
#, fuzzy
@ -1479,7 +1512,7 @@ msgstr "Người dùng"
msgid "Managed Certificate"
msgstr "Thay đổi chứng chỉ"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr ""
@ -1679,7 +1712,7 @@ msgstr "Restart Nginx thành công"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1799,7 +1832,7 @@ msgstr ""
msgid "Or"
msgstr ""
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -2047,16 +2080,18 @@ msgid "Recovered Successfully"
msgstr "Xoá thành công"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr ""
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "Hợp lệ"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
@ -2129,7 +2164,7 @@ msgstr "Đang tải lại"
msgid "Reloading nginx"
msgstr "Tải lại nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr ""
@ -2143,7 +2178,7 @@ msgstr "Xoá trang web: %{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
#, fuzzy
msgid "Remove successfully"
@ -2245,7 +2280,7 @@ msgstr "Yêu cầu có chứa tham số sai"
msgid "Reset"
msgstr "Đặt lại"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
#, fuzzy
msgid "Reset 2FA"
msgstr "Đặt lại"
@ -2258,15 +2293,15 @@ msgstr "Khởi động lại"
msgid "Restarting"
msgstr "Đang khởi động lại"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2339,7 +2374,7 @@ msgstr "Lưu thành công"
msgid "Saved successfully"
msgstr "Lưu thành công"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr ""
@ -2347,7 +2382,7 @@ msgstr ""
msgid "SDK"
msgstr ""
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2713,11 +2748,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr ""
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr ""
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2747,6 +2777,13 @@ msgstr ""
msgid "The username or password is incorrect"
msgstr "Tên người dùng hoặc mật khẩu không chính xác"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "Mục Chứng chỉ tự động này không hợp lệ, vui lòng xóa nó"
@ -2791,11 +2828,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "Nhân bản %{conf_name} thành %{node_name} thành công"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2805,7 +2842,7 @@ msgstr ""
msgid "Title"
msgstr "Tiêu đề"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2847,11 +2884,11 @@ msgid_plural "Total %{total} items"
msgstr[0] ""
msgstr[1] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2984,6 +3021,16 @@ msgstr "Chi tiết"
msgid "View Mode"
msgstr "Cơ bản"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "Hợp lệ"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "Xem"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -3007,7 +3054,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/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -3028,6 +3075,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -3041,7 +3094,7 @@ msgstr "Ghi Private Key vào disk"
msgid "Writing certificate to disk"
msgstr "Ghi chứng chỉ vào disk"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -3062,6 +3115,26 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr ""

View file

@ -17,7 +17,7 @@ msgstr ""
msgid "2FA"
msgstr "2FA"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "2FA 设置"
@ -40,7 +40,7 @@ msgstr "ACME 用户"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -138,7 +138,7 @@ msgstr "批量操作应用成功"
msgid "Arch"
msgstr "架构"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "您确定要立即删除这个被禁用的 IP 吗?"
@ -146,6 +146,14 @@ msgstr "您确定要立即删除这个被禁用的 IP 吗?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "您确定要立即删除这个 Passkey 吗?"
#: src/views/preference/components/RecoveryCodes.vue:154
msgid "Are you sure to generate new recovery codes?"
msgstr "您确定要生成新的恢复代码吗?"
#: src/views/preference/components/TOTP.vue:85
msgid "Are you sure to reset 2FA?"
msgstr "您确定要重设双重身份验证?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
msgid "Are you sure you want to apply to all selected?"
msgstr "您确定要应用于所有选定的对象吗?"
@ -200,7 +208,7 @@ msgstr "助手"
msgid "Attempt to fix"
msgstr "尝试修复"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "尝试次数"
@ -212,7 +220,7 @@ msgstr "认证"
msgid "Authenticate with a passkey"
msgstr "通过 Passkey 认证"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "认证设置"
@ -249,15 +257,15 @@ msgstr "返回首页"
msgid "Back to list"
msgstr "返回列表"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "禁止阈值(分钟)"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "禁止 IP 列表"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "禁用至"
@ -439,7 +447,7 @@ msgstr "清空"
msgid "Cleared successfully"
msgstr "清除成功"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr "点击复制"
@ -490,6 +498,7 @@ msgstr "内容"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "已拷贝"
@ -497,6 +506,10 @@ msgstr "已拷贝"
msgid "Copy"
msgstr "拷贝"
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copy Codes"
msgstr "复制代码"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "核心升级"
@ -547,11 +560,11 @@ msgstr "DNS 凭证"
msgid "Credentials"
msgstr "凭证"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
msgid "Current account is enabled TOTP."
msgstr "当前账户已启用 TOTP 验证。"
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
msgid "Current account is not enabled TOTP."
msgstr "当前用户未启用 TOTP 验证。"
@ -876,7 +889,7 @@ msgstr "在%{node_name}中启用%{conf_name}失败"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "成功启用%{node_name}中的%{conf_name}"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "二步验证启用成功"
@ -912,7 +925,7 @@ msgstr "启用成功"
msgid "Enable TLS"
msgstr "启用 TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
msgid "Enable TOTP"
msgstr "启用 TOTP"
@ -1035,6 +1048,10 @@ msgstr "过滤"
msgid "Finished"
msgstr "完成"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr "首次查看"
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1070,6 +1087,19 @@ msgstr "普通证书"
msgid "Generate"
msgstr "生成"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate New Recovery Codes"
msgstr "生成新的恢复代码"
#: src/views/preference/components/RecoveryCodes.vue:161
msgid "Generate Recovery Codes"
msgstr "生成恢复代码"
#: src/views/preference/components/RecoveryCodes.vue:32
msgid "Generate recovery codes successfully"
msgstr "成功生成恢复代码"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "正在生成私钥用于注册账户"
@ -1118,7 +1148,7 @@ msgstr "ICP备案号"
msgid "If left blank, the default CA Dir will be used."
msgstr "如果留空,则使用默认 CA Dir。"
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1126,12 +1156,6 @@ msgstr ""
"如果某个 IP 的登录失败次数达到禁用阈值分钟内的最大尝试次数,该 IP 将被禁止登"
"录一段时间。"
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr "如果丢失了手机,可以使用恢复代码重置二步验证。"
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr "如果您的浏览器支持 WebAuthn Passkey则会出现一个对话框。"
@ -1163,12 +1187,11 @@ msgstr "初始化核心升级程序错误"
msgid "Initialing core upgrader"
msgstr "初始化核心升级器"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "输入应用程序中的代码:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "输入恢复代码:"
@ -1209,7 +1232,7 @@ msgstr "二次验证码或恢复代码无效"
msgid "Invalid recovery code"
msgstr "无效的恢复代码"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1233,6 +1256,13 @@ msgstr "颁发者:%{issuer}"
msgid "Jwt Secret"
msgstr "Jwt 密钥"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
"请像保护密码一样安全地保管您的恢复代码。我们建议使用密码管理器保存它们。"
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1372,7 +1402,7 @@ msgstr "用户管理"
msgid "Managed Certificate"
msgstr "托管证书"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr "最大尝试次数"
@ -1558,7 +1588,7 @@ msgstr "Nginx 重启成功"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1673,7 +1703,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr "或"
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr "或输入密钥:%{secret}"
@ -1912,17 +1942,20 @@ msgid "Recovered Successfully"
msgstr "恢复成功"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr "恢复"
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
msgid "Recovery Codes"
msgstr "恢复代码"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
msgstr "恢复代码:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
"恢复代码用于在您无法访问双重身份验证设备时登录您的账户。每个代码只能使用一"
"次。"
#: src/views/preference/CertSettings.vue:37
msgid "Recursive Nameservers"
@ -1987,7 +2020,7 @@ msgstr "重载中"
msgid "Reloading nginx"
msgstr "正在重载 Nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr "删除"
@ -1999,7 +2032,7 @@ msgstr "从 %{node} 中删除站点 %{site} 错误,响应:%{resp}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "成功从 %{node} 中删除站点 %{site}"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr "移除成功"
@ -2085,7 +2118,7 @@ msgstr "请求参数错误"
msgid "Reset"
msgstr "重置"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr "重置二步验证"
@ -2097,15 +2130,15 @@ msgstr "重启"
msgid "Restarting"
msgstr "重启中"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr "依赖方显示名称"
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr "依赖方的源"
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr "依赖方 ID"
@ -2172,7 +2205,7 @@ msgstr "保存成功"
msgid "Saved successfully"
msgstr "保存成功"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr "用手机扫描二维码,将账户添加到应用程序中。"
@ -2180,7 +2213,7 @@ msgstr "用手机扫描二维码,将账户添加到应用程序中。"
msgid "SDK"
msgstr "SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr "密钥已复制"
@ -2523,11 +2556,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr "公安备案号只能包含字母、单码、数字、连字符、破折号、冒号和点。"
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr "恢复密码只会显示一次,请妥善保存。"
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2557,6 +2585,15 @@ msgstr "URL 无效."
msgid "The username or password is incorrect"
msgstr "用户名或密码错误"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
"这些代码是在您丢失密码和双重身份验证方式时,访问账户的最后手段。如果找不到这"
"些代码,您将无法再访问您的账户。"
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "这个证书自动续期项目是无效的,请删除。"
@ -2598,11 +2635,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "将 %{nodeNames} 上的 Nginx UI 升级或重新安装到 %{version} 版本。"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr "限流"
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2612,7 +2649,7 @@ msgstr "提示"
msgid "Title"
msgstr "标题"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2656,11 +2693,11 @@ msgid "Total %{total} item"
msgid_plural "Total %{total} items"
msgstr[0] "共 %{total} 个项目"
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr "TOTP"
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2783,6 +2820,14 @@ msgstr "查看详情"
msgid "View Mode"
msgstr "预览模式"
#: src/views/preference/components/RecoveryCodes.vue:134
msgid "View Recovery Codes"
msgstr "查看恢复代码"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "Viewed"
msgstr "已查看"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2803,7 +2848,7 @@ msgid ""
msgstr ""
"我们将从这个文件中删除HTTPChallenge的配置并重新加载Nginx。你确定要继续吗"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr "Webauthn"
@ -2828,6 +2873,12 @@ msgstr ""
"启用/禁用、删除或保存此站点时,网站分类中设置的节点和下面选择的节点将同步执行"
"操作。"
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr "当您生成新的恢复代码时,必须下载或打印新的代码。"
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2841,7 +2892,7 @@ msgstr "正在将证书私钥写入磁盘"
msgid "Writing certificate to disk"
msgstr "正在将证书写入磁盘"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -2862,10 +2913,42 @@ msgid ""
"passkey."
msgstr "您尚未配置 Webauthn 的设置,因此无法添加 Passkey。"
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr "您尚未启用双重身份验证。请启用双重身份验证以生成恢复代码。"
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr "您尚未生成恢复代码。"
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr "您的当前恢复代码可能已过期且不安全。请尽快生成新的恢复代码以确保安全。"
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr "您的旧代码将不再有效。"
#: src/views/preference/components/Passkey.vue:75
msgid "Your passkeys"
msgstr "你的 Passkeys"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr "如果丢失了手机,可以使用恢复代码重置二步验证。"
#~ msgid "Recovery Code:"
#~ msgstr "恢复代码:"
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr "恢复密码只会显示一次,请妥善保存。"
#~ msgid "Can't scan? Use text key binding"
#~ msgstr "无法扫描?使用文本密钥绑定"
@ -3047,9 +3130,6 @@ msgstr "你的 Passkeys"
#~ msgid "404 Not Found"
#~ msgstr "404 未找到页面"
#~ msgid "Are you sure you want to restore?"
#~ msgstr "您确定要反删除?"
#~ msgid "Destroy"
#~ msgstr "删除"

View file

@ -22,7 +22,7 @@ msgstr ""
msgid "2FA"
msgstr "多重要素驗證"
#: src/views/preference/AuthSettings.vue:55
#: src/views/preference/AuthSettings.vue:70
msgid "2FA Settings"
msgstr "多重要素驗證設定"
@ -45,7 +45,7 @@ msgstr "ACME 用戶"
#: src/views/config/configColumns.tsx:42
#: src/views/environment/envColumns.tsx:97
#: src/views/notification/notificationColumns.tsx:65
#: src/views/preference/AuthSettings.vue:26
#: src/views/preference/AuthSettings.vue:30
#: src/views/site/site_category/columns.ts:29
#: src/views/site/site_list/columns.tsx:76 src/views/stream/StreamList.vue:49
#: src/views/user/userColumns.tsx:60
@ -145,7 +145,7 @@ msgstr "複製成功"
msgid "Arch"
msgstr "架構"
#: src/views/preference/AuthSettings.vue:134
#: src/views/preference/AuthSettings.vue:162
msgid "Are you sure to delete this banned IP immediately?"
msgstr "您確定要刪除這個被禁用的 IP 嗎?"
@ -153,6 +153,16 @@ msgstr "您確定要刪除這個被禁用的 IP 嗎?"
msgid "Are you sure to delete this passkey immediately?"
msgstr "您確定要刪除這個被禁用的通行密鑰嗎?"
#: src/views/preference/components/RecoveryCodes.vue:154
#, fuzzy
msgid "Are you sure to generate new recovery codes?"
msgstr "您確定要恢復此項目嗎?"
#: src/views/preference/components/TOTP.vue:85
#, fuzzy
msgid "Are you sure to reset 2FA?"
msgstr "您確定要恢復?"
#: src/components/StdDesign/StdDataDisplay/StdBulkActions.vue:96
#, fuzzy
msgid "Are you sure you want to apply to all selected?"
@ -209,7 +219,7 @@ msgstr "助理"
msgid "Attempt to fix"
msgstr "嘗試次數"
#: src/views/preference/AuthSettings.vue:17
#: src/views/preference/AuthSettings.vue:21
msgid "Attempts"
msgstr "嘗試次數"
@ -221,7 +231,7 @@ msgstr "身份驗證"
msgid "Authenticate with a passkey"
msgstr "使用通行密鑰認證"
#: src/views/preference/AuthSettings.vue:60
#: src/views/preference/AuthSettings.vue:88
msgid "Authentication Settings"
msgstr "認證設定"
@ -258,15 +268,15 @@ msgstr "返回首頁"
msgid "Back to list"
msgstr "返回列表"
#: src/views/preference/AuthSettings.vue:101
#: src/views/preference/AuthSettings.vue:129
msgid "Ban Threshold Minutes"
msgstr "封禁閾值分鐘數"
#: src/views/preference/AuthSettings.vue:122
#: src/views/preference/AuthSettings.vue:150
msgid "Banned IPs"
msgstr "被禁止的 IP"
#: src/views/preference/AuthSettings.vue:20
#: src/views/preference/AuthSettings.vue:24
msgid "Banned Until"
msgstr "禁止至"
@ -452,7 +462,7 @@ msgstr "清除"
msgid "Cleared successfully"
msgstr "清除成功"
#: src/views/preference/components/TOTP.vue:125
#: src/views/preference/components/TOTP.vue:110
msgid "Click to copy"
msgstr ""
@ -503,6 +513,7 @@ msgstr "內容"
#: src/components/SensitiveString/SensitiveString.vue:37
#: src/components/StdDesign/StdDataDisplay/StdTableTransformer.tsx:150
#: src/views/preference/components/RecoveryCodes.vue:121
msgid "Copied"
msgstr "已複製"
@ -510,6 +521,11 @@ msgstr "已複製"
msgid "Copy"
msgstr "複製"
#: src/views/preference/components/RecoveryCodes.vue:121
#, fuzzy
msgid "Copy Codes"
msgstr "恢復碼"
#: src/views/system/Upgrade.vue:146
msgid "Core Upgrade"
msgstr "核心升級"
@ -560,12 +576,12 @@ msgstr "認證"
msgid "Credentials"
msgstr "認證資訊"
#: src/views/preference/components/TOTP.vue:75
#: src/views/preference/components/TOTP.vue:72
#, fuzzy
msgid "Current account is enabled TOTP."
msgstr "當前帳戶已啟用多因素身份驗證。"
#: src/views/preference/components/TOTP.vue:73
#: src/views/preference/components/TOTP.vue:70
#, fuzzy
msgid "Current account is not enabled TOTP."
msgstr "當前帳戶未啟用多因素身份驗證。"
@ -900,7 +916,7 @@ msgstr "在 %{node_name} 啟用 %{conf_name} 失敗"
msgid "Enable %{conf_name} in %{node_name} successfully"
msgstr "成功在 %{node_name} 啟用 %{conf_name}"
#: src/views/preference/components/TOTP.vue:38
#: src/views/preference/components/TOTP.vue:45
msgid "Enable 2FA successfully"
msgstr "啟用多因素身份驗證成功"
@ -940,7 +956,7 @@ msgstr "啟用成功"
msgid "Enable TLS"
msgstr "啟用 TLS"
#: src/views/preference/components/TOTP.vue:101
#: src/views/preference/components/TOTP.vue:81
#, fuzzy
msgid "Enable TOTP"
msgstr "啟用 TLS"
@ -1066,6 +1082,10 @@ msgstr "篩選"
msgid "Finished"
msgstr "完成"
#: src/views/preference/components/RecoveryCodes.vue:70
msgid "First View"
msgstr ""
#: src/views/preference/components/AddPasskey.vue:71
msgid ""
"Follow the instructions in the dialog to complete the passkey registration "
@ -1101,6 +1121,22 @@ msgstr "普通憑證"
msgid "Generate"
msgstr "產生"
#: src/views/preference/components/RecoveryCodes.vue:138
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate New Recovery Codes"
msgstr "恢復碼"
#: src/views/preference/components/RecoveryCodes.vue:161
#, fuzzy
msgid "Generate Recovery Codes"
msgstr "恢復碼"
#: src/views/preference/components/RecoveryCodes.vue:32
#, fuzzy
msgid "Generate recovery codes successfully"
msgstr "恢復成功"
#: src/language/constants.ts:7
msgid "Generating private key for registering account"
msgstr "產生註冊帳號的私鑰"
@ -1149,7 +1185,7 @@ msgstr "ICP 編號"
msgid "If left blank, the default CA Dir will be used."
msgstr "如果留空,將使用默認的 CA Dir。"
#: src/views/preference/AuthSettings.vue:117
#: src/views/preference/AuthSettings.vue:145
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."
@ -1157,12 +1193,6 @@ msgstr ""
"如果來自某個 IP 的登錄失敗次數在禁止閾值分鐘內達到最大嘗試次數,該 IP 將被禁"
"止一段時間。"
#: src/views/preference/components/TOTP.vue:87
msgid ""
"If you lose your mobile phone, you can use the recovery code to reset your "
"2FA."
msgstr "如果您丟失了手機,可以使用恢復碼重置您的多重因素驗證驗證。"
#: src/views/preference/components/AddPasskey.vue:70
msgid "If your browser supports WebAuthn Passkey, a dialog box will appear."
msgstr ""
@ -1194,12 +1224,11 @@ msgstr "初始化核心升級程式錯誤"
msgid "Initialing core upgrader"
msgstr "正在初始化核心升級程式"
#: src/views/preference/components/TOTP.vue:134
#: src/views/preference/components/TOTP.vue:119
msgid "Input the code from the app:"
msgstr "請輸入應用程式中的代碼:"
#: src/components/TwoFA/Authorization.vue:82
#: src/views/preference/components/TOTP.vue:148
msgid "Input the recovery code:"
msgstr "輸入恢復碼:"
@ -1242,7 +1271,7 @@ msgstr "無效的密碼或恢復碼"
msgid "Invalid recovery code"
msgstr "無效的多重因素驗證或恢復碼"
#: src/views/preference/AuthSettings.vue:14
#: src/views/preference/AuthSettings.vue:18
msgid "IP"
msgstr "IP"
@ -1266,6 +1295,12 @@ msgstr "發行者:%{issuer}"
msgid "Jwt Secret"
msgstr "Jwt Secret"
#: src/views/preference/components/RecoveryCodes.vue:74
msgid ""
"Keep your recovery codes as safe as your password. We recommend saving them "
"with a password manager."
msgstr ""
#: src/views/certificate/CertificateList/certColumns.tsx:62
#: src/views/site/cert/components/AutoCertStepOne.vue:77
msgid "Key Type"
@ -1407,7 +1442,7 @@ msgstr "管理使用者"
msgid "Managed Certificate"
msgstr "受管理的憑證"
#: src/views/preference/AuthSettings.vue:107
#: src/views/preference/AuthSettings.vue:135
msgid "Max Attempts"
msgstr "最大嘗試次數"
@ -1598,7 +1633,7 @@ msgstr "Nginx 重啟成功"
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:524
#: src/components/StdDesign/StdDataDisplay/StdTable.vue:538
#: src/views/notification/Notification.vue:37
#: src/views/preference/AuthSettings.vue:136
#: src/views/preference/AuthSettings.vue:164
#: src/views/preference/CertSettings.vue:70
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:97
#: src/views/site/ngx_conf/LocationEditor.vue:88
@ -1714,7 +1749,7 @@ msgstr "OpenAI"
msgid "Or"
msgstr "或"
#: src/views/preference/components/TOTP.vue:127
#: src/views/preference/components/TOTP.vue:112
msgid "Or enter the secret: %{secret}"
msgstr ""
@ -1961,17 +1996,19 @@ msgid "Recovered Successfully"
msgstr "恢復成功"
#: src/components/TwoFA/Authorization.vue:89
#: src/views/preference/components/TOTP.vue:155
msgid "Recovery"
msgstr "恢復"
#: src/views/preference/components/TOTP.vue:80
msgid "Recovery Code"
#: src/views/preference/components/RecoveryCodes.vue:68
#, fuzzy
msgid "Recovery Codes"
msgstr "恢復碼"
#: src/views/preference/components/TOTP.vue:89
msgid "Recovery Code:"
msgstr "恢復碼:"
#: src/views/preference/components/RecoveryCodes.vue:73
msgid ""
"Recovery codes are used to access your account when you lose access to your "
"2FA device. Each code can only be used once."
msgstr ""
#: src/views/preference/CertSettings.vue:37
msgid "Recursive Nameservers"
@ -2038,7 +2075,7 @@ msgstr "重新載入中"
msgid "Reloading nginx"
msgstr "正在重新載入 Nginx"
#: src/views/preference/AuthSettings.vue:141
#: src/views/preference/AuthSettings.vue:169
msgid "Remove"
msgstr "移除"
@ -2052,7 +2089,7 @@ msgstr "刪除網站:%{site_name}"
msgid "Remove Site %{site} from %{node} successfully"
msgstr "成功複製 %{conf_name} 到 %{node_name}"
#: src/views/preference/AuthSettings.vue:47
#: src/views/preference/AuthSettings.vue:51
#: src/views/preference/components/Passkey.vue:46
msgid "Remove successfully"
msgstr "移除成功"
@ -2143,7 +2180,7 @@ msgstr "請求參數錯誤"
msgid "Reset"
msgstr "重設"
#: src/views/preference/components/TOTP.vue:109
#: src/views/preference/components/TOTP.vue:93
msgid "Reset 2FA"
msgstr "重置多重因素驗證"
@ -2155,15 +2192,15 @@ msgstr "重新啟動"
msgid "Restarting"
msgstr "正在重新啟動"
#: src/views/preference/AuthSettings.vue:79
#: src/views/preference/AuthSettings.vue:107
msgid "RP Display Name"
msgstr ""
#: src/views/preference/AuthSettings.vue:85
#: src/views/preference/AuthSettings.vue:113
msgid "RP Origins"
msgstr ""
#: src/views/preference/AuthSettings.vue:73
#: src/views/preference/AuthSettings.vue:101
msgid "RPID"
msgstr ""
@ -2234,7 +2271,7 @@ msgstr "儲存成功"
msgid "Saved successfully"
msgstr "儲存成功"
#: src/views/preference/components/TOTP.vue:72
#: src/views/preference/components/TOTP.vue:69
msgid "Scan the QR code with your mobile phone to add the account to the app."
msgstr "用手機掃描二維碼將賬戶添加到應用程序中。"
@ -2242,7 +2279,7 @@ msgstr "用手機掃描二維碼將賬戶添加到應用程序中。"
msgid "SDK"
msgstr "SDK"
#: src/views/preference/components/TOTP.vue:124
#: src/views/preference/components/TOTP.vue:109
msgid "Secret has been copied"
msgstr ""
@ -2596,11 +2633,6 @@ msgid ""
"hyphens, dashes, colons, and dots."
msgstr "伺服器名稱應僅包含字母、Unicode、數字、連字符、破折號和點。"
#: src/views/preference/components/TOTP.vue:88
msgid ""
"The recovery code is only displayed once, please save it in a safe place."
msgstr "恢復碼僅顯示一次,請將其保存在安全的地方。"
#: src/views/dashboard/Environments.vue:148
msgid ""
"The remote Nginx UI version is not compatible with the local Nginx UI "
@ -2630,6 +2662,13 @@ msgstr "網址無效。"
msgid "The username or password is incorrect"
msgstr "使用者名稱或密碼不正確"
#: src/views/preference/components/RecoveryCodes.vue:104
msgid ""
"These codes are the last resort for accessing your account in case you lose "
"your password and second factors. If you cannot find these codes, you will "
"lose access to your account."
msgstr ""
#: src/views/certificate/CertificateEditor.vue:102
msgid "This Auto Cert item is invalid, please remove it."
msgstr "此自動憑證項目無效,請將其移除。"
@ -2674,11 +2713,11 @@ msgid ""
"This will upgrade or reinstall the Nginx UI on %{nodeNames} to %{version}."
msgstr "這將在 %{nodeNames} 上升級或重新安裝 Nginx UI 到 %{version}。"
#: src/views/preference/AuthSettings.vue:96
#: src/views/preference/AuthSettings.vue:124
msgid "Throttle"
msgstr ""
#: src/views/preference/AuthSettings.vue:116
#: src/views/preference/AuthSettings.vue:144
#: src/views/preference/components/AddPasskey.vue:65
#: src/views/preference/LogrotateSettings.vue:11
msgid "Tips"
@ -2688,7 +2727,7 @@ msgstr "提示"
msgid "Title"
msgstr "標題"
#: src/views/preference/components/TOTP.vue:71
#: src/views/preference/components/TOTP.vue:68
msgid ""
"To enable it, you need to install the Google or Microsoft Authenticator app "
"on your mobile phone."
@ -2728,11 +2767,11 @@ msgid "Total %{total} item"
msgid_plural "Total %{total} items"
msgstr[0] ""
#: src/views/preference/components/TOTP.vue:69
#: src/views/preference/components/TOTP.vue:66
msgid "TOTP"
msgstr ""
#: src/views/preference/components/TOTP.vue:70
#: src/views/preference/components/TOTP.vue:67
msgid ""
"TOTP is a two-factor authentication method that uses a time-based one-time "
"password algorithm."
@ -2857,6 +2896,16 @@ msgstr "查看詳情"
msgid "View Mode"
msgstr "查看模式"
#: src/views/preference/components/RecoveryCodes.vue:134
#, fuzzy
msgid "View Recovery Codes"
msgstr "恢復碼"
#: src/views/preference/components/RecoveryCodes.vue:70
#, fuzzy
msgid "Viewed"
msgstr "檢視"
#: src/constants/index.ts:17 src/views/config/InspectConfig.vue:33
#: src/views/notification/notificationColumns.tsx:22
#: src/views/preference/components/AddPasskey.vue:82
@ -2878,7 +2927,7 @@ msgstr ""
"我們將從該檔案中刪除 HTTPChallenge 設定並重新載入 Nginx 設定檔案。你確定你要"
"繼續嗎?"
#: src/views/preference/AuthSettings.vue:69
#: src/views/preference/AuthSettings.vue:97
msgid "Webauthn"
msgstr ""
@ -2899,6 +2948,12 @@ msgid ""
"site category and the nodes selected below will be synchronized."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:140
msgid ""
"When you generate new recovery codes, you must download or print the new "
"codes."
msgstr ""
#: src/views/dashboard/ServerAnalytic.vue:37
#: src/views/dashboard/ServerAnalytic.vue:373
msgid "Writes"
@ -2912,7 +2967,7 @@ msgstr "將憑證私鑰寫入磁碟"
msgid "Writing certificate to disk"
msgstr "將憑證寫入磁碟"
#: src/views/preference/AuthSettings.vue:135
#: src/views/preference/AuthSettings.vue:163
#: src/views/preference/CertSettings.vue:69
#: src/views/site/ngx_conf/directive/DirectiveEditorItem.vue:96
#: src/views/site/ngx_conf/LocationEditor.vue:87
@ -2933,11 +2988,43 @@ msgid ""
"passkey."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:81
msgid ""
"You have not enabled 2FA yet. Please enable 2FA to generate recovery codes."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:94
msgid "You have not generated recovery codes yet."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:91
msgid ""
"Your current recovery code might be outdated and insecure. Please generate "
"new recovery codes at your earliest convenience to ensure security."
msgstr ""
#: src/views/preference/components/RecoveryCodes.vue:142
#: src/views/preference/components/RecoveryCodes.vue:155
msgid "Your old codes won't work anymore."
msgstr ""
#: src/views/preference/components/Passkey.vue:75
#, fuzzy
msgid "Your passkeys"
msgstr "新增通行密鑰"
#~ msgid ""
#~ "If you lose your mobile phone, you can use the recovery code to reset "
#~ "your 2FA."
#~ msgstr "如果您丟失了手機,可以使用恢復碼重置您的多重因素驗證驗證。"
#~ msgid "Recovery Code:"
#~ msgstr "恢復碼:"
#~ msgid ""
#~ "The recovery code is only displayed once, please save it in a safe place."
#~ msgstr "恢復碼僅顯示一次,請將其保存在安全的地方。"
#~ msgid "Directory"
#~ msgstr "目錄"
@ -3077,9 +3164,6 @@ msgstr "新增通行密鑰"
#~ msgid "404 Not Found"
#~ msgstr "404 未找到頁面"
#~ msgid "Are you sure you want to restore?"
#~ msgstr "您確定要恢復?"
#~ msgid "Destroy"
#~ msgstr "刪除"

View file

@ -1,8 +1,12 @@
<script setup lang="tsx">
import type { TwoFAStatus } from '@/api/2fa'
import type { RecoveryCode } from '@/api/recovery'
import type { BannedIP, Settings } from '@/api/settings'
import type { CustomRender } from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
import type { Ref } from 'vue'
import twoFA from '@/api/2fa'
import setting from '@/api/settings'
import RecoveryCodes from '@/views/preference/components/RecoveryCodes.vue'
import TOTP from '@/views/preference/components/TOTP.vue'
import { message } from 'ant-design-vue'
import dayjs from 'dayjs'
@ -47,6 +51,17 @@ 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>
@ -54,7 +69,20 @@ function removeBannedIP(ip: string) {
<div>
<h2>{{ $gettext('2FA Settings') }}</h2>
<PasskeyRegistration class="mb-4" />
<TOTP 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') }}

View file

@ -0,0 +1,172 @@
<script setup lang="ts">
import type { TwoFAStatus } from '@/api/2fa'
import type { RecoveryCode } from '@/api/recovery'
import recovery from '@/api/recovery'
import use2FAModal from '@/components/TwoFA/use2FAModal'
import { CopyOutlined, WarningOutlined } from '@ant-design/icons-vue'
import { UseClipboard } from '@vueuse/components'
import { message } from 'ant-design-vue'
const props = defineProps<{
recoveryCodes?: RecoveryCode[]
twoFAStatus?: TwoFAStatus
}>()
const emit = defineEmits<{
refresh: [void]
}>()
const _codes = ref<RecoveryCode[]>()
const codes = computed(() => props.recoveryCodes ?? _codes.value)
const newGenerated = ref(false)
const codeSource = computed(() => codes.value?.map(code => code.code).join('\n'))
function clickGenerateRecoveryCodes() {
const otpModal = use2FAModal()
otpModal.open().then(() => {
recovery.generate().then(r => {
_codes.value = r.codes
newGenerated.value = true
emit('refresh')
message.success($gettext('Generate recovery codes successfully'))
})
})
}
function clickViewRecoveryCodes() {
const otpModal = use2FAModal()
otpModal.open().then(() => {
recovery.view().then(r => {
_codes.value = r.codes
})
})
}
const popOpen = ref(false)
function popConfirm() {
popOpen.value = false
clickGenerateRecoveryCodes()
}
function handlePopOpenChange(visible: boolean) {
popOpen.value = visible
if (!visible)
return
if (props.twoFAStatus?.recovery_codes_generated)
popOpen.value = true
else
popConfirm()
}
</script>
<template>
<div>
<h3>
{{ $gettext('Recovery Codes') }}
<ATag v-if="recoveryCodes || twoFAStatus?.recovery_codes_viewed" :color="newGenerated || recoveryCodes ? 'success' : 'processing'">
{{ newGenerated || recoveryCodes ? $gettext('First View') : $gettext('Viewed') }}
</ATag>
</h3>
<p>{{ $gettext('Recovery codes are used to access your account when you lose access to your 2FA device. Each code can only be used once.') }}</p>
<p>{{ $gettext('Keep your recovery codes as safe as your password. We recommend saving them with a password manager.') }}</p>
<AAlert
v-if="!twoFAStatus?.enabled"
class="mb-4"
type="info"
show-icon
:message="$gettext('You have not enabled 2FA yet. Please enable 2FA to generate recovery codes.')"
/>
<AAlert
v-else-if="!twoFAStatus?.recovery_codes_generated"
class="mb-4"
type="warning"
show-icon
>
<template #message>
<template v-if="twoFAStatus?.otp_status">
{{ $gettext('Your current recovery code might be outdated and insecure. Please generate new recovery codes at your earliest convenience to ensure security.') }}
</template>
<template v-else>
{{ $gettext('You have not generated recovery codes yet.') }}
</template>
</template>
</AAlert>
<ACard v-if="codes" class="codes-card mb-4">
<template #title>
<AAlert class="whitespace-normal px-6 py-4 rounded-t-[8px]" type="warning" banner :show-icon="false">
<template #message>
<WarningOutlined class="ant-alert-icon text-lg" />
{{ $gettext('These codes are the last resort for accessing your account in case you lose your password and second factors. If you cannot find these codes, you will lose access to your account.') }}
</template>
</AAlert>
</template>
<ul class="grid grid-cols-2 gap-2 text-lg">
<li v-for="(code, index) in codes" :key="index">
<span :class="{ 'line-through': code.used_time }">
{{ `${code.code.slice(0, 5)}-${code.code.slice(5)}` }}
</span>
</li>
</ul>
<div class="mt-4 flex space-x-2">
<UseClipboard v-slot="{ copy, copied }" :source="codeSource">
<AButton @click="copy()">
<template #icon>
<CopyOutlined />
</template>
{{ !copied ? $gettext('Copy Codes') : $gettext('Copied') }}
</AButton>
</UseClipboard>
</div>
</ACard>
<template v-if="twoFAStatus?.enabled">
<AButton
v-if="twoFAStatus?.recovery_codes_generated && !codes"
type="primary"
ghost
@click="clickViewRecoveryCodes"
>
{{ $gettext('View Recovery Codes') }}
</AButton>
<div v-if="twoFAStatus?.recovery_codes_generated" class="mt-4">
<h3>{{ $gettext('Generate New Recovery Codes') }}</h3>
<p>
{{ $gettext('When you generate new recovery codes, you must download or print the new codes.') }}
<b>
{{ $gettext('Your old codes won\'t work anymore.') }}
</b>
</p>
</div>
<APopconfirm
:open="popOpen"
@open-change="handlePopOpenChange"
@confirm="popConfirm"
@cancel="() => popOpen = false"
>
<template #title>
{{ $gettext('Are you sure to generate new recovery codes?') }}<br>
<b>{{ $gettext('Your old codes won\'t work anymore.') }}</b>
</template>
<AButton
type="primary"
ghost
>
{{ twoFAStatus?.recovery_codes_generated ? $gettext('Generate New Recovery Codes') : $gettext('Generate Recovery Codes') }}
</AButton>
</APopconfirm>
</template>
</div>
</template>
<style scoped lang="less">
.codes-card :deep(.ant-card-head) {
padding: 0;
}
</style>

View file

@ -1,21 +1,28 @@
<script setup lang="ts">
import twoFA from '@/api/2fa'
import type { RecoveryCode } from '@/api/recovery'
import otp from '@/api/otp'
import OTPInput from '@/components/OTPInput/OTPInput.vue'
import use2FAModal from '@/components/TwoFA/use2FAModal'
import { CheckCircleOutlined } from '@ant-design/icons-vue'
import { UseClipboard } from '@vueuse/components'
import { message } from 'ant-design-vue'
const status = ref(false)
const { status = false } = defineProps<{
status?: boolean
}>()
const emit = defineEmits<{
refresh: [void]
}>()
const recoveryCodes = defineModel<RecoveryCode[]>('recoveryCodes')
const enrolling = ref(false)
const resetting = ref(false)
const generatedUrl = ref('')
const secret = ref('')
const passcode = ref('')
const refOtp = useTemplateRef('refOtp')
const recoveryCode = ref('')
const inputRecoveryCode = ref('')
function clickEnable2FA() {
enrolling.value = true
@ -33,33 +40,23 @@ function generateSecret() {
function enroll(code: string) {
otp.enroll_otp(secret.value, code).then(r => {
enrolling.value = false
recoveryCode.value = r.recovery_code
get2FAStatus()
recoveryCodes.value = r.codes
emit('refresh')
message.success($gettext('Enable 2FA successfully'))
}).catch(() => {
refOtp.value?.clearInput()
})
}
function get2FAStatus() {
twoFA.status().then(r => {
status.value = r.otp_status
})
}
get2FAStatus()
function clickReset2FA() {
resetting.value = true
inputRecoveryCode.value = ''
}
function reset2FA() {
otp.reset(inputRecoveryCode.value).then(() => {
resetting.value = false
recoveryCode.value = ''
get2FAStatus()
clickEnable2FA()
const otpModal = use2FAModal()
otpModal.open().then(() => {
otp.reset().then(() => {
resetting.value = false
recoveryCodes.value = undefined
emit('refresh')
clickEnable2FA()
})
})
}
</script>
@ -75,23 +72,6 @@ function reset2FA() {
<p><CheckCircleOutlined class="mr-2 text-green-600" />{{ $gettext('Current account is enabled TOTP.') }}</p>
</div>
<AAlert
v-if="recoveryCode"
:message="$gettext('Recovery Code')"
class="mb-4"
type="info"
show-icon
>
<template #description>
<div>
<p>{{ $gettext('If you lose your mobile phone, you can use the recovery code to reset your 2FA.') }}</p>
<p>{{ $gettext('The recovery code is only displayed once, please save it in a safe place.') }}</p>
<p>{{ $gettext('Recovery Code:') }}</p>
<span class="ml-2">{{ recoveryCode }}</span>
</div>
</template>
</AAlert>
<AButton
v-if="!status && !enrolling"
type="primary"
@ -100,14 +80,19 @@ function reset2FA() {
>
{{ $gettext('Enable TOTP') }}
</AButton>
<AButton
<APopconfirm
v-if="status && !resetting"
type="primary"
ghost
@click="clickReset2FA"
:title="$gettext('Are you sure to reset 2FA?')"
@confirm="reset2FA"
>
{{ $gettext('Reset 2FA') }}
</AButton>
<AButton
v-if="status && !resetting"
type="primary"
ghost
>
{{ $gettext('Reset 2FA') }}
</AButton>
</APopconfirm>
<template v-if="enrolling">
<div class="flex flex-col items-center">
@ -140,22 +125,6 @@ function reset2FA() {
</div>
</div>
</template>
<div
v-if="resetting"
class="mt-2"
>
<p>{{ $gettext('Input the recovery code:') }}</p>
<AInputGroup compact>
<AInput v-model:value="inputRecoveryCode" />
<AButton
type="primary"
@click="reset2FA"
>
{{ $gettext('Recovery') }}
</AButton>
</AInputGroup>
</div>
</div>
</template>

View file

@ -1,19 +1,33 @@
package model
import (
"time"
"github.com/go-webauthn/webauthn/webauthn"
"github.com/spf13/cast"
"gorm.io/gorm"
)
type RecoveryCode struct {
Code string `json:"code"`
UsedTime *time.Time `json:"used_time,omitempty" gorm:"type:datetime;default:null"`
}
type RecoveryCodes struct {
Codes []RecoveryCode `json:"codes"`
LastViewed *time.Time `json:"last_viewed,omitempty" gorm:"type:datetime;default:null"`
LastDownloaded *time.Time `json:"last_downloaded,omitempty" gorm:"type:datetime;default:null"`
}
type User struct {
Model
Name string `json:"name" cosy:"add:max=20;update:omitempty,max=20;list:fussy;db_unique"`
Password string `json:"-" cosy:"json:password;add:required,max=20;update:omitempty,max=20"`
Status bool `json:"status" gorm:"default:1"`
OTPSecret []byte `json:"-" gorm:"type:blob"`
EnabledTwoFA bool `json:"enabled_2fa" gorm:"-"`
Name string `json:"name" cosy:"add:max=20;update:omitempty,max=20;list:fussy;db_unique"`
Password string `json:"-" cosy:"json:password;add:required,max=20;update:omitempty,max=20"`
Status bool `json:"status" gorm:"default:1"`
OTPSecret []byte `json:"-" gorm:"type:blob"`
RecoveryCodes RecoveryCodes `json:"-" gorm:"serializer:json"`
EnabledTwoFA bool `json:"enabled_2fa" gorm:"-"`
}
type AuthToken struct {
@ -35,6 +49,14 @@ func (u *User) EnabledOTP() bool {
return len(u.OTPSecret) != 0
}
func (u *User) RecoveryCodeGenerated() bool {
return len(u.RecoveryCodes.Codes) > 0
}
func (u *User) RecoveryCodeViewed() bool {
return u.RecoveryCodes.LastViewed != nil
}
func (u *User) EnabledPasskey() bool {
var passkeys Passkey
db.Where("user_id", u.ID).Limit(1).Find(&passkeys)

View file

@ -36,6 +36,7 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user {
_user.Password = field.NewString(tableName, "password")
_user.Status = field.NewBool(tableName, "status")
_user.OTPSecret = field.NewBytes(tableName, "otp_secret")
_user.RecoveryCodes = field.NewField(tableName, "recovery_codes")
_user.fillFieldMap()
@ -45,15 +46,16 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user {
type user struct {
userDo
ALL field.Asterisk
ID field.Uint64
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Name field.String
Password field.String
Status field.Bool
OTPSecret field.Bytes
ALL field.Asterisk
ID field.Uint64
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Name field.String
Password field.String
Status field.Bool
OTPSecret field.Bytes
RecoveryCodes field.Field
fieldMap map[string]field.Expr
}
@ -78,6 +80,7 @@ func (u *user) updateTableName(table string) *user {
u.Password = field.NewString(table, "password")
u.Status = field.NewBool(table, "status")
u.OTPSecret = field.NewBytes(table, "otp_secret")
u.RecoveryCodes = field.NewField(table, "recovery_codes")
u.fillFieldMap()
@ -94,7 +97,7 @@ func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
}
func (u *user) fillFieldMap() {
u.fieldMap = make(map[string]field.Expr, 8)
u.fieldMap = make(map[string]field.Expr, 9)
u.fieldMap["id"] = u.ID
u.fieldMap["created_at"] = u.CreatedAt
u.fieldMap["updated_at"] = u.UpdatedAt
@ -103,6 +106,7 @@ func (u *user) fillFieldMap() {
u.fieldMap["password"] = u.Password
u.fieldMap["status"] = u.Status
u.fieldMap["otp_secret"] = u.OTPSecret
u.fieldMap["recovery_codes"] = u.RecoveryCodes
}
func (u user) clone(db *gorm.DB) user {