feat(auth): enhance trusted device management for 2FA

- Added lastUsedAt timestamp to the TrustedDevice model for tracking device usage.
- Implemented new endpoints for retrieving and removing trusted devices.
- Updated AuthService to manage trusted devices, including methods for getting and removing devices.
- Enhanced the user interface to support trusted device management, including modals for removing devices.
- Added translations for new messages related to trusted devices in multiple languages.
This commit is contained in:
Daniel Luiz Alves
2025-07-09 23:43:57 -03:00
parent ad689bd6d9
commit f3f792e053
32 changed files with 5892 additions and 3444 deletions

View File

@@ -278,6 +278,7 @@ model TrustedDevice {
deviceName String?
userAgent String?
ipAddress String?
lastUsedAt DateTime @default(now())
expiresAt DateTime
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

View File

@@ -122,4 +122,47 @@ export class AuthController {
return reply.status(400).send({ error: error.message });
}
}
async getTrustedDevices(request: FastifyRequest, reply: FastifyReply) {
try {
const userId = (request as any).user?.userId;
if (!userId) {
return reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
const devices = await this.authService.getTrustedDevices(userId);
return reply.send({ devices });
} catch (error: any) {
return reply.status(400).send({ error: error.message });
}
}
async removeTrustedDevice(request: FastifyRequest, reply: FastifyReply) {
try {
const userId = (request as any).user?.userId;
if (!userId) {
return reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
const { id } = request.params as { id: string };
await this.authService.removeTrustedDevice(userId, id);
return reply.send({ success: true, message: "Trusted device removed successfully" });
} catch (error: any) {
return reply.status(400).send({ error: error.message });
}
}
async removeAllTrustedDevices(request: FastifyRequest, reply: FastifyReply) {
try {
const userId = (request as any).user?.userId;
if (!userId) {
return reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
const result = await this.authService.removeAllTrustedDevices(userId);
return reply.send(result);
} catch (error: any) {
return reply.status(400).send({ error: error.message });
}
}
}

View File

@@ -183,4 +183,101 @@ export async function authRoutes(app: FastifyInstance) {
},
authController.getCurrentUser.bind(authController)
);
app.get(
"/auth/trusted-devices",
{
schema: {
tags: ["Authentication"],
operationId: "getTrustedDevices",
summary: "Get Trusted Devices",
description: "Get all trusted devices for the current user",
response: {
200: z.object({
devices: z.array(
z.object({
id: z.string().describe("Device ID"),
deviceName: z.string().nullable().describe("Device name"),
userAgent: z.string().nullable().describe("User agent"),
ipAddress: z.string().nullable().describe("IP address"),
createdAt: z.date().describe("Creation date"),
lastUsedAt: z.date().describe("Last used date"),
expiresAt: z.date().describe("Expiration date"),
})
),
}),
401: z.object({ error: z.string().describe("Error message") }),
},
},
preValidation: async (request: FastifyRequest, reply: FastifyReply) => {
try {
await request.jwtVerify();
} catch (err) {
console.error(err);
reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
},
},
authController.getTrustedDevices.bind(authController)
);
app.delete(
"/auth/trusted-devices/:id",
{
schema: {
tags: ["Authentication"],
operationId: "removeTrustedDevice",
summary: "Remove Trusted Device",
description: "Remove a specific trusted device",
params: z.object({
id: z.string().describe("Device ID"),
}),
response: {
200: z.object({
success: z.boolean().describe("Success status"),
message: z.string().describe("Success message"),
}),
401: z.object({ error: z.string().describe("Error message") }),
},
},
preValidation: async (request: FastifyRequest, reply: FastifyReply) => {
try {
await request.jwtVerify();
} catch (err) {
console.error(err);
reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
},
},
authController.removeTrustedDevice.bind(authController)
);
app.delete(
"/auth/trusted-devices",
{
schema: {
tags: ["Authentication"],
operationId: "removeAllTrustedDevices",
summary: "Remove All Trusted Devices",
description: "Remove all trusted devices for the current user",
response: {
200: z.object({
success: z.boolean().describe("Success status"),
message: z.string().describe("Success message"),
removedCount: z.number().describe("Number of devices removed"),
}),
401: z.object({ error: z.string().describe("Error message") }),
},
},
preValidation: async (request: FastifyRequest, reply: FastifyReply) => {
try {
await request.jwtVerify();
} catch (err) {
console.error(err);
reply.status(401).send({ error: "Unauthorized: a valid token is required to access this resource." });
}
},
},
authController.removeAllTrustedDevices.bind(authController)
);
}

View File

@@ -87,6 +87,8 @@ export class AuthService {
if (userAgent && ipAddress) {
const isDeviceTrusted = await this.trustedDeviceService.isDeviceTrusted(user.id, userAgent, ipAddress);
if (isDeviceTrusted) {
// Update last used timestamp for trusted device
await this.trustedDeviceService.updateLastUsed(user.id, userAgent, ipAddress);
return UserResponseSchema.parse(user);
}
}
@@ -132,6 +134,12 @@ export class AuthService {
if (rememberDevice && userAgent && ipAddress) {
await this.trustedDeviceService.addTrustedDevice(userId, userAgent, ipAddress);
} else if (userAgent && ipAddress) {
// Update last used timestamp if this is already a trusted device
const isDeviceTrusted = await this.trustedDeviceService.isDeviceTrusted(userId, userAgent, ipAddress);
if (isDeviceTrusted) {
await this.trustedDeviceService.updateLastUsed(userId, userAgent, ipAddress);
}
}
return UserResponseSchema.parse(user);
@@ -203,4 +211,21 @@ export class AuthService {
}
return UserResponseSchema.parse(user);
}
async getTrustedDevices(userId: string) {
return await this.trustedDeviceService.getUserTrustedDevices(userId);
}
async removeTrustedDevice(userId: string, deviceId: string) {
return await this.trustedDeviceService.removeTrustedDevice(userId, deviceId);
}
async removeAllTrustedDevices(userId: string) {
const result = await this.trustedDeviceService.removeAllTrustedDevices(userId);
return {
success: true,
message: "All trusted devices removed successfully",
removedCount: result.count,
};
}
}

View File

@@ -40,11 +40,13 @@ export class TrustedDeviceService {
userAgent,
ipAddress,
expiresAt,
lastUsedAt: new Date(),
},
update: {
expiresAt,
userAgent,
ipAddress,
lastUsedAt: new Date(),
},
});
}
@@ -82,11 +84,26 @@ export class TrustedDeviceService {
});
}
async removeAllTrustedDevices(userId: string): Promise<void> {
await prisma.trustedDevice.deleteMany({
async removeAllTrustedDevices(userId: string): Promise<{ count: number }> {
const result = await prisma.trustedDevice.deleteMany({
where: {
userId,
},
});
return { count: result.count };
}
async updateLastUsed(userId: string, userAgent: string, ipAddress: string): Promise<void> {
const deviceHash = this.generateDeviceHash(userAgent, ipAddress);
await prisma.trustedDevice.updateMany({
where: {
userId,
deviceHash,
},
data: {
lastUsedAt: new Date(),
},
});
}
}

View File

@@ -143,7 +143,8 @@
"saving": "جاري الحفظ...",
"update": "تحديث",
"click": "انقر على",
"creating": "جاري الإنشاء..."
"creating": "جاري الإنشاء...",
"loadingSimple": "جاري التحميل..."
},
"createShare": {
"title": "إنشاء مشاركة",
@@ -189,7 +190,8 @@
"Password verification required": "مطلوب التحقق من كلمة المرور",
"Two-factor authentication is already enabled": "المصادقة الثنائية مفعلة بالفعل",
"Two-factor authentication is not enabled": "المصادقة الثنائية غير مفعلة",
"Two-factor authentication required": "المصادقة الثنائية مطلوبة"
"Two-factor authentication required": "المصادقة الثنائية مطلوبة",
"noUserData": "لا يوجد بيانات المستخدم"
},
"fileActions": {
"editFile": "تعديل الملف",
@@ -338,6 +340,21 @@
},
"pageTitle": "الصفحة الرئيسية"
},
"iconPicker": {
"title": "اختر أيقونة",
"placeholder": "اختر أيقونة",
"searchPlaceholder": "البحث عن الأيقونات...",
"loadingMore": "جاري تحميل المزيد من الأيقونات...",
"allIconsLoaded": "تم تحميل جميع الأيقونات {count}",
"noIconsFound": "لم يتم العثور على أيقونات لـ \"{search}\"",
"tabs": {
"all": "جميع الأيقونات",
"popular": "الشائعة",
"auth": "مزودي المصادقة"
},
"stats": "{iconCount} أيقونة من {libraryCount} مكتبة",
"categoryBadge": "{category} ({count} أيقونات)"
},
"login": {
"welcome": "مرحبا بك",
"signInToContinue": "قم بتسجيل الدخول للمتابعة",
@@ -1428,6 +1445,160 @@
"dark": "داكن",
"system": "النظام"
},
"twoFactor": {
"title": "المصادقة الثنائية",
"description": "أضف طبقة إضافية من الأمان إلى حسابك",
"enabled": "حسابك محمي بالمصادقة الثنائية",
"disabled": "المصادقة الثنائية غير مفعلة",
"setup": {
"title": "تفعيل المصادقة الثنائية",
"description": "امسح رمز QR باستخدام تطبيق المصادقة، ثم أدخل رمز التحقق.",
"qrCode": "رمز QR",
"manualEntryKey": "مفتاح الإدخال اليدوي",
"verificationCode": "رمز التحقق",
"verificationCodePlaceholder": "أدخل الرمز المكون من 6 أرقام",
"verificationCodeDescription": "أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة",
"verifyAndEnable": "تحقق وتفعيل",
"cancel": "إلغاء"
},
"disable": {
"title": "تعطيل المصادقة الثنائية",
"description": "أدخل كلمة المرور للتأكيد على تعطيل المصادقة الثنائية.",
"password": "كلمة المرور",
"passwordPlaceholder": "أدخل كلمة المرور",
"confirm": "تأكيد التعطيل",
"cancel": "إلغاء"
},
"backupCodes": {
"title": "رموز النسخ الاحتياطي",
"description": "احفظ رموز النسخ الاحتياطي هذه في مكان آمن. يمكنك استخدامها للوصول إلى حسابك في حالة فقدان جهاز المصادقة.",
"warning": "هام:",
"warningText": "يمكن استخدام كل رمز نسخ احتياطي مرة واحدة فقط. احتفظ بها بشكل آمن ولا تشاركها مع أي شخص.",
"generateNew": "إنشاء رموز نسخ احتياطي جديدة",
"download": "تحميل رموز النسخ الاحتياطي",
"copyToClipboard": "نسخ إلى الحافظة",
"savedMessage": "لقد حفظت رموز النسخ الاحتياطي",
"available": "{count} رموز نسخ احتياطي متاحة",
"instructions": [
"• احفظ هذه الرموز في مكان آمن",
"• يمكن استخدام كل رمز نسخ احتياطي مرة واحدة فقط",
"• يمكنك إنشاء رموز جديدة في أي وقت"
]
},
"verification": {
"title": "المصادقة الثنائية",
"description": "أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة",
"backupDescription": "أدخل أحد رموز النسخ الاحتياطي للمتابعة",
"verificationCode": "رمز التحقق",
"backupCode": "رمز النسخ الاحتياطي",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "تحقق",
"verifying": "جاري التحقق...",
"useBackupCode": "استخدم رمز النسخ الاحتياطي بدلاً من ذلك",
"useAuthenticatorCode": "استخدم رمز المصادقة بدلاً من ذلك",
"rememberDevice": "تذكر هذا الجهاز لمدة 30 يومًا",
"rememberDeviceDescription": "لن تحتاج إلى إدخال رموز المصادقة الثنائية على هذا الجهاز لمدة 30 يومًا"
},
"messages": {
"enabledSuccess": "تم تفعيل المصادقة الثنائية بنجاح!",
"disabledSuccess": "تم تعطيل المصادقة الثنائية بنجاح",
"backupCodesGenerated": "تم إنشاء رموز النسخ الاحتياطي الجديدة بنجاح",
"backupCodesCopied": "تم نسخ رموز النسخ الاحتياطي إلى الحافظة",
"setupFailed": "فشل في إنشاء إعداد المصادقة الثنائية",
"verificationFailed": "رمز التحقق غير صالح",
"disableFailed": "فشل في تعطيل المصادقة الثنائية. يرجى التحقق من كلمة المرور.",
"backupCodesFailed": "فشل في إنشاء رموز النسخ الاحتياطي",
"backupCodesCopyFailed": "فشل في نسخ رموز النسخ الاحتياطي",
"statusLoadFailed": "فشل في تحميل حالة المصادقة الثنائية",
"enterVerificationCode": "يرجى إدخال رمز التحقق",
"enterPassword": "يرجى إدخال كلمة المرور",
"deviceTrusted": "تم تحديد هذا الجهاز كجهاز موثوق به لمدة 30 يومًا"
},
"errors": {
"invalidVerificationCode": "رمز التحقق غير صالح",
"invalidTwoFactorCode": "رمز المصادقة الثنائية غير صالح",
"twoFactorRequired": "المصادقة الثنائية مطلوبة",
"twoFactorAlreadyEnabled": "المصادقة الثنائية مفعلة بالفعل",
"twoFactorNotEnabled": "المصادقة الثنائية غير مفعلة",
"passwordVerificationRequired": "التحقق من كلمة المرور مطلوب",
"invalidPassword": "كلمة المرور غير صالحة",
"userNotFound": "المستخدم غير موجود"
},
"buttons": {
"enable2FA": "تفعيل المصادقة الثنائية",
"disable2FA": "تعطيل المصادقة الثنائية"
},
"deviceNames": {
"unknownDevice": "جهاز غير معروف",
"browsers": {
"chrome": "كروم",
"firefox": "فايرفوكس",
"safari": "سفاري",
"edge": "إيدج"
},
"platforms": {
"windows": " على ويندوز",
"macos": " على ماك",
"linux": " على لينكس",
"iphone": " على آيفون",
"android": " على أندرويد"
}
},
"status": {
"label": "الحالة:",
"enabled": "مفعل",
"disabled": "معطل"
},
"trustedDevices": {
"title": "الأجهزة الموثوقة - المصادقة الثنائية",
"description": "الأجهزة التي لا تتطلب التحقق من المصادقة الثنائية",
"noDevices": "لا توجد أجهزة موثوقة",
"deviceName": "الجهاز",
"addedOn": "تمت الإضافة في",
"expiresOn": "تنتهي في",
"remove": "إزالة",
"removeAll": "إزالة الكل",
"confirmRemove": "هل أنت متأكد أنك تريد إزالة هذا الجهاز الموثوق به؟",
"confirmRemoveAll": "هل أنت متأكد أنك تريد إزالة جميع الأجهزة الموثوقة؟",
"deviceRemoved": "تمت إزالة الجهاز الموثوق به بنجاح",
"allDevicesRemoved": "تمت إزالة جميع الأجهزة الموثوقة بنجاح",
"loadFailed": "فشل في تحميل الأجهزة الموثوقة",
"removeFailed": "فشل في إزالة الجهاز الموثوق به",
"removeAllFailed": "فشل في إزالة جميع الأجهزة الموثوقة",
"loading": "جاري تحميل الأجهزة الموثوقة...",
"noDevicesDescription": "ستظهر الأجهزة هنا عندما تختار الوثوق بها أثناء التحقق من المصادقة الثنائية",
"tableHeaders": {
"device": "الجهاز",
"added": "تمت الإضافة",
"expires": "تنتهي",
"lastUsed": "آخر استخدام",
"ipAddress": "عنوان IP",
"actions": "الإجراءات"
},
"status": {
"never": "أبداً",
"expired": "منتهي الصلاحية"
},
"modals": {
"removeDevice": {
"title": "إزالة الجهاز الموثوق به",
"added": "تمت الإضافة:",
"ip": "عنوان IP:"
},
"removeAllDevices": {
"title": "إزالة جميع الأجهزة الموثوقة",
"description": "سيؤدي هذا إلى إزالة {count} جهاز موثوق به{count, plural, =1 {} other {}}. ستحتاج إلى التحقق من المصادقة الثنائية على جميع الأجهزة مرة أخرى."
},
"buttons": {
"cancel": "إلغاء",
"removing": "جاري الإزالة...",
"removeDevice": "إزالة الجهاز",
"removeAllDevices": "إزالة جميع الأجهزة"
}
}
}
},
"uploadFile": {
"title": "رفع ملف",
"multipleTitle": "رفع ملفات متعددة",
@@ -1544,98 +1715,5 @@
"passwordRequired": "كلمة المرور مطلوبة",
"nameRequired": "الاسم مطلوب",
"required": "هذا الحقل مطلوب"
},
"iconPicker": {
"title": "اختر أيقونة",
"placeholder": "اختر أيقونة",
"searchPlaceholder": "البحث عن الأيقونات...",
"loadingMore": "جاري تحميل المزيد من الأيقونات...",
"allIconsLoaded": "تم تحميل جميع الأيقونات {count}",
"noIconsFound": "لم يتم العثور على أيقونات لـ \"{search}\"",
"tabs": {
"all": "جميع الأيقونات",
"popular": "الشائعة",
"auth": "مزودي المصادقة"
},
"stats": "{iconCount} أيقونة من {libraryCount} مكتبة",
"categoryBadge": "{category} ({count} أيقونات)"
},
"twoFactor": {
"title": "المصادقة الثنائية",
"description": "أضف طبقة إضافية من الأمان إلى حسابك",
"enabled": "حسابك محمي بالمصادقة الثنائية",
"disabled": "المصادقة الثنائية غير مفعلة",
"setup": {
"title": "تفعيل المصادقة الثنائية",
"description": "امسح رمز QR باستخدام تطبيق المصادقة، ثم أدخل رمز التحقق.",
"qrCode": "رمز QR",
"manualEntryKey": "مفتاح الإدخال اليدوي",
"verificationCode": "رمز التحقق",
"verificationCodePlaceholder": "أدخل الرمز المكون من 6 أرقام",
"verificationCodeDescription": "أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة",
"verifyAndEnable": "تحقق وتفعيل",
"cancel": "إلغاء"
},
"disable": {
"title": "تعطيل المصادقة الثنائية",
"description": "أدخل كلمة المرور للتأكيد على تعطيل المصادقة الثنائية.",
"password": "كلمة المرور",
"passwordPlaceholder": "أدخل كلمة المرور",
"confirm": "تأكيد التعطيل",
"cancel": "إلغاء"
},
"backupCodes": {
"title": "رموز النسخ الاحتياطي",
"description": "احفظ رموز النسخ الاحتياطي هذه في مكان آمن. يمكنك استخدامها للوصول إلى حسابك في حالة فقدان جهاز المصادقة.",
"warning": "هام:",
"warningText": "يمكن استخدام كل رمز نسخ احتياطي مرة واحدة فقط. احتفظ بها بشكل آمن ولا تشاركها مع أي شخص.",
"generateNew": "إنشاء رموز نسخ احتياطي جديدة",
"download": "تحميل رموز النسخ الاحتياطي",
"copyToClipboard": "نسخ إلى الحافظة",
"savedMessage": "لقد حفظت رموز النسخ الاحتياطي",
"available": "{count} رموز نسخ احتياطي متاحة",
"instructions": [
"• احفظ هذه الرموز في مكان آمن",
"• يمكن استخدام كل رمز نسخ احتياطي مرة واحدة فقط",
"• يمكنك إنشاء رموز جديدة في أي وقت"
]
},
"verification": {
"title": "المصادقة الثنائية",
"description": "أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة",
"backupDescription": "أدخل أحد رموز النسخ الاحتياطي للمتابعة",
"verificationCode": "رمز التحقق",
"backupCode": "رمز النسخ الاحتياطي",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "تحقق",
"verifying": "جاري التحقق...",
"useBackupCode": "استخدم رمز النسخ الاحتياطي بدلاً من ذلك",
"useAuthenticatorCode": "استخدم رمز المصادقة بدلاً من ذلك"
},
"messages": {
"enabledSuccess": "تم تفعيل المصادقة الثنائية بنجاح!",
"disabledSuccess": "تم تعطيل المصادقة الثنائية بنجاح",
"backupCodesGenerated": "تم إنشاء رموز النسخ الاحتياطي الجديدة بنجاح",
"backupCodesCopied": "تم نسخ رموز النسخ الاحتياطي إلى الحافظة",
"setupFailed": "فشل في إنشاء إعداد المصادقة الثنائية",
"verificationFailed": "رمز التحقق غير صالح",
"disableFailed": "فشل في تعطيل المصادقة الثنائية. يرجى التحقق من كلمة المرور.",
"backupCodesFailed": "فشل في إنشاء رموز النسخ الاحتياطي",
"backupCodesCopyFailed": "فشل في نسخ رموز النسخ الاحتياطي",
"statusLoadFailed": "فشل في تحميل حالة المصادقة الثنائية",
"enterVerificationCode": "يرجى إدخال رمز التحقق",
"enterPassword": "يرجى إدخال كلمة المرور"
},
"errors": {
"invalidVerificationCode": "رمز التحقق غير صالح",
"invalidTwoFactorCode": "رمز المصادقة الثنائية غير صالح",
"twoFactorRequired": "المصادقة الثنائية مطلوبة",
"twoFactorAlreadyEnabled": "المصادقة الثنائية مفعلة بالفعل",
"twoFactorNotEnabled": "المصادقة الثنائية غير مفعلة",
"passwordVerificationRequired": "التحقق من كلمة المرور مطلوب",
"invalidPassword": "كلمة المرور غير صالحة",
"userNotFound": "المستخدم غير موجود"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Speichere...",
"update": "Aktualisieren",
"click": "Klicken Sie auf",
"creating": "Erstellen..."
"creating": "Erstellen...",
"loadingSimple": "Lade..."
},
"createShare": {
"title": "Freigabe Erstellen",
@@ -189,7 +190,8 @@
"Password verification required": "Passwortüberprüfung erforderlich",
"Two-factor authentication is already enabled": "Zwei-Faktor-Authentifizierung ist bereits aktiviert",
"Two-factor authentication is not enabled": "Zwei-Faktor-Authentifizierung ist nicht aktiviert",
"Two-factor authentication required": "Zwei-Faktor-Authentifizierung erforderlich"
"Two-factor authentication required": "Zwei-Faktor-Authentifizierung erforderlich",
"noUserData": "Keine Benutzerdaten"
},
"fileActions": {
"editFile": "Datei bearbeiten",
@@ -338,6 +340,21 @@
},
"pageTitle": "Startseite"
},
"iconPicker": {
"title": "Symbol auswählen",
"placeholder": "Wählen Sie ein Symbol",
"searchPlaceholder": "Symbole suchen...",
"loadingMore": "Weitere Symbole werden geladen...",
"allIconsLoaded": "Alle {count} Symbole geladen",
"noIconsFound": "Keine Symbole für \"{search}\" gefunden",
"tabs": {
"all": "Alle Symbole",
"popular": "Beliebt",
"auth": "Authentifizierungsanbieter"
},
"stats": "{iconCount} Symbole aus {libraryCount} Bibliotheken",
"categoryBadge": "{category} ({count} Symbole)"
},
"login": {
"welcome": "Willkommen zu",
"signInToContinue": "Melden Sie sich an, um fortzufahren",
@@ -1426,6 +1443,160 @@
"dark": "Dunkel",
"system": "System"
},
"twoFactor": {
"title": "Zwei-Faktor-Authentifizierung",
"description": "Fügen Sie Ihrem Konto eine zusätzliche Sicherheitsebene hinzu",
"enabled": "Ihr Konto ist mit Zwei-Faktor-Authentifizierung geschützt",
"disabled": "Zwei-Faktor-Authentifizierung ist nicht aktiviert",
"setup": {
"title": "Zwei-Faktor-Authentifizierung aktivieren",
"description": "Scannen Sie den QR-Code mit Ihrer Authenticator-App und geben Sie dann den Bestätigungscode ein.",
"qrCode": "QR-Code",
"manualEntryKey": "Manueller Eingabeschlüssel",
"verificationCode": "Bestätigungscode",
"verificationCodePlaceholder": "6-stelligen Code eingeben",
"verificationCodeDescription": "Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",
"verifyAndEnable": "Überprüfen & Aktivieren",
"cancel": "Abbrechen"
},
"disable": {
"title": "Zwei-Faktor-Authentifizierung deaktivieren",
"description": "Geben Sie Ihr Passwort ein, um die Deaktivierung der Zwei-Faktor-Authentifizierung zu bestätigen.",
"password": "Passwort",
"passwordPlaceholder": "Geben Sie Ihr Passwort ein",
"confirm": "Deaktivierung bestätigen",
"cancel": "Abbrechen"
},
"backupCodes": {
"title": "Backup-Codes",
"description": "Speichern Sie diese Backup-Codes an einem sicheren Ort. Sie können sie verwenden, um auf Ihr Konto zuzugreifen, wenn Sie Ihr Authentifizierungsgerät verlieren.",
"warning": "Wichtig:",
"warningText": "Jeder Backup-Code kann nur einmal verwendet werden. Bewahren Sie sie sicher auf und teilen Sie sie mit niemandem.",
"generateNew": "Neue Backup-Codes generieren",
"download": "Backup-Codes herunterladen",
"copyToClipboard": "In die Zwischenablage kopieren",
"savedMessage": "Ich habe meine Backup-Codes gespeichert",
"available": "{count} Backup-Codes verfügbar",
"instructions": [
"• Speichern Sie diese Codes an einem sicheren Ort",
"• Jeder Backup-Code kann nur einmal verwendet werden",
"• Sie können jederzeit neue Codes generieren"
]
},
"verification": {
"title": "Zwei-Faktor-Authentifizierung",
"description": "Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",
"backupDescription": "Geben Sie einen Ihrer Backup-Codes ein, um fortzufahren",
"verificationCode": "Bestätigungscode",
"backupCode": "Backup-Code",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Überprüfen",
"verifying": "Überprüfung läuft...",
"useBackupCode": "Stattdessen Backup-Code verwenden",
"useAuthenticatorCode": "Stattdessen Authenticator-Code verwenden",
"rememberDevice": "Dieses Gerät für 30 Tage merken",
"rememberDeviceDescription": "Sie müssen auf diesem Gerät 30 Tage lang keine 2FA-Codes eingeben"
},
"messages": {
"enabledSuccess": "Zwei-Faktor-Authentifizierung erfolgreich aktiviert!",
"disabledSuccess": "Zwei-Faktor-Authentifizierung erfolgreich deaktiviert",
"backupCodesGenerated": "Neue Backup-Codes erfolgreich generiert",
"backupCodesCopied": "Backup-Codes in die Zwischenablage kopiert",
"setupFailed": "2FA-Setup konnte nicht generiert werden",
"verificationFailed": "Ungültiger Bestätigungscode",
"disableFailed": "2FA konnte nicht deaktiviert werden. Bitte überprüfen Sie Ihr Passwort.",
"backupCodesFailed": "Backup-Codes konnten nicht generiert werden",
"backupCodesCopyFailed": "Backup-Codes konnten nicht kopiert werden",
"statusLoadFailed": "2FA-Status konnte nicht geladen werden",
"enterVerificationCode": "Bitte geben Sie den Bestätigungscode ein",
"enterPassword": "Bitte geben Sie Ihr Passwort ein",
"deviceTrusted": "Dieses Gerät wurde für 30 Tage als vertrauenswürdig markiert"
},
"errors": {
"invalidVerificationCode": "Ungültiger Bestätigungscode",
"invalidTwoFactorCode": "Ungültiger Zwei-Faktor-Authentifizierungscode",
"twoFactorRequired": "Zwei-Faktor-Authentifizierung erforderlich",
"twoFactorAlreadyEnabled": "Zwei-Faktor-Authentifizierung ist bereits aktiviert",
"twoFactorNotEnabled": "Zwei-Faktor-Authentifizierung ist nicht aktiviert",
"passwordVerificationRequired": "Passwortüberprüfung erforderlich",
"invalidPassword": "Ungültiges Passwort",
"userNotFound": "Benutzer nicht gefunden"
},
"buttons": {
"enable2FA": "2FA aktivieren",
"disable2FA": "2FA deaktivieren"
},
"deviceNames": {
"unknownDevice": "Unbekanntes Gerät",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " auf Windows",
"macos": " auf macOS",
"linux": " auf Linux",
"iphone": " auf iPhone",
"android": " auf Android"
}
},
"status": {
"label": "Status:",
"enabled": "Aktiviert",
"disabled": "Deaktiviert"
},
"trustedDevices": {
"title": "Vertrauenswürdige Geräte - 2FA",
"description": "Geräte, die keine 2FA-Verifizierung benötigen",
"noDevices": "Keine vertrauenswürdigen Geräte",
"deviceName": "Gerät",
"addedOn": "Hinzugefügt am",
"expiresOn": "Läuft ab am",
"remove": "Entfernen",
"removeAll": "Alle entfernen",
"confirmRemove": "Möchten Sie dieses vertrauenswürdige Gerät wirklich entfernen?",
"confirmRemoveAll": "Möchten Sie wirklich alle vertrauenswürdigen Geräte entfernen?",
"deviceRemoved": "Vertrauenswürdiges Gerät erfolgreich entfernt",
"allDevicesRemoved": "Alle vertrauenswürdigen Geräte erfolgreich entfernt",
"loadFailed": "Fehler beim Laden der vertrauenswürdigen Geräte",
"removeFailed": "Fehler beim Entfernen des vertrauenswürdigen Geräts",
"removeAllFailed": "Fehler beim Entfernen aller vertrauenswürdigen Geräte",
"loading": "Lade vertrauenswürdige Geräte...",
"noDevicesDescription": "Geräte erscheinen hier, wenn Sie sie während der 2FA-Verifizierung als vertrauenswürdig markieren",
"tableHeaders": {
"device": "Gerät",
"added": "Hinzugefügt",
"expires": "Läuft ab",
"lastUsed": "Zuletzt verwendet",
"ipAddress": "IP-Adresse",
"actions": "Aktionen"
},
"status": {
"never": "Nie",
"expired": "Abgelaufen"
},
"modals": {
"removeDevice": {
"title": "Vertrauenswürdiges Gerät entfernen",
"added": "Hinzugefügt:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Alle vertrauenswürdigen Geräte entfernen",
"description": "Dies wird {count} vertrauenswürdige{count, plural, =1 {s Gerät} other { Geräte}} entfernen. Sie müssen die 2FA auf allen Geräten erneut verifizieren."
},
"buttons": {
"cancel": "Abbrechen",
"removing": "Wird entfernt...",
"removeDevice": "Gerät entfernen",
"removeAllDevices": "Alle Geräte entfernen"
}
}
}
},
"uploadFile": {
"title": "Datei hochladen",
"multipleTitle": "Mehrere Dateien Hochladen",
@@ -1542,98 +1713,5 @@
"passwordRequired": "Passwort ist erforderlich",
"nameRequired": "Name ist erforderlich",
"required": "Dieses Feld ist erforderlich"
},
"iconPicker": {
"title": "Symbol auswählen",
"placeholder": "Wählen Sie ein Symbol",
"searchPlaceholder": "Symbole suchen...",
"loadingMore": "Weitere Symbole werden geladen...",
"allIconsLoaded": "Alle {count} Symbole geladen",
"noIconsFound": "Keine Symbole für \"{search}\" gefunden",
"tabs": {
"all": "Alle Symbole",
"popular": "Beliebt",
"auth": "Authentifizierungsanbieter"
},
"stats": "{iconCount} Symbole aus {libraryCount} Bibliotheken",
"categoryBadge": "{category} ({count} Symbole)"
},
"twoFactor": {
"title": "Zwei-Faktor-Authentifizierung",
"description": "Fügen Sie Ihrem Konto eine zusätzliche Sicherheitsebene hinzu",
"enabled": "Ihr Konto ist mit Zwei-Faktor-Authentifizierung geschützt",
"disabled": "Zwei-Faktor-Authentifizierung ist nicht aktiviert",
"setup": {
"title": "Zwei-Faktor-Authentifizierung aktivieren",
"description": "Scannen Sie den QR-Code mit Ihrer Authenticator-App und geben Sie dann den Bestätigungscode ein.",
"qrCode": "QR-Code",
"manualEntryKey": "Manueller Eingabeschlüssel",
"verificationCode": "Bestätigungscode",
"verificationCodePlaceholder": "6-stelligen Code eingeben",
"verificationCodeDescription": "Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",
"verifyAndEnable": "Überprüfen & Aktivieren",
"cancel": "Abbrechen"
},
"disable": {
"title": "Zwei-Faktor-Authentifizierung deaktivieren",
"description": "Geben Sie Ihr Passwort ein, um die Deaktivierung der Zwei-Faktor-Authentifizierung zu bestätigen.",
"password": "Passwort",
"passwordPlaceholder": "Geben Sie Ihr Passwort ein",
"confirm": "Deaktivierung bestätigen",
"cancel": "Abbrechen"
},
"backupCodes": {
"title": "Backup-Codes",
"description": "Speichern Sie diese Backup-Codes an einem sicheren Ort. Sie können sie verwenden, um auf Ihr Konto zuzugreifen, wenn Sie Ihr Authentifizierungsgerät verlieren.",
"warning": "Wichtig:",
"warningText": "Jeder Backup-Code kann nur einmal verwendet werden. Bewahren Sie sie sicher auf und teilen Sie sie mit niemandem.",
"generateNew": "Neue Backup-Codes generieren",
"download": "Backup-Codes herunterladen",
"copyToClipboard": "In die Zwischenablage kopieren",
"savedMessage": "Ich habe meine Backup-Codes gespeichert",
"available": "{count} Backup-Codes verfügbar",
"instructions": [
"• Speichern Sie diese Codes an einem sicheren Ort",
"• Jeder Backup-Code kann nur einmal verwendet werden",
"• Sie können jederzeit neue Codes generieren"
]
},
"verification": {
"title": "Zwei-Faktor-Authentifizierung",
"description": "Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein",
"backupDescription": "Geben Sie einen Ihrer Backup-Codes ein, um fortzufahren",
"verificationCode": "Bestätigungscode",
"backupCode": "Backup-Code",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Überprüfen",
"verifying": "Überprüfung läuft...",
"useBackupCode": "Stattdessen Backup-Code verwenden",
"useAuthenticatorCode": "Stattdessen Authenticator-Code verwenden"
},
"messages": {
"enabledSuccess": "Zwei-Faktor-Authentifizierung erfolgreich aktiviert!",
"disabledSuccess": "Zwei-Faktor-Authentifizierung erfolgreich deaktiviert",
"backupCodesGenerated": "Neue Backup-Codes erfolgreich generiert",
"backupCodesCopied": "Backup-Codes in die Zwischenablage kopiert",
"setupFailed": "2FA-Setup konnte nicht generiert werden",
"verificationFailed": "Ungültiger Bestätigungscode",
"disableFailed": "2FA konnte nicht deaktiviert werden. Bitte überprüfen Sie Ihr Passwort.",
"backupCodesFailed": "Backup-Codes konnten nicht generiert werden",
"backupCodesCopyFailed": "Backup-Codes konnten nicht kopiert werden",
"statusLoadFailed": "2FA-Status konnte nicht geladen werden",
"enterVerificationCode": "Bitte geben Sie den Bestätigungscode ein",
"enterPassword": "Bitte geben Sie Ihr Passwort ein"
},
"errors": {
"invalidVerificationCode": "Ungültiger Bestätigungscode",
"invalidTwoFactorCode": "Ungültiger Zwei-Faktor-Authentifizierungscode",
"twoFactorRequired": "Zwei-Faktor-Authentifizierung erforderlich",
"twoFactorAlreadyEnabled": "Zwei-Faktor-Authentifizierung ist bereits aktiviert",
"twoFactorNotEnabled": "Zwei-Faktor-Authentifizierung ist nicht aktiviert",
"passwordVerificationRequired": "Passwortüberprüfung erforderlich",
"invalidPassword": "Ungültiges Passwort",
"userNotFound": "Benutzer nicht gefunden"
}
}
}

View File

@@ -129,6 +129,7 @@
},
"common": {
"loading": "Loading, please wait...",
"loadingSimple": "Loading...",
"cancel": "Cancel",
"save": "Save",
"saving": "Saving...",
@@ -189,7 +190,8 @@
"Invalid password": "Invalid password",
"Password verification required": "Password verification required",
"Invalid two-factor authentication code": "Invalid two-factor authentication code",
"Two-factor authentication required": "Two-factor authentication required"
"Two-factor authentication required": "Two-factor authentication required",
"noUserData": "No user data"
},
"fileActions": {
"editFile": "Edit File",
@@ -338,6 +340,21 @@
},
"pageTitle": "Home"
},
"iconPicker": {
"title": "Select Icon",
"placeholder": "Select an icon",
"searchPlaceholder": "Search icons...",
"loadingMore": "Loading more icons...",
"allIconsLoaded": "All {count} icons loaded",
"noIconsFound": "No icons found for \"{search}\"",
"tabs": {
"all": "All Icons",
"popular": "Popular",
"auth": "Auth Providers"
},
"stats": "{iconCount} icons from {libraryCount} libraries",
"categoryBadge": "{category} ({count} icons)"
},
"login": {
"welcome": "Welcome to",
"signInToContinue": "Sign in to continue",
@@ -1426,6 +1443,160 @@
"dark": "Dark",
"system": "System"
},
"twoFactor": {
"title": "Two-Factor Authentication",
"description": "Add an extra layer of security to your account",
"enabled": "Your account is protected with two-factor authentication",
"disabled": "Two-factor authentication is not enabled",
"status": {
"label": "Status:",
"enabled": "Enabled",
"disabled": "Disabled"
},
"buttons": {
"enable2FA": "Enable 2FA",
"disable2FA": "Disable 2FA"
},
"setup": {
"title": "Enable Two-Factor Authentication",
"description": "Scan the QR code with your authenticator app, then enter the verification code.",
"qrCode": "QR Code",
"manualEntryKey": "Manual Entry Key",
"verificationCode": "Verification Code",
"verificationCodePlaceholder": "Enter 6-digit code",
"verificationCodeDescription": "Enter the 6-digit code from your authenticator app",
"verifyAndEnable": "Verify & Enable",
"cancel": "Cancel"
},
"disable": {
"title": "Disable Two-Factor Authentication",
"description": "Enter your password to confirm disabling two-factor authentication.",
"password": "Password",
"passwordPlaceholder": "Enter your password",
"confirm": "Confirm Disable",
"cancel": "Cancel"
},
"backupCodes": {
"title": "Backup Codes",
"description": "Save these backup codes in a safe place. You can use them to access your account if you lose your authenticator device.",
"warning": "Important:",
"warningText": "Each backup code can only be used once. Keep them secure and don't share them with anyone.",
"generateNew": "Generate New Backup Codes",
"download": "Download Backup Codes",
"copyToClipboard": "Copy to Clipboard",
"savedMessage": "I've Saved My Backup Codes",
"available": "{count} backup codes available",
"instructions": [
"• Save these codes in a secure location",
"• Each backup code can only be used once",
"• You can generate new codes anytime"
]
},
"verification": {
"title": "Two-Factor Authentication",
"description": "Enter the 6-digit code from your authenticator app",
"backupDescription": "Enter one of your backup codes to continue",
"verificationCode": "Verification Code",
"backupCode": "Backup Code",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verify",
"verifying": "Verifying...",
"useBackupCode": "Use backup code instead",
"useAuthenticatorCode": "Use authenticator code instead",
"rememberDevice": "Remember this device for 30 days",
"rememberDeviceDescription": "You won't need to enter 2FA codes on this device for 30 days"
},
"trustedDevices": {
"title": "Trusted Devices - 2FA",
"description": "Devices that don't require 2FA verification",
"noDevices": "No trusted devices",
"deviceName": "Device",
"addedOn": "Added on",
"expiresOn": "Expires on",
"remove": "Remove",
"removeAll": "Remove All",
"confirmRemove": "Are you sure you want to remove this trusted device?",
"confirmRemoveAll": "Are you sure you want to remove all trusted devices?",
"deviceRemoved": "Trusted device removed successfully",
"allDevicesRemoved": "All trusted devices removed successfully",
"loadFailed": "Failed to load trusted devices",
"removeFailed": "Failed to remove trusted device",
"removeAllFailed": "Failed to remove all trusted devices",
"loading": "Loading trusted devices...",
"noDevicesDescription": "Devices will appear here when you choose to trust them during 2FA verification",
"tableHeaders": {
"device": "Device",
"added": "Added",
"expires": "Expires",
"lastUsed": "Last Used",
"ipAddress": "IP Address",
"actions": "Actions"
},
"status": {
"never": "Never",
"expired": "Expired"
},
"modals": {
"removeDevice": {
"title": "Remove Trusted Device",
"added": "Added:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Remove All Trusted Devices",
"description": "This will remove {count} trusted device{count, plural, =1 {} other {s}}. You will need to verify 2FA on all devices again."
},
"buttons": {
"cancel": "Cancel",
"removing": "Removing...",
"removeDevice": "Remove Device",
"removeAllDevices": "Remove All Devices"
}
}
},
"messages": {
"enabledSuccess": "Two-factor authentication enabled successfully!",
"disabledSuccess": "Two-factor authentication disabled successfully",
"backupCodesGenerated": "New backup codes generated successfully",
"backupCodesCopied": "Backup codes copied to clipboard",
"setupFailed": "Failed to generate 2FA setup",
"verificationFailed": "Invalid verification code",
"disableFailed": "Failed to disable 2FA. Please check your password.",
"backupCodesFailed": "Failed to generate backup codes",
"backupCodesCopyFailed": "Failed to copy backup codes",
"statusLoadFailed": "Failed to load 2FA status",
"enterVerificationCode": "Please enter the verification code",
"enterPassword": "Please enter your password",
"deviceTrusted": "This device has been marked as trusted for 30 days"
},
"errors": {
"invalidVerificationCode": "Invalid verification code",
"invalidTwoFactorCode": "Invalid two-factor authentication code",
"twoFactorRequired": "Two-factor authentication required",
"twoFactorAlreadyEnabled": "Two-factor authentication is already enabled",
"twoFactorNotEnabled": "Two-factor authentication is not enabled",
"passwordVerificationRequired": "Password verification required",
"invalidPassword": "Invalid password",
"userNotFound": "User not found"
},
"deviceNames": {
"unknownDevice": "Unknown Device",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " on Windows",
"macos": " on macOS",
"linux": " on Linux",
"iphone": " on iPhone",
"android": " on Android"
}
}
},
"uploadFile": {
"title": "Upload File",
"multipleTitle": "Upload Files",
@@ -1542,101 +1713,5 @@
"passwordMinLength": "Password must be at least 6 characters",
"nameRequired": "Name is required",
"required": "This field is required"
},
"twoFactor": {
"title": "Two-Factor Authentication",
"description": "Add an extra layer of security to your account",
"enabled": "Your account is protected with two-factor authentication",
"disabled": "Two-factor authentication is not enabled",
"setup": {
"title": "Enable Two-Factor Authentication",
"description": "Scan the QR code with your authenticator app, then enter the verification code.",
"qrCode": "QR Code",
"manualEntryKey": "Manual Entry Key",
"verificationCode": "Verification Code",
"verificationCodePlaceholder": "Enter 6-digit code",
"verificationCodeDescription": "Enter the 6-digit code from your authenticator app",
"verifyAndEnable": "Verify & Enable",
"cancel": "Cancel"
},
"disable": {
"title": "Disable Two-Factor Authentication",
"description": "Enter your password to confirm disabling two-factor authentication.",
"password": "Password",
"passwordPlaceholder": "Enter your password",
"confirm": "Confirm Disable",
"cancel": "Cancel"
},
"backupCodes": {
"title": "Backup Codes",
"description": "Save these backup codes in a safe place. You can use them to access your account if you lose your authenticator device.",
"warning": "Important:",
"warningText": "Each backup code can only be used once. Keep them secure and don't share them with anyone.",
"generateNew": "Generate New Backup Codes",
"download": "Download Backup Codes",
"copyToClipboard": "Copy to Clipboard",
"savedMessage": "I've Saved My Backup Codes",
"available": "{count} backup codes available",
"instructions": [
"• Save these codes in a secure location",
"• Each backup code can only be used once",
"• You can generate new codes anytime"
]
},
"verification": {
"title": "Two-Factor Authentication",
"description": "Enter the 6-digit code from your authenticator app",
"backupDescription": "Enter one of your backup codes to continue",
"verificationCode": "Verification Code",
"backupCode": "Backup Code",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verify",
"verifying": "Verifying...",
"useBackupCode": "Use backup code instead",
"useAuthenticatorCode": "Use authenticator code instead",
"rememberDevice": "Remember this device for 30 days",
"rememberDeviceDescription": "You won't need to enter 2FA codes on this device for 30 days"
},
"messages": {
"enabledSuccess": "Two-factor authentication enabled successfully!",
"disabledSuccess": "Two-factor authentication disabled successfully",
"backupCodesGenerated": "New backup codes generated successfully",
"backupCodesCopied": "Backup codes copied to clipboard",
"setupFailed": "Failed to generate 2FA setup",
"verificationFailed": "Invalid verification code",
"disableFailed": "Failed to disable 2FA. Please check your password.",
"backupCodesFailed": "Failed to generate backup codes",
"backupCodesCopyFailed": "Failed to copy backup codes",
"statusLoadFailed": "Failed to load 2FA status",
"enterVerificationCode": "Please enter the verification code",
"enterPassword": "Please enter your password",
"deviceTrusted": "This device has been marked as trusted for 30 days"
},
"errors": {
"invalidVerificationCode": "Invalid verification code",
"invalidTwoFactorCode": "Invalid two-factor authentication code",
"twoFactorRequired": "Two-factor authentication required",
"twoFactorAlreadyEnabled": "Two-factor authentication is already enabled",
"twoFactorNotEnabled": "Two-factor authentication is not enabled",
"passwordVerificationRequired": "Password verification required",
"invalidPassword": "Invalid password",
"userNotFound": "User not found"
}
},
"iconPicker": {
"title": "Select Icon",
"placeholder": "Select an icon",
"searchPlaceholder": "Search icons...",
"loadingMore": "Loading more icons...",
"allIconsLoaded": "All {count} icons loaded",
"noIconsFound": "No icons found for \"{search}\"",
"tabs": {
"all": "All Icons",
"popular": "Popular",
"auth": "Auth Providers"
},
"stats": "{iconCount} icons from {libraryCount} libraries",
"categoryBadge": "{category} ({count} icons)"
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Guardando...",
"update": "Actualizar",
"click": "Haga clic para",
"creating": "Creando..."
"creating": "Creando...",
"loadingSimple": "Cargando..."
},
"createShare": {
"title": "Crear Compartir",
@@ -189,7 +190,8 @@
"Password verification required": "Se requiere verificación de contraseña",
"Two-factor authentication is already enabled": "La autenticación de dos factores ya está habilitada",
"Two-factor authentication is not enabled": "La autenticación de dos factores no está habilitada",
"Two-factor authentication required": "Se requiere autenticación de dos factores"
"Two-factor authentication required": "Se requiere autenticación de dos factores",
"noUserData": "No hay datos del usuario"
},
"fileActions": {
"editFile": "Editar archivo",
@@ -338,6 +340,21 @@
},
"pageTitle": "Inicio"
},
"iconPicker": {
"title": "Seleccionar Icono",
"placeholder": "Seleccionar un icono",
"searchPlaceholder": "Buscar iconos...",
"loadingMore": "Cargando más iconos...",
"allIconsLoaded": "Todos los {count} iconos cargados",
"noIconsFound": "No se encontraron iconos para \"{search}\"",
"tabs": {
"all": "Todos los Iconos",
"popular": "Populares",
"auth": "Proveedores de Autenticación"
},
"stats": "{iconCount} iconos de {libraryCount} bibliotecas",
"categoryBadge": "{category} ({count} iconos)"
},
"login": {
"welcome": "Bienvenido a",
"signInToContinue": "Inicia sesión para continuar",
@@ -1426,6 +1443,160 @@
"dark": "Oscuro",
"system": "Sistema"
},
"twoFactor": {
"title": "Autenticación de dos factores",
"description": "Añade una capa extra de seguridad a tu cuenta",
"enabled": "Tu cuenta está protegida con autenticación de dos factores",
"disabled": "La autenticación de dos factores no está habilitada",
"setup": {
"title": "Habilitar autenticación de dos factores",
"description": "Escanea el código QR con tu aplicación de autenticación y luego ingresa el código de verificación.",
"qrCode": "Código QR",
"manualEntryKey": "Clave de entrada manual",
"verificationCode": "Código de verificación",
"verificationCodePlaceholder": "Ingresa el código de 6 dígitos",
"verificationCodeDescription": "Ingresa el código de 6 dígitos de tu aplicación de autenticación",
"verifyAndEnable": "Verificar y habilitar",
"cancel": "Cancelar"
},
"disable": {
"title": "Deshabilitar autenticación de dos factores",
"description": "Ingresa tu contraseña para confirmar la desactivación de la autenticación de dos factores.",
"password": "Contraseña",
"passwordPlaceholder": "Ingresa tu contraseña",
"confirm": "Confirmar desactivación",
"cancel": "Cancelar"
},
"backupCodes": {
"title": "Códigos de respaldo",
"description": "Guarda estos códigos de respaldo en un lugar seguro. Puedes usarlos para acceder a tu cuenta si pierdes tu dispositivo de autenticación.",
"warning": "Importante:",
"warningText": "Cada código de respaldo solo se puede usar una vez. Mantenlos seguros y no los compartas con nadie.",
"generateNew": "Generar nuevos códigos de respaldo",
"download": "Descargar códigos de respaldo",
"copyToClipboard": "Copiar al portapapeles",
"savedMessage": "He guardado mis códigos de respaldo",
"available": "{count} códigos de respaldo disponibles",
"instructions": [
"• Guarda estos códigos en un lugar seguro",
"• Cada código de respaldo solo se puede usar una vez",
"• Puedes generar nuevos códigos en cualquier momento"
]
},
"verification": {
"title": "Autenticación de dos factores",
"description": "Ingresa el código de 6 dígitos de tu aplicación de autenticación",
"backupDescription": "Ingresa uno de tus códigos de respaldo para continuar",
"verificationCode": "Código de verificación",
"backupCode": "Código de respaldo",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verificar",
"verifying": "Verificando...",
"useBackupCode": "Usar código de respaldo en su lugar",
"useAuthenticatorCode": "Usar código de autenticación en su lugar",
"rememberDevice": "Recordar este dispositivo durante 30 días",
"rememberDeviceDescription": "No necesitarás ingresar códigos 2FA en este dispositivo durante 30 días"
},
"messages": {
"enabledSuccess": "¡Autenticación de dos factores habilitada exitosamente!",
"disabledSuccess": "Autenticación de dos factores deshabilitada exitosamente",
"backupCodesGenerated": "Nuevos códigos de respaldo generados exitosamente",
"backupCodesCopied": "Códigos de respaldo copiados al portapapeles",
"setupFailed": "Error al generar la configuración de 2FA",
"verificationFailed": "Código de verificación inválido",
"disableFailed": "Error al deshabilitar 2FA. Por favor verifica tu contraseña.",
"backupCodesFailed": "Error al generar códigos de respaldo",
"backupCodesCopyFailed": "Error al copiar códigos de respaldo",
"statusLoadFailed": "Error al cargar el estado de 2FA",
"enterVerificationCode": "Por favor ingresa el código de verificación",
"enterPassword": "Por favor ingresa tu contraseña",
"deviceTrusted": "Este dispositivo ha sido marcado como confiable durante 30 días"
},
"errors": {
"invalidVerificationCode": "Código de verificación inválido",
"invalidTwoFactorCode": "Código de autenticación de dos factores inválido",
"twoFactorRequired": "Se requiere autenticación de dos factores",
"twoFactorAlreadyEnabled": "La autenticación de dos factores ya está habilitada",
"twoFactorNotEnabled": "La autenticación de dos factores no está habilitada",
"passwordVerificationRequired": "Se requiere verificación de contraseña",
"invalidPassword": "Contraseña inválida",
"userNotFound": "Usuario no encontrado"
},
"buttons": {
"enable2FA": "Habilitar 2FA",
"disable2FA": "Deshabilitar 2FA"
},
"deviceNames": {
"unknownDevice": "Dispositivo Desconocido",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " en Windows",
"macos": " en macOS",
"linux": " en Linux",
"iphone": " en iPhone",
"android": " en Android"
}
},
"status": {
"label": "Estado:",
"enabled": "Habilitado",
"disabled": "Deshabilitado"
},
"trustedDevices": {
"title": "Dispositivos Confiables - 2FA",
"description": "Dispositivos que no requieren verificación 2FA",
"noDevices": "No hay dispositivos confiables",
"deviceName": "Dispositivo",
"addedOn": "Agregado el",
"expiresOn": "Expira el",
"remove": "Eliminar",
"removeAll": "Eliminar Todos",
"confirmRemove": "¿Estás seguro de que deseas eliminar este dispositivo confiable?",
"confirmRemoveAll": "¿Estás seguro de que deseas eliminar todos los dispositivos confiables?",
"deviceRemoved": "Dispositivo confiable eliminado exitosamente",
"allDevicesRemoved": "Todos los dispositivos confiables fueron eliminados exitosamente",
"loadFailed": "Error al cargar los dispositivos confiables",
"removeFailed": "Error al eliminar el dispositivo confiable",
"removeAllFailed": "Error al eliminar todos los dispositivos confiables",
"loading": "Cargando dispositivos confiables...",
"noDevicesDescription": "Los dispositivos aparecerán aquí cuando elijas confiar en ellos durante la verificación 2FA",
"tableHeaders": {
"device": "Dispositivo",
"added": "Agregado",
"expires": "Expira",
"lastUsed": "Último uso",
"ipAddress": "Dirección IP",
"actions": "Acciones"
},
"status": {
"never": "Nunca",
"expired": "Expirado"
},
"modals": {
"removeDevice": {
"title": "Eliminar Dispositivo Confiable",
"added": "Agregado:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Eliminar Todos los Dispositivos Confiables",
"description": "Esto eliminará {count} dispositivo{count, plural, =1 {} other {s}} confiable{count, plural, =1 {} other {s}}. Necesitarás verificar 2FA en todos los dispositivos nuevamente."
},
"buttons": {
"cancel": "Cancelar",
"removing": "Eliminando...",
"removeDevice": "Eliminar Dispositivo",
"removeAllDevices": "Eliminar Todos los Dispositivos"
}
}
}
},
"uploadFile": {
"title": "Subir archivo",
"multipleTitle": "Subir Múltiples Archivos",
@@ -1542,98 +1713,5 @@
"passwordRequired": "Se requiere la contraseña",
"nameRequired": "El nombre es obligatorio",
"required": "Este campo es obligatorio"
},
"iconPicker": {
"title": "Seleccionar Icono",
"placeholder": "Seleccionar un icono",
"searchPlaceholder": "Buscar iconos...",
"loadingMore": "Cargando más iconos...",
"allIconsLoaded": "Todos los {count} iconos cargados",
"noIconsFound": "No se encontraron iconos para \"{search}\"",
"tabs": {
"all": "Todos los Iconos",
"popular": "Populares",
"auth": "Proveedores de Autenticación"
},
"stats": "{iconCount} iconos de {libraryCount} bibliotecas",
"categoryBadge": "{category} ({count} iconos)"
},
"twoFactor": {
"title": "Autenticación de dos factores",
"description": "Añade una capa extra de seguridad a tu cuenta",
"enabled": "Tu cuenta está protegida con autenticación de dos factores",
"disabled": "La autenticación de dos factores no está habilitada",
"setup": {
"title": "Habilitar autenticación de dos factores",
"description": "Escanea el código QR con tu aplicación de autenticación y luego ingresa el código de verificación.",
"qrCode": "Código QR",
"manualEntryKey": "Clave de entrada manual",
"verificationCode": "Código de verificación",
"verificationCodePlaceholder": "Ingresa el código de 6 dígitos",
"verificationCodeDescription": "Ingresa el código de 6 dígitos de tu aplicación de autenticación",
"verifyAndEnable": "Verificar y habilitar",
"cancel": "Cancelar"
},
"disable": {
"title": "Deshabilitar autenticación de dos factores",
"description": "Ingresa tu contraseña para confirmar la desactivación de la autenticación de dos factores.",
"password": "Contraseña",
"passwordPlaceholder": "Ingresa tu contraseña",
"confirm": "Confirmar desactivación",
"cancel": "Cancelar"
},
"backupCodes": {
"title": "Códigos de respaldo",
"description": "Guarda estos códigos de respaldo en un lugar seguro. Puedes usarlos para acceder a tu cuenta si pierdes tu dispositivo de autenticación.",
"warning": "Importante:",
"warningText": "Cada código de respaldo solo se puede usar una vez. Mantenlos seguros y no los compartas con nadie.",
"generateNew": "Generar nuevos códigos de respaldo",
"download": "Descargar códigos de respaldo",
"copyToClipboard": "Copiar al portapapeles",
"savedMessage": "He guardado mis códigos de respaldo",
"available": "{count} códigos de respaldo disponibles",
"instructions": [
"• Guarda estos códigos en un lugar seguro",
"• Cada código de respaldo solo se puede usar una vez",
"• Puedes generar nuevos códigos en cualquier momento"
]
},
"verification": {
"title": "Autenticación de dos factores",
"description": "Ingresa el código de 6 dígitos de tu aplicación de autenticación",
"backupDescription": "Ingresa uno de tus códigos de respaldo para continuar",
"verificationCode": "Código de verificación",
"backupCode": "Código de respaldo",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verificar",
"verifying": "Verificando...",
"useBackupCode": "Usar código de respaldo en su lugar",
"useAuthenticatorCode": "Usar código de autenticación en su lugar"
},
"messages": {
"enabledSuccess": "¡Autenticación de dos factores habilitada exitosamente!",
"disabledSuccess": "Autenticación de dos factores deshabilitada exitosamente",
"backupCodesGenerated": "Nuevos códigos de respaldo generados exitosamente",
"backupCodesCopied": "Códigos de respaldo copiados al portapapeles",
"setupFailed": "Error al generar la configuración de 2FA",
"verificationFailed": "Código de verificación inválido",
"disableFailed": "Error al deshabilitar 2FA. Por favor verifica tu contraseña.",
"backupCodesFailed": "Error al generar códigos de respaldo",
"backupCodesCopyFailed": "Error al copiar códigos de respaldo",
"statusLoadFailed": "Error al cargar el estado de 2FA",
"enterVerificationCode": "Por favor ingresa el código de verificación",
"enterPassword": "Por favor ingresa tu contraseña"
},
"errors": {
"invalidVerificationCode": "Código de verificación inválido",
"invalidTwoFactorCode": "Código de autenticación de dos factores inválido",
"twoFactorRequired": "Se requiere autenticación de dos factores",
"twoFactorAlreadyEnabled": "La autenticación de dos factores ya está habilitada",
"twoFactorNotEnabled": "La autenticación de dos factores no está habilitada",
"passwordVerificationRequired": "Se requiere verificación de contraseña",
"invalidPassword": "Contraseña inválida",
"userNotFound": "Usuario no encontrado"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Enregistrement...",
"update": "Mettre à jour",
"click": "Clique para",
"creating": "Criando..."
"creating": "Criando...",
"loadingSimple": "Chargement..."
},
"createShare": {
"title": "Créer un Partage",
@@ -189,7 +190,8 @@
"Password verification required": "Vérification du mot de passe requise",
"Two-factor authentication is already enabled": "L'authentification à deux facteurs est déjà activée",
"Two-factor authentication is not enabled": "L'authentification à deux facteurs n'est pas activée",
"Two-factor authentication required": "L'authentification à deux facteurs est requise"
"Two-factor authentication required": "L'authentification à deux facteurs est requise",
"noUserData": "Aucune donnée utilisateur"
},
"fileActions": {
"editFile": "Modifier le Fichier",
@@ -338,6 +340,21 @@
},
"pageTitle": "Accueil"
},
"iconPicker": {
"title": "Sélectionner une Icône",
"placeholder": "Sélectionner une icône",
"searchPlaceholder": "Rechercher des icônes...",
"loadingMore": "Chargement d'autres icônes...",
"allIconsLoaded": "Toutes les {count} icônes sont chargées",
"noIconsFound": "Aucune icône trouvée pour \"{search}\"",
"tabs": {
"all": "Toutes les Icônes",
"popular": "Populaires",
"auth": "Fournisseurs d'Authentification"
},
"stats": "{iconCount} icônes de {libraryCount} bibliothèques",
"categoryBadge": "{category} ({count} icônes)"
},
"login": {
"welcome": "Bienvenue à",
"signInToContinue": "Connectez-vous pour continuer",
@@ -1426,6 +1443,160 @@
"dark": "Sombre",
"system": "Système"
},
"twoFactor": {
"title": "Authentification à Deux Facteurs",
"description": "Ajoutez une couche de sécurité supplémentaire à votre compte",
"enabled": "Votre compte est protégé par l'authentification à deux facteurs",
"disabled": "L'authentification à deux facteurs n'est pas activée",
"setup": {
"title": "Activer l'Authentification à Deux Facteurs",
"description": "Scannez le code QR avec votre application d'authentification, puis saisissez le code de vérification.",
"qrCode": "Code QR",
"manualEntryKey": "Clé de Saisie Manuelle",
"verificationCode": "Code de Vérification",
"verificationCodePlaceholder": "Entrez le code à 6 chiffres",
"verificationCodeDescription": "Saisissez le code à 6 chiffres de votre application d'authentification",
"verifyAndEnable": "Vérifier et Activer",
"cancel": "Annuler"
},
"disable": {
"title": "Désactiver l'Authentification à Deux Facteurs",
"description": "Saisissez votre mot de passe pour confirmer la désactivation de l'authentification à deux facteurs.",
"password": "Mot de passe",
"passwordPlaceholder": "Entrez votre mot de passe",
"confirm": "Confirmer la Désactivation",
"cancel": "Annuler"
},
"backupCodes": {
"title": "Codes de Secours",
"description": "Conservez ces codes de secours dans un endroit sûr. Vous pouvez les utiliser pour accéder à votre compte si vous perdez votre appareil d'authentification.",
"warning": "Important :",
"warningText": "Chaque code de secours ne peut être utilisé qu'une seule fois. Gardez-les en sécurité et ne les partagez avec personne.",
"generateNew": "Générer de Nouveaux Codes de Secours",
"download": "Télécharger les Codes de Secours",
"copyToClipboard": "Copier dans le Presse-papiers",
"savedMessage": "J'ai Sauvegardé Mes Codes de Secours",
"available": "{count} codes de secours disponibles",
"instructions": [
"• Sauvegardez ces codes dans un endroit sécurisé",
"• Chaque code de secours ne peut être utilisé qu'une seule fois",
"• Vous pouvez générer de nouveaux codes à tout moment"
]
},
"verification": {
"title": "Authentification à Deux Facteurs",
"description": "Saisissez le code à 6 chiffres de votre application d'authentification",
"backupDescription": "Saisissez l'un de vos codes de secours pour continuer",
"verificationCode": "Code de Vérification",
"backupCode": "Code de Secours",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Vérifier",
"verifying": "Vérification en cours...",
"useBackupCode": "Utiliser un code de secours à la place",
"useAuthenticatorCode": "Utiliser le code d'authentification à la place",
"rememberDevice": "Se souvenir de cet appareil pendant 30 jours",
"rememberDeviceDescription": "Vous n'aurez pas besoin de saisir de codes 2FA sur cet appareil pendant 30 jours"
},
"messages": {
"enabledSuccess": "L'authentification à deux facteurs a été activée avec succès !",
"disabledSuccess": "L'authentification à deux facteurs a été désactivée avec succès",
"backupCodesGenerated": "Nouveaux codes de secours générés avec succès",
"backupCodesCopied": "Codes de secours copiés dans le presse-papiers",
"setupFailed": "Échec de la génération de la configuration 2FA",
"verificationFailed": "Code de vérification invalide",
"disableFailed": "Échec de la désactivation de la 2FA. Veuillez vérifier votre mot de passe.",
"backupCodesFailed": "Échec de la génération des codes de secours",
"backupCodesCopyFailed": "Échec de la copie des codes de secours",
"statusLoadFailed": "Échec du chargement du statut 2FA",
"enterVerificationCode": "Veuillez saisir le code de vérification",
"enterPassword": "Veuillez saisir votre mot de passe",
"deviceTrusted": "Cet appareil a été marqué comme fiable pendant 30 jours"
},
"errors": {
"invalidVerificationCode": "Code de vérification invalide",
"invalidTwoFactorCode": "Code d'authentification à deux facteurs invalide",
"twoFactorRequired": "L'authentification à deux facteurs est requise",
"twoFactorAlreadyEnabled": "L'authentification à deux facteurs est déjà activée",
"twoFactorNotEnabled": "L'authentification à deux facteurs n'est pas activée",
"passwordVerificationRequired": "Vérification du mot de passe requise",
"invalidPassword": "Mot de passe invalide",
"userNotFound": "Utilisateur non trouvé"
},
"buttons": {
"enable2FA": "Activer 2FA",
"disable2FA": "Désactiver 2FA"
},
"deviceNames": {
"unknownDevice": "Appareil Inconnu",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " sur Windows",
"macos": " sur macOS",
"linux": " sur Linux",
"iphone": " sur iPhone",
"android": " sur Android"
}
},
"status": {
"label": "Statut :",
"enabled": "Activé",
"disabled": "Désactivé"
},
"trustedDevices": {
"title": "Appareils de Confiance - 2FA",
"description": "Appareils qui ne nécessitent pas de vérification 2FA",
"noDevices": "Aucun appareil de confiance",
"deviceName": "Appareil",
"addedOn": "Ajouté le",
"expiresOn": "Expire le",
"remove": "Supprimer",
"removeAll": "Tout Supprimer",
"confirmRemove": "Êtes-vous sûr de vouloir supprimer cet appareil de confiance ?",
"confirmRemoveAll": "Êtes-vous sûr de vouloir supprimer tous les appareils de confiance ?",
"deviceRemoved": "Appareil de confiance supprimé avec succès",
"allDevicesRemoved": "Tous les appareils de confiance ont été supprimés avec succès",
"loadFailed": "Échec du chargement des appareils de confiance",
"removeFailed": "Échec de la suppression de l'appareil de confiance",
"removeAllFailed": "Échec de la suppression de tous les appareils de confiance",
"loading": "Chargement des appareils de confiance...",
"noDevicesDescription": "Les appareils apparaîtront ici lorsque vous choisirez de leur faire confiance lors de la vérification 2FA",
"tableHeaders": {
"device": "Appareil",
"added": "Ajouté",
"expires": "Expire",
"lastUsed": "Dernière Utilisation",
"ipAddress": "Adresse IP",
"actions": "Actions"
},
"status": {
"never": "Jamais",
"expired": "Expiré"
},
"modals": {
"removeDevice": {
"title": "Supprimer l'Appareil de Confiance",
"added": "Ajouté :",
"ip": "IP :"
},
"removeAllDevices": {
"title": "Supprimer Tous les Appareils de Confiance",
"description": "Cela supprimera {count} appareil{count, plural, =1 {} other {s}} de confiance. Vous devrez vérifier la 2FA sur tous les appareils à nouveau."
},
"buttons": {
"cancel": "Annuler",
"removing": "Suppression...",
"removeDevice": "Supprimer l'Appareil",
"removeAllDevices": "Supprimer Tous les Appareils"
}
}
}
},
"uploadFile": {
"title": "Télécharger fichier",
"multipleTitle": "Télécharger Plusieurs Fichiers",
@@ -1542,98 +1713,5 @@
"passwordRequired": "Le mot de passe est requis",
"nameRequired": "Nome é obrigatório",
"required": "Este campo é obrigatório"
},
"iconPicker": {
"title": "Sélectionner une Icône",
"placeholder": "Sélectionner une icône",
"searchPlaceholder": "Rechercher des icônes...",
"loadingMore": "Chargement d'autres icônes...",
"allIconsLoaded": "Toutes les {count} icônes sont chargées",
"noIconsFound": "Aucune icône trouvée pour \"{search}\"",
"tabs": {
"all": "Toutes les Icônes",
"popular": "Populaires",
"auth": "Fournisseurs d'Authentification"
},
"stats": "{iconCount} icônes de {libraryCount} bibliothèques",
"categoryBadge": "{category} ({count} icônes)"
},
"twoFactor": {
"title": "Authentification à Deux Facteurs",
"description": "Ajoutez une couche de sécurité supplémentaire à votre compte",
"enabled": "Votre compte est protégé par l'authentification à deux facteurs",
"disabled": "L'authentification à deux facteurs n'est pas activée",
"setup": {
"title": "Activer l'Authentification à Deux Facteurs",
"description": "Scannez le code QR avec votre application d'authentification, puis saisissez le code de vérification.",
"qrCode": "Code QR",
"manualEntryKey": "Clé de Saisie Manuelle",
"verificationCode": "Code de Vérification",
"verificationCodePlaceholder": "Entrez le code à 6 chiffres",
"verificationCodeDescription": "Saisissez le code à 6 chiffres de votre application d'authentification",
"verifyAndEnable": "Vérifier et Activer",
"cancel": "Annuler"
},
"disable": {
"title": "Désactiver l'Authentification à Deux Facteurs",
"description": "Saisissez votre mot de passe pour confirmer la désactivation de l'authentification à deux facteurs.",
"password": "Mot de passe",
"passwordPlaceholder": "Entrez votre mot de passe",
"confirm": "Confirmer la Désactivation",
"cancel": "Annuler"
},
"backupCodes": {
"title": "Codes de Secours",
"description": "Conservez ces codes de secours dans un endroit sûr. Vous pouvez les utiliser pour accéder à votre compte si vous perdez votre appareil d'authentification.",
"warning": "Important :",
"warningText": "Chaque code de secours ne peut être utilisé qu'une seule fois. Gardez-les en sécurité et ne les partagez avec personne.",
"generateNew": "Générer de Nouveaux Codes de Secours",
"download": "Télécharger les Codes de Secours",
"copyToClipboard": "Copier dans le Presse-papiers",
"savedMessage": "J'ai Sauvegardé Mes Codes de Secours",
"available": "{count} codes de secours disponibles",
"instructions": [
"• Sauvegardez ces codes dans un endroit sécurisé",
"• Chaque code de secours ne peut être utilisé qu'une seule fois",
"• Vous pouvez générer de nouveaux codes à tout moment"
]
},
"verification": {
"title": "Authentification à Deux Facteurs",
"description": "Saisissez le code à 6 chiffres de votre application d'authentification",
"backupDescription": "Saisissez l'un de vos codes de secours pour continuer",
"verificationCode": "Code de Vérification",
"backupCode": "Code de Secours",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Vérifier",
"verifying": "Vérification en cours...",
"useBackupCode": "Utiliser un code de secours à la place",
"useAuthenticatorCode": "Utiliser le code d'authentification à la place"
},
"messages": {
"enabledSuccess": "L'authentification à deux facteurs a été activée avec succès !",
"disabledSuccess": "L'authentification à deux facteurs a été désactivée avec succès",
"backupCodesGenerated": "Nouveaux codes de secours générés avec succès",
"backupCodesCopied": "Codes de secours copiés dans le presse-papiers",
"setupFailed": "Échec de la génération de la configuration 2FA",
"verificationFailed": "Code de vérification invalide",
"disableFailed": "Échec de la désactivation de la 2FA. Veuillez vérifier votre mot de passe.",
"backupCodesFailed": "Échec de la génération des codes de secours",
"backupCodesCopyFailed": "Échec de la copie des codes de secours",
"statusLoadFailed": "Échec du chargement du statut 2FA",
"enterVerificationCode": "Veuillez saisir le code de vérification",
"enterPassword": "Veuillez saisir votre mot de passe"
},
"errors": {
"invalidVerificationCode": "Code de vérification invalide",
"invalidTwoFactorCode": "Code d'authentification à deux facteurs invalide",
"twoFactorRequired": "L'authentification à deux facteurs est requise",
"twoFactorAlreadyEnabled": "L'authentification à deux facteurs est déjà activée",
"twoFactorNotEnabled": "L'authentification à deux facteurs n'est pas activée",
"passwordVerificationRequired": "Vérification du mot de passe requise",
"invalidPassword": "Mot de passe invalide",
"userNotFound": "Utilisateur non trouvé"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "सहेज रहा है...",
"update": "अपडेट करें",
"click": "क्लिक करें",
"creating": "बना रहा है..."
"creating": "बना रहा है...",
"loadingSimple": "लोड हो रहा है..."
},
"createShare": {
"title": "साझाकरण बनाएं",
@@ -189,7 +190,8 @@
"Password verification required": "पासवर्ड सत्यापन आवश्यक है",
"Two-factor authentication is already enabled": "दो-कारक प्रमाणीकरण पहले से सक्षम है",
"Two-factor authentication is not enabled": "दो-कारक प्रमाणीकरण सक्षम नहीं है",
"Two-factor authentication required": "दो-कारक प्रमाणीकरण आवश्यक है"
"Two-factor authentication required": "दो-कारक प्रमाणीकरण आवश्यक है",
"noUserData": "उपयोगकर्ता डेटा नहीं मिला"
},
"fileActions": {
"editFile": "फाइल संपादित करें",
@@ -338,6 +340,21 @@
},
"pageTitle": "होम"
},
"iconPicker": {
"title": "आइकन चुनें",
"placeholder": "एक आइकन चुनें",
"searchPlaceholder": "आइकन खोजें...",
"loadingMore": "अधिक आइकन लोड हो रहे हैं...",
"allIconsLoaded": "सभी {count} आइकन लोड हो गए",
"noIconsFound": "\"{search}\" के लिए कोई आइकन नहीं मिला",
"tabs": {
"all": "सभी आइकन",
"popular": "लोकप्रिय",
"auth": "प्रमाणीकरण प्रदाता"
},
"stats": "{libraryCount} लाइब्रेरी से {iconCount} आइकन",
"categoryBadge": "{category} ({count} आइकन)"
},
"login": {
"welcome": "स्वागत है में",
"signInToContinue": "जारी रखने के लिए साइन इन करें",
@@ -1426,6 +1443,160 @@
"dark": "डार्क",
"system": "सिस्टम"
},
"twoFactor": {
"title": "दो-कारक प्रमाणीकरण",
"description": "अपने खाते में अतिरिक्त सुरक्षा स्तर जोड़ें",
"enabled": "आपका खाता दो-कारक प्रमाणीकरण से सुरक्षित है",
"disabled": "दो-कारक प्रमाणीकरण सक्षम नहीं है",
"setup": {
"title": "दो-कारक प्रमाणीकरण सक्षम करें",
"description": "अपने प्रमाणीकरण ऐप से QR कोड स्कैन करें, फिर सत्यापन कोड दर्ज करें।",
"qrCode": "QR कोड",
"manualEntryKey": "मैनुअल एंट्री कुंजी",
"verificationCode": "सत्यापन कोड",
"verificationCodePlaceholder": "6-अंकों का कोड दर्ज करें",
"verificationCodeDescription": "अपने प्रमाणीकरण ऐप से 6-अंकों का कोड दर्ज करें",
"verifyAndEnable": "सत्यापित करें और सक्षम करें",
"cancel": "रद्द करें"
},
"disable": {
"title": "दो-कारक प्रमाणीकरण अक्षम करें",
"description": "दो-कारक प्रमाणीकरण को अक्षम करने की पुष्टि के लिए अपना पासवर्ड दर्ज करें।",
"password": "पासवर्ड",
"passwordPlaceholder": "अपना पासवर्ड दर्ज करें",
"confirm": "अक्षम करने की पुष्टि करें",
"cancel": "रद्द करें"
},
"backupCodes": {
"title": "बैकअप कोड",
"description": "इन बैकअप कोड को सुरक्षित स्थान पर सहेजें। यदि आप अपना प्रमाणीकरण डिवाइस खो देते हैं तो आप इनका उपयोग अपने खाते तक पहुंचने के लिए कर सकते हैं।",
"warning": "महत्वपूर्ण:",
"warningText": "प्रत्येक बैकअप कोड का उपयोग केवल एक बार किया जा सकता है। उन्हें सुरक्षित रखें और किसी के साथ साझा न करें।",
"generateNew": "नए बैकअप कोड जनरेट करें",
"download": "बैकअप कोड डाउनलोड करें",
"copyToClipboard": "क्लिपबोर्ड पर कॉपी करें",
"savedMessage": "मैंने अपने बैकअप कोड सहेज लिए हैं",
"available": "{count} बैकअप कोड उपलब्ध हैं",
"instructions": [
"• इन कोड को सुरक्षित स्थान पर सहेजें",
"• प्रत्येक बैकअप कोड का उपयोग केवल एक बार किया जा सकता है",
"• आप कभी भी नए कोड जनरेट कर सकते हैं"
]
},
"verification": {
"title": "दो-कारक प्रमाणीकरण",
"description": "अपने प्रमाणीकरण ऐप से 6-अंकों का कोड दर्ज करें",
"backupDescription": "जारी रखने के लिए अपने बैकअप कोड में से एक दर्ज करें",
"verificationCode": "सत्यापन कोड",
"backupCode": "बैकअप कोड",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "सत्यापित करें",
"verifying": "सत्यापन हो रहा है...",
"useBackupCode": "इसके बजाय बैकअप कोड का उपयोग करें",
"useAuthenticatorCode": "इसके बजाय प्रमाणीकरण कोड का उपयोग करें",
"rememberDevice": "इस डिवाइस को 30 दिनों के लिए याद रखें",
"rememberDeviceDescription": "आपको इस डिवाइस पर 30 दिनों तक 2FA कोड दर्ज करने की आवश्यकता नहीं होगी"
},
"messages": {
"enabledSuccess": "दो-कारक प्रमाणीकरण सफलतापूर्वक सक्षम किया गया!",
"disabledSuccess": "दो-कारक प्रमाणीकरण सफलतापूर्वक अक्षम किया गया",
"backupCodesGenerated": "नए बैकअप कोड सफलतापूर्वक जनरेट किए गए",
"backupCodesCopied": "बैकअप कोड क्लिपबोर्ड पर कॉपी किए गए",
"setupFailed": "2FA सेटअप जनरेट करने में विफल",
"verificationFailed": "अमान्य सत्यापन कोड",
"disableFailed": "2FA अक्षम करने में विफल। कृपया अपना पासवर्ड जांचें।",
"backupCodesFailed": "बैकअप कोड जनरेट करने में विफल",
"backupCodesCopyFailed": "बैकअप कोड कॉपी करने में विफल",
"statusLoadFailed": "2FA स्थिति लोड करने में विफल",
"enterVerificationCode": "कृपया सत्यापन कोड दर्ज करें",
"enterPassword": "कृपया अपना पासवर्ड दर्ज करें",
"deviceTrusted": "यह डिवाइस 30 दिनों के लिए विश्वसनीय के रूप में चिह्नित किया गया है"
},
"errors": {
"invalidVerificationCode": "अमान्य सत्यापन कोड",
"invalidTwoFactorCode": "अमान्य दो-कारक प्रमाणीकरण कोड",
"twoFactorRequired": "दो-कारक प्रमाणीकरण आवश्यक है",
"twoFactorAlreadyEnabled": "दो-कारक प्रमाणीकरण पहले से सक्षम है",
"twoFactorNotEnabled": "दो-कारक प्रमाणीकरण सक्षम नहीं है",
"passwordVerificationRequired": "पासवर्ड सत्यापन आवश्यक है",
"invalidPassword": "अमान्य पासवर्ड",
"userNotFound": "उपयोगकर्ता नहीं मिला"
},
"buttons": {
"enable2FA": "2FA सक्षम करें",
"disable2FA": "2FA अक्षम करें"
},
"deviceNames": {
"unknownDevice": "अज्ञात डिवाइस",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " Windows पर",
"macos": " macOS पर",
"linux": " Linux पर",
"iphone": " iPhone पर",
"android": " Android पर"
}
},
"status": {
"label": "स्थिति:",
"enabled": "सक्षम",
"disabled": "अक्षम"
},
"trustedDevices": {
"title": "विश्वसनीय डिवाइस - 2FA",
"description": "डिवाइस जिन्हें 2FA सत्यापन की आवश्यकता नहीं है",
"noDevices": "कोई विश्वसनीय डिवाइस नहीं",
"deviceName": "डिवाइस",
"addedOn": "जोड़ा गया",
"expiresOn": "समाप्ति तिथि",
"remove": "हटाएं",
"removeAll": "सभी हटाएं",
"confirmRemove": "क्या आप वाकई इस विश्वसनीय डिवाइस को हटाना चाहते हैं?",
"confirmRemoveAll": "क्या आप वाकई सभी विश्वसनीय डिवाइस हटाना चाहते हैं?",
"deviceRemoved": "विश्वसनीय डिवाइस सफलतापूर्वक हटाया गया",
"allDevicesRemoved": "सभी विश्वसनीय डिवाइस सफलतापूर्वक हटाए गए",
"loadFailed": "विश्वसनीय डिवाइस लोड करने में विफल",
"removeFailed": "विश्वसनीय डिवाइस हटाने में विफल",
"removeAllFailed": "सभी विश्वसनीय डिवाइस हटाने में विफल",
"loading": "विश्वसनीय डिवाइस लोड हो रहे हैं...",
"noDevicesDescription": "जब आप 2FA सत्यापन के दौरान उन्हें विश्वसनीय मानने का चयन करेंगे तो डिवाइस यहां दिखाई देंगे",
"tableHeaders": {
"device": "डिवाइस",
"added": "जोड़ा गया",
"expires": "समाप्ति",
"lastUsed": "अंतिम उपयोग",
"ipAddress": "IP पता",
"actions": "कार्रवाई"
},
"status": {
"never": "कभी नहीं",
"expired": "समाप्त"
},
"modals": {
"removeDevice": {
"title": "विश्वसनीय डिवाइस हटाएं",
"added": "जोड़ा गया:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "सभी विश्वसनीय डिवाइस हटाएं",
"description": "यह {count} विश्वसनीय डिवाइस{count, plural, =1 {} other {s}} को हटा देगा। आपको सभी डिवाइस पर फिर से 2FA सत्यापित करना होगा।"
},
"buttons": {
"cancel": "रद्द करें",
"removing": "हटाया जा रहा है...",
"removeDevice": "डिवाइस हटाएं",
"removeAllDevices": "सभी डिवाइस हटाएं"
}
}
}
},
"uploadFile": {
"title": "फ़ाइल अपलोड करें",
"multipleTitle": "कई फ़ाइलें अपलोड करें",
@@ -1542,98 +1713,5 @@
"passwordRequired": "पासवर्ड आवश्यक है",
"nameRequired": "नाम आवश्यक है",
"required": "यह फ़ील्ड आवश्यक है"
},
"iconPicker": {
"title": "आइकन चुनें",
"placeholder": "एक आइकन चुनें",
"searchPlaceholder": "आइकन खोजें...",
"loadingMore": "अधिक आइकन लोड हो रहे हैं...",
"allIconsLoaded": "सभी {count} आइकन लोड हो गए",
"noIconsFound": "\"{search}\" के लिए कोई आइकन नहीं मिला",
"tabs": {
"all": "सभी आइकन",
"popular": "लोकप्रिय",
"auth": "प्रमाणीकरण प्रदाता"
},
"stats": "{libraryCount} लाइब्रेरी से {iconCount} आइकन",
"categoryBadge": "{category} ({count} आइकन)"
},
"twoFactor": {
"title": "दो-कारक प्रमाणीकरण",
"description": "अपने खाते में अतिरिक्त सुरक्षा स्तर जोड़ें",
"enabled": "आपका खाता दो-कारक प्रमाणीकरण से सुरक्षित है",
"disabled": "दो-कारक प्रमाणीकरण सक्षम नहीं है",
"setup": {
"title": "दो-कारक प्रमाणीकरण सक्षम करें",
"description": "अपने प्रमाणीकरण ऐप से QR कोड स्कैन करें, फिर सत्यापन कोड दर्ज करें।",
"qrCode": "QR कोड",
"manualEntryKey": "मैनुअल एंट्री कुंजी",
"verificationCode": "सत्यापन कोड",
"verificationCodePlaceholder": "6-अंकों का कोड दर्ज करें",
"verificationCodeDescription": "अपने प्रमाणीकरण ऐप से 6-अंकों का कोड दर्ज करें",
"verifyAndEnable": "सत्यापित करें और सक्षम करें",
"cancel": "रद्द करें"
},
"disable": {
"title": "दो-कारक प्रमाणीकरण अक्षम करें",
"description": "दो-कारक प्रमाणीकरण को अक्षम करने की पुष्टि के लिए अपना पासवर्ड दर्ज करें।",
"password": "पासवर्ड",
"passwordPlaceholder": "अपना पासवर्ड दर्ज करें",
"confirm": "अक्षम करने की पुष्टि करें",
"cancel": "रद्द करें"
},
"backupCodes": {
"title": "बैकअप कोड",
"description": "इन बैकअप कोड को सुरक्षित स्थान पर सहेजें। यदि आप अपना प्रमाणीकरण डिवाइस खो देते हैं तो आप इनका उपयोग अपने खाते तक पहुंचने के लिए कर सकते हैं।",
"warning": "महत्वपूर्ण:",
"warningText": "प्रत्येक बैकअप कोड का उपयोग केवल एक बार किया जा सकता है। उन्हें सुरक्षित रखें और किसी के साथ साझा न करें।",
"generateNew": "नए बैकअप कोड जनरेट करें",
"download": "बैकअप कोड डाउनलोड करें",
"copyToClipboard": "क्लिपबोर्ड पर कॉपी करें",
"savedMessage": "मैंने अपने बैकअप कोड सहेज लिए हैं",
"available": "{count} बैकअप कोड उपलब्ध हैं",
"instructions": [
"• इन कोड को सुरक्षित स्थान पर सहेजें",
"• प्रत्येक बैकअप कोड का उपयोग केवल एक बार किया जा सकता है",
"• आप कभी भी नए कोड जनरेट कर सकते हैं"
]
},
"verification": {
"title": "दो-कारक प्रमाणीकरण",
"description": "अपने प्रमाणीकरण ऐप से 6-अंकों का कोड दर्ज करें",
"backupDescription": "जारी रखने के लिए अपने बैकअप कोड में से एक दर्ज करें",
"verificationCode": "सत्यापन कोड",
"backupCode": "बैकअप कोड",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "सत्यापित करें",
"verifying": "सत्यापन हो रहा है...",
"useBackupCode": "इसके बजाय बैकअप कोड का उपयोग करें",
"useAuthenticatorCode": "इसके बजाय प्रमाणीकरण कोड का उपयोग करें"
},
"messages": {
"enabledSuccess": "दो-कारक प्रमाणीकरण सफलतापूर्वक सक्षम किया गया!",
"disabledSuccess": "दो-कारक प्रमाणीकरण सफलतापूर्वक अक्षम किया गया",
"backupCodesGenerated": "नए बैकअप कोड सफलतापूर्वक जनरेट किए गए",
"backupCodesCopied": "बैकअप कोड क्लिपबोर्ड पर कॉपी किए गए",
"setupFailed": "2FA सेटअप जनरेट करने में विफल",
"verificationFailed": "अमान्य सत्यापन कोड",
"disableFailed": "2FA अक्षम करने में विफल। कृपया अपना पासवर्ड जांचें।",
"backupCodesFailed": "बैकअप कोड जनरेट करने में विफल",
"backupCodesCopyFailed": "बैकअप कोड कॉपी करने में विफल",
"statusLoadFailed": "2FA स्थिति लोड करने में विफल",
"enterVerificationCode": "कृपया सत्यापन कोड दर्ज करें",
"enterPassword": "कृपया अपना पासवर्ड दर्ज करें"
},
"errors": {
"invalidVerificationCode": "अमान्य सत्यापन कोड",
"invalidTwoFactorCode": "अमान्य दो-कारक प्रमाणीकरण कोड",
"twoFactorRequired": "दो-कारक प्रमाणीकरण आवश्यक है",
"twoFactorAlreadyEnabled": "दो-कारक प्रमाणीकरण पहले से सक्षम है",
"twoFactorNotEnabled": "दो-कारक प्रमाणीकरण सक्षम नहीं है",
"passwordVerificationRequired": "पासवर्ड सत्यापन आवश्यक है",
"invalidPassword": "अमान्य पासवर्ड",
"userNotFound": "उपयोगकर्ता नहीं मिला"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Salvataggio...",
"update": "Aggiorna",
"click": "Clicca per",
"creating": "Creazione in corso..."
"creating": "Creazione in corso...",
"loadingSimple": "Caricamento..."
},
"createShare": {
"title": "Crea Condivisione",
@@ -189,7 +190,8 @@
"Password verification required": "Verifica della password richiesta",
"Two-factor authentication is already enabled": "L'autenticazione a due fattori è già abilitata",
"Two-factor authentication is not enabled": "L'autenticazione a due fattori non è abilitata",
"Two-factor authentication required": "Autenticazione a due fattori richiesta"
"Two-factor authentication required": "Autenticazione a due fattori richiesta",
"noUserData": "Nessun dato utente"
},
"fileActions": {
"editFile": "Modifica File",
@@ -338,6 +340,21 @@
},
"pageTitle": "Pagina iniziale"
},
"iconPicker": {
"title": "Seleziona Icona",
"placeholder": "Seleziona un'icona",
"searchPlaceholder": "Cerca icone...",
"loadingMore": "Caricamento altre icone...",
"allIconsLoaded": "Tutte le {count} icone caricate",
"noIconsFound": "Nessuna icona trovata per \"{search}\"",
"tabs": {
"all": "Tutte le Icone",
"popular": "Popolari",
"auth": "Provider di Autenticazione"
},
"stats": "{iconCount} icone da {libraryCount} librerie",
"categoryBadge": "{category} ({count} icone)"
},
"login": {
"welcome": "Benvenuto in",
"signInToContinue": "Accedi per continuare",
@@ -1426,6 +1443,160 @@
"dark": "Scuro",
"system": "Sistema"
},
"twoFactor": {
"title": "Autenticazione a Due Fattori",
"description": "Aggiungi un ulteriore livello di sicurezza al tuo account",
"enabled": "Il tuo account è protetto con l'autenticazione a due fattori",
"disabled": "L'autenticazione a due fattori non è abilitata",
"setup": {
"title": "Abilita Autenticazione a Due Fattori",
"description": "Scansiona il codice QR con la tua app di autenticazione, quindi inserisci il codice di verifica.",
"qrCode": "Codice QR",
"manualEntryKey": "Chiave per Inserimento Manuale",
"verificationCode": "Codice di Verifica",
"verificationCodePlaceholder": "Inserisci il codice a 6 cifre",
"verificationCodeDescription": "Inserisci il codice a 6 cifre dalla tua app di autenticazione",
"verifyAndEnable": "Verifica e Abilita",
"cancel": "Annulla"
},
"disable": {
"title": "Disabilita Autenticazione a Due Fattori",
"description": "Inserisci la tua password per confermare la disabilitazione dell'autenticazione a due fattori.",
"password": "Password",
"passwordPlaceholder": "Inserisci la tua password",
"confirm": "Conferma Disabilitazione",
"cancel": "Annulla"
},
"backupCodes": {
"title": "Codici di Backup",
"description": "Salva questi codici di backup in un luogo sicuro. Puoi usarli per accedere al tuo account se perdi il tuo dispositivo di autenticazione.",
"warning": "Importante:",
"warningText": "Ogni codice di backup può essere utilizzato una sola volta. Conservali in modo sicuro e non condividerli con nessuno.",
"generateNew": "Genera Nuovi Codici di Backup",
"download": "Scarica Codici di Backup",
"copyToClipboard": "Copia negli Appunti",
"savedMessage": "Ho Salvato i Miei Codici di Backup",
"available": "{count} codici di backup disponibili",
"instructions": [
"• Salva questi codici in un luogo sicuro",
"• Ogni codice di backup può essere utilizzato una sola volta",
"• Puoi generare nuovi codici in qualsiasi momento"
]
},
"verification": {
"title": "Autenticazione a Due Fattori",
"description": "Inserisci il codice a 6 cifre dalla tua app di autenticazione",
"backupDescription": "Inserisci uno dei tuoi codici di backup per continuare",
"verificationCode": "Codice di Verifica",
"backupCode": "Codice di Backup",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verifica",
"verifying": "Verifica in corso...",
"useBackupCode": "Usa invece un codice di backup",
"useAuthenticatorCode": "Usa invece il codice dell'autenticatore",
"rememberDevice": "Ricorda questo dispositivo per 30 giorni",
"rememberDeviceDescription": "Non dovrai inserire codici 2FA su questo dispositivo per 30 giorni"
},
"messages": {
"enabledSuccess": "Autenticazione a due fattori abilitata con successo!",
"disabledSuccess": "Autenticazione a due fattori disabilitata con successo",
"backupCodesGenerated": "Nuovi codici di backup generati con successo",
"backupCodesCopied": "Codici di backup copiati negli appunti",
"setupFailed": "Impossibile generare la configurazione 2FA",
"verificationFailed": "Codice di verifica non valido",
"disableFailed": "Impossibile disabilitare 2FA. Verifica la tua password.",
"backupCodesFailed": "Impossibile generare i codici di backup",
"backupCodesCopyFailed": "Impossibile copiare i codici di backup",
"statusLoadFailed": "Impossibile caricare lo stato 2FA",
"enterVerificationCode": "Inserisci il codice di verifica",
"enterPassword": "Inserisci la tua password",
"deviceTrusted": "Questo dispositivo è stato contrassegnato come affidabile per 30 giorni"
},
"errors": {
"invalidVerificationCode": "Codice di verifica non valido",
"invalidTwoFactorCode": "Codice di autenticazione a due fattori non valido",
"twoFactorRequired": "Autenticazione a due fattori richiesta",
"twoFactorAlreadyEnabled": "L'autenticazione a due fattori è già abilitata",
"twoFactorNotEnabled": "L'autenticazione a due fattori non è abilitata",
"passwordVerificationRequired": "Verifica password richiesta",
"invalidPassword": "Password non valida",
"userNotFound": "Utente non trovato"
},
"buttons": {
"enable2FA": "Abilita 2FA",
"disable2FA": "Disabilita 2FA"
},
"deviceNames": {
"unknownDevice": "Dispositivo Sconosciuto",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " su Windows",
"macos": " su macOS",
"linux": " su Linux",
"iphone": " su iPhone",
"android": " su Android"
}
},
"status": {
"label": "Stato:",
"enabled": "Abilitato",
"disabled": "Disabilitato"
},
"trustedDevices": {
"title": "Dispositivi Affidabili - 2FA",
"description": "Dispositivi che non richiedono la verifica 2FA",
"noDevices": "Nessun dispositivo affidabile",
"deviceName": "Dispositivo",
"addedOn": "Aggiunto il",
"expiresOn": "Scade il",
"remove": "Rimuovi",
"removeAll": "Rimuovi Tutti",
"confirmRemove": "Sei sicuro di voler rimuovere questo dispositivo affidabile?",
"confirmRemoveAll": "Sei sicuro di voler rimuovere tutti i dispositivi affidabili?",
"deviceRemoved": "Dispositivo affidabile rimosso con successo",
"allDevicesRemoved": "Tutti i dispositivi affidabili rimossi con successo",
"loadFailed": "Impossibile caricare i dispositivi affidabili",
"removeFailed": "Impossibile rimuovere il dispositivo affidabile",
"removeAllFailed": "Impossibile rimuovere tutti i dispositivi affidabili",
"loading": "Caricamento dispositivi affidabili...",
"noDevicesDescription": "I dispositivi appariranno qui quando scegli di fidarti di loro durante la verifica 2FA",
"tableHeaders": {
"device": "Dispositivo",
"added": "Aggiunto",
"expires": "Scade",
"lastUsed": "Ultimo Utilizzo",
"ipAddress": "Indirizzo IP",
"actions": "Azioni"
},
"status": {
"never": "Mai",
"expired": "Scaduto"
},
"modals": {
"removeDevice": {
"title": "Rimuovi Dispositivo Affidabile",
"added": "Aggiunto:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Rimuovi Tutti i Dispositivi Affidabili",
"description": "Questo rimuoverà {count} dispositivo{count, plural, =1 {} other {i}} affidabile{count, plural, =1 {} other {i}}. Dovrai verificare 2FA su tutti i dispositivi nuovamente."
},
"buttons": {
"cancel": "Annulla",
"removing": "Rimozione in corso...",
"removeDevice": "Rimuovi Dispositivo",
"removeAllDevices": "Rimuovi Tutti i Dispositivi"
}
}
}
},
"uploadFile": {
"title": "Carica file",
"multipleTitle": "Carica Più File",
@@ -1542,98 +1713,5 @@
"passwordMinLength": "La password deve contenere almeno 6 caratteri",
"nameRequired": "Il nome è obbligatorio",
"required": "Questo campo è obbligatorio"
},
"iconPicker": {
"title": "Seleziona Icona",
"placeholder": "Seleziona un'icona",
"searchPlaceholder": "Cerca icone...",
"loadingMore": "Caricamento altre icone...",
"allIconsLoaded": "Tutte le {count} icone caricate",
"noIconsFound": "Nessuna icona trovata per \"{search}\"",
"tabs": {
"all": "Tutte le Icone",
"popular": "Popolari",
"auth": "Provider di Autenticazione"
},
"stats": "{iconCount} icone da {libraryCount} librerie",
"categoryBadge": "{category} ({count} icone)"
},
"twoFactor": {
"title": "Autenticazione a Due Fattori",
"description": "Aggiungi un ulteriore livello di sicurezza al tuo account",
"enabled": "Il tuo account è protetto con l'autenticazione a due fattori",
"disabled": "L'autenticazione a due fattori non è abilitata",
"setup": {
"title": "Abilita Autenticazione a Due Fattori",
"description": "Scansiona il codice QR con la tua app di autenticazione, quindi inserisci il codice di verifica.",
"qrCode": "Codice QR",
"manualEntryKey": "Chiave per Inserimento Manuale",
"verificationCode": "Codice di Verifica",
"verificationCodePlaceholder": "Inserisci il codice a 6 cifre",
"verificationCodeDescription": "Inserisci il codice a 6 cifre dalla tua app di autenticazione",
"verifyAndEnable": "Verifica e Abilita",
"cancel": "Annulla"
},
"disable": {
"title": "Disabilita Autenticazione a Due Fattori",
"description": "Inserisci la tua password per confermare la disabilitazione dell'autenticazione a due fattori.",
"password": "Password",
"passwordPlaceholder": "Inserisci la tua password",
"confirm": "Conferma Disabilitazione",
"cancel": "Annulla"
},
"backupCodes": {
"title": "Codici di Backup",
"description": "Salva questi codici di backup in un luogo sicuro. Puoi usarli per accedere al tuo account se perdi il tuo dispositivo di autenticazione.",
"warning": "Importante:",
"warningText": "Ogni codice di backup può essere utilizzato una sola volta. Conservali in modo sicuro e non condividerli con nessuno.",
"generateNew": "Genera Nuovi Codici di Backup",
"download": "Scarica Codici di Backup",
"copyToClipboard": "Copia negli Appunti",
"savedMessage": "Ho Salvato i Miei Codici di Backup",
"available": "{count} codici di backup disponibili",
"instructions": [
"• Salva questi codici in un luogo sicuro",
"• Ogni codice di backup può essere utilizzato una sola volta",
"• Puoi generare nuovi codici in qualsiasi momento"
]
},
"verification": {
"title": "Autenticazione a Due Fattori",
"description": "Inserisci il codice a 6 cifre dalla tua app di autenticazione",
"backupDescription": "Inserisci uno dei tuoi codici di backup per continuare",
"verificationCode": "Codice di Verifica",
"backupCode": "Codice di Backup",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verifica",
"verifying": "Verifica in corso...",
"useBackupCode": "Usa invece un codice di backup",
"useAuthenticatorCode": "Usa invece il codice dell'autenticatore"
},
"messages": {
"enabledSuccess": "Autenticazione a due fattori abilitata con successo!",
"disabledSuccess": "Autenticazione a due fattori disabilitata con successo",
"backupCodesGenerated": "Nuovi codici di backup generati con successo",
"backupCodesCopied": "Codici di backup copiati negli appunti",
"setupFailed": "Impossibile generare la configurazione 2FA",
"verificationFailed": "Codice di verifica non valido",
"disableFailed": "Impossibile disabilitare 2FA. Verifica la tua password.",
"backupCodesFailed": "Impossibile generare i codici di backup",
"backupCodesCopyFailed": "Impossibile copiare i codici di backup",
"statusLoadFailed": "Impossibile caricare lo stato 2FA",
"enterVerificationCode": "Inserisci il codice di verifica",
"enterPassword": "Inserisci la tua password"
},
"errors": {
"invalidVerificationCode": "Codice di verifica non valido",
"invalidTwoFactorCode": "Codice di autenticazione a due fattori non valido",
"twoFactorRequired": "Autenticazione a due fattori richiesta",
"twoFactorAlreadyEnabled": "L'autenticazione a due fattori è già abilitata",
"twoFactorNotEnabled": "L'autenticazione a due fattori non è abilitata",
"passwordVerificationRequired": "Verifica password richiesta",
"invalidPassword": "Password non valida",
"userNotFound": "Utente non trovato"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "保存中...",
"update": "更新",
"click": "クリックして",
"creating": "作成中..."
"creating": "作成中...",
"loadingSimple": "読み込み中..."
},
"createShare": {
"title": "共有を作成",
@@ -189,7 +190,8 @@
"Password verification required": "パスワードの確認が必要です",
"Two-factor authentication is already enabled": "二要素認証は既に有効になっています",
"Two-factor authentication is not enabled": "二要素認証が有効になっていません",
"Two-factor authentication required": "二要素認証が必要です"
"Two-factor authentication required": "二要素認証が必要です",
"noUserData": "ユーザーデータがありません"
},
"fileActions": {
"editFile": "ファイルを編集",
@@ -338,6 +340,21 @@
},
"pageTitle": "ホーム"
},
"iconPicker": {
"title": "アイコンを選択",
"placeholder": "アイコンを選択してください",
"searchPlaceholder": "アイコンを検索...",
"loadingMore": "アイコンを読み込み中...",
"allIconsLoaded": "全{count}個のアイコンを読み込みました",
"noIconsFound": "\"{search}\"に一致するアイコンが見つかりませんでした",
"tabs": {
"all": "すべてのアイコン",
"popular": "人気",
"auth": "認証プロバイダー"
},
"stats": "{libraryCount}ライブラリから{iconCount}個のアイコン",
"categoryBadge": "{category}{count}個のアイコン)"
},
"login": {
"welcome": "ようこそへ",
"signInToContinue": "続行するにはサインインしてください",
@@ -1426,6 +1443,160 @@
"dark": "ダーク",
"system": "システム"
},
"twoFactor": {
"title": "二要素認証",
"description": "アカウントにセキュリティ層を追加",
"enabled": "アカウントは二要素認証で保護されています",
"disabled": "二要素認証は有効になっていません",
"setup": {
"title": "二要素認証を有効にする",
"description": "認証アプリでQRコードをスキャンし、確認コードを入力してください。",
"qrCode": "QRコード",
"manualEntryKey": "手動入力キー",
"verificationCode": "確認コード",
"verificationCodePlaceholder": "6桁のコードを入力",
"verificationCodeDescription": "認証アプリから6桁のコードを入力してください",
"verifyAndEnable": "確認して有効化",
"cancel": "キャンセル"
},
"disable": {
"title": "二要素認証を無効にする",
"description": "二要素認証を無効にするには、パスワードを入力して確認してください。",
"password": "パスワード",
"passwordPlaceholder": "パスワードを入力",
"confirm": "無効化を確認",
"cancel": "キャンセル"
},
"backupCodes": {
"title": "バックアップコード",
"description": "これらのバックアップコードを安全な場所に保管してください。認証デバイスを紛失した場合、アカウントへのアクセスに使用できます。",
"warning": "重要:",
"warningText": "各バックアップコードは1回のみ使用できます。安全に保管し、誰とも共有しないでください。",
"generateNew": "新しいバックアップコードを生成",
"download": "バックアップコードをダウンロード",
"copyToClipboard": "クリップボードにコピー",
"savedMessage": "バックアップコードを保存しました",
"available": "利用可能なバックアップコード:{count}個",
"instructions": [
"• これらのコードを安全な場所に保管してください",
"• 各バックアップコードは1回のみ使用できます",
"• いつでも新しいコードを生成できます"
]
},
"verification": {
"title": "二要素認証",
"description": "認証アプリから6桁のコードを入力してください",
"backupDescription": "続行するにはバックアップコードを入力してください",
"verificationCode": "確認コード",
"backupCode": "バックアップコード",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "確認",
"verifying": "確認中...",
"useBackupCode": "代わりにバックアップコードを使用",
"useAuthenticatorCode": "代わりに認証アプリのコードを使用",
"rememberDevice": "このデバイスを30日間記憶する",
"rememberDeviceDescription": "このデバイスでは30日間2FAコードを入力する必要はありません"
},
"messages": {
"enabledSuccess": "二要素認証が正常に有効化されました!",
"disabledSuccess": "二要素認証が正常に無効化されました",
"backupCodesGenerated": "新しいバックアップコードが正常に生成されました",
"backupCodesCopied": "バックアップコードがクリップボードにコピーされました",
"setupFailed": "2FA設定の生成に失敗しました",
"verificationFailed": "確認コードが無効です",
"disableFailed": "2FAの無効化に失敗しました。パスワードを確認してください。",
"backupCodesFailed": "バックアップコードの生成に失敗しました",
"backupCodesCopyFailed": "バックアップコードのコピーに失敗しました",
"statusLoadFailed": "2FAステータスの読み込みに失敗しました",
"enterVerificationCode": "確認コードを入力してください",
"enterPassword": "パスワードを入力してください",
"deviceTrusted": "このデバイスは30日間信頼できるデバイスとしてマークされました"
},
"errors": {
"invalidVerificationCode": "確認コードが無効です",
"invalidTwoFactorCode": "二要素認証コードが無効です",
"twoFactorRequired": "二要素認証が必要です",
"twoFactorAlreadyEnabled": "二要素認証はすでに有効になっています",
"twoFactorNotEnabled": "二要素認証が有効になっていません",
"passwordVerificationRequired": "パスワードの確認が必要です",
"invalidPassword": "パスワードが無効です",
"userNotFound": "ユーザーが見つかりません"
},
"buttons": {
"enable2FA": "2FAを有効にする",
"disable2FA": "2FAを無効にする"
},
"deviceNames": {
"unknownDevice": "不明なデバイス",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " on Windows",
"macos": " on macOS",
"linux": " on Linux",
"iphone": " on iPhone",
"android": " on Android"
}
},
"status": {
"label": "状態:",
"enabled": "有効",
"disabled": "無効"
},
"trustedDevices": {
"title": "信頼済みデバイス - 2FA",
"description": "2FA認証が不要なデバイス",
"noDevices": "信頼済みデバイスはありません",
"deviceName": "デバイス",
"addedOn": "追加日",
"expiresOn": "有効期限",
"remove": "削除",
"removeAll": "すべて削除",
"confirmRemove": "この信頼済みデバイスを削除してもよろしいですか?",
"confirmRemoveAll": "すべての信頼済みデバイスを削除してもよろしいですか?",
"deviceRemoved": "信頼済みデバイスが正常に削除されました",
"allDevicesRemoved": "すべての信頼済みデバイスが正常に削除されました",
"loadFailed": "信頼済みデバイスの読み込みに失敗しました",
"removeFailed": "信頼済みデバイスの削除に失敗しました",
"removeAllFailed": "すべての信頼済みデバイスの削除に失敗しました",
"loading": "信頼済みデバイスを読み込み中...",
"noDevicesDescription": "2FA認証時にデバイスを信頼するように選択すると、ここに表示されます",
"tableHeaders": {
"device": "デバイス",
"added": "追加日",
"expires": "有効期限",
"lastUsed": "最終使用日",
"ipAddress": "IPアドレス",
"actions": "アクション"
},
"status": {
"never": "なし",
"expired": "期限切れ"
},
"modals": {
"removeDevice": {
"title": "信頼済みデバイスを削除",
"added": "追加日:",
"ip": "IP"
},
"removeAllDevices": {
"title": "すべての信頼済みデバイスを削除",
"description": "{count}個の信頼済みデバイスを削除します。すべてのデバイスで再度2FA認証が必要になります。"
},
"buttons": {
"cancel": "キャンセル",
"removing": "削除中...",
"removeDevice": "デバイスを削除",
"removeAllDevices": "すべてのデバイスを削除"
}
}
}
},
"uploadFile": {
"title": "ファイルをアップロード",
"selectFile": "ファイルを選択するにはクリックしてください",
@@ -1542,98 +1713,5 @@
"passwordRequired": "パスワードは必須です",
"nameRequired": "名前は必須です",
"required": "このフィールドは必須です"
},
"iconPicker": {
"title": "アイコンを選択",
"placeholder": "アイコンを選択してください",
"searchPlaceholder": "アイコンを検索...",
"loadingMore": "アイコンを読み込み中...",
"allIconsLoaded": "全{count}個のアイコンを読み込みました",
"noIconsFound": "\"{search}\"に一致するアイコンが見つかりませんでした",
"tabs": {
"all": "すべてのアイコン",
"popular": "人気",
"auth": "認証プロバイダー"
},
"stats": "{libraryCount}ライブラリから{iconCount}個のアイコン",
"categoryBadge": "{category}{count}個のアイコン)"
},
"twoFactor": {
"title": "二要素認証",
"description": "アカウントにセキュリティ層を追加",
"enabled": "アカウントは二要素認証で保護されています",
"disabled": "二要素認証は有効になっていません",
"setup": {
"title": "二要素認証を有効にする",
"description": "認証アプリでQRコードをスキャンし、確認コードを入力してください。",
"qrCode": "QRコード",
"manualEntryKey": "手動入力キー",
"verificationCode": "確認コード",
"verificationCodePlaceholder": "6桁のコードを入力",
"verificationCodeDescription": "認証アプリから6桁のコードを入力してください",
"verifyAndEnable": "確認して有効化",
"cancel": "キャンセル"
},
"disable": {
"title": "二要素認証を無効にする",
"description": "二要素認証を無効にするには、パスワードを入力して確認してください。",
"password": "パスワード",
"passwordPlaceholder": "パスワードを入力",
"confirm": "無効化を確認",
"cancel": "キャンセル"
},
"backupCodes": {
"title": "バックアップコード",
"description": "これらのバックアップコードを安全な場所に保管してください。認証デバイスを紛失した場合、アカウントへのアクセスに使用できます。",
"warning": "重要:",
"warningText": "各バックアップコードは1回のみ使用できます。安全に保管し、誰とも共有しないでください。",
"generateNew": "新しいバックアップコードを生成",
"download": "バックアップコードをダウンロード",
"copyToClipboard": "クリップボードにコピー",
"savedMessage": "バックアップコードを保存しました",
"available": "利用可能なバックアップコード:{count}個",
"instructions": [
"• これらのコードを安全な場所に保管してください",
"• 各バックアップコードは1回のみ使用できます",
"• いつでも新しいコードを生成できます"
]
},
"verification": {
"title": "二要素認証",
"description": "認証アプリから6桁のコードを入力してください",
"backupDescription": "続行するにはバックアップコードを入力してください",
"verificationCode": "確認コード",
"backupCode": "バックアップコード",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "確認",
"verifying": "確認中...",
"useBackupCode": "代わりにバックアップコードを使用",
"useAuthenticatorCode": "代わりに認証アプリのコードを使用"
},
"messages": {
"enabledSuccess": "二要素認証が正常に有効化されました!",
"disabledSuccess": "二要素認証が正常に無効化されました",
"backupCodesGenerated": "新しいバックアップコードが正常に生成されました",
"backupCodesCopied": "バックアップコードがクリップボードにコピーされました",
"setupFailed": "2FA設定の生成に失敗しました",
"verificationFailed": "確認コードが無効です",
"disableFailed": "2FAの無効化に失敗しました。パスワードを確認してください。",
"backupCodesFailed": "バックアップコードの生成に失敗しました",
"backupCodesCopyFailed": "バックアップコードのコピーに失敗しました",
"statusLoadFailed": "2FAステータスの読み込みに失敗しました",
"enterVerificationCode": "確認コードを入力してください",
"enterPassword": "パスワードを入力してください"
},
"errors": {
"invalidVerificationCode": "確認コードが無効です",
"invalidTwoFactorCode": "二要素認証コードが無効です",
"twoFactorRequired": "二要素認証が必要です",
"twoFactorAlreadyEnabled": "二要素認証はすでに有効になっています",
"twoFactorNotEnabled": "二要素認証が有効になっていません",
"passwordVerificationRequired": "パスワードの確認が必要です",
"invalidPassword": "パスワードが無効です",
"userNotFound": "ユーザーが見つかりません"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "저장 중...",
"update": "업데이트",
"click": "클릭하여",
"creating": "생성 중..."
"creating": "생성 중...",
"loadingSimple": "로딩 중..."
},
"createShare": {
"title": "공유 생성",
@@ -189,7 +190,8 @@
"Password verification required": "비밀번호 확인이 필요합니다",
"Two-factor authentication is already enabled": "2단계 인증이 이미 활성화되어 있습니다",
"Two-factor authentication is not enabled": "2단계 인증이 활성화되어 있지 않습니다",
"Two-factor authentication required": "2단계 인증이 필요합니다"
"Two-factor authentication required": "2단계 인증이 필요합니다",
"noUserData": "사용자 데이터가 없습니다"
},
"fileActions": {
"editFile": "파일 편집",
@@ -338,6 +340,21 @@
},
"pageTitle": "홈"
},
"iconPicker": {
"title": "아이콘 선택",
"placeholder": "아이콘 선택",
"searchPlaceholder": "아이콘 검색...",
"loadingMore": "아이콘 더 불러오는 중...",
"allIconsLoaded": "모든 {count}개의 아이콘이 로드됨",
"noIconsFound": "\"{search}\"에 대한 아이콘을 찾을 수 없습니다",
"tabs": {
"all": "모든 아이콘",
"popular": "인기",
"auth": "인증 제공자"
},
"stats": "{libraryCount}개의 라이브러리에서 {iconCount}개의 아이콘",
"categoryBadge": "{category} ({count}개의 아이콘)"
},
"login": {
"welcome": "에 오신 것을 환영합니다",
"signInToContinue": "계속하려면 로그인하세요",
@@ -1426,6 +1443,160 @@
"dark": "다크",
"system": "시스템"
},
"twoFactor": {
"title": "2단계 인증",
"description": "계정에 추가 보안 계층 추가",
"enabled": "귀하의 계정은 2단계 인증으로 보호되고 있습니다",
"disabled": "2단계 인증이 활성화되지 않았습니다",
"setup": {
"title": "2단계 인증 활성화",
"description": "인증 앱으로 QR 코드를 스캔한 다음 인증 코드를 입력하세요.",
"qrCode": "QR 코드",
"manualEntryKey": "수동 입력 키",
"verificationCode": "인증 코드",
"verificationCodePlaceholder": "6자리 코드 입력",
"verificationCodeDescription": "인증 앱에서 6자리 코드를 입력하세요",
"verifyAndEnable": "확인 및 활성화",
"cancel": "취소"
},
"disable": {
"title": "2단계 인증 비활성화",
"description": "2단계 인증 비활성화를 확인하려면 비밀번호를 입력하세요.",
"password": "비밀번호",
"passwordPlaceholder": "비밀번호 입력",
"confirm": "비활성화 확인",
"cancel": "취소"
},
"backupCodes": {
"title": "백업 코드",
"description": "이 백업 코드를 안전한 곳에 보관하세요. 인증 기기를 분실한 경우 계정에 액세스하는 데 사용할 수 있습니다.",
"warning": "중요:",
"warningText": "각 백업 코드는 한 번만 사용할 수 있습니다. 안전하게 보관하고 다른 사람과 공유하지 마세요.",
"generateNew": "새 백업 코드 생성",
"download": "백업 코드 다운로드",
"copyToClipboard": "클립보드에 복사",
"savedMessage": "백업 코드를 저장했습니다",
"available": "사용 가능한 백업 코드 {count}개",
"instructions": [
"• 이 코드를 안전한 곳에 보관하세요",
"• 각 백업 코드는 한 번만 사용할 수 있습니다",
"• 언제든지 새 코드를 생성할 수 있습니다"
]
},
"verification": {
"title": "2단계 인증",
"description": "인증 앱에서 6자리 코드를 입력하세요",
"backupDescription": "계속하려면 백업 코드 중 하나를 입력하세요",
"verificationCode": "인증 코드",
"backupCode": "백업 코드",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "확인",
"verifying": "확인 중...",
"useBackupCode": "대신 백업 코드 사용",
"useAuthenticatorCode": "대신 인증 앱 코드 사용",
"rememberDevice": "이 기기를 30일 동안 기억하기",
"rememberDeviceDescription": "30일 동안 이 기기에서 2단계 인증 코드를 입력할 필요가 없습니다"
},
"messages": {
"enabledSuccess": "2단계 인증이 성공적으로 활성화되었습니다!",
"disabledSuccess": "2단계 인증이 성공적으로 비활성화되었습니다",
"backupCodesGenerated": "새 백업 코드가 성공적으로 생성되었습니다",
"backupCodesCopied": "백업 코드가 클립보드에 복사되었습니다",
"setupFailed": "2단계 인증 설정 생성 실패",
"verificationFailed": "잘못된 인증 코드",
"disableFailed": "2단계 인증 비활성화 실패. 비밀번호를 확인하세요.",
"backupCodesFailed": "백업 코드 생성 실패",
"backupCodesCopyFailed": "백업 코드 복사 실패",
"statusLoadFailed": "2단계 인증 상태 로드 실패",
"enterVerificationCode": "인증 코드를 입력하세요",
"enterPassword": "비밀번호를 입력하세요",
"deviceTrusted": "이 기기는 30일 동안 신뢰할 수 있는 기기로 표시되었습니다"
},
"errors": {
"invalidVerificationCode": "잘못된 인증 코드",
"invalidTwoFactorCode": "잘못된 2단계 인증 코드",
"twoFactorRequired": "2단계 인증이 필요합니다",
"twoFactorAlreadyEnabled": "2단계 인증이 이미 활성화되어 있습니다",
"twoFactorNotEnabled": "2단계 인증이 활성화되어 있지 않습니다",
"passwordVerificationRequired": "비밀번호 확인이 필요합니다",
"invalidPassword": "잘못된 비밀번호",
"userNotFound": "사용자를 찾을 수 없습니다"
},
"buttons": {
"enable2FA": "2단계 인증 활성화",
"disable2FA": "2단계 인증 비활성화"
},
"deviceNames": {
"unknownDevice": "알 수 없는 기기",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " Windows에서",
"macos": " macOS에서",
"linux": " Linux에서",
"iphone": " iPhone에서",
"android": " Android에서"
}
},
"status": {
"label": "상태:",
"enabled": "활성화됨",
"disabled": "비활성화됨"
},
"trustedDevices": {
"title": "신뢰할 수 있는 기기 - 2단계 인증",
"description": "2단계 인증 확인이 필요하지 않은 기기",
"noDevices": "신뢰할 수 있는 기기 없음",
"deviceName": "기기",
"addedOn": "추가된 날짜",
"expiresOn": "만료 날짜",
"remove": "제거",
"removeAll": "모두 제거",
"confirmRemove": "이 신뢰할 수 있는 기기를 제거하시겠습니까?",
"confirmRemoveAll": "모든 신뢰할 수 있는 기기를 제거하시겠습니까?",
"deviceRemoved": "신뢰할 수 있는 기기가 성공적으로 제거되었습니다",
"allDevicesRemoved": "모든 신뢰할 수 있는 기기가 성공적으로 제거되었습니다",
"loadFailed": "신뢰할 수 있는 기기 로드 실패",
"removeFailed": "신뢰할 수 있는 기기 제거 실패",
"removeAllFailed": "모든 신뢰할 수 있는 기기 제거 실패",
"loading": "신뢰할 수 있는 기기 로드 중...",
"noDevicesDescription": "2단계 인증 확인 중에 기기를 신뢰하도록 선택하면 여기에 표시됩니다",
"tableHeaders": {
"device": "기기",
"added": "추가됨",
"expires": "만료",
"lastUsed": "마지막 사용",
"ipAddress": "IP 주소",
"actions": "작업"
},
"status": {
"never": "없음",
"expired": "만료됨"
},
"modals": {
"removeDevice": {
"title": "신뢰할 수 있는 기기 제거",
"added": "추가됨:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "모든 신뢰할 수 있는 기기 제거",
"description": "{count}개의 신뢰할 수 있는 기기를 제거합니다. 모든 기기에서 다시 2단계 인증을 확인해야 합니다."
},
"buttons": {
"cancel": "취소",
"removing": "제거 중...",
"removeDevice": "기기 제거",
"removeAllDevices": "모든 기기 제거"
}
}
}
},
"uploadFile": {
"title": "파일 업로드",
"multipleTitle": "여러 파일 업로드",
@@ -1542,98 +1713,5 @@
"passwordRequired": "비밀번호는 필수입니다",
"nameRequired": "이름은 필수입니다",
"required": "이 필드는 필수입니다"
},
"iconPicker": {
"title": "아이콘 선택",
"placeholder": "아이콘 선택",
"searchPlaceholder": "아이콘 검색...",
"loadingMore": "아이콘 더 불러오는 중...",
"allIconsLoaded": "모든 {count}개의 아이콘이 로드됨",
"noIconsFound": "\"{search}\"에 대한 아이콘을 찾을 수 없습니다",
"tabs": {
"all": "모든 아이콘",
"popular": "인기",
"auth": "인증 제공자"
},
"stats": "{libraryCount}개의 라이브러리에서 {iconCount}개의 아이콘",
"categoryBadge": "{category} ({count}개의 아이콘)"
},
"twoFactor": {
"title": "2단계 인증",
"description": "계정에 추가 보안 계층 추가",
"enabled": "귀하의 계정은 2단계 인증으로 보호되고 있습니다",
"disabled": "2단계 인증이 활성화되지 않았습니다",
"setup": {
"title": "2단계 인증 활성화",
"description": "인증 앱으로 QR 코드를 스캔한 다음 인증 코드를 입력하세요.",
"qrCode": "QR 코드",
"manualEntryKey": "수동 입력 키",
"verificationCode": "인증 코드",
"verificationCodePlaceholder": "6자리 코드 입력",
"verificationCodeDescription": "인증 앱에서 6자리 코드를 입력하세요",
"verifyAndEnable": "확인 및 활성화",
"cancel": "취소"
},
"disable": {
"title": "2단계 인증 비활성화",
"description": "2단계 인증 비활성화를 확인하려면 비밀번호를 입력하세요.",
"password": "비밀번호",
"passwordPlaceholder": "비밀번호 입력",
"confirm": "비활성화 확인",
"cancel": "취소"
},
"backupCodes": {
"title": "백업 코드",
"description": "이 백업 코드를 안전한 곳에 보관하세요. 인증 기기를 분실한 경우 계정에 액세스하는 데 사용할 수 있습니다.",
"warning": "중요:",
"warningText": "각 백업 코드는 한 번만 사용할 수 있습니다. 안전하게 보관하고 다른 사람과 공유하지 마세요.",
"generateNew": "새 백업 코드 생성",
"download": "백업 코드 다운로드",
"copyToClipboard": "클립보드에 복사",
"savedMessage": "백업 코드를 저장했습니다",
"available": "사용 가능한 백업 코드 {count}개",
"instructions": [
"• 이 코드를 안전한 곳에 보관하세요",
"• 각 백업 코드는 한 번만 사용할 수 있습니다",
"• 언제든지 새 코드를 생성할 수 있습니다"
]
},
"verification": {
"title": "2단계 인증",
"description": "인증 앱에서 6자리 코드를 입력하세요",
"backupDescription": "계속하려면 백업 코드 중 하나를 입력하세요",
"verificationCode": "인증 코드",
"backupCode": "백업 코드",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "확인",
"verifying": "확인 중...",
"useBackupCode": "대신 백업 코드 사용",
"useAuthenticatorCode": "대신 인증 앱 코드 사용"
},
"messages": {
"enabledSuccess": "2단계 인증이 성공적으로 활성화되었습니다!",
"disabledSuccess": "2단계 인증이 성공적으로 비활성화되었습니다",
"backupCodesGenerated": "새 백업 코드가 성공적으로 생성되었습니다",
"backupCodesCopied": "백업 코드가 클립보드에 복사되었습니다",
"setupFailed": "2단계 인증 설정 생성 실패",
"verificationFailed": "잘못된 인증 코드",
"disableFailed": "2단계 인증 비활성화 실패. 비밀번호를 확인하세요.",
"backupCodesFailed": "백업 코드 생성 실패",
"backupCodesCopyFailed": "백업 코드 복사 실패",
"statusLoadFailed": "2단계 인증 상태 로드 실패",
"enterVerificationCode": "인증 코드를 입력하세요",
"enterPassword": "비밀번호를 입력하세요"
},
"errors": {
"invalidVerificationCode": "잘못된 인증 코드",
"invalidTwoFactorCode": "잘못된 2단계 인증 코드",
"twoFactorRequired": "2단계 인증이 필요합니다",
"twoFactorAlreadyEnabled": "2단계 인증이 이미 활성화되어 있습니다",
"twoFactorNotEnabled": "2단계 인증이 활성화되어 있지 않습니다",
"passwordVerificationRequired": "비밀번호 확인이 필요합니다",
"invalidPassword": "잘못된 비밀번호",
"userNotFound": "사용자를 찾을 수 없습니다"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Opslaan...",
"update": "Bijwerken",
"click": "Klik om",
"creating": "Maken..."
"creating": "Maken...",
"loadingSimple": "Laden..."
},
"createShare": {
"title": "Delen Maken",
@@ -189,7 +190,8 @@
"Password verification required": "Wachtwoordverificatie vereist",
"Two-factor authentication is already enabled": "Tweefactorauthenticatie is al ingeschakeld",
"Two-factor authentication is not enabled": "Tweefactorauthenticatie is niet ingeschakeld",
"Two-factor authentication required": "Tweefactorauthenticatie vereist"
"Two-factor authentication required": "Tweefactorauthenticatie vereist",
"noUserData": "Geen gebruikersgegevens"
},
"fileActions": {
"editFile": "Bestand Bewerken",
@@ -338,6 +340,21 @@
},
"pageTitle": "Startpagina"
},
"iconPicker": {
"title": "Selecteer Pictogram",
"placeholder": "Selecteer een pictogram",
"searchPlaceholder": "Zoek pictogrammen...",
"loadingMore": "Meer pictogrammen laden...",
"allIconsLoaded": "Alle {count} pictogrammen geladen",
"noIconsFound": "Geen pictogrammen gevonden voor \"{search}\"",
"tabs": {
"all": "Alle Pictogrammen",
"popular": "Populair",
"auth": "Authenticatie Providers"
},
"stats": "{iconCount} pictogrammen van {libraryCount} bibliotheken",
"categoryBadge": "{category} ({count} pictogrammen)"
},
"login": {
"welcome": "Welkom bij",
"signInToContinue": "Log in om door te gaan",
@@ -1426,6 +1443,160 @@
"dark": "Donker",
"system": "Systeem"
},
"twoFactor": {
"title": "Twee-Factor Authenticatie",
"description": "Voeg een extra beveiligingslaag toe aan uw account",
"enabled": "Uw account is beveiligd met twee-factor authenticatie",
"disabled": "Twee-factor authenticatie is niet ingeschakeld",
"setup": {
"title": "Twee-Factor Authenticatie Inschakelen",
"description": "Scan de QR-code met uw authenticator-app en voer vervolgens de verificatiecode in.",
"qrCode": "QR-Code",
"manualEntryKey": "Handmatige Invoersleutel",
"verificationCode": "Verificatiecode",
"verificationCodePlaceholder": "Voer 6-cijferige code in",
"verificationCodeDescription": "Voer de 6-cijferige code van uw authenticator-app in",
"verifyAndEnable": "Verifiëren & Inschakelen",
"cancel": "Annuleren"
},
"disable": {
"title": "Twee-Factor Authenticatie Uitschakelen",
"description": "Voer uw wachtwoord in om het uitschakelen van twee-factor authenticatie te bevestigen.",
"password": "Wachtwoord",
"passwordPlaceholder": "Voer uw wachtwoord in",
"confirm": "Bevestig Uitschakelen",
"cancel": "Annuleren"
},
"backupCodes": {
"title": "Back-upcodes",
"description": "Bewaar deze back-upcodes op een veilige plaats. U kunt ze gebruiken om toegang te krijgen tot uw account als u uw authenticator-apparaat verliest.",
"warning": "Belangrijk:",
"warningText": "Elke back-upcode kan slechts één keer worden gebruikt. Bewaar ze veilig en deel ze met niemand.",
"generateNew": "Genereer Nieuwe Back-upcodes",
"download": "Download Back-upcodes",
"copyToClipboard": "Kopiëren naar Klembord",
"savedMessage": "Ik heb mijn back-upcodes opgeslagen",
"available": "{count} back-upcodes beschikbaar",
"instructions": [
"• Bewaar deze codes op een veilige plaats",
"• Elke back-upcode kan slechts één keer worden gebruikt",
"• U kunt op elk moment nieuwe codes genereren"
]
},
"verification": {
"title": "Twee-Factor Authenticatie",
"description": "Voer de 6-cijferige code van uw authenticator-app in",
"backupDescription": "Voer een van uw back-upcodes in om door te gaan",
"verificationCode": "Verificatiecode",
"backupCode": "Back-upcode",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verifiëren",
"verifying": "Verifiëren...",
"useBackupCode": "Gebruik in plaats daarvan een back-upcode",
"useAuthenticatorCode": "Gebruik in plaats daarvan authenticator-code",
"rememberDevice": "Onthoud dit apparaat voor 30 dagen",
"rememberDeviceDescription": "U hoeft gedurende 30 dagen geen 2FA-codes in te voeren op dit apparaat"
},
"messages": {
"enabledSuccess": "Twee-factor authenticatie succesvol ingeschakeld!",
"disabledSuccess": "Twee-factor authenticatie succesvol uitgeschakeld",
"backupCodesGenerated": "Nieuwe back-upcodes succesvol gegenereerd",
"backupCodesCopied": "Back-upcodes gekopieerd naar klembord",
"setupFailed": "Genereren van 2FA-configuratie mislukt",
"verificationFailed": "Ongeldige verificatiecode",
"disableFailed": "Uitschakelen van 2FA mislukt. Controleer uw wachtwoord.",
"backupCodesFailed": "Genereren van back-upcodes mislukt",
"backupCodesCopyFailed": "Kopiëren van back-upcodes mislukt",
"statusLoadFailed": "Laden van 2FA-status mislukt",
"enterVerificationCode": "Voer de verificatiecode in",
"enterPassword": "Voer uw wachtwoord in",
"deviceTrusted": "Dit apparaat is als vertrouwd gemarkeerd voor 30 dagen"
},
"errors": {
"invalidVerificationCode": "Ongeldige verificatiecode",
"invalidTwoFactorCode": "Ongeldige twee-factor authenticatiecode",
"twoFactorRequired": "Twee-factor authenticatie vereist",
"twoFactorAlreadyEnabled": "Twee-factor authenticatie is al ingeschakeld",
"twoFactorNotEnabled": "Twee-factor authenticatie is niet ingeschakeld",
"passwordVerificationRequired": "Wachtwoordverificatie vereist",
"invalidPassword": "Ongeldig wachtwoord",
"userNotFound": "Gebruiker niet gevonden"
},
"buttons": {
"enable2FA": "2FA Inschakelen",
"disable2FA": "2FA Uitschakelen"
},
"deviceNames": {
"unknownDevice": "Onbekend Apparaat",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " op Windows",
"macos": " op macOS",
"linux": " op Linux",
"iphone": " op iPhone",
"android": " op Android"
}
},
"status": {
"label": "Status:",
"enabled": "Ingeschakeld",
"disabled": "Uitgeschakeld"
},
"trustedDevices": {
"title": "Vertrouwde Apparaten - 2FA",
"description": "Apparaten die geen 2FA-verificatie vereisen",
"noDevices": "Geen vertrouwde apparaten",
"deviceName": "Apparaat",
"addedOn": "Toegevoegd op",
"expiresOn": "Verloopt op",
"remove": "Verwijderen",
"removeAll": "Alles Verwijderen",
"confirmRemove": "Weet u zeker dat u dit vertrouwde apparaat wilt verwijderen?",
"confirmRemoveAll": "Weet u zeker dat u alle vertrouwde apparaten wilt verwijderen?",
"deviceRemoved": "Vertrouwd apparaat succesvol verwijderd",
"allDevicesRemoved": "Alle vertrouwde apparaten succesvol verwijderd",
"loadFailed": "Laden van vertrouwde apparaten mislukt",
"removeFailed": "Verwijderen van vertrouwd apparaat mislukt",
"removeAllFailed": "Verwijderen van alle vertrouwde apparaten mislukt",
"loading": "Vertrouwde apparaten laden...",
"noDevicesDescription": "Apparaten verschijnen hier wanneer u ervoor kiest om ze te vertrouwen tijdens 2FA-verificatie",
"tableHeaders": {
"device": "Apparaat",
"added": "Toegevoegd",
"expires": "Verloopt",
"lastUsed": "Laatst Gebruikt",
"ipAddress": "IP-Adres",
"actions": "Acties"
},
"status": {
"never": "Nooit",
"expired": "Verlopen"
},
"modals": {
"removeDevice": {
"title": "Vertrouwd Apparaat Verwijderen",
"added": "Toegevoegd:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Alle Vertrouwde Apparaten Verwijderen",
"description": "Dit zal {count} vertrouwd{count, plural, =1 { apparaat} other {e apparaten}} verwijderen. U moet 2FA opnieuw verifiëren op alle apparaten."
},
"buttons": {
"cancel": "Annuleren",
"removing": "Verwijderen...",
"removeDevice": "Apparaat Verwijderen",
"removeAllDevices": "Alle Apparaten Verwijderen"
}
}
}
},
"uploadFile": {
"title": "Bestand uploaden",
"multipleTitle": "Meerdere Bestanden Uploaden",
@@ -1542,98 +1713,5 @@
"passwordMinLength": "Wachtwoord moet minimaal 6 tekens bevatten",
"nameRequired": "Naam is verplicht",
"required": "Dit veld is verplicht"
},
"iconPicker": {
"title": "Selecteer Pictogram",
"placeholder": "Selecteer een pictogram",
"searchPlaceholder": "Zoek pictogrammen...",
"loadingMore": "Meer pictogrammen laden...",
"allIconsLoaded": "Alle {count} pictogrammen geladen",
"noIconsFound": "Geen pictogrammen gevonden voor \"{search}\"",
"tabs": {
"all": "Alle Pictogrammen",
"popular": "Populair",
"auth": "Authenticatie Providers"
},
"stats": "{iconCount} pictogrammen van {libraryCount} bibliotheken",
"categoryBadge": "{category} ({count} pictogrammen)"
},
"twoFactor": {
"title": "Twee-Factor Authenticatie",
"description": "Voeg een extra beveiligingslaag toe aan uw account",
"enabled": "Uw account is beveiligd met twee-factor authenticatie",
"disabled": "Twee-factor authenticatie is niet ingeschakeld",
"setup": {
"title": "Twee-Factor Authenticatie Inschakelen",
"description": "Scan de QR-code met uw authenticator-app en voer vervolgens de verificatiecode in.",
"qrCode": "QR-Code",
"manualEntryKey": "Handmatige Invoersleutel",
"verificationCode": "Verificatiecode",
"verificationCodePlaceholder": "Voer 6-cijferige code in",
"verificationCodeDescription": "Voer de 6-cijferige code van uw authenticator-app in",
"verifyAndEnable": "Verifiëren & Inschakelen",
"cancel": "Annuleren"
},
"disable": {
"title": "Twee-Factor Authenticatie Uitschakelen",
"description": "Voer uw wachtwoord in om het uitschakelen van twee-factor authenticatie te bevestigen.",
"password": "Wachtwoord",
"passwordPlaceholder": "Voer uw wachtwoord in",
"confirm": "Bevestig Uitschakelen",
"cancel": "Annuleren"
},
"backupCodes": {
"title": "Back-upcodes",
"description": "Bewaar deze back-upcodes op een veilige plaats. U kunt ze gebruiken om toegang te krijgen tot uw account als u uw authenticator-apparaat verliest.",
"warning": "Belangrijk:",
"warningText": "Elke back-upcode kan slechts één keer worden gebruikt. Bewaar ze veilig en deel ze met niemand.",
"generateNew": "Genereer Nieuwe Back-upcodes",
"download": "Download Back-upcodes",
"copyToClipboard": "Kopiëren naar Klembord",
"savedMessage": "Ik heb mijn back-upcodes opgeslagen",
"available": "{count} back-upcodes beschikbaar",
"instructions": [
"• Bewaar deze codes op een veilige plaats",
"• Elke back-upcode kan slechts één keer worden gebruikt",
"• U kunt op elk moment nieuwe codes genereren"
]
},
"verification": {
"title": "Twee-Factor Authenticatie",
"description": "Voer de 6-cijferige code van uw authenticator-app in",
"backupDescription": "Voer een van uw back-upcodes in om door te gaan",
"verificationCode": "Verificatiecode",
"backupCode": "Back-upcode",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verifiëren",
"verifying": "Verifiëren...",
"useBackupCode": "Gebruik in plaats daarvan een back-upcode",
"useAuthenticatorCode": "Gebruik in plaats daarvan authenticator-code"
},
"messages": {
"enabledSuccess": "Twee-factor authenticatie succesvol ingeschakeld!",
"disabledSuccess": "Twee-factor authenticatie succesvol uitgeschakeld",
"backupCodesGenerated": "Nieuwe back-upcodes succesvol gegenereerd",
"backupCodesCopied": "Back-upcodes gekopieerd naar klembord",
"setupFailed": "Genereren van 2FA-configuratie mislukt",
"verificationFailed": "Ongeldige verificatiecode",
"disableFailed": "Uitschakelen van 2FA mislukt. Controleer uw wachtwoord.",
"backupCodesFailed": "Genereren van back-upcodes mislukt",
"backupCodesCopyFailed": "Kopiëren van back-upcodes mislukt",
"statusLoadFailed": "Laden van 2FA-status mislukt",
"enterVerificationCode": "Voer de verificatiecode in",
"enterPassword": "Voer uw wachtwoord in"
},
"errors": {
"invalidVerificationCode": "Ongeldige verificatiecode",
"invalidTwoFactorCode": "Ongeldige twee-factor authenticatiecode",
"twoFactorRequired": "Twee-factor authenticatie vereist",
"twoFactorAlreadyEnabled": "Twee-factor authenticatie is al ingeschakeld",
"twoFactorNotEnabled": "Twee-factor authenticatie is niet ingeschakeld",
"passwordVerificationRequired": "Wachtwoordverificatie vereist",
"invalidPassword": "Ongeldig wachtwoord",
"userNotFound": "Gebruiker niet gevonden"
}
}
}

View File

@@ -143,7 +143,8 @@
"dashboard": "Panel główny",
"back": "Wróć",
"click": "Kliknij, aby",
"creating": "Tworzenie..."
"creating": "Tworzenie...",
"loadingSimple": "Ładowanie..."
},
"createShare": {
"title": "Utwórz Udostępnienie",
@@ -189,7 +190,8 @@
"Password verification required": "Wymagana weryfikacja hasła",
"Two-factor authentication is already enabled": "Uwierzytelnianie dwuskładnikowe jest już włączone",
"Two-factor authentication is not enabled": "Uwierzytelnianie dwuskładnikowe nie jest włączone",
"Two-factor authentication required": "Wymagane uwierzytelnianie dwuskładnikowe"
"Two-factor authentication required": "Wymagane uwierzytelnianie dwuskładnikowe",
"noUserData": "Brak danych użytkownika"
},
"fileActions": {
"editFile": "Edytuj plik",
@@ -338,6 +340,21 @@
},
"pageTitle": "Strona główna"
},
"iconPicker": {
"title": "Wybierz ikonę",
"placeholder": "Wybierz ikonę",
"searchPlaceholder": "Szukaj ikon...",
"loadingMore": "Ładowanie kolejnych ikon...",
"allIconsLoaded": "Załadowano wszystkie {count} ikon",
"noIconsFound": "Nie znaleziono ikon dla \"{search}\"",
"tabs": {
"all": "Wszystkie ikony",
"popular": "Popularne",
"auth": "Dostawcy uwierzytelniania"
},
"stats": "{iconCount} ikon z {libraryCount} bibliotek",
"categoryBadge": "{category} ({count} ikon)"
},
"login": {
"welcome": "Witaj w",
"signInToContinue": "Zaloguj się, aby kontynuować",
@@ -1426,6 +1443,160 @@
"dark": "Ciemny",
"system": "Systemowy"
},
"twoFactor": {
"title": "Uwierzytelnianie dwuskładnikowe",
"description": "Dodaj dodatkową warstwę zabezpieczeń do swojego konta",
"enabled": "Twoje konto jest chronione uwierzytelnianiem dwuskładnikowym",
"disabled": "Uwierzytelnianie dwuskładnikowe nie jest włączone",
"setup": {
"title": "Włącz uwierzytelnianie dwuskładnikowe",
"description": "Zeskanuj kod QR za pomocą aplikacji uwierzytelniającej, a następnie wprowadź kod weryfikacyjny.",
"qrCode": "Kod QR",
"manualEntryKey": "Klucz do ręcznego wprowadzenia",
"verificationCode": "Kod weryfikacyjny",
"verificationCodePlaceholder": "Wprowadź 6-cyfrowy kod",
"verificationCodeDescription": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej",
"verifyAndEnable": "Zweryfikuj i włącz",
"cancel": "Anuluj"
},
"disable": {
"title": "Wyłącz uwierzytelnianie dwuskładnikowe",
"description": "Wprowadź hasło, aby potwierdzić wyłączenie uwierzytelniania dwuskładnikowego.",
"password": "Hasło",
"passwordPlaceholder": "Wprowadź swoje hasło",
"confirm": "Potwierdź wyłączenie",
"cancel": "Anuluj"
},
"backupCodes": {
"title": "Kody zapasowe",
"description": "Zapisz te kody zapasowe w bezpiecznym miejscu. Możesz ich użyć, aby uzyskać dostęp do swojego konta w przypadku utraty urządzenia uwierzytelniającego.",
"warning": "Ważne:",
"warningText": "Każdy kod zapasowy może być użyty tylko raz. Przechowuj je bezpiecznie i nie udostępniaj nikomu.",
"generateNew": "Wygeneruj nowe kody zapasowe",
"download": "Pobierz kody zapasowe",
"copyToClipboard": "Kopiuj do schowka",
"savedMessage": "Zapisałem moje kody zapasowe",
"available": "{count} dostępnych kodów zapasowych",
"instructions": [
"• Zapisz te kody w bezpiecznym miejscu",
"• Każdy kod zapasowy może być użyty tylko raz",
"• Możesz wygenerować nowe kody w dowolnym momencie"
]
},
"verification": {
"title": "Uwierzytelnianie dwuskładnikowe",
"description": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej",
"backupDescription": "Wprowadź jeden z kodów zapasowych, aby kontynuować",
"verificationCode": "Kod weryfikacyjny",
"backupCode": "Kod zapasowy",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Zweryfikuj",
"verifying": "Weryfikacja...",
"useBackupCode": "Użyj kodu zapasowego",
"useAuthenticatorCode": "Użyj kodu z aplikacji uwierzytelniającej",
"rememberDevice": "Zapamiętaj to urządzenie na 30 dni",
"rememberDeviceDescription": "Nie będziesz musiał wprowadzać kodów 2FA na tym urządzeniu przez 30 dni"
},
"messages": {
"enabledSuccess": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie włączone!",
"disabledSuccess": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie wyłączone",
"backupCodesGenerated": "Nowe kody zapasowe zostały pomyślnie wygenerowane",
"backupCodesCopied": "Kody zapasowe skopiowane do schowka",
"setupFailed": "Nie udało się wygenerować konfiguracji 2FA",
"verificationFailed": "Nieprawidłowy kod weryfikacyjny",
"disableFailed": "Nie udało się wyłączyć 2FA. Sprawdź swoje hasło.",
"backupCodesFailed": "Nie udało się wygenerować kodów zapasowych",
"backupCodesCopyFailed": "Nie udało się skopiować kodów zapasowych",
"statusLoadFailed": "Nie udało się załadować statusu 2FA",
"enterVerificationCode": "Wprowadź kod weryfikacyjny",
"enterPassword": "Wprowadź swoje hasło",
"deviceTrusted": "To urządzenie zostało oznaczone jako zaufane na 30 dni"
},
"errors": {
"invalidVerificationCode": "Nieprawidłowy kod weryfikacyjny",
"invalidTwoFactorCode": "Nieprawidłowy kod uwierzytelniania dwuskładnikowego",
"twoFactorRequired": "Wymagane uwierzytelnianie dwuskładnikowe",
"twoFactorAlreadyEnabled": "Uwierzytelnianie dwuskładnikowe jest już włączone",
"twoFactorNotEnabled": "Uwierzytelnianie dwuskładnikowe nie jest włączone",
"passwordVerificationRequired": "Wymagana weryfikacja hasła",
"invalidPassword": "Nieprawidłowe hasło",
"userNotFound": "Nie znaleziono użytkownika"
},
"buttons": {
"enable2FA": "Włącz 2FA",
"disable2FA": "Wyłącz 2FA"
},
"deviceNames": {
"unknownDevice": "Nieznane urządzenie",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " na Windows",
"macos": " na macOS",
"linux": " na Linux",
"iphone": " na iPhone",
"android": " na Android"
}
},
"status": {
"label": "Status:",
"enabled": "Włączone",
"disabled": "Wyłączone"
},
"trustedDevices": {
"title": "Zaufane urządzenia - 2FA",
"description": "Urządzenia, które nie wymagają weryfikacji 2FA",
"noDevices": "Brak zaufanych urządzeń",
"deviceName": "Urządzenie",
"addedOn": "Dodano",
"expiresOn": "Wygasa",
"remove": "Usuń",
"removeAll": "Usuń wszystkie",
"confirmRemove": "Czy na pewno chcesz usunąć to zaufane urządzenie?",
"confirmRemoveAll": "Czy na pewno chcesz usunąć wszystkie zaufane urządzenia?",
"deviceRemoved": "Zaufane urządzenie zostało pomyślnie usunięte",
"allDevicesRemoved": "Wszystkie zaufane urządzenia zostały pomyślnie usunięte",
"loadFailed": "Nie udało się załadować zaufanych urządzeń",
"removeFailed": "Nie udało się usunąć zaufanego urządzenia",
"removeAllFailed": "Nie udało się usunąć wszystkich zaufanych urządzeń",
"loading": "Ładowanie zaufanych urządzeń...",
"noDevicesDescription": "Urządzenia pojawią się tutaj, gdy zdecydujesz się im zaufać podczas weryfikacji 2FA",
"tableHeaders": {
"device": "Urządzenie",
"added": "Dodano",
"expires": "Wygasa",
"lastUsed": "Ostatnio użyte",
"ipAddress": "Adres IP",
"actions": "Akcje"
},
"status": {
"never": "Nigdy",
"expired": "Wygasło"
},
"modals": {
"removeDevice": {
"title": "Usuń zaufane urządzenie",
"added": "Dodano:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Usuń wszystkie zaufane urządzenia",
"description": "Spowoduje to usunięcie {count} zaufanych urządzeń. Będziesz musiał zweryfikować 2FA na wszystkich urządzeniach ponownie."
},
"buttons": {
"cancel": "Anuluj",
"removing": "Usuwanie...",
"removeDevice": "Usuń urządzenie",
"removeAllDevices": "Usuń wszystkie urządzenia"
}
}
}
},
"uploadFile": {
"title": "Prześlij plik",
"multipleTitle": "Prześlij pliki",
@@ -1542,98 +1713,5 @@
"passwordMinLength": "Hasło musi mieć co najmniej 6 znaków",
"nameRequired": "Nazwa jest wymagana",
"required": "To pole jest wymagane"
},
"iconPicker": {
"title": "Wybierz ikonę",
"placeholder": "Wybierz ikonę",
"searchPlaceholder": "Szukaj ikon...",
"loadingMore": "Ładowanie kolejnych ikon...",
"allIconsLoaded": "Załadowano wszystkie {count} ikon",
"noIconsFound": "Nie znaleziono ikon dla \"{search}\"",
"tabs": {
"all": "Wszystkie ikony",
"popular": "Popularne",
"auth": "Dostawcy uwierzytelniania"
},
"stats": "{iconCount} ikon z {libraryCount} bibliotek",
"categoryBadge": "{category} ({count} ikon)"
},
"twoFactor": {
"title": "Uwierzytelnianie dwuskładnikowe",
"description": "Dodaj dodatkową warstwę zabezpieczeń do swojego konta",
"enabled": "Twoje konto jest chronione uwierzytelnianiem dwuskładnikowym",
"disabled": "Uwierzytelnianie dwuskładnikowe nie jest włączone",
"setup": {
"title": "Włącz uwierzytelnianie dwuskładnikowe",
"description": "Zeskanuj kod QR za pomocą aplikacji uwierzytelniającej, a następnie wprowadź kod weryfikacyjny.",
"qrCode": "Kod QR",
"manualEntryKey": "Klucz do ręcznego wprowadzenia",
"verificationCode": "Kod weryfikacyjny",
"verificationCodePlaceholder": "Wprowadź 6-cyfrowy kod",
"verificationCodeDescription": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej",
"verifyAndEnable": "Zweryfikuj i włącz",
"cancel": "Anuluj"
},
"disable": {
"title": "Wyłącz uwierzytelnianie dwuskładnikowe",
"description": "Wprowadź hasło, aby potwierdzić wyłączenie uwierzytelniania dwuskładnikowego.",
"password": "Hasło",
"passwordPlaceholder": "Wprowadź swoje hasło",
"confirm": "Potwierdź wyłączenie",
"cancel": "Anuluj"
},
"backupCodes": {
"title": "Kody zapasowe",
"description": "Zapisz te kody zapasowe w bezpiecznym miejscu. Możesz ich użyć, aby uzyskać dostęp do swojego konta w przypadku utraty urządzenia uwierzytelniającego.",
"warning": "Ważne:",
"warningText": "Każdy kod zapasowy może być użyty tylko raz. Przechowuj je bezpiecznie i nie udostępniaj nikomu.",
"generateNew": "Wygeneruj nowe kody zapasowe",
"download": "Pobierz kody zapasowe",
"copyToClipboard": "Kopiuj do schowka",
"savedMessage": "Zapisałem moje kody zapasowe",
"available": "{count} dostępnych kodów zapasowych",
"instructions": [
"• Zapisz te kody w bezpiecznym miejscu",
"• Każdy kod zapasowy może być użyty tylko raz",
"• Możesz wygenerować nowe kody w dowolnym momencie"
]
},
"verification": {
"title": "Uwierzytelnianie dwuskładnikowe",
"description": "Wprowadź 6-cyfrowy kod z aplikacji uwierzytelniającej",
"backupDescription": "Wprowadź jeden z kodów zapasowych, aby kontynuować",
"verificationCode": "Kod weryfikacyjny",
"backupCode": "Kod zapasowy",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Zweryfikuj",
"verifying": "Weryfikacja...",
"useBackupCode": "Użyj kodu zapasowego",
"useAuthenticatorCode": "Użyj kodu z aplikacji uwierzytelniającej"
},
"messages": {
"enabledSuccess": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie włączone!",
"disabledSuccess": "Uwierzytelnianie dwuskładnikowe zostało pomyślnie wyłączone",
"backupCodesGenerated": "Nowe kody zapasowe zostały pomyślnie wygenerowane",
"backupCodesCopied": "Kody zapasowe skopiowane do schowka",
"setupFailed": "Nie udało się wygenerować konfiguracji 2FA",
"verificationFailed": "Nieprawidłowy kod weryfikacyjny",
"disableFailed": "Nie udało się wyłączyć 2FA. Sprawdź swoje hasło.",
"backupCodesFailed": "Nie udało się wygenerować kodów zapasowych",
"backupCodesCopyFailed": "Nie udało się skopiować kodów zapasowych",
"statusLoadFailed": "Nie udało się załadować statusu 2FA",
"enterVerificationCode": "Wprowadź kod weryfikacyjny",
"enterPassword": "Wprowadź swoje hasło"
},
"errors": {
"invalidVerificationCode": "Nieprawidłowy kod weryfikacyjny",
"invalidTwoFactorCode": "Nieprawidłowy kod uwierzytelniania dwuskładnikowego",
"twoFactorRequired": "Wymagane uwierzytelnianie dwuskładnikowe",
"twoFactorAlreadyEnabled": "Uwierzytelnianie dwuskładnikowe jest już włączone",
"twoFactorNotEnabled": "Uwierzytelnianie dwuskładnikowe nie jest włączone",
"passwordVerificationRequired": "Wymagana weryfikacja hasła",
"invalidPassword": "Nieprawidłowe hasło",
"userNotFound": "Nie znaleziono użytkownika"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Salvando...",
"update": "Atualizar",
"creating": "Criando...",
"click": "Clique para"
"click": "Clique para",
"loadingSimple": "Carregando..."
},
"createShare": {
"title": "Criar compartilhamento",
@@ -189,7 +190,8 @@
"Password verification required": "Verificação de senha necessária",
"Two-factor authentication is already enabled": "A autenticação de dois fatores já está ativada",
"Two-factor authentication is not enabled": "A autenticação de dois fatores não está ativada",
"Two-factor authentication required": "Autenticação de dois fatores necessária"
"Two-factor authentication required": "Autenticação de dois fatores necessária",
"noUserData": "Nenhum dado do usuário"
},
"fileActions": {
"editFile": "Editar arquivo",
@@ -338,6 +340,21 @@
},
"pageTitle": "Início"
},
"iconPicker": {
"title": "Selecionar ícone",
"placeholder": "Selecione um ícone",
"searchPlaceholder": "Pesquisar ícones...",
"loadingMore": "Carregando mais ícones...",
"allIconsLoaded": "Todos os {count} ícones carregados",
"noIconsFound": "Nenhum ícone encontrado para \"{search}\"",
"tabs": {
"all": "Todos os ícones",
"popular": "Populares",
"auth": "Provedores de autenticação"
},
"stats": "{iconCount} ícones de {libraryCount} bibliotecas",
"categoryBadge": "{category} ({count} ícones)"
},
"login": {
"welcome": "Bem-vindo ao",
"signInToContinue": "Faça login para continuar",
@@ -1426,6 +1443,160 @@
"dark": "Escuro",
"system": "Sistema"
},
"twoFactor": {
"title": "Autenticação de dois fatores",
"description": "Adicione uma camada extra de segurança à sua conta",
"enabled": "Sua conta está protegida com autenticação de dois fatores",
"disabled": "A autenticação de dois fatores não está ativada",
"setup": {
"title": "Ativar autenticação de dois fatores",
"description": "Escaneie o código QR com seu aplicativo autenticador e depois insira o código de verificação.",
"qrCode": "Código QR",
"manualEntryKey": "Chave de Entrada Manual",
"verificationCode": "Código de Verificação",
"verificationCodePlaceholder": "Digite o código de 6 dígitos",
"verificationCodeDescription": "Digite o código de 6 dígitos do seu aplicativo autenticador",
"verifyAndEnable": "Verificar e ativar",
"cancel": "Cancelar"
},
"disable": {
"title": "Desativar autenticação de dois fatores",
"description": "Digite sua senha para confirmar a desativação da autenticação de dois fatores.",
"password": "Senha",
"passwordPlaceholder": "Digite sua senha",
"confirm": "Confirmar Desativação",
"cancel": "Cancelar"
},
"backupCodes": {
"title": "Códigos de backup",
"description": "Salve estes códigos de backup em um local seguro. Você pode usá-los para acessar sua conta se perder seu dispositivo autenticador.",
"warning": "Importante:",
"warningText": "Cada código de backup só pode ser usado uma vez. Mantenha-os seguros e não os compartilhe com ninguém.",
"generateNew": "Gerar novos códigos de backup",
"download": "Baixar códigos de backup",
"copyToClipboard": "Copiar para área de transferência",
"savedMessage": "Salvei meus códigos de backup",
"available": "{count} códigos de backup disponíveis",
"instructions": [
"• Salve estes códigos em um local seguro",
"• Cada código de backup só pode ser usado uma vez",
"• Você pode gerar novos códigos a qualquer momento"
]
},
"verification": {
"title": "Autenticação de dois fatores",
"description": "Digite o código de 6 dígitos do seu aplicativo autenticador",
"backupDescription": "Digite um dos seus códigos de backup para continuar",
"verificationCode": "Código de verificação",
"backupCode": "Código de backup",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verificar",
"verifying": "Verificando...",
"useBackupCode": "Usar código de backup",
"useAuthenticatorCode": "Usar código do autenticador",
"rememberDevice": "Lembrar este dispositivo por 30 dias",
"rememberDeviceDescription": "Você não precisará inserir códigos 2FA neste dispositivo por 30 dias"
},
"messages": {
"enabledSuccess": "Autenticação de dois fatores ativada com sucesso!",
"disabledSuccess": "Autenticação de dois fatores desativada com sucesso",
"backupCodesGenerated": "Novos códigos de backup gerados com sucesso",
"backupCodesCopied": "Códigos de backup copiados para a área de transferência",
"setupFailed": "Falha ao gerar configuração 2FA",
"verificationFailed": "Código de verificação inválido",
"disableFailed": "Falha ao desativar 2FA. Por favor, verifique sua senha.",
"backupCodesFailed": "Falha ao gerar códigos de backup",
"backupCodesCopyFailed": "Falha ao copiar códigos de backup",
"statusLoadFailed": "Falha ao carregar status do 2FA",
"enterVerificationCode": "Por favor, digite o código de verificação",
"enterPassword": "Por favor, digite sua senha",
"deviceTrusted": "Este dispositivo foi marcado como confiável por 30 dias"
},
"errors": {
"invalidVerificationCode": "Código de verificação inválido",
"invalidTwoFactorCode": "Código de autenticação de dois fatores inválido",
"twoFactorRequired": "Autenticação de dois fatores necessária",
"twoFactorAlreadyEnabled": "A autenticação de dois fatores já está ativada",
"twoFactorNotEnabled": "A autenticação de dois fatores não está ativada",
"passwordVerificationRequired": "Verificação de senha necessária",
"invalidPassword": "Senha inválida",
"userNotFound": "Usuário não encontrado"
},
"buttons": {
"enable2FA": "Ativar 2FA",
"disable2FA": "Desativar 2FA"
},
"deviceNames": {
"unknownDevice": "Dispositivo Desconhecido",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " no Windows",
"macos": " no macOS",
"linux": " no Linux",
"iphone": " no iPhone",
"android": " no Android"
}
},
"status": {
"label": "Status:",
"enabled": "Ativado",
"disabled": "Desativado"
},
"trustedDevices": {
"title": "Dispositivos Confiáveis - 2FA",
"description": "Dispositivos que não requerem verificação 2FA",
"noDevices": "Nenhum dispositivo confiável",
"deviceName": "Dispositivo",
"addedOn": "Adicionado em",
"expiresOn": "Expira em",
"remove": "Remover",
"removeAll": "Remover Todos",
"confirmRemove": "Tem certeza que deseja remover este dispositivo confiável?",
"confirmRemoveAll": "Tem certeza que deseja remover todos os dispositivos confiáveis?",
"deviceRemoved": "Dispositivo confiável removido com sucesso",
"allDevicesRemoved": "Todos os dispositivos confiáveis foram removidos com sucesso",
"loadFailed": "Falha ao carregar dispositivos confiáveis",
"removeFailed": "Falha ao remover dispositivo confiável",
"removeAllFailed": "Falha ao remover todos os dispositivos confiáveis",
"loading": "Carregando dispositivos confiáveis...",
"noDevicesDescription": "Os dispositivos aparecerão aqui quando você optar por confiar neles durante a verificação 2FA",
"tableHeaders": {
"device": "Dispositivo",
"added": "Adicionado",
"expires": "Expira",
"lastUsed": "Último Uso",
"ipAddress": "Endereço IP",
"actions": "Ações"
},
"status": {
"never": "Nunca",
"expired": "Expirado"
},
"modals": {
"removeDevice": {
"title": "Remover Dispositivo Confiável",
"added": "Adicionado:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Remover Todos os Dispositivos Confiáveis",
"description": "Isso removerá {count} dispositivo{count, plural, =1 {} other {s}} confiável{count, plural, =1 {} other {is}}. Você precisará verificar o 2FA em todos os dispositivos novamente."
},
"buttons": {
"cancel": "Cancelar",
"removing": "Removendo...",
"removeDevice": "Remover Dispositivo",
"removeAllDevices": "Remover Todos os Dispositivos"
}
}
}
},
"uploadFile": {
"title": "Enviar Arquivo",
"multipleTitle": "Enviar Múltiplos Arquivos",
@@ -1542,98 +1713,5 @@
"lastNameRequired": "O sobrenome é necessário",
"usernameLength": "O nome de usuário deve ter pelo menos 3 caracteres",
"usernameSpaces": "O nome de usuário não pode conter espaços"
},
"iconPicker": {
"title": "Selecionar ícone",
"placeholder": "Selecione um ícone",
"searchPlaceholder": "Pesquisar ícones...",
"loadingMore": "Carregando mais ícones...",
"allIconsLoaded": "Todos os {count} ícones carregados",
"noIconsFound": "Nenhum ícone encontrado para \"{search}\"",
"tabs": {
"all": "Todos os ícones",
"popular": "Populares",
"auth": "Provedores de autenticação"
},
"stats": "{iconCount} ícones de {libraryCount} bibliotecas",
"categoryBadge": "{category} ({count} ícones)"
},
"twoFactor": {
"title": "Autenticação de dois fatores",
"description": "Adicione uma camada extra de segurança à sua conta",
"enabled": "Sua conta está protegida com autenticação de dois fatores",
"disabled": "A autenticação de dois fatores não está ativada",
"setup": {
"title": "Ativar autenticação de dois fatores",
"description": "Escaneie o código QR com seu aplicativo autenticador e depois insira o código de verificação.",
"qrCode": "Código QR",
"manualEntryKey": "Chave de Entrada Manual",
"verificationCode": "Código de Verificação",
"verificationCodePlaceholder": "Digite o código de 6 dígitos",
"verificationCodeDescription": "Digite o código de 6 dígitos do seu aplicativo autenticador",
"verifyAndEnable": "Verificar e ativar",
"cancel": "Cancelar"
},
"disable": {
"title": "Desativar autenticação de dois fatores",
"description": "Digite sua senha para confirmar a desativação da autenticação de dois fatores.",
"password": "Senha",
"passwordPlaceholder": "Digite sua senha",
"confirm": "Confirmar Desativação",
"cancel": "Cancelar"
},
"backupCodes": {
"title": "Códigos de backup",
"description": "Salve estes códigos de backup em um local seguro. Você pode usá-los para acessar sua conta se perder seu dispositivo autenticador.",
"warning": "Importante:",
"warningText": "Cada código de backup só pode ser usado uma vez. Mantenha-os seguros e não os compartilhe com ninguém.",
"generateNew": "Gerar novos códigos de backup",
"download": "Baixar códigos de backup",
"copyToClipboard": "Copiar para área de transferência",
"savedMessage": "Salvei meus códigos de backup",
"available": "{count} códigos de backup disponíveis",
"instructions": [
"• Salve estes códigos em um local seguro",
"• Cada código de backup só pode ser usado uma vez",
"• Você pode gerar novos códigos a qualquer momento"
]
},
"verification": {
"title": "Autenticação de dois fatores",
"description": "Digite o código de 6 dígitos do seu aplicativo autenticador",
"backupDescription": "Digite um dos seus códigos de backup para continuar",
"verificationCode": "Código de verificação",
"backupCode": "Código de backup",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Verificar",
"verifying": "Verificando...",
"useBackupCode": "Usar código de backup",
"useAuthenticatorCode": "Usar código do autenticador"
},
"messages": {
"enabledSuccess": "Autenticação de dois fatores ativada com sucesso!",
"disabledSuccess": "Autenticação de dois fatores desativada com sucesso",
"backupCodesGenerated": "Novos códigos de backup gerados com sucesso",
"backupCodesCopied": "Códigos de backup copiados para a área de transferência",
"setupFailed": "Falha ao gerar configuração 2FA",
"verificationFailed": "Código de verificação inválido",
"disableFailed": "Falha ao desativar 2FA. Por favor, verifique sua senha.",
"backupCodesFailed": "Falha ao gerar códigos de backup",
"backupCodesCopyFailed": "Falha ao copiar códigos de backup",
"statusLoadFailed": "Falha ao carregar status do 2FA",
"enterVerificationCode": "Por favor, digite o código de verificação",
"enterPassword": "Por favor, digite sua senha"
},
"errors": {
"invalidVerificationCode": "Código de verificação inválido",
"invalidTwoFactorCode": "Código de autenticação de dois fatores inválido",
"twoFactorRequired": "Autenticação de dois fatores necessária",
"twoFactorAlreadyEnabled": "A autenticação de dois fatores já está ativada",
"twoFactorNotEnabled": "A autenticação de dois fatores não está ativada",
"passwordVerificationRequired": "Verificação de senha necessária",
"invalidPassword": "Senha inválida",
"userNotFound": "Usuário não encontrado"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Сохранение...",
"update": "Обновить",
"click": "Нажмите для",
"creating": "Создание..."
"creating": "Создание...",
"loadingSimple": "Загрузка..."
},
"createShare": {
"title": "Создать общий доступ",
@@ -189,7 +190,8 @@
"Password verification required": "Требуется подтверждение пароля",
"Two-factor authentication is already enabled": "Двухфакторная аутентификация уже включена",
"Two-factor authentication is not enabled": "Двухфакторная аутентификация не включена",
"Two-factor authentication required": "Требуется двухфакторная аутентификация"
"Two-factor authentication required": "Требуется двухфакторная аутентификация",
"noUserData": "Нет данных пользователя"
},
"fileActions": {
"editFile": "Редактировать файл",
@@ -338,6 +340,21 @@
},
"pageTitle": "Главная"
},
"iconPicker": {
"title": "Выбрать иконку",
"placeholder": "Выберите иконку",
"searchPlaceholder": "Поиск иконок...",
"loadingMore": "Загрузка дополнительных иконок...",
"allIconsLoaded": "Загружено все {count} иконок",
"noIconsFound": "Не найдено иконок для \"{search}\"",
"tabs": {
"all": "Все иконки",
"popular": "Популярные",
"auth": "Провайдеры аутентификации"
},
"stats": "{iconCount} иконок из {libraryCount} библиотек",
"categoryBadge": "{category} ({count} иконок)"
},
"login": {
"welcome": "Добро пожаловать в",
"signInToContinue": "Войдите, чтобы продолжить",
@@ -1426,6 +1443,160 @@
"dark": "Тёмная",
"system": "Системная"
},
"twoFactor": {
"title": "Двухфакторная аутентификация",
"description": "Добавьте дополнительный уровень безопасности для вашей учетной записи",
"enabled": "Ваша учетная запись защищена двухфакторной аутентификацией",
"disabled": "Двухфакторная аутентификация не включена",
"setup": {
"title": "Включить двухфакторную аутентификацию",
"description": "Отсканируйте QR-код с помощью приложения-аутентификатора, затем введите код подтверждения.",
"qrCode": "QR-код",
"manualEntryKey": "Ключ для ручного ввода",
"verificationCode": "Код подтверждения",
"verificationCodePlaceholder": "Введите 6-значный код",
"verificationCodeDescription": "Введите 6-значный код из вашего приложения-аутентификатора",
"verifyAndEnable": "Проверить и включить",
"cancel": "Отмена"
},
"disable": {
"title": "Отключить двухфакторную аутентификацию",
"description": "Введите ваш пароль для подтверждения отключения двухфакторной аутентификации.",
"password": "Пароль",
"passwordPlaceholder": "Введите ваш пароль",
"confirm": "Подтвердить отключение",
"cancel": "Отмена"
},
"backupCodes": {
"title": "Резервные коды",
"description": "Сохраните эти резервные коды в безопасном месте. Вы можете использовать их для доступа к своей учетной записи, если потеряете устройство аутентификации.",
"warning": "Важно:",
"warningText": "Каждый резервный код можно использовать только один раз. Храните их в безопасности и не делитесь ими ни с кем.",
"generateNew": "Сгенерировать новые резервные коды",
"download": "Скачать резервные коды",
"copyToClipboard": "Копировать в буфер обмена",
"savedMessage": "Я сохранил мои резервные коды",
"available": "{count} резервных кодов доступно",
"instructions": [
"• Сохраните эти коды в безопасном месте",
"• Каждый резервный код можно использовать только один раз",
"• Вы можете сгенерировать новые коды в любое время"
]
},
"verification": {
"title": "Двухфакторная аутентификация",
"description": "Введите 6-значный код из вашего приложения-аутентификатора",
"backupDescription": "Введите один из ваших резервных кодов для продолжения",
"verificationCode": "Код подтверждения",
"backupCode": "Резервный код",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Проверить",
"verifying": "Проверка...",
"useBackupCode": "Использовать резервный код",
"useAuthenticatorCode": "Использовать код аутентификатора",
"rememberDevice": "Запомнить это устройство на 30 дней",
"rememberDeviceDescription": "Вам не нужно будет вводить коды 2FA на этом устройстве в течение 30 дней"
},
"messages": {
"enabledSuccess": "Двухфакторная аутентификация успешно включена!",
"disabledSuccess": "Двухфакторная аутентификация успешно отключена",
"backupCodesGenerated": "Новые резервные коды успешно сгенерированы",
"backupCodesCopied": "Резервные коды скопированы в буфер обмена",
"setupFailed": "Не удалось сгенерировать настройку 2FA",
"verificationFailed": "Неверный код подтверждения",
"disableFailed": "Не удалось отключить 2FA. Пожалуйста, проверьте ваш пароль.",
"backupCodesFailed": "Не удалось сгенерировать резервные коды",
"backupCodesCopyFailed": "Не удалось скопировать резервные коды",
"statusLoadFailed": "Не удалось загрузить статус 2FA",
"enterVerificationCode": "Пожалуйста, введите код подтверждения",
"enterPassword": "Пожалуйста, введите ваш пароль",
"deviceTrusted": "Это устройство отмечено как доверенное на 30 дней"
},
"errors": {
"invalidVerificationCode": "Неверный код подтверждения",
"invalidTwoFactorCode": "Неверный код двухфакторной аутентификации",
"twoFactorRequired": "Требуется двухфакторная аутентификация",
"twoFactorAlreadyEnabled": "Двухфакторная аутентификация уже включена",
"twoFactorNotEnabled": "Двухфакторная аутентификация не включена",
"passwordVerificationRequired": "Требуется подтверждение пароля",
"invalidPassword": "Неверный пароль",
"userNotFound": "Пользователь не найден"
},
"buttons": {
"enable2FA": "Включить 2FA",
"disable2FA": "Отключить 2FA"
},
"deviceNames": {
"unknownDevice": "Неизвестное устройство",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " на Windows",
"macos": " на macOS",
"linux": " на Linux",
"iphone": " на iPhone",
"android": " на Android"
}
},
"status": {
"label": "Статус:",
"enabled": "Включено",
"disabled": "Отключено"
},
"trustedDevices": {
"title": "Доверенные устройства - 2FA",
"description": "Устройства, не требующие проверки 2FA",
"noDevices": "Нет доверенных устройств",
"deviceName": "Устройство",
"addedOn": "Добавлено",
"expiresOn": "Истекает",
"remove": "Удалить",
"removeAll": "Удалить все",
"confirmRemove": "Вы уверены, что хотите удалить это доверенное устройство?",
"confirmRemoveAll": "Вы уверены, что хотите удалить все доверенные устройства?",
"deviceRemoved": "Доверенное устройство успешно удалено",
"allDevicesRemoved": "Все доверенные устройства успешно удалены",
"loadFailed": "Не удалось загрузить доверенные устройства",
"removeFailed": "Не удалось удалить доверенное устройство",
"removeAllFailed": "Не удалось удалить все доверенные устройства",
"loading": "Загрузка доверенных устройств...",
"noDevicesDescription": "Устройства появятся здесь, когда вы решите доверять им во время проверки 2FA",
"tableHeaders": {
"device": "Устройство",
"added": "Добавлено",
"expires": "Истекает",
"lastUsed": "Последнее использование",
"ipAddress": "IP-адрес",
"actions": "Действия"
},
"status": {
"never": "Никогда",
"expired": "Истекло"
},
"modals": {
"removeDevice": {
"title": "Удалить доверенное устройство",
"added": "Добавлено:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Удалить все доверенные устройства",
"description": "Это удалит {count} доверенное устройство{count, plural, =1 {} other {s}}. Вам потребуется повторно проверять 2FA на всех устройствах."
},
"buttons": {
"cancel": "Отмена",
"removing": "Удаление...",
"removeDevice": "Удалить устройство",
"removeAllDevices": "Удалить все устройства"
}
}
}
},
"uploadFile": {
"title": "Загрузить файл",
"multipleTitle": "Загрузить Несколько Файлов",
@@ -1542,98 +1713,5 @@
"passwordRequired": "Требуется пароль",
"nameRequired": "Требуется имя",
"required": "Это поле обязательно"
},
"iconPicker": {
"title": "Выбрать иконку",
"placeholder": "Выберите иконку",
"searchPlaceholder": "Поиск иконок...",
"loadingMore": "Загрузка дополнительных иконок...",
"allIconsLoaded": "Загружено все {count} иконок",
"noIconsFound": "Не найдено иконок для \"{search}\"",
"tabs": {
"all": "Все иконки",
"popular": "Популярные",
"auth": "Провайдеры аутентификации"
},
"stats": "{iconCount} иконок из {libraryCount} библиотек",
"categoryBadge": "{category} ({count} иконок)"
},
"twoFactor": {
"title": "Двухфакторная аутентификация",
"description": "Добавьте дополнительный уровень безопасности для вашей учетной записи",
"enabled": "Ваша учетная запись защищена двухфакторной аутентификацией",
"disabled": "Двухфакторная аутентификация не включена",
"setup": {
"title": "Включить двухфакторную аутентификацию",
"description": "Отсканируйте QR-код с помощью приложения-аутентификатора, затем введите код подтверждения.",
"qrCode": "QR-код",
"manualEntryKey": "Ключ для ручного ввода",
"verificationCode": "Код подтверждения",
"verificationCodePlaceholder": "Введите 6-значный код",
"verificationCodeDescription": "Введите 6-значный код из вашего приложения-аутентификатора",
"verifyAndEnable": "Проверить и включить",
"cancel": "Отмена"
},
"disable": {
"title": "Отключить двухфакторную аутентификацию",
"description": "Введите ваш пароль для подтверждения отключения двухфакторной аутентификации.",
"password": "Пароль",
"passwordPlaceholder": "Введите ваш пароль",
"confirm": "Подтвердить отключение",
"cancel": "Отмена"
},
"backupCodes": {
"title": "Резервные коды",
"description": "Сохраните эти резервные коды в безопасном месте. Вы можете использовать их для доступа к своей учетной записи, если потеряете устройство аутентификации.",
"warning": "Важно:",
"warningText": "Каждый резервный код можно использовать только один раз. Храните их в безопасности и не делитесь ими ни с кем.",
"generateNew": "Сгенерировать новые резервные коды",
"download": "Скачать резервные коды",
"copyToClipboard": "Копировать в буфер обмена",
"savedMessage": "Я сохранил мои резервные коды",
"available": "{count} резервных кодов доступно",
"instructions": [
"• Сохраните эти коды в безопасном месте",
"• Каждый резервный код можно использовать только один раз",
"• Вы можете сгенерировать новые коды в любое время"
]
},
"verification": {
"title": "Двухфакторная аутентификация",
"description": "Введите 6-значный код из вашего приложения-аутентификатора",
"backupDescription": "Введите один из ваших резервных кодов для продолжения",
"verificationCode": "Код подтверждения",
"backupCode": "Резервный код",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Проверить",
"verifying": "Проверка...",
"useBackupCode": "Использовать резервный код",
"useAuthenticatorCode": "Использовать код аутентификатора"
},
"messages": {
"enabledSuccess": "Двухфакторная аутентификация успешно включена!",
"disabledSuccess": "Двухфакторная аутентификация успешно отключена",
"backupCodesGenerated": "Новые резервные коды успешно сгенерированы",
"backupCodesCopied": "Резервные коды скопированы в буфер обмена",
"setupFailed": "Не удалось сгенерировать настройку 2FA",
"verificationFailed": "Неверный код подтверждения",
"disableFailed": "Не удалось отключить 2FA. Пожалуйста, проверьте ваш пароль.",
"backupCodesFailed": "Не удалось сгенерировать резервные коды",
"backupCodesCopyFailed": "Не удалось скопировать резервные коды",
"statusLoadFailed": "Не удалось загрузить статус 2FA",
"enterVerificationCode": "Пожалуйста, введите код подтверждения",
"enterPassword": "Пожалуйста, введите ваш пароль"
},
"errors": {
"invalidVerificationCode": "Неверный код подтверждения",
"invalidTwoFactorCode": "Неверный код двухфакторной аутентификации",
"twoFactorRequired": "Требуется двухфакторная аутентификация",
"twoFactorAlreadyEnabled": "Двухфакторная аутентификация уже включена",
"twoFactorNotEnabled": "Двухфакторная аутентификация не включена",
"passwordVerificationRequired": "Требуется подтверждение пароля",
"invalidPassword": "Неверный пароль",
"userNotFound": "Пользователь не найден"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "Kaydediliyor...",
"update": "Güncelle",
"click": "Tıklayın",
"creating": "Oluşturuluyor..."
"creating": "Oluşturuluyor...",
"loadingSimple": "Yükleniyor..."
},
"createShare": {
"title": "Paylaşım Oluştur",
@@ -189,7 +190,8 @@
"Password verification required": "Şifre doğrulaması gerekli",
"Two-factor authentication is already enabled": "İki faktörlü kimlik doğrulama zaten etkin",
"Two-factor authentication is not enabled": "İki faktörlü kimlik doğrulama etkin değil",
"Two-factor authentication required": "İki faktörlü kimlik doğrulama gerekli"
"Two-factor authentication required": "İki faktörlü kimlik doğrulama gerekli",
"noUserData": "Kullanıcı verisi yok"
},
"fileActions": {
"editFile": "Dosyayı Düzenle",
@@ -338,6 +340,21 @@
},
"pageTitle": "Ana Sayfa"
},
"iconPicker": {
"title": "Simge Seç",
"placeholder": "Bir simge seç",
"searchPlaceholder": "Simgeleri ara...",
"loadingMore": "Daha fazla simge yükleniyor...",
"allIconsLoaded": "Tüm {count} simge yüklendi",
"noIconsFound": "\"{search}\" için simge bulunamadı",
"tabs": {
"all": "Tüm Simgeler",
"popular": "Popüler",
"auth": "Kimlik Doğrulama Sağlayıcıları"
},
"stats": "{libraryCount} kütüphaneden {iconCount} simge",
"categoryBadge": "{category} ({count} simge)"
},
"login": {
"welcome": "Hoş geldiniz'e",
"signInToContinue": "Devam etmek için oturum açın",
@@ -1426,6 +1443,160 @@
"dark": "Koyu",
"system": "Sistem"
},
"twoFactor": {
"title": "İki Faktörlü Kimlik Doğrulama",
"description": "Hesabınıza ekstra bir güvenlik katmanı ekleyin",
"enabled": "Hesabınız iki faktörlü kimlik doğrulama ile korunuyor",
"disabled": "İki faktörlü kimlik doğrulama etkin değil",
"setup": {
"title": "İki Faktörlü Kimlik Doğrulamayı Etkinleştir",
"description": "QR kodunu kimlik doğrulayıcı uygulamanızla tarayın, ardından doğrulama kodunu girin.",
"qrCode": "QR Kodu",
"manualEntryKey": "Manuel Giriş Anahtarı",
"verificationCode": "Doğrulama Kodu",
"verificationCodePlaceholder": "6 haneli kodu girin",
"verificationCodeDescription": "Kimlik doğrulayıcı uygulamanızdan 6 haneli kodu girin",
"verifyAndEnable": "Doğrula ve Etkinleştir",
"cancel": "İptal"
},
"disable": {
"title": "İki Faktörlü Kimlik Doğrulamayı Devre Dışı Bırak",
"description": "İki faktörlü kimlik doğrulamayı devre dışı bırakmayı onaylamak için şifrenizi girin.",
"password": "Şifre",
"passwordPlaceholder": "Şifrenizi girin",
"confirm": "Devre Dışı Bırakmayı Onayla",
"cancel": "İptal"
},
"backupCodes": {
"title": "Yedek Kodlar",
"description": "Bu yedek kodları güvenli bir yerde saklayın. Kimlik doğrulayıcı cihazınızı kaybederseniz hesabınıza erişmek için bunları kullanabilirsiniz.",
"warning": "Önemli:",
"warningText": "Her yedek kod yalnızca bir kez kullanılabilir. Güvenli tutun ve kimseyle paylaşmayın.",
"generateNew": "Yeni Yedek Kodlar Oluştur",
"download": "Yedek Kodları İndir",
"copyToClipboard": "Panoya Kopyala",
"savedMessage": "Yedek Kodlarımı Kaydettim",
"available": "{count} yedek kod mevcut",
"instructions": [
"• Bu kodları güvenli bir yerde saklayın",
"• Her yedek kod yalnızca bir kez kullanılabilir",
"• İstediğiniz zaman yeni kodlar oluşturabilirsiniz"
]
},
"verification": {
"title": "İki Faktörlü Kimlik Doğrulama",
"description": "Kimlik doğrulayıcı uygulamanızdan 6 haneli kodu girin",
"backupDescription": "Devam etmek için yedek kodlarınızdan birini girin",
"verificationCode": "Doğrulama Kodu",
"backupCode": "Yedek Kod",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Doğrula",
"verifying": "Doğrulanıyor...",
"useBackupCode": "Bunun yerine yedek kod kullan",
"useAuthenticatorCode": "Bunun yerine kimlik doğrulayıcı kodu kullan",
"rememberDevice": "Bu cihazı 30 gün boyunca hatırla",
"rememberDeviceDescription": "Bu cihazda 30 gün boyunca 2FA kodları girmeniz gerekmeyecek"
},
"messages": {
"enabledSuccess": "İki faktörlü kimlik doğrulama başarıyla etkinleştirildi!",
"disabledSuccess": "İki faktörlü kimlik doğrulama başarıyla devre dışı bırakıldı",
"backupCodesGenerated": "Yeni yedek kodlar başarıyla oluşturuldu",
"backupCodesCopied": "Yedek kodlar panoya kopyalandı",
"setupFailed": "2FA kurulumu oluşturulamadı",
"verificationFailed": "Geçersiz doğrulama kodu",
"disableFailed": "2FA devre dışı bırakılamadı. Lütfen şifrenizi kontrol edin.",
"backupCodesFailed": "Yedek kodlar oluşturulamadı",
"backupCodesCopyFailed": "Yedek kodlar kopyalanamadı",
"statusLoadFailed": "2FA durumu yüklenemedi",
"enterVerificationCode": "Lütfen doğrulama kodunu girin",
"enterPassword": "Lütfen şifrenizi girin",
"deviceTrusted": "Bu cihaz 30 gün boyunca güvenilir olarak işaretlendi"
},
"errors": {
"invalidVerificationCode": "Geçersiz doğrulama kodu",
"invalidTwoFactorCode": "Geçersiz iki faktörlü kimlik doğrulama kodu",
"twoFactorRequired": "İki faktörlü kimlik doğrulama gerekli",
"twoFactorAlreadyEnabled": "İki faktörlü kimlik doğrulama zaten etkin",
"twoFactorNotEnabled": "İki faktörlü kimlik doğrulama etkin değil",
"passwordVerificationRequired": "Şifre doğrulaması gerekli",
"invalidPassword": "Geçersiz şifre",
"userNotFound": "Kullanıcı bulunamadı"
},
"buttons": {
"enable2FA": "2FA'yı Etkinleştir",
"disable2FA": "2FA'yı Devre Dışı Bırak"
},
"deviceNames": {
"unknownDevice": "Bilinmeyen Cihaz",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " Windows'ta",
"macos": " macOS'ta",
"linux": " Linux'ta",
"iphone": " iPhone'da",
"android": " Android'de"
}
},
"status": {
"label": "Durum:",
"enabled": "Etkin",
"disabled": "Devre Dışı"
},
"trustedDevices": {
"title": "Güvenilir Cihazlar - 2FA",
"description": "2FA doğrulaması gerektirmeyen cihazlar",
"noDevices": "Güvenilir cihaz yok",
"deviceName": "Cihaz",
"addedOn": "Eklenme tarihi",
"expiresOn": "Bitiş tarihi",
"remove": "Kaldır",
"removeAll": "Tümünü Kaldır",
"confirmRemove": "Bu güvenilir cihazı kaldırmak istediğinizden emin misiniz?",
"confirmRemoveAll": "Tüm güvenilir cihazları kaldırmak istediğinizden emin misiniz?",
"deviceRemoved": "Güvenilir cihaz başarıyla kaldırıldı",
"allDevicesRemoved": "Tüm güvenilir cihazlar başarıyla kaldırıldı",
"loadFailed": "Güvenilir cihazlar yüklenemedi",
"removeFailed": "Güvenilir cihaz kaldırılamadı",
"removeAllFailed": "Tüm güvenilir cihazlar kaldırılamadı",
"loading": "Güvenilir cihazlar yükleniyor...",
"noDevicesDescription": "2FA doğrulaması sırasında cihazları güvenilir olarak işaretlediğinizde burada görünecekler",
"tableHeaders": {
"device": "Cihaz",
"added": "Eklenme",
"expires": "Bitiş",
"lastUsed": "Son Kullanım",
"ipAddress": "IP Adresi",
"actions": "İşlemler"
},
"status": {
"never": "Hiç",
"expired": "Süresi Doldu"
},
"modals": {
"removeDevice": {
"title": "Güvenilir Cihazı Kaldır",
"added": "Eklenme:",
"ip": "IP:"
},
"removeAllDevices": {
"title": "Tüm Güvenilir Cihazları Kaldır",
"description": "Bu işlem {count} güvenilir cihaz{count, plural, =1 {ı} other {ı}} kaldıracak. Tüm cihazlarda 2FA doğrulaması yapmanız gerekecek."
},
"buttons": {
"cancel": "İptal",
"removing": "Kaldırılıyor...",
"removeDevice": "Cihazı Kaldır",
"removeAllDevices": "Tüm Cihazları Kaldır"
}
}
}
},
"uploadFile": {
"title": "Dosya Yükle",
"multipleTitle": "Çoklu Dosya Yükle",
@@ -1542,98 +1713,5 @@
"passwordRequired": "Şifre gerekli",
"nameRequired": "İsim gereklidir",
"required": "Bu alan zorunludur"
},
"iconPicker": {
"title": "Simge Seç",
"placeholder": "Bir simge seç",
"searchPlaceholder": "Simgeleri ara...",
"loadingMore": "Daha fazla simge yükleniyor...",
"allIconsLoaded": "Tüm {count} simge yüklendi",
"noIconsFound": "\"{search}\" için simge bulunamadı",
"tabs": {
"all": "Tüm Simgeler",
"popular": "Popüler",
"auth": "Kimlik Doğrulama Sağlayıcıları"
},
"stats": "{libraryCount} kütüphaneden {iconCount} simge",
"categoryBadge": "{category} ({count} simge)"
},
"twoFactor": {
"title": "İki Faktörlü Kimlik Doğrulama",
"description": "Hesabınıza ekstra bir güvenlik katmanı ekleyin",
"enabled": "Hesabınız iki faktörlü kimlik doğrulama ile korunuyor",
"disabled": "İki faktörlü kimlik doğrulama etkin değil",
"setup": {
"title": "İki Faktörlü Kimlik Doğrulamayı Etkinleştir",
"description": "QR kodunu kimlik doğrulayıcı uygulamanızla tarayın, ardından doğrulama kodunu girin.",
"qrCode": "QR Kodu",
"manualEntryKey": "Manuel Giriş Anahtarı",
"verificationCode": "Doğrulama Kodu",
"verificationCodePlaceholder": "6 haneli kodu girin",
"verificationCodeDescription": "Kimlik doğrulayıcı uygulamanızdan 6 haneli kodu girin",
"verifyAndEnable": "Doğrula ve Etkinleştir",
"cancel": "İptal"
},
"disable": {
"title": "İki Faktörlü Kimlik Doğrulamayı Devre Dışı Bırak",
"description": "İki faktörlü kimlik doğrulamayı devre dışı bırakmayı onaylamak için şifrenizi girin.",
"password": "Şifre",
"passwordPlaceholder": "Şifrenizi girin",
"confirm": "Devre Dışı Bırakmayı Onayla",
"cancel": "İptal"
},
"backupCodes": {
"title": "Yedek Kodlar",
"description": "Bu yedek kodları güvenli bir yerde saklayın. Kimlik doğrulayıcı cihazınızı kaybederseniz hesabınıza erişmek için bunları kullanabilirsiniz.",
"warning": "Önemli:",
"warningText": "Her yedek kod yalnızca bir kez kullanılabilir. Güvenli tutun ve kimseyle paylaşmayın.",
"generateNew": "Yeni Yedek Kodlar Oluştur",
"download": "Yedek Kodları İndir",
"copyToClipboard": "Panoya Kopyala",
"savedMessage": "Yedek Kodlarımı Kaydettim",
"available": "{count} yedek kod mevcut",
"instructions": [
"• Bu kodları güvenli bir yerde saklayın",
"• Her yedek kod yalnızca bir kez kullanılabilir",
"• İstediğiniz zaman yeni kodlar oluşturabilirsiniz"
]
},
"verification": {
"title": "İki Faktörlü Kimlik Doğrulama",
"description": "Kimlik doğrulayıcı uygulamanızdan 6 haneli kodu girin",
"backupDescription": "Devam etmek için yedek kodlarınızdan birini girin",
"verificationCode": "Doğrulama Kodu",
"backupCode": "Yedek Kod",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "Doğrula",
"verifying": "Doğrulanıyor...",
"useBackupCode": "Bunun yerine yedek kod kullan",
"useAuthenticatorCode": "Bunun yerine kimlik doğrulayıcı kodu kullan"
},
"messages": {
"enabledSuccess": "İki faktörlü kimlik doğrulama başarıyla etkinleştirildi!",
"disabledSuccess": "İki faktörlü kimlik doğrulama başarıyla devre dışı bırakıldı",
"backupCodesGenerated": "Yeni yedek kodlar başarıyla oluşturuldu",
"backupCodesCopied": "Yedek kodlar panoya kopyalandı",
"setupFailed": "2FA kurulumu oluşturulamadı",
"verificationFailed": "Geçersiz doğrulama kodu",
"disableFailed": "2FA devre dışı bırakılamadı. Lütfen şifrenizi kontrol edin.",
"backupCodesFailed": "Yedek kodlar oluşturulamadı",
"backupCodesCopyFailed": "Yedek kodlar kopyalanamadı",
"statusLoadFailed": "2FA durumu yüklenemedi",
"enterVerificationCode": "Lütfen doğrulama kodunu girin",
"enterPassword": "Lütfen şifrenizi girin"
},
"errors": {
"invalidVerificationCode": "Geçersiz doğrulama kodu",
"invalidTwoFactorCode": "Geçersiz iki faktörlü kimlik doğrulama kodu",
"twoFactorRequired": "İki faktörlü kimlik doğrulama gerekli",
"twoFactorAlreadyEnabled": "İki faktörlü kimlik doğrulama zaten etkin",
"twoFactorNotEnabled": "İki faktörlü kimlik doğrulama etkin değil",
"passwordVerificationRequired": "Şifre doğrulaması gerekli",
"invalidPassword": "Geçersiz şifre",
"userNotFound": "Kullanıcı bulunamadı"
}
}
}

View File

@@ -143,7 +143,8 @@
"saving": "保存中...",
"update": "更新",
"click": "点击",
"creating": "创建中..."
"creating": "创建中...",
"loadingSimple": "加载中..."
},
"createShare": {
"title": "创建分享",
@@ -189,7 +190,8 @@
"Password verification required": "需要密码验证",
"Two-factor authentication is already enabled": "双重认证已启用",
"Two-factor authentication is not enabled": "双重认证未启用",
"Two-factor authentication required": "需要双重认证"
"Two-factor authentication required": "需要双重认证",
"noUserData": "没有用户数据"
},
"fileActions": {
"editFile": "编辑文件",
@@ -338,6 +340,21 @@
},
"pageTitle": "首页"
},
"iconPicker": {
"title": "选择图标",
"placeholder": "选择一个图标",
"searchPlaceholder": "搜索图标...",
"loadingMore": "正在加载更多图标...",
"allIconsLoaded": "已加载全部 {count} 个图标",
"noIconsFound": "未找到与\"{search}\"相关的图标",
"tabs": {
"all": "所有图标",
"popular": "常用",
"auth": "认证提供商"
},
"stats": "来自 {libraryCount} 个库的 {iconCount} 个图标",
"categoryBadge": "{category}{count} 个图标)"
},
"login": {
"welcome": "欢迎您",
"signInToContinue": "请登录以继续",
@@ -1426,6 +1443,160 @@
"dark": "暗黑",
"system": "系统"
},
"twoFactor": {
"title": "双重认证",
"description": "为您的账户添加额外的安全保护",
"enabled": "您的账户已启用双重认证保护",
"disabled": "未启用双重认证",
"setup": {
"title": "启用双重认证",
"description": "使用您的认证器应用扫描二维码,然后输入验证码。",
"qrCode": "二维码",
"manualEntryKey": "手动输入密钥",
"verificationCode": "验证码",
"verificationCodePlaceholder": "输入6位数验证码",
"verificationCodeDescription": "输入认证器应用生成的6位数验证码",
"verifyAndEnable": "验证并启用",
"cancel": "取消"
},
"disable": {
"title": "禁用双重认证",
"description": "请输入您的密码以确认禁用双重认证。",
"password": "密码",
"passwordPlaceholder": "输入您的密码",
"confirm": "确认禁用",
"cancel": "取消"
},
"backupCodes": {
"title": "备用码",
"description": "请将这些备用码保存在安全的地方。如果您丢失了认证器设备,可以使用它们访问您的账户。",
"warning": "重要提示:",
"warningText": "每个备用码只能使用一次。请妥善保管,不要与任何人分享。",
"generateNew": "生成新的备用码",
"download": "下载备用码",
"copyToClipboard": "复制到剪贴板",
"savedMessage": "我已保存备用码",
"available": "可用备用码:{count}个",
"instructions": [
"• 将这些代码保存在安全的位置",
"• 每个备用码只能使用一次",
"• 您可以随时生成新的备用码"
]
},
"verification": {
"title": "双重认证",
"description": "请输入认证器应用生成的6位数验证码",
"backupDescription": "请输入一个备用码以继续",
"verificationCode": "验证码",
"backupCode": "备用码",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "验证",
"verifying": "验证中...",
"useBackupCode": "使用备用码",
"useAuthenticatorCode": "使用认证器验证码",
"rememberDevice": "在30天内记住此设备",
"rememberDeviceDescription": "在30天内您无需在此设备上输入双重认证码"
},
"messages": {
"enabledSuccess": "双重认证启用成功!",
"disabledSuccess": "双重认证已成功禁用",
"backupCodesGenerated": "新的备用码生成成功",
"backupCodesCopied": "备用码已复制到剪贴板",
"setupFailed": "生成双重认证设置失败",
"verificationFailed": "验证码无效",
"disableFailed": "禁用双重认证失败。请检查您的密码。",
"backupCodesFailed": "生成备用码失败",
"backupCodesCopyFailed": "复制备用码失败",
"statusLoadFailed": "加载双重认证状态失败",
"enterVerificationCode": "请输入验证码",
"enterPassword": "请输入您的密码",
"deviceTrusted": "此设备已被标记为30天内受信任"
},
"errors": {
"invalidVerificationCode": "验证码无效",
"invalidTwoFactorCode": "双重认证码无效",
"twoFactorRequired": "需要双重认证",
"twoFactorAlreadyEnabled": "双重认证已启用",
"twoFactorNotEnabled": "未启用双重认证",
"passwordVerificationRequired": "需要密码验证",
"invalidPassword": "密码无效",
"userNotFound": "未找到用户"
},
"buttons": {
"enable2FA": "启用双重认证",
"disable2FA": "禁用双重认证"
},
"deviceNames": {
"unknownDevice": "未知设备",
"browsers": {
"chrome": "Chrome",
"firefox": "Firefox",
"safari": "Safari",
"edge": "Edge"
},
"platforms": {
"windows": " 在 Windows 上",
"macos": " 在 macOS 上",
"linux": " 在 Linux 上",
"iphone": " 在 iPhone 上",
"android": " 在 Android 上"
}
},
"status": {
"label": "状态:",
"enabled": "已启用",
"disabled": "已禁用"
},
"trustedDevices": {
"title": "受信任设备 - 双重认证",
"description": "无需双重认证验证的设备",
"noDevices": "没有受信任的设备",
"deviceName": "设备",
"addedOn": "添加于",
"expiresOn": "过期于",
"remove": "移除",
"removeAll": "移除全部",
"confirmRemove": "您确定要移除此受信任设备吗?",
"confirmRemoveAll": "您确定要移除所有受信任设备吗?",
"deviceRemoved": "受信任设备已成功移除",
"allDevicesRemoved": "所有受信任设备已成功移除",
"loadFailed": "加载受信任设备失败",
"removeFailed": "移除受信任设备失败",
"removeAllFailed": "移除所有受信任设备失败",
"loading": "正在加载受信任设备...",
"noDevicesDescription": "当您在双重认证验证时选择信任设备时,设备将显示在此处",
"tableHeaders": {
"device": "设备",
"added": "添加时间",
"expires": "过期时间",
"lastUsed": "最后使用",
"ipAddress": "IP地址",
"actions": "操作"
},
"status": {
"never": "从未",
"expired": "已过期"
},
"modals": {
"removeDevice": {
"title": "移除受信任设备",
"added": "添加时间:",
"ip": "IP地址"
},
"removeAllDevices": {
"title": "移除所有受信任设备",
"description": "这将移除 {count} 个受信任设备。您需要在所有设备上重新进行双重认证验证。"
},
"buttons": {
"cancel": "取消",
"removing": "正在移除...",
"removeDevice": "移除设备",
"removeAllDevices": "移除所有设备"
}
}
}
},
"uploadFile": {
"title": "上传文件",
"multipleTitle": "上传多个文件",
@@ -1542,98 +1713,5 @@
"passwordRequired": "密码为必填项",
"nameRequired": "名称为必填项",
"required": "此字段为必填项"
},
"iconPicker": {
"title": "选择图标",
"placeholder": "选择一个图标",
"searchPlaceholder": "搜索图标...",
"loadingMore": "正在加载更多图标...",
"allIconsLoaded": "已加载全部 {count} 个图标",
"noIconsFound": "未找到与\"{search}\"相关的图标",
"tabs": {
"all": "所有图标",
"popular": "常用",
"auth": "认证提供商"
},
"stats": "来自 {libraryCount} 个库的 {iconCount} 个图标",
"categoryBadge": "{category}{count} 个图标)"
},
"twoFactor": {
"title": "双重认证",
"description": "为您的账户添加额外的安全保护",
"enabled": "您的账户已启用双重认证保护",
"disabled": "未启用双重认证",
"setup": {
"title": "启用双重认证",
"description": "使用您的认证器应用扫描二维码,然后输入验证码。",
"qrCode": "二维码",
"manualEntryKey": "手动输入密钥",
"verificationCode": "验证码",
"verificationCodePlaceholder": "输入6位数验证码",
"verificationCodeDescription": "输入认证器应用生成的6位数验证码",
"verifyAndEnable": "验证并启用",
"cancel": "取消"
},
"disable": {
"title": "禁用双重认证",
"description": "请输入您的密码以确认禁用双重认证。",
"password": "密码",
"passwordPlaceholder": "输入您的密码",
"confirm": "确认禁用",
"cancel": "取消"
},
"backupCodes": {
"title": "备用码",
"description": "请将这些备用码保存在安全的地方。如果您丢失了认证器设备,可以使用它们访问您的账户。",
"warning": "重要提示:",
"warningText": "每个备用码只能使用一次。请妥善保管,不要与任何人分享。",
"generateNew": "生成新的备用码",
"download": "下载备用码",
"copyToClipboard": "复制到剪贴板",
"savedMessage": "我已保存备用码",
"available": "可用备用码:{count}个",
"instructions": [
"• 将这些代码保存在安全的位置",
"• 每个备用码只能使用一次",
"• 您可以随时生成新的备用码"
]
},
"verification": {
"title": "双重认证",
"description": "请输入认证器应用生成的6位数验证码",
"backupDescription": "请输入一个备用码以继续",
"verificationCode": "验证码",
"backupCode": "备用码",
"verificationCodePlaceholder": "000000",
"backupCodePlaceholder": "XXXX-XXXX",
"verify": "验证",
"verifying": "验证中...",
"useBackupCode": "使用备用码",
"useAuthenticatorCode": "使用认证器验证码"
},
"messages": {
"enabledSuccess": "双重认证启用成功!",
"disabledSuccess": "双重认证已成功禁用",
"backupCodesGenerated": "新的备用码生成成功",
"backupCodesCopied": "备用码已复制到剪贴板",
"setupFailed": "生成双重认证设置失败",
"verificationFailed": "验证码无效",
"disableFailed": "禁用双重认证失败。请检查您的密码。",
"backupCodesFailed": "生成备用码失败",
"backupCodesCopyFailed": "复制备用码失败",
"statusLoadFailed": "加载双重认证状态失败",
"enterVerificationCode": "请输入验证码",
"enterPassword": "请输入您的密码"
},
"errors": {
"invalidVerificationCode": "验证码无效",
"invalidTwoFactorCode": "双重认证码无效",
"twoFactorRequired": "需要双重认证",
"twoFactorAlreadyEnabled": "双重认证已启用",
"twoFactorNotEnabled": "未启用双重认证",
"passwordVerificationRequired": "需要密码验证",
"invalidPassword": "密码无效",
"userNotFound": "未找到用户"
}
}
}

View File

@@ -97,4 +97,4 @@
"tailwindcss": "4.1.11",
"typescript": "5.8.3"
}
}
}

4503
apps/web/pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,33 @@
import { NextRequest, NextResponse } from "next/server";
const API_BASE_URL = process.env.API_BASE_URL || "http://localhost:3333";
export async function DELETE(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
try {
const { id } = await params;
const deleteUrl = `${API_BASE_URL}/auth/trusted-devices/${id}`;
const apiRes = await fetch(deleteUrl, {
method: "DELETE",
headers: {
...Object.fromEntries(
Array.from(request.headers.entries()).filter(
([key]) => key.startsWith("authorization") || key.startsWith("cookie")
)
),
},
});
const data = await apiRes.json();
return NextResponse.json(data, {
status: apiRes.status,
headers: {
"Content-Type": "application/json",
},
});
} catch (error) {
console.error("Error proxying trusted device delete:", error);
return NextResponse.json({ success: false, error: "Internal server error" }, { status: 500 });
}
}

View File

@@ -0,0 +1,71 @@
import { NextRequest, NextResponse } from "next/server";
const API_BASE_URL = process.env.API_BASE_URL || "http://localhost:3333";
export async function GET(req: NextRequest) {
try {
const cookieHeader = req.headers.get("cookie");
const url = `${API_BASE_URL}/auth/trusted-devices`;
const apiRes = await fetch(url, {
method: "GET",
headers: {
cookie: cookieHeader || "",
...Object.fromEntries(Array.from(req.headers.entries()).filter(([key]) => key.startsWith("authorization"))),
},
redirect: "manual",
});
const resBody = await apiRes.text();
const res = new NextResponse(resBody, {
status: apiRes.status,
headers: {
"Content-Type": "application/json",
},
});
const setCookie = apiRes.headers.getSetCookie?.() || [];
if (setCookie.length > 0) {
res.headers.set("Set-Cookie", setCookie.join(","));
}
return res;
} catch (error) {
console.error("Error proxying trusted devices request:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
}
}
export async function DELETE(req: NextRequest) {
try {
const cookieHeader = req.headers.get("cookie");
const url = `${API_BASE_URL}/auth/trusted-devices`;
const apiRes = await fetch(url, {
method: "DELETE",
headers: {
cookie: cookieHeader || "",
...Object.fromEntries(Array.from(req.headers.entries()).filter(([key]) => key.startsWith("authorization"))),
},
redirect: "manual",
});
const resBody = await apiRes.text();
const res = new NextResponse(resBody, {
status: apiRes.status,
headers: {
"Content-Type": "application/json",
},
});
const setCookie = apiRes.headers.getSetCookie?.() || [];
if (setCookie.length > 0) {
res.headers.set("Set-Cookie", setCookie.join(","));
}
return res;
} catch (error) {
console.error("Error proxying remove all trusted devices request:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
}
}

View File

@@ -77,7 +77,7 @@ export function useLogin() {
const userResponse = await getCurrentUser();
if (!userResponse?.data?.user) {
throw new Error("No user data");
throw new Error(t("errors.noUserData"));
}
const { isAdmin, ...userData } = userResponse.data.user;
@@ -143,16 +143,16 @@ export function useLogin() {
setError(undefined);
setIsSubmitting(true);
try {
const response = await completeTwoFactorLogin({
userId: twoFactorUserId,
token: twoFactorCode,
rememberDevice: rememberDevice,
});
const { isAdmin, ...userData } = response.data.user;
setUser(userData);
setIsAdmin(isAdmin);
setIsAuthenticated(true);

View File

@@ -2,16 +2,24 @@
import { useState } from "react";
import {
IconAlertTriangle,
IconCalendar,
IconClock,
IconCopy,
IconDeviceDesktop,
IconDeviceMobile,
IconDevices,
IconDownload,
IconEye,
IconEyeClosed,
IconKey,
IconShield,
IconShieldCheck,
IconTrash,
} from "@tabler/icons-react";
import { useTranslations } from "next-intl";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import {
@@ -25,6 +33,9 @@ import {
import { Input } from "@/components/ui/input";
import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/input-otp";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { useTrustedDevices } from "../hooks/use-trusted-devices";
import { useTwoFactor } from "../hooks/use-two-factor";
export function TwoFactorForm() {
@@ -52,8 +63,35 @@ export function TwoFactorForm() {
copyBackupCodes,
} = useTwoFactor();
const {
isLoading: devicesLoading,
devices,
isRemoveModalOpen,
isRemoveAllModalOpen,
deviceToRemove,
isRemoving,
setIsRemoveModalOpen,
setIsRemoveAllModalOpen,
handleRemoveDevice,
confirmRemoveDevice,
handleRemoveAllDevices,
confirmRemoveAllDevices,
formatDeviceName,
formatDate,
} = useTrustedDevices();
const [showPassword, setShowPassword] = useState(false);
const getDeviceIcon = (userAgent: string) => {
if (!userAgent) return IconDevices;
if (userAgent.includes("iPhone") || userAgent.includes("Android") || userAgent.includes("Mobile")) {
return IconDeviceMobile;
}
return IconDeviceDesktop;
};
if (isLoading) {
return (
<Card>
@@ -62,7 +100,7 @@ export function TwoFactorForm() {
<IconShield className="h-5 w-5" />
{t("twoFactor.title")}
</CardTitle>
<CardDescription>Loading...</CardDescription>
<CardDescription>{t("common.loadingSimple")}</CardDescription>
</CardHeader>
</Card>
);
@@ -85,7 +123,10 @@ export function TwoFactorForm() {
<CardContent className="space-y-4">
<div className="flex items-center justify-between">
<div>
<p className="font-medium">Status: {status.enabled ? "Enabled" : "Disabled"}</p>
<p className="font-medium">
{t("twoFactor.status.label")}{" "}
{status.enabled ? t("twoFactor.status.enabled") : t("twoFactor.status.disabled")}
</p>
{status.enabled && (
<p className="text-sm text-muted-foreground">
{t("twoFactor.backupCodes.available", { count: status.availableBackupCodes })}
@@ -100,17 +141,154 @@ export function TwoFactorForm() {
{t("twoFactor.backupCodes.generateNew")}
</Button>
<Button variant="destructive" onClick={() => setIsDisableModalOpen(true)} disabled={isLoading}>
Disable 2FA
{t("twoFactor.buttons.disable2FA")}
</Button>
</>
) : (
<Button onClick={startSetup} disabled={isLoading}>
<IconShield className="h-4 w-4" />
Enable 2FA
{t("twoFactor.buttons.enable2FA")}
</Button>
)}
</div>
</div>
{/* Trusted Devices Section - Only shown when 2FA is enabled */}
{status.enabled && (
<>
<Separator className="my-6" />
<div className="space-y-4">
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<IconDevices className="h-5 w-5 text-muted-foreground" />
<h3 className="text-lg font-semibold">{t("twoFactor.trustedDevices.title")}</h3>
</div>
{devices.length > 0 && (
<Button
variant="ghost"
size="sm"
onClick={handleRemoveAllDevices}
disabled={isRemoving}
className="text-muted-foreground hover:text-destructive"
>
<IconTrash className="h-4 w-4" />
{t("twoFactor.trustedDevices.removeAll")}
</Button>
)}
</div>
<p className="text-sm text-muted-foreground">{t("twoFactor.trustedDevices.description")}</p>
{devicesLoading ? (
<div className="text-center py-8">
<p className="text-muted-foreground">{t("twoFactor.trustedDevices.loading")}</p>
</div>
) : devices.length === 0 ? (
<div className="text-center py-12">
<IconDevices className="h-12 w-12 mx-auto text-muted-foreground mb-4" />
<p className="text-muted-foreground text-sm">{t("twoFactor.trustedDevices.noDevices")}</p>
<p className="text-xs text-muted-foreground/70 mt-2">
{t("twoFactor.trustedDevices.noDevicesDescription")}
</p>
</div>
) : (
<div className="border rounded-lg overflow-hidden">
<Table>
<TableHeader>
<TableRow className="bg-muted/50">
<TableHead className="w-12"></TableHead>
<TableHead className="font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.device")}
</TableHead>
<TableHead className="font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.added")}
</TableHead>
<TableHead className="font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.expires")}
</TableHead>
<TableHead className="font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.lastUsed")}
</TableHead>
<TableHead className="font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.ipAddress")}
</TableHead>
<TableHead className="w-20 text-center font-semibold">
{t("twoFactor.trustedDevices.tableHeaders.actions")}
</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{devices.map((device) => {
const isExpired = new Date(device.expiresAt) < new Date();
const DeviceIcon = getDeviceIcon(device.userAgent || "");
return (
<TableRow key={device.id}>
<TableCell className="text-center">
<DeviceIcon className="h-4 w-4 text-muted-foreground" />
</TableCell>
<TableCell>
<div className="flex items-center gap-2">
<span className={`font-medium ${isExpired ? "text-muted-foreground" : ""}`}>
{formatDeviceName(device)}
</span>
{isExpired && (
<Badge variant="secondary" className="text-xs text-destructive">
{t("twoFactor.trustedDevices.status.expired")}
</Badge>
)}
</div>
</TableCell>
<TableCell>
<div className="flex items-center gap-1 text-sm text-muted-foreground">
<IconCalendar className="h-3 w-3" />
<span>{formatDate(device.createdAt)}</span>
</div>
</TableCell>
<TableCell>
<div
className={`flex items-center gap-1 text-sm ${isExpired ? "text-destructive" : "text-muted-foreground"}`}
>
<IconClock className="h-3 w-3" />
<span>{formatDate(device.expiresAt)}</span>
</div>
</TableCell>
<TableCell>
{device.lastUsedAt ? (
<div className="flex items-center gap-1 text-sm text-muted-foreground">
<IconClock className="h-3 w-3" />
<span>{formatDate(device.lastUsedAt)}</span>
</div>
) : (
<span className="text-sm text-muted-foreground">
{t("twoFactor.trustedDevices.status.never")}
</span>
)}
</TableCell>
<TableCell>
<span className="text-sm text-muted-foreground font-mono">{device.ipAddress}</span>
</TableCell>
<TableCell className="text-center">
<Button
variant="ghost"
size="sm"
onClick={() => handleRemoveDevice(device)}
disabled={isRemoving}
className="text-muted-foreground hover:text-destructive h-8 w-8 p-0"
>
<IconTrash className="h-4 w-4" />
</Button>
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</div>
)}
</div>
</>
)}
</CardContent>
</Card>
@@ -270,6 +448,72 @@ export function TwoFactorForm() {
</DialogFooter>
</DialogContent>
</Dialog>
{/* Remove Device Modal */}
<Dialog open={isRemoveModalOpen} onOpenChange={setIsRemoveModalOpen}>
<DialogContent className="max-w-md">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<IconAlertTriangle className="h-5 w-5 text-destructive" />
{t("twoFactor.trustedDevices.modals.removeDevice.title")}
</DialogTitle>
<DialogDescription>{t("twoFactor.trustedDevices.confirmRemove")}</DialogDescription>
</DialogHeader>
{deviceToRemove && (
<div className="p-4 bg-muted rounded-lg">
<p className="font-medium">{formatDeviceName(deviceToRemove)}</p>
<p className="text-sm text-muted-foreground">
{t("twoFactor.trustedDevices.modals.removeDevice.added")} {formatDate(deviceToRemove.createdAt)}
</p>
<p className="text-xs text-muted-foreground">
{t("twoFactor.trustedDevices.modals.removeDevice.ip")} {deviceToRemove.ipAddress}
</p>
</div>
)}
<DialogFooter>
<Button variant="outline" onClick={() => setIsRemoveModalOpen(false)} disabled={isRemoving}>
{t("twoFactor.trustedDevices.modals.buttons.cancel")}
</Button>
<Button variant="destructive" onClick={confirmRemoveDevice} disabled={isRemoving}>
{isRemoving
? t("twoFactor.trustedDevices.modals.buttons.removing")
: t("twoFactor.trustedDevices.modals.buttons.removeDevice")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
{/* Remove All Devices Modal */}
<Dialog open={isRemoveAllModalOpen} onOpenChange={setIsRemoveAllModalOpen}>
<DialogContent className="max-w-md">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<IconAlertTriangle className="h-5 w-5 text-destructive" />
{t("twoFactor.trustedDevices.modals.removeAllDevices.title")}
</DialogTitle>
<DialogDescription>{t("twoFactor.trustedDevices.confirmRemoveAll")}</DialogDescription>
</DialogHeader>
<div className="p-4 bg-muted rounded-lg">
<p className="text-sm">
{t("twoFactor.trustedDevices.modals.removeAllDevices.description", { count: devices.length })}
</p>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => setIsRemoveAllModalOpen(false)} disabled={isRemoving}>
{t("twoFactor.trustedDevices.modals.buttons.cancel")}
</Button>
<Button variant="destructive" onClick={confirmRemoveAllDevices} disabled={isRemoving}>
{isRemoving
? t("twoFactor.trustedDevices.modals.buttons.removing")
: t("twoFactor.trustedDevices.modals.buttons.removeAllDevices")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</>
);
}

View File

@@ -0,0 +1,144 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { useTranslations } from "next-intl";
import { toast } from "sonner";
import { getTrustedDevices, removeAllTrustedDevices, removeTrustedDevice } from "@/http/endpoints";
import type { TrustedDevice } from "@/http/endpoints/auth/trusted-devices/types";
export function useTrustedDevices() {
const t = useTranslations();
const [isLoading, setIsLoading] = useState(true);
const [devices, setDevices] = useState<TrustedDevice[]>([]);
const [isRemoveModalOpen, setIsRemoveModalOpen] = useState(false);
const [isRemoveAllModalOpen, setIsRemoveAllModalOpen] = useState(false);
const [deviceToRemove, setDeviceToRemove] = useState<TrustedDevice | null>(null);
const [isRemoving, setIsRemoving] = useState(false);
const loadDevices = useCallback(async () => {
try {
setIsLoading(true);
const response = await getTrustedDevices();
setDevices(response.devices);
} catch (error) {
toast.error(t("twoFactor.trustedDevices.loadFailed"));
console.error("Failed to load trusted devices:", error);
} finally {
setIsLoading(false);
}
}, [t]);
const handleRemoveDevice = useCallback(async (device: TrustedDevice) => {
setDeviceToRemove(device);
setIsRemoveModalOpen(true);
}, []);
const confirmRemoveDevice = useCallback(async () => {
if (!deviceToRemove) return;
try {
setIsRemoving(true);
await removeTrustedDevice({ deviceId: deviceToRemove.id });
toast.success(t("twoFactor.trustedDevices.deviceRemoved"));
await loadDevices();
setIsRemoveModalOpen(false);
setDeviceToRemove(null);
} catch (error) {
toast.error(t("twoFactor.trustedDevices.removeFailed"));
console.error("Failed to remove trusted device:", error);
} finally {
setIsRemoving(false);
}
}, [deviceToRemove, t, loadDevices]);
const handleRemoveAllDevices = useCallback(() => {
setIsRemoveAllModalOpen(true);
}, []);
const confirmRemoveAllDevices = useCallback(async () => {
try {
setIsRemoving(true);
const response = await removeAllTrustedDevices();
toast.success(t("twoFactor.trustedDevices.allDevicesRemoved"));
await loadDevices();
setIsRemoveAllModalOpen(false);
} catch (error) {
toast.error(t("twoFactor.trustedDevices.removeAllFailed"));
console.error("Failed to remove all trusted devices:", error);
} finally {
setIsRemoving(false);
}
}, [t, loadDevices]);
const formatDeviceName = useCallback(
(device: TrustedDevice) => {
const userAgent = device.userAgent;
// Extract browser and OS info from user agent
let deviceInfo = t("twoFactor.deviceNames.unknownDevice");
// Verificação de null safety
if (!userAgent) {
return deviceInfo;
}
if (userAgent.includes("Chrome")) {
deviceInfo = t("twoFactor.deviceNames.browsers.chrome");
} else if (userAgent.includes("Firefox")) {
deviceInfo = t("twoFactor.deviceNames.browsers.firefox");
} else if (userAgent.includes("Safari") && !userAgent.includes("Chrome")) {
deviceInfo = t("twoFactor.deviceNames.browsers.safari");
} else if (userAgent.includes("Edge")) {
deviceInfo = t("twoFactor.deviceNames.browsers.edge");
}
if (userAgent.includes("Windows")) {
deviceInfo += t("twoFactor.deviceNames.platforms.windows");
} else if (userAgent.includes("Mac")) {
deviceInfo += t("twoFactor.deviceNames.platforms.macos");
} else if (userAgent.includes("Linux")) {
deviceInfo += t("twoFactor.deviceNames.platforms.linux");
} else if (userAgent.includes("iPhone")) {
deviceInfo += t("twoFactor.deviceNames.platforms.iphone");
} else if (userAgent.includes("Android")) {
deviceInfo += t("twoFactor.deviceNames.platforms.android");
}
return deviceInfo;
},
[t]
);
const formatDate = useCallback((dateString: string) => {
return new Date(dateString).toLocaleDateString("en-US", {
year: "numeric",
month: "short",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
});
}, []);
useEffect(() => {
loadDevices();
}, [loadDevices]);
return {
isLoading,
devices,
isRemoveModalOpen,
isRemoveAllModalOpen,
deviceToRemove,
isRemoving,
setIsRemoveModalOpen,
setIsRemoveAllModalOpen,
handleRemoveDevice,
confirmRemoveDevice,
handleRemoveAllDevices,
confirmRemoveAllDevices,
formatDeviceName,
formatDate,
loadDevices,
};
}

View File

@@ -1,39 +1,30 @@
"use client"
"use client";
import * as React from "react"
import { OTPInput, OTPInputContext } from "input-otp"
import { MinusIcon } from "lucide-react"
import * as React from "react";
import { OTPInput, OTPInputContext } from "input-otp";
import { MinusIcon } from "lucide-react";
import { cn } from "@/lib/utils"
import { cn } from "@/lib/utils";
function InputOTP({
className,
containerClassName,
...props
}: React.ComponentProps<typeof OTPInput> & {
containerClassName?: string
containerClassName?: string;
}) {
return (
<OTPInput
data-slot="input-otp"
containerClassName={cn(
"flex items-center gap-2 has-disabled:opacity-50",
containerClassName
)}
containerClassName={cn("flex items-center gap-2 has-disabled:opacity-50", containerClassName)}
className={cn("disabled:cursor-not-allowed", className)}
{...props}
/>
)
);
}
function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="input-otp-group"
className={cn("flex items-center", className)}
{...props}
/>
)
return <div data-slot="input-otp-group" className={cn("flex items-center", className)} {...props} />;
}
function InputOTPSlot({
@@ -41,10 +32,10 @@ function InputOTPSlot({
className,
...props
}: React.ComponentProps<"div"> & {
index: number
index: number;
}) {
const inputOTPContext = React.useContext(OTPInputContext)
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}
const inputOTPContext = React.useContext(OTPInputContext);
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
return (
<div
@@ -63,7 +54,7 @@ function InputOTPSlot({
</div>
)}
</div>
)
);
}
function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
@@ -71,7 +62,7 @@ function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
<div data-slot="input-otp-separator" role="separator" {...props}>
<MinusIcon />
</div>
)
);
}
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };

View File

@@ -0,0 +1,24 @@
import apiInstance from "@/config/api";
import {
RemoveAllTrustedDevicesResponse,
RemoveTrustedDeviceRequest,
RemoveTrustedDeviceResponse,
TrustedDevicesResponse,
} from "./types";
export const getTrustedDevices = async (): Promise<TrustedDevicesResponse> => {
const response = await apiInstance.get("/api/auth/trusted-devices");
return response.data;
};
export const removeTrustedDevice = async (data: RemoveTrustedDeviceRequest): Promise<RemoveTrustedDeviceResponse> => {
const response = await apiInstance.delete(`/api/auth/trusted-devices/${data.deviceId}`);
return response.data;
};
export const removeAllTrustedDevices = async (): Promise<RemoveAllTrustedDevicesResponse> => {
const response = await apiInstance.delete("/api/auth/trusted-devices");
return response.data;
};
export * from "./types";

View File

@@ -0,0 +1,28 @@
export interface TrustedDevice {
id: string;
deviceName: string | null;
userAgent: string | null;
ipAddress: string | null;
createdAt: string;
lastUsedAt: string;
expiresAt: string;
}
export interface TrustedDevicesResponse {
devices: TrustedDevice[];
}
export interface RemoveTrustedDeviceRequest {
deviceId: string;
}
export interface RemoveTrustedDeviceResponse {
success: boolean;
message: string;
}
export interface RemoveAllTrustedDevicesResponse {
success: boolean;
message: string;
removedCount: number;
}

View File

@@ -5,3 +5,4 @@ export * from "./shares";
export * from "./reverse-shares";
export * from "./config";
export * from "./app";
export * from "./auth/trusted-devices";

View File

@@ -1,11 +1,7 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -23,20 +19,9 @@
}
],
"paths": {
"@/*": [
"./src/*"
]
"@/*": ["./src/*"]
}
},
"exclude": [
"node_modules",
".next/types/app/api/(proxy)/**/*",
".next/types/**/*.ts"
],
"include": [
"**/*.ts",
"**/*.tsx",
"next-env.d.ts",
".next/types/**/*.ts"
]
"exclude": ["node_modules", ".next/types/app/api/(proxy)/**/*", ".next/types/**/*.ts"],
"include": ["**/*.ts", "**/*.tsx", "next-env.d.ts", ".next/types/**/*.ts"]
}