feat: enhance localization across settings views

- Updated LocalizationSettings to use translation keys for titles and descriptions.
- Refactored MFASettings to utilize translation for error messages, success messages, and UI text.
- Improved NotificationSetting by integrating translation for all user-facing strings.
- Initial Hebrew translation ( testing AI translation ( some of crowdin)
- Adjusted ProfileSettings to use translation for the edit photo title.
- Enhanced SettingsOverview to utilize translation for the early access label.
- Updated SidepanelSettings to implement translation for card names and descriptions.
- Refined StorageSettings to use translation for all storage-related messages and titles.
- Improved ThemeSettings to utilize translation for theme descriptions and titles.
This commit is contained in:
Mo Tarbin
2026-08-11 02:19:40 -04:00
parent 9bc82b9dc5
commit 8c9bf0db1d
44 changed files with 7453 additions and 2088 deletions

View File

@@ -20,6 +20,7 @@
"logout": "تسجيل الخروج",
"version": "النسخة",
"navigation": {
"search": "بحث",
"allTasks": "جميع المهام",
"archived": "المؤرشفة",
"things": "الأشياء",
@@ -29,5 +30,47 @@
"activities": "الأنشطة",
"points": "النقاط",
"settings": "الإعدادات"
},
"search": {
"title": "بحث",
"placeholder": "ابحث في Donetick",
"inputAriaLabel": "ابحث في المهام والسجل والمشاريع والتسميات والإعدادات",
"deviceNote": "يتم البحث في المحتوى المتوفر على هذا الجهاز",
"escape": "Esc",
"recent": "الأخيرة",
"empty": {
"title": "لا توجد نتائج مطابقة",
"subtitle": "لا يزال بإمكانك تصفية قائمة المهام باستخدام هذا البحث."
},
"groups": {
"tasks": "المهام",
"history": "الملاحظات",
"projects": "المشاريع",
"labels": "التسميات",
"people": "الأشخاص",
"settings": "الإعدادات",
"actions": "إجراءات سريعة"
},
"actions": {
"quickAction": "إجراء سريع",
"navigation": "التنقل",
"createTask": "إنشاء مهمة",
"viewAllTasks": "عرض جميع المهام",
"viewArchivedTasks": "عرض المهام المؤرشفة",
"openSettings": "فتح الإعدادات",
"filterTasks": "عرض المهام المطابقة لـ «{{query}}»",
"filterTasksSubtitle": "تصفية قائمة المهام"
},
"footer": {
"navigate": "تنقل",
"open": "فتح",
"results_zero": "لا توجد نتائج",
"results_one": "نتيجة واحدة",
"results_two": "نتيجتان",
"results_few": "{{count}} نتائج",
"results_many": "{{count}} نتيجة",
"results_other": "{{count}} نتيجة",
"typeToSearch": "اكتب للبحث"
}
}
}

View File

@@ -1,116 +1,29 @@
{
"title": "الإعدادات",
"circleSettings": {
"title": "إعدادات الدائرة",
"description": "يتم ربط حسابك تلقائيًا بدائرة عند إنشاء واحدة أو الانضمام إليها. ادعُ الأصدقاء بسهولة من خلال مشاركة رمز الدائرة الفريد أو الرابط أدناه. ستتلقى إشعارًا أدناه عندما يطلب شخص ما الانضمام إلى دائرتك. إذا كنت ترغب في المغادرة، فما عليك سوى الضغط على زر 'مغادرة الدائرة'.",
"circleCode": "رمز الدائرة",
"copyCode": "نسخ الرمز",
"copyLink": "نسخ الرابط",
"codeCopied": "تم نسخ رمز الدائرة!",
"linkCopied": "تم نسخ الرابط!",
"joinCircle": "الانضمام إلى دائرة",
"joinCirclePlaceholder": "أدخل رمز الدائرة",
"join": "انضمام",
"leave": "مغادرة الدائرة",
"leaveConfirmTitle": "مغادرة الدائرة",
"leaveConfirmMessage": "هل أنت متأكد من أنك تريد مغادرة هذه الدائرة؟",
"circleMembers": "أعضاء الدائرة",
"circleMemberRequests": "طلبات انضمام الأعضاء",
"admin": "مشرف",
"member": "عضو",
"pending": "قيد الانتظار",
"accept": "قبول",
"reject": "رفض",
"makeAdmin": "جعله مشرف",
"makeMember": "جعله عضو",
"remove": "إزالة",
"webhookURL": "رابط Webhook",
"webhookDescription": "أدخل رابط webhook لتلقي إشعارات أحداث الدائرة",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "إعدادات الحساب",
"subscription": "الاشتراك",
"subscriptionStatus": "الخطة الحالية",
"free": "مجاني",
"plus": "بلس",
"upgrade": "ترقية",
"cancel": "إلغاء",
"changePassword": "تغيير كلمة المرور",
"password": "كلمة المرور",
"dangerZone": "منطقة الخطر",
"dangerZoneDescription": "بمجرد حذف حسابك، لا يمكن التراجع. يرجى التأكد.",
"deleteAccount": "حذف الحساب"
},
"localization": {
"title": "التوطين",
"description": "تخصيص اللغة وتنسيق التاريخ والتفضيلات الإقليمية لحسابك.",
"language": "اللغة",
"languageDescription": "اختر لغتك المفضلة",
"dateFormat": "تنسيق التاريخ",
"dateFormatDescription": "اختر كيفية عرض التواريخ في التطبيق",
"timeFormat": "تنسيق الوقت",
"timeFormatDescription": "اختر تنسيق 12 أو 24 ساعة",
"12hour": "12 ساعة (ص/م)",
"24hour": "24 ساعة",
"firstDayOfWeek": "أول يوم في الأسبوع",
"firstDayOfWeekDescription": "اختر اليوم الذي يبدأ به أسبوعك",
"sunday": "الأحد",
"monday": "الاثنين",
"saturday": "السبت",
"formats": {
"mdy": "MM/DD/YYYY (الولايات المتحدة)",
"dmy": "DD/MM/YYYY (أوروبا)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "تنسيق طويل (مثل 1 يناير 2024)",
"short": "تنسيق قصير (مثل 1 يناير 2024)"
}
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"description": "قم بتخصيص تخطيط ورؤية البطاقات في اللوحة الجانبية. هذا القسم متاح فقط على أجهزة الشاشة الكبيرة مثل الأجهزة اللوحية وأجهزة سطح المكتب."
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر كيف يبدو الموقع لك. حدد مظهرًا واحدًا أو قم بالمزامنة مع نظامك والتبديل تلقائيًا بين مظاهر النهار والليل.",
"themeMode": "وضع المظهر",
"light": "فاتح",
"dark": "داكن",
"system": "النظام"
},
"notifications": {
"settingsSaved": "تم حفظ الإعدادات بنجاح",
"settingsSaveFailed": "فشل حفظ الإعدادات",
"invalidWebhook": "رابط webhook غير صالح"
},
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "تحديث اسم العرض وصورة الملف الشخصي.",
"photoUpdated": "تم تحديث الصورة",
"photoUpdatedMessage": "تم تحديث صورة ملفك الشخصي بنجاح!",
"uploadFailed": "فشل التحميل",
"uploadFailedMessage": "فشل تحميل صورتك. يرجى المحاولة مرة أخرى.",
"profileUpdated": "تم تحديث الملف الشخصي",
"profileUpdatedMessage": "تم حفظ معلومات ملفك الشخصي بنجاح!",
"updateFailed": "فشل التحديث",
"updateFailedMessage": "تعذر تحديث ملفك الشخصي. يرجى التحقق من اتصالك والمحاولة مرة أخرى.",
"changePhoto": "تغيير الصورة",
"displayName": "اسم العرض",
"displayNamePlaceholder": "أدخل اسم العرض الخاص بك",
"timezone": "المنطقة الزمنية",
"timezonePlaceholder": "اختر منطقتك الزمنية",
"common": {
"save": "حفظ",
"cancel": "إلغاء"
"cancel": "إلغاء",
"confirm": "تأكيد",
"remove": "إزالة",
"delete": "حذف",
"refresh": "تحديث",
"loading": "جارٍ التحميل…",
"on": "مفعّل",
"off": "متوقف",
"error": "خطأ",
"success": "تم بنجاح",
"plusFeature": "ميزة Plus",
"earlyAccess": "وصول مبكر"
},
"overview": {
"title": "الإعدادات",
"subtitle": "قم بتخصيص تجربتك وإدارة تفضيلات حسابك",
"subtitle": "خصّص تجربتك وأدر تفضيلات حسابك",
"upgrade": {
"title": "الترقية إلى بلس",
"description": "افتح ميزات قوية لتعزيز إنتاجيتك",
"button": "الترقية الآن",
"title": "الترقية إلى Plus",
"description": "افتح ميزات قوية تزيد من إنتاجيتك",
"button": "ترقية الآن",
"features": {
"richText": "أوصاف نصية منسقة",
"richText": "أوصاف بنص منسّق",
"notifications": "إشعارات المهام",
"apiIntegrations": "تكاملات API",
"advancedAutomation": "أتمتة متقدمة"
@@ -119,56 +32,463 @@
"sections": {
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "تحديث معلومات ملفك الشخصي والصورة واسم العرض وتفضيلات المنطقة الزمنية."
"description": "حدّث معلومات ملفك الشخصي وصورتك واسم العرض والمنطقة الزمنية."
},
"circle": {
"title": "إعدادات الدائرة",
"description": "إدارة دائرتك ودعوة الأعضاء والتعامل مع طلبات الانضمام."
"description": "أدر دائرتك، وادعُ الأعضاء، وتعامل مع طلبات الانضمام."
},
"account": {
"title": "إعدادات الحساب",
"description": "إدارة اشتراكك وتغيير كلمة المرور وخيارات حذف الحساب."
"description": "أدر اشتراكك، وغيّر كلمة المرور، واحذف حسابك."
},
"subaccounts": {
"title": "الحسابات المُدارة",
"description": "إنشاء وإدارة حسابات فرعية لتسجيل الدخول وإكمال المهام المعينة."
"description": "أنشئ وأدر حسابات فرعية يمكنها تسجيل الدخول وإنجاز المهام المسندة إليها."
},
"notifications": {
"title": "الإشعارات",
"description": "تكوين الإشعارات الفورية وتنبيهات البريد الإلكتروني ووجهات الإشعارات للمهام."
"description": "اضبط الإشعارات الفورية وتنبيهات البريد ووجهات إشعارات المهام."
},
"mfa": {
"title": "المصادقة متعددة العوامل",
"description": "إضافة طبقة إضافية من الأمان باستخدام MFA مع تطبيقات المصادقة."
"description": "أضف طبقة حماية إضافية عبر المصادقة متعددة العوامل باستخدام تطبيقات المصادقة."
},
"apitokens": {
"title": "رموز API",
"description": "إنشاء وإدارة رموز الوصول لتكاملات الطرف الثالث والوصول إلى API."
"description": "أنشئ وأدر رموز الوصول للتكاملات الخارجية والوصول إلى API."
},
"storage": {
"title": "إعدادات التخزين",
"description": "نسخ احتياطي واستعادة بياناتك وإدارة التخزين المحلي وتفضيلات المزامنة."
"description": "انسخ بياناتك احتياطيًا واستعدها، وأدر التخزين المحلي وتفضيلات المزامنة."
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"description": "قم بتخصيص تخطيط ورؤية البطاقات في واجهة اللوحة الجانبية."
"description": "خصّص ترتيب البطاقات وظهورها في اللوحة الجانبية."
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر مظهرك المفضل وقم بتكوين إعدادات الوضع الداكن/الفاتح."
"description": "اختر المظهر المفضل لديك واضبط الوضع الفاتح/الداكن."
},
"localization": {
"title": "التوطين",
"description": "تخصيص اللغة وتنسيق التاريخ وتنسيق الوقت والتفضيلات الإقليمية."
"title": "الإعدادات المحلية",
"description": "خصّص اللغة وتنسيق التاريخ والوقت والتفضيلات الإقليمية."
},
"advanced": {
"title": "الإعدادات المتقدمة",
"description": "تكوين webhooks والتحديثات في الوقت الفعلي وميزات متقدمة أخرى لتعزيز الإنتاجية."
"description": "اضبط الـ Webhooks والتحديثات الفورية وغيرها من الميزات المتقدمة."
},
"developer": {
"title": "إعدادات المطور",
"description": "عرض المعلومات الفنية حول رموز المصادقة واتصالات SSE وبيانات التصحيح."
"title": "إعدادات المطوّر",
"description": "اعرض معلومات تقنية عن رموز المصادقة واتصالات SSE وبيانات التصحيح."
},
"feedback": {
"title": "إرسال ملاحظات",
"description": "أخبرنا كيف يعمل Donetick معك أو اطلب ميزة جديدة."
},
"bugReport": {
"title": "الإبلاغ عن خلل",
"description": "هناك شيء لا يعمل كما ينبغي؟ أرسل لنا التفاصيل مع لقطة تقنية."
}
}
},
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "حدّث اسم العرض وصورة ملفك الشخصي.",
"photoUpdated": "تم تحديث الصورة",
"photoUpdatedMessage": "تم تحديث صورة ملفك الشخصي بنجاح!",
"uploadFailed": "فشل الرفع",
"uploadFailedMessage": "تعذّر رفع صورتك. يرجى المحاولة مرة أخرى.",
"profileUpdated": "تم تحديث الملف الشخصي",
"profileUpdatedMessage": "تم حفظ معلومات ملفك الشخصي بنجاح!",
"updateFailed": "فشل التحديث",
"updateFailedMessage": "تعذّر تحديث ملفك الشخصي. تحقق من اتصالك وحاول مرة أخرى.",
"changePhoto": "تغيير الصورة",
"editPhoto": "تحرير صورة الملف الشخصي",
"displayName": "اسم العرض",
"displayNamePlaceholder": "أدخل اسم العرض",
"timezone": "المنطقة الزمنية",
"timezonePlaceholder": "اختر منطقتك الزمنية",
"save": "حفظ",
"cancel": "إلغاء"
},
"circleSettings": {
"title": "إعدادات الدائرة",
"description": "يرتبط حسابك تلقائيًا بدائرة عند إنشائها أو الانضمام إليها. ادعُ أصدقاءك بسهولة عبر مشاركة رمز الدائرة أو الرابط أدناه. وسيصلك إشعار هنا عندما يطلب أحدهم الانضمام إلى دائرتك.",
"memberOf": "أنت جزء من {{name}}",
"yourCircleCode": "رمز دائرتك هو:",
"copyCode": "نسخ الرمز",
"shareInvite": "مشاركة الدعوة",
"codeCopied": "تم نسخ الرمز إلى الحافظة",
"linkCopied": "تم نسخ رابط الدعوة إلى الحافظة",
"myCircle": "دائرتي",
"shareTitle": "انضم إلى {{name}} على Donetick",
"shareText": "أودّ دعوتك للانضمام إلى {{name}} على Donetick.",
"shareDialogTitle": "مشاركة دعوة الدائرة",
"leave": "مغادرة الدائرة",
"leaveConfirmTitle": "مغادرة الدائرة",
"leaveConfirmMessage": "هل تريد بالتأكيد مغادرة دائرتك؟",
"leaveConfirmButton": "مغادرة",
"leftCircle": "تمت مغادرة الدائرة بنجاح",
"leaveFailed": "تعذّرت مغادرة الدائرة",
"circleMembers": "أعضاء الدائرة",
"you": "(أنت)",
"pendingApproval": "بانتظار الموافقة",
"joinedOn": "انضم في {{date}}",
"requestedToJoin": "طلب الانضمام {{date}}",
"roles": {
"member": "عضو",
"memberDescription": "عضو عادي في الدائرة",
"manager": "مدير",
"managerDescription": "يمكنه انتحال هوية المستخدمين وتنفيذ إجراءات نيابةً عنهم",
"admin": "مسؤول",
"adminDescription": "صلاحية كاملة على الدائرة"
},
"roleUpdateFailed": "تعذّر تحديث الدور",
"removeMemberTitle": "إزالة عضو",
"removeMemberMessage": "هل تريد بالتأكيد إزالة {{name}} من دائرتك؟",
"memberRemoved": "تمت إزالة العضو بنجاح",
"circleMemberRequests": "طلبات الانضمام إلى الدائرة",
"lastUpdated": "آخر تحديث: {{time}}",
"refreshing": "جارٍ التحديث…",
"refreshFailed": "تعذّر تحديث طلبات الانضمام",
"wantsToJoin": "يريد {{name}} الانضمام إلى دائرتك.",
"accept": "قبول",
"acceptRequestTitle": "قبول طلب الانضمام",
"acceptRequestMessage": "هل تريد بالتأكيد قبول {{name}} (اسم المستخدم: {{username}}) للانضمام إلى دائرتك؟",
"requestAccepted": "تم قبول الطلب بنجاح",
"or": "أو",
"joinOtherDescription": "تريد الانضمام إلى دائرة شخص آخر؟ اطلب منه رمز الدائرة أو رابط الانضمام، ثم أدخل الرمز أدناه للانضمام.",
"enterCircleCode": "أدخل رمز الدائرة:",
"enterCodePlaceholder": "أدخل الرمز",
"joinCircle": "الانضمام إلى الدائرة",
"joinedPending": "تم الانضمام إلى الدائرة بنجاح، انتظر موافقة مالك الدائرة على طلبك.",
"alreadyMember": "أنت عضو في هذه الدائرة بالفعل",
"joinFailed": "تعذّر الانضمام إلى الدائرة"
},
"accountSettings": {
"title": "إعدادات الحساب",
"description": "غيّر إعدادات حسابك أو نوع خطتك أو كلمة المرور",
"accountType": "نوع الحساب: {{type}}",
"free": "مجاني",
"plus": "Plus",
"plusUntil": "Plus (حتى {{date}})",
"activeDescription": "أنت مشترك حاليًا في خطة Plus. سيتجدد اشتراكك في {{date}}.",
"cancelledDescription": "لقد ألغيت اشتراكك. سيتم خفض حسابك إلى الخطة المجانية في {{date}}.",
"freeDescription": "أنت حاليًا على الخطة المجانية. رقِّ إلى Plus لفتح المزيد من الميزات.",
"upgrade": "ترقية",
"cancel": "إلغاء الاشتراك",
"password": "كلمة المرور:",
"changePassword": "تغيير كلمة المرور",
"passwordChanged": "تم تغيير كلمة المرور بنجاح",
"passwordChangeFailed": "فشل تغيير كلمة المرور",
"dangerZone": "منطقة الخطر",
"dangerZoneDescription": "بمجرد حذف حسابك لا يمكن التراجع. يرجى التأكد قبل المتابعة.",
"deleteAccount": "حذف الحساب",
"accountDeleted": "تم حذف الحساب بنجاح",
"subscriptionCancelled": "تم إلغاء الاشتراك",
"subscriptionCancelFailed": "تعذّر إلغاء الاشتراك",
"purchase": {
"success": "تمت عملية الشراء بنجاح! أعد تشغيل التطبيق للوصول إلى ميزات Plus.",
"storeConnection": "هناك مشكلة في الاتصال بالمتجر. تحقق من شبكتك وحاول مرة أخرى.",
"notAllowed": "عمليات الشراء غير مسموح بها على هذا الجهاز. يرجى مراجعة قيود جهازك.",
"unavailable": "هذا الاشتراك غير متاح. يرجى المحاولة لاحقًا.",
"alreadyProcessed": "تمت معالجة هذه العملية من قبل. إذا كنت ترى أن هذا خطأ، تواصل مع الدعم.",
"receiptMissing": "إيصال الشراء مفقود. يرجى إعادة محاولة الشراء.",
"networkError": "خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.",
"invalidReceipt": "إيصال الشراء غير صالح. تواصل مع الدعم إذا استمرت المشكلة.",
"pending": "الدفعة بانتظار الموافقة. ستحصل على الوصول فور اعتمادها.",
"failed": "فشلت عملية الشراء: {{error}}. حاول مرة أخرى أو تواصل مع الدعم.",
"unknownError": "خطأ غير معروف"
}
},
"subaccounts": {
"title": "الحسابات المُدارة",
"description": "أدر الحسابات الفرعية. يمكن لمستخدمي الحسابات الفرعية تسجيل الدخول وإنجاز المهام المسندة إليهم.",
"notParentTitle": "إدارة الحسابات الفرعية",
"notParentMessage": "الحسابات الرئيسية فقط هي التي يمكنها إدارة الحسابات الفرعية.",
"freePlanNotice": "الخطة المجانية تتيح حسابًا فرعيًا واحدًا. رقِّ إلى Plus للحصول على ما يصل إلى 5 حسابات فرعية.",
"count": "الحسابات الفرعية ({{count}})",
"add": "إضافة حساب فرعي",
"loading": "جارٍ تحميل الحسابات الفرعية…",
"emptyTitle": "لا توجد حسابات فرعية",
"emptyDescription": "أنشئ حسابات فرعية ليتمكن أعضاء الفريق من تسجيل الدخول وإنجاز المهام المسندة إليهم.",
"addFirst": "أضف أول حساب فرعي",
"username": "اسم المستخدم: {{username}}",
"created": "أُنشئ في: {{date}}",
"changePassword": "تغيير كلمة المرور",
"deleteAccount": "حذف الحساب",
"createdSuccess": "تم إنشاء الحساب الفرعي «{{name}}» بنجاح!",
"createFailed": "تعذّر إنشاء الحساب الفرعي: {{error}}",
"createFailedGeneric": "تعذّر إنشاء الحساب الفرعي",
"passwordUpdated": "تم تحديث كلمة مرور الحساب الفرعي بنجاح",
"passwordUpdateFailed": "تعذّر تحديث كلمة المرور: {{error}}",
"passwordUpdateFailedGeneric": "تعذّر تحديث كلمة المرور",
"deleteConfirmTitle": "حذف الحساب الفرعي",
"deleteConfirmMessage": "هل تريد بالتأكيد حذف الحساب الفرعي «{{name}}»؟ لا يمكن التراجع عن هذا الإجراء.",
"deleted": "تم حذف الحساب الفرعي «{{name}}» بنجاح",
"deleteFailed": "تعذّر حذف الحساب الفرعي: {{error}}",
"deleteFailedGeneric": "تعذّر حذف الحساب الفرعي",
"howItWorksTitle": "كيف تعمل الحسابات المُدارة",
"howItWorks1": "تُنشئ الحسابات المُدارة من الحساب الرئيسي، وهي مخصّصة لمن تريد أن تكون لديك إمكانية حذف حسابه وإعادة تعيين كلمة مروره.",
"howItWorks2": "يمكن للحسابات الفرعية تسجيل الدخول باسم مستخدم وكلمة مرور خاصين بها.",
"howItWorks3": "يمكن للحسابات المُدارة إنجاز المهام لكن صلاحياتها الإدارية محدودة",
"howItWorks4": "تُضاف الحسابات المُدارة تلقائيًا إلى دائرتك"
},
"notifications": {
"title": "إعدادات الإشعارات",
"deviceSection": "إشعارات الجهاز",
"deviceSectionDescription": "أدر إشعارات جهازك",
"deviceLabel": "إشعار الجهاز",
"deviceHelper": "تلقَّ إشعارًا على جهازك عند استحقاق مهمة",
"mobileOnly": "هذه الميزة متاحة على الأجهزة المحمولة فقط",
"testNotification": "إشعار تجريبي",
"testNotificationBody": "لديك مهمة تستحق قريبًا",
"dueTitle": "إشعار الاستحقاق",
"dueLabel": "إشعار عند استحقاق المهمة",
"preDueTitle": "إشعار قبل الاستحقاق",
"preDueLabel": "إشعار قبل ساعات من استحقاق المهمة",
"overdueTitle": "إشعار التأخر",
"overdueLabel": "إشعار عند تأخر المهمة عن موعدها",
"pushLabel": "الإشعارات الفورية",
"pushHelper": "تلقَّ التذكيرات والإعلانات وإسنادات المهام عبر الإشعارات الفورية",
"registeredDevices": "الأجهزة المسجّلة ({{count}}/5)",
"registeredDevicesDescription": "الأجهزة المسجّلة لتلقّي الإشعارات الفورية الخاصة بحسابك",
"currentDevice": "الجهاز الحالي: {{platform}} {{model}}",
"currentDeviceNotRegistered": "هذا الجهاز غير مسجّل لتلقّي الإشعارات الفورية",
"limitReached": "بلغت الحد الأقصى",
"registerDevice": "تسجيل الجهاز",
"unknownDevice": "جهاز غير معروف",
"deviceCreatedAt": "أُنشئ في: {{date}}",
"noDevices": "لا توجد أجهزة مسجّلة لتلقّي الإشعارات الفورية",
"customSection": "إشعار مخصّص",
"customSectionDescription": "الإشعار عبر منصة أخرى مثل Telegram أو Pushover",
"customLabel": "إشعار مخصّص",
"customHelper": "تلقَّ الإشعارات على منصة أخرى",
"targetNone": "بدون",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "عليك إرسال رسالة إلى البوت أولًا حتى تعمل إشعارات Telegram",
"telegramBotHelpAfter": "لبدء محادثة",
"clickHere": "اضغط هنا",
"chatId": "معرّف المحادثة",
"chatIdPlaceholder": "معرّف المستخدم / معرّف المحادثة",
"telegramChatIdHelpBefore": "إذا كنت لا تعرف معرّف محادثتك، ابدأ محادثة مع userinfobot وسيرسله إليك.",
"telegramChatIdHelpAfter": "لبدء محادثة مع userinfobot",
"userKey": "مفتاح المستخدم",
"userKeyPlaceholder": "معرّف المستخدم",
"chatIdRequired": "معرّف المحادثة مطلوب",
"chatIdInvalid": "معرّف المحادثة غير صالح",
"userKeyRequired": "مفتاح المستخدم مطلوب",
"targetUpdated": "تم تحديث وجهة الإشعارات",
"targetUpdateFailed": "حدث خطأ أثناء تحديث وجهة الإشعارات: {{error}}",
"deviceRegistered": "تم تسجيل الجهاز بنجاح لتلقّي الإشعارات الفورية.",
"deviceLimitTitle": "بلغت الحد الأقصى للأجهزة",
"deviceLimitMessage": "لقد بلغت الحد الأقصى وهو 5 أجهزة مسجّلة. يرجى إزالة جهاز قبل تسجيل هذا الجهاز.",
"registrationFailedTitle": "فشل التسجيل",
"registrationFailedMessage": "تعذّر تسجيل الجهاز تلقائيًا. يرجى المحاولة مرة أخرى.",
"permissionRequiredTitle": "الإذن مطلوب",
"permissionRequiredMessage": "يلزم إذن الإشعارات الفورية لتسجيل هذا الجهاز.",
"registrationInitiatedTitle": "بدأ التسجيل",
"registrationInitiatedMessage": "بدأ تسجيل الإشعارات الفورية. سيُسجَّل الجهاز تلقائيًا.",
"registerDeviceFailed": "تعذّر تسجيل الجهاز. يرجى المحاولة مرة أخرى.",
"permissionDeniedTitle": "تم رفض إذن الإشعارات",
"permissionDeniedMessage": "لقد رفضت أذونات الإشعارات. يمكنك تفعيلها لاحقًا من إعدادات جهازك.",
"pushPermissionDeniedTitle": "تم رفض إذن الإشعارات الفورية",
"pushPermissionDeniedMessage": "تم تعطيل الإشعارات الفورية. يمكنك تفعيلها من إعدادات جهازك عند الحاجة.",
"unregisterFailed": "تعذّر إلغاء تسجيل الجهاز"
},
"mfa": {
"title": "المصادقة متعددة العوامل",
"description": "أضف طبقة حماية إضافية لحسابك عبر المصادقة متعددة العوامل (MFA). عند تفعيلها، ستحتاج إلى إدخال رمز تحقق من تطبيق المصادقة إلى جانب كلمة المرور عند تسجيل الدخول.",
"twoFactor": "المصادقة الثنائية",
"enabledSubtitle": "حسابك محمي بالمصادقة الثنائية",
"disabledSubtitle": "أمّن حسابك باستخدام تطبيق مصادقة",
"enable": "تفعيل",
"disable": "تعطيل",
"enabledSuccess": "تم تفعيل المصادقة متعددة العوامل بنجاح!",
"disabledSuccess": "تم تعطيل المصادقة متعددة العوامل بنجاح!",
"errors": {
"qrGenerationFailed": "تعذّر إنشاء رمز QR",
"invalidResponse": "استجابة غير صالحة من الخادم. رمز QR أو المفتاح السري مفقود.",
"notFound": "لم يُعثر على نقطة إعداد المصادقة متعددة العوامل. قد لا تكون هذه الميزة متاحة بعد.",
"unauthorized": "غير مصرّح. يرجى تسجيل الدخول مرة أخرى.",
"serverError": "خطأ في الخادم. يرجى المحاولة لاحقًا.",
"setupFailed": "تعذّر إعداد المصادقة متعددة العوامل ({{status}}). يرجى المحاولة مرة أخرى.",
"networkError": "خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.",
"invalidCode": "رمز التحقق غير صالح. يرجى المحاولة مرة أخرى.",
"confirmFailed": "تعذّر تأكيد المصادقة متعددة العوامل. يرجى المحاولة مرة أخرى.",
"disableFailed": "تعذّر تعطيل المصادقة متعددة العوامل. يرجى المحاولة مرة أخرى."
},
"setup": {
"title": "إعداد المصادقة متعددة العوامل",
"addedAccount": "لقد أضفت الحساب",
"back": "رجوع",
"verifyAndEnable": "التحقق والتفعيل",
"savedBackupCodes": "لقد حفظت رموز النسخ الاحتياطي",
"step1Label": "الخطوة 1:",
"step1": "امسح رمز QR أدناه باستخدام تطبيق المصادقة (Google Authenticator أو Authy أو غيرهما)",
"qrAlt": "رمز QR للمصادقة متعددة العوامل",
"qrFailed": "تعذّر إنشاء رمز QR. حاول مرة أخرى أو استخدم مفتاح الإدخال اليدوي أدناه.",
"manualKey": "مفتاح الإدخال اليدوي:",
"step2Label": "الخطوة 2:",
"step2": "أدخل رمز التحقق المكوّن من 6 أرقام من تطبيق المصادقة",
"codePlaceholder": "أدخل الرمز المكوّن من 6 أرقام",
"successTitle": "تم تفعيل المصادقة متعددة العوامل بنجاح!",
"backupCodesTitle": "احفظ رموز النسخ الاحتياطي هذه في مكان آمن",
"backupCodesDescription": "يمكنك استخدام هذه الرموز للوصول إلى حسابك في حال فقدت جهاز المصادقة. يمكن استخدام كل رمز مرة واحدة فقط."
},
"disableModal": {
"title": "تعطيل المصادقة متعددة العوامل",
"warning": "تعطيل المصادقة متعددة العوامل يجعل حسابك أقل أمانًا. هل تريد بالتأكيد المتابعة؟",
"prompt": "أدخل رمز تحقق من تطبيق المصادقة للتأكيد:",
"confirm": "تعطيل المصادقة متعددة العوامل"
},
"backupCodesModal": {
"title": "رموز نسخ احتياطي جديدة",
"warning": "لم تعد رموز النسخ الاحتياطي السابقة صالحة. احفظ هذه الرموز الجديدة في مكان آمن. يمكن استخدام كل رمز مرة واحدة فقط."
}
},
"apiTokens": {
"title": "رموز API",
"accessToken": "رمز الوصول",
"description": "أنشئ رمزًا لاستخدامه مع API لتحديث الأشياء التي تُطلق المهام",
"plusNotice": "رموز API غير متاحة في الخطة الأساسية. رقِّ إلى Plus لإنشاء رموز API للتكامل مع الأنظمة الخارجية وأتمتة مهامك.",
"showToken": "إظهار الرمز",
"hideToken": "إخفاء الرمز",
"removeTitle": "إزالة الرمز",
"removeMessage": "هل تريد بالتأكيد إزالة {{name}}؟",
"removedTitle": "تمت الإزالة",
"removedMessage": "تمت إزالة رمز API",
"tokenCopied": "تم نسخ الرمز إلى الحافظة",
"generateNew": "إنشاء رمز جديد",
"nameModalTitle": "امنح رمزك الجديد اسمًا يساعدك على تذكّره.",
"generateToken": "إنشاء الرمز"
},
"storage": {
"title": "إعدادات التخزين",
"serverTitle": "استخدام تخزين الخادم",
"serverDescription": "هذه هي المساحة التي يستخدمها حسابك على خوادمنا (مثل الملفات والصور والبيانات التي رفعتها).",
"usagePlaceholder": "-- ميغابايت مستخدمة / -- ميغابايت إجمالًا (--)",
"usage": "{{used}} ميغابايت مستخدمة / {{total}} ميغابايت إجمالًا ({{percent}}%)",
"basicPlanNotice": "تخزين الخادم غير متاح في الخطة الأساسية. رقِّ إلى Plus لتتبّع استخدامك لتخزين الخادم.",
"localTitleApp": "التخزين المحلي والذاكرة المؤقتة للتطبيق",
"localTitleBrowser": "التخزين المحلي والذاكرة المؤقتة للمتصفح",
"localDescription": "هذه بيانات محفوظة محليًا في متصفحك لتسريع الوصول. مسحها لن يؤثر على بياناتك على الخادم، لكنه قد يسجّل خروجك.",
"clearLocal": "مسح كل التخزين المحلي والذاكرة المؤقتة",
"clearLocalTitle": "مسح كل التخزين المحلي",
"clearLocalMessage": "هل تريد بالتأكيد مسح التخزين المحلي والذاكرة المؤقتة؟ سيؤدي ذلك إلى إزالة جميع بياناتك من هذا المتصفح وسيتطلب تسجيل الدخول من جديد.",
"clearAll": "مسح الكل",
"appPreferences": "تفضيلات التطبيق",
"deviceOnly": "على الجهاز فقط",
"appPreferencesDescription": "هذه تفضيلات وإعدادات يحفظها التطبيق محليًا على جهازك. مسحها سيعيد ضبط إعدادات التطبيق وقد يسجّل خروجك، لكنه لن يؤثر على بياناتك على الخادم.",
"clearPreferences": "مسح تفضيلات التطبيق",
"clearPreferencesTitle": "مسح تفضيلات التطبيق",
"clearPreferencesMessage": "هل تريد بالتأكيد مسح جميع تفضيلات التطبيق؟ سيؤدي ذلك إلى إعادة ضبط إعداداتك وقد يتطلب تسجيل الدخول من جديد."
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"heading": "إعدادات اللوحة الجانبية",
"description": "حدّد البطاقات التي تظهر في اللوحة الجانبية وترتيبها. اسحب وأفلت لإعادة الترتيب، أو بدّل ظهور كل بطاقة.",
"resetToDefaults": "استعادة الإعدادات الافتراضية",
"resetHelper": "سيؤدي ذلك إلى استعادة الظهور والترتيب الافتراضيين لجميع البطاقات.",
"cards": {
"welcome": {
"name": "تبديل المستخدم",
"description": "يتيح للمسؤولين والمديرين عرض المهام بصفة مستخدمين آخرين"
},
"smartInsights": {
"name": "رؤى ذكية",
"description": "إجراءات سريعة بناءً على مهامك"
},
"assignees": {
"name": "المهام حسب المكلَّف",
"description": "يجمع المهام حسب الشخص المكلَّف بها"
},
"calendar": {
"name": "عرض التقويم",
"description": "يعرض المهام بتنسيق تقويم"
},
"activities": {
"name": "الأنشطة الأخيرة",
"description": "يعرض المهام المنجزة والأنشطة الأخيرة"
},
"weeklyGoals": {
"name": "الأهداف الأسبوعية",
"description": "يعرض التقدّم الأسبوعي وإحصاءات إنجاز العائلة"
}
}
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر الشكل الذي يظهر به الموقع لك. حدّد مظهرًا ثابتًا أو زامنه مع نظامك للتبديل تلقائيًا بين المظهر النهاري والليلي.",
"themeMode": "وضع المظهر",
"light": "فاتح",
"dark": "داكن",
"system": "النظام"
},
"localization": {
"title": "الإعدادات المحلية",
"description": "خصّص اللغة وتنسيق التاريخ والتفضيلات الإقليمية لحسابك.",
"language": "اللغة",
"languageDescription": "اختر لغتك المفضلة",
"rtlNotice": "تُكتب هذه اللغة من اليمين إلى اليسار (RTL)",
"dateFormat": "تنسيق التاريخ",
"dateFormatDescription": "اختر طريقة عرض التواريخ في جميع أنحاء التطبيق",
"timeFormat": "تنسيق الوقت",
"timeFormatDescription": "اختر نظام 12 ساعة أو 24 ساعة",
"preview": "معاينة: {{value}}",
"12hour": "12 ساعة (ص/م)",
"24hour": "24 ساعة",
"firstDayOfWeek": "أول أيام الأسبوع",
"firstDayOfWeekDescription": "اختر اليوم الذي يبدأ به أسبوعك",
"sunday": "الأحد",
"monday": "الاثنين",
"saturday": "السبت",
"formats": {
"mdy": "MM/DD/YYYY (الولايات المتحدة)",
"dmy": "DD/MM/YYYY (أوروبا)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "تنسيق طويل (مثال: 1 يناير 2024)",
"short": "تنسيق قصير (مثال: 1 ينا 2024)"
}
},
"advanced": {
"title": "الإعدادات المتقدمة",
"description": "اضبط الميزات المتقدمة مثل الـ Webhooks والتحديثات الفورية لتعزيز إنتاجيتك.",
"offlineTitle": "دعم العمل دون اتصال",
"offlineDescription": "واصل استخدام Donetick دون اتصال على هذا الجهاز/المتصفح. تُحفظ تغييراتك محليًا وتُزامن عند عودتك للاتصال.",
"offlineToggle": "تفعيل دعم العمل دون اتصال",
"offlineHelper": "إيقاف هذا الخيار يزيل التغييرات غير المزامنة والبيانات المحفوظة دون اتصال من هذا الجهاز/المتصفح.",
"offlineEnabled": "تم تفعيل وضع العمل دون اتصال على هذا الجهاز/المتصفح",
"offlineDisabled": "تم إيقاف وضع العمل دون اتصال ومسح البيانات المحلية",
"offlineDisabledPartial": "تم إيقاف وضع العمل دون اتصال، لكن قد تبقى بعض البيانات المحلية مخزّنة",
"offlineDisableTitle": "إيقاف وضع العمل دون اتصال",
"offlineDisableMessage": "إيقاف وضع العمل دون اتصال سيزيل التغييرات غير المزامنة والبيانات المحفوظة دون اتصال على هذا الجهاز/المتصفح. هل تريد المتابعة؟",
"offlineDisableConfirm": "الإيقاف ومسح البيانات",
"webhookTitle": "تكامل Webhook",
"webhookDescription": "تتيح لك الـ Webhooks إرسال إشعارات فورية إلى خدمات أخرى عند وقوع أحداث في دائرتك. اضبط رابط Webhook لتلقّي التحديثات الفورية.",
"webhookPlusNotice": "إشعارات Webhook غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي التحديثات الفورية عبر الـ Webhooks.",
"webhookToggle": "تفعيل Webhook",
"webhookHelper": "فعّل إشعارات Webhook لتحديثات المهام والأشياء.",
"webhookURL": "رابط Webhook",
"webhookUpdated": "تم تحديث رابط Webhook بنجاح",
"webhookUpdateFailed": "تعذّر تحديث رابط Webhook",
"realtimeTitle": "التحديثات الفورية",
"realtimeDescription": "اضبط كيفية تلقّي التحديثات المباشرة عند تغيّر المهام والأنشطة في دائرتك.",
"realtime": {
"toggleLabel": "تفعيل التحديثات الفورية",
"title": "التحديثات الفورية",
"subtitle": "تلقَّ إشعارات فورية عند تحديث المهام",
"statusLabel": "الحالة:",
"basicPlan": "التحديثات الفورية غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي إشعارات فورية عند تحديث المهام.",
"disabled": "التحديثات الفورية معطّلة. فعّلها لترى التغييرات المباشرة عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها.",
"connected": "التحديثات الفورية تعمل. سترى التغييرات المباشرة عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها.",
"connecting": "جارٍ الاتصال بالتحديثات الفورية…",
"errored": "التحديثات الفورية مفعّلة لكنها لا تعمل: {{error}}",
"notConnected": "التحديثات الفورية مفعّلة لكن لا يوجد اتصال حاليًا.",
"basicPlanNotice": "التحديثات الفورية غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي إشعارات فورية عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "تسجيل الخروج",
"version": "النسخة",
"navigation": {
"search": "بحث",
"allTasks": "جميع المهام",
"archived": "المؤرشفة",
"things": "الأشياء",
@@ -30,6 +31,48 @@
"points": "النقاط",
"settings": "الإعدادات"
},
"search": {
"title": "بحث",
"placeholder": "ابحث في Donetick",
"inputAriaLabel": "ابحث في المهام والسجل والمشاريع والتسميات والإعدادات",
"deviceNote": "يتم البحث في المحتوى المتوفر على هذا الجهاز",
"escape": "Esc",
"recent": "الأخيرة",
"empty": {
"title": "لا توجد نتائج مطابقة",
"subtitle": "لا يزال بإمكانك تصفية قائمة المهام باستخدام هذا البحث."
},
"groups": {
"tasks": "المهام",
"history": "الملاحظات",
"projects": "المشاريع",
"labels": "التسميات",
"people": "الأشخاص",
"settings": "الإعدادات",
"actions": "إجراءات سريعة"
},
"actions": {
"quickAction": "إجراء سريع",
"navigation": "التنقل",
"createTask": "إنشاء مهمة",
"viewAllTasks": "عرض جميع المهام",
"viewArchivedTasks": "عرض المهام المؤرشفة",
"openSettings": "فتح الإعدادات",
"filterTasks": "عرض المهام المطابقة لـ «{{query}}»",
"filterTasksSubtitle": "تصفية قائمة المهام"
},
"footer": {
"navigate": "تنقل",
"open": "فتح",
"results_zero": "لا توجد نتائج",
"results_one": "نتيجة واحدة",
"results_two": "نتيجتان",
"results_few": "{{count}} نتائج",
"results_many": "{{count}} نتيجة",
"results_other": "{{count}} نتيجة",
"typeToSearch": "اكتب للبحث"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,116 +1,29 @@
{
"title": "الإعدادات",
"circleSettings": {
"title": "إعدادات الدائرة",
"description": "يتم ربط حسابك تلقائيًا بدائرة عند إنشاء واحدة أو الانضمام إليها. ادعُ الأصدقاء بسهولة من خلال مشاركة رمز الدائرة الفريد أو الرابط أدناه. ستتلقى إشعارًا أدناه عندما يطلب شخص ما الانضمام إلى دائرتك. إذا كنت ترغب في المغادرة، فما عليك سوى الضغط على زر 'مغادرة الدائرة'.",
"circleCode": "رمز الدائرة",
"copyCode": "نسخ الرمز",
"copyLink": "نسخ الرابط",
"codeCopied": "تم نسخ رمز الدائرة!",
"linkCopied": "تم نسخ الرابط!",
"joinCircle": "الانضمام إلى دائرة",
"joinCirclePlaceholder": "أدخل رمز الدائرة",
"join": "انضمام",
"leave": "مغادرة الدائرة",
"leaveConfirmTitle": "مغادرة الدائرة",
"leaveConfirmMessage": "هل أنت متأكد من أنك تريد مغادرة هذه الدائرة؟",
"circleMembers": "أعضاء الدائرة",
"circleMemberRequests": "طلبات انضمام الأعضاء",
"admin": "مشرف",
"member": "عضو",
"pending": "قيد الانتظار",
"accept": "قبول",
"reject": "رفض",
"makeAdmin": "جعله مشرف",
"makeMember": "جعله عضو",
"remove": "إزالة",
"webhookURL": "رابط Webhook",
"webhookDescription": "أدخل رابط webhook لتلقي إشعارات أحداث الدائرة",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "إعدادات الحساب",
"subscription": "الاشتراك",
"subscriptionStatus": "الخطة الحالية",
"free": "مجاني",
"plus": "بلس",
"upgrade": "ترقية",
"cancel": "إلغاء",
"changePassword": "تغيير كلمة المرور",
"password": "كلمة المرور",
"dangerZone": "منطقة الخطر",
"dangerZoneDescription": "بمجرد حذف حسابك، لا يمكن التراجع. يرجى التأكد.",
"deleteAccount": "حذف الحساب"
},
"localization": {
"title": "التوطين",
"description": "تخصيص اللغة وتنسيق التاريخ والتفضيلات الإقليمية لحسابك.",
"language": "اللغة",
"languageDescription": "اختر لغتك المفضلة",
"dateFormat": "تنسيق التاريخ",
"dateFormatDescription": "اختر كيفية عرض التواريخ في التطبيق",
"timeFormat": "تنسيق الوقت",
"timeFormatDescription": "اختر تنسيق 12 أو 24 ساعة",
"12hour": "12 ساعة (ص/م)",
"24hour": "24 ساعة",
"firstDayOfWeek": "أول يوم في الأسبوع",
"firstDayOfWeekDescription": "اختر اليوم الذي يبدأ به أسبوعك",
"sunday": "الأحد",
"monday": "الاثنين",
"saturday": "السبت",
"formats": {
"mdy": "MM/DD/YYYY (الولايات المتحدة)",
"dmy": "DD/MM/YYYY (أوروبا)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "تنسيق طويل (مثل 1 يناير 2024)",
"short": "تنسيق قصير (مثل 1 يناير 2024)"
}
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"description": "قم بتخصيص تخطيط ورؤية البطاقات في اللوحة الجانبية. هذا القسم متاح فقط على أجهزة الشاشة الكبيرة مثل الأجهزة اللوحية وأجهزة سطح المكتب."
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر كيف يبدو الموقع لك. حدد مظهرًا واحدًا أو قم بالمزامنة مع نظامك والتبديل تلقائيًا بين مظاهر النهار والليل.",
"themeMode": "وضع المظهر",
"light": "فاتح",
"dark": "داكن",
"system": "النظام"
},
"notifications": {
"settingsSaved": "تم حفظ الإعدادات بنجاح",
"settingsSaveFailed": "فشل حفظ الإعدادات",
"invalidWebhook": "رابط webhook غير صالح"
},
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "تحديث اسم العرض وصورة الملف الشخصي.",
"photoUpdated": "تم تحديث الصورة",
"photoUpdatedMessage": "تم تحديث صورة ملفك الشخصي بنجاح!",
"uploadFailed": "فشل التحميل",
"uploadFailedMessage": "فشل تحميل صورتك. يرجى المحاولة مرة أخرى.",
"profileUpdated": "تم تحديث الملف الشخصي",
"profileUpdatedMessage": "تم حفظ معلومات ملفك الشخصي بنجاح!",
"updateFailed": "فشل التحديث",
"updateFailedMessage": "تعذر تحديث ملفك الشخصي. يرجى التحقق من اتصالك والمحاولة مرة أخرى.",
"changePhoto": "تغيير الصورة",
"displayName": "اسم العرض",
"displayNamePlaceholder": "أدخل اسم العرض الخاص بك",
"timezone": "المنطقة الزمنية",
"timezonePlaceholder": "اختر منطقتك الزمنية",
"common": {
"save": "حفظ",
"cancel": "إلغاء"
"cancel": "إلغاء",
"confirm": "تأكيد",
"remove": "إزالة",
"delete": "حذف",
"refresh": "تحديث",
"loading": "جارٍ التحميل…",
"on": "مفعّل",
"off": "متوقف",
"error": "خطأ",
"success": "تم بنجاح",
"plusFeature": "ميزة Plus",
"earlyAccess": "وصول مبكر"
},
"overview": {
"title": "الإعدادات",
"subtitle": "قم بتخصيص تجربتك وإدارة تفضيلات حسابك",
"subtitle": "خصّص تجربتك وأدر تفضيلات حسابك",
"upgrade": {
"title": "الترقية إلى بلس",
"description": "افتح ميزات قوية لتعزيز إنتاجيتك",
"button": "الترقية الآن",
"title": "الترقية إلى Plus",
"description": "افتح ميزات قوية تزيد من إنتاجيتك",
"button": "ترقية الآن",
"features": {
"richText": "أوصاف نصية منسقة",
"richText": "أوصاف بنص منسّق",
"notifications": "إشعارات المهام",
"apiIntegrations": "تكاملات API",
"advancedAutomation": "أتمتة متقدمة"
@@ -119,60 +32,463 @@
"sections": {
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "تحديث معلومات ملفك الشخصي والصورة واسم العرض وتفضيلات المنطقة الزمنية."
"description": "حدّث معلومات ملفك الشخصي وصورتك واسم العرض والمنطقة الزمنية."
},
"circle": {
"title": "إعدادات الدائرة",
"description": "إدارة دائرتك ودعوة الأعضاء والتعامل مع طلبات الانضمام."
"description": "أدر دائرتك، وادعُ الأعضاء، وتعامل مع طلبات الانضمام."
},
"account": {
"title": "إعدادات الحساب",
"description": "إدارة اشتراكك وتغيير كلمة المرور وخيارات حذف الحساب."
"description": "أدر اشتراكك، وغيّر كلمة المرور، واحذف حسابك."
},
"subaccounts": {
"title": "الحسابات المُدارة",
"description": "إنشاء وإدارة حسابات فرعية لتسجيل الدخول وإكمال المهام المعينة."
"description": "أنشئ وأدر حسابات فرعية يمكنها تسجيل الدخول وإنجاز المهام المسندة إليها."
},
"notifications": {
"title": "الإشعارات",
"description": "تكوين الإشعارات الفورية وتنبيهات البريد الإلكتروني ووجهات الإشعارات للمهام."
"description": "اضبط الإشعارات الفورية وتنبيهات البريد ووجهات إشعارات المهام."
},
"mfa": {
"title": "المصادقة متعددة العوامل",
"description": "إضافة طبقة إضافية من الأمان باستخدام MFA مع تطبيقات المصادقة."
"description": "أضف طبقة حماية إضافية عبر المصادقة متعددة العوامل باستخدام تطبيقات المصادقة."
},
"apitokens": {
"title": "رموز API",
"description": "إنشاء وإدارة رموز الوصول لتكاملات الطرف الثالث والوصول إلى API."
"description": "أنشئ وأدر رموز الوصول للتكاملات الخارجية والوصول إلى API."
},
"storage": {
"title": "إعدادات التخزين",
"description": "نسخ احتياطي واستعادة بياناتك وإدارة التخزين المحلي وتفضيلات المزامنة."
"description": "انسخ بياناتك احتياطيًا واستعدها، وأدر التخزين المحلي وتفضيلات المزامنة."
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"description": "قم بتخصيص تخطيط ورؤية البطاقات في واجهة اللوحة الجانبية."
"description": "خصّص ترتيب البطاقات وظهورها في اللوحة الجانبية."
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر مظهرك المفضل وقم بتكوين إعدادات الوضع الداكن/الفاتح."
"description": "اختر المظهر المفضل لديك واضبط الوضع الفاتح/الداكن."
},
"localization": {
"title": "التوطين",
"description": "تخصيص اللغة وتنسيق التاريخ وتنسيق الوقت والتفضيلات الإقليمية."
"title": "الإعدادات المحلية",
"description": "خصّص اللغة وتنسيق التاريخ والوقت والتفضيلات الإقليمية."
},
"advanced": {
"title": "الإعدادات المتقدمة",
"description": "تكوين webhooks والتحديثات في الوقت الفعلي وميزات متقدمة أخرى لتعزيز الإنتاجية."
"description": "اضبط الـ Webhooks والتحديثات الفورية وغيرها من الميزات المتقدمة."
},
"developer": {
"title": "إعدادات المطور",
"description": "عرض المعلومات الفنية حول رموز المصادقة واتصالات SSE وبيانات التصحيح."
"title": "إعدادات المطوّر",
"description": "اعرض معلومات تقنية عن رموز المصادقة واتصالات SSE وبيانات التصحيح."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "إرسال ملاحظات",
"description": "أخبرنا كيف يعمل Donetick معك أو اطلب ميزة جديدة."
},
"bugReport": {
"title": "الإبلاغ عن خلل",
"description": "هناك شيء لا يعمل كما ينبغي؟ أرسل لنا التفاصيل مع لقطة تقنية."
}
}
},
"profile": {
"title": "إعدادات الملف الشخصي",
"description": "حدّث اسم العرض وصورة ملفك الشخصي.",
"photoUpdated": "تم تحديث الصورة",
"photoUpdatedMessage": "تم تحديث صورة ملفك الشخصي بنجاح!",
"uploadFailed": "فشل الرفع",
"uploadFailedMessage": "تعذّر رفع صورتك. يرجى المحاولة مرة أخرى.",
"profileUpdated": "تم تحديث الملف الشخصي",
"profileUpdatedMessage": "تم حفظ معلومات ملفك الشخصي بنجاح!",
"updateFailed": "فشل التحديث",
"updateFailedMessage": "تعذّر تحديث ملفك الشخصي. تحقق من اتصالك وحاول مرة أخرى.",
"changePhoto": "تغيير الصورة",
"editPhoto": "تحرير صورة الملف الشخصي",
"displayName": "اسم العرض",
"displayNamePlaceholder": "أدخل اسم العرض",
"timezone": "المنطقة الزمنية",
"timezonePlaceholder": "اختر منطقتك الزمنية",
"save": "حفظ",
"cancel": "إلغاء"
},
"circleSettings": {
"title": "إعدادات الدائرة",
"description": "يرتبط حسابك تلقائيًا بدائرة عند إنشائها أو الانضمام إليها. ادعُ أصدقاءك بسهولة عبر مشاركة رمز الدائرة أو الرابط أدناه. وسيصلك إشعار هنا عندما يطلب أحدهم الانضمام إلى دائرتك.",
"memberOf": "أنت جزء من {{name}}",
"yourCircleCode": "رمز دائرتك هو:",
"copyCode": "نسخ الرمز",
"shareInvite": "مشاركة الدعوة",
"codeCopied": "تم نسخ الرمز إلى الحافظة",
"linkCopied": "تم نسخ رابط الدعوة إلى الحافظة",
"myCircle": "دائرتي",
"shareTitle": "انضم إلى {{name}} على Donetick",
"shareText": "أودّ دعوتك للانضمام إلى {{name}} على Donetick.",
"shareDialogTitle": "مشاركة دعوة الدائرة",
"leave": "مغادرة الدائرة",
"leaveConfirmTitle": "مغادرة الدائرة",
"leaveConfirmMessage": "هل تريد بالتأكيد مغادرة دائرتك؟",
"leaveConfirmButton": "مغادرة",
"leftCircle": "تمت مغادرة الدائرة بنجاح",
"leaveFailed": "تعذّرت مغادرة الدائرة",
"circleMembers": "أعضاء الدائرة",
"you": "(أنت)",
"pendingApproval": "بانتظار الموافقة",
"joinedOn": "انضم في {{date}}",
"requestedToJoin": "طلب الانضمام {{date}}",
"roles": {
"member": "عضو",
"memberDescription": "عضو عادي في الدائرة",
"manager": "مدير",
"managerDescription": "يمكنه انتحال هوية المستخدمين وتنفيذ إجراءات نيابةً عنهم",
"admin": "مسؤول",
"adminDescription": "صلاحية كاملة على الدائرة"
},
"roleUpdateFailed": "تعذّر تحديث الدور",
"removeMemberTitle": "إزالة عضو",
"removeMemberMessage": "هل تريد بالتأكيد إزالة {{name}} من دائرتك؟",
"memberRemoved": "تمت إزالة العضو بنجاح",
"circleMemberRequests": "طلبات الانضمام إلى الدائرة",
"lastUpdated": "آخر تحديث: {{time}}",
"refreshing": "جارٍ التحديث…",
"refreshFailed": "تعذّر تحديث طلبات الانضمام",
"wantsToJoin": "يريد {{name}} الانضمام إلى دائرتك.",
"accept": "قبول",
"acceptRequestTitle": "قبول طلب الانضمام",
"acceptRequestMessage": "هل تريد بالتأكيد قبول {{name}} (اسم المستخدم: {{username}}) للانضمام إلى دائرتك؟",
"requestAccepted": "تم قبول الطلب بنجاح",
"or": "أو",
"joinOtherDescription": "تريد الانضمام إلى دائرة شخص آخر؟ اطلب منه رمز الدائرة أو رابط الانضمام، ثم أدخل الرمز أدناه للانضمام.",
"enterCircleCode": "أدخل رمز الدائرة:",
"enterCodePlaceholder": "أدخل الرمز",
"joinCircle": "الانضمام إلى الدائرة",
"joinedPending": "تم الانضمام إلى الدائرة بنجاح، انتظر موافقة مالك الدائرة على طلبك.",
"alreadyMember": "أنت عضو في هذه الدائرة بالفعل",
"joinFailed": "تعذّر الانضمام إلى الدائرة"
},
"accountSettings": {
"title": "إعدادات الحساب",
"description": "غيّر إعدادات حسابك أو نوع خطتك أو كلمة المرور",
"accountType": "نوع الحساب: {{type}}",
"free": "مجاني",
"plus": "Plus",
"plusUntil": "Plus (حتى {{date}})",
"activeDescription": "أنت مشترك حاليًا في خطة Plus. سيتجدد اشتراكك في {{date}}.",
"cancelledDescription": "لقد ألغيت اشتراكك. سيتم خفض حسابك إلى الخطة المجانية في {{date}}.",
"freeDescription": "أنت حاليًا على الخطة المجانية. رقِّ إلى Plus لفتح المزيد من الميزات.",
"upgrade": "ترقية",
"cancel": "إلغاء الاشتراك",
"password": "كلمة المرور:",
"changePassword": "تغيير كلمة المرور",
"passwordChanged": "تم تغيير كلمة المرور بنجاح",
"passwordChangeFailed": "فشل تغيير كلمة المرور",
"dangerZone": "منطقة الخطر",
"dangerZoneDescription": "بمجرد حذف حسابك لا يمكن التراجع. يرجى التأكد قبل المتابعة.",
"deleteAccount": "حذف الحساب",
"accountDeleted": "تم حذف الحساب بنجاح",
"subscriptionCancelled": "تم إلغاء الاشتراك",
"subscriptionCancelFailed": "تعذّر إلغاء الاشتراك",
"purchase": {
"success": "تمت عملية الشراء بنجاح! أعد تشغيل التطبيق للوصول إلى ميزات Plus.",
"storeConnection": "هناك مشكلة في الاتصال بالمتجر. تحقق من شبكتك وحاول مرة أخرى.",
"notAllowed": "عمليات الشراء غير مسموح بها على هذا الجهاز. يرجى مراجعة قيود جهازك.",
"unavailable": "هذا الاشتراك غير متاح. يرجى المحاولة لاحقًا.",
"alreadyProcessed": "تمت معالجة هذه العملية من قبل. إذا كنت ترى أن هذا خطأ، تواصل مع الدعم.",
"receiptMissing": "إيصال الشراء مفقود. يرجى إعادة محاولة الشراء.",
"networkError": "خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.",
"invalidReceipt": "إيصال الشراء غير صالح. تواصل مع الدعم إذا استمرت المشكلة.",
"pending": "الدفعة بانتظار الموافقة. ستحصل على الوصول فور اعتمادها.",
"failed": "فشلت عملية الشراء: {{error}}. حاول مرة أخرى أو تواصل مع الدعم.",
"unknownError": "خطأ غير معروف"
}
},
"subaccounts": {
"title": "الحسابات المُدارة",
"description": "أدر الحسابات الفرعية. يمكن لمستخدمي الحسابات الفرعية تسجيل الدخول وإنجاز المهام المسندة إليهم.",
"notParentTitle": "إدارة الحسابات الفرعية",
"notParentMessage": "الحسابات الرئيسية فقط هي التي يمكنها إدارة الحسابات الفرعية.",
"freePlanNotice": "الخطة المجانية تتيح حسابًا فرعيًا واحدًا. رقِّ إلى Plus للحصول على ما يصل إلى 5 حسابات فرعية.",
"count": "الحسابات الفرعية ({{count}})",
"add": "إضافة حساب فرعي",
"loading": "جارٍ تحميل الحسابات الفرعية…",
"emptyTitle": "لا توجد حسابات فرعية",
"emptyDescription": "أنشئ حسابات فرعية ليتمكن أعضاء الفريق من تسجيل الدخول وإنجاز المهام المسندة إليهم.",
"addFirst": "أضف أول حساب فرعي",
"username": "اسم المستخدم: {{username}}",
"created": "أُنشئ في: {{date}}",
"changePassword": "تغيير كلمة المرور",
"deleteAccount": "حذف الحساب",
"createdSuccess": "تم إنشاء الحساب الفرعي «{{name}}» بنجاح!",
"createFailed": "تعذّر إنشاء الحساب الفرعي: {{error}}",
"createFailedGeneric": "تعذّر إنشاء الحساب الفرعي",
"passwordUpdated": "تم تحديث كلمة مرور الحساب الفرعي بنجاح",
"passwordUpdateFailed": "تعذّر تحديث كلمة المرور: {{error}}",
"passwordUpdateFailedGeneric": "تعذّر تحديث كلمة المرور",
"deleteConfirmTitle": "حذف الحساب الفرعي",
"deleteConfirmMessage": "هل تريد بالتأكيد حذف الحساب الفرعي «{{name}}»؟ لا يمكن التراجع عن هذا الإجراء.",
"deleted": "تم حذف الحساب الفرعي «{{name}}» بنجاح",
"deleteFailed": "تعذّر حذف الحساب الفرعي: {{error}}",
"deleteFailedGeneric": "تعذّر حذف الحساب الفرعي",
"howItWorksTitle": "كيف تعمل الحسابات المُدارة",
"howItWorks1": "تُنشئ الحسابات المُدارة من الحساب الرئيسي، وهي مخصّصة لمن تريد أن تكون لديك إمكانية حذف حسابه وإعادة تعيين كلمة مروره.",
"howItWorks2": "يمكن للحسابات الفرعية تسجيل الدخول باسم مستخدم وكلمة مرور خاصين بها.",
"howItWorks3": "يمكن للحسابات المُدارة إنجاز المهام لكن صلاحياتها الإدارية محدودة",
"howItWorks4": "تُضاف الحسابات المُدارة تلقائيًا إلى دائرتك"
},
"notifications": {
"title": "إعدادات الإشعارات",
"deviceSection": "إشعارات الجهاز",
"deviceSectionDescription": "أدر إشعارات جهازك",
"deviceLabel": "إشعار الجهاز",
"deviceHelper": "تلقَّ إشعارًا على جهازك عند استحقاق مهمة",
"mobileOnly": "هذه الميزة متاحة على الأجهزة المحمولة فقط",
"testNotification": "إشعار تجريبي",
"testNotificationBody": "لديك مهمة تستحق قريبًا",
"dueTitle": "إشعار الاستحقاق",
"dueLabel": "إشعار عند استحقاق المهمة",
"preDueTitle": "إشعار قبل الاستحقاق",
"preDueLabel": "إشعار قبل ساعات من استحقاق المهمة",
"overdueTitle": "إشعار التأخر",
"overdueLabel": "إشعار عند تأخر المهمة عن موعدها",
"pushLabel": "الإشعارات الفورية",
"pushHelper": "تلقَّ التذكيرات والإعلانات وإسنادات المهام عبر الإشعارات الفورية",
"registeredDevices": "الأجهزة المسجّلة ({{count}}/5)",
"registeredDevicesDescription": "الأجهزة المسجّلة لتلقّي الإشعارات الفورية الخاصة بحسابك",
"currentDevice": "الجهاز الحالي: {{platform}} {{model}}",
"currentDeviceNotRegistered": "هذا الجهاز غير مسجّل لتلقّي الإشعارات الفورية",
"limitReached": "بلغت الحد الأقصى",
"registerDevice": "تسجيل الجهاز",
"unknownDevice": "جهاز غير معروف",
"deviceCreatedAt": "أُنشئ في: {{date}}",
"noDevices": "لا توجد أجهزة مسجّلة لتلقّي الإشعارات الفورية",
"customSection": "إشعار مخصّص",
"customSectionDescription": "الإشعار عبر منصة أخرى مثل Telegram أو Pushover",
"customLabel": "إشعار مخصّص",
"customHelper": "تلقَّ الإشعارات على منصة أخرى",
"targetNone": "بدون",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "عليك إرسال رسالة إلى البوت أولًا حتى تعمل إشعارات Telegram",
"telegramBotHelpAfter": "لبدء محادثة",
"clickHere": "اضغط هنا",
"chatId": "معرّف المحادثة",
"chatIdPlaceholder": "معرّف المستخدم / معرّف المحادثة",
"telegramChatIdHelpBefore": "إذا كنت لا تعرف معرّف محادثتك، ابدأ محادثة مع userinfobot وسيرسله إليك.",
"telegramChatIdHelpAfter": "لبدء محادثة مع userinfobot",
"userKey": "مفتاح المستخدم",
"userKeyPlaceholder": "معرّف المستخدم",
"chatIdRequired": "معرّف المحادثة مطلوب",
"chatIdInvalid": "معرّف المحادثة غير صالح",
"userKeyRequired": "مفتاح المستخدم مطلوب",
"targetUpdated": "تم تحديث وجهة الإشعارات",
"targetUpdateFailed": "حدث خطأ أثناء تحديث وجهة الإشعارات: {{error}}",
"deviceRegistered": "تم تسجيل الجهاز بنجاح لتلقّي الإشعارات الفورية.",
"deviceLimitTitle": "بلغت الحد الأقصى للأجهزة",
"deviceLimitMessage": "لقد بلغت الحد الأقصى وهو 5 أجهزة مسجّلة. يرجى إزالة جهاز قبل تسجيل هذا الجهاز.",
"registrationFailedTitle": "فشل التسجيل",
"registrationFailedMessage": "تعذّر تسجيل الجهاز تلقائيًا. يرجى المحاولة مرة أخرى.",
"permissionRequiredTitle": "الإذن مطلوب",
"permissionRequiredMessage": "يلزم إذن الإشعارات الفورية لتسجيل هذا الجهاز.",
"registrationInitiatedTitle": "بدأ التسجيل",
"registrationInitiatedMessage": "بدأ تسجيل الإشعارات الفورية. سيُسجَّل الجهاز تلقائيًا.",
"registerDeviceFailed": "تعذّر تسجيل الجهاز. يرجى المحاولة مرة أخرى.",
"permissionDeniedTitle": "تم رفض إذن الإشعارات",
"permissionDeniedMessage": "لقد رفضت أذونات الإشعارات. يمكنك تفعيلها لاحقًا من إعدادات جهازك.",
"pushPermissionDeniedTitle": "تم رفض إذن الإشعارات الفورية",
"pushPermissionDeniedMessage": "تم تعطيل الإشعارات الفورية. يمكنك تفعيلها من إعدادات جهازك عند الحاجة.",
"unregisterFailed": "تعذّر إلغاء تسجيل الجهاز"
},
"mfa": {
"title": "المصادقة متعددة العوامل",
"description": "أضف طبقة حماية إضافية لحسابك عبر المصادقة متعددة العوامل (MFA). عند تفعيلها، ستحتاج إلى إدخال رمز تحقق من تطبيق المصادقة إلى جانب كلمة المرور عند تسجيل الدخول.",
"twoFactor": "المصادقة الثنائية",
"enabledSubtitle": "حسابك محمي بالمصادقة الثنائية",
"disabledSubtitle": "أمّن حسابك باستخدام تطبيق مصادقة",
"enable": "تفعيل",
"disable": "تعطيل",
"enabledSuccess": "تم تفعيل المصادقة متعددة العوامل بنجاح!",
"disabledSuccess": "تم تعطيل المصادقة متعددة العوامل بنجاح!",
"errors": {
"qrGenerationFailed": "تعذّر إنشاء رمز QR",
"invalidResponse": "استجابة غير صالحة من الخادم. رمز QR أو المفتاح السري مفقود.",
"notFound": "لم يُعثر على نقطة إعداد المصادقة متعددة العوامل. قد لا تكون هذه الميزة متاحة بعد.",
"unauthorized": "غير مصرّح. يرجى تسجيل الدخول مرة أخرى.",
"serverError": "خطأ في الخادم. يرجى المحاولة لاحقًا.",
"setupFailed": "تعذّر إعداد المصادقة متعددة العوامل ({{status}}). يرجى المحاولة مرة أخرى.",
"networkError": "خطأ في الشبكة. تحقق من اتصالك وحاول مرة أخرى.",
"invalidCode": "رمز التحقق غير صالح. يرجى المحاولة مرة أخرى.",
"confirmFailed": "تعذّر تأكيد المصادقة متعددة العوامل. يرجى المحاولة مرة أخرى.",
"disableFailed": "تعذّر تعطيل المصادقة متعددة العوامل. يرجى المحاولة مرة أخرى."
},
"setup": {
"title": "إعداد المصادقة متعددة العوامل",
"addedAccount": "لقد أضفت الحساب",
"back": "رجوع",
"verifyAndEnable": "التحقق والتفعيل",
"savedBackupCodes": "لقد حفظت رموز النسخ الاحتياطي",
"step1Label": "الخطوة 1:",
"step1": "امسح رمز QR أدناه باستخدام تطبيق المصادقة (Google Authenticator أو Authy أو غيرهما)",
"qrAlt": "رمز QR للمصادقة متعددة العوامل",
"qrFailed": "تعذّر إنشاء رمز QR. حاول مرة أخرى أو استخدم مفتاح الإدخال اليدوي أدناه.",
"manualKey": "مفتاح الإدخال اليدوي:",
"step2Label": "الخطوة 2:",
"step2": "أدخل رمز التحقق المكوّن من 6 أرقام من تطبيق المصادقة",
"codePlaceholder": "أدخل الرمز المكوّن من 6 أرقام",
"successTitle": "تم تفعيل المصادقة متعددة العوامل بنجاح!",
"backupCodesTitle": "احفظ رموز النسخ الاحتياطي هذه في مكان آمن",
"backupCodesDescription": "يمكنك استخدام هذه الرموز للوصول إلى حسابك في حال فقدت جهاز المصادقة. يمكن استخدام كل رمز مرة واحدة فقط."
},
"disableModal": {
"title": "تعطيل المصادقة متعددة العوامل",
"warning": "تعطيل المصادقة متعددة العوامل يجعل حسابك أقل أمانًا. هل تريد بالتأكيد المتابعة؟",
"prompt": "أدخل رمز تحقق من تطبيق المصادقة للتأكيد:",
"confirm": "تعطيل المصادقة متعددة العوامل"
},
"backupCodesModal": {
"title": "رموز نسخ احتياطي جديدة",
"warning": "لم تعد رموز النسخ الاحتياطي السابقة صالحة. احفظ هذه الرموز الجديدة في مكان آمن. يمكن استخدام كل رمز مرة واحدة فقط."
}
},
"apiTokens": {
"title": "رموز API",
"accessToken": "رمز الوصول",
"description": "أنشئ رمزًا لاستخدامه مع API لتحديث الأشياء التي تُطلق المهام",
"plusNotice": "رموز API غير متاحة في الخطة الأساسية. رقِّ إلى Plus لإنشاء رموز API للتكامل مع الأنظمة الخارجية وأتمتة مهامك.",
"showToken": "إظهار الرمز",
"hideToken": "إخفاء الرمز",
"removeTitle": "إزالة الرمز",
"removeMessage": "هل تريد بالتأكيد إزالة {{name}}؟",
"removedTitle": "تمت الإزالة",
"removedMessage": "تمت إزالة رمز API",
"tokenCopied": "تم نسخ الرمز إلى الحافظة",
"generateNew": "إنشاء رمز جديد",
"nameModalTitle": "امنح رمزك الجديد اسمًا يساعدك على تذكّره.",
"generateToken": "إنشاء الرمز"
},
"storage": {
"title": "إعدادات التخزين",
"serverTitle": "استخدام تخزين الخادم",
"serverDescription": "هذه هي المساحة التي يستخدمها حسابك على خوادمنا (مثل الملفات والصور والبيانات التي رفعتها).",
"usagePlaceholder": "-- ميغابايت مستخدمة / -- ميغابايت إجمالًا (--)",
"usage": "{{used}} ميغابايت مستخدمة / {{total}} ميغابايت إجمالًا ({{percent}}%)",
"basicPlanNotice": "تخزين الخادم غير متاح في الخطة الأساسية. رقِّ إلى Plus لتتبّع استخدامك لتخزين الخادم.",
"localTitleApp": "التخزين المحلي والذاكرة المؤقتة للتطبيق",
"localTitleBrowser": "التخزين المحلي والذاكرة المؤقتة للمتصفح",
"localDescription": "هذه بيانات محفوظة محليًا في متصفحك لتسريع الوصول. مسحها لن يؤثر على بياناتك على الخادم، لكنه قد يسجّل خروجك.",
"clearLocal": "مسح كل التخزين المحلي والذاكرة المؤقتة",
"clearLocalTitle": "مسح كل التخزين المحلي",
"clearLocalMessage": "هل تريد بالتأكيد مسح التخزين المحلي والذاكرة المؤقتة؟ سيؤدي ذلك إلى إزالة جميع بياناتك من هذا المتصفح وسيتطلب تسجيل الدخول من جديد.",
"clearAll": "مسح الكل",
"appPreferences": "تفضيلات التطبيق",
"deviceOnly": "على الجهاز فقط",
"appPreferencesDescription": "هذه تفضيلات وإعدادات يحفظها التطبيق محليًا على جهازك. مسحها سيعيد ضبط إعدادات التطبيق وقد يسجّل خروجك، لكنه لن يؤثر على بياناتك على الخادم.",
"clearPreferences": "مسح تفضيلات التطبيق",
"clearPreferencesTitle": "مسح تفضيلات التطبيق",
"clearPreferencesMessage": "هل تريد بالتأكيد مسح جميع تفضيلات التطبيق؟ سيؤدي ذلك إلى إعادة ضبط إعداداتك وقد يتطلب تسجيل الدخول من جديد."
},
"sidepanel": {
"title": "تخصيص اللوحة الجانبية",
"heading": "إعدادات اللوحة الجانبية",
"description": "حدّد البطاقات التي تظهر في اللوحة الجانبية وترتيبها. اسحب وأفلت لإعادة الترتيب، أو بدّل ظهور كل بطاقة.",
"resetToDefaults": "استعادة الإعدادات الافتراضية",
"resetHelper": "سيؤدي ذلك إلى استعادة الظهور والترتيب الافتراضيين لجميع البطاقات.",
"cards": {
"welcome": {
"name": "تبديل المستخدم",
"description": "يتيح للمسؤولين والمديرين عرض المهام بصفة مستخدمين آخرين"
},
"smartInsights": {
"name": "رؤى ذكية",
"description": "إجراءات سريعة بناءً على مهامك"
},
"assignees": {
"name": "المهام حسب المكلَّف",
"description": "يجمع المهام حسب الشخص المكلَّف بها"
},
"calendar": {
"name": "عرض التقويم",
"description": "يعرض المهام بتنسيق تقويم"
},
"activities": {
"name": "الأنشطة الأخيرة",
"description": "يعرض المهام المنجزة والأنشطة الأخيرة"
},
"weeklyGoals": {
"name": "الأهداف الأسبوعية",
"description": "يعرض التقدّم الأسبوعي وإحصاءات إنجاز العائلة"
}
}
},
"theme": {
"title": "تفضيلات المظهر",
"description": "اختر الشكل الذي يظهر به الموقع لك. حدّد مظهرًا ثابتًا أو زامنه مع نظامك للتبديل تلقائيًا بين المظهر النهاري والليلي.",
"themeMode": "وضع المظهر",
"light": "فاتح",
"dark": "داكن",
"system": "النظام"
},
"localization": {
"title": "الإعدادات المحلية",
"description": "خصّص اللغة وتنسيق التاريخ والتفضيلات الإقليمية لحسابك.",
"language": "اللغة",
"languageDescription": "اختر لغتك المفضلة",
"rtlNotice": "تُكتب هذه اللغة من اليمين إلى اليسار (RTL)",
"dateFormat": "تنسيق التاريخ",
"dateFormatDescription": "اختر طريقة عرض التواريخ في جميع أنحاء التطبيق",
"timeFormat": "تنسيق الوقت",
"timeFormatDescription": "اختر نظام 12 ساعة أو 24 ساعة",
"preview": "معاينة: {{value}}",
"12hour": "12 ساعة (ص/م)",
"24hour": "24 ساعة",
"firstDayOfWeek": "أول أيام الأسبوع",
"firstDayOfWeekDescription": "اختر اليوم الذي يبدأ به أسبوعك",
"sunday": "الأحد",
"monday": "الاثنين",
"saturday": "السبت",
"formats": {
"mdy": "MM/DD/YYYY (الولايات المتحدة)",
"dmy": "DD/MM/YYYY (أوروبا)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "تنسيق طويل (مثال: 1 يناير 2024)",
"short": "تنسيق قصير (مثال: 1 ينا 2024)"
}
},
"advanced": {
"title": "الإعدادات المتقدمة",
"description": "اضبط الميزات المتقدمة مثل الـ Webhooks والتحديثات الفورية لتعزيز إنتاجيتك.",
"offlineTitle": "دعم العمل دون اتصال",
"offlineDescription": "واصل استخدام Donetick دون اتصال على هذا الجهاز/المتصفح. تُحفظ تغييراتك محليًا وتُزامن عند عودتك للاتصال.",
"offlineToggle": "تفعيل دعم العمل دون اتصال",
"offlineHelper": "إيقاف هذا الخيار يزيل التغييرات غير المزامنة والبيانات المحفوظة دون اتصال من هذا الجهاز/المتصفح.",
"offlineEnabled": "تم تفعيل وضع العمل دون اتصال على هذا الجهاز/المتصفح",
"offlineDisabled": "تم إيقاف وضع العمل دون اتصال ومسح البيانات المحلية",
"offlineDisabledPartial": "تم إيقاف وضع العمل دون اتصال، لكن قد تبقى بعض البيانات المحلية مخزّنة",
"offlineDisableTitle": "إيقاف وضع العمل دون اتصال",
"offlineDisableMessage": "إيقاف وضع العمل دون اتصال سيزيل التغييرات غير المزامنة والبيانات المحفوظة دون اتصال على هذا الجهاز/المتصفح. هل تريد المتابعة؟",
"offlineDisableConfirm": "الإيقاف ومسح البيانات",
"webhookTitle": "تكامل Webhook",
"webhookDescription": "تتيح لك الـ Webhooks إرسال إشعارات فورية إلى خدمات أخرى عند وقوع أحداث في دائرتك. اضبط رابط Webhook لتلقّي التحديثات الفورية.",
"webhookPlusNotice": "إشعارات Webhook غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي التحديثات الفورية عبر الـ Webhooks.",
"webhookToggle": "تفعيل Webhook",
"webhookHelper": "فعّل إشعارات Webhook لتحديثات المهام والأشياء.",
"webhookURL": "رابط Webhook",
"webhookUpdated": "تم تحديث رابط Webhook بنجاح",
"webhookUpdateFailed": "تعذّر تحديث رابط Webhook",
"realtimeTitle": "التحديثات الفورية",
"realtimeDescription": "اضبط كيفية تلقّي التحديثات المباشرة عند تغيّر المهام والأنشطة في دائرتك.",
"realtime": {
"toggleLabel": "تفعيل التحديثات الفورية",
"title": "التحديثات الفورية",
"subtitle": "تلقَّ إشعارات فورية عند تحديث المهام",
"statusLabel": "الحالة:",
"basicPlan": "التحديثات الفورية غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي إشعارات فورية عند تحديث المهام.",
"disabled": "التحديثات الفورية معطّلة. فعّلها لترى التغييرات المباشرة عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها.",
"connected": "التحديثات الفورية تعمل. سترى التغييرات المباشرة عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها.",
"connecting": "جارٍ الاتصال بالتحديثات الفورية…",
"errored": "التحديثات الفورية مفعّلة لكنها لا تعمل: {{error}}",
"notConnected": "التحديثات الفورية مفعّلة لكن لا يوجد اتصال حاليًا.",
"basicPlanNotice": "التحديثات الفورية غير متاحة في الخطة الأساسية. رقِّ إلى Plus لتلقّي إشعارات فورية عندما تنجز أنت أو أعضاء دائرتك المهام أو تتخطّونها أو تعدّلونها."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Abmelden",
"version": "Version",
"navigation": {
"search": "Suche",
"allTasks": "Alle Aufgaben",
"archived": "Archiviert",
"things": "Dinge",
@@ -29,5 +30,43 @@
"activities": "Aktivitäten",
"points": "Punkte",
"settings": "Einstellungen"
},
"search": {
"title": "Suche",
"placeholder": "Donetick durchsuchen",
"inputAriaLabel": "Aufgaben, Verlauf, Projekte, Beschriftungen und Einstellungen durchsuchen",
"deviceNote": "Es wird in Inhalten gesucht, die auf diesem Gerät verfügbar sind",
"escape": "Esc",
"recent": "Zuletzt verwendet",
"empty": {
"title": "Keine direkten Treffer",
"subtitle": "Du kannst die Aufgabenliste trotzdem mit dieser Suche filtern."
},
"groups": {
"tasks": "Aufgaben",
"history": "Notizen",
"projects": "Projekte",
"labels": "Beschriftungen",
"people": "Personen",
"settings": "Einstellungen",
"actions": "Schnellaktionen"
},
"actions": {
"quickAction": "Schnellaktion",
"navigation": "Navigation",
"createTask": "Aufgabe erstellen",
"viewAllTasks": "Alle Aufgaben anzeigen",
"viewArchivedTasks": "Archivierte Aufgaben anzeigen",
"openSettings": "Einstellungen öffnen",
"filterTasks": "Aufgaben anzeigen, die zu „{{query}}“ passen",
"filterTasksSubtitle": "Aufgabenliste filtern"
},
"footer": {
"navigate": "Navigieren",
"open": "Öffnen",
"results_one": "{{count}} Ergebnis",
"results_other": "{{count}} Ergebnisse",
"typeToSearch": "Zum Suchen tippen"
}
}
}

View File

@@ -1,100 +1,110 @@
{
"title": "Einstellungen",
"circleSettings": {
"title": "Kreis-Einstellungen",
"description": "Dein Account wird automatisch mit einem Kreis verbunden, wenn du einen erstellst oder beitrittst. Lade einfach Freunde ein, indem du den einzigartigen Kreis-Code oder Link unten teilst. Du erhältst eine Benachrichtigung, wenn jemand deinem Kreis beitreten möchte. Wenn du gehen möchtest, klicke einfach auf 'Kreis verlassen'.",
"circleCode": "Kreis-Code",
"copyCode": "Code kopieren",
"copyLink": "Link kopieren",
"codeCopied": "Kreis-Code kopiert!",
"linkCopied": "Kreis-Link kopiert!",
"joinCircle": "Einem Kreis beitreten",
"joinCirclePlaceholder": "Kreis-Code eingeben",
"join": "Beitreten",
"leave": "Kreis verlassen",
"leaveConfirmTitle": "Kreis verlassen",
"leaveConfirmMessage": "Bist du sicher, dass du diesen Kreis verlassen möchtest?",
"circleMembers": "Kreis-Mitglieder",
"circleMemberRequests": "Kreis-Beitrittsanfragen",
"admin": "Administrator",
"member": "Mitglied",
"pending": "Ausstehend",
"accept": "Akzeptieren",
"reject": "Ablehnen",
"makeAdmin": "Zum Administrator machen",
"makeMember": "Zum Mitglied machen",
"common": {
"save": "Speichern",
"cancel": "Abbrechen",
"confirm": "Bestätigen",
"remove": "Entfernen",
"webhookURL": "Webhook-URL",
"webhookDescription": "Gib eine Webhook-URL ein, um Benachrichtigungen für Kreis-Ereignisse zu erhalten",
"webhookPlaceholder": "https://deine-webhook-url.com"
"delete": "Löschen",
"refresh": "Aktualisieren",
"loading": "Wird geladen …",
"on": "An",
"off": "Aus",
"error": "Fehler",
"success": "Erfolg",
"plusFeature": "Plus-Funktion",
"earlyAccess": "Early Access"
},
"accountSettings": {
"title": "Account-Einstellungen",
"subscription": "Abonnement",
"subscriptionStatus": "Aktueller Plan",
"free": "Kostenlos",
"plus": "Plus",
"upgrade": "Upgraden",
"cancel": "Kündigen",
"changePassword": "Passwort ändern",
"password": "Passwort",
"dangerZone": "Gefahrenbereich",
"dangerZoneDescription": "Sobald du dein Konto löschst, gibt es kein Zurück mehr. Bitte sei dir sicher.",
"deleteAccount": "Account löschen"
},
"localization": {
"title": "Sprach- und Formateinstellungen",
"description": "Passe Sprache, Datumsformat und regionale Einstellungen für dein Konto an.",
"language": "Sprache",
"languageDescription": "Wähle deine bevorzugte Sprache",
"dateFormat": "Datumsformat",
"dateFormatDescription": "Wähle, wie Daten in der gesamten Anwendung angezeigt werden sollen",
"timeFormat": "Zeitformat",
"timeFormatDescription": "Wähle 12-Stunden- oder 24-Stunden-Zeitformat",
"12hour": "12-Stunden (AM/PM)",
"24hour": "24-Stunden",
"firstDayOfWeek": "Erster Tag der Woche",
"firstDayOfWeekDescription": "Wähle, welcher Tag deine Woche beginnt",
"sunday": "Sonntag",
"monday": "Montag",
"saturday": "Samstag",
"formats": {
"mdy": "MM/TT/JJJJ (USA)",
"dmy": "TT/MM/JJJJ (Europa)",
"ymd": "JJJJ-MM-TT (ISO)",
"long": "Langes Format (z.B. 1. Januar 2024)",
"short": "Kurzes Format (z.B. 1. Jan 2024)"
"overview": {
"title": "Einstellungen",
"subtitle": "Passe deine Erfahrung an und verwalte deine Kontoeinstellungen",
"upgrade": {
"title": "Auf Plus upgraden",
"description": "Schalte leistungsstarke Funktionen frei und steigere deine Produktivität",
"button": "Jetzt upgraden",
"features": {
"richText": "Rich-Text-Beschreibungen",
"notifications": "Aufgabenbenachrichtigungen",
"apiIntegrations": "API-Integrationen",
"advancedAutomation": "Erweiterte Automatisierung"
}
},
"sections": {
"profile": {
"title": "Profileinstellungen",
"description": "Aktualisiere deine Profildaten, dein Foto, deinen Anzeigenamen und deine Zeitzone."
},
"circle": {
"title": "Circle-Einstellungen",
"description": "Verwalte deinen Circle, lade Mitglieder ein und bearbeite Beitrittsanfragen."
},
"account": {
"title": "Kontoeinstellungen",
"description": "Verwalte dein Abonnement, ändere dein Passwort und lösche dein Konto."
},
"subaccounts": {
"title": "Verwaltete Konten",
"description": "Erstelle und verwalte Unterkonten, um sich anzumelden und zugewiesene Aufgaben zu erledigen."
},
"notifications": {
"title": "Benachrichtigungen",
"description": "Konfiguriere Push-Benachrichtigungen, E-Mail-Hinweise und Benachrichtigungsziele für Aufgaben."
},
"mfa": {
"title": "Multi-Faktor-Authentifizierung",
"description": "Erhöhe deine Sicherheit mit MFA über Authenticator-Apps."
},
"apitokens": {
"title": "API-Token",
"description": "Erstelle und verwalte Zugriffstoken für Drittanbieter-Integrationen und API-Zugriff."
},
"storage": {
"title": "Speichereinstellungen",
"description": "Sichere und stelle deine Daten wieder her, verwalte lokalen Speicher und Sync-Einstellungen."
},
"sidepanel": {
"title": "Seitenleisten-Anpassung",
"description": "Passe Layout und Sichtbarkeit der Karten in der Seitenleiste an."
},
"theme": {
"title": "Design-Einstellungen",
"description": "Wähle dein bevorzugtes Design und konfiguriere den Hell-/Dunkelmodus."
},
"localization": {
"title": "Lokalisierung",
"description": "Passe Sprache, Datumsformat, Zeitformat und regionale Einstellungen an."
},
"advanced": {
"title": "Erweiterte Einstellungen",
"description": "Konfiguriere Webhooks, Echtzeit-Updates und weitere erweiterte Funktionen."
},
"developer": {
"title": "Entwicklereinstellungen",
"description": "Sieh dir technische Informationen zu Authentifizierungstoken, SSE-Verbindungen und Debug-Daten an."
},
"feedback": {
"title": "Feedback senden",
"description": "Sag uns, wie Donetick für dich funktioniert, oder wünsche dir eine Funktion."
},
"bugReport": {
"title": "Fehler melden",
"description": "Etwas funktioniert nicht richtig? Schick uns die Details zusammen mit einer technischen Momentaufnahme."
}
}
},
"sidepanel": {
"title": "Seitenleisten-Anpassung",
"description": "Passe das Layout und die Sichtbarkeit von Karten in der Seitenleiste an. Dieser Bereich ist nur auf großen Bildschirmgeräten wie Tablets und Desktops verfügbar."
},
"theme": {
"title": "Theme-Einstellungen",
"description": "Wähle, wie die Seite für dich aussieht. Wähle ein einzelnes Theme oder synchronisiere mit deinem System und wechsle automatisch zwischen Tag- und Nacht-Themes.",
"themeMode": "Theme-Modus",
"light": "Hell",
"dark": "Dunkel",
"system": "System"
},
"notifications": {
"settingsSaved": "Einstellungen erfolgreich gespeichert",
"settingsSaveFailed": "Speichern der Einstellungen fehlgeschlagen",
"invalidWebhook": "Ungültige Webhook-URL"
},
"profile": {
"title": "Profil-Einstellungen",
"description": "Aktualisiere deinen Anzeigenamen und dein Profilbild.",
"title": "Profileinstellungen",
"description": "Aktualisiere deinen Anzeigenamen und dein Profilfoto.",
"photoUpdated": "Foto aktualisiert",
"photoUpdatedMessage": "Dein Profilbild wurde erfolgreich aktualisiert!",
"photoUpdatedMessage": "Dein Profilfoto wurde erfolgreich aktualisiert!",
"uploadFailed": "Upload fehlgeschlagen",
"uploadFailedMessage": "Das Hochladen deines Fotos ist fehlgeschlagen. Bitte versuche es erneut.",
"uploadFailedMessage": "Dein Foto konnte nicht hochgeladen werden. Bitte versuche es erneut.",
"profileUpdated": "Profil aktualisiert",
"profileUpdatedMessage": "Deine Profilinformationen wurden erfolgreich gespeichert!",
"updateFailed": "Update fehlgeschlagen",
"updateFailedMessage": "Dein Profil konnte nicht aktualisiert werden. Bitte überprüfe deine Verbindung und versuche es erneut.",
"profileUpdatedMessage": "Deine Profildaten wurden erfolgreich gespeichert!",
"updateFailed": "Aktualisierung fehlgeschlagen",
"updateFailedMessage": "Dein Profil konnte nicht aktualisiert werden. Bitte prüfe deine Verbindung und versuche es erneut.",
"changePhoto": "Foto ändern",
"editPhoto": "Profilfoto bearbeiten",
"displayName": "Anzeigename",
"displayNamePlaceholder": "Gib deinen Anzeigenamen ein",
"timezone": "Zeitzone",
@@ -102,77 +112,383 @@
"save": "Speichern",
"cancel": "Abbrechen"
},
"overview": {
"title": "Einstellungen",
"subtitle": "Passe deine Erfahrung an und verwalte deine Account-Einstellungen",
"upgrade": {
"title": "Auf Plus upgraden",
"description": "Schalte mächtige Funktionen frei, um deine Produktivität zu steigern",
"button": "Jetzt upgraden",
"features": {
"richText": "Rich-Text-Beschreibungen",
"notifications": "Aufgaben-Benachrichtigungen",
"apiIntegrations": "API-Integrationen",
"advancedAutomation": "Erweiterte Automatisierung"
}
"circleSettings": {
"title": "Circle-Einstellungen",
"description": "Dein Konto wird automatisch mit einem Circle verbunden, wenn du einen erstellst oder beitrittst. Lade Freunde ein, indem du den unten stehenden Circle-Code oder Link teilst. Du erhältst unten eine Benachrichtigung, wenn jemand deinem Circle beitreten möchte.",
"memberOf": "Du bist Teil von {{name}}",
"yourCircleCode": "Dein Circle-Code lautet:",
"copyCode": "Code kopieren",
"shareInvite": "Einladung teilen",
"codeCopied": "Code in die Zwischenablage kopiert",
"linkCopied": "Einladungslink in die Zwischenablage kopiert",
"myCircle": "meinem Circle",
"shareTitle": "Tritt {{name}} auf Donetick bei",
"shareText": "Ich möchte dich einladen, {{name}} auf Donetick beizutreten.",
"shareDialogTitle": "Circle-Einladung teilen",
"leave": "Circle verlassen",
"leaveConfirmTitle": "Circle verlassen",
"leaveConfirmMessage": "Möchtest du deinen Circle wirklich verlassen?",
"leaveConfirmButton": "Verlassen",
"leftCircle": "Circle erfolgreich verlassen",
"leaveFailed": "Circle konnte nicht verlassen werden",
"circleMembers": "Circle-Mitglieder",
"you": "(Du)",
"pendingApproval": "Warten auf Freigabe",
"joinedOn": "Beigetreten am {{date}}",
"requestedToJoin": "Beitrittsanfrage {{date}}",
"roles": {
"member": "Mitglied",
"memberDescription": "Ein normales Mitglied des Circles",
"manager": "Manager",
"managerDescription": "Kann sich als Nutzer ausgeben und in deren Namen handeln",
"admin": "Admin",
"adminDescription": "Voller Zugriff auf den Circle"
},
"sections": {
"profile": {
"title": "Profil-Einstellungen",
"description": "Aktualisiere deine Profilinformationen, Foto, Anzeigenamen und Zeitzonen-Einstellungen."
"roleUpdateFailed": "Rolle konnte nicht aktualisiert werden",
"removeMemberTitle": "Mitglied entfernen",
"removeMemberMessage": "Möchtest du {{name}} wirklich aus deinem Circle entfernen?",
"memberRemoved": "Mitglied erfolgreich entfernt",
"circleMemberRequests": "Beitrittsanfragen",
"lastUpdated": "Zuletzt aktualisiert: {{time}}",
"refreshing": "Wird aktualisiert …",
"refreshFailed": "Beitrittsanfragen konnten nicht aktualisiert werden",
"wantsToJoin": "{{name}} möchte deinem Circle beitreten.",
"accept": "Annehmen",
"acceptRequestTitle": "Beitrittsanfrage annehmen",
"acceptRequestMessage": "Möchtest du {{name}} (Benutzername: {{username}}) wirklich in deinen Circle aufnehmen?",
"requestAccepted": "Anfrage erfolgreich angenommen",
"or": "oder",
"joinOtherDescription": "Möchtest du dem Circle einer anderen Person beitreten? Frage nach dem Circle-Code oder Beitrittslink. Gib den Code unten ein, um beizutreten.",
"enterCircleCode": "Circle-Code eingeben:",
"enterCodePlaceholder": "Code eingeben",
"joinCircle": "Circle beitreten",
"joinedPending": "Circle erfolgreich beigetreten, warte auf die Bestätigung durch die Circle-Inhaberin oder den Circle-Inhaber.",
"alreadyMember": "Du bist bereits Mitglied dieses Circles",
"joinFailed": "Beitritt zum Circle fehlgeschlagen"
},
"accountSettings": {
"title": "Kontoeinstellungen",
"description": "Ändere deine Kontoeinstellungen, deinen Kontotyp oder dein Passwort",
"accountType": "Kontotyp: {{type}}",
"free": "Kostenlos",
"plus": "Plus",
"plusUntil": "Plus (bis {{date}})",
"activeDescription": "Du hast derzeit den Plus-Tarif abonniert. Dein Abonnement verlängert sich am {{date}}.",
"cancelledDescription": "Du hast dein Abonnement gekündigt. Dein Konto wird am {{date}} auf den kostenlosen Tarif zurückgestuft.",
"freeDescription": "Du nutzt derzeit den kostenlosen Tarif. Wechsle zu Plus, um mehr Funktionen freizuschalten.",
"upgrade": "Upgraden",
"cancel": "Kündigen",
"password": "Passwort:",
"changePassword": "Passwort ändern",
"passwordChanged": "Passwort erfolgreich geändert",
"passwordChangeFailed": "Passwortänderung fehlgeschlagen",
"dangerZone": "Gefahrenzone",
"dangerZoneDescription": "Sobald du dein Konto löschst, gibt es kein Zurück. Bitte sei dir sicher.",
"deleteAccount": "Konto löschen",
"accountDeleted": "Konto erfolgreich gelöscht",
"subscriptionCancelled": "Abonnement gekündigt",
"subscriptionCancelFailed": "Abonnement konnte nicht gekündigt werden",
"purchase": {
"success": "Kauf erfolgreich! Bitte starte die App neu, um die Plus-Funktionen zu nutzen.",
"storeConnection": "Verbindungsproblem mit dem Store. Bitte prüfe dein Netzwerk und versuche es erneut.",
"notAllowed": "Käufe sind auf diesem Gerät nicht erlaubt. Bitte prüfe deine Geräteeinschränkungen.",
"unavailable": "Dieses Abonnement ist nicht verfügbar. Bitte versuche es später erneut.",
"alreadyProcessed": "Dieser Kauf wurde bereits verarbeitet. Wenn du glaubst, dass dies ein Fehler ist, wende dich bitte an den Support.",
"receiptMissing": "Kaufbeleg fehlt. Bitte versuche den Kauf erneut.",
"networkError": "Netzwerkfehler. Bitte prüfe deine Verbindung und versuche es erneut.",
"invalidReceipt": "Ungültiger Kaufbeleg. Bitte wende dich an den Support, falls das Problem bestehen bleibt.",
"pending": "Die Zahlung wartet auf Freigabe. Du erhältst Zugriff, sobald sie bestätigt ist.",
"failed": "Kauf fehlgeschlagen: {{error}}. Bitte versuche es erneut oder wende dich an den Support.",
"unknownError": "Unbekannter Fehler"
}
},
"subaccounts": {
"title": "Verwaltete Konten",
"description": "Verwalte Unterkonten. Nutzerinnen und Nutzer von Unterkonten können sich anmelden und zugewiesene Aufgaben erledigen.",
"notParentTitle": "Verwaltung von Unterkonten",
"notParentMessage": "Nur Hauptkonten können Unterkonten verwalten.",
"freePlanNotice": "Im kostenlosen Tarif ist 1 Unterkonto möglich. Wechsle zu Plus für bis zu 5 Unterkonten.",
"count": "Unterkonten ({{count}})",
"add": "Unterkonto hinzufügen",
"loading": "Unterkonten werden geladen …",
"emptyTitle": "Keine Unterkonten",
"emptyDescription": "Erstelle Unterkonten, damit Teammitglieder sich anmelden und ihre Aufgaben erledigen können.",
"addFirst": "Erstes Unterkonto hinzufügen",
"username": "Benutzername: {{username}}",
"created": "Erstellt: {{date}}",
"changePassword": "Passwort ändern",
"deleteAccount": "Konto löschen",
"createdSuccess": "Unterkonto „{{name}}“ wurde erfolgreich erstellt!",
"createFailed": "Unterkonto konnte nicht erstellt werden: {{error}}",
"createFailedGeneric": "Unterkonto konnte nicht erstellt werden",
"passwordUpdated": "Passwort des Unterkontos erfolgreich aktualisiert",
"passwordUpdateFailed": "Passwort konnte nicht aktualisiert werden: {{error}}",
"passwordUpdateFailedGeneric": "Passwort konnte nicht aktualisiert werden",
"deleteConfirmTitle": "Unterkonto löschen",
"deleteConfirmMessage": "Möchtest du das Unterkonto „{{name}}“ wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"deleted": "Unterkonto „{{name}}“ erfolgreich gelöscht",
"deleteFailed": "Unterkonto konnte nicht gelöscht werden: {{error}}",
"deleteFailedGeneric": "Unterkonto konnte nicht gelöscht werden",
"howItWorksTitle": "So funktionieren verwaltete Konten",
"howItWorks1": "Verwaltete Konten werden vom Hauptkonto erstellt für Personen, deren Konto du löschen und deren Passwort du zurücksetzen können möchtest.",
"howItWorks2": "Unterkonten können sich mit eigenem Benutzernamen und Passwort anmelden.",
"howItWorks3": "Verwaltete Konten können Aufgaben erledigen, haben aber eingeschränkte Verwaltungsrechte",
"howItWorks4": "Verwaltete Konten werden automatisch deinem Circle hinzugefügt"
},
"notifications": {
"title": "Benachrichtigungseinstellungen",
"deviceSection": "Gerätebenachrichtigungen",
"deviceSectionDescription": "Verwalte deine Gerätebenachrichtigungen",
"deviceLabel": "Gerätebenachrichtigung",
"deviceHelper": "Erhalte eine Benachrichtigung auf deinem Gerät, wenn eine Aufgabe fällig ist",
"mobileOnly": "Diese Funktion ist nur auf Mobilgeräten verfügbar",
"testNotification": "Testbenachrichtigung",
"testNotificationBody": "Eine Aufgabe wird bald fällig",
"dueTitle": "Benachrichtigung bei Fälligkeit",
"dueLabel": "Benachrichtigung, wenn die Aufgabe fällig ist",
"preDueTitle": "Benachrichtigung vor Fälligkeit",
"preDueLabel": "Benachrichtigung einige Stunden vor Fälligkeit der Aufgabe",
"overdueTitle": "Benachrichtigung bei Überfälligkeit",
"overdueLabel": "Benachrichtigung, wenn die Aufgabe überfällig ist",
"pushLabel": "Push-Benachrichtigungen",
"pushHelper": "Erhalte Erinnerungen, Ankündigungen und Aufgabenzuweisungen per Push-Benachrichtigung",
"registeredDevices": "Registrierte Geräte ({{count}}/5)",
"registeredDevicesDescription": "Geräte, die Push-Benachrichtigungen für dein Konto erhalten",
"currentDevice": "Aktuelles Gerät: {{platform}} {{model}}",
"currentDeviceNotRegistered": "Dieses Gerät ist nicht für Push-Benachrichtigungen registriert",
"limitReached": "Limit erreicht",
"registerDevice": "Gerät registrieren",
"unknownDevice": "Unbekanntes Gerät",
"deviceCreatedAt": "Erstellt am: {{date}}",
"noDevices": "Keine Geräte für Push-Benachrichtigungen registriert",
"customSection": "Benutzerdefinierte Benachrichtigung",
"customSectionDescription": "Benachrichtigung über andere Plattformen wie Telegram oder Pushover",
"customLabel": "Benutzerdefinierte Benachrichtigung",
"customHelper": "Benachrichtigungen über eine andere Plattform erhalten",
"targetNone": "Keine",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Du musst dem Bot zuerst eine Nachricht senden, damit die Telegram-Benachrichtigung funktioniert",
"telegramBotHelpAfter": "um einen Chat zu starten",
"clickHere": "Hier klicken",
"chatId": "Chat-ID",
"chatIdPlaceholder": "Benutzer-ID / Chat-ID",
"telegramChatIdHelpBefore": "Wenn du deine Chat-ID nicht kennst, starte einen Chat mit userinfobot er sendet dir deine Chat-ID.",
"telegramChatIdHelpAfter": "um einen Chat mit userinfobot zu starten",
"userKey": "Benutzerschlüssel",
"userKeyPlaceholder": "Benutzer-ID",
"chatIdRequired": "Chat-ID ist erforderlich",
"chatIdInvalid": "Ungültige Chat-ID",
"userKeyRequired": "Benutzerschlüssel ist erforderlich",
"targetUpdated": "Benachrichtigungsziel aktualisiert",
"targetUpdateFailed": "Fehler beim Aktualisieren des Benachrichtigungsziels: {{error}}",
"deviceRegistered": "Gerät erfolgreich für Push-Benachrichtigungen registriert.",
"deviceLimitTitle": "Gerätelimit erreicht",
"deviceLimitMessage": "Du hast das Maximum von 5 registrierten Geräten erreicht. Bitte entferne ein Gerät, bevor du dieses registrierst.",
"registrationFailedTitle": "Registrierung fehlgeschlagen",
"registrationFailedMessage": "Das Gerät konnte nicht automatisch registriert werden. Bitte versuche es erneut.",
"permissionRequiredTitle": "Berechtigung erforderlich",
"permissionRequiredMessage": "Für die Registrierung dieses Geräts ist die Berechtigung für Push-Benachrichtigungen erforderlich.",
"registrationInitiatedTitle": "Registrierung gestartet",
"registrationInitiatedMessage": "Die Registrierung für Push-Benachrichtigungen wurde gestartet. Das Gerät wird automatisch registriert.",
"registerDeviceFailed": "Gerät konnte nicht registriert werden. Bitte versuche es erneut.",
"permissionDeniedTitle": "Benachrichtigungsberechtigung verweigert",
"permissionDeniedMessage": "Du hast Benachrichtigungsberechtigungen verweigert. Du kannst sie später in den Geräteeinstellungen aktivieren.",
"pushPermissionDeniedTitle": "Push-Benachrichtigungsberechtigung verweigert",
"pushPermissionDeniedMessage": "Push-Benachrichtigungen wurden deaktiviert. Du kannst sie bei Bedarf in den Geräteeinstellungen aktivieren.",
"unregisterFailed": "Gerät konnte nicht abgemeldet werden"
},
"mfa": {
"title": "Multi-Faktor-Authentifizierung",
"description": "Schütze dein Konto zusätzlich mit Multi-Faktor-Authentifizierung (MFA). Wenn sie aktiviert ist, musst du beim Anmelden neben deinem Passwort einen Bestätigungscode aus deiner Authenticator-App eingeben.",
"twoFactor": "Zwei-Faktor-Authentifizierung",
"enabledSubtitle": "Dein Konto ist mit 2FA geschützt",
"disabledSubtitle": "Sichere dein Konto mit einer Authenticator-App",
"enable": "Aktivieren",
"disable": "Deaktivieren",
"enabledSuccess": "MFA wurde erfolgreich aktiviert!",
"disabledSuccess": "MFA wurde erfolgreich deaktiviert!",
"errors": {
"qrGenerationFailed": "QR-Code konnte nicht erstellt werden",
"invalidResponse": "Ungültige Antwort vom Server. QR-Code oder Schlüssel fehlt.",
"notFound": "MFA-Einrichtungs-Endpunkt nicht gefunden. Diese Funktion ist möglicherweise noch nicht verfügbar.",
"unauthorized": "Nicht autorisiert. Bitte melde dich erneut an.",
"serverError": "Serverfehler. Bitte versuche es später erneut.",
"setupFailed": "MFA-Einrichtung fehlgeschlagen ({{status}}). Bitte versuche es erneut.",
"networkError": "Netzwerkfehler. Bitte prüfe deine Verbindung und versuche es erneut.",
"invalidCode": "Ungültiger Bestätigungscode. Bitte versuche es erneut.",
"confirmFailed": "MFA konnte nicht bestätigt werden. Bitte versuche es erneut.",
"disableFailed": "MFA konnte nicht deaktiviert werden. Bitte versuche es erneut."
},
"setup": {
"title": "Multi-Faktor-Authentifizierung einrichten",
"addedAccount": "Ich habe das Konto hinzugefügt",
"back": "Zurück",
"verifyAndEnable": "Prüfen & aktivieren",
"savedBackupCodes": "Ich habe meine Backup-Codes gespeichert",
"step1Label": "Schritt 1:",
"step1": "Scanne den QR-Code unten mit deiner Authenticator-App (Google Authenticator, Authy usw.)",
"qrAlt": "MFA-QR-Code",
"qrFailed": "Der QR-Code konnte nicht erstellt werden. Bitte versuche es erneut oder nutze den manuellen Schlüssel unten.",
"manualKey": "Manueller Schlüssel:",
"step2Label": "Schritt 2:",
"step2": "Gib den 6-stelligen Bestätigungscode aus deiner Authenticator-App ein",
"codePlaceholder": "6-stelligen Code eingeben",
"successTitle": "MFA erfolgreich aktiviert!",
"backupCodesTitle": "Bewahre diese Backup-Codes an einem sicheren Ort auf",
"backupCodesDescription": "Mit diesen Codes kannst du auf dein Konto zugreifen, falls du dein Authenticator-Gerät verlierst. Jeder Code kann nur einmal verwendet werden."
},
"disableModal": {
"title": "Multi-Faktor-Authentifizierung deaktivieren",
"warning": "Das Deaktivieren von MFA macht dein Konto weniger sicher. Möchtest du wirklich fortfahren?",
"prompt": "Gib zur Bestätigung einen Bestätigungscode aus deiner Authenticator-App ein:",
"confirm": "MFA deaktivieren"
},
"backupCodesModal": {
"title": "Neue Backup-Codes",
"warning": "Deine bisherigen Backup-Codes sind jetzt ungültig. Bewahre diese neuen Codes an einem sicheren Ort auf. Jeder Code kann nur einmal verwendet werden."
}
},
"apiTokens": {
"title": "API-Token",
"accessToken": "Zugriffstoken",
"description": "Erstelle ein Token, um über die API Dinge zu aktualisieren, die Aufgaben auslösen",
"plusNotice": "API-Token sind im Basis-Tarif nicht verfügbar. Wechsle zu Plus, um API-Token für die Anbindung externer Systeme und die Automatisierung deiner Aufgaben zu erstellen.",
"showToken": "Token anzeigen",
"hideToken": "Token verbergen",
"removeTitle": "Token entfernen",
"removeMessage": "Möchtest du {{name}} wirklich entfernen?",
"removedTitle": "Entfernt",
"removedMessage": "Das API-Token wurde entfernt",
"tokenCopied": "Token in die Zwischenablage kopiert",
"generateNew": "Neues Token erstellen",
"nameModalTitle": "Gib deinem neuen Token einen Namen, an dem du es wiedererkennst.",
"generateToken": "Token erstellen"
},
"storage": {
"title": "Speichereinstellungen",
"serverTitle": "Serverspeicher-Nutzung",
"serverDescription": "Das ist der Speicher, den dein Konto auf unseren Servern belegt (z. B. Dateien, Bilder und hochgeladene Daten).",
"usagePlaceholder": "-- MB belegt / -- MB gesamt (--)",
"usage": "{{used}} MB belegt / {{total}} MB gesamt ({{percent}} %)",
"basicPlanNotice": "Serverspeicher ist im Basis-Tarif nicht verfügbar. Wechsle zu Plus, um deine Serverspeicher-Nutzung zu verfolgen.",
"localTitleApp": "Lokaler App-Speicher & Cache",
"localTitleBrowser": "Lokaler Browser-Speicher & Cache",
"localDescription": "Das sind Daten, die für schnelleren Zugriff lokal in deinem Browser gespeichert werden. Das Löschen wirkt sich nicht auf deine Serverdaten aus, meldet dich aber möglicherweise ab.",
"clearLocal": "Gesamten lokalen Speicher und Cache löschen",
"clearLocalTitle": "Gesamten lokalen Speicher löschen",
"clearLocalMessage": "Möchtest du deinen lokalen Speicher und Cache wirklich löschen? Dadurch werden alle Daten aus diesem Browser entfernt und eine erneute Anmeldung ist erforderlich.",
"clearAll": "Alles löschen",
"appPreferences": "App-Einstellungen",
"deviceOnly": "Nur auf dem Gerät",
"appPreferencesDescription": "Das sind Einstellungen, die die App lokal auf deinem Gerät speichert. Beim Löschen werden app-spezifische Einstellungen zurückgesetzt und du wirst möglicherweise abgemeldet deine Serverdaten bleiben unberührt.",
"clearPreferences": "App-Einstellungen löschen",
"clearPreferencesTitle": "App-Einstellungen löschen",
"clearPreferencesMessage": "Möchtest du wirklich alle App-Einstellungen löschen? Dadurch werden deine App-Einstellungen zurückgesetzt und du musst dich möglicherweise erneut anmelden."
},
"sidepanel": {
"title": "Seitenleisten-Anpassung",
"heading": "Seitenleisten-Einstellungen",
"description": "Lege fest, welche Karten in der Seitenleiste erscheinen und in welcher Reihenfolge. Ziehe die Karten zum Sortieren oder schalte ihre Sichtbarkeit um.",
"resetToDefaults": "Auf Standard zurücksetzen",
"resetHelper": "Dadurch werden Sichtbarkeit und Reihenfolge aller Karten auf den Standard zurückgesetzt.",
"cards": {
"welcome": {
"name": "Benutzerwechsel",
"description": "Ermöglicht Admins/Managern, Aufgaben aus Sicht anderer Nutzer zu sehen"
},
"circle": {
"title": "Kreis-Einstellungen",
"description": "Verwalte deinen Kreis, lade Mitglieder ein und bearbeite Beitrittsanfragen."
"smartInsights": {
"name": "Smarte Einblicke",
"description": "Schnellaktionen basierend auf deinen Aufgaben"
},
"account": {
"title": "Account-Einstellungen",
"description": "Verwalte dein Abonnement, ändere dein Passwort und Account-Löschoptionen."
"assignees": {
"name": "Aufgaben nach Zuständigkeit",
"description": "Gruppiert Aufgaben nach zugewiesener Person"
},
"subaccounts": {
"title": "Verwaltete Accounts",
"description": "Erstelle und verwalte Unter-Accounts zum Anmelden und Erledigen zugewiesener Aufgaben."
"calendar": {
"name": "Kalenderansicht",
"description": "Zeigt Aufgaben im Kalenderformat"
},
"notifications": {
"title": "Benachrichtigungen",
"description": "Konfiguriere Push-Benachrichtigungen, E-Mail-Benachrichtigungen und Benachrichtigungsziele für Aufgaben."
"activities": {
"name": "Letzte Aktivitäten",
"description": "Zeigt kürzlich erledigte Aufgaben und Aktivitäten"
},
"mfa": {
"title": "Multi-Faktor-Authentifizierung",
"description": "Füge eine zusätzliche Sicherheitsebene mit MFA über Authenticator-Apps hinzu."
},
"apitokens": {
"title": "API-Token",
"description": "Generiere und verwalte Zugriffstoken für Drittanbieter-Integrationen und API-Zugang."
},
"storage": {
"title": "Speicher-Einstellungen",
"description": "Sichere und stelle deine Daten wieder her, verwalte lokalen Speicher und Synchronisierungseinstellungen."
},
"sidepanel": {
"title": "Seitenleisten-Anpassung",
"description": "Passe das Layout und die Sichtbarkeit von Karten in der Seitenleisten-Oberfläche an."
},
"theme": {
"title": "Theme-Einstellungen",
"description": "Wähle dein bevorzugtes Theme und konfiguriere Dunkel-/Hell-Modus-Einstellungen."
},
"localization": {
"title": "Sprach- und Formateinstellungen",
"description": "Passe Sprache, Datumsformat, Zeitformat und regionale Einstellungen an."
},
"advanced": {
"title": "Erweiterte Einstellungen",
"description": "Konfiguriere Webhooks, Echtzeit-Updates und andere erweiterte Funktionen für erhöhte Produktivität."
},
"developer": {
"title": "Entwickler-Einstellungen",
"description": "Zeige technische Informationen über Authentifizierungs-Token, SSE-Verbindungen und Debug-Daten an."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"weeklyGoals": {
"name": "Wochenziele",
"description": "Zeigt den Wochenfortschritt und die Erledigungsstatistik der Familie"
}
}
},
"theme": {
"title": "Design-Einstellungen",
"description": "Lege fest, wie die Seite für dich aussieht. Wähle ein festes Design oder synchronisiere mit deinem System, um automatisch zwischen hellem und dunklem Design zu wechseln.",
"themeMode": "Design-Modus",
"light": "Hell",
"dark": "Dunkel",
"system": "System"
},
"localization": {
"title": "Lokalisierung",
"description": "Passe Sprache, Datumsformat und regionale Einstellungen für dein Konto an.",
"language": "Sprache",
"languageDescription": "Wähle deine bevorzugte Sprache",
"rtlNotice": "Diese Sprache wird von rechts nach links (RTL) geschrieben",
"dateFormat": "Datumsformat",
"dateFormatDescription": "Lege fest, wie Datumsangaben in der App angezeigt werden",
"timeFormat": "Zeitformat",
"timeFormatDescription": "Wähle das 12- oder 24-Stunden-Format",
"preview": "Vorschau: {{value}}",
"12hour": "12 Stunden (AM/PM)",
"24hour": "24 Stunden",
"firstDayOfWeek": "Erster Wochentag",
"firstDayOfWeekDescription": "Lege fest, mit welchem Tag deine Woche beginnt",
"sunday": "Sonntag",
"monday": "Montag",
"saturday": "Samstag",
"formats": {
"mdy": "MM/TT/JJJJ (USA)",
"dmy": "TT.MM.JJJJ (Europa)",
"ymd": "JJJJ-MM-TT (ISO)",
"long": "Langes Format (z. B. 1. Januar 2024)",
"short": "Kurzes Format (z. B. 1. Jan. 2024)"
}
},
"advanced": {
"title": "Erweiterte Einstellungen",
"description": "Konfiguriere erweiterte Funktionen wie Webhooks und Echtzeit-Updates für mehr Produktivität.",
"offlineTitle": "Offline-Unterstützung",
"offlineDescription": "Nutze Donetick auch offline auf diesem Gerät/Browser. Deine Änderungen werden lokal gespeichert und synchronisiert, sobald du wieder online bist.",
"offlineToggle": "Offline-Unterstützung aktivieren",
"offlineHelper": "Beim Deaktivieren werden nicht synchronisierte Offline-Änderungen und gespeicherte Offline-Daten von diesem Gerät/Browser entfernt.",
"offlineEnabled": "Offline-Modus für dieses Gerät/diesen Browser aktiviert",
"offlineDisabled": "Offline-Modus deaktiviert und lokale Daten gelöscht",
"offlineDisabledPartial": "Der Offline-Modus wurde deaktiviert, es können jedoch noch lokale Daten gespeichert sein",
"offlineDisableTitle": "Offline-Modus deaktivieren",
"offlineDisableMessage": "Beim Deaktivieren des Offline-Modus werden nicht synchronisierte Offline-Änderungen und gespeicherte Offline-Daten auf diesem Gerät/Browser entfernt. Möchtest du fortfahren?",
"offlineDisableConfirm": "Deaktivieren & Daten löschen",
"webhookTitle": "Webhook-Integration",
"webhookDescription": "Mit Webhooks kannst du Echtzeit-Benachrichtigungen an andere Dienste senden, wenn in deinem Circle etwas passiert. Konfiguriere eine Webhook-URL, um Echtzeit-Updates zu erhalten.",
"webhookPlusNotice": "Webhook-Benachrichtigungen sind im Basis-Tarif nicht verfügbar. Wechsle zu Plus, um Echtzeit-Updates per Webhook zu erhalten.",
"webhookToggle": "Webhook aktivieren",
"webhookHelper": "Webhook-Benachrichtigungen für Aufgaben- und Dinge-Updates aktivieren.",
"webhookURL": "Webhook-URL",
"webhookUpdated": "Webhook-URL erfolgreich aktualisiert",
"webhookUpdateFailed": "Webhook-URL konnte nicht aktualisiert werden",
"realtimeTitle": "Echtzeit-Updates",
"realtimeDescription": "Lege fest, wie du Live-Updates erhältst, wenn sich Aufgaben und Aktivitäten in deinem Circle ändern.",
"realtime": {
"toggleLabel": "Echtzeit-Updates aktivieren",
"title": "Echtzeit-Updates",
"subtitle": "Erhalte sofort Benachrichtigungen, wenn Aufgaben aktualisiert werden",
"statusLabel": "Status:",
"basicPlan": "Echtzeit-Updates sind im Basis-Tarif nicht verfügbar. Wechsle zu Plus, um sofort benachrichtigt zu werden, wenn Aufgaben aktualisiert werden.",
"disabled": "Echtzeit-Updates sind deaktiviert. Aktiviere sie, um Live-Änderungen zu sehen, wenn du oder andere Circle-Mitglieder Aufgaben erledigen, überspringen oder ändern.",
"connected": "Echtzeit-Updates funktionieren. Du siehst Live-Änderungen, wenn du oder andere Circle-Mitglieder Aufgaben erledigen, überspringen oder ändern.",
"connecting": "Verbindung zu Echtzeit-Updates wird hergestellt …",
"errored": "Echtzeit-Updates sind aktiviert, funktionieren aber nicht: {{error}}",
"notConnected": "Echtzeit-Updates sind aktiviert, aber derzeit nicht verbunden.",
"basicPlanNotice": "Echtzeit-Updates sind im Basis-Tarif nicht verfügbar. Wechsle zu Plus, um sofort benachrichtigt zu werden, wenn du oder andere Circle-Mitglieder Aufgaben erledigen, überspringen oder ändern."
}
}
}

View File

@@ -31,6 +31,44 @@
"points": "Points",
"settings": "Settings"
},
"search": {
"title": "Search",
"placeholder": "Search Donetick",
"inputAriaLabel": "Search tasks, history, projects, labels and settings",
"deviceNote": "Searching content available on this device",
"escape": "Esc",
"recent": "Recent",
"empty": {
"title": "No direct matches",
"subtitle": "You can still filter the task list with this search."
},
"groups": {
"tasks": "Tasks",
"history": "Notes",
"projects": "Projects",
"labels": "Labels",
"people": "People",
"settings": "Settings",
"actions": "Quick actions"
},
"actions": {
"quickAction": "Quick action",
"navigation": "Navigation",
"createTask": "Create a task",
"viewAllTasks": "View all tasks",
"viewArchivedTasks": "View archived tasks",
"openSettings": "Open settings",
"filterTasks": "Show tasks matching “{{query}}”",
"filterTasksSubtitle": "Filter the task list"
},
"footer": {
"navigate": "Navigate",
"open": "Open",
"results_one": "{{count}} result",
"results_other": "{{count}} results",
"typeToSearch": "Type to search"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,106 +1,19 @@
{
"title": "Settings",
"circleSettings": {
"title": "Circle settings",
"description": "Your account is automatically connected to a Circle when you create or join one. Easily invite friends by sharing the unique Circle code or link below. You'll receive a notification below when someone requests to join your Circle. If you'd like to leave, simply hit the 'Leave Circle' button.",
"circleCode": "Circle Code",
"copyCode": "Copy Code",
"copyLink": "Copy Link",
"codeCopied": "Circle code copied!",
"linkCopied": "Circle link copied!",
"joinCircle": "Join a Circle",
"joinCirclePlaceholder": "Enter Circle Code",
"join": "Join",
"leave": "Leave Circle",
"leaveConfirmTitle": "Leave Circle",
"leaveConfirmMessage": "Are you sure you want to leave this circle?",
"circleMembers": "Circle Members",
"circleMemberRequests": "Circle Member Requests",
"admin": "Admin",
"member": "Member",
"pending": "Pending",
"accept": "Accept",
"reject": "Reject",
"makeAdmin": "Make Admin",
"makeMember": "Make Member",
"remove": "Remove",
"webhookURL": "Webhook URL",
"webhookDescription": "Enter a webhook URL to receive notifications for circle events",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "Account Settings",
"subscription": "Subscription",
"subscriptionStatus": "Current Plan",
"free": "Free",
"plus": "Plus",
"upgrade": "Upgrade",
"cancel": "Cancel",
"changePassword": "Change Password",
"password": "Password",
"dangerZone": "Danger Zone",
"dangerZoneDescription": "Once you delete your account, there is no going back. Please be certain.",
"deleteAccount": "Delete Account"
},
"localization": {
"title": "Localization",
"description": "Customize language, date format, and regional preferences for your account.",
"language": "Language",
"languageDescription": "Select your preferred language",
"dateFormat": "Date Format",
"dateFormatDescription": "Choose how dates should be displayed throughout the application",
"timeFormat": "Time Format",
"timeFormatDescription": "Select 12-hour or 24-hour time format",
"12hour": "12-hour (AM/PM)",
"24hour": "24-hour",
"firstDayOfWeek": "First Day of Week",
"firstDayOfWeekDescription": "Select which day starts your week",
"sunday": "Sunday",
"monday": "Monday",
"saturday": "Saturday",
"formats": {
"mdy": "MM/DD/YYYY (US)",
"dmy": "DD/MM/YYYY (Europe)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "Long format (e.g., January 1, 2024)",
"short": "Short format (e.g., Jan 1, 2024)"
}
},
"sidepanel": {
"title": "Sidepanel Customization",
"description": "Customize the layout and visibility of cards in the sidepanel. This section is only available on large screen devices such as tablets and desktops."
},
"theme": {
"title": "Theme preferences",
"description": "Choose how the site looks to you. Select a single theme, or sync with your system and automatically switch between day and night themes.",
"themeMode": "Theme mode",
"light": "Light",
"dark": "Dark",
"system": "System"
},
"notifications": {
"settingsSaved": "Settings saved successfully",
"settingsSaveFailed": "Failed to save settings",
"invalidWebhook": "Invalid webhook URL"
},
"profile": {
"title": "Profile Settings",
"description": "Update your display name and profile photo.",
"photoUpdated": "Photo Updated",
"photoUpdatedMessage": "Your profile photo has been updated successfully!",
"uploadFailed": "Upload Failed",
"uploadFailedMessage": "Failed to upload your photo. Please try again.",
"profileUpdated": "Profile Updated",
"profileUpdatedMessage": "Your profile information has been saved successfully!",
"updateFailed": "Update Failed",
"updateFailedMessage": "Unable to update your profile. Please check your connection and try again.",
"changePhoto": "Change Photo",
"displayName": "Display Name",
"displayNamePlaceholder": "Enter your display name",
"timezone": "Timezone",
"timezonePlaceholder": "Select your timezone",
"common": {
"save": "Save",
"cancel": "Cancel"
"cancel": "Cancel",
"confirm": "Confirm",
"remove": "Remove",
"delete": "Delete",
"refresh": "Refresh",
"loading": "Loading...",
"on": "On",
"off": "Off",
"error": "Error",
"success": "Success",
"plusFeature": "Plus Feature",
"earlyAccess": "Early Access"
},
"overview": {
"title": "Settings",
@@ -178,5 +91,404 @@
"description": "Something not working right? Send us the details along with a technical snapshot."
}
}
},
"profile": {
"title": "Profile Settings",
"description": "Update your display name and profile photo.",
"photoUpdated": "Photo Updated",
"photoUpdatedMessage": "Your profile photo has been updated successfully!",
"uploadFailed": "Upload Failed",
"uploadFailedMessage": "Failed to upload your photo. Please try again.",
"profileUpdated": "Profile Updated",
"profileUpdatedMessage": "Your profile information has been saved successfully!",
"updateFailed": "Update Failed",
"updateFailedMessage": "Unable to update your profile. Please check your connection and try again.",
"changePhoto": "Change Photo",
"editPhoto": "Edit profile photo",
"displayName": "Display Name",
"displayNamePlaceholder": "Enter your display name",
"timezone": "Timezone",
"timezonePlaceholder": "Select your timezone",
"save": "Save",
"cancel": "Cancel"
},
"circleSettings": {
"title": "Circle Settings",
"description": "Your account is automatically connected to a Circle when you create or join one. Easily invite friends by sharing the unique Circle code or link below. You'll receive a notification below when someone requests to join your Circle.",
"memberOf": "You are part of {{name}}",
"yourCircleCode": "Your circle code is:",
"copyCode": "Copy Code",
"shareInvite": "Share Invite",
"codeCopied": "Code copied to clipboard",
"linkCopied": "Invite link copied to clipboard",
"myCircle": "my Circle",
"shareTitle": "Join {{name}} on Donetick",
"shareText": "I'd like to invite you to join {{name}} on Donetick.",
"shareDialogTitle": "Share Circle invite",
"leave": "Leave Circle",
"leaveConfirmTitle": "Leave Circle",
"leaveConfirmMessage": "Are you sure you want to leave your circle?",
"leaveConfirmButton": "Leave",
"leftCircle": "Left circle successfully",
"leaveFailed": "Failed to leave circle",
"circleMembers": "Circle Members",
"you": "(You)",
"pendingApproval": "Pending Approval",
"joinedOn": "Joined on {{date}}",
"requestedToJoin": "Request to join {{date}}",
"roles": {
"member": "Member",
"memberDescription": "Just a regular member of the circle",
"manager": "Manager",
"managerDescription": "Can impersonate users and perform actions on their behalf",
"admin": "Admin",
"adminDescription": "Full access to the circle"
},
"roleUpdateFailed": "Failed to update role",
"removeMemberTitle": "Remove Member",
"removeMemberMessage": "Are you sure you want to remove {{name}} from your circle?",
"memberRemoved": "Removed member successfully",
"circleMemberRequests": "Circle Member Requests",
"lastUpdated": "Last updated: {{time}}",
"refreshing": "Refreshing...",
"refreshFailed": "Failed to refresh member requests",
"wantsToJoin": "{{name}} wants to join your circle.",
"accept": "Accept",
"acceptRequestTitle": "Accept Member Request",
"acceptRequestMessage": "Are you sure you want to accept {{name}} (username: {{username}}) to join your circle?",
"requestAccepted": "Accepted request successfully",
"or": "or",
"joinOtherDescription": "Want to join someone else's Circle? Ask them for their unique Circle code or join link. Enter the code below to join their Circle.",
"enterCircleCode": "Enter Circle code:",
"enterCodePlaceholder": "Enter code",
"joinCircle": "Join Circle",
"joinedPending": "Joined circle successfully, wait for the circle owner to accept your request.",
"alreadyMember": "You are already a member of this circle",
"joinFailed": "Failed to join circle"
},
"accountSettings": {
"title": "Account Settings",
"description": "Change your account settings, type or update your password",
"accountType": "Account Type : {{type}}",
"free": "Free",
"plus": "Plus",
"plusUntil": "Plus (until {{date}})",
"activeDescription": "You are currently subscribed to the Plus plan. Your subscription will renew on {{date}}.",
"cancelledDescription": "You have cancelled your subscription. Your account will be downgraded to the Free plan on {{date}}.",
"freeDescription": "You are currently on the Free plan. Upgrade to the Plus plan to unlock more features.",
"upgrade": "Upgrade",
"cancel": "Cancel",
"password": "Password :",
"changePassword": "Change Password",
"passwordChanged": "Password changed successfully",
"passwordChangeFailed": "Password change failed",
"dangerZone": "Danger Zone",
"dangerZoneDescription": "Once you delete your account, there is no going back. Please be certain.",
"deleteAccount": "Delete Account",
"accountDeleted": "Account deleted successfully",
"subscriptionCancelled": "Subscription cancelled",
"subscriptionCancelFailed": "Failed to cancel subscription",
"purchase": {
"success": "Purchase successful! Please restart the app to access Plus features.",
"storeConnection": "Store connection issue. Please check your network and try again.",
"notAllowed": "Purchases are not allowed on this device. Please check your device restrictions.",
"unavailable": "This subscription is not available. Please try again later.",
"alreadyProcessed": "This purchase has already been processed. If you believe this is an error, please contact support.",
"receiptMissing": "Purchase receipt missing. Please try purchasing again.",
"networkError": "Network error. Please check your connection and try again.",
"invalidReceipt": "Invalid purchase receipt. Please contact support if this persists.",
"pending": "Payment is pending approval. You will receive access once approved.",
"failed": "Purchase failed: {{error}}. Please try again or contact support.",
"unknownError": "Unknown error"
}
},
"subaccounts": {
"title": "Managed Accounts",
"description": "Manage sub accounts. Sub account users can log in and complete assigned tasks.",
"notParentTitle": "Sub Account Management",
"notParentMessage": "Only primary users can manage sub accounts.",
"freePlanNotice": "Sub account limited to 1 on Free plan. Upgrade to Plus to have up to 5 sub accounts.",
"count": "Sub Accounts ({{count}})",
"add": "Add Sub Account",
"loading": "Loading sub accounts...",
"emptyTitle": "No Sub Accounts",
"emptyDescription": "Create sub accounts so team members can log in and complete their assigned tasks.",
"addFirst": "Add Your First Sub Account",
"username": "Username: {{username}}",
"created": "Created: {{date}}",
"changePassword": "Change Password",
"deleteAccount": "Delete Account",
"createdSuccess": "Child account \"{{name}}\" created successfully!",
"createFailed": "Failed to create child account: {{error}}",
"createFailedGeneric": "Failed to create child user",
"passwordUpdated": "Child password updated successfully",
"passwordUpdateFailed": "Failed to update password: {{error}}",
"passwordUpdateFailedGeneric": "Failed to update password",
"deleteConfirmTitle": "Delete Sub Account",
"deleteConfirmMessage": "Are you sure you want to delete the child account \"{{name}}\"? This action cannot be undone.",
"deleted": "Sub account \"{{name}}\" deleted successfully",
"deleteFailed": "Failed to delete Sub account: {{error}}",
"deleteFailedGeneric": "Failed to delete Sub user",
"howItWorksTitle": "How Managed Accounts Work",
"howItWorks1": "Managed accounts created by the primary user, these specific for user you want to have ability to delete and reset password.",
"howItWorks2": "Sub accounts can log in with their own username and password.",
"howItWorks3": "Managed accounts can complete tasks but have limited administrative permissions",
"howItWorks4": "Managed accounts automatically added to your circle"
},
"notifications": {
"title": "Notification Settings",
"deviceSection": "Device Notification",
"deviceSectionDescription": "Manage your Device Notification",
"deviceLabel": "Device Notification",
"deviceHelper": "Receive notification on your device when a task is due",
"mobileOnly": "This feature is only available on mobile devices",
"testNotification": "Test Notification",
"testNotificationBody": "You have a task due soon",
"dueTitle": "Due Date Notification",
"dueLabel": "Notification when the task is due",
"preDueTitle": "Pre-Due Date Notification",
"preDueLabel": "Notification a few hours before the task is due",
"overdueTitle": "Overdue Notification",
"overdueLabel": "Notification when the task is overdue",
"pushLabel": "Push Notifications",
"pushHelper": "Receive Nudges, Announcements, and Chore Assignments via Push Notifications",
"registeredDevices": "Registered Devices ({{count}}/5)",
"registeredDevicesDescription": "Devices registered to receive push notifications for your account",
"currentDevice": "Current Device: {{platform}} {{model}}",
"currentDeviceNotRegistered": "This device is not registered for push notifications",
"limitReached": "Limit Reached",
"registerDevice": "Register Device",
"unknownDevice": "Unknown Device",
"deviceCreatedAt": "Created At: {{date}}",
"noDevices": "No devices registered for push notifications",
"customSection": "Custom Notification",
"customSectionDescription": "Notification through other platform like Telegram or Pushover",
"customLabel": "Custom Notification",
"customHelper": "Receive notification on other platform",
"targetNone": "None",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "You need to initiate a message to the bot in order for the Telegram notification to work",
"telegramBotHelpAfter": "to start a chat",
"clickHere": "Click here",
"chatId": "Chat ID",
"chatIdPlaceholder": "User ID / Chat ID",
"telegramChatIdHelpBefore": "If you don't know your Chat ID, start chat with userinfobot and it will send you your Chat ID.",
"telegramChatIdHelpAfter": "to start chat with userinfobot",
"userKey": "User key",
"userKeyPlaceholder": "User ID",
"chatIdRequired": "Chat ID is required",
"chatIdInvalid": "Invalid Chat ID",
"userKeyRequired": "User key is required",
"targetUpdated": "Notification target updated",
"targetUpdateFailed": "Error while updating notification target: {{error}}",
"deviceRegistered": "Device registered successfully for push notifications.",
"deviceLimitTitle": "Device Limit Reached",
"deviceLimitMessage": "You have reached the maximum limit of 5 registered devices. Please remove a device before registering this one.",
"registrationFailedTitle": "Registration Failed",
"registrationFailedMessage": "Failed to register device automatically. Please try again.",
"permissionRequiredTitle": "Permission Required",
"permissionRequiredMessage": "Push notification permission is required to register this device.",
"registrationInitiatedTitle": "Registration Initiated",
"registrationInitiatedMessage": "Push notification registration has been initiated. The device will be registered automatically.",
"registerDeviceFailed": "Failed to register device. Please try again.",
"permissionDeniedTitle": "Notification Permission Denied",
"permissionDeniedMessage": "You have denied notification permissions. You can enable them later in your device settings.",
"pushPermissionDeniedTitle": "Push Notification Permission Denied",
"pushPermissionDeniedMessage": "Push notifications have been disabled. You can enable them in your device settings if needed.",
"unregisterFailed": "Failed to unregister device"
},
"mfa": {
"title": "Multi-Factor Authentication",
"description": "Add an extra layer of security to your account with multi-factor authentication (MFA). When enabled, you'll need to provide a verification code from your authenticator app in addition to your password when signing in.",
"twoFactor": "Two-Factor Authentication",
"enabledSubtitle": "Your account is protected with 2FA",
"disabledSubtitle": "Secure your account with an authenticator app",
"enable": "Enable",
"disable": "Disable",
"enabledSuccess": "MFA has been successfully enabled!",
"disabledSuccess": "MFA has been disabled successfully!",
"errors": {
"qrGenerationFailed": "Failed to generate QR code",
"invalidResponse": "Invalid response from server. Missing QR code or secret.",
"notFound": "MFA setup endpoint not found. This feature may not be available yet.",
"unauthorized": "Unauthorized. Please login again.",
"serverError": "Server error. Please try again later.",
"setupFailed": "Failed to setup MFA ({{status}}). Please try again.",
"networkError": "Network error. Please check your connection and try again.",
"invalidCode": "Invalid verification code. Please try again.",
"confirmFailed": "Failed to confirm MFA. Please try again.",
"disableFailed": "Failed to disable MFA. Please try again."
},
"setup": {
"title": "Set up Multi-Factor Authentication",
"addedAccount": "I've added the account",
"back": "Back",
"verifyAndEnable": "Verify & Enable",
"savedBackupCodes": "I've saved my backup codes",
"step1Label": "Step 1:",
"step1": "Scan the QR code below with your authenticator app (Google Authenticator, Authy, etc.)",
"qrAlt": "MFA QR Code",
"qrFailed": "QR code could not be generated. Please try again or use the manual entry key below.",
"manualKey": "Manual entry key:",
"step2Label": "Step 2:",
"step2": "Enter the 6-digit verification code from your authenticator app",
"codePlaceholder": "Enter 6-digit code",
"successTitle": "MFA Successfully Enabled!",
"backupCodesTitle": "Save these backup codes in a safe place",
"backupCodesDescription": "You can use these codes to access your account if you lose your authenticator device. Each code can only be used once."
},
"disableModal": {
"title": "Disable Multi-Factor Authentication",
"warning": "Disabling MFA will make your account less secure. Are you sure you want to continue?",
"prompt": "Enter a verification code from your authenticator app to confirm:",
"confirm": "Disable MFA"
},
"backupCodesModal": {
"title": "New Backup Codes",
"warning": "Your previous backup codes are now invalid. Save these new codes in a safe place. Each code can only be used once."
}
},
"apiTokens": {
"title": "API Tokens",
"accessToken": "Access Token",
"description": "Create token to use with the API to update things that trigger task or chores",
"plusNotice": "API tokens are not available in the Basic plan. Upgrade to Plus to generate API tokens for integrating with external systems and automating your tasks.",
"showToken": "Show Token",
"hideToken": "Hide Token",
"removeTitle": "Remove Token",
"removeMessage": "Are you sure you want to remove {{name}}?",
"removedTitle": "Removed",
"removedMessage": "API token has been removed",
"tokenCopied": "Token copied to clipboard",
"generateNew": "Generate New Token",
"nameModalTitle": "Give a name for your new token, something to remember it by.",
"generateToken": "Generate Token"
},
"storage": {
"title": "Storage Settings",
"serverTitle": "Server Storage Usage",
"serverDescription": "This is the storage used by your account on our servers (e.g. files, images, and data you have uploaded).",
"usagePlaceholder": "-- MB used / -- MB total (--)",
"usage": "{{used}} MB used / {{total}} MB total ({{percent}}%)",
"basicPlanNotice": "Server storage is not available in the Basic plan. Upgrade to Plus to track your server storage usage.",
"localTitleApp": "App Local Storage & Cache",
"localTitleBrowser": "Browser Local Storage & Cache",
"localDescription": "This is data stored locally in your browser for faster access. Clearing this will not affect your server data, but may log you out.",
"clearLocal": "Clear All Local Storage and Cache",
"clearLocalTitle": "Clear All Local Storage",
"clearLocalMessage": "Are you sure you want to clear your local storage and cache? This will remove all your data from this browser and require login.",
"clearAll": "Clear All",
"appPreferences": "App Preferences",
"deviceOnly": "Device Only",
"appPreferencesDescription": "These are preferences and settings stored locally on your device by the app. Clearing them will reset app-specific settings and may log you out, but will not affect your server data.",
"clearPreferences": "Clear App Preferences",
"clearPreferencesTitle": "Clear App Preferences",
"clearPreferencesMessage": "Are you sure you want to clear all app preferences? This will reset your app settings and may require you to log in again."
},
"sidepanel": {
"title": "Sidepanel Customization",
"heading": "Sidepanel Settings",
"description": "Customize which cards appear in the sidepanel and their order. Drag and drop to reorder, or toggle visibility for each card.",
"resetToDefaults": "Reset to Defaults",
"resetHelper": "This will restore all cards to their default visibility and order.",
"cards": {
"welcome": {
"name": "User Switcher",
"description": "Allows admins/managers to view tasks as different users"
},
"smartInsights": {
"name": "Smart Insights",
"description": "Quick actions based on your tasks"
},
"assignees": {
"name": "Tasks by Assignee",
"description": "Groups tasks by who they are assigned to"
},
"calendar": {
"name": "Calendar View",
"description": "Shows tasks in a calendar format"
},
"activities": {
"name": "Recent Activities",
"description": "Shows recent task completions and activities"
},
"weeklyGoals": {
"name": "Weekly Goals",
"description": "Shows weekly progress and family completion stats"
}
}
},
"theme": {
"title": "Theme Preferences",
"description": "Choose how the site looks to you. Select a single theme, or sync with your system and automatically switch between day and night themes.",
"themeMode": "Theme mode",
"light": "Light",
"dark": "Dark",
"system": "System"
},
"localization": {
"title": "Localization",
"description": "Customize language, date format, and regional preferences for your account.",
"language": "Language",
"languageDescription": "Select your preferred language",
"rtlNotice": "This language uses right-to-left (RTL) text direction",
"dateFormat": "Date Format",
"dateFormatDescription": "Choose how dates should be displayed throughout the application",
"timeFormat": "Time Format",
"timeFormatDescription": "Select 12-hour or 24-hour time format",
"preview": "Preview: {{value}}",
"12hour": "12-hour (AM/PM)",
"24hour": "24-hour",
"firstDayOfWeek": "First Day of Week",
"firstDayOfWeekDescription": "Select which day starts your week",
"sunday": "Sunday",
"monday": "Monday",
"saturday": "Saturday",
"formats": {
"mdy": "MM/DD/YYYY (US)",
"dmy": "DD/MM/YYYY (Europe)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "Long format (e.g., January 1, 2024)",
"short": "Short format (e.g., Jan 1, 2024)"
}
},
"advanced": {
"title": "Advanced Settings",
"description": "Configure advanced features like webhooks and real-time updates for enhanced productivity.",
"offlineTitle": "Offline Support",
"offlineDescription": "Keep using Donetick when you're offline on this device/browser. Your changes are saved locally and synced when you're back online.",
"offlineToggle": "Enable Offline Support",
"offlineHelper": "Turning this off removes unsynced offline changes and saved offline data from this device/browser.",
"offlineEnabled": "Offline mode turned on for this device/browser",
"offlineDisabled": "Offline mode turned off and local data was cleared",
"offlineDisabledPartial": "Offline mode was turned off, but some local data may still be stored",
"offlineDisableTitle": "Turn Off Offline Mode",
"offlineDisableMessage": "Turning off offline mode will remove unsynced offline changes and saved offline data on this device/browser. Do you want to continue?",
"offlineDisableConfirm": "Turn Off & Clear Data",
"webhookTitle": "Webhook Integration",
"webhookDescription": "Webhooks allow you to send real-time notifications to other services when events happen in your Circle. Configure a webhook URL to receive real-time updates.",
"webhookPlusNotice": "Webhook notifications are not available in the Basic plan. Upgrade to Plus to receive real-time updates via webhooks.",
"webhookToggle": "Enable Webhook",
"webhookHelper": "Enable webhook notifications for tasks and things updates.",
"webhookURL": "Webhook URL",
"webhookUpdated": "Webhook URL updated successfully",
"webhookUpdateFailed": "Failed to update webhook URL",
"realtimeTitle": "Real-time Updates",
"realtimeDescription": "Configure how you receive live updates when tasks and activities change in your circle.",
"realtime": {
"toggleLabel": "Enable Real-time Updates",
"title": "Real-time Updates",
"subtitle": "Get instant notifications when tasks are updated",
"statusLabel": "Status:",
"basicPlan": "Real-time updates are not available in the Basic plan. Upgrade to Plus to receive instant notifications when tasks are updated.",
"disabled": "Real-time updates are disabled. Enable them to see live changes when you or other circle members complete, skip, or modify tasks.",
"connected": "Real-time updates are working. You'll see live changes when you or other circle members complete, skip, or modify tasks.",
"connecting": "Connecting to real-time updates...",
"errored": "Real-time updates are enabled but not working: {{error}}",
"notConnected": "Real-time updates are enabled but not currently connected.",
"basicPlanNotice": "Real-time updates are not available in the Basic plan. Upgrade to Plus to receive instant notifications when you or other circle members complete, skip, or modify tasks."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Cerrar Sesión",
"version": "Versión",
"navigation": {
"search": "Buscar",
"allTasks": "Todas las Tareas",
"archived": "Archivadas",
"things": "Cosas",
@@ -29,5 +30,43 @@
"activities": "Actividades",
"points": "Puntos",
"settings": "Configuración"
},
"search": {
"title": "Buscar",
"placeholder": "Buscar en Donetick",
"inputAriaLabel": "Buscar tareas, historial, proyectos, etiquetas y configuración",
"deviceNote": "Se busca en el contenido disponible en este dispositivo",
"escape": "Esc",
"recent": "Recientes",
"empty": {
"title": "Sin coincidencias directas",
"subtitle": "Aún puedes filtrar la lista de tareas con esta búsqueda."
},
"groups": {
"tasks": "Tareas",
"history": "Notas",
"projects": "Proyectos",
"labels": "Etiquetas",
"people": "Personas",
"settings": "Configuración",
"actions": "Acciones rápidas"
},
"actions": {
"quickAction": "Acción rápida",
"navigation": "Navegación",
"createTask": "Crear una tarea",
"viewAllTasks": "Ver todas las tareas",
"viewArchivedTasks": "Ver tareas archivadas",
"openSettings": "Abrir configuración",
"filterTasks": "Mostrar tareas que coincidan con «{{query}}»",
"filterTasksSubtitle": "Filtrar la lista de tareas"
},
"footer": {
"navigate": "Navegar",
"open": "Abrir",
"results_one": "{{count}} resultado",
"results_other": "{{count}} resultados",
"typeToSearch": "Escribe para buscar"
}
}
}

View File

@@ -1,174 +1,494 @@
{
"title": "Configuración",
"circleSettings": {
"title": "Configuración del círculo",
"description": "Tu cuenta se conecta automáticamente a un Círculo cuando creas o te unes a uno. Invita fácilmente a amigos compartiendo el código único del Círculo o el enlace a continuación.",
"circleCode": "Código del Círculo",
"copyCode": "Copiar Código",
"copyLink": "Copiar Enlace",
"codeCopied": "¡Código del círculo copiado!",
"linkCopied": "¡Enlace copiado!",
"joinCircle": "Unirse a un Círculo",
"joinCirclePlaceholder": "Ingresa el Código del Círculo",
"join": "Unirse",
"leave": "Salir del Círculo",
"leaveConfirmTitle": "Salir del Círculo",
"leaveConfirmMessage": "¿Estás seguro de que quieres salir de este círculo?",
"circleMembers": "Miembros del Círculo",
"circleMemberRequests": "Solicitudes de Miembros del Círculo",
"admin": "Administrador",
"member": "Miembro",
"pending": "Pendiente",
"accept": "Aceptar",
"reject": "Rechazar",
"makeAdmin": "Hacer Administrador",
"makeMember": "Hacer Miembro",
"remove": "Eliminar",
"webhookURL": "URL del Webhook",
"webhookDescription": "Ingresa una URL de webhook para recibir notificaciones de eventos del círculo",
"webhookPlaceholder": "https://tu-url-webhook.com"
},
"accountSettings": {
"title": "Configuración de la Cuenta",
"subscription": "Suscripción",
"subscriptionStatus": "Plan Actual",
"free": "Gratis",
"plus": "Plus",
"upgrade": "Actualizar",
"cancel": "Cancelar",
"changePassword": "Cambiar Contraseña",
"password": "Contraseña",
"dangerZone": "Zona de Peligro",
"dangerZoneDescription": "Una vez que elimines tu cuenta, no hay vuelta atrás. Por favor, está seguro.",
"deleteAccount": "Eliminar Cuenta"
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, formato de fecha y preferencias regionales para tu cuenta.",
"language": "Idioma",
"languageDescription": "Selecciona tu idioma preferido",
"dateFormat": "Formato de Fecha",
"dateFormatDescription": "Elige cómo se deben mostrar las fechas en toda la aplicación",
"timeFormat": "Formato de Hora",
"timeFormatDescription": "Selecciona formato de 12 o 24 horas",
"12hour": "12 horas (AM/PM)",
"24hour": "24 horas",
"firstDayOfWeek": "Primer Día de la Semana",
"firstDayOfWeekDescription": "Selecciona qué día comienza tu semana",
"sunday": "Domingo",
"monday": "Lunes",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EE.UU.)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato largo (ej., 1 de enero de 2024)",
"short": "Formato corto (ej., 1 ene 2024)"
}
},
"sidepanel": {
"title": "Personalización del Panel Lateral",
"description": "Personaliza el diseño y la visibilidad de las tarjetas en el panel lateral. Esta sección solo está disponible en dispositivos de pantalla grande como tabletas y computadoras de escritorio."
},
"theme": {
"title": "Preferencias de tema",
"description": "Elige cómo se ve el sitio para ti. Selecciona un solo tema o sincronízalo con tu sistema y cambia automáticamente entre temas de día y noche.",
"themeMode": "Modo de tema",
"light": "Claro",
"dark": "Oscuro",
"system": "Sistema"
},
"notifications": {
"settingsSaved": "Configuración guardada con éxito",
"settingsSaveFailed": "Error al guardar la configuración",
"invalidWebhook": "URL de webhook no válida"
},
"profile": {
"title": "Configuración del Perfil",
"description": "Actualiza tu nombre para mostrar y foto de perfil.",
"photoUpdated": "Foto Actualizada",
"photoUpdatedMessage": "¡Tu foto de perfil ha sido actualizada con éxito!",
"uploadFailed": "Error al Subir",
"uploadFailedMessage": "Error al subir tu foto. Por favor, inténtalo de nuevo.",
"profileUpdated": "Perfil Actualizado",
"profileUpdatedMessage": "¡Tu información de perfil ha sido guardada con éxito!",
"updateFailed": "Error al Actualizar",
"updateFailedMessage": "No se pudo actualizar tu perfil. Por favor, verifica tu conexión e inténtalo de nuevo.",
"changePhoto": "Cambiar Foto",
"displayName": "Nombre para Mostrar",
"displayNamePlaceholder": "Ingresa tu nombre para mostrar",
"timezone": "Zona Horaria",
"timezonePlaceholder": "Selecciona tu zona horaria",
"title": "Ajustes",
"common": {
"save": "Guardar",
"cancel": "Cancelar"
"cancel": "Cancelar",
"confirm": "Confirmar",
"remove": "Eliminar",
"delete": "Borrar",
"refresh": "Actualizar",
"loading": "Cargando…",
"on": "Sí",
"off": "No",
"error": "Error",
"success": "Listo",
"plusFeature": "Función Plus",
"earlyAccess": "Acceso anticipado"
},
"overview": {
"title": "Configuración",
"subtitle": "Personaliza tu experiencia y administra las preferencias de tu cuenta",
"title": "Ajustes",
"subtitle": "Personaliza tu experiencia y gestiona las preferencias de tu cuenta",
"upgrade": {
"title": "Actualizar a Plus",
"description": "Desbloquea funciones potentes para mejorar tu productividad",
"button": "Actualizar Ahora",
"title": "Mejora a Plus",
"description": "Desbloquea funciones potentes para aumentar tu productividad",
"button": "Mejorar ahora",
"features": {
"richText": "Descripciones en texto enriquecido",
"richText": "Descripciones con texto enriquecido",
"notifications": "Notificaciones de tareas",
"apiIntegrations": "Integraciones API",
"apiIntegrations": "Integraciones con API",
"advancedAutomation": "Automatización avanzada"
}
},
"sections": {
"profile": {
"title": "Configuración del Perfil",
"description": "Actualiza tu información de perfil, foto, nombre para mostrar y preferencias de zona horaria."
"title": "Ajustes de perfil",
"description": "Actualiza tu información de perfil, foto, nombre visible y zona horaria."
},
"circle": {
"title": "Configuración del Círculo",
"description": "Administra tu círculo, invita miembros y gestiona solicitudes de unión."
"title": "Ajustes del círculo",
"description": "Gestiona tu círculo, invita miembros y atiende las solicitudes de acceso."
},
"account": {
"title": "Configuración de la Cuenta",
"description": "Administra tu suscripción, cambia la contraseña y opciones de eliminación de cuenta."
"title": "Ajustes de cuenta",
"description": "Gestiona tu suscripción, cambia la contraseña y elimina tu cuenta."
},
"subaccounts": {
"title": "Cuentas Administradas",
"description": "Crea y administra subcuentas para iniciar sesión y completar tareas asignadas."
"title": "Cuentas gestionadas",
"description": "Crea y gestiona subcuentas para que puedan iniciar sesión y completar las tareas asignadas."
},
"notifications": {
"title": "Notificaciones",
"description": "Configura notificaciones push, alertas por correo electrónico y destinos de notificación para tareas."
"description": "Configura notificaciones push, avisos por correo y destinos de notificación para las tareas."
},
"mfa": {
"title": "Autenticación Multifactor",
"description": "Agrega una capa adicional de seguridad con MFA usando aplicaciones de autenticación."
"title": "Autenticación multifactor",
"description": "Añade una capa extra de seguridad con MFA usando apps de autenticación."
},
"apitokens": {
"title": "Tokens API",
"description": "Genera y administra tokens de acceso para integraciones de terceros y acceso a la API."
"title": "Tokens de API",
"description": "Genera y gestiona tokens de acceso para integraciones de terceros y acceso a la API."
},
"storage": {
"title": "Configuración de Almacenamiento",
"description": "Respalda y restaura tus datos, administra el almacenamiento local y las preferencias de sincronización."
"title": "Ajustes de almacenamiento",
"description": "Haz copias de seguridad y restaura tus datos, gestiona el almacenamiento local y la sincronización."
},
"sidepanel": {
"title": "Personalización del Panel Lateral",
"description": "Personaliza el diseño y la visibilidad de las tarjetas en la interfaz del panel lateral."
"title": "Personalización del panel lateral",
"description": "Personaliza la disposición y la visibilidad de las tarjetas del panel lateral."
},
"theme": {
"title": "Preferencias de Tema",
"description": "Elige tu tema preferido y configura los ajustes de modo oscuro/claro."
"title": "Preferencias de tema",
"description": "Elige tu tema preferido y configura el modo claro/oscuro."
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, formato de fecha, formato de hora y preferencias regionales."
"description": "Personaliza el idioma, el formato de fecha y hora y las preferencias regionales."
},
"advanced": {
"title": "Configuración Avanzada",
"description": "Configura webhooks, actualizaciones en tiempo real y otras funciones avanzadas para mejorar la productividad."
"title": "Ajustes avanzados",
"description": "Configura webhooks, actualizaciones en tiempo real y otras funciones avanzadas."
},
"developer": {
"title": "Configuración de Desarrollador",
"description": "Ver información técnica sobre tokens de autenticación, conexiones SSE y datos de depuración."
"title": "Ajustes de desarrollador",
"description": "Consulta información técnica sobre tokens de autenticación, conexiones SSE y datos de depuración."
},
"feedback": {
"title": "Enviar comentarios",
"description": "Cuéntanos qué tal te funciona Donetick o pide una función."
},
"bugReport": {
"title": "Informar de un error",
"description": "¿Algo no funciona bien? Envíanos los detalles junto con una instantánea técnica."
}
}
},
"profile": {
"title": "Ajustes de perfil",
"description": "Actualiza tu nombre visible y tu foto de perfil.",
"photoUpdated": "Foto actualizada",
"photoUpdatedMessage": "¡Tu foto de perfil se ha actualizado correctamente!",
"uploadFailed": "Error al subir",
"uploadFailedMessage": "No se pudo subir tu foto. Inténtalo de nuevo.",
"profileUpdated": "Perfil actualizado",
"profileUpdatedMessage": "¡La información de tu perfil se ha guardado correctamente!",
"updateFailed": "Error al actualizar",
"updateFailedMessage": "No se pudo actualizar tu perfil. Comprueba tu conexión e inténtalo de nuevo.",
"changePhoto": "Cambiar foto",
"editPhoto": "Editar foto de perfil",
"displayName": "Nombre visible",
"displayNamePlaceholder": "Escribe tu nombre visible",
"timezone": "Zona horaria",
"timezonePlaceholder": "Selecciona tu zona horaria",
"save": "Guardar",
"cancel": "Cancelar"
},
"circleSettings": {
"title": "Ajustes del círculo",
"description": "Tu cuenta se conecta automáticamente a un círculo cuando creas uno o te unes. Invita a tus amigos compartiendo el código o el enlace del círculo que aparece abajo. Recibirás un aviso aquí cuando alguien pida unirse a tu círculo.",
"memberOf": "Formas parte de {{name}}",
"yourCircleCode": "Tu código de círculo es:",
"copyCode": "Copiar código",
"shareInvite": "Compartir invitación",
"codeCopied": "Código copiado al portapapeles",
"linkCopied": "Enlace de invitación copiado al portapapeles",
"myCircle": "mi círculo",
"shareTitle": "Únete a {{name}} en Donetick",
"shareText": "Me gustaría invitarte a unirte a {{name}} en Donetick.",
"shareDialogTitle": "Compartir invitación al círculo",
"leave": "Salir del círculo",
"leaveConfirmTitle": "Salir del círculo",
"leaveConfirmMessage": "¿Seguro que quieres salir de tu círculo?",
"leaveConfirmButton": "Salir",
"leftCircle": "Has salido del círculo correctamente",
"leaveFailed": "No se pudo salir del círculo",
"circleMembers": "Miembros del círculo",
"you": "(Tú)",
"pendingApproval": "Pendiente de aprobación",
"joinedOn": "Se unió el {{date}}",
"requestedToJoin": "Solicitud de acceso {{date}}",
"roles": {
"member": "Miembro",
"memberDescription": "Un miembro normal del círculo",
"manager": "Gestor",
"managerDescription": "Puede suplantar a otras personas y actuar en su nombre",
"admin": "Administrador",
"adminDescription": "Acceso total al círculo"
},
"roleUpdateFailed": "No se pudo actualizar el rol",
"removeMemberTitle": "Eliminar miembro",
"removeMemberMessage": "¿Seguro que quieres eliminar a {{name}} de tu círculo?",
"memberRemoved": "Miembro eliminado correctamente",
"circleMemberRequests": "Solicitudes de acceso al círculo",
"lastUpdated": "Última actualización: {{time}}",
"refreshing": "Actualizando…",
"refreshFailed": "No se pudieron actualizar las solicitudes de acceso",
"wantsToJoin": "{{name}} quiere unirse a tu círculo.",
"accept": "Aceptar",
"acceptRequestTitle": "Aceptar solicitud de acceso",
"acceptRequestMessage": "¿Seguro que quieres aceptar a {{name}} (usuario: {{username}}) en tu círculo?",
"requestAccepted": "Solicitud aceptada correctamente",
"or": "o",
"joinOtherDescription": "¿Quieres unirte al círculo de otra persona? Pídele su código de círculo o su enlace de invitación. Escribe el código abajo para unirte.",
"enterCircleCode": "Introduce el código del círculo:",
"enterCodePlaceholder": "Introduce el código",
"joinCircle": "Unirse al círculo",
"joinedPending": "Te has unido al círculo correctamente; espera a que la persona propietaria acepte tu solicitud.",
"alreadyMember": "Ya eres miembro de este círculo",
"joinFailed": "No se pudo unir al círculo"
},
"accountSettings": {
"title": "Ajustes de cuenta",
"description": "Cambia los ajustes de tu cuenta, el tipo de plan o tu contraseña",
"accountType": "Tipo de cuenta: {{type}}",
"free": "Gratis",
"plus": "Plus",
"plusUntil": "Plus (hasta el {{date}})",
"activeDescription": "Actualmente tienes el plan Plus. Tu suscripción se renovará el {{date}}.",
"cancelledDescription": "Has cancelado tu suscripción. Tu cuenta pasará al plan Gratis el {{date}}.",
"freeDescription": "Actualmente tienes el plan Gratis. Mejora a Plus para desbloquear más funciones.",
"upgrade": "Mejorar",
"cancel": "Cancelar",
"password": "Contraseña:",
"changePassword": "Cambiar contraseña",
"passwordChanged": "Contraseña cambiada correctamente",
"passwordChangeFailed": "No se pudo cambiar la contraseña",
"dangerZone": "Zona de peligro",
"dangerZoneDescription": "Una vez que elimines tu cuenta, no hay vuelta atrás. Asegúrate antes de continuar.",
"deleteAccount": "Eliminar cuenta",
"accountDeleted": "Cuenta eliminada correctamente",
"subscriptionCancelled": "Suscripción cancelada",
"subscriptionCancelFailed": "No se pudo cancelar la suscripción",
"purchase": {
"success": "¡Compra realizada! Reinicia la app para acceder a las funciones Plus.",
"storeConnection": "Problema de conexión con la tienda. Comprueba tu red e inténtalo de nuevo.",
"notAllowed": "Las compras no están permitidas en este dispositivo. Revisa las restricciones de tu dispositivo.",
"unavailable": "Esta suscripción no está disponible. Inténtalo más tarde.",
"alreadyProcessed": "Esta compra ya se ha procesado. Si crees que es un error, ponte en contacto con el soporte.",
"receiptMissing": "Falta el recibo de compra. Intenta comprar de nuevo.",
"networkError": "Error de red. Comprueba tu conexión e inténtalo de nuevo.",
"invalidReceipt": "Recibo de compra no válido. Ponte en contacto con el soporte si el problema persiste.",
"pending": "El pago está pendiente de aprobación. Tendrás acceso en cuanto se apruebe.",
"failed": "La compra ha fallado: {{error}}. Inténtalo de nuevo o contacta con el soporte.",
"unknownError": "Error desconocido"
}
},
"subaccounts": {
"title": "Cuentas gestionadas",
"description": "Gestiona las subcuentas. Sus usuarios pueden iniciar sesión y completar las tareas asignadas.",
"notParentTitle": "Gestión de subcuentas",
"notParentMessage": "Solo las cuentas principales pueden gestionar subcuentas.",
"freePlanNotice": "El plan Gratis permite 1 subcuenta. Mejora a Plus para tener hasta 5 subcuentas.",
"count": "Subcuentas ({{count}})",
"add": "Añadir subcuenta",
"loading": "Cargando subcuentas…",
"emptyTitle": "No hay subcuentas",
"emptyDescription": "Crea subcuentas para que los miembros del equipo puedan iniciar sesión y completar sus tareas.",
"addFirst": "Añade tu primera subcuenta",
"username": "Usuario: {{username}}",
"created": "Creada: {{date}}",
"changePassword": "Cambiar contraseña",
"deleteAccount": "Eliminar cuenta",
"createdSuccess": "¡La subcuenta «{{name}}» se ha creado correctamente!",
"createFailed": "No se pudo crear la subcuenta: {{error}}",
"createFailedGeneric": "No se pudo crear la subcuenta",
"passwordUpdated": "Contraseña de la subcuenta actualizada correctamente",
"passwordUpdateFailed": "No se pudo actualizar la contraseña: {{error}}",
"passwordUpdateFailedGeneric": "No se pudo actualizar la contraseña",
"deleteConfirmTitle": "Eliminar subcuenta",
"deleteConfirmMessage": "¿Seguro que quieres eliminar la subcuenta «{{name}}»? Esta acción no se puede deshacer.",
"deleted": "Subcuenta «{{name}}» eliminada correctamente",
"deleteFailed": "No se pudo eliminar la subcuenta: {{error}}",
"deleteFailedGeneric": "No se pudo eliminar la subcuenta",
"howItWorksTitle": "Cómo funcionan las cuentas gestionadas",
"howItWorks1": "Las cuentas gestionadas las crea la cuenta principal; son para personas cuya cuenta quieres poder eliminar y cuya contraseña quieres poder restablecer.",
"howItWorks2": "Las subcuentas pueden iniciar sesión con su propio usuario y contraseña.",
"howItWorks3": "Las cuentas gestionadas pueden completar tareas, pero tienen permisos administrativos limitados",
"howItWorks4": "Las cuentas gestionadas se añaden automáticamente a tu círculo"
},
"notifications": {
"title": "Ajustes de notificaciones",
"deviceSection": "Notificaciones del dispositivo",
"deviceSectionDescription": "Gestiona las notificaciones de tu dispositivo",
"deviceLabel": "Notificación del dispositivo",
"deviceHelper": "Recibe una notificación en tu dispositivo cuando venza una tarea",
"mobileOnly": "Esta función solo está disponible en dispositivos móviles",
"testNotification": "Notificación de prueba",
"testNotificationBody": "Tienes una tarea que vence pronto",
"dueTitle": "Notificación de vencimiento",
"dueLabel": "Notificación cuando la tarea vence",
"preDueTitle": "Notificación previa al vencimiento",
"preDueLabel": "Notificación unas horas antes de que venza la tarea",
"overdueTitle": "Notificación de retraso",
"overdueLabel": "Notificación cuando la tarea está vencida",
"pushLabel": "Notificaciones push",
"pushHelper": "Recibe recordatorios, anuncios y asignaciones de tareas por notificación push",
"registeredDevices": "Dispositivos registrados ({{count}}/5)",
"registeredDevicesDescription": "Dispositivos registrados para recibir notificaciones push de tu cuenta",
"currentDevice": "Dispositivo actual: {{platform}} {{model}}",
"currentDeviceNotRegistered": "Este dispositivo no está registrado para notificaciones push",
"limitReached": "Límite alcanzado",
"registerDevice": "Registrar dispositivo",
"unknownDevice": "Dispositivo desconocido",
"deviceCreatedAt": "Creado el: {{date}}",
"noDevices": "No hay dispositivos registrados para notificaciones push",
"customSection": "Notificación personalizada",
"customSectionDescription": "Notificaciones a través de otras plataformas como Telegram o Pushover",
"customLabel": "Notificación personalizada",
"customHelper": "Recibe notificaciones en otra plataforma",
"targetNone": "Ninguna",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Debes escribir primero al bot para que funcionen las notificaciones de Telegram",
"telegramBotHelpAfter": "para iniciar un chat",
"clickHere": "Haz clic aquí",
"chatId": "ID de chat",
"chatIdPlaceholder": "ID de usuario / ID de chat",
"telegramChatIdHelpBefore": "Si no conoces tu ID de chat, inicia un chat con userinfobot y te lo enviará.",
"telegramChatIdHelpAfter": "para iniciar un chat con userinfobot",
"userKey": "Clave de usuario",
"userKeyPlaceholder": "ID de usuario",
"chatIdRequired": "El ID de chat es obligatorio",
"chatIdInvalid": "ID de chat no válido",
"userKeyRequired": "La clave de usuario es obligatoria",
"targetUpdated": "Destino de notificación actualizado",
"targetUpdateFailed": "Error al actualizar el destino de notificación: {{error}}",
"deviceRegistered": "Dispositivo registrado correctamente para notificaciones push.",
"deviceLimitTitle": "Límite de dispositivos alcanzado",
"deviceLimitMessage": "Has alcanzado el máximo de 5 dispositivos registrados. Elimina uno antes de registrar este.",
"registrationFailedTitle": "Error de registro",
"registrationFailedMessage": "No se pudo registrar el dispositivo automáticamente. Inténtalo de nuevo.",
"permissionRequiredTitle": "Permiso necesario",
"permissionRequiredMessage": "Se necesita permiso de notificaciones push para registrar este dispositivo.",
"registrationInitiatedTitle": "Registro iniciado",
"registrationInitiatedMessage": "Se ha iniciado el registro de notificaciones push. El dispositivo se registrará automáticamente.",
"registerDeviceFailed": "No se pudo registrar el dispositivo. Inténtalo de nuevo.",
"permissionDeniedTitle": "Permiso de notificaciones denegado",
"permissionDeniedMessage": "Has denegado los permisos de notificación. Puedes activarlos más tarde en los ajustes de tu dispositivo.",
"pushPermissionDeniedTitle": "Permiso de notificaciones push denegado",
"pushPermissionDeniedMessage": "Se han desactivado las notificaciones push. Puedes activarlas en los ajustes de tu dispositivo si lo necesitas.",
"unregisterFailed": "No se pudo dar de baja el dispositivo"
},
"mfa": {
"title": "Autenticación multifactor",
"description": "Añade una capa extra de seguridad a tu cuenta con la autenticación multifactor (MFA). Cuando está activada, al iniciar sesión tendrás que introducir un código de verificación de tu app de autenticación además de tu contraseña.",
"twoFactor": "Autenticación en dos pasos",
"enabledSubtitle": "Tu cuenta está protegida con 2FA",
"disabledSubtitle": "Protege tu cuenta con una app de autenticación",
"enable": "Activar",
"disable": "Desactivar",
"enabledSuccess": "¡La MFA se ha activado correctamente!",
"disabledSuccess": "¡La MFA se ha desactivado correctamente!",
"errors": {
"qrGenerationFailed": "No se pudo generar el código QR",
"invalidResponse": "Respuesta del servidor no válida. Falta el código QR o la clave.",
"notFound": "No se encontró el endpoint de configuración de MFA. Puede que esta función aún no esté disponible.",
"unauthorized": "No autorizado. Inicia sesión de nuevo.",
"serverError": "Error del servidor. Inténtalo más tarde.",
"setupFailed": "No se pudo configurar la MFA ({{status}}). Inténtalo de nuevo.",
"networkError": "Error de red. Comprueba tu conexión e inténtalo de nuevo.",
"invalidCode": "Código de verificación no válido. Inténtalo de nuevo.",
"confirmFailed": "No se pudo confirmar la MFA. Inténtalo de nuevo.",
"disableFailed": "No se pudo desactivar la MFA. Inténtalo de nuevo."
},
"setup": {
"title": "Configurar la autenticación multifactor",
"addedAccount": "Ya he añadido la cuenta",
"back": "Atrás",
"verifyAndEnable": "Verificar y activar",
"savedBackupCodes": "He guardado mis códigos de respaldo",
"step1Label": "Paso 1:",
"step1": "Escanea el código QR de abajo con tu app de autenticación (Google Authenticator, Authy, etc.)",
"qrAlt": "Código QR de MFA",
"qrFailed": "No se pudo generar el código QR. Inténtalo de nuevo o usa la clave manual de abajo.",
"manualKey": "Clave de introducción manual:",
"step2Label": "Paso 2:",
"step2": "Introduce el código de verificación de 6 dígitos de tu app de autenticación",
"codePlaceholder": "Introduce el código de 6 dígitos",
"successTitle": "¡MFA activada correctamente!",
"backupCodesTitle": "Guarda estos códigos de respaldo en un lugar seguro",
"backupCodesDescription": "Puedes usar estos códigos para acceder a tu cuenta si pierdes tu dispositivo de autenticación. Cada código solo se puede usar una vez."
},
"disableModal": {
"title": "Desactivar la autenticación multifactor",
"warning": "Desactivar la MFA hará que tu cuenta sea menos segura. ¿Seguro que quieres continuar?",
"prompt": "Introduce un código de verificación de tu app de autenticación para confirmar:",
"confirm": "Desactivar MFA"
},
"backupCodesModal": {
"title": "Nuevos códigos de respaldo",
"warning": "Tus códigos de respaldo anteriores ya no son válidos. Guarda estos nuevos códigos en un lugar seguro. Cada código solo se puede usar una vez."
}
},
"apiTokens": {
"title": "Tokens de API",
"accessToken": "Token de acceso",
"description": "Crea un token para usar con la API y actualizar cosas que activan tareas",
"plusNotice": "Los tokens de API no están disponibles en el plan Básico. Mejora a Plus para generar tokens de API e integrarte con sistemas externos y automatizar tus tareas.",
"showToken": "Mostrar token",
"hideToken": "Ocultar token",
"removeTitle": "Eliminar token",
"removeMessage": "¿Seguro que quieres eliminar {{name}}?",
"removedTitle": "Eliminado",
"removedMessage": "El token de API se ha eliminado",
"tokenCopied": "Token copiado al portapapeles",
"generateNew": "Generar nuevo token",
"nameModalTitle": "Dale un nombre a tu nuevo token, algo con lo que lo reconozcas.",
"generateToken": "Generar token"
},
"storage": {
"title": "Ajustes de almacenamiento",
"serverTitle": "Uso del almacenamiento en el servidor",
"serverDescription": "Este es el almacenamiento que usa tu cuenta en nuestros servidores (por ejemplo, archivos, imágenes y datos que has subido).",
"usagePlaceholder": "-- MB usados / -- MB en total (--)",
"usage": "{{used}} MB usados / {{total}} MB en total ({{percent}} %)",
"basicPlanNotice": "El almacenamiento en el servidor no está disponible en el plan Básico. Mejora a Plus para consultar tu uso.",
"localTitleApp": "Almacenamiento local y caché de la app",
"localTitleBrowser": "Almacenamiento local y caché del navegador",
"localDescription": "Son datos guardados localmente en tu navegador para un acceso más rápido. Borrarlos no afectará a tus datos del servidor, pero puede cerrar tu sesión.",
"clearLocal": "Borrar todo el almacenamiento local y la caché",
"clearLocalTitle": "Borrar todo el almacenamiento local",
"clearLocalMessage": "¿Seguro que quieres borrar tu almacenamiento local y la caché? Se eliminarán todos tus datos de este navegador y tendrás que iniciar sesión de nuevo.",
"clearAll": "Borrar todo",
"appPreferences": "Preferencias de la app",
"deviceOnly": "Solo en el dispositivo",
"appPreferencesDescription": "Son preferencias y ajustes que la app guarda localmente en tu dispositivo. Al borrarlos se restablecerán los ajustes de la app y puede que se cierre tu sesión, pero no afectará a tus datos del servidor.",
"clearPreferences": "Borrar preferencias de la app",
"clearPreferencesTitle": "Borrar preferencias de la app",
"clearPreferencesMessage": "¿Seguro que quieres borrar todas las preferencias de la app? Se restablecerán tus ajustes y puede que tengas que iniciar sesión de nuevo."
},
"sidepanel": {
"title": "Personalización del panel lateral",
"heading": "Ajustes del panel lateral",
"description": "Elige qué tarjetas aparecen en el panel lateral y en qué orden. Arrastra y suelta para reordenarlas o cambia su visibilidad.",
"resetToDefaults": "Restablecer valores predeterminados",
"resetHelper": "Se restablecerán la visibilidad y el orden predeterminados de todas las tarjetas.",
"cards": {
"welcome": {
"name": "Cambio de usuario",
"description": "Permite a administradores y gestores ver las tareas como otras personas"
},
"smartInsights": {
"name": "Ideas inteligentes",
"description": "Acciones rápidas basadas en tus tareas"
},
"assignees": {
"name": "Tareas por responsable",
"description": "Agrupa las tareas según a quién estén asignadas"
},
"calendar": {
"name": "Vista de calendario",
"description": "Muestra las tareas en formato de calendario"
},
"activities": {
"name": "Actividad reciente",
"description": "Muestra las tareas completadas y la actividad reciente"
},
"weeklyGoals": {
"name": "Objetivos semanales",
"description": "Muestra el progreso semanal y las estadísticas de la familia"
}
}
},
"theme": {
"title": "Preferencias de tema",
"description": "Elige cómo se ve la aplicación. Selecciona un tema fijo o sincronízalo con tu sistema para cambiar automáticamente entre el modo claro y oscuro.",
"themeMode": "Modo de tema",
"light": "Claro",
"dark": "Oscuro",
"system": "Sistema"
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, el formato de fecha y las preferencias regionales de tu cuenta.",
"language": "Idioma",
"languageDescription": "Selecciona tu idioma preferido",
"rtlNotice": "Este idioma se escribe de derecha a izquierda (RTL)",
"dateFormat": "Formato de fecha",
"dateFormatDescription": "Elige cómo se muestran las fechas en toda la aplicación",
"timeFormat": "Formato de hora",
"timeFormatDescription": "Selecciona el formato de 12 o 24 horas",
"preview": "Vista previa: {{value}}",
"12hour": "12 horas (a. m./p. m.)",
"24hour": "24 horas",
"firstDayOfWeek": "Primer día de la semana",
"firstDayOfWeekDescription": "Elige con qué día empieza tu semana",
"sunday": "Domingo",
"monday": "Lunes",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EE. UU.)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato largo (p. ej., 1 de enero de 2024)",
"short": "Formato corto (p. ej., 1 ene 2024)"
}
},
"advanced": {
"title": "Ajustes avanzados",
"description": "Configura funciones avanzadas como webhooks y actualizaciones en tiempo real para mejorar tu productividad.",
"offlineTitle": "Modo sin conexión",
"offlineDescription": "Sigue usando Donetick sin conexión en este dispositivo o navegador. Tus cambios se guardan localmente y se sincronizan cuando vuelvas a estar en línea.",
"offlineToggle": "Activar el modo sin conexión",
"offlineHelper": "Al desactivarlo se eliminan los cambios sin conexión no sincronizados y los datos guardados en este dispositivo o navegador.",
"offlineEnabled": "Modo sin conexión activado en este dispositivo o navegador",
"offlineDisabled": "Modo sin conexión desactivado y datos locales borrados",
"offlineDisabledPartial": "Se desactivó el modo sin conexión, pero puede que aún queden algunos datos locales guardados",
"offlineDisableTitle": "Desactivar el modo sin conexión",
"offlineDisableMessage": "Al desactivar el modo sin conexión se eliminarán los cambios sin sincronizar y los datos guardados en este dispositivo o navegador. ¿Quieres continuar?",
"offlineDisableConfirm": "Desactivar y borrar datos",
"webhookTitle": "Integración con webhooks",
"webhookDescription": "Los webhooks te permiten enviar notificaciones en tiempo real a otros servicios cuando ocurre algo en tu círculo. Configura una URL de webhook para recibir actualizaciones en tiempo real.",
"webhookPlusNotice": "Las notificaciones por webhook no están disponibles en el plan Básico. Mejora a Plus para recibir actualizaciones en tiempo real por webhook.",
"webhookToggle": "Activar webhook",
"webhookHelper": "Activa las notificaciones por webhook para las actualizaciones de tareas y cosas.",
"webhookURL": "URL del webhook",
"webhookUpdated": "URL del webhook actualizada correctamente",
"webhookUpdateFailed": "No se pudo actualizar la URL del webhook",
"realtimeTitle": "Actualizaciones en tiempo real",
"realtimeDescription": "Configura cómo recibes actualizaciones en vivo cuando cambian las tareas y actividades de tu círculo.",
"realtime": {
"toggleLabel": "Activar actualizaciones en tiempo real",
"title": "Actualizaciones en tiempo real",
"subtitle": "Recibe notificaciones al instante cuando se actualicen las tareas",
"statusLabel": "Estado:",
"basicPlan": "Las actualizaciones en tiempo real no están disponibles en el plan Básico. Mejora a Plus para recibir notificaciones instantáneas cuando se actualicen las tareas.",
"disabled": "Las actualizaciones en tiempo real están desactivadas. Actívalas para ver los cambios en vivo cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas.",
"connected": "Las actualizaciones en tiempo real funcionan. Verás los cambios en vivo cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas.",
"connecting": "Conectando a las actualizaciones en tiempo real…",
"errored": "Las actualizaciones en tiempo real están activadas pero no funcionan: {{error}}",
"notConnected": "Las actualizaciones en tiempo real están activadas pero ahora mismo no hay conexión.",
"basicPlanNotice": "Las actualizaciones en tiempo real no están disponibles en el plan Básico. Mejora a Plus para recibir notificaciones instantáneas cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Cerrar Sesión",
"version": "Versión",
"navigation": {
"search": "Buscar",
"allTasks": "Todas las Tareas",
"archived": "Archivadas",
"things": "Cosas",
@@ -30,6 +31,44 @@
"points": "Puntos",
"settings": "Configuración"
},
"search": {
"title": "Buscar",
"placeholder": "Buscar en Donetick",
"inputAriaLabel": "Buscar tareas, historial, proyectos, etiquetas y configuración",
"deviceNote": "Se busca en el contenido disponible en este dispositivo",
"escape": "Esc",
"recent": "Recientes",
"empty": {
"title": "Sin coincidencias directas",
"subtitle": "Aún puedes filtrar la lista de tareas con esta búsqueda."
},
"groups": {
"tasks": "Tareas",
"history": "Notas",
"projects": "Proyectos",
"labels": "Etiquetas",
"people": "Personas",
"settings": "Configuración",
"actions": "Acciones rápidas"
},
"actions": {
"quickAction": "Acción rápida",
"navigation": "Navegación",
"createTask": "Crear una tarea",
"viewAllTasks": "Ver todas las tareas",
"viewArchivedTasks": "Ver tareas archivadas",
"openSettings": "Abrir configuración",
"filterTasks": "Mostrar tareas que coincidan con «{{query}}»",
"filterTasksSubtitle": "Filtrar la lista de tareas"
},
"footer": {
"navigate": "Navegar",
"open": "Abrir",
"results_one": "{{count}} resultado",
"results_other": "{{count}} resultados",
"typeToSearch": "Escribe para buscar"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,178 +1,494 @@
{
"title": "Configuración",
"circleSettings": {
"title": "Configuración del círculo",
"description": "Tu cuenta se conecta automáticamente a un Círculo cuando creas o te unes a uno. Invita fácilmente a amigos compartiendo el código único del Círculo o el enlace a continuación.",
"circleCode": "Código del Círculo",
"copyCode": "Copiar Código",
"copyLink": "Copiar Enlace",
"codeCopied": "¡Código del círculo copiado!",
"linkCopied": "¡Enlace copiado!",
"joinCircle": "Unirse a un Círculo",
"joinCirclePlaceholder": "Ingresa el Código del Círculo",
"join": "Unirse",
"leave": "Salir del Círculo",
"leaveConfirmTitle": "Salir del Círculo",
"leaveConfirmMessage": "¿Estás seguro de que quieres salir de este círculo?",
"circleMembers": "Miembros del Círculo",
"circleMemberRequests": "Solicitudes de Miembros del Círculo",
"admin": "Administrador",
"member": "Miembro",
"pending": "Pendiente",
"accept": "Aceptar",
"reject": "Rechazar",
"makeAdmin": "Hacer Administrador",
"makeMember": "Hacer Miembro",
"remove": "Eliminar",
"webhookURL": "URL del Webhook",
"webhookDescription": "Ingresa una URL de webhook para recibir notificaciones de eventos del círculo",
"webhookPlaceholder": "https://tu-url-webhook.com"
},
"accountSettings": {
"title": "Configuración de la Cuenta",
"subscription": "Suscripción",
"subscriptionStatus": "Plan Actual",
"free": "Gratis",
"plus": "Plus",
"upgrade": "Actualizar",
"cancel": "Cancelar",
"changePassword": "Cambiar Contraseña",
"password": "Contraseña",
"dangerZone": "Zona de Peligro",
"dangerZoneDescription": "Una vez que elimines tu cuenta, no hay vuelta atrás. Por favor, está seguro.",
"deleteAccount": "Eliminar Cuenta"
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, formato de fecha y preferencias regionales para tu cuenta.",
"language": "Idioma",
"languageDescription": "Selecciona tu idioma preferido",
"dateFormat": "Formato de Fecha",
"dateFormatDescription": "Elige cómo se deben mostrar las fechas en toda la aplicación",
"timeFormat": "Formato de Hora",
"timeFormatDescription": "Selecciona formato de 12 o 24 horas",
"12hour": "12 horas (AM/PM)",
"24hour": "24 horas",
"firstDayOfWeek": "Primer Día de la Semana",
"firstDayOfWeekDescription": "Selecciona qué día comienza tu semana",
"sunday": "Domingo",
"monday": "Lunes",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EE.UU.)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato largo (ej., 1 de enero de 2024)",
"short": "Formato corto (ej., 1 ene 2024)"
}
},
"sidepanel": {
"title": "Personalización del Panel Lateral",
"description": "Personaliza el diseño y la visibilidad de las tarjetas en el panel lateral. Esta sección solo está disponible en dispositivos de pantalla grande como tabletas y computadoras de escritorio."
},
"theme": {
"title": "Preferencias de tema",
"description": "Elige cómo se ve el sitio para ti. Selecciona un solo tema o sincronízalo con tu sistema y cambia automáticamente entre temas de día y noche.",
"themeMode": "Modo de tema",
"light": "Claro",
"dark": "Oscuro",
"system": "Sistema"
},
"notifications": {
"settingsSaved": "Configuración guardada con éxito",
"settingsSaveFailed": "Error al guardar la configuración",
"invalidWebhook": "URL de webhook no válida"
},
"profile": {
"title": "Configuración del Perfil",
"description": "Actualiza tu nombre para mostrar y foto de perfil.",
"photoUpdated": "Foto Actualizada",
"photoUpdatedMessage": "¡Tu foto de perfil ha sido actualizada con éxito!",
"uploadFailed": "Error al Subir",
"uploadFailedMessage": "Error al subir tu foto. Por favor, inténtalo de nuevo.",
"profileUpdated": "Perfil Actualizado",
"profileUpdatedMessage": "¡Tu información de perfil ha sido guardada con éxito!",
"updateFailed": "Error al Actualizar",
"updateFailedMessage": "No se pudo actualizar tu perfil. Por favor, verifica tu conexión e inténtalo de nuevo.",
"changePhoto": "Cambiar Foto",
"displayName": "Nombre para Mostrar",
"displayNamePlaceholder": "Ingresa tu nombre para mostrar",
"timezone": "Zona Horaria",
"timezonePlaceholder": "Selecciona tu zona horaria",
"title": "Ajustes",
"common": {
"save": "Guardar",
"cancel": "Cancelar"
"cancel": "Cancelar",
"confirm": "Confirmar",
"remove": "Eliminar",
"delete": "Borrar",
"refresh": "Actualizar",
"loading": "Cargando…",
"on": "Sí",
"off": "No",
"error": "Error",
"success": "Listo",
"plusFeature": "Función Plus",
"earlyAccess": "Acceso anticipado"
},
"overview": {
"title": "Configuración",
"subtitle": "Personaliza tu experiencia y administra las preferencias de tu cuenta",
"title": "Ajustes",
"subtitle": "Personaliza tu experiencia y gestiona las preferencias de tu cuenta",
"upgrade": {
"title": "Actualizar a Plus",
"description": "Desbloquea funciones potentes para mejorar tu productividad",
"button": "Actualizar Ahora",
"title": "Mejora a Plus",
"description": "Desbloquea funciones potentes para aumentar tu productividad",
"button": "Mejorar ahora",
"features": {
"richText": "Descripciones en texto enriquecido",
"richText": "Descripciones con texto enriquecido",
"notifications": "Notificaciones de tareas",
"apiIntegrations": "Integraciones API",
"apiIntegrations": "Integraciones con API",
"advancedAutomation": "Automatización avanzada"
}
},
"sections": {
"profile": {
"title": "Configuración del Perfil",
"description": "Actualiza tu información de perfil, foto, nombre para mostrar y preferencias de zona horaria."
"title": "Ajustes de perfil",
"description": "Actualiza tu información de perfil, foto, nombre visible y zona horaria."
},
"circle": {
"title": "Configuración del Círculo",
"description": "Administra tu círculo, invita miembros y gestiona solicitudes de unión."
"title": "Ajustes del círculo",
"description": "Gestiona tu círculo, invita miembros y atiende las solicitudes de acceso."
},
"account": {
"title": "Configuración de la Cuenta",
"description": "Administra tu suscripción, cambia la contraseña y opciones de eliminación de cuenta."
"title": "Ajustes de cuenta",
"description": "Gestiona tu suscripción, cambia la contraseña y elimina tu cuenta."
},
"subaccounts": {
"title": "Cuentas Administradas",
"description": "Crea y administra subcuentas para iniciar sesión y completar tareas asignadas."
"title": "Cuentas gestionadas",
"description": "Crea y gestiona subcuentas para que puedan iniciar sesión y completar las tareas asignadas."
},
"notifications": {
"title": "Notificaciones",
"description": "Configura notificaciones push, alertas por correo electrónico y destinos de notificación para tareas."
"description": "Configura notificaciones push, avisos por correo y destinos de notificación para las tareas."
},
"mfa": {
"title": "Autenticación Multifactor",
"description": "Agrega una capa adicional de seguridad con MFA usando aplicaciones de autenticación."
"title": "Autenticación multifactor",
"description": "Añade una capa extra de seguridad con MFA usando apps de autenticación."
},
"apitokens": {
"title": "Tokens API",
"description": "Genera y administra tokens de acceso para integraciones de terceros y acceso a la API."
"title": "Tokens de API",
"description": "Genera y gestiona tokens de acceso para integraciones de terceros y acceso a la API."
},
"storage": {
"title": "Configuración de Almacenamiento",
"description": "Respalda y restaura tus datos, administra el almacenamiento local y las preferencias de sincronización."
"title": "Ajustes de almacenamiento",
"description": "Haz copias de seguridad y restaura tus datos, gestiona el almacenamiento local y la sincronización."
},
"sidepanel": {
"title": "Personalización del Panel Lateral",
"description": "Personaliza el diseño y la visibilidad de las tarjetas en la interfaz del panel lateral."
"title": "Personalización del panel lateral",
"description": "Personaliza la disposición y la visibilidad de las tarjetas del panel lateral."
},
"theme": {
"title": "Preferencias de Tema",
"description": "Elige tu tema preferido y configura los ajustes de modo oscuro/claro."
"title": "Preferencias de tema",
"description": "Elige tu tema preferido y configura el modo claro/oscuro."
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, formato de fecha, formato de hora y preferencias regionales."
"description": "Personaliza el idioma, el formato de fecha y hora y las preferencias regionales."
},
"advanced": {
"title": "Configuración Avanzada",
"description": "Configura webhooks, actualizaciones en tiempo real y otras funciones avanzadas para mejorar la productividad."
"title": "Ajustes avanzados",
"description": "Configura webhooks, actualizaciones en tiempo real y otras funciones avanzadas."
},
"developer": {
"title": "Configuración de Desarrollador",
"description": "Ver información técnica sobre tokens de autenticación, conexiones SSE y datos de depuración."
"title": "Ajustes de desarrollador",
"description": "Consulta información técnica sobre tokens de autenticación, conexiones SSE y datos de depuración."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "Enviar comentarios",
"description": "Cuéntanos qué tal te funciona Donetick o pide una función."
},
"bugReport": {
"title": "Informar de un error",
"description": "¿Algo no funciona bien? Envíanos los detalles junto con una instantánea técnica."
}
}
},
"profile": {
"title": "Ajustes de perfil",
"description": "Actualiza tu nombre visible y tu foto de perfil.",
"photoUpdated": "Foto actualizada",
"photoUpdatedMessage": "¡Tu foto de perfil se ha actualizado correctamente!",
"uploadFailed": "Error al subir",
"uploadFailedMessage": "No se pudo subir tu foto. Inténtalo de nuevo.",
"profileUpdated": "Perfil actualizado",
"profileUpdatedMessage": "¡La información de tu perfil se ha guardado correctamente!",
"updateFailed": "Error al actualizar",
"updateFailedMessage": "No se pudo actualizar tu perfil. Comprueba tu conexión e inténtalo de nuevo.",
"changePhoto": "Cambiar foto",
"editPhoto": "Editar foto de perfil",
"displayName": "Nombre visible",
"displayNamePlaceholder": "Escribe tu nombre visible",
"timezone": "Zona horaria",
"timezonePlaceholder": "Selecciona tu zona horaria",
"save": "Guardar",
"cancel": "Cancelar"
},
"circleSettings": {
"title": "Ajustes del círculo",
"description": "Tu cuenta se conecta automáticamente a un círculo cuando creas uno o te unes. Invita a tus amigos compartiendo el código o el enlace del círculo que aparece abajo. Recibirás un aviso aquí cuando alguien pida unirse a tu círculo.",
"memberOf": "Formas parte de {{name}}",
"yourCircleCode": "Tu código de círculo es:",
"copyCode": "Copiar código",
"shareInvite": "Compartir invitación",
"codeCopied": "Código copiado al portapapeles",
"linkCopied": "Enlace de invitación copiado al portapapeles",
"myCircle": "mi círculo",
"shareTitle": "Únete a {{name}} en Donetick",
"shareText": "Me gustaría invitarte a unirte a {{name}} en Donetick.",
"shareDialogTitle": "Compartir invitación al círculo",
"leave": "Salir del círculo",
"leaveConfirmTitle": "Salir del círculo",
"leaveConfirmMessage": "¿Seguro que quieres salir de tu círculo?",
"leaveConfirmButton": "Salir",
"leftCircle": "Has salido del círculo correctamente",
"leaveFailed": "No se pudo salir del círculo",
"circleMembers": "Miembros del círculo",
"you": "(Tú)",
"pendingApproval": "Pendiente de aprobación",
"joinedOn": "Se unió el {{date}}",
"requestedToJoin": "Solicitud de acceso {{date}}",
"roles": {
"member": "Miembro",
"memberDescription": "Un miembro normal del círculo",
"manager": "Gestor",
"managerDescription": "Puede suplantar a otras personas y actuar en su nombre",
"admin": "Administrador",
"adminDescription": "Acceso total al círculo"
},
"roleUpdateFailed": "No se pudo actualizar el rol",
"removeMemberTitle": "Eliminar miembro",
"removeMemberMessage": "¿Seguro que quieres eliminar a {{name}} de tu círculo?",
"memberRemoved": "Miembro eliminado correctamente",
"circleMemberRequests": "Solicitudes de acceso al círculo",
"lastUpdated": "Última actualización: {{time}}",
"refreshing": "Actualizando…",
"refreshFailed": "No se pudieron actualizar las solicitudes de acceso",
"wantsToJoin": "{{name}} quiere unirse a tu círculo.",
"accept": "Aceptar",
"acceptRequestTitle": "Aceptar solicitud de acceso",
"acceptRequestMessage": "¿Seguro que quieres aceptar a {{name}} (usuario: {{username}}) en tu círculo?",
"requestAccepted": "Solicitud aceptada correctamente",
"or": "o",
"joinOtherDescription": "¿Quieres unirte al círculo de otra persona? Pídele su código de círculo o su enlace de invitación. Escribe el código abajo para unirte.",
"enterCircleCode": "Introduce el código del círculo:",
"enterCodePlaceholder": "Introduce el código",
"joinCircle": "Unirse al círculo",
"joinedPending": "Te has unido al círculo correctamente; espera a que la persona propietaria acepte tu solicitud.",
"alreadyMember": "Ya eres miembro de este círculo",
"joinFailed": "No se pudo unir al círculo"
},
"accountSettings": {
"title": "Ajustes de cuenta",
"description": "Cambia los ajustes de tu cuenta, el tipo de plan o tu contraseña",
"accountType": "Tipo de cuenta: {{type}}",
"free": "Gratis",
"plus": "Plus",
"plusUntil": "Plus (hasta el {{date}})",
"activeDescription": "Actualmente tienes el plan Plus. Tu suscripción se renovará el {{date}}.",
"cancelledDescription": "Has cancelado tu suscripción. Tu cuenta pasará al plan Gratis el {{date}}.",
"freeDescription": "Actualmente tienes el plan Gratis. Mejora a Plus para desbloquear más funciones.",
"upgrade": "Mejorar",
"cancel": "Cancelar",
"password": "Contraseña:",
"changePassword": "Cambiar contraseña",
"passwordChanged": "Contraseña cambiada correctamente",
"passwordChangeFailed": "No se pudo cambiar la contraseña",
"dangerZone": "Zona de peligro",
"dangerZoneDescription": "Una vez que elimines tu cuenta, no hay vuelta atrás. Asegúrate antes de continuar.",
"deleteAccount": "Eliminar cuenta",
"accountDeleted": "Cuenta eliminada correctamente",
"subscriptionCancelled": "Suscripción cancelada",
"subscriptionCancelFailed": "No se pudo cancelar la suscripción",
"purchase": {
"success": "¡Compra realizada! Reinicia la app para acceder a las funciones Plus.",
"storeConnection": "Problema de conexión con la tienda. Comprueba tu red e inténtalo de nuevo.",
"notAllowed": "Las compras no están permitidas en este dispositivo. Revisa las restricciones de tu dispositivo.",
"unavailable": "Esta suscripción no está disponible. Inténtalo más tarde.",
"alreadyProcessed": "Esta compra ya se ha procesado. Si crees que es un error, ponte en contacto con el soporte.",
"receiptMissing": "Falta el recibo de compra. Intenta comprar de nuevo.",
"networkError": "Error de red. Comprueba tu conexión e inténtalo de nuevo.",
"invalidReceipt": "Recibo de compra no válido. Ponte en contacto con el soporte si el problema persiste.",
"pending": "El pago está pendiente de aprobación. Tendrás acceso en cuanto se apruebe.",
"failed": "La compra ha fallado: {{error}}. Inténtalo de nuevo o contacta con el soporte.",
"unknownError": "Error desconocido"
}
},
"subaccounts": {
"title": "Cuentas gestionadas",
"description": "Gestiona las subcuentas. Sus usuarios pueden iniciar sesión y completar las tareas asignadas.",
"notParentTitle": "Gestión de subcuentas",
"notParentMessage": "Solo las cuentas principales pueden gestionar subcuentas.",
"freePlanNotice": "El plan Gratis permite 1 subcuenta. Mejora a Plus para tener hasta 5 subcuentas.",
"count": "Subcuentas ({{count}})",
"add": "Añadir subcuenta",
"loading": "Cargando subcuentas…",
"emptyTitle": "No hay subcuentas",
"emptyDescription": "Crea subcuentas para que los miembros del equipo puedan iniciar sesión y completar sus tareas.",
"addFirst": "Añade tu primera subcuenta",
"username": "Usuario: {{username}}",
"created": "Creada: {{date}}",
"changePassword": "Cambiar contraseña",
"deleteAccount": "Eliminar cuenta",
"createdSuccess": "¡La subcuenta «{{name}}» se ha creado correctamente!",
"createFailed": "No se pudo crear la subcuenta: {{error}}",
"createFailedGeneric": "No se pudo crear la subcuenta",
"passwordUpdated": "Contraseña de la subcuenta actualizada correctamente",
"passwordUpdateFailed": "No se pudo actualizar la contraseña: {{error}}",
"passwordUpdateFailedGeneric": "No se pudo actualizar la contraseña",
"deleteConfirmTitle": "Eliminar subcuenta",
"deleteConfirmMessage": "¿Seguro que quieres eliminar la subcuenta «{{name}}»? Esta acción no se puede deshacer.",
"deleted": "Subcuenta «{{name}}» eliminada correctamente",
"deleteFailed": "No se pudo eliminar la subcuenta: {{error}}",
"deleteFailedGeneric": "No se pudo eliminar la subcuenta",
"howItWorksTitle": "Cómo funcionan las cuentas gestionadas",
"howItWorks1": "Las cuentas gestionadas las crea la cuenta principal; son para personas cuya cuenta quieres poder eliminar y cuya contraseña quieres poder restablecer.",
"howItWorks2": "Las subcuentas pueden iniciar sesión con su propio usuario y contraseña.",
"howItWorks3": "Las cuentas gestionadas pueden completar tareas, pero tienen permisos administrativos limitados",
"howItWorks4": "Las cuentas gestionadas se añaden automáticamente a tu círculo"
},
"notifications": {
"title": "Ajustes de notificaciones",
"deviceSection": "Notificaciones del dispositivo",
"deviceSectionDescription": "Gestiona las notificaciones de tu dispositivo",
"deviceLabel": "Notificación del dispositivo",
"deviceHelper": "Recibe una notificación en tu dispositivo cuando venza una tarea",
"mobileOnly": "Esta función solo está disponible en dispositivos móviles",
"testNotification": "Notificación de prueba",
"testNotificationBody": "Tienes una tarea que vence pronto",
"dueTitle": "Notificación de vencimiento",
"dueLabel": "Notificación cuando la tarea vence",
"preDueTitle": "Notificación previa al vencimiento",
"preDueLabel": "Notificación unas horas antes de que venza la tarea",
"overdueTitle": "Notificación de retraso",
"overdueLabel": "Notificación cuando la tarea está vencida",
"pushLabel": "Notificaciones push",
"pushHelper": "Recibe recordatorios, anuncios y asignaciones de tareas por notificación push",
"registeredDevices": "Dispositivos registrados ({{count}}/5)",
"registeredDevicesDescription": "Dispositivos registrados para recibir notificaciones push de tu cuenta",
"currentDevice": "Dispositivo actual: {{platform}} {{model}}",
"currentDeviceNotRegistered": "Este dispositivo no está registrado para notificaciones push",
"limitReached": "Límite alcanzado",
"registerDevice": "Registrar dispositivo",
"unknownDevice": "Dispositivo desconocido",
"deviceCreatedAt": "Creado el: {{date}}",
"noDevices": "No hay dispositivos registrados para notificaciones push",
"customSection": "Notificación personalizada",
"customSectionDescription": "Notificaciones a través de otras plataformas como Telegram o Pushover",
"customLabel": "Notificación personalizada",
"customHelper": "Recibe notificaciones en otra plataforma",
"targetNone": "Ninguna",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Debes escribir primero al bot para que funcionen las notificaciones de Telegram",
"telegramBotHelpAfter": "para iniciar un chat",
"clickHere": "Haz clic aquí",
"chatId": "ID de chat",
"chatIdPlaceholder": "ID de usuario / ID de chat",
"telegramChatIdHelpBefore": "Si no conoces tu ID de chat, inicia un chat con userinfobot y te lo enviará.",
"telegramChatIdHelpAfter": "para iniciar un chat con userinfobot",
"userKey": "Clave de usuario",
"userKeyPlaceholder": "ID de usuario",
"chatIdRequired": "El ID de chat es obligatorio",
"chatIdInvalid": "ID de chat no válido",
"userKeyRequired": "La clave de usuario es obligatoria",
"targetUpdated": "Destino de notificación actualizado",
"targetUpdateFailed": "Error al actualizar el destino de notificación: {{error}}",
"deviceRegistered": "Dispositivo registrado correctamente para notificaciones push.",
"deviceLimitTitle": "Límite de dispositivos alcanzado",
"deviceLimitMessage": "Has alcanzado el máximo de 5 dispositivos registrados. Elimina uno antes de registrar este.",
"registrationFailedTitle": "Error de registro",
"registrationFailedMessage": "No se pudo registrar el dispositivo automáticamente. Inténtalo de nuevo.",
"permissionRequiredTitle": "Permiso necesario",
"permissionRequiredMessage": "Se necesita permiso de notificaciones push para registrar este dispositivo.",
"registrationInitiatedTitle": "Registro iniciado",
"registrationInitiatedMessage": "Se ha iniciado el registro de notificaciones push. El dispositivo se registrará automáticamente.",
"registerDeviceFailed": "No se pudo registrar el dispositivo. Inténtalo de nuevo.",
"permissionDeniedTitle": "Permiso de notificaciones denegado",
"permissionDeniedMessage": "Has denegado los permisos de notificación. Puedes activarlos más tarde en los ajustes de tu dispositivo.",
"pushPermissionDeniedTitle": "Permiso de notificaciones push denegado",
"pushPermissionDeniedMessage": "Se han desactivado las notificaciones push. Puedes activarlas en los ajustes de tu dispositivo si lo necesitas.",
"unregisterFailed": "No se pudo dar de baja el dispositivo"
},
"mfa": {
"title": "Autenticación multifactor",
"description": "Añade una capa extra de seguridad a tu cuenta con la autenticación multifactor (MFA). Cuando está activada, al iniciar sesión tendrás que introducir un código de verificación de tu app de autenticación además de tu contraseña.",
"twoFactor": "Autenticación en dos pasos",
"enabledSubtitle": "Tu cuenta está protegida con 2FA",
"disabledSubtitle": "Protege tu cuenta con una app de autenticación",
"enable": "Activar",
"disable": "Desactivar",
"enabledSuccess": "¡La MFA se ha activado correctamente!",
"disabledSuccess": "¡La MFA se ha desactivado correctamente!",
"errors": {
"qrGenerationFailed": "No se pudo generar el código QR",
"invalidResponse": "Respuesta del servidor no válida. Falta el código QR o la clave.",
"notFound": "No se encontró el endpoint de configuración de MFA. Puede que esta función aún no esté disponible.",
"unauthorized": "No autorizado. Inicia sesión de nuevo.",
"serverError": "Error del servidor. Inténtalo más tarde.",
"setupFailed": "No se pudo configurar la MFA ({{status}}). Inténtalo de nuevo.",
"networkError": "Error de red. Comprueba tu conexión e inténtalo de nuevo.",
"invalidCode": "Código de verificación no válido. Inténtalo de nuevo.",
"confirmFailed": "No se pudo confirmar la MFA. Inténtalo de nuevo.",
"disableFailed": "No se pudo desactivar la MFA. Inténtalo de nuevo."
},
"setup": {
"title": "Configurar la autenticación multifactor",
"addedAccount": "Ya he añadido la cuenta",
"back": "Atrás",
"verifyAndEnable": "Verificar y activar",
"savedBackupCodes": "He guardado mis códigos de respaldo",
"step1Label": "Paso 1:",
"step1": "Escanea el código QR de abajo con tu app de autenticación (Google Authenticator, Authy, etc.)",
"qrAlt": "Código QR de MFA",
"qrFailed": "No se pudo generar el código QR. Inténtalo de nuevo o usa la clave manual de abajo.",
"manualKey": "Clave de introducción manual:",
"step2Label": "Paso 2:",
"step2": "Introduce el código de verificación de 6 dígitos de tu app de autenticación",
"codePlaceholder": "Introduce el código de 6 dígitos",
"successTitle": "¡MFA activada correctamente!",
"backupCodesTitle": "Guarda estos códigos de respaldo en un lugar seguro",
"backupCodesDescription": "Puedes usar estos códigos para acceder a tu cuenta si pierdes tu dispositivo de autenticación. Cada código solo se puede usar una vez."
},
"disableModal": {
"title": "Desactivar la autenticación multifactor",
"warning": "Desactivar la MFA hará que tu cuenta sea menos segura. ¿Seguro que quieres continuar?",
"prompt": "Introduce un código de verificación de tu app de autenticación para confirmar:",
"confirm": "Desactivar MFA"
},
"backupCodesModal": {
"title": "Nuevos códigos de respaldo",
"warning": "Tus códigos de respaldo anteriores ya no son válidos. Guarda estos nuevos códigos en un lugar seguro. Cada código solo se puede usar una vez."
}
},
"apiTokens": {
"title": "Tokens de API",
"accessToken": "Token de acceso",
"description": "Crea un token para usar con la API y actualizar cosas que activan tareas",
"plusNotice": "Los tokens de API no están disponibles en el plan Básico. Mejora a Plus para generar tokens de API e integrarte con sistemas externos y automatizar tus tareas.",
"showToken": "Mostrar token",
"hideToken": "Ocultar token",
"removeTitle": "Eliminar token",
"removeMessage": "¿Seguro que quieres eliminar {{name}}?",
"removedTitle": "Eliminado",
"removedMessage": "El token de API se ha eliminado",
"tokenCopied": "Token copiado al portapapeles",
"generateNew": "Generar nuevo token",
"nameModalTitle": "Dale un nombre a tu nuevo token, algo con lo que lo reconozcas.",
"generateToken": "Generar token"
},
"storage": {
"title": "Ajustes de almacenamiento",
"serverTitle": "Uso del almacenamiento en el servidor",
"serverDescription": "Este es el almacenamiento que usa tu cuenta en nuestros servidores (por ejemplo, archivos, imágenes y datos que has subido).",
"usagePlaceholder": "-- MB usados / -- MB en total (--)",
"usage": "{{used}} MB usados / {{total}} MB en total ({{percent}} %)",
"basicPlanNotice": "El almacenamiento en el servidor no está disponible en el plan Básico. Mejora a Plus para consultar tu uso.",
"localTitleApp": "Almacenamiento local y caché de la app",
"localTitleBrowser": "Almacenamiento local y caché del navegador",
"localDescription": "Son datos guardados localmente en tu navegador para un acceso más rápido. Borrarlos no afectará a tus datos del servidor, pero puede cerrar tu sesión.",
"clearLocal": "Borrar todo el almacenamiento local y la caché",
"clearLocalTitle": "Borrar todo el almacenamiento local",
"clearLocalMessage": "¿Seguro que quieres borrar tu almacenamiento local y la caché? Se eliminarán todos tus datos de este navegador y tendrás que iniciar sesión de nuevo.",
"clearAll": "Borrar todo",
"appPreferences": "Preferencias de la app",
"deviceOnly": "Solo en el dispositivo",
"appPreferencesDescription": "Son preferencias y ajustes que la app guarda localmente en tu dispositivo. Al borrarlos se restablecerán los ajustes de la app y puede que se cierre tu sesión, pero no afectará a tus datos del servidor.",
"clearPreferences": "Borrar preferencias de la app",
"clearPreferencesTitle": "Borrar preferencias de la app",
"clearPreferencesMessage": "¿Seguro que quieres borrar todas las preferencias de la app? Se restablecerán tus ajustes y puede que tengas que iniciar sesión de nuevo."
},
"sidepanel": {
"title": "Personalización del panel lateral",
"heading": "Ajustes del panel lateral",
"description": "Elige qué tarjetas aparecen en el panel lateral y en qué orden. Arrastra y suelta para reordenarlas o cambia su visibilidad.",
"resetToDefaults": "Restablecer valores predeterminados",
"resetHelper": "Se restablecerán la visibilidad y el orden predeterminados de todas las tarjetas.",
"cards": {
"welcome": {
"name": "Cambio de usuario",
"description": "Permite a administradores y gestores ver las tareas como otras personas"
},
"smartInsights": {
"name": "Ideas inteligentes",
"description": "Acciones rápidas basadas en tus tareas"
},
"assignees": {
"name": "Tareas por responsable",
"description": "Agrupa las tareas según a quién estén asignadas"
},
"calendar": {
"name": "Vista de calendario",
"description": "Muestra las tareas en formato de calendario"
},
"activities": {
"name": "Actividad reciente",
"description": "Muestra las tareas completadas y la actividad reciente"
},
"weeklyGoals": {
"name": "Objetivos semanales",
"description": "Muestra el progreso semanal y las estadísticas de la familia"
}
}
},
"theme": {
"title": "Preferencias de tema",
"description": "Elige cómo se ve la aplicación. Selecciona un tema fijo o sincronízalo con tu sistema para cambiar automáticamente entre el modo claro y oscuro.",
"themeMode": "Modo de tema",
"light": "Claro",
"dark": "Oscuro",
"system": "Sistema"
},
"localization": {
"title": "Localización",
"description": "Personaliza el idioma, el formato de fecha y las preferencias regionales de tu cuenta.",
"language": "Idioma",
"languageDescription": "Selecciona tu idioma preferido",
"rtlNotice": "Este idioma se escribe de derecha a izquierda (RTL)",
"dateFormat": "Formato de fecha",
"dateFormatDescription": "Elige cómo se muestran las fechas en toda la aplicación",
"timeFormat": "Formato de hora",
"timeFormatDescription": "Selecciona el formato de 12 o 24 horas",
"preview": "Vista previa: {{value}}",
"12hour": "12 horas (a. m./p. m.)",
"24hour": "24 horas",
"firstDayOfWeek": "Primer día de la semana",
"firstDayOfWeekDescription": "Elige con qué día empieza tu semana",
"sunday": "Domingo",
"monday": "Lunes",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EE. UU.)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato largo (p. ej., 1 de enero de 2024)",
"short": "Formato corto (p. ej., 1 ene 2024)"
}
},
"advanced": {
"title": "Ajustes avanzados",
"description": "Configura funciones avanzadas como webhooks y actualizaciones en tiempo real para mejorar tu productividad.",
"offlineTitle": "Modo sin conexión",
"offlineDescription": "Sigue usando Donetick sin conexión en este dispositivo o navegador. Tus cambios se guardan localmente y se sincronizan cuando vuelvas a estar en línea.",
"offlineToggle": "Activar el modo sin conexión",
"offlineHelper": "Al desactivarlo se eliminan los cambios sin conexión no sincronizados y los datos guardados en este dispositivo o navegador.",
"offlineEnabled": "Modo sin conexión activado en este dispositivo o navegador",
"offlineDisabled": "Modo sin conexión desactivado y datos locales borrados",
"offlineDisabledPartial": "Se desactivó el modo sin conexión, pero puede que aún queden algunos datos locales guardados",
"offlineDisableTitle": "Desactivar el modo sin conexión",
"offlineDisableMessage": "Al desactivar el modo sin conexión se eliminarán los cambios sin sincronizar y los datos guardados en este dispositivo o navegador. ¿Quieres continuar?",
"offlineDisableConfirm": "Desactivar y borrar datos",
"webhookTitle": "Integración con webhooks",
"webhookDescription": "Los webhooks te permiten enviar notificaciones en tiempo real a otros servicios cuando ocurre algo en tu círculo. Configura una URL de webhook para recibir actualizaciones en tiempo real.",
"webhookPlusNotice": "Las notificaciones por webhook no están disponibles en el plan Básico. Mejora a Plus para recibir actualizaciones en tiempo real por webhook.",
"webhookToggle": "Activar webhook",
"webhookHelper": "Activa las notificaciones por webhook para las actualizaciones de tareas y cosas.",
"webhookURL": "URL del webhook",
"webhookUpdated": "URL del webhook actualizada correctamente",
"webhookUpdateFailed": "No se pudo actualizar la URL del webhook",
"realtimeTitle": "Actualizaciones en tiempo real",
"realtimeDescription": "Configura cómo recibes actualizaciones en vivo cuando cambian las tareas y actividades de tu círculo.",
"realtime": {
"toggleLabel": "Activar actualizaciones en tiempo real",
"title": "Actualizaciones en tiempo real",
"subtitle": "Recibe notificaciones al instante cuando se actualicen las tareas",
"statusLabel": "Estado:",
"basicPlan": "Las actualizaciones en tiempo real no están disponibles en el plan Básico. Mejora a Plus para recibir notificaciones instantáneas cuando se actualicen las tareas.",
"disabled": "Las actualizaciones en tiempo real están desactivadas. Actívalas para ver los cambios en vivo cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas.",
"connected": "Las actualizaciones en tiempo real funcionan. Verás los cambios en vivo cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas.",
"connecting": "Conectando a las actualizaciones en tiempo real…",
"errored": "Las actualizaciones en tiempo real están activadas pero no funcionan: {{error}}",
"notConnected": "Las actualizaciones en tiempo real están activadas pero ahora mismo no hay conexión.",
"basicPlanNotice": "Las actualizaciones en tiempo real no están disponibles en el plan Básico. Mejora a Plus para recibir notificaciones instantáneas cuando tú u otros miembros del círculo completéis, omitáis o modifiquéis tareas."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Déconnexion",
"version": "Version",
"navigation": {
"search": "Recherche",
"allTasks": "Toutes les Tâches",
"archived": "Archivées",
"things": "Objets",
@@ -29,5 +30,43 @@
"activities": "Activités",
"points": "Points",
"settings": "Paramètres"
},
"search": {
"title": "Recherche",
"placeholder": "Rechercher dans Donetick",
"inputAriaLabel": "Rechercher des tâches, lhistorique, des projets, des étiquettes et des paramètres",
"deviceNote": "Recherche dans le contenu disponible sur cet appareil",
"escape": "Échap",
"recent": "Récents",
"empty": {
"title": "Aucune correspondance directe",
"subtitle": "Vous pouvez tout de même filtrer la liste des tâches avec cette recherche."
},
"groups": {
"tasks": "Tâches",
"history": "Notes",
"projects": "Projets",
"labels": "Étiquettes",
"people": "Personnes",
"settings": "Paramètres",
"actions": "Actions rapides"
},
"actions": {
"quickAction": "Action rapide",
"navigation": "Navigation",
"createTask": "Créer une tâche",
"viewAllTasks": "Voir toutes les tâches",
"viewArchivedTasks": "Voir les tâches archivées",
"openSettings": "Ouvrir les paramètres",
"filterTasks": "Afficher les tâches correspondant à « {{query}} »",
"filterTasksSubtitle": "Filtrer la liste des tâches"
},
"footer": {
"navigate": "Naviguer",
"open": "Ouvrir",
"results_one": "{{count}} résultat",
"results_other": "{{count}} résultats",
"typeToSearch": "Saisissez du texte pour rechercher"
}
}
}

View File

@@ -1,114 +1,27 @@
{
"title": "Paramètres",
"circleSettings": {
"title": "Paramètres du cercle",
"description": "Votre compte est automatiquement connecté à un Cercle lorsque vous en créez un ou en rejoignez un. Invitez facilement des amis en partageant le code unique du Cercle ou le lien ci-dessous.",
"circleCode": "Code du Cercle",
"copyCode": "Copier le Code",
"copyLink": "Copier le Lien",
"codeCopied": "Code du cercle copié !",
"linkCopied": "Lien copié !",
"joinCircle": "Rejoindre un Cercle",
"joinCirclePlaceholder": "Entrer le Code du Cercle",
"join": "Rejoindre",
"leave": "Quitter le Cercle",
"leaveConfirmTitle": "Quitter le Cercle",
"leaveConfirmMessage": "Êtes-vous sûr de vouloir quitter ce cercle ?",
"circleMembers": "Membres du Cercle",
"circleMemberRequests": "Demandes de Membres du Cercle",
"admin": "Administrateur",
"member": "Membre",
"pending": "En attente",
"accept": "Accepter",
"reject": "Rejeter",
"makeAdmin": "Nommer Administrateur",
"makeMember": "Nommer Membre",
"remove": "Supprimer",
"webhookURL": "URL du Webhook",
"webhookDescription": "Entrez une URL de webhook pour recevoir des notifications pour les événements du cercle",
"webhookPlaceholder": "https://votre-url-webhook.com"
},
"accountSettings": {
"title": "Paramètres du Compte",
"subscription": "Abonnement",
"subscriptionStatus": "Plan Actuel",
"free": "Gratuit",
"plus": "Plus",
"upgrade": "Mettre à Niveau",
"cancel": "Annuler",
"changePassword": "Changer le Mot de Passe",
"password": "Mot de passe",
"dangerZone": "Zone Dangereuse",
"dangerZoneDescription": "Une fois votre compte supprimé, il n'y a pas de retour en arrière. Veuillez être certain.",
"deleteAccount": "Supprimer le Compte"
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date et les préférences régionales pour votre compte.",
"language": "Langue",
"languageDescription": "Sélectionnez votre langue préférée",
"dateFormat": "Format de Date",
"dateFormatDescription": "Choisissez comment les dates doivent être affichées dans l'application",
"timeFormat": "Format de l'Heure",
"timeFormatDescription": "Sélectionnez le format 12 heures ou 24 heures",
"12hour": "12 heures (AM/PM)",
"24hour": "24 heures",
"firstDayOfWeek": "Premier Jour de la Semaine",
"firstDayOfWeekDescription": "Sélectionnez quel jour commence votre semaine",
"sunday": "Dimanche",
"monday": "Lundi",
"saturday": "Samedi",
"formats": {
"mdy": "MM/JJ/AAAA (États-Unis)",
"dmy": "JJ/MM/AAAA (Europe)",
"ymd": "AAAA-MM-JJ (ISO)",
"long": "Format long (ex., 1 janvier 2024)",
"short": "Format court (ex., 1 janv. 2024)"
}
},
"sidepanel": {
"title": "Personnalisation du Panneau Latéral",
"description": "Personnalisez la disposition et la visibilité des cartes dans le panneau latéral. Cette section n'est disponible que sur les grands écrans comme les tablettes et les ordinateurs de bureau."
},
"theme": {
"title": "Préférences de thème",
"description": "Choisissez comment le site vous apparaît. Sélectionnez un thème unique ou synchronisez avec votre système pour basculer automatiquement entre les thèmes jour et nuit.",
"themeMode": "Mode de thème",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
},
"notifications": {
"settingsSaved": "Paramètres enregistrés avec succès",
"settingsSaveFailed": "Échec de l'enregistrement des paramètres",
"invalidWebhook": "URL de webhook invalide"
},
"profile": {
"title": "Paramètres du Profil",
"description": "Mettez à jour votre nom d'affichage et votre photo de profil.",
"photoUpdated": "Photo Mise à Jour",
"photoUpdatedMessage": "Votre photo de profil a été mise à jour avec succès !",
"uploadFailed": "Échec du Téléchargement",
"uploadFailedMessage": "Échec du téléchargement de votre photo. Veuillez réessayer.",
"profileUpdated": "Profil Mis à Jour",
"profileUpdatedMessage": "Vos informations de profil ont été enregistrées avec succès !",
"updateFailed": "Échec de la Mise à Jour",
"updateFailedMessage": "Impossible de mettre à jour votre profil. Veuillez vérifier votre connexion et réessayer.",
"changePhoto": "Changer la Photo",
"displayName": "Nom d'Affichage",
"displayNamePlaceholder": "Entrez votre nom d'affichage",
"timezone": "Fuseau Horaire",
"timezonePlaceholder": "Sélectionnez votre fuseau horaire",
"common": {
"save": "Enregistrer",
"cancel": "Annuler"
"cancel": "Annuler",
"confirm": "Confirmer",
"remove": "Retirer",
"delete": "Supprimer",
"refresh": "Actualiser",
"loading": "Chargement…",
"on": "Activé",
"off": "Désactivé",
"error": "Erreur",
"success": "Succès",
"plusFeature": "Fonctionnalité Plus",
"earlyAccess": "Accès anticipé"
},
"overview": {
"title": "Paramètres",
"subtitle": "Personnalisez votre expérience et gérez les préférences de votre compte",
"upgrade": {
"title": "Passer à Plus",
"description": "Débloquez des fonctionnalités puissantes pour améliorer votre productivité",
"button": "Mettre à Niveau Maintenant",
"description": "Débloquez des fonctionnalités puissantes pour gagner en productivité",
"button": "Passer à Plus",
"features": {
"richText": "Descriptions en texte enrichi",
"notifications": "Notifications de tâches",
@@ -118,57 +31,464 @@
},
"sections": {
"profile": {
"title": "Paramètres du Profil",
"description": "Mettez à jour vos informations de profil, photo, nom d'affichage et préférences de fuseau horaire."
"title": "Paramètres du profil",
"description": "Mettez à jour vos informations de profil, votre photo, votre nom affiché et votre fuseau horaire."
},
"circle": {
"title": "Paramètres du Cercle",
"description": "Gérez votre cercle, invitez des membres et gérez les demandes d'adhésion."
"title": "Paramètres du cercle",
"description": "Gérez votre cercle, invitez des membres et traitez les demandes d'adhésion."
},
"account": {
"title": "Paramètres du Compte",
"description": "Gérez votre abonnement, changez le mot de passe et les options de suppression de compte."
"title": "Paramètres du compte",
"description": "Gérez votre abonnement, changez votre mot de passe et supprimez votre compte."
},
"subaccounts": {
"title": "Comptes Gérés",
"description": "Créez et gérez des sous-comptes pour vous connecter et accomplir les tâches assignées."
"title": "Comptes gérés",
"description": "Créez et gérez des sous-comptes pouvant se connecter et accomplir les tâches assignées."
},
"notifications": {
"title": "Notifications",
"description": "Configurez les notifications push, les alertes par e-mail et les cibles de notification pour les tâches."
"description": "Configurez les notifications push, les alertes par e-mail et les destinations de notification des tâches."
},
"mfa": {
"title": "Authentification Multi-Facteurs",
"description": "Ajoutez une couche de sécurité supplémentaire avec MFA en utilisant des applications d'authentification."
"title": "Authentification multifacteur",
"description": "Ajoutez une couche de sécurité supplémentaire avec la MFA via une application d'authentification."
},
"apitokens": {
"title": "Jetons API",
"title": "Jetons d'API",
"description": "Générez et gérez des jetons d'accès pour les intégrations tierces et l'accès à l'API."
},
"storage": {
"title": "Paramètres de Stockage",
"description": "Sauvegardez et restaurez vos données, gérez le stockage local et les préférences de synchronisation."
"title": "Paramètres de stockage",
"description": "Sauvegardez et restaurez vos données, gérez le stockage local et la synchronisation."
},
"sidepanel": {
"title": "Personnalisation du Panneau Latéral",
"description": "Personnalisez la disposition et la visibilité des cartes dans l'interface du panneau latéral."
"title": "Personnalisation du panneau latéral",
"description": "Personnalisez la disposition et la visibilité des cartes du panneau latéral."
},
"theme": {
"title": "Préférences de Thème",
"description": "Choisissez votre thème préféré et configurez les paramètres de mode sombre/clair."
"title": "Préférences de thème",
"description": "Choisissez votre thème préféré et configurez le mode clair/sombre."
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date, le format de l'heure et les préférences régionales."
"description": "Personnalisez la langue, le format de date et d'heure et les préférences régionales."
},
"advanced": {
"title": "Paramètres Avancés",
"description": "Configurez les webhooks, les mises à jour en temps réel et d'autres fonctionnalités avancées pour améliorer la productivité."
"title": "Paramètres avancés",
"description": "Configurez les webhooks, les mises à jour en temps réel et d'autres fonctionnalités avancées."
},
"developer": {
"title": "Paramètres Développeur",
"title": "Paramètres développeur",
"description": "Consultez les informations techniques sur les jetons d'authentification, les connexions SSE et les données de débogage."
},
"feedback": {
"title": "Envoyer un retour",
"description": "Dites-nous ce que vous pensez de Donetick ou demandez une fonctionnalité."
},
"bugReport": {
"title": "Signaler un bug",
"description": "Quelque chose ne fonctionne pas ? Envoyez-nous les détails avec un instantané technique."
}
}
},
"profile": {
"title": "Paramètres du profil",
"description": "Mettez à jour votre nom affiché et votre photo de profil.",
"photoUpdated": "Photo mise à jour",
"photoUpdatedMessage": "Votre photo de profil a été mise à jour avec succès !",
"uploadFailed": "Échec de l'envoi",
"uploadFailedMessage": "Impossible d'envoyer votre photo. Veuillez réessayer.",
"profileUpdated": "Profil mis à jour",
"profileUpdatedMessage": "Les informations de votre profil ont été enregistrées avec succès !",
"updateFailed": "Échec de la mise à jour",
"updateFailedMessage": "Impossible de mettre à jour votre profil. Vérifiez votre connexion et réessayez.",
"changePhoto": "Changer de photo",
"editPhoto": "Modifier la photo de profil",
"displayName": "Nom affiché",
"displayNamePlaceholder": "Saisissez votre nom affiché",
"timezone": "Fuseau horaire",
"timezonePlaceholder": "Sélectionnez votre fuseau horaire",
"save": "Enregistrer",
"cancel": "Annuler"
},
"circleSettings": {
"title": "Paramètres du cercle",
"description": "Votre compte est automatiquement rattaché à un cercle lorsque vous en créez un ou que vous en rejoignez un. Invitez facilement vos proches en partageant le code ou le lien du cercle ci-dessous. Vous recevrez une notification ici lorsque quelqu'un demandera à rejoindre votre cercle.",
"memberOf": "Vous faites partie de {{name}}",
"yourCircleCode": "Votre code de cercle est :",
"copyCode": "Copier le code",
"shareInvite": "Partager l'invitation",
"codeCopied": "Code copié dans le presse-papiers",
"linkCopied": "Lien d'invitation copié dans le presse-papiers",
"myCircle": "mon cercle",
"shareTitle": "Rejoignez {{name}} sur Donetick",
"shareText": "J'aimerais vous inviter à rejoindre {{name}} sur Donetick.",
"shareDialogTitle": "Partager l'invitation au cercle",
"leave": "Quitter le cercle",
"leaveConfirmTitle": "Quitter le cercle",
"leaveConfirmMessage": "Voulez-vous vraiment quitter votre cercle ?",
"leaveConfirmButton": "Quitter",
"leftCircle": "Vous avez quitté le cercle",
"leaveFailed": "Impossible de quitter le cercle",
"circleMembers": "Membres du cercle",
"you": "(Vous)",
"pendingApproval": "En attente d'approbation",
"joinedOn": "A rejoint le {{date}}",
"requestedToJoin": "Demande d'adhésion {{date}}",
"roles": {
"member": "Membre",
"memberDescription": "Un membre ordinaire du cercle",
"manager": "Gestionnaire",
"managerDescription": "Peut se faire passer pour d'autres personnes et agir en leur nom",
"admin": "Administrateur",
"adminDescription": "Accès complet au cercle"
},
"roleUpdateFailed": "Impossible de mettre à jour le rôle",
"removeMemberTitle": "Retirer le membre",
"removeMemberMessage": "Voulez-vous vraiment retirer {{name}} de votre cercle ?",
"memberRemoved": "Membre retiré avec succès",
"circleMemberRequests": "Demandes d'adhésion au cercle",
"lastUpdated": "Dernière mise à jour : {{time}}",
"refreshing": "Actualisation…",
"refreshFailed": "Impossible d'actualiser les demandes d'adhésion",
"wantsToJoin": "{{name}} souhaite rejoindre votre cercle.",
"accept": "Accepter",
"acceptRequestTitle": "Accepter la demande d'adhésion",
"acceptRequestMessage": "Voulez-vous vraiment accepter {{name}} (identifiant : {{username}}) dans votre cercle ?",
"requestAccepted": "Demande acceptée avec succès",
"or": "ou",
"joinOtherDescription": "Vous souhaitez rejoindre le cercle de quelqu'un d'autre ? Demandez-lui son code de cercle ou son lien d'invitation. Saisissez le code ci-dessous pour le rejoindre.",
"enterCircleCode": "Saisissez le code du cercle :",
"enterCodePlaceholder": "Saisir le code",
"joinCircle": "Rejoindre le cercle",
"joinedPending": "Cercle rejoint avec succès, attendez que la personne propriétaire accepte votre demande.",
"alreadyMember": "Vous êtes déjà membre de ce cercle",
"joinFailed": "Impossible de rejoindre le cercle"
},
"accountSettings": {
"title": "Paramètres du compte",
"description": "Modifiez les paramètres de votre compte, votre formule ou votre mot de passe",
"accountType": "Type de compte : {{type}}",
"free": "Gratuit",
"plus": "Plus",
"plusUntil": "Plus (jusqu'au {{date}})",
"activeDescription": "Vous êtes actuellement abonné à la formule Plus. Votre abonnement sera renouvelé le {{date}}.",
"cancelledDescription": "Vous avez résilié votre abonnement. Votre compte repassera à la formule Gratuite le {{date}}.",
"freeDescription": "Vous utilisez actuellement la formule Gratuite. Passez à Plus pour débloquer plus de fonctionnalités.",
"upgrade": "Passer à Plus",
"cancel": "Résilier",
"password": "Mot de passe :",
"changePassword": "Changer le mot de passe",
"passwordChanged": "Mot de passe modifié avec succès",
"passwordChangeFailed": "Échec du changement de mot de passe",
"dangerZone": "Zone sensible",
"dangerZoneDescription": "Une fois votre compte supprimé, il n'y a pas de retour en arrière. Soyez-en bien sûr.",
"deleteAccount": "Supprimer le compte",
"accountDeleted": "Compte supprimé avec succès",
"subscriptionCancelled": "Abonnement résilié",
"subscriptionCancelFailed": "Impossible de résilier l'abonnement",
"purchase": {
"success": "Achat réussi ! Redémarrez l'application pour accéder aux fonctionnalités Plus.",
"storeConnection": "Problème de connexion au store. Vérifiez votre réseau et réessayez.",
"notAllowed": "Les achats ne sont pas autorisés sur cet appareil. Vérifiez les restrictions de votre appareil.",
"unavailable": "Cet abonnement n'est pas disponible. Veuillez réessayer plus tard.",
"alreadyProcessed": "Cet achat a déjà été traité. Si vous pensez qu'il s'agit d'une erreur, contactez le support.",
"receiptMissing": "Reçu d'achat manquant. Veuillez réessayer l'achat.",
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
"invalidReceipt": "Reçu d'achat invalide. Contactez le support si le problème persiste.",
"pending": "Le paiement est en attente d'approbation. Vous aurez accès dès qu'il sera approuvé.",
"failed": "Échec de l'achat : {{error}}. Réessayez ou contactez le support.",
"unknownError": "Erreur inconnue"
}
},
"subaccounts": {
"title": "Comptes gérés",
"description": "Gérez les sous-comptes. Leurs utilisateurs peuvent se connecter et accomplir les tâches qui leur sont assignées.",
"notParentTitle": "Gestion des sous-comptes",
"notParentMessage": "Seuls les comptes principaux peuvent gérer des sous-comptes.",
"freePlanNotice": "La formule Gratuite permet 1 sous-compte. Passez à Plus pour en avoir jusqu'à 5.",
"count": "Sous-comptes ({{count}})",
"add": "Ajouter un sous-compte",
"loading": "Chargement des sous-comptes…",
"emptyTitle": "Aucun sous-compte",
"emptyDescription": "Créez des sous-comptes pour que les membres de l'équipe puissent se connecter et accomplir leurs tâches.",
"addFirst": "Ajouter votre premier sous-compte",
"username": "Identifiant : {{username}}",
"created": "Créé le : {{date}}",
"changePassword": "Changer le mot de passe",
"deleteAccount": "Supprimer le compte",
"createdSuccess": "Le sous-compte « {{name}} » a été créé avec succès !",
"createFailed": "Impossible de créer le sous-compte : {{error}}",
"createFailedGeneric": "Impossible de créer le sous-compte",
"passwordUpdated": "Mot de passe du sous-compte mis à jour avec succès",
"passwordUpdateFailed": "Impossible de mettre à jour le mot de passe : {{error}}",
"passwordUpdateFailedGeneric": "Impossible de mettre à jour le mot de passe",
"deleteConfirmTitle": "Supprimer le sous-compte",
"deleteConfirmMessage": "Voulez-vous vraiment supprimer le sous-compte « {{name}} » ? Cette action est irréversible.",
"deleted": "Sous-compte « {{name}} » supprimé avec succès",
"deleteFailed": "Impossible de supprimer le sous-compte : {{error}}",
"deleteFailedGeneric": "Impossible de supprimer le sous-compte",
"howItWorksTitle": "Comment fonctionnent les comptes gérés",
"howItWorks1": "Les comptes gérés sont créés par le compte principal ; ils sont destinés aux personnes dont vous voulez pouvoir supprimer le compte et réinitialiser le mot de passe.",
"howItWorks2": "Les sous-comptes peuvent se connecter avec leur propre identifiant et mot de passe.",
"howItWorks3": "Les comptes gérés peuvent accomplir des tâches mais disposent de permissions administratives limitées",
"howItWorks4": "Les comptes gérés sont automatiquement ajoutés à votre cercle"
},
"notifications": {
"title": "Paramètres de notification",
"deviceSection": "Notifications de l'appareil",
"deviceSectionDescription": "Gérez les notifications de votre appareil",
"deviceLabel": "Notification de l'appareil",
"deviceHelper": "Recevez une notification sur votre appareil lorsqu'une tâche arrive à échéance",
"mobileOnly": "Cette fonctionnalité n'est disponible que sur mobile",
"testNotification": "Notification de test",
"testNotificationBody": "Une tâche arrive bientôt à échéance",
"dueTitle": "Notification d'échéance",
"dueLabel": "Notification lorsque la tâche arrive à échéance",
"preDueTitle": "Notification avant échéance",
"preDueLabel": "Notification quelques heures avant l'échéance de la tâche",
"overdueTitle": "Notification de retard",
"overdueLabel": "Notification lorsque la tâche est en retard",
"pushLabel": "Notifications push",
"pushHelper": "Recevez les rappels, annonces et attributions de tâches par notification push",
"registeredDevices": "Appareils enregistrés ({{count}}/5)",
"registeredDevicesDescription": "Appareils enregistrés pour recevoir les notifications push de votre compte",
"currentDevice": "Appareil actuel : {{platform}} {{model}}",
"currentDeviceNotRegistered": "Cet appareil n'est pas enregistré pour les notifications push",
"limitReached": "Limite atteinte",
"registerDevice": "Enregistrer l'appareil",
"unknownDevice": "Appareil inconnu",
"deviceCreatedAt": "Créé le : {{date}}",
"noDevices": "Aucun appareil enregistré pour les notifications push",
"customSection": "Notification personnalisée",
"customSectionDescription": "Notification via une autre plateforme comme Telegram ou Pushover",
"customLabel": "Notification personnalisée",
"customHelper": "Recevoir les notifications sur une autre plateforme",
"targetNone": "Aucune",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Vous devez d'abord envoyer un message au bot pour que les notifications Telegram fonctionnent",
"telegramBotHelpAfter": "pour démarrer une conversation",
"clickHere": "Cliquez ici",
"chatId": "ID de discussion",
"chatIdPlaceholder": "ID utilisateur / ID de discussion",
"telegramChatIdHelpBefore": "Si vous ne connaissez pas votre ID de discussion, démarrez une conversation avec userinfobot : il vous l'enverra.",
"telegramChatIdHelpAfter": "pour démarrer une conversation avec userinfobot",
"userKey": "Clé utilisateur",
"userKeyPlaceholder": "ID utilisateur",
"chatIdRequired": "L'ID de discussion est obligatoire",
"chatIdInvalid": "ID de discussion invalide",
"userKeyRequired": "La clé utilisateur est obligatoire",
"targetUpdated": "Destination de notification mise à jour",
"targetUpdateFailed": "Erreur lors de la mise à jour de la destination de notification : {{error}}",
"deviceRegistered": "Appareil enregistré avec succès pour les notifications push.",
"deviceLimitTitle": "Limite d'appareils atteinte",
"deviceLimitMessage": "Vous avez atteint la limite de 5 appareils enregistrés. Retirez un appareil avant d'enregistrer celui-ci.",
"registrationFailedTitle": "Échec de l'enregistrement",
"registrationFailedMessage": "Impossible d'enregistrer l'appareil automatiquement. Veuillez réessayer.",
"permissionRequiredTitle": "Autorisation requise",
"permissionRequiredMessage": "L'autorisation de notifications push est nécessaire pour enregistrer cet appareil.",
"registrationInitiatedTitle": "Enregistrement lancé",
"registrationInitiatedMessage": "L'enregistrement des notifications push a été lancé. L'appareil sera enregistré automatiquement.",
"registerDeviceFailed": "Impossible d'enregistrer l'appareil. Veuillez réessayer.",
"permissionDeniedTitle": "Autorisation de notification refusée",
"permissionDeniedMessage": "Vous avez refusé les autorisations de notification. Vous pourrez les activer plus tard dans les réglages de votre appareil.",
"pushPermissionDeniedTitle": "Autorisation de notifications push refusée",
"pushPermissionDeniedMessage": "Les notifications push ont été désactivées. Vous pouvez les activer dans les réglages de votre appareil si besoin.",
"unregisterFailed": "Impossible de désenregistrer l'appareil"
},
"mfa": {
"title": "Authentification multifacteur",
"description": "Renforcez la sécurité de votre compte avec l'authentification multifacteur (MFA). Une fois activée, vous devrez saisir un code de vérification de votre application d'authentification en plus de votre mot de passe lors de la connexion.",
"twoFactor": "Authentification à deux facteurs",
"enabledSubtitle": "Votre compte est protégé par la 2FA",
"disabledSubtitle": "Sécurisez votre compte avec une application d'authentification",
"enable": "Activer",
"disable": "Désactiver",
"enabledSuccess": "La MFA a été activée avec succès !",
"disabledSuccess": "La MFA a été désactivée avec succès !",
"errors": {
"qrGenerationFailed": "Impossible de générer le code QR",
"invalidResponse": "Réponse invalide du serveur. Code QR ou clé secrète manquant.",
"notFound": "Point de terminaison de configuration MFA introuvable. Cette fonctionnalité n'est peut-être pas encore disponible.",
"unauthorized": "Non autorisé. Veuillez vous reconnecter.",
"serverError": "Erreur serveur. Veuillez réessayer plus tard.",
"setupFailed": "Échec de la configuration de la MFA ({{status}}). Veuillez réessayer.",
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
"invalidCode": "Code de vérification invalide. Veuillez réessayer.",
"confirmFailed": "Impossible de confirmer la MFA. Veuillez réessayer.",
"disableFailed": "Impossible de désactiver la MFA. Veuillez réessayer."
},
"setup": {
"title": "Configurer l'authentification multifacteur",
"addedAccount": "J'ai ajouté le compte",
"back": "Retour",
"verifyAndEnable": "Vérifier et activer",
"savedBackupCodes": "J'ai enregistré mes codes de secours",
"step1Label": "Étape 1 :",
"step1": "Scannez le code QR ci-dessous avec votre application d'authentification (Google Authenticator, Authy, etc.)",
"qrAlt": "Code QR MFA",
"qrFailed": "Le code QR n'a pas pu être généré. Réessayez ou utilisez la clé de saisie manuelle ci-dessous.",
"manualKey": "Clé de saisie manuelle :",
"step2Label": "Étape 2 :",
"step2": "Saisissez le code de vérification à 6 chiffres de votre application d'authentification",
"codePlaceholder": "Saisir le code à 6 chiffres",
"successTitle": "MFA activée avec succès !",
"backupCodesTitle": "Conservez ces codes de secours en lieu sûr",
"backupCodesDescription": "Ces codes vous permettent d'accéder à votre compte si vous perdez votre appareil d'authentification. Chaque code ne peut être utilisé qu'une seule fois."
},
"disableModal": {
"title": "Désactiver l'authentification multifacteur",
"warning": "Désactiver la MFA rendra votre compte moins sûr. Voulez-vous vraiment continuer ?",
"prompt": "Saisissez un code de vérification de votre application d'authentification pour confirmer :",
"confirm": "Désactiver la MFA"
},
"backupCodesModal": {
"title": "Nouveaux codes de secours",
"warning": "Vos anciens codes de secours ne sont plus valides. Conservez ces nouveaux codes en lieu sûr. Chaque code ne peut être utilisé qu'une seule fois."
}
},
"apiTokens": {
"title": "Jetons d'API",
"accessToken": "Jeton d'accès",
"description": "Créez un jeton à utiliser avec l'API pour mettre à jour les éléments qui déclenchent des tâches",
"plusNotice": "Les jetons d'API ne sont pas disponibles dans la formule de base. Passez à Plus pour générer des jetons d'API, vous intégrer à des systèmes externes et automatiser vos tâches.",
"showToken": "Afficher le jeton",
"hideToken": "Masquer le jeton",
"removeTitle": "Retirer le jeton",
"removeMessage": "Voulez-vous vraiment retirer {{name}} ?",
"removedTitle": "Retiré",
"removedMessage": "Le jeton d'API a été retiré",
"tokenCopied": "Jeton copié dans le presse-papiers",
"generateNew": "Générer un nouveau jeton",
"nameModalTitle": "Donnez un nom à votre nouveau jeton, quelque chose qui vous permettra de le reconnaître.",
"generateToken": "Générer le jeton"
},
"storage": {
"title": "Paramètres de stockage",
"serverTitle": "Utilisation du stockage serveur",
"serverDescription": "Il s'agit de l'espace occupé par votre compte sur nos serveurs (fichiers, images et données que vous avez envoyés).",
"usagePlaceholder": "-- Mo utilisés / -- Mo au total (--)",
"usage": "{{used}} Mo utilisés / {{total}} Mo au total ({{percent}} %)",
"basicPlanNotice": "Le stockage serveur n'est pas disponible dans la formule de base. Passez à Plus pour suivre votre utilisation.",
"localTitleApp": "Stockage local et cache de l'application",
"localTitleBrowser": "Stockage local et cache du navigateur",
"localDescription": "Ce sont les données enregistrées localement dans votre navigateur pour un accès plus rapide. Les effacer n'affectera pas vos données serveur, mais pourra vous déconnecter.",
"clearLocal": "Effacer tout le stockage local et le cache",
"clearLocalTitle": "Effacer tout le stockage local",
"clearLocalMessage": "Voulez-vous vraiment effacer votre stockage local et le cache ? Toutes vos données seront supprimées de ce navigateur et vous devrez vous reconnecter.",
"clearAll": "Tout effacer",
"appPreferences": "Préférences de l'application",
"deviceOnly": "Appareil uniquement",
"appPreferencesDescription": "Ce sont les préférences et réglages enregistrés localement sur votre appareil par l'application. Les effacer réinitialisera les réglages de l'application et pourra vous déconnecter, sans affecter vos données serveur.",
"clearPreferences": "Effacer les préférences de l'application",
"clearPreferencesTitle": "Effacer les préférences de l'application",
"clearPreferencesMessage": "Voulez-vous vraiment effacer toutes les préférences de l'application ? Vos réglages seront réinitialisés et vous devrez peut-être vous reconnecter."
},
"sidepanel": {
"title": "Personnalisation du panneau latéral",
"heading": "Paramètres du panneau latéral",
"description": "Choisissez les cartes qui apparaissent dans le panneau latéral et leur ordre. Faites-les glisser pour les réorganiser ou modifiez leur visibilité.",
"resetToDefaults": "Réinitialiser par défaut",
"resetHelper": "La visibilité et l'ordre par défaut de toutes les cartes seront rétablis.",
"cards": {
"welcome": {
"name": "Changement d'utilisateur",
"description": "Permet aux administrateurs et gestionnaires de voir les tâches d'autres personnes"
},
"smartInsights": {
"name": "Aperçus intelligents",
"description": "Actions rapides basées sur vos tâches"
},
"assignees": {
"name": "Tâches par personne assignée",
"description": "Regroupe les tâches selon la personne à qui elles sont assignées"
},
"calendar": {
"name": "Vue calendrier",
"description": "Affiche les tâches au format calendrier"
},
"activities": {
"name": "Activités récentes",
"description": "Affiche les tâches récemment terminées et les activités"
},
"weeklyGoals": {
"name": "Objectifs hebdomadaires",
"description": "Affiche la progression hebdomadaire et les statistiques de la famille"
}
}
},
"theme": {
"title": "Préférences de thème",
"description": "Choisissez l'apparence du site. Sélectionnez un thème fixe ou synchronisez-le avec votre système pour basculer automatiquement entre thème clair et sombre.",
"themeMode": "Mode de thème",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date et les préférences régionales de votre compte.",
"language": "Langue",
"languageDescription": "Sélectionnez votre langue préférée",
"rtlNotice": "Cette langue s'écrit de droite à gauche (RTL)",
"dateFormat": "Format de date",
"dateFormatDescription": "Choisissez comment les dates s'affichent dans toute l'application",
"timeFormat": "Format d'heure",
"timeFormatDescription": "Sélectionnez le format 12 ou 24 heures",
"preview": "Aperçu : {{value}}",
"12hour": "12 heures (AM/PM)",
"24hour": "24 heures",
"firstDayOfWeek": "Premier jour de la semaine",
"firstDayOfWeekDescription": "Choisissez le jour qui commence votre semaine",
"sunday": "Dimanche",
"monday": "Lundi",
"saturday": "Samedi",
"formats": {
"mdy": "MM/JJ/AAAA (États-Unis)",
"dmy": "JJ/MM/AAAA (Europe)",
"ymd": "AAAA-MM-JJ (ISO)",
"long": "Format long (ex. : 1 janvier 2024)",
"short": "Format court (ex. : 1 janv. 2024)"
}
},
"advanced": {
"title": "Paramètres avancés",
"description": "Configurez des fonctionnalités avancées comme les webhooks et les mises à jour en temps réel pour gagner en productivité.",
"offlineTitle": "Mode hors ligne",
"offlineDescription": "Continuez à utiliser Donetick hors ligne sur cet appareil ou navigateur. Vos modifications sont enregistrées localement et synchronisées dès votre retour en ligne.",
"offlineToggle": "Activer le mode hors ligne",
"offlineHelper": "Le désactiver supprime les modifications hors ligne non synchronisées et les données enregistrées sur cet appareil ou navigateur.",
"offlineEnabled": "Mode hors ligne activé pour cet appareil/navigateur",
"offlineDisabled": "Mode hors ligne désactivé et données locales effacées",
"offlineDisabledPartial": "Le mode hors ligne a été désactivé, mais certaines données locales peuvent subsister",
"offlineDisableTitle": "Désactiver le mode hors ligne",
"offlineDisableMessage": "Désactiver le mode hors ligne supprimera les modifications non synchronisées et les données hors ligne enregistrées sur cet appareil ou navigateur. Voulez-vous continuer ?",
"offlineDisableConfirm": "Désactiver et effacer les données",
"webhookTitle": "Intégration webhook",
"webhookDescription": "Les webhooks vous permettent d'envoyer des notifications en temps réel à d'autres services lorsqu'un événement survient dans votre cercle. Configurez une URL de webhook pour recevoir des mises à jour en temps réel.",
"webhookPlusNotice": "Les notifications par webhook ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des mises à jour en temps réel via webhooks.",
"webhookToggle": "Activer le webhook",
"webhookHelper": "Activez les notifications webhook pour les mises à jour des tâches et des éléments.",
"webhookURL": "URL du webhook",
"webhookUpdated": "URL du webhook mise à jour avec succès",
"webhookUpdateFailed": "Impossible de mettre à jour l'URL du webhook",
"realtimeTitle": "Mises à jour en temps réel",
"realtimeDescription": "Configurez la façon dont vous recevez les mises à jour en direct lorsque les tâches et activités changent dans votre cercle.",
"realtime": {
"toggleLabel": "Activer les mises à jour en temps réel",
"title": "Mises à jour en temps réel",
"subtitle": "Recevez des notifications instantanées lorsque les tâches sont mises à jour",
"statusLabel": "Statut :",
"basicPlan": "Les mises à jour en temps réel ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des notifications instantanées lorsque les tâches sont mises à jour.",
"disabled": "Les mises à jour en temps réel sont désactivées. Activez-les pour voir les changements en direct lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches.",
"connected": "Les mises à jour en temps réel fonctionnent. Vous verrez les changements en direct lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches.",
"connecting": "Connexion aux mises à jour en temps réel…",
"errored": "Les mises à jour en temps réel sont activées mais ne fonctionnent pas : {{error}}",
"notConnected": "Les mises à jour en temps réel sont activées mais non connectées actuellement.",
"basicPlanNotice": "Les mises à jour en temps réel ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des notifications instantanées lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Déconnexion",
"version": "Version",
"navigation": {
"search": "Recherche",
"allTasks": "Toutes les Tâches",
"archived": "Archivées",
"things": "Objets",
@@ -30,6 +31,44 @@
"points": "Points",
"settings": "Paramètres"
},
"search": {
"title": "Recherche",
"placeholder": "Rechercher dans Donetick",
"inputAriaLabel": "Rechercher des tâches, lhistorique, des projets, des étiquettes et des paramètres",
"deviceNote": "Recherche dans le contenu disponible sur cet appareil",
"escape": "Échap",
"recent": "Récents",
"empty": {
"title": "Aucune correspondance directe",
"subtitle": "Vous pouvez tout de même filtrer la liste des tâches avec cette recherche."
},
"groups": {
"tasks": "Tâches",
"history": "Notes",
"projects": "Projets",
"labels": "Étiquettes",
"people": "Personnes",
"settings": "Paramètres",
"actions": "Actions rapides"
},
"actions": {
"quickAction": "Action rapide",
"navigation": "Navigation",
"createTask": "Créer une tâche",
"viewAllTasks": "Voir toutes les tâches",
"viewArchivedTasks": "Voir les tâches archivées",
"openSettings": "Ouvrir les paramètres",
"filterTasks": "Afficher les tâches correspondant à « {{query}} »",
"filterTasksSubtitle": "Filtrer la liste des tâches"
},
"footer": {
"navigate": "Naviguer",
"open": "Ouvrir",
"results_one": "{{count}} résultat",
"results_other": "{{count}} résultats",
"typeToSearch": "Saisissez du texte pour rechercher"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,114 +1,27 @@
{
"title": "Paramètres",
"circleSettings": {
"title": "Paramètres du cercle",
"description": "Votre compte est automatiquement connecté à un Cercle lorsque vous en créez un ou en rejoignez un. Invitez facilement des amis en partageant le code unique du Cercle ou le lien ci-dessous.",
"circleCode": "Code du Cercle",
"copyCode": "Copier le Code",
"copyLink": "Copier le Lien",
"codeCopied": "Code du cercle copié !",
"linkCopied": "Lien copié !",
"joinCircle": "Rejoindre un Cercle",
"joinCirclePlaceholder": "Entrer le Code du Cercle",
"join": "Rejoindre",
"leave": "Quitter le Cercle",
"leaveConfirmTitle": "Quitter le Cercle",
"leaveConfirmMessage": "Êtes-vous sûr de vouloir quitter ce cercle ?",
"circleMembers": "Membres du Cercle",
"circleMemberRequests": "Demandes de Membres du Cercle",
"admin": "Administrateur",
"member": "Membre",
"pending": "En attente",
"accept": "Accepter",
"reject": "Rejeter",
"makeAdmin": "Nommer Administrateur",
"makeMember": "Nommer Membre",
"remove": "Supprimer",
"webhookURL": "URL du Webhook",
"webhookDescription": "Entrez une URL de Webhook pour recevoir des notifications pour les événements du cercle",
"webhookPlaceholder": "https://votre-url-webhook.com"
},
"accountSettings": {
"title": "Paramètres du Compte",
"subscription": "Abonnement",
"subscriptionStatus": "Plan Actuel",
"free": "Gratuit",
"plus": "Plus",
"upgrade": "Mettre à Niveau",
"cancel": "Annuler",
"changePassword": "Changer le Mot de Passe",
"password": "Mot de passe",
"dangerZone": "Zone Dangereuse",
"dangerZoneDescription": "Une fois votre compte supprimé, il n'y a pas de retour en arrière. Veuillez être certain.",
"deleteAccount": "Supprimer le Compte"
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date et les préférences régionales pour votre compte.",
"language": "Langue",
"languageDescription": "Sélectionnez votre langue préférée",
"dateFormat": "Format de Date",
"dateFormatDescription": "Choisissez comment les dates doivent être affichées dans l'application",
"timeFormat": "Format de l'Heure",
"timeFormatDescription": "Sélectionnez le format 12 heures ou 24 heures",
"12hour": "12 heures (AM/PM)",
"24hour": "24 heures",
"firstDayOfWeek": "Premier Jour de la Semaine",
"firstDayOfWeekDescription": "Sélectionnez quel jour commence votre semaine",
"sunday": "Dimanche",
"monday": "Lundi",
"saturday": "Samedi",
"formats": {
"mdy": "MM/JJ/AAAA (États-Unis)",
"dmy": "JJ/MM/AAAA (Europe)",
"ymd": "AAAA-MM-JJ (ISO)",
"long": "Format long (ex., 1 janvier 2024)",
"short": "Format court (ex., 1 janv. 2024)"
}
},
"sidepanel": {
"title": "Personnalisation du Panneau Latéral",
"description": "Personnalisez la disposition et la visibilité des cartes dans le panneau latéral. Cette section n'est disponible que sur les grands écrans comme les tablettes et les ordinateurs de bureau."
},
"theme": {
"title": "Préférences de thème",
"description": "Choisissez comment le site vous apparaît. Sélectionnez un thème unique ou synchronisez avec votre système pour basculer automatiquement entre les thèmes jour et nuit.",
"themeMode": "Mode de thème",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
},
"notifications": {
"settingsSaved": "Paramètres enregistrés avec succès",
"settingsSaveFailed": "Échec de l'enregistrement des paramètres",
"invalidWebhook": "URL de webhook invalide"
},
"profile": {
"title": "Paramètres du Profil",
"description": "Mettez à jour votre nom d'affichage et votre photo de profil.",
"photoUpdated": "Photo Mise à Jour",
"photoUpdatedMessage": "Votre photo de profil a été mise à jour avec succès !",
"uploadFailed": "Échec du Téléchargement",
"uploadFailedMessage": "Échec du téléchargement de votre photo. Veuillez réessayer.",
"profileUpdated": "Profil Mis à Jour",
"profileUpdatedMessage": "Vos informations de profil ont été enregistrées avec succès !",
"updateFailed": "Échec de la Mise à Jour",
"updateFailedMessage": "Impossible de mettre à jour votre profil. Veuillez vérifier votre connexion et réessayer.",
"changePhoto": "Changer la Photo",
"displayName": "Nom d'Affichage",
"displayNamePlaceholder": "Entrez votre nom d'affichage",
"timezone": "Fuseau Horaire",
"timezonePlaceholder": "Sélectionnez votre fuseau horaire",
"common": {
"save": "Enregistrer",
"cancel": "Annuler"
"cancel": "Annuler",
"confirm": "Confirmer",
"remove": "Retirer",
"delete": "Supprimer",
"refresh": "Actualiser",
"loading": "Chargement…",
"on": "Activé",
"off": "Désactivé",
"error": "Erreur",
"success": "Succès",
"plusFeature": "Fonctionnalité Plus",
"earlyAccess": "Accès anticipé"
},
"overview": {
"title": "Paramètres",
"subtitle": "Personnalisez votre expérience et gérez les préférences de votre compte",
"upgrade": {
"title": "Passer à Plus",
"description": "Débloquez des fonctionnalités puissantes pour améliorer votre productivité",
"button": "Mettre à Niveau Maintenant",
"description": "Débloquez des fonctionnalités puissantes pour gagner en productivité",
"button": "Passer à Plus",
"features": {
"richText": "Descriptions en texte enrichi",
"notifications": "Notifications de tâches",
@@ -118,61 +31,464 @@
},
"sections": {
"profile": {
"title": "Paramètres du Profil",
"description": "Mettez à jour vos informations de profil, photo, nom d'affichage et préférences de fuseau horaire."
"title": "Paramètres du profil",
"description": "Mettez à jour vos informations de profil, votre photo, votre nom affiché et votre fuseau horaire."
},
"circle": {
"title": "Paramètres du Cercle",
"description": "Gérez votre cercle, invitez des membres et gérez les demandes d'adhésion."
"title": "Paramètres du cercle",
"description": "Gérez votre cercle, invitez des membres et traitez les demandes d'adhésion."
},
"account": {
"title": "Paramètres du Compte",
"description": "Gérez votre abonnement, changez le mot de passe et les options de suppression de compte."
"title": "Paramètres du compte",
"description": "Gérez votre abonnement, changez votre mot de passe et supprimez votre compte."
},
"subaccounts": {
"title": "Comptes Gérés",
"description": "Créez et gérez des sous-comptes pour vous connecter et accomplir les tâches assignées."
"title": "Comptes gérés",
"description": "Créez et gérez des sous-comptes pouvant se connecter et accomplir les tâches assignées."
},
"notifications": {
"title": "Notifications",
"description": "Configurez les notifications push, les alertes par e-mail et les cibles de notification pour les tâches."
"description": "Configurez les notifications push, les alertes par e-mail et les destinations de notification des tâches."
},
"mfa": {
"title": "Authentification Multi-Facteurs",
"description": "Ajoutez une couche de sécurité supplémentaire avec MFA en utilisant des applications d'authentification."
"title": "Authentification multifacteur",
"description": "Ajoutez une couche de sécurité supplémentaire avec la MFA via une application d'authentification."
},
"apitokens": {
"title": "Jetons API",
"title": "Jetons d'API",
"description": "Générez et gérez des jetons d'accès pour les intégrations tierces et l'accès à l'API."
},
"storage": {
"title": "Paramètres de Stockage",
"description": "Sauvegardez et restaurez vos données, gérez le stockage local et les préférences de synchronisation."
"title": "Paramètres de stockage",
"description": "Sauvegardez et restaurez vos données, gérez le stockage local et la synchronisation."
},
"sidepanel": {
"title": "Personnalisation du Panneau Latéral",
"description": "Personnalisez la disposition et la visibilité des cartes dans l'interface du panneau latéral."
"title": "Personnalisation du panneau latéral",
"description": "Personnalisez la disposition et la visibilité des cartes du panneau latéral."
},
"theme": {
"title": "Préférences de Thème",
"description": "Choisissez votre thème préféré et configurez les paramètres de mode sombre/clair."
"title": "Préférences de thème",
"description": "Choisissez votre thème préféré et configurez le mode clair/sombre."
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date, le format de l'heure et les préférences régionales."
"description": "Personnalisez la langue, le format de date et d'heure et les préférences régionales."
},
"advanced": {
"title": "Paramètres Avancés",
"description": "Configurez les webhooks, les mises à jour en temps réel et d'autres fonctionnalités avancées pour améliorer la productivité."
"title": "Paramètres avancés",
"description": "Configurez les webhooks, les mises à jour en temps réel et d'autres fonctionnalités avancées."
},
"developer": {
"title": "Paramètres Développeur",
"title": "Paramètres développeur",
"description": "Consultez les informations techniques sur les jetons d'authentification, les connexions SSE et les données de débogage."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "Envoyer un retour",
"description": "Dites-nous ce que vous pensez de Donetick ou demandez une fonctionnalité."
},
"bugReport": {
"title": "Signaler un bug",
"description": "Quelque chose ne fonctionne pas ? Envoyez-nous les détails avec un instantané technique."
}
}
},
"profile": {
"title": "Paramètres du profil",
"description": "Mettez à jour votre nom affiché et votre photo de profil.",
"photoUpdated": "Photo mise à jour",
"photoUpdatedMessage": "Votre photo de profil a été mise à jour avec succès !",
"uploadFailed": "Échec de l'envoi",
"uploadFailedMessage": "Impossible d'envoyer votre photo. Veuillez réessayer.",
"profileUpdated": "Profil mis à jour",
"profileUpdatedMessage": "Les informations de votre profil ont été enregistrées avec succès !",
"updateFailed": "Échec de la mise à jour",
"updateFailedMessage": "Impossible de mettre à jour votre profil. Vérifiez votre connexion et réessayez.",
"changePhoto": "Changer de photo",
"editPhoto": "Modifier la photo de profil",
"displayName": "Nom affiché",
"displayNamePlaceholder": "Saisissez votre nom affiché",
"timezone": "Fuseau horaire",
"timezonePlaceholder": "Sélectionnez votre fuseau horaire",
"save": "Enregistrer",
"cancel": "Annuler"
},
"circleSettings": {
"title": "Paramètres du cercle",
"description": "Votre compte est automatiquement rattaché à un cercle lorsque vous en créez un ou que vous en rejoignez un. Invitez facilement vos proches en partageant le code ou le lien du cercle ci-dessous. Vous recevrez une notification ici lorsque quelqu'un demandera à rejoindre votre cercle.",
"memberOf": "Vous faites partie de {{name}}",
"yourCircleCode": "Votre code de cercle est :",
"copyCode": "Copier le code",
"shareInvite": "Partager l'invitation",
"codeCopied": "Code copié dans le presse-papiers",
"linkCopied": "Lien d'invitation copié dans le presse-papiers",
"myCircle": "mon cercle",
"shareTitle": "Rejoignez {{name}} sur Donetick",
"shareText": "J'aimerais vous inviter à rejoindre {{name}} sur Donetick.",
"shareDialogTitle": "Partager l'invitation au cercle",
"leave": "Quitter le cercle",
"leaveConfirmTitle": "Quitter le cercle",
"leaveConfirmMessage": "Voulez-vous vraiment quitter votre cercle ?",
"leaveConfirmButton": "Quitter",
"leftCircle": "Vous avez quitté le cercle",
"leaveFailed": "Impossible de quitter le cercle",
"circleMembers": "Membres du cercle",
"you": "(Vous)",
"pendingApproval": "En attente d'approbation",
"joinedOn": "A rejoint le {{date}}",
"requestedToJoin": "Demande d'adhésion {{date}}",
"roles": {
"member": "Membre",
"memberDescription": "Un membre ordinaire du cercle",
"manager": "Gestionnaire",
"managerDescription": "Peut se faire passer pour d'autres personnes et agir en leur nom",
"admin": "Administrateur",
"adminDescription": "Accès complet au cercle"
},
"roleUpdateFailed": "Impossible de mettre à jour le rôle",
"removeMemberTitle": "Retirer le membre",
"removeMemberMessage": "Voulez-vous vraiment retirer {{name}} de votre cercle ?",
"memberRemoved": "Membre retiré avec succès",
"circleMemberRequests": "Demandes d'adhésion au cercle",
"lastUpdated": "Dernière mise à jour : {{time}}",
"refreshing": "Actualisation…",
"refreshFailed": "Impossible d'actualiser les demandes d'adhésion",
"wantsToJoin": "{{name}} souhaite rejoindre votre cercle.",
"accept": "Accepter",
"acceptRequestTitle": "Accepter la demande d'adhésion",
"acceptRequestMessage": "Voulez-vous vraiment accepter {{name}} (identifiant : {{username}}) dans votre cercle ?",
"requestAccepted": "Demande acceptée avec succès",
"or": "ou",
"joinOtherDescription": "Vous souhaitez rejoindre le cercle de quelqu'un d'autre ? Demandez-lui son code de cercle ou son lien d'invitation. Saisissez le code ci-dessous pour le rejoindre.",
"enterCircleCode": "Saisissez le code du cercle :",
"enterCodePlaceholder": "Saisir le code",
"joinCircle": "Rejoindre le cercle",
"joinedPending": "Cercle rejoint avec succès, attendez que la personne propriétaire accepte votre demande.",
"alreadyMember": "Vous êtes déjà membre de ce cercle",
"joinFailed": "Impossible de rejoindre le cercle"
},
"accountSettings": {
"title": "Paramètres du compte",
"description": "Modifiez les paramètres de votre compte, votre formule ou votre mot de passe",
"accountType": "Type de compte : {{type}}",
"free": "Gratuit",
"plus": "Plus",
"plusUntil": "Plus (jusqu'au {{date}})",
"activeDescription": "Vous êtes actuellement abonné à la formule Plus. Votre abonnement sera renouvelé le {{date}}.",
"cancelledDescription": "Vous avez résilié votre abonnement. Votre compte repassera à la formule Gratuite le {{date}}.",
"freeDescription": "Vous utilisez actuellement la formule Gratuite. Passez à Plus pour débloquer plus de fonctionnalités.",
"upgrade": "Passer à Plus",
"cancel": "Résilier",
"password": "Mot de passe :",
"changePassword": "Changer le mot de passe",
"passwordChanged": "Mot de passe modifié avec succès",
"passwordChangeFailed": "Échec du changement de mot de passe",
"dangerZone": "Zone sensible",
"dangerZoneDescription": "Une fois votre compte supprimé, il n'y a pas de retour en arrière. Soyez-en bien sûr.",
"deleteAccount": "Supprimer le compte",
"accountDeleted": "Compte supprimé avec succès",
"subscriptionCancelled": "Abonnement résilié",
"subscriptionCancelFailed": "Impossible de résilier l'abonnement",
"purchase": {
"success": "Achat réussi ! Redémarrez l'application pour accéder aux fonctionnalités Plus.",
"storeConnection": "Problème de connexion au store. Vérifiez votre réseau et réessayez.",
"notAllowed": "Les achats ne sont pas autorisés sur cet appareil. Vérifiez les restrictions de votre appareil.",
"unavailable": "Cet abonnement n'est pas disponible. Veuillez réessayer plus tard.",
"alreadyProcessed": "Cet achat a déjà été traité. Si vous pensez qu'il s'agit d'une erreur, contactez le support.",
"receiptMissing": "Reçu d'achat manquant. Veuillez réessayer l'achat.",
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
"invalidReceipt": "Reçu d'achat invalide. Contactez le support si le problème persiste.",
"pending": "Le paiement est en attente d'approbation. Vous aurez accès dès qu'il sera approuvé.",
"failed": "Échec de l'achat : {{error}}. Réessayez ou contactez le support.",
"unknownError": "Erreur inconnue"
}
},
"subaccounts": {
"title": "Comptes gérés",
"description": "Gérez les sous-comptes. Leurs utilisateurs peuvent se connecter et accomplir les tâches qui leur sont assignées.",
"notParentTitle": "Gestion des sous-comptes",
"notParentMessage": "Seuls les comptes principaux peuvent gérer des sous-comptes.",
"freePlanNotice": "La formule Gratuite permet 1 sous-compte. Passez à Plus pour en avoir jusqu'à 5.",
"count": "Sous-comptes ({{count}})",
"add": "Ajouter un sous-compte",
"loading": "Chargement des sous-comptes…",
"emptyTitle": "Aucun sous-compte",
"emptyDescription": "Créez des sous-comptes pour que les membres de l'équipe puissent se connecter et accomplir leurs tâches.",
"addFirst": "Ajouter votre premier sous-compte",
"username": "Identifiant : {{username}}",
"created": "Créé le : {{date}}",
"changePassword": "Changer le mot de passe",
"deleteAccount": "Supprimer le compte",
"createdSuccess": "Le sous-compte « {{name}} » a été créé avec succès !",
"createFailed": "Impossible de créer le sous-compte : {{error}}",
"createFailedGeneric": "Impossible de créer le sous-compte",
"passwordUpdated": "Mot de passe du sous-compte mis à jour avec succès",
"passwordUpdateFailed": "Impossible de mettre à jour le mot de passe : {{error}}",
"passwordUpdateFailedGeneric": "Impossible de mettre à jour le mot de passe",
"deleteConfirmTitle": "Supprimer le sous-compte",
"deleteConfirmMessage": "Voulez-vous vraiment supprimer le sous-compte « {{name}} » ? Cette action est irréversible.",
"deleted": "Sous-compte « {{name}} » supprimé avec succès",
"deleteFailed": "Impossible de supprimer le sous-compte : {{error}}",
"deleteFailedGeneric": "Impossible de supprimer le sous-compte",
"howItWorksTitle": "Comment fonctionnent les comptes gérés",
"howItWorks1": "Les comptes gérés sont créés par le compte principal ; ils sont destinés aux personnes dont vous voulez pouvoir supprimer le compte et réinitialiser le mot de passe.",
"howItWorks2": "Les sous-comptes peuvent se connecter avec leur propre identifiant et mot de passe.",
"howItWorks3": "Les comptes gérés peuvent accomplir des tâches mais disposent de permissions administratives limitées",
"howItWorks4": "Les comptes gérés sont automatiquement ajoutés à votre cercle"
},
"notifications": {
"title": "Paramètres de notification",
"deviceSection": "Notifications de l'appareil",
"deviceSectionDescription": "Gérez les notifications de votre appareil",
"deviceLabel": "Notification de l'appareil",
"deviceHelper": "Recevez une notification sur votre appareil lorsqu'une tâche arrive à échéance",
"mobileOnly": "Cette fonctionnalité n'est disponible que sur mobile",
"testNotification": "Notification de test",
"testNotificationBody": "Une tâche arrive bientôt à échéance",
"dueTitle": "Notification d'échéance",
"dueLabel": "Notification lorsque la tâche arrive à échéance",
"preDueTitle": "Notification avant échéance",
"preDueLabel": "Notification quelques heures avant l'échéance de la tâche",
"overdueTitle": "Notification de retard",
"overdueLabel": "Notification lorsque la tâche est en retard",
"pushLabel": "Notifications push",
"pushHelper": "Recevez les rappels, annonces et attributions de tâches par notification push",
"registeredDevices": "Appareils enregistrés ({{count}}/5)",
"registeredDevicesDescription": "Appareils enregistrés pour recevoir les notifications push de votre compte",
"currentDevice": "Appareil actuel : {{platform}} {{model}}",
"currentDeviceNotRegistered": "Cet appareil n'est pas enregistré pour les notifications push",
"limitReached": "Limite atteinte",
"registerDevice": "Enregistrer l'appareil",
"unknownDevice": "Appareil inconnu",
"deviceCreatedAt": "Créé le : {{date}}",
"noDevices": "Aucun appareil enregistré pour les notifications push",
"customSection": "Notification personnalisée",
"customSectionDescription": "Notification via une autre plateforme comme Telegram ou Pushover",
"customLabel": "Notification personnalisée",
"customHelper": "Recevoir les notifications sur une autre plateforme",
"targetNone": "Aucune",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Vous devez d'abord envoyer un message au bot pour que les notifications Telegram fonctionnent",
"telegramBotHelpAfter": "pour démarrer une conversation",
"clickHere": "Cliquez ici",
"chatId": "ID de discussion",
"chatIdPlaceholder": "ID utilisateur / ID de discussion",
"telegramChatIdHelpBefore": "Si vous ne connaissez pas votre ID de discussion, démarrez une conversation avec userinfobot : il vous l'enverra.",
"telegramChatIdHelpAfter": "pour démarrer une conversation avec userinfobot",
"userKey": "Clé utilisateur",
"userKeyPlaceholder": "ID utilisateur",
"chatIdRequired": "L'ID de discussion est obligatoire",
"chatIdInvalid": "ID de discussion invalide",
"userKeyRequired": "La clé utilisateur est obligatoire",
"targetUpdated": "Destination de notification mise à jour",
"targetUpdateFailed": "Erreur lors de la mise à jour de la destination de notification : {{error}}",
"deviceRegistered": "Appareil enregistré avec succès pour les notifications push.",
"deviceLimitTitle": "Limite d'appareils atteinte",
"deviceLimitMessage": "Vous avez atteint la limite de 5 appareils enregistrés. Retirez un appareil avant d'enregistrer celui-ci.",
"registrationFailedTitle": "Échec de l'enregistrement",
"registrationFailedMessage": "Impossible d'enregistrer l'appareil automatiquement. Veuillez réessayer.",
"permissionRequiredTitle": "Autorisation requise",
"permissionRequiredMessage": "L'autorisation de notifications push est nécessaire pour enregistrer cet appareil.",
"registrationInitiatedTitle": "Enregistrement lancé",
"registrationInitiatedMessage": "L'enregistrement des notifications push a été lancé. L'appareil sera enregistré automatiquement.",
"registerDeviceFailed": "Impossible d'enregistrer l'appareil. Veuillez réessayer.",
"permissionDeniedTitle": "Autorisation de notification refusée",
"permissionDeniedMessage": "Vous avez refusé les autorisations de notification. Vous pourrez les activer plus tard dans les réglages de votre appareil.",
"pushPermissionDeniedTitle": "Autorisation de notifications push refusée",
"pushPermissionDeniedMessage": "Les notifications push ont été désactivées. Vous pouvez les activer dans les réglages de votre appareil si besoin.",
"unregisterFailed": "Impossible de désenregistrer l'appareil"
},
"mfa": {
"title": "Authentification multifacteur",
"description": "Renforcez la sécurité de votre compte avec l'authentification multifacteur (MFA). Une fois activée, vous devrez saisir un code de vérification de votre application d'authentification en plus de votre mot de passe lors de la connexion.",
"twoFactor": "Authentification à deux facteurs",
"enabledSubtitle": "Votre compte est protégé par la 2FA",
"disabledSubtitle": "Sécurisez votre compte avec une application d'authentification",
"enable": "Activer",
"disable": "Désactiver",
"enabledSuccess": "La MFA a été activée avec succès !",
"disabledSuccess": "La MFA a été désactivée avec succès !",
"errors": {
"qrGenerationFailed": "Impossible de générer le code QR",
"invalidResponse": "Réponse invalide du serveur. Code QR ou clé secrète manquant.",
"notFound": "Point de terminaison de configuration MFA introuvable. Cette fonctionnalité n'est peut-être pas encore disponible.",
"unauthorized": "Non autorisé. Veuillez vous reconnecter.",
"serverError": "Erreur serveur. Veuillez réessayer plus tard.",
"setupFailed": "Échec de la configuration de la MFA ({{status}}). Veuillez réessayer.",
"networkError": "Erreur réseau. Vérifiez votre connexion et réessayez.",
"invalidCode": "Code de vérification invalide. Veuillez réessayer.",
"confirmFailed": "Impossible de confirmer la MFA. Veuillez réessayer.",
"disableFailed": "Impossible de désactiver la MFA. Veuillez réessayer."
},
"setup": {
"title": "Configurer l'authentification multifacteur",
"addedAccount": "J'ai ajouté le compte",
"back": "Retour",
"verifyAndEnable": "Vérifier et activer",
"savedBackupCodes": "J'ai enregistré mes codes de secours",
"step1Label": "Étape 1 :",
"step1": "Scannez le code QR ci-dessous avec votre application d'authentification (Google Authenticator, Authy, etc.)",
"qrAlt": "Code QR MFA",
"qrFailed": "Le code QR n'a pas pu être généré. Réessayez ou utilisez la clé de saisie manuelle ci-dessous.",
"manualKey": "Clé de saisie manuelle :",
"step2Label": "Étape 2 :",
"step2": "Saisissez le code de vérification à 6 chiffres de votre application d'authentification",
"codePlaceholder": "Saisir le code à 6 chiffres",
"successTitle": "MFA activée avec succès !",
"backupCodesTitle": "Conservez ces codes de secours en lieu sûr",
"backupCodesDescription": "Ces codes vous permettent d'accéder à votre compte si vous perdez votre appareil d'authentification. Chaque code ne peut être utilisé qu'une seule fois."
},
"disableModal": {
"title": "Désactiver l'authentification multifacteur",
"warning": "Désactiver la MFA rendra votre compte moins sûr. Voulez-vous vraiment continuer ?",
"prompt": "Saisissez un code de vérification de votre application d'authentification pour confirmer :",
"confirm": "Désactiver la MFA"
},
"backupCodesModal": {
"title": "Nouveaux codes de secours",
"warning": "Vos anciens codes de secours ne sont plus valides. Conservez ces nouveaux codes en lieu sûr. Chaque code ne peut être utilisé qu'une seule fois."
}
},
"apiTokens": {
"title": "Jetons d'API",
"accessToken": "Jeton d'accès",
"description": "Créez un jeton à utiliser avec l'API pour mettre à jour les éléments qui déclenchent des tâches",
"plusNotice": "Les jetons d'API ne sont pas disponibles dans la formule de base. Passez à Plus pour générer des jetons d'API, vous intégrer à des systèmes externes et automatiser vos tâches.",
"showToken": "Afficher le jeton",
"hideToken": "Masquer le jeton",
"removeTitle": "Retirer le jeton",
"removeMessage": "Voulez-vous vraiment retirer {{name}} ?",
"removedTitle": "Retiré",
"removedMessage": "Le jeton d'API a été retiré",
"tokenCopied": "Jeton copié dans le presse-papiers",
"generateNew": "Générer un nouveau jeton",
"nameModalTitle": "Donnez un nom à votre nouveau jeton, quelque chose qui vous permettra de le reconnaître.",
"generateToken": "Générer le jeton"
},
"storage": {
"title": "Paramètres de stockage",
"serverTitle": "Utilisation du stockage serveur",
"serverDescription": "Il s'agit de l'espace occupé par votre compte sur nos serveurs (fichiers, images et données que vous avez envoyés).",
"usagePlaceholder": "-- Mo utilisés / -- Mo au total (--)",
"usage": "{{used}} Mo utilisés / {{total}} Mo au total ({{percent}} %)",
"basicPlanNotice": "Le stockage serveur n'est pas disponible dans la formule de base. Passez à Plus pour suivre votre utilisation.",
"localTitleApp": "Stockage local et cache de l'application",
"localTitleBrowser": "Stockage local et cache du navigateur",
"localDescription": "Ce sont les données enregistrées localement dans votre navigateur pour un accès plus rapide. Les effacer n'affectera pas vos données serveur, mais pourra vous déconnecter.",
"clearLocal": "Effacer tout le stockage local et le cache",
"clearLocalTitle": "Effacer tout le stockage local",
"clearLocalMessage": "Voulez-vous vraiment effacer votre stockage local et le cache ? Toutes vos données seront supprimées de ce navigateur et vous devrez vous reconnecter.",
"clearAll": "Tout effacer",
"appPreferences": "Préférences de l'application",
"deviceOnly": "Appareil uniquement",
"appPreferencesDescription": "Ce sont les préférences et réglages enregistrés localement sur votre appareil par l'application. Les effacer réinitialisera les réglages de l'application et pourra vous déconnecter, sans affecter vos données serveur.",
"clearPreferences": "Effacer les préférences de l'application",
"clearPreferencesTitle": "Effacer les préférences de l'application",
"clearPreferencesMessage": "Voulez-vous vraiment effacer toutes les préférences de l'application ? Vos réglages seront réinitialisés et vous devrez peut-être vous reconnecter."
},
"sidepanel": {
"title": "Personnalisation du panneau latéral",
"heading": "Paramètres du panneau latéral",
"description": "Choisissez les cartes qui apparaissent dans le panneau latéral et leur ordre. Faites-les glisser pour les réorganiser ou modifiez leur visibilité.",
"resetToDefaults": "Réinitialiser par défaut",
"resetHelper": "La visibilité et l'ordre par défaut de toutes les cartes seront rétablis.",
"cards": {
"welcome": {
"name": "Changement d'utilisateur",
"description": "Permet aux administrateurs et gestionnaires de voir les tâches d'autres personnes"
},
"smartInsights": {
"name": "Aperçus intelligents",
"description": "Actions rapides basées sur vos tâches"
},
"assignees": {
"name": "Tâches par personne assignée",
"description": "Regroupe les tâches selon la personne à qui elles sont assignées"
},
"calendar": {
"name": "Vue calendrier",
"description": "Affiche les tâches au format calendrier"
},
"activities": {
"name": "Activités récentes",
"description": "Affiche les tâches récemment terminées et les activités"
},
"weeklyGoals": {
"name": "Objectifs hebdomadaires",
"description": "Affiche la progression hebdomadaire et les statistiques de la famille"
}
}
},
"theme": {
"title": "Préférences de thème",
"description": "Choisissez l'apparence du site. Sélectionnez un thème fixe ou synchronisez-le avec votre système pour basculer automatiquement entre thème clair et sombre.",
"themeMode": "Mode de thème",
"light": "Clair",
"dark": "Sombre",
"system": "Système"
},
"localization": {
"title": "Localisation",
"description": "Personnalisez la langue, le format de date et les préférences régionales de votre compte.",
"language": "Langue",
"languageDescription": "Sélectionnez votre langue préférée",
"rtlNotice": "Cette langue s'écrit de droite à gauche (RTL)",
"dateFormat": "Format de date",
"dateFormatDescription": "Choisissez comment les dates s'affichent dans toute l'application",
"timeFormat": "Format d'heure",
"timeFormatDescription": "Sélectionnez le format 12 ou 24 heures",
"preview": "Aperçu : {{value}}",
"12hour": "12 heures (AM/PM)",
"24hour": "24 heures",
"firstDayOfWeek": "Premier jour de la semaine",
"firstDayOfWeekDescription": "Choisissez le jour qui commence votre semaine",
"sunday": "Dimanche",
"monday": "Lundi",
"saturday": "Samedi",
"formats": {
"mdy": "MM/JJ/AAAA (États-Unis)",
"dmy": "JJ/MM/AAAA (Europe)",
"ymd": "AAAA-MM-JJ (ISO)",
"long": "Format long (ex. : 1 janvier 2024)",
"short": "Format court (ex. : 1 janv. 2024)"
}
},
"advanced": {
"title": "Paramètres avancés",
"description": "Configurez des fonctionnalités avancées comme les webhooks et les mises à jour en temps réel pour gagner en productivité.",
"offlineTitle": "Mode hors ligne",
"offlineDescription": "Continuez à utiliser Donetick hors ligne sur cet appareil ou navigateur. Vos modifications sont enregistrées localement et synchronisées dès votre retour en ligne.",
"offlineToggle": "Activer le mode hors ligne",
"offlineHelper": "Le désactiver supprime les modifications hors ligne non synchronisées et les données enregistrées sur cet appareil ou navigateur.",
"offlineEnabled": "Mode hors ligne activé pour cet appareil/navigateur",
"offlineDisabled": "Mode hors ligne désactivé et données locales effacées",
"offlineDisabledPartial": "Le mode hors ligne a été désactivé, mais certaines données locales peuvent subsister",
"offlineDisableTitle": "Désactiver le mode hors ligne",
"offlineDisableMessage": "Désactiver le mode hors ligne supprimera les modifications non synchronisées et les données hors ligne enregistrées sur cet appareil ou navigateur. Voulez-vous continuer ?",
"offlineDisableConfirm": "Désactiver et effacer les données",
"webhookTitle": "Intégration webhook",
"webhookDescription": "Les webhooks vous permettent d'envoyer des notifications en temps réel à d'autres services lorsqu'un événement survient dans votre cercle. Configurez une URL de webhook pour recevoir des mises à jour en temps réel.",
"webhookPlusNotice": "Les notifications par webhook ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des mises à jour en temps réel via webhooks.",
"webhookToggle": "Activer le webhook",
"webhookHelper": "Activez les notifications webhook pour les mises à jour des tâches et des éléments.",
"webhookURL": "URL du webhook",
"webhookUpdated": "URL du webhook mise à jour avec succès",
"webhookUpdateFailed": "Impossible de mettre à jour l'URL du webhook",
"realtimeTitle": "Mises à jour en temps réel",
"realtimeDescription": "Configurez la façon dont vous recevez les mises à jour en direct lorsque les tâches et activités changent dans votre cercle.",
"realtime": {
"toggleLabel": "Activer les mises à jour en temps réel",
"title": "Mises à jour en temps réel",
"subtitle": "Recevez des notifications instantanées lorsque les tâches sont mises à jour",
"statusLabel": "Statut :",
"basicPlan": "Les mises à jour en temps réel ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des notifications instantanées lorsque les tâches sont mises à jour.",
"disabled": "Les mises à jour en temps réel sont désactivées. Activez-les pour voir les changements en direct lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches.",
"connected": "Les mises à jour en temps réel fonctionnent. Vous verrez les changements en direct lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches.",
"connecting": "Connexion aux mises à jour en temps réel…",
"errored": "Les mises à jour en temps réel sont activées mais ne fonctionnent pas : {{error}}",
"notConnected": "Les mises à jour en temps réel sont activées mais non connectées actuellement.",
"basicPlanNotice": "Les mises à jour en temps réel ne sont pas disponibles dans la formule de base. Passez à Plus pour recevoir des notifications instantanées lorsque vous ou d'autres membres du cercle terminez, passez ou modifiez des tâches."
}
}
}

View File

@@ -0,0 +1,77 @@
```json
{
"title": "מטלות",
"myChores": "המטלות שלי",
"allChores": "כל המטלות",
"addChore": "הוספת מטלה",
"editChore": "עריכת מטלה",
"deleteChore": "מחיקת מטלה",
"completeChore": "השלמת מטלה",
"dueDate": "תאריך יעד",
"assignedTo": "מוקצה ל",
"priority": "עדיפות",
"status": "סטטוס",
"description": "תיאור",
"choreView": {
"assignment": "הקצאה",
"assigned": "מוקצה",
"last": "אחרון",
"schedule": "לוח זמנים",
"due": "מועד",
"statistics": "סטטיסטיקה",
"completed": "הושלם",
"times": "פעמים",
"details": "פרטים",
"createdBy": "נוצר על ידי",
"na": "לא זמין",
"taskCompleted": "המטלה הושלמה",
"taskCompletedMessage": "המטלה סומנה כהושלמה",
"taskCompletionUndone": "סימון המטלה כהושלמה בוטל.",
"taskSkipUndone": "הדילוג על המטלה בוטל.",
"undoSuccessful": "הפעולה בוטלה בהצלחה",
"undoFailed": "ביטול הפעולה נכשל",
"undoFailedMessage": "לא ניתן לבטל את הפעולה. נסו שוב.",
"resetTimer": "איפוס טיימר",
"resetTimerConfirmation": "האם אתם בטוחים שברצונכם לאפס את הטיימר? פעולה זו תמחק את כל רישומי הזמן מאז שהתחלתם את המטלה.",
"clearAllTimeRecords": "מחיקת כל רישומי הזמן",
"clearAllTimeConfirmation": "פעולה זו תמחק לצמיתות את כל הטיימרים של מטלה זו ותחזיר אותה למצב \"טרם התחילה\".",
"descriptionTitle": "תיאור",
"description": "תיאור:",
"previousNote": "הערה קודמת",
"previousNoteLabel": "הערה קודמת:",
"subtasksLabel": "תתי-משימות:",
"taskActions": "פעולות מטלה",
"addNote": "הוספת הערה",
"additionalNotes": "הערות נוספות:",
"notePlaceholder": "הוסיפו הערה לגבי השלמת המטלה...",
"setCustomCompletionTime": "הגדרת זמן השלמה מותאם אישית",
"skipTask": "דילוג על מטלה",
"skipTaskConfirmation": "האם אתם בטוחים שברצונכם לדלג על מטלה זו?",
"markComplete": "סימון כהושלמה",
"markAsDone": "סימון כהושלמה",
"edit": "עריכה",
"archive": "העברה לארכיון",
"unarchive": "הוצאה מהארכיון",
"viewHistory": "הצגת היסטוריה",
"history": "היסטוריה",
"startTimer": "הפעלת טיימר",
"start": "התחלה",
"pauseTimer": "השהיית טיימר",
"approve": "אישור",
"reject": "דחייה",
"pendingApproval": "ממתין לאישור",
"undo": "ביטול פעולה",
"skip": "דילוג",
"cancel": "ביטול",
"noPriority": "ללא עדיפות",
"subtasks": "תתי-משימות",
"noDescription": "אין תיאור זמין",
"timer": {
"active": "הטיימר פעיל",
"paused": "הטיימר מושהה",
"reset": "איפוס טיימר",
"delete": "מחיקת סשן"
}
}
}
```

View File

@@ -0,0 +1,120 @@
```json
{
"save": "שמור",
"cancel": "ביטול",
"delete": "מחיקה",
"edit": "עריכה",
"close": "סגירה",
"confirm": "אישור",
"loading": "טוען...",
"error": "שגיאה",
"success": "הצלחה",
"warning": "אזהרה",
"refresh": "רענון",
"copy": "העתקה",
"copied": "הועתק!",
"settings": "הגדרות",
"yes": "כן",
"no": "לא",
"back": "חזרה",
"backToCalendar": "חזרה ללוח השנה",
"logout": "התנתקות",
"version": "גרסה",
"navigation": {
"search": "חיפוש",
"allTasks": "כל המשימות",
"archived": "בארכיון",
"things": "דברים",
"labels": "תגיות",
"projects": "פרויקטים",
"filters": "מסננים",
"activities": "פעילויות",
"points": "נקודות",
"settings": "הגדרות"
},
"search": {
"title": "חיפוש",
"placeholder": "חיפוש ב-Donetick",
"inputAriaLabel": "חיפוש במשימות, בהיסטוריה, בפרויקטים, בתגיות ובהגדרות",
"deviceNote": "חיפוש בתוכן הזמין במכשיר הזה",
"escape": "Esc",
"recent": "חיפושים אחרונים",
"empty": {
"title": "אין התאמות ישירות",
"subtitle": "עדיין תוכלו לסנן את רשימת המשימות באמצעות החיפוש הזה."
},
"groups": {
"tasks": "משימות",
"history": "היסטוריה",
"projects": "פרויקטים",
"labels": "תגיות",
"people": "אנשים",
"settings": "הגדרות",
"actions": "פעולות מהירות"
},
"actions": {
"quickAction": "פעולה מהירה",
"navigation": "ניווט",
"createTask": "יצירת משימה",
"viewAllTasks": "הצגת כל המשימות",
"viewArchivedTasks": "הצגת משימות שבארכיון",
"openSettings": "פתיחת הגדרות",
"filterTasks": "הצגת משימות התואמות ל־„{{query}}“",
"filterTasksSubtitle": "סינון רשימת המשימות"
},
"footer": {
"navigate": "ניווט",
"open": "פתיחה",
"results_one": "{{count}} תוצאה",
"results_other": "{{count}} תוצאות",
"typeToSearch": "הקלידו כדי לחפש"
}
},
"feedback": {
"later": "אולי מאוחר יותר",
"sentiment": {
"title": "איך Donetick עובד עבורכם?",
"subtitle": "התשובה שלכם עוזרת לנו להחליט מה לפתח בהמשך.",
"options": {
"love": "אני אוהב/ת את זה",
"okay": "בסדר",
"issues": "נתקלתי בבעיות"
}
},
"categories": {
"bugs": "באגים",
"missingFeature": "תכונה חסרה",
"tooComplicated": "מסובך מדי",
"slow": "איטי",
"notifications": "התראות",
"ai": "AI",
"other": "אחר"
},
"details": {
"title": "מה נוכל לשפר?",
"messageLabel": "ספרו לנו עוד",
"messagePlaceholder": "מה קרה, או מה היה הופך את השימוש לטוב יותר?",
"contextNote": "נצרף את גרסת האפליקציה, המכשיר והפלטפורמה כדי שנוכל לשחזר בעיות.",
"submit": "שליחת משוב",
"contextNoteSelfHosted": "אתם משתמשים בשרת עצמאי, לכן שום דבר לא נשלח מהשרת שלכם — נפתח עבורכם דיווח GitHub מלא מראש, שתוכלו לבדוק ולערוך לפני השליחה.",
"submitSelfHosted": "המשך ל-GitHub"
},
"review": {
"title": "שמחים שאתם נהנים מ-Donetick!",
"subtitle": "דירוג או כוכב עוזרים לאנשים אחרים למצוא את Donetick.",
"github": "מתן כוכב ב-GitHub",
"appStore": "דירוג ב-App Store",
"playStore": "דירוג ב-Google Play"
},
"thanks": {
"title": "תודה על המשוב",
"subtitle": "אנחנו קוראים כל תגובה והיא עוזרת לנו להחליט על מה לעבוד בהמשך."
},
"github": {
"title": "דיווח ב-GitHub",
"subtitle": "מילאנו עבורכם דיווח עם ההערות ופרטי הגרסה. שום דבר עדיין לא נשלח — תוכלו לבדוק את הדיווח ולפרסם אותו כשתהיו מוכנים.",
"open": "פתיחת הדיווח"
}
}
}
```

View File

@@ -0,0 +1,495 @@
{
"title": "הגדרות",
"common": {
"save": "שמור",
"cancel": "ביטול",
"confirm": "אישור",
"remove": "הסרה",
"delete": "מחיקה",
"refresh": "רענון",
"loading": "טוען...",
"on": "מופעל",
"off": "מושבת",
"error": "שגיאה",
"success": "הצלחה",
"plusFeature": "תכונת Plus",
"earlyAccess": "גישה מוקדמת"
},
"overview": {
"title": "הגדרות",
"subtitle": "התאימו את חוויית השימוש שלכם ונהלו את העדפות החשבון",
"upgrade": {
"title": "שדרוג ל-Plus",
"description": "פתחו תכונות מתקדמות לשיפור הפרודוקטיביות שלכם",
"button": "שדרוג עכשיו",
"features": {
"richText": "תיאורים עם עיצוב טקסט עשיר",
"notifications": "התראות על משימות",
"apiIntegrations": "אינטגרציות API",
"advancedAutomation": "אוטומציה מתקדמת"
}
},
"sections": {
"profile": {
"title": "הגדרות פרופיל",
"description": "עדכנו את פרטי הפרופיל, תמונת הפרופיל, שם התצוגה והעדפות אזור הזמן."
},
"circle": {
"title": "הגדרות מעגל",
"description": "נהלו את המעגל, הזמינו חברים וטפלו בבקשות להצטרפות."
},
"account": {
"title": "הגדרות חשבון",
"description": "נהלו את המינוי, שנו את הסיסמה ואפשרויות מחיקת החשבון."
},
"subaccounts": {
"title": "חשבונות מנוהלים",
"description": "צרו ונהלו חשבונות מנוהלים שיכולים להתחבר ולהשלים משימות שהוקצו להם."
},
"notifications": {
"title": "התראות",
"description": "הגדירו התראות Push, התראות בדוא״ל ויעדי התראות עבור משימות."
},
"mfa": {
"title": "אימות רב-שלבי",
"description": "הוסיפו שכבת אבטחה נוספת באמצעות אימות רב-שלבי עם אפליקציית מאמת."
},
"apitokens": {
"title": "אסימוני API",
"description": "צרו ונהלו אסימוני גישה עבור אינטגרציות של צד שלישי וגישה ל-API."
},
"storage": {
"title": "הגדרות אחסון",
"description": "גבו ושחזרו את הנתונים שלכם, ונהלו את האחסון המקומי והעדפות הסנכרון."
},
"sidepanel": {
"title": "התאמת סרגל הצד",
"description": "התאימו את הפריסה ואת הנראות של הכרטיסים בסרגל הצד."
},
"theme": {
"title": "העדפות ערכת נושא",
"description": "בחרו את ערכת הנושא המועדפת עליכם והגדירו מצב בהיר או כהה."
},
"localization": {
"title": "הגדרות אזוריות",
"description": "התאימו את השפה, תבנית התאריך, תבנית השעה וההעדפות האזוריות."
},
"advanced": {
"title": "הגדרות מתקדמות",
"description": "הגדירו Webhooks, עדכונים בזמן אמת ותכונות מתקדמות נוספות לשיפור הפרודוקטיביות."
},
"developer": {
"title": "הגדרות מפתחים",
"description": "הציגו מידע טכני על אסימוני אימות, חיבורי SSE ונתוני ניפוי שגיאות."
},
"feedback": {
"title": "שליחת משוב",
"description": "ספרו לנו כיצד Donetick עובד עבורכם או בקשו תכונה חדשה."
},
"bugReport": {
"title": "דיווח על באג",
"description": "משהו לא עובד כראוי? שלחו לנו את הפרטים יחד עם מידע טכני שיעזור לנו לאתר את הבעיה."
}
}
},
"profile": {
"title": "הגדרות פרופיל",
"description": "עדכנו את שם התצוגה ואת תמונת הפרופיל.",
"photoUpdated": "התמונה עודכנה",
"photoUpdatedMessage": "תמונת הפרופיל עודכנה בהצלחה!",
"uploadFailed": "ההעלאה נכשלה",
"uploadFailedMessage": "לא ניתן להעלות את התמונה. נסו שוב.",
"profileUpdated": "הפרופיל עודכן",
"profileUpdatedMessage": "פרטי הפרופיל נשמרו בהצלחה!",
"updateFailed": "העדכון נכשל",
"updateFailedMessage": "לא ניתן לעדכן את הפרופיל. בדקו את החיבור ונסו שוב.",
"changePhoto": "שינוי תמונה",
"editPhoto": "עריכת תמונת פרופיל",
"displayName": "שם תצוגה",
"displayNamePlaceholder": "הזינו את שם התצוגה שלכם",
"timezone": "אזור זמן",
"timezonePlaceholder": "בחרו את אזור הזמן שלכם",
"save": "שמור",
"cancel": "ביטול"
},
"circleSettings": {
"title": "הגדרות מעגל",
"description": "החשבון שלכם מחובר אוטומטית למעגל כשאתם יוצרים מעגל או מצטרפים אליו. תוכלו להזמין בקלות חברים על ידי שיתוף קוד המעגל הייחודי או הקישור שלמטה. תקבלו כאן התראה כשמישהו יבקש להצטרף למעגל שלכם.",
"memberOf": "אתם חלק מ-{{name}}",
"yourCircleCode": "קוד המעגל שלכם:",
"copyCode": "העתקת קוד",
"shareInvite": "שיתוף הזמנה",
"codeCopied": "הקוד הועתק ללוח",
"linkCopied": "קישור ההזמנה הועתק ללוח",
"myCircle": "המעגל שלי",
"shareTitle": "הצטרפו ל-{{name}} ב-Donetick",
"shareText": "אני רוצה להזמין אתכם להצטרף ל-{{name}} ב-Donetick.",
"shareDialogTitle": "שיתוף הזמנה למעגל",
"leave": "עזיבת המעגל",
"leaveConfirmTitle": "עזיבת המעגל",
"leaveConfirmMessage": "האם אתם בטוחים שברצונכם לעזוב את המעגל?",
"leaveConfirmButton": "עזיבה",
"leftCircle": "עזבתם את המעגל בהצלחה",
"leaveFailed": "עזיבת המעגל נכשלה",
"circleMembers": "חברי המעגל",
"you": "(אתם)",
"pendingApproval": "ממתין לאישור",
"joinedOn": "הצטרפות בתאריך {{date}}",
"requestedToJoin": "בקשת הצטרפות בתאריך {{date}}",
"roles": {
"member": "חבר",
"memberDescription": "חבר רגיל במעגל",
"manager": "מנהל",
"managerDescription": "יכול לפעול בשם משתמשים אחרים ולבצע פעולות מטעמם",
"admin": "מנהל מערכת",
"adminDescription": "גישה מלאה למעגל"
},
"roleUpdateFailed": "עדכון התפקיד נכשל",
"removeMemberTitle": "הסרת חבר",
"removeMemberMessage": "האם אתם בטוחים שברצונכם להסיר את {{name}} מהמעגל?",
"memberRemoved": "החבר הוסר בהצלחה",
"circleMemberRequests": "בקשות הצטרפות למעגל",
"lastUpdated": "עודכן לאחרונה: {{time}}",
"refreshing": "מרענן...",
"refreshFailed": "רענון בקשות החברים נכשל",
"wantsToJoin": "{{name}} רוצה להצטרף למעגל שלכם.",
"accept": "קבלה",
"acceptRequestTitle": "אישור בקשת חבר",
"acceptRequestMessage": "האם אתם בטוחים שברצונכם לאשר את {{name}} (שם משתמש: {{username}}) להצטרף למעגל?",
"requestAccepted": "הבקשה אושרה בהצלחה",
"or": "או",
"joinOtherDescription": "רוצים להצטרף למעגל של מישהו אחר? בקשו ממנו את קוד המעגל הייחודי או את קישור ההצטרפות. הזינו את הקוד למטה כדי להצטרף למעגל.",
"enterCircleCode": "הזינו את קוד המעגל:",
"enterCodePlaceholder": "הזינו קוד",
"joinCircle": "הצטרפות למעגל",
"joinedPending": "הצטרפתם למעגל בהצלחה. המתינו לאישור של בעל המעגל.",
"alreadyMember": "אתם כבר חברים במעגל הזה",
"joinFailed": "ההצטרפות למעגל נכשלה"
},
"accountSettings": {
"title": "הגדרות חשבון",
"description": "שנו את הגדרות החשבון, או עדכנו את הסיסמה שלכם",
"accountType": "סוג חשבון: {{type}}",
"free": "חינמי",
"plus": "Plus",
"plusUntil": "Plus (עד {{date}})",
"activeDescription": "אתם מנויים כרגע לתוכנית Plus. המינוי שלכם יתחדש בתאריך {{date}}.",
"cancelledDescription": "ביטלתם את המינוי. החשבון שלכם יעבור לתוכנית Free בתאריך {{date}}.",
"freeDescription": "אתם משתמשים כרגע בתוכנית Free. שדרגו ל-Plus כדי לפתוח תכונות נוספות.",
"upgrade": "שדרוג",
"cancel": "ביטול",
"password": "סיסמה:",
"changePassword": "שינוי סיסמה",
"passwordChanged": "הסיסמה שונתה בהצלחה",
"passwordChangeFailed": "שינוי הסיסמה נכשל",
"dangerZone": "אזור מסוכן",
"dangerZoneDescription": "לאחר מחיקת החשבון לא ניתן לבטל את הפעולה. ודאו שאתם בטוחים לפני שתמשיכו.",
"deleteAccount": "מחיקת חשבון",
"accountDeleted": "החשבון נמחק בהצלחה",
"subscriptionCancelled": "המינוי בוטל",
"subscriptionCancelFailed": "ביטול המינוי נכשל",
"purchase": {
"success": "הרכישה בוצעה בהצלחה! הפעילו מחדש את האפליקציה כדי לגשת לתכונות Plus.",
"storeConnection": "בעיה בחיבור לחנות. בדקו את הרשת ונסו שוב.",
"notAllowed": "רכישות אינן מותרות במכשיר זה. בדקו את הגבלות המכשיר.",
"unavailable": "המינוי הזה אינו זמין. נסו שוב מאוחר יותר.",
"alreadyProcessed": "הרכישה הזו כבר טופלה. אם לדעתכם מדובר בשגיאה, פנו לתמיכה.",
"receiptMissing": "קבלת הרכישה חסרה. נסו לבצע את הרכישה שוב.",
"networkError": "שגיאת רשת. בדקו את החיבור ונסו שוב.",
"invalidReceipt": "קבלת רכישה לא תקינה. אם הבעיה נמשכת, פנו לתמיכה.",
"pending": "התשלום ממתין לאישור. תקבלו גישה לאחר האישור.",
"failed": "הרכישה נכשלה: {{error}}. נסו שוב או פנו לתמיכה.",
"unknownError": "שגיאה לא ידועה"
}
},
"subaccounts": {
"title": "חשבונות מנוהלים",
"description": "נהלו חשבונות מנוהלים. משתמשים בחשבונות מנוהלים יכולים להתחבר ולהשלים משימות שהוקצו להם.",
"notParentTitle": "ניהול חשבונות מנוהלים",
"notParentMessage": "רק משתמשים ראשיים יכולים לנהל חשבונות מנוהלים.",
"freePlanNotice": "בתוכנית Free ניתן ליצור חשבון מנוהל אחד בלבד. שדרגו ל-Plus כדי ליצור עד 5 חשבונות מנוהלים.",
"count": "חשבונות מנוהלים ({{count}})",
"add": "הוספת חשבון מנוהל",
"loading": "טוען חשבונות מנוהלים...",
"emptyTitle": "אין חשבונות מנוהלים",
"emptyDescription": "צרו חשבונות מנוהלים כדי שמשתמשים אחרים יוכלו להתחבר ולהשלים את המשימות שהוקצו להם.",
"addFirst": "הוספת החשבון המנוהל הראשון",
"username": "שם משתמש: {{username}}",
"created": "נוצר בתאריך: {{date}}",
"changePassword": "שינוי סיסמה",
"deleteAccount": "מחיקת חשבון",
"createdSuccess": "החשבון המנוהל \"{{name}}\" נוצר בהצלחה!",
"createFailed": "יצירת החשבון המנוהל נכשלה: {{error}}",
"createFailedGeneric": "יצירת החשבון המנוהל נכשלה",
"passwordUpdated": "הסיסמה של החשבון המנוהל עודכנה בהצלחה",
"passwordUpdateFailed": "עדכון הסיסמה נכשל: {{error}}",
"passwordUpdateFailedGeneric": "עדכון הסיסמה נכשל",
"deleteConfirmTitle": "מחיקת חשבון מנוהל",
"deleteConfirmMessage": "האם אתם בטוחים שברצונכם למחוק את החשבון המנוהל \"{{name}}\"? לא ניתן לבטל פעולה זו.",
"deleted": "החשבון המנוהל \"{{name}}\" נמחק בהצלחה",
"deleteFailed": "מחיקת החשבון המנוהל נכשלה: {{error}}",
"deleteFailedGeneric": "מחיקת החשבון המנוהל נכשלה",
"howItWorksTitle": "כיצד פועלים חשבונות מנוהלים",
"howItWorks1": "המשתמש הראשי יוצר חשבונות מנוהלים עבור משתמשים שצריכים אפשרות להתחבר, להשלים משימות ולאפס את הסיסמה שלהם.",
"howItWorks2": "משתמשים בחשבונות מנוהלים יכולים להתחבר באמצעות שם המשתמש והסיסמה שלהם.",
"howItWorks3": "משתמשים בחשבונות מנוהלים יכולים להשלים משימות, אך יש להם הרשאות ניהול מוגבלות.",
"howItWorks4": "חשבונות מנוהלים מתווספים אוטומטית למעגל שלכם."
},
"notifications": {
"title": "הגדרות התראות",
"deviceSection": "התראות במכשיר",
"deviceSectionDescription": "נהלו את ההתראות במכשיר שלכם",
"deviceLabel": "התראות במכשיר",
"deviceHelper": "קבלו התראה במכשיר כאשר מועד משימה מגיע",
"mobileOnly": "תכונה זו זמינה רק במכשירים ניידים",
"testNotification": "בדיקת התראה",
"testNotificationBody": "יש לכם משימה שמועד הביצוע שלה מתקרב",
"dueTitle": "התראה במועד המשימה",
"dueLabel": "התראה כאשר מגיע מועד המשימה",
"preDueTitle": "התראה לפני מועד המשימה",
"preDueLabel": "התראה מספר שעות לפני מועד המשימה",
"overdueTitle": "התראה על משימה באיחור",
"overdueLabel": "התראה כאשר המשימה באיחור",
"pushLabel": "התראות Push",
"pushHelper": "קבלו תזכורות, הודעות והקצאות משימות באמצעות התראות Push",
"registeredDevices": "מכשירים רשומים ({{count}}/5)",
"registeredDevicesDescription": "מכשירים הרשומים לקבלת התראות Push עבור החשבון שלכם",
"currentDevice": "המכשיר הנוכחי: {{platform}} {{model}}",
"currentDeviceNotRegistered": "המכשיר הזה אינו רשום לקבלת התראות Push",
"limitReached": "הגעתם למגבלה",
"registerDevice": "רישום מכשיר",
"unknownDevice": "מכשיר לא ידוע",
"deviceCreatedAt": "נוצר בתאריך: {{date}}",
"noDevices": "אין מכשירים הרשומים לקבלת התראות Push",
"customSection": "התראות מותאמות אישית",
"customSectionDescription": "קבלת התראות דרך פלטפורמות אחרות כמו Telegram או Pushover",
"customLabel": "התראה מותאמת אישית",
"customHelper": "קבלו התראות בפלטפורמה אחרת",
"targetNone": "ללא",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "יש לשלוח הודעה לבוט כדי לאפשר קבלת התראות Telegram",
"telegramBotHelpAfter": "כדי להתחיל שיחה",
"clickHere": "לחצו כאן",
"chatId": "מזהה שיחה",
"chatIdPlaceholder": "מזהה משתמש / מזהה שיחה",
"telegramChatIdHelpBefore": "אם אינכם יודעים מהו מזהה השיחה שלכם, התחילו שיחה עם userinfobot והוא ישלח לכם את מזהה השיחה.",
"telegramChatIdHelpAfter": "כדי להתחיל שיחה עם userinfobot",
"userKey": "מפתח משתמש",
"userKeyPlaceholder": "מזהה משתמש",
"chatIdRequired": "נדרש מזהה שיחה",
"chatIdInvalid": "מזהה שיחה לא תקין",
"userKeyRequired": "נדרש מפתח משתמש",
"targetUpdated": "יעד ההתראות עודכן",
"targetUpdateFailed": "שגיאה בעדכון יעד ההתראות: {{error}}",
"deviceRegistered": "המכשיר נרשם בהצלחה לקבלת התראות Push.",
"deviceLimitTitle": "הגעתם למגבלת המכשירים",
"deviceLimitMessage": "הגעתם למספר המרבי של 5 מכשירים רשומים. הסירו מכשיר לפני רישום המכשיר הזה.",
"registrationFailedTitle": "הרישום נכשל",
"registrationFailedMessage": "רישום המכשיר האוטומטי נכשל. נסו שוב.",
"permissionRequiredTitle": "נדרשת הרשאה",
"permissionRequiredMessage": "נדרשת הרשאה לקבלת התראות Push כדי לרשום את המכשיר.",
"registrationInitiatedTitle": "הרישום התחיל",
"registrationInitiatedMessage": "רישום ההתראות התחיל. המכשיר יירשם באופן אוטומטי.",
"registerDeviceFailed": "רישום המכשיר נכשל. נסו שוב.",
"permissionDeniedTitle": "הרשאת ההתראות נדחתה",
"permissionDeniedMessage": "דחיתם את הרשאת ההתראות. תוכלו להפעיל אותה מאוחר יותר בהגדרות המכשיר.",
"pushPermissionDeniedTitle": "הרשאת התראות Push נדחתה",
"pushPermissionDeniedMessage": "התראות Push הושבתו. תוכלו להפעיל אותן בהגדרות המכשיר אם תרצו.",
"unregisterFailed": "ביטול רישום המכשיר נכשל"
},
"mfa": {
"title": "אימות רב-שלבי",
"description": "הוסיפו שכבת אבטחה נוספת לחשבון באמצעות אימות רב-שלבי (MFA). כאשר האפשרות מופעלת, תצטרכו להזין קוד אימות מאפליקציית המאמת בנוסף לסיסמה בעת הכניסה.",
"twoFactor": "אימות דו-שלבי",
"enabledSubtitle": "החשבון שלכם מוגן באמצעות אימות דו-שלבי",
"disabledSubtitle": "אבטחו את החשבון באמצעות אפליקציית מאמת",
"enable": "הפעלה",
"disable": "השבתה",
"enabledSuccess": "אימות MFA הופעל בהצלחה!",
"disabledSuccess": "אימות MFA הושבת בהצלחה!",
"errors": {
"qrGenerationFailed": "יצירת קוד ה-QR נכשלה",
"invalidResponse": "תגובה לא תקינה מהשרת. קוד ה-QR או הסוד חסרים.",
"notFound": "נקודת הקצה להגדרת MFA לא נמצאה. ייתכן שתכונה זו עדיין אינה זמינה.",
"unauthorized": "אין הרשאה. התחברו שוב.",
"serverError": "שגיאת שרת. נסו שוב מאוחר יותר.",
"setupFailed": "הגדרת MFA נכשלה ({{status}}). נסו שוב.",
"networkError": "שגיאת רשת. בדקו את החיבור ונסו שוב.",
"invalidCode": "קוד אימות לא תקין. נסו שוב.",
"confirmFailed": "אישור MFA נכשל. נסו שוב.",
"disableFailed": "השבתת MFA נכשלה. נסו שוב."
},
"setup": {
"title": "הגדרת אימות רב-שלבי",
"addedAccount": "הוספתי את החשבון",
"back": "חזרה",
"verifyAndEnable": "אימות והפעלה",
"savedBackupCodes": "שמרתי את קודי הגיבוי",
"step1Label": "שלב 1:",
"step1": "סרקו את קוד ה-QR שלמטה באמצעות אפליקציית המאמת שלכם (Google Authenticator, Authy וכו׳).",
"qrAlt": "קוד QR של MFA",
"qrFailed": "לא ניתן ליצור את קוד ה-QR. נסו שוב או השתמשו במפתח ההזנה הידנית שלמטה.",
"manualKey": "מפתח להזנה ידנית:",
"step2Label": "שלב 2:",
"step2": "הזינו את קוד האימות בן 6 הספרות מאפליקציית המאמת שלכם",
"codePlaceholder": "הזינו קוד בן 6 ספרות",
"successTitle": "MFA הופעל בהצלחה!",
"backupCodesTitle": "שמרו את קודי הגיבוי האלה במקום בטוח",
"backupCodesDescription": "תוכלו להשתמש בקודים האלה כדי לגשת לחשבון אם תאבדו את מכשיר המאמת. ניתן להשתמש בכל קוד פעם אחת בלבד."
},
"disableModal": {
"title": "השבתת אימות רב-שלבי",
"warning": "השבתת MFA תהפוך את החשבון שלכם לפחות מאובטח. האם אתם בטוחים שברצונכם להמשיך?",
"prompt": "הזינו קוד אימות מאפליקציית המאמת כדי לאשר:",
"confirm": "השבתת MFA"
},
"backupCodesModal": {
"title": "קודי גיבוי חדשים",
"warning": "קודי הגיבוי הקודמים שלכם אינם תקפים יותר. שמרו את הקודים החדשים במקום בטוח. ניתן להשתמש בכל קוד פעם אחת בלבד."
}
},
"apiTokens": {
"title": "אסימוני API",
"accessToken": "אסימון גישה",
"description": "צרו אסימון לשימוש ב-API כדי לעדכן דברים שמפעילים משימות או מטלות.",
"plusNotice": "אסימוני API אינם זמינים בתוכנית Basic. שדרגו ל-Plus כדי ליצור אסימוני API לצורך אינטגרציה עם מערכות חיצוניות ואוטומציה של המשימות שלכם.",
"showToken": "הצגת אסימון",
"hideToken": "הסתרת אסימון",
"removeTitle": "הסרת אסימון",
"removeMessage": "האם אתם בטוחים שברצונכם להסיר את {{name}}?",
"removedTitle": "הוסר",
"removedMessage": "אסימון ה-API הוסר",
"tokenCopied": "האסימון הועתק ללוח",
"generateNew": "יצירת אסימון חדש",
"nameModalTitle": "תנו שם לאסימון החדש כדי שתוכלו לזהות אותו בקלות.",
"generateToken": "יצירת אסימון"
},
"storage": {
"title": "הגדרות אחסון",
"serverTitle": "שימוש באחסון בשרת",
"serverDescription": "זהו שטח האחסון שבו משתמש החשבון שלכם בשרתים שלנו, למשל עבור קבצים, תמונות ונתונים שהעליתם.",
"usagePlaceholder": "-- MB בשימוש / -- MB בסך הכול (--)",
"usage": "{{used}} MB בשימוש / {{total}} MB בסך הכול ({{percent}}%)",
"basicPlanNotice": "אחסון בשרת אינו זמין בתוכנית Basic. שדרגו ל-Plus כדי לעקוב אחר השימוש באחסון בשרת.",
"localTitleApp": "אחסון מקומי ומטמון באפליקציה",
"localTitleBrowser": "אחסון מקומי ומטמון בדפדפן",
"localDescription": "אלה נתונים המאוחסנים באופן מקומי בדפדפן כדי לאפשר גישה מהירה יותר. ניקוי שלהם לא ישפיע על הנתונים שלכם בשרת, אך ייתכן שתנותקו מהחשבון.",
"clearLocal": "ניקוי כל האחסון והמטמון המקומיים",
"clearLocalTitle": "ניקוי כל האחסון המקומי",
"clearLocalMessage": "האם אתם בטוחים שברצונכם לנקות את האחסון והמטמון המקומיים? פעולה זו תסיר את כל הנתונים שלכם מהדפדפן ותדרוש התחברות מחדש.",
"clearAll": "ניקוי הכול",
"appPreferences": "העדפות האפליקציה",
"deviceOnly": "במכשיר בלבד",
"appPreferencesDescription": "אלה העדפות והגדרות שהאפליקציה שומרת באופן מקומי במכשיר שלכם. ניקוי שלהן יאפס את הגדרות האפליקציה ועלול לנתק אתכם מהחשבון, אך לא ישפיע על הנתונים שלכם בשרת.",
"clearPreferences": "ניקוי העדפות האפליקציה",
"clearPreferencesTitle": "ניקוי העדפות האפליקציה",
"clearPreferencesMessage": "האם אתם בטוחים שברצונכם לנקות את כל העדפות האפליקציה? פעולה זו תאפס את הגדרות האפליקציה ועלולה לדרוש התחברות מחדש."
},
"sidepanel": {
"title": "התאמת סרגל הצד",
"heading": "הגדרות סרגל הצד",
"description": "התאימו אילו כרטיסים יופיעו בסרגל הצד ואת הסדר שלהם. גררו ושחררו כדי לשנות את הסדר, או הפעילו וכבו את הנראות של כל כרטיס.",
"resetToDefaults": "איפוס לברירת המחדל",
"resetHelper": "פעולה זו תשחזר את הנראות והסדר של כל הכרטיסים לברירת המחדל.",
"cards": {
"welcome": {
"name": "החלפת משתמש",
"description": "מאפשרת למנהלים ולממונים לצפות במשימות כמשתמשים שונים"
},
"smartInsights": {
"name": "תובנות חכמות",
"description": "פעולות מהירות המבוססות על המשימות שלכם"
},
"assignees": {
"name": "משימות לפי אחראי",
"description": "קיבוץ משימות לפי האדם שאליו הן הוקצו"
},
"calendar": {
"name": "תצוגת לוח שנה",
"description": "הצגת משימות בפורמט של לוח שנה"
},
"activities": {
"name": "פעילות אחרונה",
"description": "הצגת השלמות משימות ופעילות אחרונה"
},
"weeklyGoals": {
"name": "יעדים שבועיים",
"description": "הצגת ההתקדמות השבועית ונתוני השלמת המשימות של המשפחה"
}
}
},
"theme": {
"title": "העדפות ערכת נושא",
"description": "בחרו כיצד האתר יוצג עבורכם. בחרו ערכת נושא אחת, או הסתנכרנו עם הגדרות המערכת כדי לעבור אוטומטית בין מצב יום ללילה.",
"themeMode": "מצב ערכת נושא",
"light": "בהיר",
"dark": "כהה",
"system": "מערכת"
},
"localization": {
"title": "הגדרות אזוריות",
"description": "התאמת השפה, תבנית התאריך וההעדפות האזוריות של החשבון.",
"language": "שפה",
"languageDescription": "בחירת השפה המועדפת",
"rtlNotice": "שפה זו משתמשת בכיוון טקסט מימין לשמאל (RTL)",
"dateFormat": "תבנית תאריך",
"dateFormatDescription": "בחירת אופן הצגת התאריכים ברחבי האפליקציה",
"timeFormat": "תבנית שעה",
"timeFormatDescription": "בחירת תבנית שעה של 12 או 24 שעות",
"preview": "תצוגה מקדימה: {{value}}",
"12hour": "12 שעות (AM/PM)",
"24hour": "24 שעות",
"firstDayOfWeek": "היום הראשון בשבוע",
"firstDayOfWeekDescription": "בחירת היום שבו מתחיל השבוע",
"sunday": "יום ראשון",
"monday": "יום שני",
"saturday": "שבת",
"formats": {
"mdy": "MM/DD/YYYY (ארה״ב)",
"dmy": "DD/MM/YYYY (אירופה)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "תבנית ארוכה (לדוגמה, 1 בינואר 2024)",
"short": "תבנית קצרה (לדוגמה, 1 בינו׳ 2024)"
}
},
"advanced": {
"title": "הגדרות מתקדמות",
"description": "הגדירו תכונות מתקדמות כמו Webhooks ועדכונים בזמן אמת לשיפור הפרודוקטיביות.",
"offlineTitle": "תמיכה במצב לא מקוון",
"offlineDescription": "המשיכו להשתמש ב-Donetick גם ללא חיבור לאינטרנט במכשיר או בדפדפן הזה. השינויים שלכם יישמרו באופן מקומי ויסונכרנו כשתחזרו להיות מחוברים.",
"offlineToggle": "הפעלת מצב לא מקוון",
"offlineHelper": "כיבוי האפשרות הזו ימחק שינויים לא מסונכרנים ונתונים שנשמרו במצב לא מקוון מהמכשיר או מהדפדפן הזה.",
"offlineEnabled": "מצב לא מקוון הופעל עבור המכשיר או הדפדפן הזה",
"offlineDisabled": "מצב לא מקוון כובה והנתונים המקומיים נמחקו",
"offlineDisabledPartial": "מצב לא מקוון כובה, אך ייתכן שחלק מהנתונים המקומיים עדיין נשמרו",
"offlineDisableTitle": "כיבוי מצב לא מקוון",
"offlineDisableMessage": "כיבוי מצב לא מקוון ימחק שינויים לא מסונכרנים ונתונים שנשמרו במצב לא מקוון במכשיר או בדפדפן הזה. האם ברצונכם להמשיך?",
"offlineDisableConfirm": "כיבוי וניקוי הנתונים",
"webhookTitle": "אינטגרציית Webhook",
"webhookDescription": "Webhooks מאפשרים לשלוח התראות בזמן אמת לשירותים אחרים כאשר מתרחשים אירועים במעגל שלכם. הגדירו כתובת URL של Webhook כדי לקבל עדכונים בזמן אמת.",
"webhookPlusNotice": "התראות Webhook אינן זמינות בתוכנית Basic. שדרגו ל-Plus כדי לקבל עדכונים בזמן אמת באמצעות Webhooks.",
"webhookToggle": "הפעלת Webhook",
"webhookHelper": "הפעילו התראות Webhook עבור עדכוני משימות ופריטים.",
"webhookURL": "כתובת URL של Webhook",
"webhookUpdated": "כתובת ה-URL של ה-Webhook עודכנה בהצלחה",
"webhookUpdateFailed": "עדכון כתובת ה-URL של ה-Webhook נכשל",
"realtimeTitle": "עדכונים בזמן אמת",
"realtimeDescription": "הגדירו כיצד לקבל עדכונים בזמן אמת כאשר משימות ופעילויות משתנות במעגל שלכם.",
"realtime": {
"toggleLabel": "הפעלת עדכונים בזמן אמת",
"title": "עדכונים בזמן אמת",
"subtitle": "קבלו התראות מיידיות כאשר משימות מתעדכנות",
"statusLabel": "סטטוס:",
"basicPlan": "עדכונים בזמן אמת אינם זמינים בתוכנית Basic. שדרגו ל-Plus כדי לקבל התראות מיידיות כאשר משימות מתעדכנות.",
"disabled": "עדכונים בזמן אמת מושבתים. הפעילו אותם כדי לראות שינויים בזמן אמת כאשר אתם או חברים אחרים במעגל משלימים, מדלגים או משנים משימות.",
"connected": "עדכונים בזמן אמת פועלים. תראו שינויים בזמן אמת כאשר אתם או חברים אחרים במעגל משלימים, מדלגים או משנים משימות.",
"connecting": "מתחבר לעדכונים בזמן אמת...",
"errored": "עדכונים בזמן אמת מופעלים אך אינם פועלים: {{error}}",
"notConnected": "עדכונים בזמן אמת מופעלים אך אינם מחוברים כרגע.",
"basicPlanNotice": "עדכונים בזמן אמת אינם זמינים בתוכנית Basic. שדרגו ל-Plus כדי לקבל התראות מיידיות כאשר אתם או חברים אחרים במעגל משלימים, מדלגים או משנים משימות."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "ログアウト",
"version": "バージョン",
"navigation": {
"search": "検索",
"allTasks": "すべてのタスク",
"archived": "アーカイブ済み",
"things": "Things",
@@ -30,6 +31,43 @@
"points": "ポイント",
"settings": "設定"
},
"search": {
"title": "検索",
"placeholder": "Donetick を検索",
"inputAriaLabel": "タスク、履歴、プロジェクト、ラベル、設定を検索",
"deviceNote": "このデバイスで利用できるコンテンツを検索しています",
"escape": "Esc",
"recent": "最近",
"empty": {
"title": "一致する項目はありません",
"subtitle": "この検索でタスク一覧を絞り込むことはできます。"
},
"groups": {
"tasks": "タスク",
"history": "ノート",
"projects": "プロジェクト",
"labels": "ラベル",
"people": "メンバー",
"settings": "設定",
"actions": "クイックアクション"
},
"actions": {
"quickAction": "クイックアクション",
"navigation": "ナビゲーション",
"createTask": "タスクを作成",
"viewAllTasks": "すべてのタスクを表示",
"viewArchivedTasks": "アーカイブ済みのタスクを表示",
"openSettings": "設定を開く",
"filterTasks": "「{{query}}」に一致するタスクを表示",
"filterTasksSubtitle": "タスク一覧を絞り込む"
},
"footer": {
"navigate": "移動",
"open": "開く",
"results_other": "{{count}} 件の結果",
"typeToSearch": "入力して検索"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,118 +1,31 @@
{
"title": "設定",
"circleSettings": {
"title": "サークル設定",
"description": "アカウントは、サークルを作成または参加すると自動的にそのサークルに接続されます。下記のユニークなサークルコードまたはリンクを共有することで、友達を簡単に招待できます。誰かがサークルへの参加をリクエストした際は、下に通知が表示されます。サークルから脱退したい場合は、「サークルを脱退」ボタンを押してください。",
"circleCode": "サークルコード",
"copyCode": "コードをコピー",
"copyLink": "リンクをコピー",
"codeCopied": "サークルコードをコピーしました!",
"linkCopied": "サークルリンクをコピーしました!",
"joinCircle": "サークルに参加",
"joinCirclePlaceholder": "サークルコードを入力",
"join": "参加",
"leave": "サークルを脱退",
"leaveConfirmTitle": "サークルを脱退",
"leaveConfirmMessage": "本当にこのサークルから脱退しますか?",
"circleMembers": "サークルメンバー",
"circleMemberRequests": "サークル参加リクエスト",
"admin": "管理者",
"member": "メンバー",
"pending": "保留中",
"accept": "承認",
"reject": "拒否",
"makeAdmin": "管理者にする",
"makeMember": "メンバーにする",
"remove": "削除",
"webhookURL": "Webhook URL",
"webhookDescription": "サークルイベントの通知を受け取るための Webhook URL を入力してください",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "アカウント設定",
"subscription": "サブスクリプション",
"subscriptionStatus": "現在のプラン",
"free": "無料",
"plus": "Plus",
"upgrade": "アップグレード",
"cancel": "キャンセル",
"changePassword": "パスワードを変更",
"password": "パスワード",
"dangerZone": "危険な操作",
"dangerZoneDescription": "アカウントを削除すると元に戻すことはできません。十分にご確認ください。",
"deleteAccount": "アカウントを削除"
},
"localization": {
"title": "地域設定",
"description": "言語、日付形式、地域の設定をカスタマイズします。",
"language": "言語",
"languageDescription": "使用する言語を選択してください",
"dateFormat": "日付形式",
"dateFormatDescription": "アプリケーション全体で日付をどのように表示するかを選択します",
"timeFormat": "時刻形式",
"timeFormatDescription": "12時間表記または24時間表記を選択します",
"12hour": "12時間 (AM/PM)",
"24hour": "24時間",
"firstDayOfWeek": "週の開始曜日",
"firstDayOfWeekDescription": "週の最初の曜日を選択します",
"sunday": "日曜日",
"monday": "月曜日",
"saturday": "土曜日",
"formats": {
"mdy": "MM/DD/YYYY (米国)",
"dmy": "DD/MM/YYYY (欧州)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "長い形式 (例: January 1, 2024)",
"short": "短い形式 (例: Jan 1, 2024)"
}
},
"sidepanel": {
"title": "サイドパネルのカスタマイズ",
"description": "サイドパネル内のカードのレイアウトと表示をカスタマイズします。この機能はタブレットやデスクトップなど大画面のデバイスでのみ利用できます。"
},
"theme": {
"title": "テーマ設定",
"description": "サイトの見た目を選択します。単一のテーマを選ぶか、システム設定に同期して昼夜のテーマを自動で切り替えることができます。",
"themeMode": "テーマモード",
"light": "ライト",
"dark": "ダーク",
"system": "システム"
},
"notifications": {
"settingsSaved": "設定を保存しました",
"settingsSaveFailed": "設定の保存に失敗しました",
"invalidWebhook": "Webhook URL が無効です"
},
"profile": {
"title": "プロフィール設定",
"description": "表示名とプロフィール写真を更新します。",
"photoUpdated": "写真を更新しました",
"photoUpdatedMessage": "プロフィール写真が正常に更新されました!",
"uploadFailed": "アップロード失敗",
"uploadFailedMessage": "写真のアップロードに失敗しました。もう一度お試しください。",
"profileUpdated": "プロフィールを更新しました",
"profileUpdatedMessage": "プロフィール情報が正常に保存されました!",
"updateFailed": "更新失敗",
"updateFailedMessage": "プロフィールを更新できませんでした。接続を確認してから再度お試しください。",
"changePhoto": "写真を変更",
"displayName": "表示名",
"displayNamePlaceholder": "表示名を入力してください",
"timezone": "タイムゾーン",
"timezonePlaceholder": "タイムゾーンを選択してください",
"common": {
"save": "保存",
"cancel": "キャンセル"
"cancel": "キャンセル",
"confirm": "確認",
"remove": "削除",
"delete": "削除",
"refresh": "更新",
"loading": "読み込み中…",
"on": "オン",
"off": "オフ",
"error": "エラー",
"success": "成功",
"plusFeature": "Plus機能",
"earlyAccess": "早期アクセス"
},
"overview": {
"title": "設定",
"subtitle": "体験をカスタマイズし、アカウント設定を管理します",
"subtitle": "アプリの使い方をカスタマイズし、アカウント設定を管理します",
"upgrade": {
"title": "Plusアップグレード",
"description": "強力な機能を解放して生産性を向上させましょう",
"title": "Plusアップグレード",
"description": "強力な機能を解放して生産性を高めましょう",
"button": "今すぐアップグレード",
"features": {
"richText": "リッチテキストの説明",
"notifications": "タスク通知",
"apiIntegrations": "API 連携",
"apiIntegrations": "API連携",
"advancedAutomation": "高度な自動化"
}
},
@@ -123,15 +36,15 @@
},
"circle": {
"title": "サークル設定",
"description": "サークルの管理、メンバーの招待、参加リクエストへの対応を行います。"
"description": "サークルの管理、メンバーの招待、参加リクエストの処理を行います。"
},
"account": {
"title": "アカウント設定",
"description": "サブスクリプションの管理、パスワード変更、アカウント削除を行います。"
"description": "サブスクリプションの管理、パスワード変更、アカウント削除を行います。"
},
"subaccounts": {
"title": "管理アカウント",
"description": "サブアカウントを作成・管理し、ログイン割り当てられたタスク完了を行えるようにします。"
"description": "ログインして割り当てられたタスク完了できるサブアカウントを作成・管理します。"
},
"notifications": {
"title": "通知",
@@ -139,40 +52,443 @@
},
"mfa": {
"title": "多要素認証",
"description": "認証アプリを使った MFA でセキュリティをさらに強化します。"
"description": "認証アプリを使ったMFAでセキュリティを強化します。"
},
"apitokens": {
"title": "API トークン",
"description": "サードパーティ連携や API アクセス用のトークンを生成・管理します。"
"title": "APIトークン",
"description": "外部サービス連携やAPIアクセス用のアクセストークンを発行・管理します。"
},
"storage": {
"title": "ストレージ設定",
"description": "データのバックアップと復元、ローカルストレージと同期設定を管理します。"
"description": "データのバックアップと復元、ローカルストレージと同期設定を管理します。"
},
"sidepanel": {
"title": "サイドパネルのカスタマイズ",
"description": "サイドパネルのカードのレイアウトと表示をカスタマイズします。"
"description": "サイドパネルのカードの並びと表示・非表示をカスタマイズします。"
},
"theme": {
"title": "テーマ設定",
"description": "好みのテーマを選択し、ダーク/ライトモード設定を行います。"
"description": "好みのテーマを選び、ライト/ダークモード設定ます。"
},
"localization": {
"title": "地域設定",
"description": "言語、日付形式、時刻形式、地域設定をカスタマイズします。"
"title": "地域と言語",
"description": "言語、日付形式、時刻形式、地域設定をカスタマイズします。"
},
"advanced": {
"title": "詳細設定",
"description": "Webhook、リアルタイム更新、その他の高度な機能を設定して生産性を高めます。"
"description": "Webhook、リアルタイム更新など、生産性を高める高度な機能を設定します。"
},
"developer": {
"title": "開発者設定",
"description": "認証トークン、SSE 接続、デバッグデータなどの技術情報を確認できます。"
"description": "認証トークン、SSE接続、デバッグデータなどの技術情報を表示します。"
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "フィードバックを送る",
"description": "Donetickの使い心地を教えてください。機能のご要望もどうぞ。"
},
"bugReport": {
"title": "不具合を報告",
"description": "うまく動かないところがありますか?技術情報とあわせて詳細をお送りください。"
}
}
},
"profile": {
"title": "プロフィール設定",
"description": "表示名とプロフィール写真を更新します。",
"photoUpdated": "写真を更新しました",
"photoUpdatedMessage": "プロフィール写真を更新しました。",
"uploadFailed": "アップロードに失敗しました",
"uploadFailedMessage": "写真をアップロードできませんでした。もう一度お試しください。",
"profileUpdated": "プロフィールを更新しました",
"profileUpdatedMessage": "プロフィール情報を保存しました。",
"updateFailed": "更新に失敗しました",
"updateFailedMessage": "プロフィールを更新できませんでした。接続を確認してもう一度お試しください。",
"changePhoto": "写真を変更",
"editPhoto": "プロフィール写真を編集",
"displayName": "表示名",
"displayNamePlaceholder": "表示名を入力",
"timezone": "タイムゾーン",
"timezonePlaceholder": "タイムゾーンを選択",
"save": "保存",
"cancel": "キャンセル"
},
"circleSettings": {
"title": "サークル設定",
"description": "サークルを作成または参加すると、アカウントは自動的にそのサークルに接続されます。下のサークルコードやリンクを共有して、友だちを簡単に招待できます。誰かが参加をリクエストすると、下に通知が表示されます。",
"memberOf": "あなたは{{name}}のメンバーです",
"yourCircleCode": "あなたのサークルコード:",
"copyCode": "コードをコピー",
"shareInvite": "招待を共有",
"codeCopied": "コードをクリップボードにコピーしました",
"linkCopied": "招待リンクをクリップボードにコピーしました",
"myCircle": "私のサークル",
"shareTitle": "Donetickで{{name}}に参加しませんか",
"shareText": "Donetickの{{name}}にご招待します。",
"shareDialogTitle": "サークルの招待を共有",
"leave": "サークルを退出",
"leaveConfirmTitle": "サークルを退出",
"leaveConfirmMessage": "サークルを退出してもよろしいですか?",
"leaveConfirmButton": "退出",
"leftCircle": "サークルを退出しました",
"leaveFailed": "サークルを退出できませんでした",
"circleMembers": "サークルのメンバー",
"you": "(あなた)",
"pendingApproval": "承認待ち",
"joinedOn": "{{date}}に参加",
"requestedToJoin": "参加リクエスト {{date}}",
"roles": {
"member": "メンバー",
"memberDescription": "サークルの一般メンバーです",
"manager": "マネージャー",
"managerDescription": "他のユーザーになりかわって操作できます",
"admin": "管理者",
"adminDescription": "サークルへのフルアクセス"
},
"roleUpdateFailed": "役割を更新できませんでした",
"removeMemberTitle": "メンバーを削除",
"removeMemberMessage": "{{name}}をサークルから削除してもよろしいですか?",
"memberRemoved": "メンバーを削除しました",
"circleMemberRequests": "サークルへの参加リクエスト",
"lastUpdated": "最終更新: {{time}}",
"refreshing": "更新中…",
"refreshFailed": "参加リクエストを更新できませんでした",
"wantsToJoin": "{{name}}さんがサークルへの参加を希望しています。",
"accept": "承認",
"acceptRequestTitle": "参加リクエストを承認",
"acceptRequestMessage": "{{name}}(ユーザー名: {{username}})のサークル参加を承認してもよろしいですか?",
"requestAccepted": "リクエストを承認しました",
"or": "または",
"joinOtherDescription": "他の人のサークルに参加しますか?サークルコードまたは参加リンクを教えてもらい、下にコードを入力して参加してください。",
"enterCircleCode": "サークルコードを入力:",
"enterCodePlaceholder": "コードを入力",
"joinCircle": "サークルに参加",
"joinedPending": "サークルに参加しました。サークルの所有者がリクエストを承認するまでお待ちください。",
"alreadyMember": "すでにこのサークルのメンバーです",
"joinFailed": "サークルに参加できませんでした"
},
"accountSettings": {
"title": "アカウント設定",
"description": "アカウント設定、プラン、パスワードを変更します",
"accountType": "アカウントの種類: {{type}}",
"free": "無料",
"plus": "Plus",
"plusUntil": "Plus{{date}}まで)",
"activeDescription": "現在Plusプランをご利用中です。サブスクリプションは{{date}}に更新されます。",
"cancelledDescription": "サブスクリプションを解約しました。アカウントは{{date}}に無料プランへ変更されます。",
"freeDescription": "現在は無料プランをご利用中です。Plusにアップグレードすると、さらに多くの機能をご利用いただけます。",
"upgrade": "アップグレード",
"cancel": "解約",
"password": "パスワード:",
"changePassword": "パスワードを変更",
"passwordChanged": "パスワードを変更しました",
"passwordChangeFailed": "パスワードを変更できませんでした",
"dangerZone": "危険な操作",
"dangerZoneDescription": "アカウントを削除すると元に戻すことはできません。慎重にご判断ください。",
"deleteAccount": "アカウントを削除",
"accountDeleted": "アカウントを削除しました",
"subscriptionCancelled": "サブスクリプションを解約しました",
"subscriptionCancelFailed": "サブスクリプションを解約できませんでした",
"purchase": {
"success": "購入が完了しました。Plus機能を利用するにはアプリを再起動してください。",
"storeConnection": "ストアへの接続に問題があります。ネットワークを確認してもう一度お試しください。",
"notAllowed": "このデバイスでは購入が許可されていません。デバイスの制限設定をご確認ください。",
"unavailable": "このサブスクリプションはご利用いただけません。しばらくしてからお試しください。",
"alreadyProcessed": "この購入はすでに処理されています。問題があると思われる場合はサポートにお問い合わせください。",
"receiptMissing": "購入レシートが見つかりません。もう一度購入をお試しください。",
"networkError": "ネットワークエラーです。接続を確認してもう一度お試しください。",
"invalidReceipt": "購入レシートが無効です。解決しない場合はサポートにお問い合わせください。",
"pending": "支払いは承認待ちです。承認され次第ご利用いただけます。",
"failed": "購入に失敗しました: {{error}}。もう一度お試しいただくか、サポートにお問い合わせください。",
"unknownError": "不明なエラー"
}
},
"subaccounts": {
"title": "管理アカウント",
"description": "サブアカウントを管理します。サブアカウントのユーザーはログインして、割り当てられたタスクを完了できます。",
"notParentTitle": "サブアカウントの管理",
"notParentMessage": "サブアカウントを管理できるのは主アカウントのみです。",
"freePlanNotice": "無料プランではサブアカウントは1つまでです。Plusにアップグレードすると最大5つまで作成できます。",
"count": "サブアカウント({{count}}",
"add": "サブアカウントを追加",
"loading": "サブアカウントを読み込み中…",
"emptyTitle": "サブアカウントがありません",
"emptyDescription": "サブアカウントを作成すると、メンバーがログインして担当タスクを完了できるようになります。",
"addFirst": "最初のサブアカウントを追加",
"username": "ユーザー名: {{username}}",
"created": "作成日: {{date}}",
"changePassword": "パスワードを変更",
"deleteAccount": "アカウントを削除",
"createdSuccess": "サブアカウント「{{name}}」を作成しました。",
"createFailed": "サブアカウントを作成できませんでした: {{error}}",
"createFailedGeneric": "サブアカウントを作成できませんでした",
"passwordUpdated": "サブアカウントのパスワードを更新しました",
"passwordUpdateFailed": "パスワードを更新できませんでした: {{error}}",
"passwordUpdateFailedGeneric": "パスワードを更新できませんでした",
"deleteConfirmTitle": "サブアカウントを削除",
"deleteConfirmMessage": "サブアカウント「{{name}}」を削除してもよろしいですか?この操作は取り消せません。",
"deleted": "サブアカウント「{{name}}」を削除しました",
"deleteFailed": "サブアカウントを削除できませんでした: {{error}}",
"deleteFailedGeneric": "サブアカウントを削除できませんでした",
"howItWorksTitle": "管理アカウントのしくみ",
"howItWorks1": "管理アカウントは主アカウントが作成します。削除やパスワードのリセットを自分で行いたいユーザー向けです。",
"howItWorks2": "サブアカウントは独自のユーザー名とパスワードでログインできます。",
"howItWorks3": "管理アカウントはタスクを完了できますが、管理者権限は制限されています",
"howItWorks4": "管理アカウントは自動的にあなたのサークルに追加されます"
},
"notifications": {
"title": "通知設定",
"deviceSection": "デバイス通知",
"deviceSectionDescription": "デバイス通知を管理します",
"deviceLabel": "デバイス通知",
"deviceHelper": "タスクの期限になるとデバイスに通知を受け取ります",
"mobileOnly": "この機能はモバイル端末でのみ利用できます",
"testNotification": "テスト通知",
"testNotificationBody": "まもなく期限のタスクがあります",
"dueTitle": "期限の通知",
"dueLabel": "タスクの期限になったときの通知",
"preDueTitle": "期限前の通知",
"preDueLabel": "タスクの期限の数時間前に届く通知",
"overdueTitle": "期限切れの通知",
"overdueLabel": "タスクが期限切れになったときの通知",
"pushLabel": "プッシュ通知",
"pushHelper": "リマインド、お知らせ、タスクの割り当てをプッシュ通知で受け取ります",
"registeredDevices": "登録済みデバイス({{count}}/5",
"registeredDevicesDescription": "アカウントのプッシュ通知を受け取るために登録されたデバイス",
"currentDevice": "現在のデバイス: {{platform}} {{model}}",
"currentDeviceNotRegistered": "このデバイスはプッシュ通知に登録されていません",
"limitReached": "上限に達しました",
"registerDevice": "デバイスを登録",
"unknownDevice": "不明なデバイス",
"deviceCreatedAt": "登録日: {{date}}",
"noDevices": "プッシュ通知に登録されたデバイスはありません",
"customSection": "カスタム通知",
"customSectionDescription": "TelegramやPushoverなど、他のプラットフォーム経由の通知",
"customLabel": "カスタム通知",
"customHelper": "他のプラットフォームで通知を受け取ります",
"targetNone": "なし",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhook",
"telegramBotHelpBefore": "Telegram通知を利用するには、まずボットにメッセージを送る必要があります",
"telegramBotHelpAfter": "でチャットを開始してください",
"clickHere": "こちら",
"chatId": "チャットID",
"chatIdPlaceholder": "ユーザーID / チャットID",
"telegramChatIdHelpBefore": "チャットIDが分からない場合は、userinfobotとチャットを開始すると教えてくれます。",
"telegramChatIdHelpAfter": "でuserinfobotとのチャットを開始してください",
"userKey": "ユーザーキー",
"userKeyPlaceholder": "ユーザーID",
"chatIdRequired": "チャットIDは必須です",
"chatIdInvalid": "チャットIDが正しくありません",
"userKeyRequired": "ユーザーキーは必須です",
"targetUpdated": "通知先を更新しました",
"targetUpdateFailed": "通知先の更新中にエラーが発生しました: {{error}}",
"deviceRegistered": "デバイスをプッシュ通知に登録しました。",
"deviceLimitTitle": "デバイス数の上限に達しました",
"deviceLimitMessage": "登録できるデバイスは最大5台です。このデバイスを登録する前に、いずれかのデバイスを削除してください。",
"registrationFailedTitle": "登録に失敗しました",
"registrationFailedMessage": "デバイスを自動的に登録できませんでした。もう一度お試しください。",
"permissionRequiredTitle": "権限が必要です",
"permissionRequiredMessage": "このデバイスを登録するにはプッシュ通知の権限が必要です。",
"registrationInitiatedTitle": "登録を開始しました",
"registrationInitiatedMessage": "プッシュ通知の登録を開始しました。デバイスは自動的に登録されます。",
"registerDeviceFailed": "デバイスを登録できませんでした。もう一度お試しください。",
"permissionDeniedTitle": "通知の権限が拒否されました",
"permissionDeniedMessage": "通知の権限が拒否されました。後からデバイスの設定で有効にできます。",
"pushPermissionDeniedTitle": "プッシュ通知の権限が拒否されました",
"pushPermissionDeniedMessage": "プッシュ通知が無効になりました。必要に応じてデバイスの設定から有効にできます。",
"unregisterFailed": "デバイスの登録を解除できませんでした"
},
"mfa": {
"title": "多要素認証",
"description": "多要素認証MFAでアカウントのセキュリティを強化します。有効にすると、サインイン時にパスワードに加えて認証アプリの確認コードの入力が必要になります。",
"twoFactor": "2要素認証",
"enabledSubtitle": "アカウントは2FAで保護されています",
"disabledSubtitle": "認証アプリでアカウントを保護しましょう",
"enable": "有効にする",
"disable": "無効にする",
"enabledSuccess": "MFAを有効にしました。",
"disabledSuccess": "MFAを無効にしました。",
"errors": {
"qrGenerationFailed": "QRコードを生成できませんでした",
"invalidResponse": "サーバーからの応答が正しくありません。QRコードまたはシークレットがありません。",
"notFound": "MFA設定のエンドポイントが見つかりません。この機能はまだ利用できない可能性があります。",
"unauthorized": "権限がありません。もう一度ログインしてください。",
"serverError": "サーバーエラーです。しばらくしてからお試しください。",
"setupFailed": "MFAの設定に失敗しました{{status}})。もう一度お試しください。",
"networkError": "ネットワークエラーです。接続を確認してもう一度お試しください。",
"invalidCode": "確認コードが正しくありません。もう一度お試しください。",
"confirmFailed": "MFAを確認できませんでした。もう一度お試しください。",
"disableFailed": "MFAを無効にできませんでした。もう一度お試しください。"
},
"setup": {
"title": "多要素認証を設定",
"addedAccount": "アカウントを追加しました",
"back": "戻る",
"verifyAndEnable": "確認して有効にする",
"savedBackupCodes": "バックアップコードを保存しました",
"step1Label": "ステップ1:",
"step1": "下のQRコードを認証アプリGoogle Authenticator、Authyなどで読み取ってください",
"qrAlt": "MFAのQRコード",
"qrFailed": "QRコードを生成できませんでした。もう一度お試しいただくか、下の手動入力キーをご利用ください。",
"manualKey": "手動入力キー:",
"step2Label": "ステップ2:",
"step2": "認証アプリに表示される6桁の確認コードを入力してください",
"codePlaceholder": "6桁のコードを入力",
"successTitle": "MFAを有効にしました",
"backupCodesTitle": "このバックアップコードを安全な場所に保管してください",
"backupCodesDescription": "認証用デバイスを紛失した場合、これらのコードでアカウントにアクセスできます。各コードは1回のみ使用できます。"
},
"disableModal": {
"title": "多要素認証を無効にする",
"warning": "MFAを無効にするとアカウントの安全性が下がります。続行してもよろしいですか",
"prompt": "確認のため、認証アプリの確認コードを入力してください:",
"confirm": "MFAを無効にする"
},
"backupCodesModal": {
"title": "新しいバックアップコード",
"warning": "以前のバックアップコードは無効になりました。新しいコードを安全な場所に保管してください。各コードは1回のみ使用できます。"
}
},
"apiTokens": {
"title": "APIトークン",
"accessToken": "アクセストークン",
"description": "タスクをトリガーするモをAPIで更新するためのトークンを作成します",
"plusNotice": "APIトークンはベーシックプランではご利用いただけません。Plusにアップグレードすると、外部システムとの連携やタスクの自動化に使えるAPIトークンを発行できます。",
"showToken": "トークンを表示",
"hideToken": "トークンを隠す",
"removeTitle": "トークンを削除",
"removeMessage": "{{name}}を削除してもよろしいですか?",
"removedTitle": "削除しました",
"removedMessage": "APIトークンを削除しました",
"tokenCopied": "トークンをクリップボードにコピーしました",
"generateNew": "新しいトークンを生成",
"nameModalTitle": "新しいトークンに、あとで見分けられる名前を付けてください。",
"generateToken": "トークンを生成"
},
"storage": {
"title": "ストレージ設定",
"serverTitle": "サーバーストレージの使用量",
"serverDescription": "アカウントがサーバー上で使用しているストレージです(アップロードしたファイル、画像、データなど)。",
"usagePlaceholder": "-- MB使用 / 合計 -- MB--",
"usage": "{{used}} MB使用 / 合計 {{total}} MB{{percent}}%",
"basicPlanNotice": "サーバーストレージはベーシックプランではご利用いただけません。Plusにアップグレードすると使用量を確認できます。",
"localTitleApp": "アプリのローカルストレージとキャッシュ",
"localTitleBrowser": "ブラウザのローカルストレージとキャッシュ",
"localDescription": "高速に読み込むためにブラウザ内へローカル保存されたデータです。消去してもサーバー上のデータには影響しませんが、ログアウトされる場合があります。",
"clearLocal": "ローカルストレージとキャッシュをすべて消去",
"clearLocalTitle": "ローカルストレージをすべて消去",
"clearLocalMessage": "ローカルストレージとキャッシュを消去してもよろしいですか?このブラウザからすべてのデータが削除され、再度ログインが必要になります。",
"clearAll": "すべて消去",
"appPreferences": "アプリの設定",
"deviceOnly": "この端末のみ",
"appPreferencesDescription": "アプリが端末にローカル保存している設定です。消去するとアプリ固有の設定がリセットされ、ログアウトされる場合がありますが、サーバー上のデータには影響しません。",
"clearPreferences": "アプリの設定を消去",
"clearPreferencesTitle": "アプリの設定を消去",
"clearPreferencesMessage": "アプリの設定をすべて消去してもよろしいですか?設定がリセットされ、再度ログインが必要になる場合があります。"
},
"sidepanel": {
"title": "サイドパネルのカスタマイズ",
"heading": "サイドパネル設定",
"description": "サイドパネルに表示するカードと並び順を設定します。ドラッグ&ドロップで並べ替えたり、カードごとに表示・非表示を切り替えたりできます。",
"resetToDefaults": "初期設定に戻す",
"resetHelper": "すべてのカードの表示状態と並び順が初期設定に戻ります。",
"cards": {
"welcome": {
"name": "ユーザー切り替え",
"description": "管理者やマネージャーが他のユーザーとしてタスクを表示できます"
},
"smartInsights": {
"name": "スマートインサイト",
"description": "タスクに応じたクイックアクション"
},
"assignees": {
"name": "担当者別のタスク",
"description": "担当者ごとにタスクをまとめて表示します"
},
"calendar": {
"name": "カレンダー表示",
"description": "タスクをカレンダー形式で表示します"
},
"activities": {
"name": "最近のアクティビティ",
"description": "最近完了したタスクやアクティビティを表示します"
},
"weeklyGoals": {
"name": "週間目標",
"description": "週の進捗と家族全体の達成状況を表示します"
}
}
},
"theme": {
"title": "テーマ設定",
"description": "サイトの見た目を選べます。テーマを固定するか、システムと同期して昼夜で自動的に切り替えられます。",
"themeMode": "テーマモード",
"light": "ライト",
"dark": "ダーク",
"system": "システム"
},
"localization": {
"title": "地域と言語",
"description": "アカウントの言語、日付形式、地域設定をカスタマイズします。",
"language": "言語",
"languageDescription": "使用する言語を選択してください",
"rtlNotice": "この言語は右から左RTLに表記されます",
"dateFormat": "日付形式",
"dateFormatDescription": "アプリ全体での日付の表示方法を選択します",
"timeFormat": "時刻形式",
"timeFormatDescription": "12時間表示か24時間表示かを選択します",
"preview": "プレビュー: {{value}}",
"12hour": "12時間表示AM/PM",
"24hour": "24時間表示",
"firstDayOfWeek": "週の始まり",
"firstDayOfWeekDescription": "週の始まりの曜日を選択します",
"sunday": "日曜日",
"monday": "月曜日",
"saturday": "土曜日",
"formats": {
"mdy": "MM/DD/YYYY米国",
"dmy": "DD/MM/YYYY欧州",
"ymd": "YYYY-MM-DDISO",
"long": "長い形式(例: 2024年1月1日",
"short": "短い形式(例: 2024/1/1"
}
},
"advanced": {
"title": "詳細設定",
"description": "Webhookやリアルタイム更新など、生産性を高める高度な機能を設定します。",
"offlineTitle": "オフライン対応",
"offlineDescription": "この端末・ブラウザでオフラインでもDonetickを使えます。変更はローカルに保存され、オンラインに戻ると同期されます。",
"offlineToggle": "オフライン対応を有効にする",
"offlineHelper": "無効にすると、未同期のオフライン変更とこの端末・ブラウザに保存されたオフラインデータが削除されます。",
"offlineEnabled": "この端末・ブラウザでオフラインモードを有効にしました",
"offlineDisabled": "オフラインモードを無効にし、ローカルデータを消去しました",
"offlineDisabledPartial": "オフラインモードを無効にしましたが、一部のローカルデータが残っている可能性があります",
"offlineDisableTitle": "オフラインモードを無効にする",
"offlineDisableMessage": "オフラインモードを無効にすると、未同期のオフライン変更とこの端末・ブラウザに保存されたオフラインデータが削除されます。続行しますか?",
"offlineDisableConfirm": "無効にしてデータを消去",
"webhookTitle": "Webhook連携",
"webhookDescription": "Webhookを使うと、サークル内でイベントが発生したときに他のサービスへリアルタイムで通知を送れます。WebhookのURLを設定してリアルタイム更新を受け取りましょう。",
"webhookPlusNotice": "Webhook通知はベーシックプランではご利用いただけません。Plusにアップグレードすると、Webhook経由でリアルタイム更新を受け取れます。",
"webhookToggle": "Webhookを有効にする",
"webhookHelper": "タスクとモの更新についてWebhook通知を有効にします。",
"webhookURL": "WebhookのURL",
"webhookUpdated": "WebhookのURLを更新しました",
"webhookUpdateFailed": "WebhookのURLを更新できませんでした",
"realtimeTitle": "リアルタイム更新",
"realtimeDescription": "サークル内でタスクやアクティビティが変化したときに、更新をどう受け取るかを設定します。",
"realtime": {
"toggleLabel": "リアルタイム更新を有効にする",
"title": "リアルタイム更新",
"subtitle": "タスクが更新されるとすぐに通知を受け取れます",
"statusLabel": "ステータス:",
"basicPlan": "リアルタイム更新はベーシックプランではご利用いただけません。Plusにアップグレードすると、タスクの更新時にすぐ通知を受け取れます。",
"disabled": "リアルタイム更新は無効です。有効にすると、あなたや他のサークルメンバーがタスクを完了・スキップ・変更したときに、その変化をすぐに確認できます。",
"connected": "リアルタイム更新は正常に動作しています。あなたや他のサークルメンバーがタスクを完了・スキップ・変更すると、その変化がすぐに反映されます。",
"connecting": "リアルタイム更新に接続中…",
"errored": "リアルタイム更新は有効ですが動作していません: {{error}}",
"notConnected": "リアルタイム更新は有効ですが、現在接続されていません。",
"basicPlanNotice": "リアルタイム更新はベーシックプランではご利用いただけません。Plusにアップグレードすると、あなたや他のサークルメンバーがタスクを完了・スキップ・変更したときにすぐ通知を受け取れます。"
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Uitloggen",
"version": "Versie",
"navigation": {
"search": "Zoeken",
"allTasks": "Alle Taken",
"archived": "Gearchiveerd",
"things": "Dingen",
@@ -30,6 +31,44 @@
"points": "Punten",
"settings": "Instellingen"
},
"search": {
"title": "Zoeken",
"placeholder": "Zoeken in Donetick",
"inputAriaLabel": "Zoek in taken, geschiedenis, projecten, labels en instellingen",
"deviceNote": "Er wordt gezocht in inhoud die op dit apparaat beschikbaar is",
"escape": "Esc",
"recent": "Recent",
"empty": {
"title": "Geen directe resultaten",
"subtitle": "Je kunt de takenlijst nog steeds filteren met deze zoekopdracht."
},
"groups": {
"tasks": "Taken",
"history": "Notities",
"projects": "Projecten",
"labels": "Labels",
"people": "Personen",
"settings": "Instellingen",
"actions": "Snelle acties"
},
"actions": {
"quickAction": "Snelle actie",
"navigation": "Navigatie",
"createTask": "Taak aanmaken",
"viewAllTasks": "Alle taken bekijken",
"viewArchivedTasks": "Gearchiveerde taken bekijken",
"openSettings": "Instellingen openen",
"filterTasks": "Taken tonen die overeenkomen met {{query}}",
"filterTasksSubtitle": "De takenlijst filteren"
},
"footer": {
"navigate": "Navigeren",
"open": "Openen",
"results_one": "{{count}} resultaat",
"results_other": "{{count}} resultaten",
"typeToSearch": "Typ om te zoeken"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,116 +1,29 @@
{
"title": "Instellingen",
"circleSettings": {
"title": "Cirkelinstellingen",
"description": "Uw account wordt automatisch verbonden met een Cirkel wanneer u er een aanmaakt of lid wordt. Nodig eenvoudig vrienden uit door de unieke Cirkelcode of onderstaande link te delen.",
"circleCode": "Cirkelcode",
"copyCode": "Code Kopiëren",
"copyLink": "Link Kopiëren",
"codeCopied": "Cirkelcode gekopieerd!",
"linkCopied": "Link gekopieerd!",
"joinCircle": "Lid Worden van een Cirkel",
"joinCirclePlaceholder": "Voer Cirkelcode in",
"join": "Lid Worden",
"leave": "Cirkel Verlaten",
"leaveConfirmTitle": "Cirkel Verlaten",
"leaveConfirmMessage": "Weet u zeker dat u deze cirkel wilt verlaten?",
"circleMembers": "Cirkelleden",
"circleMemberRequests": "Aanvragen voor Cirkellidmaatschap",
"admin": "Beheerder",
"member": "Lid",
"pending": "In behandeling",
"accept": "Accepteren",
"reject": "Afwijzen",
"makeAdmin": "Beheerder Maken",
"makeMember": "Lid Maken",
"remove": "Verwijderen",
"webhookURL": "Webhook URL",
"webhookDescription": "Voer een webhook URL in om meldingen te ontvangen voor cirkelgebeurtenissen",
"webhookPlaceholder": "https://uw-webhook-url.com"
},
"accountSettings": {
"title": "Accountinstellingen",
"subscription": "Abonnement",
"subscriptionStatus": "Huidig Plan",
"free": "Gratis",
"plus": "Plus",
"upgrade": "Upgraden",
"cancel": "Annuleren",
"changePassword": "Wachtwoord Wijzigen",
"password": "Wachtwoord",
"dangerZone": "Gevarenzone",
"dangerZoneDescription": "Zodra u uw account verwijdert, is er geen weg terug. Wees zeker van uw beslissing.",
"deleteAccount": "Account Verwijderen"
},
"localization": {
"title": "Lokalisatie",
"description": "Pas de taal, datumnotatie en regionale voorkeuren voor uw account aan.",
"language": "Taal",
"languageDescription": "Selecteer uw voorkeurstaal",
"dateFormat": "Datumnotatie",
"dateFormatDescription": "Kies hoe datums in de applicatie worden weergegeven",
"timeFormat": "Tijdnotatie",
"timeFormatDescription": "Selecteer 12-uurs of 24-uurs tijdnotatie",
"12hour": "12-uurs (AM/PM)",
"24hour": "24-uurs",
"firstDayOfWeek": "Eerste Dag van de Week",
"firstDayOfWeekDescription": "Selecteer welke dag uw week begint",
"sunday": "Zondag",
"monday": "Maandag",
"saturday": "Zaterdag",
"formats": {
"mdy": "MM/DD/JJJJ (VS)",
"dmy": "DD/MM/JJJJ (Europa)",
"ymd": "JJJJ-MM-DD (ISO)",
"long": "Lang formaat (bijv. 1 januari 2024)",
"short": "Kort formaat (bijv. 1 jan 2024)"
}
},
"sidepanel": {
"title": "Zijpaneel Aanpassen",
"description": "Pas de indeling en zichtbaarheid van kaarten in het zijpaneel aan. Deze sectie is alleen beschikbaar op grote schermapparaten zoals tablets en desktops."
},
"theme": {
"title": "Themavoorkeuren",
"description": "Kies hoe de site er voor u uitziet. Selecteer een enkel thema of synchroniseer met uw systeem en schakel automatisch tussen dag- en nachtthema's.",
"themeMode": "Thamamodus",
"light": "Licht",
"dark": "Donker",
"system": "Systeem"
},
"notifications": {
"settingsSaved": "Instellingen succesvol opgeslagen",
"settingsSaveFailed": "Opslaan van instellingen mislukt",
"invalidWebhook": "Ongeldige webhook URL"
},
"profile": {
"title": "Profielinstellingen",
"description": "Werk uw weergavenaam en profielfoto bij.",
"photoUpdated": "Foto Bijgewerkt",
"photoUpdatedMessage": "Uw profielfoto is succesvol bijgewerkt!",
"uploadFailed": "Uploaden Mislukt",
"uploadFailedMessage": "Het uploaden van uw foto is mislukt. Probeer het opnieuw.",
"profileUpdated": "Profiel Bijgewerkt",
"profileUpdatedMessage": "Uw profielgegevens zijn succesvol opgeslagen!",
"updateFailed": "Bijwerken Mislukt",
"updateFailedMessage": "Kan uw profiel niet bijwerken. Controleer uw verbinding en probeer het opnieuw.",
"changePhoto": "Foto Wijzigen",
"displayName": "Weergavenaam",
"displayNamePlaceholder": "Voer uw weergavenaam in",
"timezone": "Tijdzone",
"timezonePlaceholder": "Selecteer uw tijdzone",
"common": {
"save": "Opslaan",
"cancel": "Annuleren"
"cancel": "Annuleren",
"confirm": "Bevestigen",
"remove": "Verwijderen",
"delete": "Verwijderen",
"refresh": "Vernieuwen",
"loading": "Laden…",
"on": "Aan",
"off": "Uit",
"error": "Fout",
"success": "Gelukt",
"plusFeature": "Plus-functie",
"earlyAccess": "Vroege toegang"
},
"overview": {
"title": "Instellingen",
"subtitle": "Pas uw ervaring aan en beheer uw accountvoorkeuren",
"subtitle": "Pas je ervaring aan en beheer je accountvoorkeuren",
"upgrade": {
"title": "Upgraden naar Plus",
"description": "Ontgrendel krachtige functies om uw productiviteit te verbeteren",
"button": "Nu Upgraden",
"description": "Ontgrendel krachtige functies en werk productiever",
"button": "Nu upgraden",
"features": {
"richText": "Rijke tekstbeschrijvingen",
"richText": "Opgemaakte beschrijvingen",
"notifications": "Taakmeldingen",
"apiIntegrations": "API-integraties",
"advancedAutomation": "Geavanceerde automatisering"
@@ -119,27 +32,27 @@
"sections": {
"profile": {
"title": "Profielinstellingen",
"description": "Werk uw profielgegevens, foto, weergavenaam en tijdzonevoorkeuren bij."
"description": "Werk je profielgegevens, foto, weergavenaam en tijdzone bij."
},
"circle": {
"title": "Cirkelinstellingen",
"description": "Beheer uw cirkel, nodig leden uit en behandel lidmaatschapsverzoeken."
"title": "Circle-instellingen",
"description": "Beheer je circle, nodig leden uit en handel deelnameverzoeken af."
},
"account": {
"title": "Accountinstellingen",
"description": "Beheer uw abonnement, wijzig het wachtwoord en opties voor accountverwijdering."
"description": "Beheer je abonnement, wijzig je wachtwoord en verwijder je account."
},
"subaccounts": {
"title": "Beheerde Accounts",
"description": "Maak subaccounts aan en beheer ze om in te loggen en toegewezen taken te voltooien."
"title": "Beheerde accounts",
"description": "Maak en beheer subaccounts die kunnen inloggen en toegewezen taken afronden."
},
"notifications": {
"title": "Meldingen",
"description": "Configureer pushmeldingen, e-mailwaarschuwingen en meldingsdoelen voor taken."
"description": "Stel pushmeldingen, e-mailwaarschuwingen en meldingsbestemmingen voor taken in."
},
"mfa": {
"title": "Multi-Factor Authenticatie",
"description": "Voeg een extra beveiligingslaag toe met MFA via authenticatie-apps."
"title": "Multifactorauthenticatie",
"description": "Voeg extra beveiliging toe met MFA via een authenticator-app."
},
"apitokens": {
"title": "API-tokens",
@@ -147,32 +60,435 @@
},
"storage": {
"title": "Opslaginstellingen",
"description": "Maak een back-up van uw gegevens en herstel ze, beheer lokale opslag en synchronisatievoorkeuren."
"description": "Maak back-ups en herstel je gegevens, beheer lokale opslag en synchronisatie."
},
"sidepanel": {
"title": "Zijpaneel Aanpassen",
"description": "Pas de indeling en zichtbaarheid van kaarten in de zijpaneelinterface aan."
"title": "Zijpaneel aanpassen",
"description": "Pas de indeling en zichtbaarheid van de kaarten in het zijpaneel aan."
},
"theme": {
"title": "Themavoorkeuren",
"description": "Kies uw voorkeursthema en configureer de instellingen voor donker/licht modus."
"description": "Kies je favoriete thema en stel de licht-/donkermodus in."
},
"localization": {
"title": "Lokalisatie",
"description": "Pas de taal, datumnotatie, tijdnotatie en regionale voorkeuren aan."
"description": "Pas taal, datumnotatie, tijdnotatie en regionale voorkeuren aan."
},
"advanced": {
"title": "Geavanceerde Instellingen",
"description": "Configureer webhooks, real-time updates en andere geavanceerde functies voor verbeterde productiviteit."
"title": "Geavanceerde instellingen",
"description": "Stel webhooks, realtime-updates en andere geavanceerde functies in."
},
"developer": {
"title": "Ontwikkelaarsinstellingen",
"description": "Bekijk technische informatie over authenticatietokens, SSE-verbindingen en foutopsporingsgegevens."
"description": "Bekijk technische informatie over authenticatietokens, SSE-verbindingen en debuggegevens."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "Feedback sturen",
"description": "Laat ons weten hoe Donetick voor je werkt of vraag een functie aan."
},
"bugReport": {
"title": "Een bug melden",
"description": "Werkt er iets niet goed? Stuur ons de details samen met een technische momentopname."
}
}
},
"profile": {
"title": "Profielinstellingen",
"description": "Werk je weergavenaam en profielfoto bij.",
"photoUpdated": "Foto bijgewerkt",
"photoUpdatedMessage": "Je profielfoto is bijgewerkt!",
"uploadFailed": "Uploaden mislukt",
"uploadFailedMessage": "Je foto kon niet worden geüpload. Probeer het opnieuw.",
"profileUpdated": "Profiel bijgewerkt",
"profileUpdatedMessage": "Je profielgegevens zijn opgeslagen!",
"updateFailed": "Bijwerken mislukt",
"updateFailedMessage": "Je profiel kon niet worden bijgewerkt. Controleer je verbinding en probeer het opnieuw.",
"changePhoto": "Foto wijzigen",
"editPhoto": "Profielfoto bewerken",
"displayName": "Weergavenaam",
"displayNamePlaceholder": "Voer je weergavenaam in",
"timezone": "Tijdzone",
"timezonePlaceholder": "Selecteer je tijdzone",
"save": "Opslaan",
"cancel": "Annuleren"
},
"circleSettings": {
"title": "Circle-instellingen",
"description": "Je account wordt automatisch aan een circle gekoppeld wanneer je er een aanmaakt of aan deelneemt. Nodig anderen eenvoudig uit door de unieke circle-code of link hieronder te delen. Je krijgt hieronder een melding als iemand aan je circle wil deelnemen.",
"memberOf": "Je maakt deel uit van {{name}}",
"yourCircleCode": "Je circle-code is:",
"copyCode": "Code kopiëren",
"shareInvite": "Uitnodiging delen",
"codeCopied": "Code gekopieerd naar klembord",
"linkCopied": "Uitnodigingslink gekopieerd naar klembord",
"myCircle": "mijn circle",
"shareTitle": "Kom bij {{name}} op Donetick",
"shareText": "Ik wil je uitnodigen om deel te nemen aan {{name}} op Donetick.",
"shareDialogTitle": "Circle-uitnodiging delen",
"leave": "Circle verlaten",
"leaveConfirmTitle": "Circle verlaten",
"leaveConfirmMessage": "Weet je zeker dat je je circle wilt verlaten?",
"leaveConfirmButton": "Verlaten",
"leftCircle": "Circle verlaten",
"leaveFailed": "Circle verlaten mislukt",
"circleMembers": "Circle-leden",
"you": "(Jij)",
"pendingApproval": "Wacht op goedkeuring",
"joinedOn": "Deelgenomen op {{date}}",
"requestedToJoin": "Deelnameverzoek {{date}}",
"roles": {
"member": "Lid",
"memberDescription": "Een gewoon lid van de circle",
"manager": "Beheerder",
"managerDescription": "Kan zich voordoen als gebruikers en namens hen handelen",
"admin": "Admin",
"adminDescription": "Volledige toegang tot de circle"
},
"roleUpdateFailed": "Rol bijwerken mislukt",
"removeMemberTitle": "Lid verwijderen",
"removeMemberMessage": "Weet je zeker dat je {{name}} uit je circle wilt verwijderen?",
"memberRemoved": "Lid verwijderd",
"circleMemberRequests": "Deelnameverzoeken",
"lastUpdated": "Laatst bijgewerkt: {{time}}",
"refreshing": "Vernieuwen…",
"refreshFailed": "Deelnameverzoeken vernieuwen mislukt",
"wantsToJoin": "{{name}} wil deelnemen aan je circle.",
"accept": "Accepteren",
"acceptRequestTitle": "Deelnameverzoek accepteren",
"acceptRequestMessage": "Weet je zeker dat je {{name}} (gebruikersnaam: {{username}}) wilt toelaten tot je circle?",
"requestAccepted": "Verzoek geaccepteerd",
"or": "of",
"joinOtherDescription": "Wil je deelnemen aan de circle van iemand anders? Vraag om hun unieke circle-code of deelnamelink. Voer de code hieronder in om deel te nemen.",
"enterCircleCode": "Voer de circle-code in:",
"enterCodePlaceholder": "Voer code in",
"joinCircle": "Deelnemen aan circle",
"joinedPending": "Deelname gelukt, wacht tot de eigenaar van de circle je verzoek accepteert.",
"alreadyMember": "Je bent al lid van deze circle",
"joinFailed": "Deelnemen aan circle mislukt"
},
"accountSettings": {
"title": "Accountinstellingen",
"description": "Wijzig je accountinstellingen, abonnement of wachtwoord",
"accountType": "Accounttype: {{type}}",
"free": "Gratis",
"plus": "Plus",
"plusUntil": "Plus (tot {{date}})",
"activeDescription": "Je hebt momenteel een Plus-abonnement. Je abonnement wordt verlengd op {{date}}.",
"cancelledDescription": "Je hebt je abonnement opgezegd. Je account gaat op {{date}} terug naar het gratis abonnement.",
"freeDescription": "Je gebruikt momenteel het gratis abonnement. Upgrade naar Plus om meer functies te ontgrendelen.",
"upgrade": "Upgraden",
"cancel": "Opzeggen",
"password": "Wachtwoord:",
"changePassword": "Wachtwoord wijzigen",
"passwordChanged": "Wachtwoord gewijzigd",
"passwordChangeFailed": "Wachtwoord wijzigen mislukt",
"dangerZone": "Gevarenzone",
"dangerZoneDescription": "Zodra je je account verwijdert, is er geen weg terug. Weet het zeker.",
"deleteAccount": "Account verwijderen",
"accountDeleted": "Account verwijderd",
"subscriptionCancelled": "Abonnement opgezegd",
"subscriptionCancelFailed": "Abonnement opzeggen mislukt",
"purchase": {
"success": "Aankoop gelukt! Start de app opnieuw op om de Plus-functies te gebruiken.",
"storeConnection": "Verbindingsprobleem met de store. Controleer je netwerk en probeer het opnieuw.",
"notAllowed": "Aankopen zijn niet toegestaan op dit apparaat. Controleer de beperkingen van je apparaat.",
"unavailable": "Dit abonnement is niet beschikbaar. Probeer het later opnieuw.",
"alreadyProcessed": "Deze aankoop is al verwerkt. Neem contact op met support als je denkt dat dit een fout is.",
"receiptMissing": "Aankoopbewijs ontbreekt. Probeer opnieuw te kopen.",
"networkError": "Netwerkfout. Controleer je verbinding en probeer het opnieuw.",
"invalidReceipt": "Ongeldig aankoopbewijs. Neem contact op met support als dit blijft gebeuren.",
"pending": "De betaling wacht op goedkeuring. Je krijgt toegang zodra deze is goedgekeurd.",
"failed": "Aankoop mislukt: {{error}}. Probeer het opnieuw of neem contact op met support.",
"unknownError": "Onbekende fout"
}
},
"subaccounts": {
"title": "Beheerde accounts",
"description": "Beheer subaccounts. Gebruikers van subaccounts kunnen inloggen en toegewezen taken afronden.",
"notParentTitle": "Beheer van subaccounts",
"notParentMessage": "Alleen hoofdaccounts kunnen subaccounts beheren.",
"freePlanNotice": "Met het gratis abonnement is 1 subaccount mogelijk. Upgrade naar Plus voor maximaal 5 subaccounts.",
"count": "Subaccounts ({{count}})",
"add": "Subaccount toevoegen",
"loading": "Subaccounts laden…",
"emptyTitle": "Geen subaccounts",
"emptyDescription": "Maak subaccounts aan zodat teamleden kunnen inloggen en hun toegewezen taken kunnen afronden.",
"addFirst": "Voeg je eerste subaccount toe",
"username": "Gebruikersnaam: {{username}}",
"created": "Aangemaakt: {{date}}",
"changePassword": "Wachtwoord wijzigen",
"deleteAccount": "Account verwijderen",
"createdSuccess": "Subaccount {{name}} is aangemaakt!",
"createFailed": "Subaccount aanmaken mislukt: {{error}}",
"createFailedGeneric": "Subaccount aanmaken mislukt",
"passwordUpdated": "Wachtwoord van subaccount bijgewerkt",
"passwordUpdateFailed": "Wachtwoord bijwerken mislukt: {{error}}",
"passwordUpdateFailedGeneric": "Wachtwoord bijwerken mislukt",
"deleteConfirmTitle": "Subaccount verwijderen",
"deleteConfirmMessage": "Weet je zeker dat je het subaccount {{name}} wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.",
"deleted": "Subaccount {{name}} verwijderd",
"deleteFailed": "Subaccount verwijderen mislukt: {{error}}",
"deleteFailedGeneric": "Subaccount verwijderen mislukt",
"howItWorksTitle": "Hoe beheerde accounts werken",
"howItWorks1": "Beheerde accounts worden aangemaakt door het hoofdaccount bedoeld voor mensen van wie je het account wilt kunnen verwijderen en het wachtwoord opnieuw wilt kunnen instellen.",
"howItWorks2": "Subaccounts kunnen inloggen met hun eigen gebruikersnaam en wachtwoord.",
"howItWorks3": "Beheerde accounts kunnen taken afronden, maar hebben beperkte beheerdersrechten",
"howItWorks4": "Beheerde accounts worden automatisch aan je circle toegevoegd"
},
"notifications": {
"title": "Meldingsinstellingen",
"deviceSection": "Apparaatmeldingen",
"deviceSectionDescription": "Beheer je apparaatmeldingen",
"deviceLabel": "Apparaatmelding",
"deviceHelper": "Ontvang een melding op je apparaat wanneer een taak verloopt",
"mobileOnly": "Deze functie is alleen beschikbaar op mobiele apparaten",
"testNotification": "Testmelding",
"testNotificationBody": "Je hebt binnenkort een taak die verloopt",
"dueTitle": "Melding bij vervaldatum",
"dueLabel": "Melding wanneer de taak verloopt",
"preDueTitle": "Melding vóór vervaldatum",
"preDueLabel": "Melding enkele uren voordat de taak verloopt",
"overdueTitle": "Melding bij achterstand",
"overdueLabel": "Melding wanneer de taak te laat is",
"pushLabel": "Pushmeldingen",
"pushHelper": "Ontvang herinneringen, aankondigingen en taaktoewijzingen via pushmeldingen",
"registeredDevices": "Geregistreerde apparaten ({{count}}/5)",
"registeredDevicesDescription": "Apparaten die zijn geregistreerd voor pushmeldingen van je account",
"currentDevice": "Huidig apparaat: {{platform}} {{model}}",
"currentDeviceNotRegistered": "Dit apparaat is niet geregistreerd voor pushmeldingen",
"limitReached": "Limiet bereikt",
"registerDevice": "Apparaat registreren",
"unknownDevice": "Onbekend apparaat",
"deviceCreatedAt": "Aangemaakt op: {{date}}",
"noDevices": "Geen apparaten geregistreerd voor pushmeldingen",
"customSection": "Aangepaste melding",
"customSectionDescription": "Meldingen via een ander platform zoals Telegram of Pushover",
"customLabel": "Aangepaste melding",
"customHelper": "Ontvang meldingen op een ander platform",
"targetNone": "Geen",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Je moet eerst een bericht naar de bot sturen voordat Telegram-meldingen werken",
"telegramBotHelpAfter": "om een chat te starten",
"clickHere": "Klik hier",
"chatId": "Chat-ID",
"chatIdPlaceholder": "Gebruikers-ID / chat-ID",
"telegramChatIdHelpBefore": "Als je je chat-ID niet kent, start dan een chat met userinfobot; die stuurt je je chat-ID.",
"telegramChatIdHelpAfter": "om een chat met userinfobot te starten",
"userKey": "Gebruikerssleutel",
"userKeyPlaceholder": "Gebruikers-ID",
"chatIdRequired": "Chat-ID is verplicht",
"chatIdInvalid": "Ongeldige chat-ID",
"userKeyRequired": "Gebruikerssleutel is verplicht",
"targetUpdated": "Meldingsbestemming bijgewerkt",
"targetUpdateFailed": "Fout bij het bijwerken van de meldingsbestemming: {{error}}",
"deviceRegistered": "Apparaat geregistreerd voor pushmeldingen.",
"deviceLimitTitle": "Apparaatlimiet bereikt",
"deviceLimitMessage": "Je hebt het maximum van 5 geregistreerde apparaten bereikt. Verwijder eerst een apparaat voordat je dit registreert.",
"registrationFailedTitle": "Registratie mislukt",
"registrationFailedMessage": "Het apparaat kon niet automatisch worden geregistreerd. Probeer het opnieuw.",
"permissionRequiredTitle": "Toestemming vereist",
"permissionRequiredMessage": "Toestemming voor pushmeldingen is vereist om dit apparaat te registreren.",
"registrationInitiatedTitle": "Registratie gestart",
"registrationInitiatedMessage": "De registratie voor pushmeldingen is gestart. Het apparaat wordt automatisch geregistreerd.",
"registerDeviceFailed": "Apparaat registreren mislukt. Probeer het opnieuw.",
"permissionDeniedTitle": "Meldingstoestemming geweigerd",
"permissionDeniedMessage": "Je hebt meldingstoestemming geweigerd. Je kunt deze later inschakelen in de instellingen van je apparaat.",
"pushPermissionDeniedTitle": "Toestemming voor pushmeldingen geweigerd",
"pushPermissionDeniedMessage": "Pushmeldingen zijn uitgeschakeld. Je kunt ze indien nodig inschakelen in de instellingen van je apparaat.",
"unregisterFailed": "Apparaat afmelden mislukt"
},
"mfa": {
"title": "Multifactorauthenticatie",
"description": "Voeg extra beveiliging toe aan je account met multifactorauthenticatie (MFA). Wanneer dit is ingeschakeld, voer je bij het inloggen naast je wachtwoord een verificatiecode uit je authenticator-app in.",
"twoFactor": "Tweestapsverificatie",
"enabledSubtitle": "Je account is beveiligd met 2FA",
"disabledSubtitle": "Beveilig je account met een authenticator-app",
"enable": "Inschakelen",
"disable": "Uitschakelen",
"enabledSuccess": "MFA is ingeschakeld!",
"disabledSuccess": "MFA is uitgeschakeld!",
"errors": {
"qrGenerationFailed": "QR-code genereren mislukt",
"invalidResponse": "Ongeldig antwoord van de server. QR-code of sleutel ontbreekt.",
"notFound": "MFA-installatie-endpoint niet gevonden. Deze functie is mogelijk nog niet beschikbaar.",
"unauthorized": "Niet geautoriseerd. Log opnieuw in.",
"serverError": "Serverfout. Probeer het later opnieuw.",
"setupFailed": "MFA instellen mislukt ({{status}}). Probeer het opnieuw.",
"networkError": "Netwerkfout. Controleer je verbinding en probeer het opnieuw.",
"invalidCode": "Ongeldige verificatiecode. Probeer het opnieuw.",
"confirmFailed": "MFA bevestigen mislukt. Probeer het opnieuw.",
"disableFailed": "MFA uitschakelen mislukt. Probeer het opnieuw."
},
"setup": {
"title": "Multifactorauthenticatie instellen",
"addedAccount": "Ik heb het account toegevoegd",
"back": "Terug",
"verifyAndEnable": "Verifiëren en inschakelen",
"savedBackupCodes": "Ik heb mijn back-upcodes opgeslagen",
"step1Label": "Stap 1:",
"step1": "Scan de QR-code hieronder met je authenticator-app (Google Authenticator, Authy enz.)",
"qrAlt": "MFA-QR-code",
"qrFailed": "De QR-code kon niet worden gegenereerd. Probeer het opnieuw of gebruik de handmatige sleutel hieronder.",
"manualKey": "Handmatige sleutel:",
"step2Label": "Stap 2:",
"step2": "Voer de 6-cijferige verificatiecode uit je authenticator-app in",
"codePlaceholder": "Voer de 6-cijferige code in",
"successTitle": "MFA succesvol ingeschakeld!",
"backupCodesTitle": "Bewaar deze back-upcodes op een veilige plek",
"backupCodesDescription": "Met deze codes krijg je toegang tot je account als je je authenticator-apparaat kwijtraakt. Elke code kan maar één keer worden gebruikt."
},
"disableModal": {
"title": "Multifactorauthenticatie uitschakelen",
"warning": "Door MFA uit te schakelen wordt je account minder veilig. Weet je zeker dat je wilt doorgaan?",
"prompt": "Voer ter bevestiging een verificatiecode uit je authenticator-app in:",
"confirm": "MFA uitschakelen"
},
"backupCodesModal": {
"title": "Nieuwe back-upcodes",
"warning": "Je vorige back-upcodes zijn niet meer geldig. Bewaar deze nieuwe codes op een veilige plek. Elke code kan maar één keer worden gebruikt."
}
},
"apiTokens": {
"title": "API-tokens",
"accessToken": "Toegangstoken",
"description": "Maak een token om via de API dingen bij te werken die taken activeren",
"plusNotice": "API-tokens zijn niet beschikbaar in het basisabonnement. Upgrade naar Plus om API-tokens te genereren voor integratie met externe systemen en het automatiseren van je taken.",
"showToken": "Token tonen",
"hideToken": "Token verbergen",
"removeTitle": "Token verwijderen",
"removeMessage": "Weet je zeker dat je {{name}} wilt verwijderen?",
"removedTitle": "Verwijderd",
"removedMessage": "Het API-token is verwijderd",
"tokenCopied": "Token gekopieerd naar klembord",
"generateNew": "Nieuw token genereren",
"nameModalTitle": "Geef je nieuwe token een naam waaraan je het herkent.",
"generateToken": "Token genereren"
},
"storage": {
"title": "Opslaginstellingen",
"serverTitle": "Serveropslaggebruik",
"serverDescription": "Dit is de opslag die je account op onze servers gebruikt (bijvoorbeeld bestanden, afbeeldingen en geüploade gegevens).",
"usagePlaceholder": "-- MB gebruikt / -- MB totaal (--)",
"usage": "{{used}} MB gebruikt / {{total}} MB totaal ({{percent}}%)",
"basicPlanNotice": "Serveropslag is niet beschikbaar in het basisabonnement. Upgrade naar Plus om je serveropslaggebruik te volgen.",
"localTitleApp": "Lokale app-opslag en cache",
"localTitleBrowser": "Lokale browseropslag en cache",
"localDescription": "Dit zijn gegevens die lokaal in je browser worden opgeslagen voor snellere toegang. Wissen heeft geen invloed op je servergegevens, maar kan je uitloggen.",
"clearLocal": "Alle lokale opslag en cache wissen",
"clearLocalTitle": "Alle lokale opslag wissen",
"clearLocalMessage": "Weet je zeker dat je je lokale opslag en cache wilt wissen? Al je gegevens worden uit deze browser verwijderd en je moet opnieuw inloggen.",
"clearAll": "Alles wissen",
"appPreferences": "App-voorkeuren",
"deviceOnly": "Alleen dit apparaat",
"appPreferencesDescription": "Dit zijn voorkeuren en instellingen die de app lokaal op je apparaat opslaat. Wissen zet app-specifieke instellingen terug en kan je uitloggen, maar heeft geen invloed op je servergegevens.",
"clearPreferences": "App-voorkeuren wissen",
"clearPreferencesTitle": "App-voorkeuren wissen",
"clearPreferencesMessage": "Weet je zeker dat je alle app-voorkeuren wilt wissen? Je app-instellingen worden teruggezet en je moet mogelijk opnieuw inloggen."
},
"sidepanel": {
"title": "Zijpaneel aanpassen",
"heading": "Zijpaneelinstellingen",
"description": "Bepaal welke kaarten in het zijpaneel verschijnen en in welke volgorde. Sleep om te herschikken of wissel de zichtbaarheid van elke kaart.",
"resetToDefaults": "Standaardwaarden herstellen",
"resetHelper": "Hiermee worden de standaardzichtbaarheid en -volgorde van alle kaarten hersteld.",
"cards": {
"welcome": {
"name": "Gebruiker wisselen",
"description": "Laat admins/beheerders taken bekijken als andere gebruikers"
},
"smartInsights": {
"name": "Slimme inzichten",
"description": "Snelle acties op basis van je taken"
},
"assignees": {
"name": "Taken per toegewezen persoon",
"description": "Groepeert taken op basis van aan wie ze zijn toegewezen"
},
"calendar": {
"name": "Kalenderweergave",
"description": "Toont taken in kalendervorm"
},
"activities": {
"name": "Recente activiteiten",
"description": "Toont recent afgeronde taken en activiteiten"
},
"weeklyGoals": {
"name": "Weekdoelen",
"description": "Toont wekelijkse voortgang en gezinsstatistieken"
}
}
},
"theme": {
"title": "Themavoorkeuren",
"description": "Bepaal hoe de site er voor jou uitziet. Kies één thema of synchroniseer met je systeem om automatisch te wisselen tussen dag- en nachtthema.",
"themeMode": "Themamodus",
"light": "Licht",
"dark": "Donker",
"system": "Systeem"
},
"localization": {
"title": "Lokalisatie",
"description": "Pas taal, datumnotatie en regionale voorkeuren voor je account aan.",
"language": "Taal",
"languageDescription": "Selecteer je voorkeurstaal",
"rtlNotice": "Deze taal wordt van rechts naar links (RTL) geschreven",
"dateFormat": "Datumnotatie",
"dateFormatDescription": "Kies hoe datums in de hele applicatie worden weergegeven",
"timeFormat": "Tijdnotatie",
"timeFormatDescription": "Kies de 12- of 24-uursnotatie",
"preview": "Voorbeeld: {{value}}",
"12hour": "12-uurs (AM/PM)",
"24hour": "24-uurs",
"firstDayOfWeek": "Eerste dag van de week",
"firstDayOfWeekDescription": "Kies met welke dag je week begint",
"sunday": "Zondag",
"monday": "Maandag",
"saturday": "Zaterdag",
"formats": {
"mdy": "MM/DD/JJJJ (VS)",
"dmy": "DD-MM-JJJJ (Europa)",
"ymd": "JJJJ-MM-DD (ISO)",
"long": "Lange notatie (bijv. 1 januari 2024)",
"short": "Korte notatie (bijv. 1 jan. 2024)"
}
},
"advanced": {
"title": "Geavanceerde instellingen",
"description": "Stel geavanceerde functies in zoals webhooks en realtime-updates voor meer productiviteit.",
"offlineTitle": "Offlineondersteuning",
"offlineDescription": "Blijf Donetick gebruiken als je offline bent op dit apparaat of in deze browser. Je wijzigingen worden lokaal opgeslagen en gesynchroniseerd zodra je weer online bent.",
"offlineToggle": "Offlineondersteuning inschakelen",
"offlineHelper": "Uitschakelen verwijdert niet-gesynchroniseerde offlinewijzigingen en opgeslagen offlinegegevens van dit apparaat of deze browser.",
"offlineEnabled": "Offlinemodus ingeschakeld voor dit apparaat/deze browser",
"offlineDisabled": "Offlinemodus uitgeschakeld en lokale gegevens gewist",
"offlineDisabledPartial": "De offlinemodus is uitgeschakeld, maar er kunnen nog lokale gegevens zijn opgeslagen",
"offlineDisableTitle": "Offlinemodus uitschakelen",
"offlineDisableMessage": "Als je de offlinemodus uitschakelt, worden niet-gesynchroniseerde offlinewijzigingen en opgeslagen offlinegegevens op dit apparaat of in deze browser verwijderd. Wil je doorgaan?",
"offlineDisableConfirm": "Uitschakelen en gegevens wissen",
"webhookTitle": "Webhook-integratie",
"webhookDescription": "Met webhooks kun je realtime-meldingen naar andere diensten sturen wanneer er iets gebeurt in je circle. Stel een webhook-URL in om realtime-updates te ontvangen.",
"webhookPlusNotice": "Webhook-meldingen zijn niet beschikbaar in het basisabonnement. Upgrade naar Plus om realtime-updates via webhooks te ontvangen.",
"webhookToggle": "Webhook inschakelen",
"webhookHelper": "Schakel webhook-meldingen in voor updates van taken en dingen.",
"webhookURL": "Webhook-URL",
"webhookUpdated": "Webhook-URL bijgewerkt",
"webhookUpdateFailed": "Webhook-URL bijwerken mislukt",
"realtimeTitle": "Realtime-updates",
"realtimeDescription": "Bepaal hoe je live-updates ontvangt wanneer taken en activiteiten in je circle veranderen.",
"realtime": {
"toggleLabel": "Realtime-updates inschakelen",
"title": "Realtime-updates",
"subtitle": "Ontvang direct meldingen wanneer taken worden bijgewerkt",
"statusLabel": "Status:",
"basicPlan": "Realtime-updates zijn niet beschikbaar in het basisabonnement. Upgrade naar Plus om direct meldingen te ontvangen wanneer taken worden bijgewerkt.",
"disabled": "Realtime-updates staan uit. Schakel ze in om live wijzigingen te zien wanneer jij of andere circle-leden taken afronden, overslaan of wijzigen.",
"connected": "Realtime-updates werken. Je ziet live wijzigingen wanneer jij of andere circle-leden taken afronden, overslaan of wijzigen.",
"connecting": "Verbinden met realtime-updates…",
"errored": "Realtime-updates staan aan maar werken niet: {{error}}",
"notConnected": "Realtime-updates staan aan maar er is momenteel geen verbinding.",
"basicPlanNotice": "Realtime-updates zijn niet beschikbaar in het basisabonnement. Upgrade naar Plus om direct meldingen te ontvangen wanneer jij of andere circle-leden taken afronden, overslaan of wijzigen."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Sair",
"version": "Versão",
"navigation": {
"search": "Pesquisar",
"allTasks": "Todas as tarefas",
"archived": "Arquivadas",
"things": "Itens",
@@ -30,6 +31,44 @@
"points": "Pontos",
"settings": "Configurações"
},
"search": {
"title": "Pesquisar",
"placeholder": "Pesquisar no Donetick",
"inputAriaLabel": "Pesquisar tarefas, histórico, projetos, etiquetas e configurações",
"deviceNote": "Pesquisando o conteúdo disponível neste dispositivo",
"escape": "Esc",
"recent": "Recentes",
"empty": {
"title": "Nenhuma correspondência direta",
"subtitle": "Você ainda pode filtrar a lista de tarefas com esta pesquisa."
},
"groups": {
"tasks": "Tarefas",
"history": "Notas",
"projects": "Projetos",
"labels": "Etiquetas",
"people": "Pessoas",
"settings": "Configurações",
"actions": "Ações rápidas"
},
"actions": {
"quickAction": "Ação rápida",
"navigation": "Navegação",
"createTask": "Criar uma tarefa",
"viewAllTasks": "Ver todas as tarefas",
"viewArchivedTasks": "Ver tarefas arquivadas",
"openSettings": "Abrir configurações",
"filterTasks": "Mostrar tarefas que correspondem a “{{query}}”",
"filterTasksSubtitle": "Filtrar a lista de tarefas"
},
"footer": {
"navigate": "Navegar",
"open": "Abrir",
"results_one": "{{count}} resultado",
"results_other": "{{count}} resultados",
"typeToSearch": "Digite para pesquisar"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,137 +1,50 @@
{
"title": "Configurações",
"circleSettings": {
"title": "Configurações do círculo",
"description": "Sua conta é conectada automaticamente a um círculo quando você cria ou entra em um. Convide amigos facilmente compartilhando o código ou link exclusivo do círculo abaixo. Você receberá uma notificação abaixo quando alguém solicitar entrar no seu círculo. Se quiser sair, basta clicar no botão \"Sair do círculo\".",
"circleCode": "Código do círculo",
"copyCode": "Copiar código",
"copyLink": "Copiar link",
"codeCopied": "Código do círculo copiado!",
"linkCopied": "Link do círculo copiado!",
"joinCircle": "Entrar em um círculo",
"joinCirclePlaceholder": "Digite o código do círculo",
"join": "Entrar",
"leave": "Sair do círculo",
"leaveConfirmTitle": "Sair do círculo",
"leaveConfirmMessage": "Tem certeza de que deseja sair deste círculo?",
"circleMembers": "Membros do círculo",
"circleMemberRequests": "Solicitações de entrada no círculo",
"admin": "Administrador",
"member": "Membro",
"pending": "Pendente",
"accept": "Aceitar",
"reject": "Rejeitar",
"makeAdmin": "Tornar administrador",
"makeMember": "Tornar membro",
"remove": "Remover",
"webhookURL": "URL do webhook",
"webhookDescription": "Digite uma URL de webhook para receber notificações de eventos do círculo",
"webhookPlaceholder": "https://sua-url-de-webhook.com"
},
"accountSettings": {
"title": "Configurações da conta",
"subscription": "Assinatura",
"subscriptionStatus": "Plano atual",
"free": "Gratuito",
"plus": "Plus",
"upgrade": "Fazer upgrade",
"cancel": "Cancelar",
"changePassword": "Alterar senha",
"password": "Senha",
"dangerZone": "Zona de perigo",
"dangerZoneDescription": "Após excluir sua conta, não há como voltar atrás. Tenha certeza antes de confirmar.",
"deleteAccount": "Excluir conta"
},
"localization": {
"title": "Localização",
"description": "Personalize idioma, formato de data e preferências regionais da sua conta.",
"language": "Idioma",
"languageDescription": "Selecione seu idioma preferido",
"dateFormat": "Formato de data",
"dateFormatDescription": "Escolha como as datas devem ser exibidas no aplicativo",
"timeFormat": "Formato de hora",
"timeFormatDescription": "Selecione o formato de 12 ou 24 horas",
"12hour": "12 horas (AM/PM)",
"24hour": "24 horas",
"firstDayOfWeek": "Primeiro dia da semana",
"firstDayOfWeekDescription": "Selecione com qual dia sua semana começa",
"sunday": "Domingo",
"monday": "Segunda-feira",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EUA)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato longo (ex.: 1 de janeiro de 2024)",
"short": "Formato curto (ex.: 1 de jan de 2024)"
}
},
"sidepanel": {
"title": "Personalização do painel lateral",
"description": "Personalize o layout e a visibilidade dos cartões no painel lateral. Esta seção está disponível apenas em dispositivos com telas grandes, como tablets e computadores."
},
"theme": {
"title": "Preferências de tema",
"description": "Escolha a aparência do site. Selecione um único tema ou sincronize com o sistema para alternar automaticamente entre os temas claro e escuro.",
"themeMode": "Modo do tema",
"light": "Claro",
"dark": "Escuro",
"system": "Sistema"
},
"notifications": {
"settingsSaved": "Configurações salvas com sucesso",
"settingsSaveFailed": "Falha ao salvar as configurações",
"invalidWebhook": "URL de webhook inválida"
},
"profile": {
"title": "Configurações do perfil",
"description": "Atualize seu nome de exibição e foto de perfil.",
"photoUpdated": "Foto atualizada",
"photoUpdatedMessage": "Sua foto de perfil foi atualizada com sucesso!",
"uploadFailed": "Falha no envio",
"uploadFailedMessage": "Falha ao enviar sua foto. Tente novamente.",
"profileUpdated": "Perfil atualizado",
"profileUpdatedMessage": "As informações do seu perfil foram salvas com sucesso!",
"updateFailed": "Falha na atualização",
"updateFailedMessage": "Não foi possível atualizar seu perfil. Verifique sua conexão e tente novamente.",
"changePhoto": "Alterar foto",
"displayName": "Nome de exibição",
"displayNamePlaceholder": "Digite seu nome de exibição",
"timezone": "Fuso horário",
"timezonePlaceholder": "Selecione seu fuso horário",
"common": {
"save": "Salvar",
"cancel": "Cancelar"
"cancel": "Cancelar",
"confirm": "Confirmar",
"remove": "Remover",
"delete": "Excluir",
"refresh": "Atualizar",
"loading": "Carregando…",
"on": "Ativado",
"off": "Desativado",
"error": "Erro",
"success": "Pronto",
"plusFeature": "Recurso Plus",
"earlyAccess": "Acesso antecipado"
},
"overview": {
"title": "Configurações",
"subtitle": "Personalize sua experiência e gerencie as preferências da sua conta",
"upgrade": {
"title": "Faça upgrade para o Plus",
"title": "Mudar para o Plus",
"description": "Desbloqueie recursos poderosos para aumentar sua produtividade",
"button": "Fazer upgrade agora",
"button": "Fazer upgrade",
"features": {
"richText": "Descrições com texto formatado",
"notifications": "Notificações de tarefas",
"apiIntegrations": "Integrações de API",
"apiIntegrations": "Integrações via API",
"advancedAutomation": "Automação avançada"
}
},
"sections": {
"profile": {
"title": "Configurações do perfil",
"description": "Atualize as informações do seu perfil, foto, nome de exibição e preferências de fuso horário."
"title": "Configurações de perfil",
"description": "Atualize as informações do seu perfil, foto, nome de exibição e fuso horário."
},
"circle": {
"title": "Configurações do círculo",
"description": "Gerencie seu círculo, convide membros e cuide das solicitações de entrada."
"description": "Gerencie seu círculo, convide membros e trate as solicitações de entrada."
},
"account": {
"title": "Configurações da conta",
"description": "Gerencie sua assinatura, altere a senha e as opções de exclusão de conta."
"description": "Gerencie sua assinatura, altere a senha e exclua sua conta."
},
"subaccounts": {
"title": "Contas gerenciadas",
"description": "Crie e gerencie subcontas para fazer login e concluir tarefas atribuídas."
"description": "Crie e gerencie subcontas que podem entrar e concluir as tarefas atribuídas."
},
"notifications": {
"title": "Notificações",
@@ -147,11 +60,11 @@
},
"storage": {
"title": "Configurações de armazenamento",
"description": "Faça backup e restauração dos seus dados, gerencie o armazenamento local e as preferências de sincronização."
"description": "Faça backup e restaure seus dados, gerencie o armazenamento local e a sincronização."
},
"sidepanel": {
"title": "Personalização do painel lateral",
"description": "Personalize o layout e a visibilidade dos cartões na interface do painel lateral."
"description": "Personalize o layout e a visibilidade dos cartões do painel lateral."
},
"theme": {
"title": "Preferências de tema",
@@ -159,20 +72,423 @@
},
"localization": {
"title": "Localização",
"description": "Personalize idioma, formato de data, formato de hora e preferências regionais."
"description": "Personalize idioma, formato de data e hora e preferências regionais."
},
"advanced": {
"title": "Configurações avançadas",
"description": "Configure webhooks, atualizações em tempo real e outros recursos avançados para mais produtividade."
"description": "Configure webhooks, atualizações em tempo real e outros recursos avançados."
},
"developer": {
"title": "Configurações de desenvolvedor",
"description": "Veja informações técnicas sobre tokens de autenticação, conexões SSE e dados de depuração."
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "Enviar feedback",
"description": "Conte como o Donetick está funcionando para você ou peça um recurso."
},
"bugReport": {
"title": "Relatar um erro",
"description": "Algo não está funcionando? Envie os detalhes junto com um retrato técnico."
}
}
},
"profile": {
"title": "Configurações de perfil",
"description": "Atualize seu nome de exibição e sua foto de perfil.",
"photoUpdated": "Foto atualizada",
"photoUpdatedMessage": "Sua foto de perfil foi atualizada com sucesso!",
"uploadFailed": "Falha no envio",
"uploadFailedMessage": "Não foi possível enviar sua foto. Tente novamente.",
"profileUpdated": "Perfil atualizado",
"profileUpdatedMessage": "As informações do seu perfil foram salvas com sucesso!",
"updateFailed": "Falha na atualização",
"updateFailedMessage": "Não foi possível atualizar seu perfil. Verifique sua conexão e tente novamente.",
"changePhoto": "Alterar foto",
"editPhoto": "Editar foto de perfil",
"displayName": "Nome de exibição",
"displayNamePlaceholder": "Digite seu nome de exibição",
"timezone": "Fuso horário",
"timezonePlaceholder": "Selecione seu fuso horário",
"save": "Salvar",
"cancel": "Cancelar"
},
"circleSettings": {
"title": "Configurações do círculo",
"description": "Sua conta é conectada automaticamente a um círculo quando você cria um ou entra em um. Convide amigos compartilhando o código ou o link do círculo abaixo. Você receberá um aviso aqui quando alguém pedir para entrar no seu círculo.",
"memberOf": "Você faz parte de {{name}}",
"yourCircleCode": "Seu código de círculo é:",
"copyCode": "Copiar código",
"shareInvite": "Compartilhar convite",
"codeCopied": "Código copiado para a área de transferência",
"linkCopied": "Link de convite copiado para a área de transferência",
"myCircle": "meu círculo",
"shareTitle": "Entre em {{name}} no Donetick",
"shareText": "Gostaria de convidar você para entrar em {{name}} no Donetick.",
"shareDialogTitle": "Compartilhar convite do círculo",
"leave": "Sair do círculo",
"leaveConfirmTitle": "Sair do círculo",
"leaveConfirmMessage": "Tem certeza de que deseja sair do seu círculo?",
"leaveConfirmButton": "Sair",
"leftCircle": "Você saiu do círculo",
"leaveFailed": "Não foi possível sair do círculo",
"circleMembers": "Membros do círculo",
"you": "(Você)",
"pendingApproval": "Aguardando aprovação",
"joinedOn": "Entrou em {{date}}",
"requestedToJoin": "Solicitação de entrada {{date}}",
"roles": {
"member": "Membro",
"memberDescription": "Um membro comum do círculo",
"manager": "Gerente",
"managerDescription": "Pode se passar por outras pessoas e agir em nome delas",
"admin": "Administrador",
"adminDescription": "Acesso total ao círculo"
},
"roleUpdateFailed": "Não foi possível atualizar a função",
"removeMemberTitle": "Remover membro",
"removeMemberMessage": "Tem certeza de que deseja remover {{name}} do seu círculo?",
"memberRemoved": "Membro removido com sucesso",
"circleMemberRequests": "Solicitações de entrada no círculo",
"lastUpdated": "Última atualização: {{time}}",
"refreshing": "Atualizando…",
"refreshFailed": "Não foi possível atualizar as solicitações de entrada",
"wantsToJoin": "{{name}} quer entrar no seu círculo.",
"accept": "Aceitar",
"acceptRequestTitle": "Aceitar solicitação de entrada",
"acceptRequestMessage": "Tem certeza de que deseja aceitar {{name}} (usuário: {{username}}) no seu círculo?",
"requestAccepted": "Solicitação aceita com sucesso",
"or": "ou",
"joinOtherDescription": "Quer entrar no círculo de outra pessoa? Peça o código do círculo ou o link de convite. Digite o código abaixo para entrar.",
"enterCircleCode": "Digite o código do círculo:",
"enterCodePlaceholder": "Digite o código",
"joinCircle": "Entrar no círculo",
"joinedPending": "Você entrou no círculo; aguarde a pessoa proprietária aceitar sua solicitação.",
"alreadyMember": "Você já é membro deste círculo",
"joinFailed": "Não foi possível entrar no círculo"
},
"accountSettings": {
"title": "Configurações da conta",
"description": "Altere as configurações da sua conta, o plano ou a sua senha",
"accountType": "Tipo de conta: {{type}}",
"free": "Gratuito",
"plus": "Plus",
"plusUntil": "Plus (até {{date}})",
"activeDescription": "No momento você tem o plano Plus. Sua assinatura será renovada em {{date}}.",
"cancelledDescription": "Você cancelou sua assinatura. Sua conta voltará ao plano Gratuito em {{date}}.",
"freeDescription": "No momento você está no plano Gratuito. Mude para o Plus para desbloquear mais recursos.",
"upgrade": "Fazer upgrade",
"cancel": "Cancelar",
"password": "Senha:",
"changePassword": "Alterar senha",
"passwordChanged": "Senha alterada com sucesso",
"passwordChangeFailed": "Não foi possível alterar a senha",
"dangerZone": "Zona de perigo",
"dangerZoneDescription": "Depois de excluir sua conta, não há como voltar atrás. Tenha certeza.",
"deleteAccount": "Excluir conta",
"accountDeleted": "Conta excluída com sucesso",
"subscriptionCancelled": "Assinatura cancelada",
"subscriptionCancelFailed": "Não foi possível cancelar a assinatura",
"purchase": {
"success": "Compra concluída! Reinicie o aplicativo para acessar os recursos Plus.",
"storeConnection": "Problema de conexão com a loja. Verifique sua rede e tente novamente.",
"notAllowed": "Compras não são permitidas neste dispositivo. Verifique as restrições do seu aparelho.",
"unavailable": "Esta assinatura não está disponível. Tente novamente mais tarde.",
"alreadyProcessed": "Esta compra já foi processada. Se achar que é um erro, entre em contato com o suporte.",
"receiptMissing": "Recibo de compra ausente. Tente comprar novamente.",
"networkError": "Erro de rede. Verifique sua conexão e tente novamente.",
"invalidReceipt": "Recibo de compra inválido. Entre em contato com o suporte se o problema continuar.",
"pending": "O pagamento está aguardando aprovação. Você terá acesso assim que for aprovado.",
"failed": "Falha na compra: {{error}}. Tente novamente ou entre em contato com o suporte.",
"unknownError": "Erro desconhecido"
}
},
"subaccounts": {
"title": "Contas gerenciadas",
"description": "Gerencie subcontas. Os usuários das subcontas podem entrar e concluir as tarefas atribuídas.",
"notParentTitle": "Gerenciamento de subcontas",
"notParentMessage": "Apenas contas principais podem gerenciar subcontas.",
"freePlanNotice": "O plano Gratuito permite 1 subconta. Mude para o Plus para ter até 5 subcontas.",
"count": "Subcontas ({{count}})",
"add": "Adicionar subconta",
"loading": "Carregando subcontas…",
"emptyTitle": "Nenhuma subconta",
"emptyDescription": "Crie subcontas para que os membros da equipe possam entrar e concluir as tarefas atribuídas a eles.",
"addFirst": "Adicionar sua primeira subconta",
"username": "Usuário: {{username}}",
"created": "Criada em: {{date}}",
"changePassword": "Alterar senha",
"deleteAccount": "Excluir conta",
"createdSuccess": "A subconta “{{name}}” foi criada com sucesso!",
"createFailed": "Não foi possível criar a subconta: {{error}}",
"createFailedGeneric": "Não foi possível criar a subconta",
"passwordUpdated": "Senha da subconta atualizada com sucesso",
"passwordUpdateFailed": "Não foi possível atualizar a senha: {{error}}",
"passwordUpdateFailedGeneric": "Não foi possível atualizar a senha",
"deleteConfirmTitle": "Excluir subconta",
"deleteConfirmMessage": "Tem certeza de que deseja excluir a subconta “{{name}}”? Esta ação não pode ser desfeita.",
"deleted": "Subconta “{{name}}” excluída com sucesso",
"deleteFailed": "Não foi possível excluir a subconta: {{error}}",
"deleteFailedGeneric": "Não foi possível excluir a subconta",
"howItWorksTitle": "Como funcionam as contas gerenciadas",
"howItWorks1": "As contas gerenciadas são criadas pela conta principal; são para pessoas cuja conta você quer poder excluir e cuja senha você quer poder redefinir.",
"howItWorks2": "As subcontas podem entrar com o próprio usuário e senha.",
"howItWorks3": "As contas gerenciadas podem concluir tarefas, mas têm permissões administrativas limitadas",
"howItWorks4": "As contas gerenciadas são adicionadas automaticamente ao seu círculo"
},
"notifications": {
"title": "Configurações de notificação",
"deviceSection": "Notificações do dispositivo",
"deviceSectionDescription": "Gerencie as notificações do seu dispositivo",
"deviceLabel": "Notificação do dispositivo",
"deviceHelper": "Receba uma notificação no seu dispositivo quando uma tarefa vencer",
"mobileOnly": "Este recurso está disponível apenas em dispositivos móveis",
"testNotification": "Notificação de teste",
"testNotificationBody": "Você tem uma tarefa que vence em breve",
"dueTitle": "Notificação de vencimento",
"dueLabel": "Notificação quando a tarefa vencer",
"preDueTitle": "Notificação antes do vencimento",
"preDueLabel": "Notificação algumas horas antes do vencimento da tarefa",
"overdueTitle": "Notificação de atraso",
"overdueLabel": "Notificação quando a tarefa estiver atrasada",
"pushLabel": "Notificações push",
"pushHelper": "Receba lembretes, avisos e atribuições de tarefas por notificação push",
"registeredDevices": "Dispositivos registrados ({{count}}/5)",
"registeredDevicesDescription": "Dispositivos registrados para receber notificações push da sua conta",
"currentDevice": "Dispositivo atual: {{platform}} {{model}}",
"currentDeviceNotRegistered": "Este dispositivo não está registrado para notificações push",
"limitReached": "Limite atingido",
"registerDevice": "Registrar dispositivo",
"unknownDevice": "Dispositivo desconhecido",
"deviceCreatedAt": "Criado em: {{date}}",
"noDevices": "Nenhum dispositivo registrado para notificações push",
"customSection": "Notificação personalizada",
"customSectionDescription": "Notificações por outra plataforma, como Telegram ou Pushover",
"customLabel": "Notificação personalizada",
"customHelper": "Receba notificações em outra plataforma",
"targetNone": "Nenhuma",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhooks",
"telegramBotHelpBefore": "Você precisa enviar uma mensagem ao bot primeiro para que a notificação do Telegram funcione",
"telegramBotHelpAfter": "para iniciar uma conversa",
"clickHere": "Clique aqui",
"chatId": "ID do chat",
"chatIdPlaceholder": "ID de usuário / ID do chat",
"telegramChatIdHelpBefore": "Se não souber seu ID do chat, inicie uma conversa com o userinfobot e ele o enviará para você.",
"telegramChatIdHelpAfter": "para iniciar uma conversa com o userinfobot",
"userKey": "Chave de usuário",
"userKeyPlaceholder": "ID de usuário",
"chatIdRequired": "O ID do chat é obrigatório",
"chatIdInvalid": "ID do chat inválido",
"userKeyRequired": "A chave de usuário é obrigatória",
"targetUpdated": "Destino de notificação atualizado",
"targetUpdateFailed": "Erro ao atualizar o destino de notificação: {{error}}",
"deviceRegistered": "Dispositivo registrado com sucesso para notificações push.",
"deviceLimitTitle": "Limite de dispositivos atingido",
"deviceLimitMessage": "Você atingiu o limite máximo de 5 dispositivos registrados. Remova um dispositivo antes de registrar este.",
"registrationFailedTitle": "Falha no registro",
"registrationFailedMessage": "Não foi possível registrar o dispositivo automaticamente. Tente novamente.",
"permissionRequiredTitle": "Permissão necessária",
"permissionRequiredMessage": "É necessária a permissão de notificações push para registrar este dispositivo.",
"registrationInitiatedTitle": "Registro iniciado",
"registrationInitiatedMessage": "O registro de notificações push foi iniciado. O dispositivo será registrado automaticamente.",
"registerDeviceFailed": "Não foi possível registrar o dispositivo. Tente novamente.",
"permissionDeniedTitle": "Permissão de notificação negada",
"permissionDeniedMessage": "Você negou as permissões de notificação. Pode ativá-las depois nas configurações do seu dispositivo.",
"pushPermissionDeniedTitle": "Permissão de notificações push negada",
"pushPermissionDeniedMessage": "As notificações push foram desativadas. Você pode ativá-las nas configurações do seu dispositivo, se quiser.",
"unregisterFailed": "Não foi possível cancelar o registro do dispositivo"
},
"mfa": {
"title": "Autenticação multifator",
"description": "Adicione uma camada extra de segurança à sua conta com a autenticação multifator (MFA). Quando estiver ativada, você precisará informar um código de verificação do seu aplicativo autenticador além da senha ao entrar.",
"twoFactor": "Autenticação em duas etapas",
"enabledSubtitle": "Sua conta está protegida com 2FA",
"disabledSubtitle": "Proteja sua conta com um aplicativo autenticador",
"enable": "Ativar",
"disable": "Desativar",
"enabledSuccess": "A MFA foi ativada com sucesso!",
"disabledSuccess": "A MFA foi desativada com sucesso!",
"errors": {
"qrGenerationFailed": "Não foi possível gerar o QR code",
"invalidResponse": "Resposta inválida do servidor. QR code ou chave ausente.",
"notFound": "Endpoint de configuração de MFA não encontrado. Este recurso pode ainda não estar disponível.",
"unauthorized": "Não autorizado. Entre novamente.",
"serverError": "Erro no servidor. Tente novamente mais tarde.",
"setupFailed": "Não foi possível configurar a MFA ({{status}}). Tente novamente.",
"networkError": "Erro de rede. Verifique sua conexão e tente novamente.",
"invalidCode": "Código de verificação inválido. Tente novamente.",
"confirmFailed": "Não foi possível confirmar a MFA. Tente novamente.",
"disableFailed": "Não foi possível desativar a MFA. Tente novamente."
},
"setup": {
"title": "Configurar a autenticação multifator",
"addedAccount": "Já adicionei a conta",
"back": "Voltar",
"verifyAndEnable": "Verificar e ativar",
"savedBackupCodes": "Salvei meus códigos de backup",
"step1Label": "Passo 1:",
"step1": "Escaneie o QR code abaixo com seu aplicativo autenticador (Google Authenticator, Authy etc.)",
"qrAlt": "QR code da MFA",
"qrFailed": "Não foi possível gerar o QR code. Tente novamente ou use a chave manual abaixo.",
"manualKey": "Chave para inserção manual:",
"step2Label": "Passo 2:",
"step2": "Digite o código de verificação de 6 dígitos do seu aplicativo autenticador",
"codePlaceholder": "Digite o código de 6 dígitos",
"successTitle": "MFA ativada com sucesso!",
"backupCodesTitle": "Guarde estes códigos de backup em um lugar seguro",
"backupCodesDescription": "Você pode usar estes códigos para acessar sua conta se perder seu dispositivo autenticador. Cada código só pode ser usado uma vez."
},
"disableModal": {
"title": "Desativar a autenticação multifator",
"warning": "Desativar a MFA deixará sua conta menos segura. Tem certeza de que deseja continuar?",
"prompt": "Digite um código de verificação do seu aplicativo autenticador para confirmar:",
"confirm": "Desativar MFA"
},
"backupCodesModal": {
"title": "Novos códigos de backup",
"warning": "Seus códigos de backup anteriores não são mais válidos. Guarde estes novos códigos em um lugar seguro. Cada código só pode ser usado uma vez."
}
},
"apiTokens": {
"title": "Tokens de API",
"accessToken": "Token de acesso",
"description": "Crie um token para usar com a API e atualizar coisas que disparam tarefas",
"plusNotice": "Tokens de API não estão disponíveis no plano Básico. Mude para o Plus para gerar tokens de API, integrar com sistemas externos e automatizar suas tarefas.",
"showToken": "Mostrar token",
"hideToken": "Ocultar token",
"removeTitle": "Remover token",
"removeMessage": "Tem certeza de que deseja remover {{name}}?",
"removedTitle": "Removido",
"removedMessage": "O token de API foi removido",
"tokenCopied": "Token copiado para a área de transferência",
"generateNew": "Gerar novo token",
"nameModalTitle": "Dê um nome ao seu novo token, algo que ajude você a reconhecê-lo.",
"generateToken": "Gerar token"
},
"storage": {
"title": "Configurações de armazenamento",
"serverTitle": "Uso de armazenamento no servidor",
"serverDescription": "Este é o armazenamento usado pela sua conta em nossos servidores (por exemplo, arquivos, imagens e dados que você enviou).",
"usagePlaceholder": "-- MB usados / -- MB no total (--)",
"usage": "{{used}} MB usados / {{total}} MB no total ({{percent}}%)",
"basicPlanNotice": "O armazenamento no servidor não está disponível no plano Básico. Mude para o Plus para acompanhar seu uso.",
"localTitleApp": "Armazenamento local e cache do aplicativo",
"localTitleBrowser": "Armazenamento local e cache do navegador",
"localDescription": "São dados guardados localmente no seu navegador para acesso mais rápido. Limpá-los não afetará seus dados no servidor, mas pode desconectar você.",
"clearLocal": "Limpar todo o armazenamento local e o cache",
"clearLocalTitle": "Limpar todo o armazenamento local",
"clearLocalMessage": "Tem certeza de que deseja limpar seu armazenamento local e o cache? Todos os seus dados serão removidos deste navegador e você precisará entrar novamente.",
"clearAll": "Limpar tudo",
"appPreferences": "Preferências do aplicativo",
"deviceOnly": "Apenas no dispositivo",
"appPreferencesDescription": "São preferências e configurações que o aplicativo guarda localmente no seu dispositivo. Limpá-las redefinirá as configurações do aplicativo e pode desconectar você, mas não afetará seus dados no servidor.",
"clearPreferences": "Limpar preferências do aplicativo",
"clearPreferencesTitle": "Limpar preferências do aplicativo",
"clearPreferencesMessage": "Tem certeza de que deseja limpar todas as preferências do aplicativo? Suas configurações serão redefinidas e você pode precisar entrar novamente."
},
"sidepanel": {
"title": "Personalização do painel lateral",
"heading": "Configurações do painel lateral",
"description": "Escolha quais cartões aparecem no painel lateral e em que ordem. Arraste e solte para reordenar ou alterne a visibilidade de cada cartão.",
"resetToDefaults": "Restaurar padrões",
"resetHelper": "Isso restaurará a visibilidade e a ordem padrão de todos os cartões.",
"cards": {
"welcome": {
"name": "Troca de usuário",
"description": "Permite que administradores e gerentes vejam as tarefas como outras pessoas"
},
"smartInsights": {
"name": "Insights inteligentes",
"description": "Ações rápidas com base nas suas tarefas"
},
"assignees": {
"name": "Tarefas por responsável",
"description": "Agrupa as tarefas de acordo com quem é responsável por elas"
},
"calendar": {
"name": "Visão de calendário",
"description": "Mostra as tarefas em formato de calendário"
},
"activities": {
"name": "Atividades recentes",
"description": "Mostra tarefas concluídas e atividades recentes"
},
"weeklyGoals": {
"name": "Metas semanais",
"description": "Mostra o progresso semanal e as estatísticas da família"
}
}
},
"theme": {
"title": "Preferências de tema",
"description": "Escolha a aparência do site. Selecione um tema fixo ou sincronize com o sistema para alternar automaticamente entre os temas claro e escuro.",
"themeMode": "Modo de tema",
"light": "Claro",
"dark": "Escuro",
"system": "Sistema"
},
"localization": {
"title": "Localização",
"description": "Personalize idioma, formato de data e preferências regionais da sua conta.",
"language": "Idioma",
"languageDescription": "Selecione seu idioma preferido",
"rtlNotice": "Este idioma é escrito da direita para a esquerda (RTL)",
"dateFormat": "Formato de data",
"dateFormatDescription": "Escolha como as datas são exibidas em todo o aplicativo",
"timeFormat": "Formato de hora",
"timeFormatDescription": "Selecione o formato de 12 ou 24 horas",
"preview": "Prévia: {{value}}",
"12hour": "12 horas (AM/PM)",
"24hour": "24 horas",
"firstDayOfWeek": "Primeiro dia da semana",
"firstDayOfWeekDescription": "Escolha com qual dia sua semana começa",
"sunday": "Domingo",
"monday": "Segunda-feira",
"saturday": "Sábado",
"formats": {
"mdy": "MM/DD/AAAA (EUA)",
"dmy": "DD/MM/AAAA (Europa)",
"ymd": "AAAA-MM-DD (ISO)",
"long": "Formato longo (ex.: 1 de janeiro de 2024)",
"short": "Formato curto (ex.: 1 jan 2024)"
}
},
"advanced": {
"title": "Configurações avançadas",
"description": "Configure recursos avançados como webhooks e atualizações em tempo real para aumentar sua produtividade.",
"offlineTitle": "Suporte offline",
"offlineDescription": "Continue usando o Donetick offline neste dispositivo ou navegador. Suas alterações são salvas localmente e sincronizadas quando você voltar a ficar online.",
"offlineToggle": "Ativar suporte offline",
"offlineHelper": "Desativar isso remove as alterações offline não sincronizadas e os dados offline salvos neste dispositivo ou navegador.",
"offlineEnabled": "Modo offline ativado neste dispositivo/navegador",
"offlineDisabled": "Modo offline desativado e dados locais apagados",
"offlineDisabledPartial": "O modo offline foi desativado, mas alguns dados locais ainda podem estar armazenados",
"offlineDisableTitle": "Desativar o modo offline",
"offlineDisableMessage": "Desativar o modo offline removerá as alterações offline não sincronizadas e os dados offline salvos neste dispositivo ou navegador. Deseja continuar?",
"offlineDisableConfirm": "Desativar e apagar dados",
"webhookTitle": "Integração com webhooks",
"webhookDescription": "Os webhooks permitem enviar notificações em tempo real para outros serviços quando algo acontece no seu círculo. Configure uma URL de webhook para receber atualizações em tempo real.",
"webhookPlusNotice": "Notificações por webhook não estão disponíveis no plano Básico. Mude para o Plus para receber atualizações em tempo real via webhooks.",
"webhookToggle": "Ativar webhook",
"webhookHelper": "Ative as notificações por webhook para atualizações de tarefas e coisas.",
"webhookURL": "URL do webhook",
"webhookUpdated": "URL do webhook atualizada com sucesso",
"webhookUpdateFailed": "Não foi possível atualizar a URL do webhook",
"realtimeTitle": "Atualizações em tempo real",
"realtimeDescription": "Configure como você recebe atualizações ao vivo quando tarefas e atividades mudam no seu círculo.",
"realtime": {
"toggleLabel": "Ativar atualizações em tempo real",
"title": "Atualizações em tempo real",
"subtitle": "Receba notificações instantâneas quando as tarefas forem atualizadas",
"statusLabel": "Status:",
"basicPlan": "As atualizações em tempo real não estão disponíveis no plano Básico. Mude para o Plus para receber notificações instantâneas quando as tarefas forem atualizadas.",
"disabled": "As atualizações em tempo real estão desativadas. Ative-as para ver as mudanças ao vivo quando você ou outros membros do círculo concluírem, pularem ou modificarem tarefas.",
"connected": "As atualizações em tempo real estão funcionando. Você verá as mudanças ao vivo quando você ou outros membros do círculo concluírem, pularem ou modificarem tarefas.",
"connecting": "Conectando às atualizações em tempo real…",
"errored": "As atualizações em tempo real estão ativadas, mas não estão funcionando: {{error}}",
"notConnected": "As atualizações em tempo real estão ativadas, mas não há conexão no momento.",
"basicPlanNotice": "As atualizações em tempo real não estão disponíveis no plano Básico. Mude para o Plus para receber notificações instantâneas quando você ou outros membros do círculo concluírem, pularem ou modificarem tarefas."
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "退出登录",
"version": "版本",
"navigation": {
"search": "搜索",
"allTasks": "所有任务",
"archived": "已归档",
"things": "事项",
@@ -29,5 +30,42 @@
"activities": "活动",
"points": "积分",
"settings": "设置"
},
"search": {
"title": "搜索",
"placeholder": "搜索 Donetick",
"inputAriaLabel": "搜索任务、历史、项目、标签和设置",
"deviceNote": "正在搜索此设备上可用的内容",
"escape": "Esc",
"recent": "最近",
"empty": {
"title": "没有直接匹配的结果",
"subtitle": "你仍然可以用此搜索筛选任务列表。"
},
"groups": {
"tasks": "任务",
"history": "备注",
"projects": "项目",
"labels": "标签",
"people": "成员",
"settings": "设置",
"actions": "快捷操作"
},
"actions": {
"quickAction": "快捷操作",
"navigation": "导航",
"createTask": "创建任务",
"viewAllTasks": "查看所有任务",
"viewArchivedTasks": "查看已归档任务",
"openSettings": "打开设置",
"filterTasks": "显示匹配“{{query}}”的任务",
"filterTasksSubtitle": "筛选任务列表"
},
"footer": {
"navigate": "导航",
"open": "打开",
"results_other": "{{count}} 个结果",
"typeToSearch": "输入以搜索"
}
}
}
}

View File

@@ -1,113 +1,26 @@
{
"title": "设置",
"circleSettings": {
"title": "圈子设置",
"description": "当您创建或加入圈子时,您的账户会自动连接到该圈子。通过分享下方的唯一圈子代码或链接,即可轻松邀请好友。当有人请求加入您的圈子时,您会在下方收到通知。如果您想离开,只需点击“离开圈子”按钮。",
"circleCode": "圈子代码",
"copyCode": "复制代码",
"copyLink": "复制链接",
"codeCopied": "圈子代码已复制!",
"linkCopied": "圈子链接已复制!",
"joinCircle": "加入圈子",
"joinCirclePlaceholder": "输入圈子代码",
"join": "加入",
"leave": "离开圈子",
"leaveConfirmTitle": "离开圈子",
"leaveConfirmMessage": "您确定要离开此圈子吗?",
"circleMembers": "圈子成员",
"circleMemberRequests": "圈子成员申请",
"admin": "管理员",
"member": "成员",
"pending": "待处理",
"accept": "接受",
"reject": "拒绝",
"makeAdmin": "设为管理员",
"makeMember": "设为成员",
"remove": "移除",
"webhookURL": "Webhook URL",
"webhookDescription": "输入 Webhook URL 以接收圈子事件通知",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "账户设置",
"subscription": "订阅",
"subscriptionStatus": "当前方案",
"free": "免费版",
"plus": "Plus 版",
"upgrade": "升级",
"cancel": "取消",
"changePassword": "修改密码",
"password": "密码",
"dangerZone": "危险区域",
"dangerZoneDescription": "一旦删除账户,将无法恢复。请谨慎操作。",
"deleteAccount": "删除账户"
},
"localization": {
"title": "本地化",
"description": "自定义您账户的语言、日期格式和区域偏好。",
"language": "语言",
"languageDescription": "选择您的首选语言",
"dateFormat": "日期格式",
"dateFormatDescription": "选择整个应用中日期的显示方式",
"timeFormat": "时间格式",
"timeFormatDescription": "选择 12 小时制或 24 小时制",
"12hour": "12 小时制 (AM/PM)",
"24hour": "24 小时制",
"firstDayOfWeek": "每周起始日",
"firstDayOfWeekDescription": "选择每周的第一天",
"sunday": "星期日",
"monday": "星期一",
"saturday": "星期六",
"formats": {
"mdy": "MM/DD/YYYY (美国)",
"dmy": "DD/MM/YYYY (欧洲)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "长格式 (例如2024年1月1日)",
"short": "短格式 (例如2024年1月1日)"
}
},
"sidepanel": {
"title": "侧边栏自定义",
"description": "自定义侧边栏中卡片的布局和可见性。此部分仅适用于平板电脑和台式机等大屏设备。"
},
"theme": {
"title": "主题偏好",
"description": "选择网站的显示外观。您可以选择单一主题,或与系统同步,自动切换日间和夜间主题。",
"themeMode": "主题模式",
"light": "浅色",
"dark": "深色",
"system": "跟随系统"
},
"notifications": {
"settingsSaved": "设置保存成功",
"settingsSaveFailed": "设置保存失败",
"invalidWebhook": "无效的 Webhook URL"
},
"profile": {
"title": "个人资料设置",
"description": "更新您的显示名称和个人头像。",
"photoUpdated": "头像已更新",
"photoUpdatedMessage": "您的个人头像已成功更新!",
"uploadFailed": "上传失败",
"uploadFailedMessage": "头像上传失败。请重试。",
"profileUpdated": "资料已更新",
"profileUpdatedMessage": "您的个人资料已成功保存!",
"updateFailed": "更新失败",
"updateFailedMessage": "无法更新您的个人资料。请检查网络连接后重试。",
"changePhoto": "更换头像",
"displayName": "显示名称",
"displayNamePlaceholder": "输入您的显示名称",
"timezone": "时区",
"timezonePlaceholder": "选择您的时区",
"common": {
"save": "保存",
"cancel": "取消"
"cancel": "取消",
"confirm": "确认",
"remove": "移除",
"delete": "删除",
"refresh": "刷新",
"loading": "加载中…",
"on": "开",
"off": "关",
"error": "错误",
"success": "成功",
"plusFeature": "Plus 功能",
"earlyAccess": "抢先体验"
},
"overview": {
"title": "设置",
"subtitle": "自定义您的体验并管理账户偏好",
"subtitle": "定制你的使用体验并管理账户偏好",
"upgrade": {
"title": "升级到 Plus",
"description": "解锁强大功能,提升的效率",
"description": "解锁强大功能,提升的效率",
"button": "立即升级",
"features": {
"richText": "富文本描述",
@@ -119,56 +32,463 @@
"sections": {
"profile": {
"title": "个人资料设置",
"description": "更新的个人资料信息、头像、显示名称和时区偏好。"
"description": "更新的个人资料、头像、显示名称和时区偏好。"
},
"circle": {
"title": "圈子设置",
"description": "管理的圈子、邀请成员并处理加入请。"
"description": "管理的圈子、邀请成员并处理加入请。"
},
"account": {
"title": "账户设置",
"description": "管理订阅、修改密码及账户删除选项。"
"description": "管理订阅、修改密码以及删除账户。"
},
"subaccounts": {
"title": "管账户",
"description": "创建和管理子账户,以便登录并完成分配的任务。"
"title": "管账户",
"description": "创建和管理子账户,让他们登录并完成分配的任务。"
},
"notifications": {
"title": "通知",
"description": "配置推送通知、邮件提醒及任务通知目标。"
"description": "配置推送通知、邮件提醒及任务通知目标。"
},
"mfa": {
"title": "多因素认证",
"description": "使用身份验证器应用启用 MFA增加一层安全保。"
"title": "多重身份验证",
"description": "通过身份验证器应用启用 MFA为账户增加一层安全保。"
},
"apitokens": {
"title": "API 令牌",
"description": "生成和管理用于第三方集成 API 访问的访问令牌。"
"description": "生成和管理用于第三方集成 API 访问的访问令牌。"
},
"storage": {
"title": "存储设置",
"description": "备份和恢复数据,管理本地存储同步偏好。"
"description": "备份和恢复数据,管理本地存储同步偏好。"
},
"sidepanel": {
"title": "侧边栏自定义",
"description": "自定义侧边栏界面中卡片的布局和可见性。"
"description": "自定义侧边栏中卡片的布局和显示状态。"
},
"theme": {
"title": "主题偏好",
"description": "选择喜欢的主题并配置深色/浅色模式设置。"
"description": "选择喜欢的主题并配置深色浅色模式。"
},
"localization": {
"title": "本地化",
"description": "自定义语言、日期格式、时间格式区域偏好。"
"description": "自定义语言、日期格式、时间格式区域偏好。"
},
"advanced": {
"title": "高级设置",
"description": "配置 Webhook、实时更新及其他高级功能以提升效率。"
"description": "配置 Webhook、实时更新及其他高级功能。"
},
"developer": {
"title": "开发者设置",
"description": "查看有关身份验证令牌、SSE 连接调试数据技术信息。"
"description": "查看身份验证令牌、SSE 连接调试数据技术信息。"
},
"feedback": {
"title": "发送反馈",
"description": "告诉我们 Donetick 用起来如何,或提出功能建议。"
},
"bugReport": {
"title": "报告问题",
"description": "有什么不对劲吗?把详情和技术快照一起发给我们。"
}
}
},
"profile": {
"title": "个人资料设置",
"description": "更新你的显示名称和头像。",
"photoUpdated": "头像已更新",
"photoUpdatedMessage": "你的头像已成功更新!",
"uploadFailed": "上传失败",
"uploadFailedMessage": "无法上传你的照片,请重试。",
"profileUpdated": "资料已更新",
"profileUpdatedMessage": "你的个人资料已成功保存!",
"updateFailed": "更新失败",
"updateFailedMessage": "无法更新你的资料,请检查网络后重试。",
"changePhoto": "更换头像",
"editPhoto": "编辑头像",
"displayName": "显示名称",
"displayNamePlaceholder": "输入你的显示名称",
"timezone": "时区",
"timezonePlaceholder": "选择你的时区",
"save": "保存",
"cancel": "取消"
},
"circleSettings": {
"title": "圈子设置",
"description": "当你创建或加入圈子时,账户会自动连接到该圈子。分享下方的专属圈子代码或链接即可轻松邀请好友。有人申请加入你的圈子时,下方会出现通知。",
"memberOf": "你是 {{name}} 的成员",
"yourCircleCode": "你的圈子代码是:",
"copyCode": "复制代码",
"shareInvite": "分享邀请",
"codeCopied": "代码已复制到剪贴板",
"linkCopied": "邀请链接已复制到剪贴板",
"myCircle": "我的圈子",
"shareTitle": "在 Donetick 加入 {{name}}",
"shareText": "我想邀请你加入 Donetick 上的 {{name}}。",
"shareDialogTitle": "分享圈子邀请",
"leave": "退出圈子",
"leaveConfirmTitle": "退出圈子",
"leaveConfirmMessage": "确定要退出你的圈子吗?",
"leaveConfirmButton": "退出",
"leftCircle": "已成功退出圈子",
"leaveFailed": "退出圈子失败",
"circleMembers": "圈子成员",
"you": "(你)",
"pendingApproval": "等待审批",
"joinedOn": "加入于 {{date}}",
"requestedToJoin": "申请加入 {{date}}",
"roles": {
"member": "成员",
"memberDescription": "圈子的普通成员",
"manager": "管理者",
"managerDescription": "可以以其他用户身份操作并代其执行",
"admin": "管理员",
"adminDescription": "对圈子拥有完全权限"
},
"roleUpdateFailed": "更新角色失败",
"removeMemberTitle": "移除成员",
"removeMemberMessage": "确定要将 {{name}} 移出你的圈子吗?",
"memberRemoved": "已成功移除成员",
"circleMemberRequests": "圈子加入请求",
"lastUpdated": "上次更新:{{time}}",
"refreshing": "正在刷新…",
"refreshFailed": "刷新加入请求失败",
"wantsToJoin": "{{name}} 想加入你的圈子。",
"accept": "接受",
"acceptRequestTitle": "接受加入请求",
"acceptRequestMessage": "确定要接受 {{name}}(用户名:{{username}})加入你的圈子吗?",
"requestAccepted": "已成功接受请求",
"or": "或",
"joinOtherDescription": "想加入别人的圈子?向对方索取专属圈子代码或加入链接,然后在下方输入代码即可加入。",
"enterCircleCode": "输入圈子代码:",
"enterCodePlaceholder": "输入代码",
"joinCircle": "加入圈子",
"joinedPending": "已成功加入圈子,请等待圈主接受你的请求。",
"alreadyMember": "你已经是该圈子的成员",
"joinFailed": "加入圈子失败"
},
"accountSettings": {
"title": "账户设置",
"description": "修改你的账户设置、套餐类型或密码",
"accountType": "账户类型:{{type}}",
"free": "免费版",
"plus": "Plus",
"plusUntil": "Plus至 {{date}}",
"activeDescription": "你当前已订阅 Plus 套餐,订阅将于 {{date}} 续期。",
"cancelledDescription": "你已取消订阅,账户将于 {{date}} 降级为免费套餐。",
"freeDescription": "你当前使用的是免费套餐。升级到 Plus 可解锁更多功能。",
"upgrade": "升级",
"cancel": "取消订阅",
"password": "密码:",
"changePassword": "修改密码",
"passwordChanged": "密码修改成功",
"passwordChangeFailed": "密码修改失败",
"dangerZone": "危险操作",
"dangerZoneDescription": "账户一旦删除便无法恢复,请谨慎操作。",
"deleteAccount": "删除账户",
"accountDeleted": "账户已成功删除",
"subscriptionCancelled": "订阅已取消",
"subscriptionCancelFailed": "取消订阅失败",
"purchase": {
"success": "购买成功!请重启应用以使用 Plus 功能。",
"storeConnection": "应用商店连接异常,请检查网络后重试。",
"notAllowed": "此设备不允许购买,请检查设备的限制设置。",
"unavailable": "此订阅暂不可用,请稍后再试。",
"alreadyProcessed": "此次购买已处理。如果你认为这是错误,请联系客服。",
"receiptMissing": "缺少购买凭据,请重新尝试购买。",
"networkError": "网络错误,请检查网络连接后重试。",
"invalidReceipt": "购买凭据无效。如果问题持续存在,请联系客服。",
"pending": "付款正在等待审核,通过后你将获得访问权限。",
"failed": "购买失败:{{error}}。请重试或联系客服。",
"unknownError": "未知错误"
}
},
"subaccounts": {
"title": "受管账户",
"description": "管理子账户。子账户用户可以登录并完成分配给他们的任务。",
"notParentTitle": "子账户管理",
"notParentMessage": "只有主账户才能管理子账户。",
"freePlanNotice": "免费套餐限 1 个子账户。升级到 Plus 最多可拥有 5 个子账户。",
"count": "子账户({{count}}",
"add": "添加子账户",
"loading": "正在加载子账户…",
"emptyTitle": "暂无子账户",
"emptyDescription": "创建子账户,让团队成员可以登录并完成分配给他们的任务。",
"addFirst": "添加第一个子账户",
"username": "用户名:{{username}}",
"created": "创建于:{{date}}",
"changePassword": "修改密码",
"deleteAccount": "删除账户",
"createdSuccess": "子账户“{{name}}”创建成功!",
"createFailed": "创建子账户失败:{{error}}",
"createFailedGeneric": "创建子账户失败",
"passwordUpdated": "子账户密码更新成功",
"passwordUpdateFailed": "更新密码失败:{{error}}",
"passwordUpdateFailedGeneric": "更新密码失败",
"deleteConfirmTitle": "删除子账户",
"deleteConfirmMessage": "确定要删除子账户“{{name}}”吗?此操作无法撤销。",
"deleted": "子账户“{{name}}”已成功删除",
"deleteFailed": "删除子账户失败:{{error}}",
"deleteFailedGeneric": "删除子账户失败",
"howItWorksTitle": "受管账户如何运作",
"howItWorks1": "受管账户由主账户创建,适用于你希望能够删除其账户并重置其密码的用户。",
"howItWorks2": "子账户可以使用自己的用户名和密码登录。",
"howItWorks3": "受管账户可以完成任务,但管理权限有限",
"howItWorks4": "受管账户会自动加入你的圈子"
},
"notifications": {
"title": "通知设置",
"deviceSection": "设备通知",
"deviceSectionDescription": "管理你的设备通知",
"deviceLabel": "设备通知",
"deviceHelper": "任务到期时在设备上接收通知",
"mobileOnly": "此功能仅在移动设备上可用",
"testNotification": "测试通知",
"testNotificationBody": "你有一项任务即将到期",
"dueTitle": "到期通知",
"dueLabel": "任务到期时通知",
"preDueTitle": "到期前通知",
"preDueLabel": "任务到期前几小时通知",
"overdueTitle": "逾期通知",
"overdueLabel": "任务逾期时通知",
"pushLabel": "推送通知",
"pushHelper": "通过推送通知接收提醒、公告和任务分配",
"registeredDevices": "已注册设备({{count}}/5",
"registeredDevicesDescription": "已注册接收你账户推送通知的设备",
"currentDevice": "当前设备:{{platform}} {{model}}",
"currentDeviceNotRegistered": "此设备尚未注册推送通知",
"limitReached": "已达上限",
"registerDevice": "注册设备",
"unknownDevice": "未知设备",
"deviceCreatedAt": "创建于:{{date}}",
"noDevices": "尚无设备注册推送通知",
"customSection": "自定义通知",
"customSectionDescription": "通过 Telegram、Pushover 等其他平台接收通知",
"customLabel": "自定义通知",
"customHelper": "在其他平台上接收通知",
"targetNone": "无",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhook",
"telegramBotHelpBefore": "你需要先向机器人发送一条消息Telegram 通知才能生效",
"telegramBotHelpAfter": "开始聊天",
"clickHere": "点击这里",
"chatId": "Chat ID",
"chatIdPlaceholder": "用户 ID / Chat ID",
"telegramChatIdHelpBefore": "如果你不知道自己的 Chat ID可以和 userinfobot 开始聊天,它会告诉你。",
"telegramChatIdHelpAfter": "与 userinfobot 开始聊天",
"userKey": "用户密钥",
"userKeyPlaceholder": "用户 ID",
"chatIdRequired": "Chat ID 为必填项",
"chatIdInvalid": "Chat ID 无效",
"userKeyRequired": "用户密钥为必填项",
"targetUpdated": "通知目标已更新",
"targetUpdateFailed": "更新通知目标时出错:{{error}}",
"deviceRegistered": "设备已成功注册推送通知。",
"deviceLimitTitle": "已达设备数量上限",
"deviceLimitMessage": "你已达到 5 台已注册设备的上限。请先移除一台设备,再注册此设备。",
"registrationFailedTitle": "注册失败",
"registrationFailedMessage": "无法自动注册设备,请重试。",
"permissionRequiredTitle": "需要授权",
"permissionRequiredMessage": "注册此设备需要推送通知权限。",
"registrationInitiatedTitle": "已开始注册",
"registrationInitiatedMessage": "推送通知注册已开始,设备将自动完成注册。",
"registerDeviceFailed": "注册设备失败,请重试。",
"permissionDeniedTitle": "通知权限被拒绝",
"permissionDeniedMessage": "你拒绝了通知权限。之后可以在设备设置中重新开启。",
"pushPermissionDeniedTitle": "推送通知权限被拒绝",
"pushPermissionDeniedMessage": "推送通知已关闭。如有需要,可在设备设置中重新开启。",
"unregisterFailed": "取消注册设备失败"
},
"mfa": {
"title": "多重身份验证",
"description": "使用多重身份验证MFA为账户增加一层安全保护。开启后登录时除密码外还需输入身份验证器应用中的验证码。",
"twoFactor": "两步验证",
"enabledSubtitle": "你的账户已启用两步验证保护",
"disabledSubtitle": "使用身份验证器应用保护你的账户",
"enable": "开启",
"disable": "关闭",
"enabledSuccess": "MFA 已成功开启!",
"disabledSuccess": "MFA 已成功关闭!",
"errors": {
"qrGenerationFailed": "无法生成二维码",
"invalidResponse": "服务器响应无效,缺少二维码或密钥。",
"notFound": "未找到 MFA 设置接口,此功能可能尚未开放。",
"unauthorized": "未授权,请重新登录。",
"serverError": "服务器错误,请稍后再试。",
"setupFailed": "设置 MFA 失败({{status}}),请重试。",
"networkError": "网络错误,请检查网络连接后重试。",
"invalidCode": "验证码无效,请重试。",
"confirmFailed": "确认 MFA 失败,请重试。",
"disableFailed": "关闭 MFA 失败,请重试。"
},
"setup": {
"title": "设置多重身份验证",
"addedAccount": "我已添加账户",
"back": "返回",
"verifyAndEnable": "验证并开启",
"savedBackupCodes": "我已保存备用代码",
"step1Label": "第 1 步:",
"step1": "用身份验证器应用Google Authenticator、Authy 等)扫描下方二维码",
"qrAlt": "MFA 二维码",
"qrFailed": "无法生成二维码,请重试或使用下方的手动输入密钥。",
"manualKey": "手动输入密钥:",
"step2Label": "第 2 步:",
"step2": "输入身份验证器应用中的 6 位验证码",
"codePlaceholder": "输入 6 位验证码",
"successTitle": "MFA 已成功开启!",
"backupCodesTitle": "请将这些备用代码保存在安全的地方",
"backupCodesDescription": "如果你丢失了身份验证器设备,可以使用这些代码访问账户。每个代码只能使用一次。"
},
"disableModal": {
"title": "关闭多重身份验证",
"warning": "关闭 MFA 会降低账户的安全性。确定要继续吗?",
"prompt": "请输入身份验证器应用中的验证码以确认:",
"confirm": "关闭 MFA"
},
"backupCodesModal": {
"title": "新的备用代码",
"warning": "你之前的备用代码已失效。请将这些新代码保存在安全的地方。每个代码只能使用一次。"
}
},
"apiTokens": {
"title": "API 令牌",
"accessToken": "访问令牌",
"description": "创建令牌,通过 API 更新可触发任务的物件",
"plusNotice": "基础套餐不支持 API 令牌。升级到 Plus 即可生成 API 令牌,用于对接外部系统并实现任务自动化。",
"showToken": "显示令牌",
"hideToken": "隐藏令牌",
"removeTitle": "移除令牌",
"removeMessage": "确定要移除 {{name}} 吗?",
"removedTitle": "已移除",
"removedMessage": "API 令牌已移除",
"tokenCopied": "令牌已复制到剪贴板",
"generateNew": "生成新令牌",
"nameModalTitle": "给新令牌起个名字,方便你日后识别。",
"generateToken": "生成令牌"
},
"storage": {
"title": "存储设置",
"serverTitle": "服务器存储用量",
"serverDescription": "这是你的账户在我们服务器上占用的存储空间(例如你上传的文件、图片和数据)。",
"usagePlaceholder": "已用 -- MB / 共 -- MB--",
"usage": "已用 {{used}} MB / 共 {{total}} MB{{percent}}%",
"basicPlanNotice": "基础套餐不支持服务器存储。升级到 Plus 即可查看服务器存储用量。",
"localTitleApp": "应用本地存储与缓存",
"localTitleBrowser": "浏览器本地存储与缓存",
"localDescription": "这是为了加快访问速度而保存在浏览器本地的数据。清除不会影响服务器上的数据,但可能会退出登录。",
"clearLocal": "清除全部本地存储与缓存",
"clearLocalTitle": "清除全部本地存储",
"clearLocalMessage": "确定要清除本地存储和缓存吗?这会移除此浏览器中的所有数据,并需要重新登录。",
"clearAll": "全部清除",
"appPreferences": "应用偏好设置",
"deviceOnly": "仅本设备",
"appPreferencesDescription": "这是应用保存在本设备上的偏好和设置。清除后应用相关设置会被重置,可能需要重新登录,但不会影响服务器上的数据。",
"clearPreferences": "清除应用偏好设置",
"clearPreferencesTitle": "清除应用偏好设置",
"clearPreferencesMessage": "确定要清除全部应用偏好设置吗?这会重置你的应用设置,并可能需要重新登录。"
},
"sidepanel": {
"title": "侧边栏自定义",
"heading": "侧边栏设置",
"description": "设置侧边栏显示哪些卡片以及它们的顺序。拖放可重新排序,也可切换每张卡片的显示状态。",
"resetToDefaults": "恢复默认",
"resetHelper": "这会将所有卡片的显示状态和顺序恢复为默认值。",
"cards": {
"welcome": {
"name": "切换用户",
"description": "让管理员/管理者以其他用户的视角查看任务"
},
"smartInsights": {
"name": "智能洞察",
"description": "基于你的任务提供快捷操作"
},
"assignees": {
"name": "按负责人查看任务",
"description": "按任务的负责人进行分组"
},
"calendar": {
"name": "日历视图",
"description": "以日历形式显示任务"
},
"activities": {
"name": "近期动态",
"description": "显示最近完成的任务和动态"
},
"weeklyGoals": {
"name": "每周目标",
"description": "显示每周进度和家庭完成情况统计"
}
}
},
"theme": {
"title": "主题偏好",
"description": "选择站点的外观。可以固定使用某个主题,也可以与系统同步,在日间和夜间主题之间自动切换。",
"themeMode": "主题模式",
"light": "浅色",
"dark": "深色",
"system": "跟随系统"
},
"localization": {
"title": "本地化",
"description": "自定义账户的语言、日期格式和区域偏好。",
"language": "语言",
"languageDescription": "选择你偏好的语言",
"rtlNotice": "该语言使用从右到左RTL的书写方向",
"dateFormat": "日期格式",
"dateFormatDescription": "选择应用中日期的显示方式",
"timeFormat": "时间格式",
"timeFormatDescription": "选择 12 小时制或 24 小时制",
"preview": "预览:{{value}}",
"12hour": "12 小时制AM/PM",
"24hour": "24 小时制",
"firstDayOfWeek": "每周第一天",
"firstDayOfWeekDescription": "选择一周从星期几开始",
"sunday": "星期日",
"monday": "星期一",
"saturday": "星期六",
"formats": {
"mdy": "MM/DD/YYYY美国",
"dmy": "DD/MM/YYYY欧洲",
"ymd": "YYYY-MM-DDISO",
"long": "长格式例如2024年1月1日",
"short": "短格式例如2024年1月1日"
}
},
"advanced": {
"title": "高级设置",
"description": "配置 Webhook、实时更新等高级功能进一步提升效率。",
"offlineTitle": "离线支持",
"offlineDescription": "在此设备/浏览器上离线时也能继续使用 Donetick。你的更改会保存在本地恢复联网后自动同步。",
"offlineToggle": "启用离线支持",
"offlineHelper": "关闭后,将移除此设备/浏览器上未同步的离线更改和已保存的离线数据。",
"offlineEnabled": "已为此设备/浏览器启用离线模式",
"offlineDisabled": "已关闭离线模式并清除本地数据",
"offlineDisabledPartial": "离线模式已关闭,但可能仍有部分本地数据保留",
"offlineDisableTitle": "关闭离线模式",
"offlineDisableMessage": "关闭离线模式会移除此设备/浏览器上未同步的离线更改和已保存的离线数据。确定要继续吗?",
"offlineDisableConfirm": "关闭并清除数据",
"webhookTitle": "Webhook 集成",
"webhookDescription": "Webhook 可以在你的圈子中发生事件时,向其他服务实时发送通知。配置 Webhook URL 即可接收实时更新。",
"webhookPlusNotice": "基础套餐不支持 Webhook 通知。升级到 Plus 即可通过 Webhook 接收实时更新。",
"webhookToggle": "启用 Webhook",
"webhookHelper": "为任务和物件的更新启用 Webhook 通知。",
"webhookURL": "Webhook URL",
"webhookUpdated": "Webhook URL 更新成功",
"webhookUpdateFailed": "更新 Webhook URL 失败",
"realtimeTitle": "实时更新",
"realtimeDescription": "设置当圈子中的任务和动态发生变化时,你如何接收实时更新。",
"realtime": {
"toggleLabel": "启用实时更新",
"title": "实时更新",
"subtitle": "任务更新时立即收到通知",
"statusLabel": "状态:",
"basicPlan": "基础套餐不支持实时更新。升级到 Plus 即可在任务更新时立即收到通知。",
"disabled": "实时更新已关闭。开启后,当你或其他圈子成员完成、跳过或修改任务时,即可看到实时变化。",
"connected": "实时更新运行正常。当你或其他圈子成员完成、跳过或修改任务时,你会看到实时变化。",
"connecting": "正在连接实时更新…",
"errored": "实时更新已开启但未正常工作:{{error}}",
"notConnected": "实时更新已开启,但当前未连接。",
"basicPlanNotice": "基础套餐不支持实时更新。升级到 Plus当你或其他圈子成员完成、跳过或修改任务时即可立即收到通知。"
}
}
}
}

View File

@@ -20,6 +20,7 @@
"logout": "Logout",
"version": "Version",
"navigation": {
"search": "搜索",
"allTasks": "All Tasks",
"archived": "Archived",
"things": "Things",
@@ -30,6 +31,43 @@
"points": "Points",
"settings": "Settings"
},
"search": {
"title": "搜索",
"placeholder": "搜索 Donetick",
"inputAriaLabel": "搜索任务、历史、项目、标签和设置",
"deviceNote": "正在搜索此设备上可用的内容",
"escape": "Esc",
"recent": "最近",
"empty": {
"title": "没有直接匹配的结果",
"subtitle": "你仍然可以用此搜索筛选任务列表。"
},
"groups": {
"tasks": "任务",
"history": "备注",
"projects": "项目",
"labels": "标签",
"people": "成员",
"settings": "设置",
"actions": "快捷操作"
},
"actions": {
"quickAction": "快捷操作",
"navigation": "导航",
"createTask": "创建任务",
"viewAllTasks": "查看所有任务",
"viewArchivedTasks": "查看已归档任务",
"openSettings": "打开设置",
"filterTasks": "显示匹配“{{query}}”的任务",
"filterTasksSubtitle": "筛选任务列表"
},
"footer": {
"navigate": "导航",
"open": "打开",
"results_other": "{{count}} 个结果",
"typeToSearch": "输入以搜索"
}
},
"feedback": {
"later": "Maybe later",
"sentiment": {

View File

@@ -1,178 +1,494 @@
{
"title": "Settings",
"circleSettings": {
"title": "Circle settings",
"description": "Your account is automatically connected to a Circle when you create or join one. Easily invite friends by sharing the unique Circle code or link below. You'll receive a notification below when someone requests to join your Circle. If you'd like to leave, simply hit the 'Leave Circle' button.",
"circleCode": "Circle Code",
"copyCode": "Copy Code",
"copyLink": "Copy Link",
"codeCopied": "Circle code copied!",
"linkCopied": "Circle link copied!",
"joinCircle": "Join a Circle",
"joinCirclePlaceholder": "Enter Circle Code",
"join": "Join",
"leave": "Leave Circle",
"leaveConfirmTitle": "Leave Circle",
"leaveConfirmMessage": "Are you sure you want to leave this circle?",
"circleMembers": "Circle Members",
"circleMemberRequests": "Circle Member Requests",
"admin": "Admin",
"member": "Member",
"pending": "Pending",
"accept": "Accept",
"reject": "Reject",
"makeAdmin": "Make Admin",
"makeMember": "Make Member",
"remove": "Remove",
"webhookURL": "Webhook URL",
"webhookDescription": "Enter a webhook URL to receive notifications for circle events",
"webhookPlaceholder": "https://your-webhook-url.com"
},
"accountSettings": {
"title": "Account Settings",
"subscription": "Subscription",
"subscriptionStatus": "Current Plan",
"free": "Free",
"plus": "Plus",
"upgrade": "Upgrade",
"cancel": "Cancel",
"changePassword": "Change Password",
"password": "Password",
"dangerZone": "Danger Zone",
"dangerZoneDescription": "Once you delete your account, there is no going back. Please be certain.",
"deleteAccount": "Delete Account"
},
"localization": {
"title": "Localization",
"description": "Customize language, date format, and regional preferences for your account.",
"language": "Language",
"languageDescription": "Select your preferred language",
"dateFormat": "Date Format",
"dateFormatDescription": "Choose how dates should be displayed throughout the application",
"timeFormat": "Time Format",
"timeFormatDescription": "Select 12-hour or 24-hour time format",
"12hour": "12-hour (AM/PM)",
"24hour": "24-hour",
"firstDayOfWeek": "First Day of Week",
"firstDayOfWeekDescription": "Select which day starts your week",
"sunday": "Sunday",
"monday": "Monday",
"saturday": "Saturday",
"formats": {
"mdy": "MM/DD/YYYY (US)",
"dmy": "DD/MM/YYYY (Europe)",
"ymd": "YYYY-MM-DD (ISO)",
"long": "Long format (e.g., January 1, 2024)",
"short": "Short format (e.g., Jan 1, 2024)"
}
},
"sidepanel": {
"title": "Sidepanel Customization",
"description": "Customize the layout and visibility of cards in the sidepanel. This section is only available on large screen devices such as tablets and desktops."
},
"theme": {
"title": "Theme preferences",
"description": "Choose how the site looks to you. Select a single theme, or sync with your system and automatically switch between day and night themes.",
"themeMode": "Theme mode",
"light": "Light",
"dark": "Dark",
"system": "System"
},
"notifications": {
"settingsSaved": "Settings saved successfully",
"settingsSaveFailed": "Failed to save settings",
"invalidWebhook": "Invalid webhook URL"
},
"profile": {
"title": "Profile Settings",
"description": "Update your display name and profile photo.",
"photoUpdated": "Photo Updated",
"photoUpdatedMessage": "Your profile photo has been updated successfully!",
"uploadFailed": "Upload Failed",
"uploadFailedMessage": "Failed to upload your photo. Please try again.",
"profileUpdated": "Profile Updated",
"profileUpdatedMessage": "Your profile information has been saved successfully!",
"updateFailed": "Update Failed",
"updateFailedMessage": "Unable to update your profile. Please check your connection and try again.",
"changePhoto": "Change Photo",
"displayName": "Display Name",
"displayNamePlaceholder": "Enter your display name",
"timezone": "Timezone",
"timezonePlaceholder": "Select your timezone",
"save": "Save",
"cancel": "Cancel"
"title": "设置",
"common": {
"save": "保存",
"cancel": "取消",
"confirm": "确认",
"remove": "移除",
"delete": "删除",
"refresh": "刷新",
"loading": "加载中…",
"on": "开",
"off": "关",
"error": "错误",
"success": "成功",
"plusFeature": "Plus 功能",
"earlyAccess": "抢先体验"
},
"overview": {
"title": "Settings",
"subtitle": "Customize your experience and manage your account preferences",
"title": "设置",
"subtitle": "定制你的使用体验并管理账户偏好",
"upgrade": {
"title": "Upgrade to Plus",
"description": "Unlock powerful features to enhance your productivity",
"button": "Upgrade Now",
"title": "升级到 Plus",
"description": "解锁强大功能,提升你的效率",
"button": "立即升级",
"features": {
"richText": "Rich text descriptions",
"notifications": "Task notifications",
"apiIntegrations": "API integrations",
"advancedAutomation": "Advanced automation"
"richText": "富文本描述",
"notifications": "任务通知",
"apiIntegrations": "API 集成",
"advancedAutomation": "高级自动化"
}
},
"sections": {
"profile": {
"title": "Profile Settings",
"description": "Update your profile information, photo, display name, and timezone preferences."
"title": "个人资料设置",
"description": "更新你的个人资料、头像、显示名称和时区偏好。"
},
"circle": {
"title": "Circle Settings",
"description": "Manage your circle, invite members, and handle join requests."
"title": "圈子设置",
"description": "管理你的圈子、邀请成员并处理加入请求。"
},
"account": {
"title": "Account Settings",
"description": "Manage your subscription, change password, and account deletion options."
"title": "账户设置",
"description": "管理订阅、修改密码以及删除账户。"
},
"subaccounts": {
"title": "Managed Accounts",
"description": "Create and manage sub accounts to log in and complete assigned tasks."
"title": "受管账户",
"description": "创建和管理子账户,让他们登录并完成分配的任务。"
},
"notifications": {
"title": "Notifications",
"description": "Configure push notifications, email alerts, and notification targets for tasks."
"title": "通知",
"description": "配置推送通知、邮件提醒以及任务的通知目标。"
},
"mfa": {
"title": "Multi-Factor Authentication",
"description": "Add an extra layer of security with MFA using authenticator apps."
"title": "多重身份验证",
"description": "通过身份验证器应用启用 MFA为账户增加一层安全保护。"
},
"apitokens": {
"title": "API Tokens",
"description": "Generate and manage access tokens for third-party integrations and API access."
"title": "API 令牌",
"description": "生成和管理用于第三方集成与 API 访问的访问令牌。"
},
"storage": {
"title": "Storage Settings",
"description": "Backup and restore your data, manage local storage and sync preferences."
"title": "存储设置",
"description": "备份和恢复数据,管理本地存储与同步偏好。"
},
"sidepanel": {
"title": "Sidepanel Customization",
"description": "Customize the layout and visibility of cards in the sidepanel interface."
"title": "侧边栏自定义",
"description": "自定义侧边栏中卡片的布局和显示状态。"
},
"theme": {
"title": "Theme Preferences",
"description": "Choose your preferred theme and configure dark/light mode settings."
"title": "主题偏好",
"description": "选择你喜欢的主题并配置深色/浅色模式。"
},
"localization": {
"title": "Localization",
"description": "Customize language, date format, time format, and regional preferences."
"title": "本地化",
"description": "自定义语言、日期格式、时间格式和区域偏好。"
},
"advanced": {
"title": "Advanced Settings",
"description": "Configure webhooks, real-time updates, and other advanced features for enhanced productivity."
"title": "高级设置",
"description": "配置 Webhook、实时更新以及其他高级功能。"
},
"developer": {
"title": "Developer Settings",
"description": "View technical information about authentication tokens, SSE connections, and debug data."
"title": "开发者设置",
"description": "查看身份验证令牌、SSE 连接和调试数据等技术信息。"
},
"feedback": {
"title": "Send Feedback",
"description": "Tell us how Donetick is working for you, report a bug, or request a feature."
"title": "发送反馈",
"description": "告诉我们 Donetick 用起来如何,或提出功能建议。"
},
"bugReport": {
"title": "报告问题",
"description": "有什么不对劲吗?把详情和技术快照一起发给我们。"
}
}
},
"profile": {
"title": "个人资料设置",
"description": "更新你的显示名称和头像。",
"photoUpdated": "头像已更新",
"photoUpdatedMessage": "你的头像已成功更新!",
"uploadFailed": "上传失败",
"uploadFailedMessage": "无法上传你的照片,请重试。",
"profileUpdated": "资料已更新",
"profileUpdatedMessage": "你的个人资料已成功保存!",
"updateFailed": "更新失败",
"updateFailedMessage": "无法更新你的资料,请检查网络后重试。",
"changePhoto": "更换头像",
"editPhoto": "编辑头像",
"displayName": "显示名称",
"displayNamePlaceholder": "输入你的显示名称",
"timezone": "时区",
"timezonePlaceholder": "选择你的时区",
"save": "保存",
"cancel": "取消"
},
"circleSettings": {
"title": "圈子设置",
"description": "当你创建或加入圈子时,账户会自动连接到该圈子。分享下方的专属圈子代码或链接即可轻松邀请好友。有人申请加入你的圈子时,下方会出现通知。",
"memberOf": "你是 {{name}} 的成员",
"yourCircleCode": "你的圈子代码是:",
"copyCode": "复制代码",
"shareInvite": "分享邀请",
"codeCopied": "代码已复制到剪贴板",
"linkCopied": "邀请链接已复制到剪贴板",
"myCircle": "我的圈子",
"shareTitle": "在 Donetick 加入 {{name}}",
"shareText": "我想邀请你加入 Donetick 上的 {{name}}。",
"shareDialogTitle": "分享圈子邀请",
"leave": "退出圈子",
"leaveConfirmTitle": "退出圈子",
"leaveConfirmMessage": "确定要退出你的圈子吗?",
"leaveConfirmButton": "退出",
"leftCircle": "已成功退出圈子",
"leaveFailed": "退出圈子失败",
"circleMembers": "圈子成员",
"you": "(你)",
"pendingApproval": "等待审批",
"joinedOn": "加入于 {{date}}",
"requestedToJoin": "申请加入 {{date}}",
"roles": {
"member": "成员",
"memberDescription": "圈子的普通成员",
"manager": "管理者",
"managerDescription": "可以以其他用户身份操作并代其执行",
"admin": "管理员",
"adminDescription": "对圈子拥有完全权限"
},
"roleUpdateFailed": "更新角色失败",
"removeMemberTitle": "移除成员",
"removeMemberMessage": "确定要将 {{name}} 移出你的圈子吗?",
"memberRemoved": "已成功移除成员",
"circleMemberRequests": "圈子加入请求",
"lastUpdated": "上次更新:{{time}}",
"refreshing": "正在刷新…",
"refreshFailed": "刷新加入请求失败",
"wantsToJoin": "{{name}} 想加入你的圈子。",
"accept": "接受",
"acceptRequestTitle": "接受加入请求",
"acceptRequestMessage": "确定要接受 {{name}}(用户名:{{username}})加入你的圈子吗?",
"requestAccepted": "已成功接受请求",
"or": "或",
"joinOtherDescription": "想加入别人的圈子?向对方索取专属圈子代码或加入链接,然后在下方输入代码即可加入。",
"enterCircleCode": "输入圈子代码:",
"enterCodePlaceholder": "输入代码",
"joinCircle": "加入圈子",
"joinedPending": "已成功加入圈子,请等待圈主接受你的请求。",
"alreadyMember": "你已经是该圈子的成员",
"joinFailed": "加入圈子失败"
},
"accountSettings": {
"title": "账户设置",
"description": "修改你的账户设置、套餐类型或密码",
"accountType": "账户类型:{{type}}",
"free": "免费版",
"plus": "Plus",
"plusUntil": "Plus至 {{date}}",
"activeDescription": "你当前已订阅 Plus 套餐,订阅将于 {{date}} 续期。",
"cancelledDescription": "你已取消订阅,账户将于 {{date}} 降级为免费套餐。",
"freeDescription": "你当前使用的是免费套餐。升级到 Plus 可解锁更多功能。",
"upgrade": "升级",
"cancel": "取消订阅",
"password": "密码:",
"changePassword": "修改密码",
"passwordChanged": "密码修改成功",
"passwordChangeFailed": "密码修改失败",
"dangerZone": "危险操作",
"dangerZoneDescription": "账户一旦删除便无法恢复,请谨慎操作。",
"deleteAccount": "删除账户",
"accountDeleted": "账户已成功删除",
"subscriptionCancelled": "订阅已取消",
"subscriptionCancelFailed": "取消订阅失败",
"purchase": {
"success": "购买成功!请重启应用以使用 Plus 功能。",
"storeConnection": "应用商店连接异常,请检查网络后重试。",
"notAllowed": "此设备不允许购买,请检查设备的限制设置。",
"unavailable": "此订阅暂不可用,请稍后再试。",
"alreadyProcessed": "此次购买已处理。如果你认为这是错误,请联系客服。",
"receiptMissing": "缺少购买凭据,请重新尝试购买。",
"networkError": "网络错误,请检查网络连接后重试。",
"invalidReceipt": "购买凭据无效。如果问题持续存在,请联系客服。",
"pending": "付款正在等待审核,通过后你将获得访问权限。",
"failed": "购买失败:{{error}}。请重试或联系客服。",
"unknownError": "未知错误"
}
},
"subaccounts": {
"title": "受管账户",
"description": "管理子账户。子账户用户可以登录并完成分配给他们的任务。",
"notParentTitle": "子账户管理",
"notParentMessage": "只有主账户才能管理子账户。",
"freePlanNotice": "免费套餐限 1 个子账户。升级到 Plus 最多可拥有 5 个子账户。",
"count": "子账户({{count}}",
"add": "添加子账户",
"loading": "正在加载子账户…",
"emptyTitle": "暂无子账户",
"emptyDescription": "创建子账户,让团队成员可以登录并完成分配给他们的任务。",
"addFirst": "添加第一个子账户",
"username": "用户名:{{username}}",
"created": "创建于:{{date}}",
"changePassword": "修改密码",
"deleteAccount": "删除账户",
"createdSuccess": "子账户“{{name}}”创建成功!",
"createFailed": "创建子账户失败:{{error}}",
"createFailedGeneric": "创建子账户失败",
"passwordUpdated": "子账户密码更新成功",
"passwordUpdateFailed": "更新密码失败:{{error}}",
"passwordUpdateFailedGeneric": "更新密码失败",
"deleteConfirmTitle": "删除子账户",
"deleteConfirmMessage": "确定要删除子账户“{{name}}”吗?此操作无法撤销。",
"deleted": "子账户“{{name}}”已成功删除",
"deleteFailed": "删除子账户失败:{{error}}",
"deleteFailedGeneric": "删除子账户失败",
"howItWorksTitle": "受管账户如何运作",
"howItWorks1": "受管账户由主账户创建,适用于你希望能够删除其账户并重置其密码的用户。",
"howItWorks2": "子账户可以使用自己的用户名和密码登录。",
"howItWorks3": "受管账户可以完成任务,但管理权限有限",
"howItWorks4": "受管账户会自动加入你的圈子"
},
"notifications": {
"title": "通知设置",
"deviceSection": "设备通知",
"deviceSectionDescription": "管理你的设备通知",
"deviceLabel": "设备通知",
"deviceHelper": "任务到期时在设备上接收通知",
"mobileOnly": "此功能仅在移动设备上可用",
"testNotification": "测试通知",
"testNotificationBody": "你有一项任务即将到期",
"dueTitle": "到期通知",
"dueLabel": "任务到期时通知",
"preDueTitle": "到期前通知",
"preDueLabel": "任务到期前几小时通知",
"overdueTitle": "逾期通知",
"overdueLabel": "任务逾期时通知",
"pushLabel": "推送通知",
"pushHelper": "通过推送通知接收提醒、公告和任务分配",
"registeredDevices": "已注册设备({{count}}/5",
"registeredDevicesDescription": "已注册接收你账户推送通知的设备",
"currentDevice": "当前设备:{{platform}} {{model}}",
"currentDeviceNotRegistered": "此设备尚未注册推送通知",
"limitReached": "已达上限",
"registerDevice": "注册设备",
"unknownDevice": "未知设备",
"deviceCreatedAt": "创建于:{{date}}",
"noDevices": "尚无设备注册推送通知",
"customSection": "自定义通知",
"customSectionDescription": "通过 Telegram、Pushover 等其他平台接收通知",
"customLabel": "自定义通知",
"customHelper": "在其他平台上接收通知",
"targetNone": "无",
"targetTelegram": "Telegram",
"targetPushover": "Pushover",
"targetWebhooks": "Webhook",
"telegramBotHelpBefore": "你需要先向机器人发送一条消息Telegram 通知才能生效",
"telegramBotHelpAfter": "开始聊天",
"clickHere": "点击这里",
"chatId": "Chat ID",
"chatIdPlaceholder": "用户 ID / Chat ID",
"telegramChatIdHelpBefore": "如果你不知道自己的 Chat ID可以和 userinfobot 开始聊天,它会告诉你。",
"telegramChatIdHelpAfter": "与 userinfobot 开始聊天",
"userKey": "用户密钥",
"userKeyPlaceholder": "用户 ID",
"chatIdRequired": "Chat ID 为必填项",
"chatIdInvalid": "Chat ID 无效",
"userKeyRequired": "用户密钥为必填项",
"targetUpdated": "通知目标已更新",
"targetUpdateFailed": "更新通知目标时出错:{{error}}",
"deviceRegistered": "设备已成功注册推送通知。",
"deviceLimitTitle": "已达设备数量上限",
"deviceLimitMessage": "你已达到 5 台已注册设备的上限。请先移除一台设备,再注册此设备。",
"registrationFailedTitle": "注册失败",
"registrationFailedMessage": "无法自动注册设备,请重试。",
"permissionRequiredTitle": "需要授权",
"permissionRequiredMessage": "注册此设备需要推送通知权限。",
"registrationInitiatedTitle": "已开始注册",
"registrationInitiatedMessage": "推送通知注册已开始,设备将自动完成注册。",
"registerDeviceFailed": "注册设备失败,请重试。",
"permissionDeniedTitle": "通知权限被拒绝",
"permissionDeniedMessage": "你拒绝了通知权限。之后可以在设备设置中重新开启。",
"pushPermissionDeniedTitle": "推送通知权限被拒绝",
"pushPermissionDeniedMessage": "推送通知已关闭。如有需要,可在设备设置中重新开启。",
"unregisterFailed": "取消注册设备失败"
},
"mfa": {
"title": "多重身份验证",
"description": "使用多重身份验证MFA为账户增加一层安全保护。开启后登录时除密码外还需输入身份验证器应用中的验证码。",
"twoFactor": "两步验证",
"enabledSubtitle": "你的账户已启用两步验证保护",
"disabledSubtitle": "使用身份验证器应用保护你的账户",
"enable": "开启",
"disable": "关闭",
"enabledSuccess": "MFA 已成功开启!",
"disabledSuccess": "MFA 已成功关闭!",
"errors": {
"qrGenerationFailed": "无法生成二维码",
"invalidResponse": "服务器响应无效,缺少二维码或密钥。",
"notFound": "未找到 MFA 设置接口,此功能可能尚未开放。",
"unauthorized": "未授权,请重新登录。",
"serverError": "服务器错误,请稍后再试。",
"setupFailed": "设置 MFA 失败({{status}}),请重试。",
"networkError": "网络错误,请检查网络连接后重试。",
"invalidCode": "验证码无效,请重试。",
"confirmFailed": "确认 MFA 失败,请重试。",
"disableFailed": "关闭 MFA 失败,请重试。"
},
"setup": {
"title": "设置多重身份验证",
"addedAccount": "我已添加账户",
"back": "返回",
"verifyAndEnable": "验证并开启",
"savedBackupCodes": "我已保存备用代码",
"step1Label": "第 1 步:",
"step1": "用身份验证器应用Google Authenticator、Authy 等)扫描下方二维码",
"qrAlt": "MFA 二维码",
"qrFailed": "无法生成二维码,请重试或使用下方的手动输入密钥。",
"manualKey": "手动输入密钥:",
"step2Label": "第 2 步:",
"step2": "输入身份验证器应用中的 6 位验证码",
"codePlaceholder": "输入 6 位验证码",
"successTitle": "MFA 已成功开启!",
"backupCodesTitle": "请将这些备用代码保存在安全的地方",
"backupCodesDescription": "如果你丢失了身份验证器设备,可以使用这些代码访问账户。每个代码只能使用一次。"
},
"disableModal": {
"title": "关闭多重身份验证",
"warning": "关闭 MFA 会降低账户的安全性。确定要继续吗?",
"prompt": "请输入身份验证器应用中的验证码以确认:",
"confirm": "关闭 MFA"
},
"backupCodesModal": {
"title": "新的备用代码",
"warning": "你之前的备用代码已失效。请将这些新代码保存在安全的地方。每个代码只能使用一次。"
}
},
"apiTokens": {
"title": "API 令牌",
"accessToken": "访问令牌",
"description": "创建令牌,通过 API 更新可触发任务的物件",
"plusNotice": "基础套餐不支持 API 令牌。升级到 Plus 即可生成 API 令牌,用于对接外部系统并实现任务自动化。",
"showToken": "显示令牌",
"hideToken": "隐藏令牌",
"removeTitle": "移除令牌",
"removeMessage": "确定要移除 {{name}} 吗?",
"removedTitle": "已移除",
"removedMessage": "API 令牌已移除",
"tokenCopied": "令牌已复制到剪贴板",
"generateNew": "生成新令牌",
"nameModalTitle": "给新令牌起个名字,方便你日后识别。",
"generateToken": "生成令牌"
},
"storage": {
"title": "存储设置",
"serverTitle": "服务器存储用量",
"serverDescription": "这是你的账户在我们服务器上占用的存储空间(例如你上传的文件、图片和数据)。",
"usagePlaceholder": "已用 -- MB / 共 -- MB--",
"usage": "已用 {{used}} MB / 共 {{total}} MB{{percent}}%",
"basicPlanNotice": "基础套餐不支持服务器存储。升级到 Plus 即可查看服务器存储用量。",
"localTitleApp": "应用本地存储与缓存",
"localTitleBrowser": "浏览器本地存储与缓存",
"localDescription": "这是为了加快访问速度而保存在浏览器本地的数据。清除不会影响服务器上的数据,但可能会退出登录。",
"clearLocal": "清除全部本地存储与缓存",
"clearLocalTitle": "清除全部本地存储",
"clearLocalMessage": "确定要清除本地存储和缓存吗?这会移除此浏览器中的所有数据,并需要重新登录。",
"clearAll": "全部清除",
"appPreferences": "应用偏好设置",
"deviceOnly": "仅本设备",
"appPreferencesDescription": "这是应用保存在本设备上的偏好和设置。清除后应用相关设置会被重置,可能需要重新登录,但不会影响服务器上的数据。",
"clearPreferences": "清除应用偏好设置",
"clearPreferencesTitle": "清除应用偏好设置",
"clearPreferencesMessage": "确定要清除全部应用偏好设置吗?这会重置你的应用设置,并可能需要重新登录。"
},
"sidepanel": {
"title": "侧边栏自定义",
"heading": "侧边栏设置",
"description": "设置侧边栏显示哪些卡片以及它们的顺序。拖放可重新排序,也可切换每张卡片的显示状态。",
"resetToDefaults": "恢复默认",
"resetHelper": "这会将所有卡片的显示状态和顺序恢复为默认值。",
"cards": {
"welcome": {
"name": "切换用户",
"description": "让管理员/管理者以其他用户的视角查看任务"
},
"smartInsights": {
"name": "智能洞察",
"description": "基于你的任务提供快捷操作"
},
"assignees": {
"name": "按负责人查看任务",
"description": "按任务的负责人进行分组"
},
"calendar": {
"name": "日历视图",
"description": "以日历形式显示任务"
},
"activities": {
"name": "近期动态",
"description": "显示最近完成的任务和动态"
},
"weeklyGoals": {
"name": "每周目标",
"description": "显示每周进度和家庭完成情况统计"
}
}
},
"theme": {
"title": "主题偏好",
"description": "选择站点的外观。可以固定使用某个主题,也可以与系统同步,在日间和夜间主题之间自动切换。",
"themeMode": "主题模式",
"light": "浅色",
"dark": "深色",
"system": "跟随系统"
},
"localization": {
"title": "本地化",
"description": "自定义账户的语言、日期格式和区域偏好。",
"language": "语言",
"languageDescription": "选择你偏好的语言",
"rtlNotice": "该语言使用从右到左RTL的书写方向",
"dateFormat": "日期格式",
"dateFormatDescription": "选择应用中日期的显示方式",
"timeFormat": "时间格式",
"timeFormatDescription": "选择 12 小时制或 24 小时制",
"preview": "预览:{{value}}",
"12hour": "12 小时制AM/PM",
"24hour": "24 小时制",
"firstDayOfWeek": "每周第一天",
"firstDayOfWeekDescription": "选择一周从星期几开始",
"sunday": "星期日",
"monday": "星期一",
"saturday": "星期六",
"formats": {
"mdy": "MM/DD/YYYY美国",
"dmy": "DD/MM/YYYY欧洲",
"ymd": "YYYY-MM-DDISO",
"long": "长格式例如2024年1月1日",
"short": "短格式例如2024年1月1日"
}
},
"advanced": {
"title": "高级设置",
"description": "配置 Webhook、实时更新等高级功能进一步提升效率。",
"offlineTitle": "离线支持",
"offlineDescription": "在此设备/浏览器上离线时也能继续使用 Donetick。你的更改会保存在本地恢复联网后自动同步。",
"offlineToggle": "启用离线支持",
"offlineHelper": "关闭后,将移除此设备/浏览器上未同步的离线更改和已保存的离线数据。",
"offlineEnabled": "已为此设备/浏览器启用离线模式",
"offlineDisabled": "已关闭离线模式并清除本地数据",
"offlineDisabledPartial": "离线模式已关闭,但可能仍有部分本地数据保留",
"offlineDisableTitle": "关闭离线模式",
"offlineDisableMessage": "关闭离线模式会移除此设备/浏览器上未同步的离线更改和已保存的离线数据。确定要继续吗?",
"offlineDisableConfirm": "关闭并清除数据",
"webhookTitle": "Webhook 集成",
"webhookDescription": "Webhook 可以在你的圈子中发生事件时,向其他服务实时发送通知。配置 Webhook URL 即可接收实时更新。",
"webhookPlusNotice": "基础套餐不支持 Webhook 通知。升级到 Plus 即可通过 Webhook 接收实时更新。",
"webhookToggle": "启用 Webhook",
"webhookHelper": "为任务和物件的更新启用 Webhook 通知。",
"webhookURL": "Webhook URL",
"webhookUpdated": "Webhook URL 更新成功",
"webhookUpdateFailed": "更新 Webhook URL 失败",
"realtimeTitle": "实时更新",
"realtimeDescription": "设置当圈子中的任务和动态发生变化时,你如何接收实时更新。",
"realtime": {
"toggleLabel": "启用实时更新",
"title": "实时更新",
"subtitle": "任务更新时立即收到通知",
"statusLabel": "状态:",
"basicPlan": "基础套餐不支持实时更新。升级到 Plus 即可在任务更新时立即收到通知。",
"disabled": "实时更新已关闭。开启后,当你或其他圈子成员完成、跳过或修改任务时,即可看到实时变化。",
"connected": "实时更新运行正常。当你或其他圈子成员完成、跳过或修改任务时,你会看到实时变化。",
"connecting": "正在连接实时更新…",
"errored": "实时更新已开启但未正常工作:{{error}}",
"notConnected": "实时更新已开启,但当前未连接。",
"basicPlanNotice": "基础套餐不支持实时更新。升级到 Plus当你或其他圈子成员完成、跳过或修改任务时即可立即收到通知。"
}
}
}

View File

@@ -1,6 +1,8 @@
import { Sync, SyncDisabled } from '@mui/icons-material'
import { Box, Card, Chip, FormHelperText, Switch, Typography } from '@mui/joy'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useSSEContext } from '../hooks/useSSEContext'
import { useUserProfile } from '../queries/UserQueries'
import { isPlusAccount } from '../utils/Helpers'
@@ -12,6 +14,7 @@ const REALTIME_TYPES = {
}
const RealTimeSettings = () => {
const { t } = useTranslation('settings')
const { data: userProfile } = useUserProfile()
// SSE context
@@ -63,26 +66,26 @@ const RealTimeSettings = () => {
const getStatusDescription = () => {
if (!isPlusAccount(userProfile)) {
return 'Real-time updates are not available in the Basic plan. Upgrade to Plus to receive instant notifications when tasks are updated.'
return t('advanced.realtime.basicPlan')
}
if (realtimeType === REALTIME_TYPES.DISABLED) {
return 'Real-time updates are disabled. Enable them to see live changes when you or other circle members complete, skip, or modify tasks.'
return t('advanced.realtime.disabled')
}
if (context.isConnected) {
return "Real-time updates are working. You'll see live changes when you or other circle members complete, skip, or modify tasks."
return t('advanced.realtime.connected')
}
if (context.isConnecting) {
return 'Connecting to real-time updates...'
return t('advanced.realtime.connecting')
}
if (context.error) {
return `Real-time updates are enabled but not working: ${context.error}`
return t('advanced.realtime.errored', { error: context.error })
}
return 'Real-time updates are enabled but not currently connected.'
return t('advanced.realtime.notConnected')
}
const getConnectionStatusComponent = () => {
@@ -109,7 +112,7 @@ const RealTimeSettings = () => {
realtimeType !== REALTIME_TYPES.DISABLED ? 'success' : 'neutral'
}
disabled={!isPlusAccount(userProfile)}
inputProps={{ 'aria-label': 'Enable Real-time Updates' }}
inputProps={{ 'aria-label': t('advanced.realtime.toggleLabel') }}
/>
<Box sx={{ flex: 1 }}>
<Box
@@ -121,10 +124,10 @@ const RealTimeSettings = () => {
}}
>
<Typography level='title-md'>
Real-time Updates
{t('advanced.realtime.title')}
{!isPlusAccount(userProfile) && (
<Chip variant='soft' color='warning' sx={{ ml: 1 }}>
Plus Feature
{t('common.plusFeature')}
</Chip>
)}
</Typography>
@@ -137,7 +140,7 @@ const RealTimeSettings = () => {
)}
</Box>
<Typography level='body-sm' color='neutral'>
Get instant notifications when tasks are updated
{t('advanced.realtime.subtitle')}
</Typography>
</Box>
</Box>
@@ -167,7 +170,7 @@ const RealTimeSettings = () => {
isPlusAccount(userProfile) && (
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 1 }}>
<Typography level='body-xs' color='neutral'>
Status:
{t('advanced.realtime.statusLabel')}
</Typography>
{getConnectionStatusComponent()}
{context.error && (
@@ -180,9 +183,7 @@ const RealTimeSettings = () => {
{!isPlusAccount(userProfile) && (
<Typography level='body-sm' color='warning' sx={{ mt: 1 }}>
Real-time updates are not available in the Basic plan. Upgrade to Plus
to receive instant notifications when you or other circle members
complete, skip, or modify tasks.
{t('advanced.realtime.basicPlanNotice')}
</Typography>
)}
</Card>

View File

@@ -1,8 +1,11 @@
import useStickyState from '@/hooks/useStickyState'
import 'moment/locale/he'
import moment from 'moment'
import { createContext, useContext, useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import useStickyState from '@/hooks/useStickyState'
const LocalizationContext = createContext()
export const DATE_FORMATS = {
@@ -25,6 +28,7 @@ export const AVAILABLE_LANGUAGES = [
{ code: 'en', name: 'English', nativeName: 'English' },
{ code: 'es', name: 'Spanish', nativeName: 'Español' },
{ code: 'fr', name: 'French', nativeName: 'Français' },
{ code: 'he', name: 'Hebrew', nativeName: 'עברית' },
{ code: 'nl', name: 'Dutch', nativeName: 'Nederlands' },
{ code: 'ja', name: 'Japanese', nativeName: '日本語' },
{ code: 'pt', name: 'Portuguese (Brazil)', nativeName: 'Português (Brasil)' },
@@ -53,7 +57,10 @@ export const LocalizationProvider = ({ children }) => {
}, [language, i18n])
useEffect(() => {
const isRTL = RTL_LANGUAGES.includes(language)
const isRTL = RTL_LANGUAGES.some(
rtlLanguage =>
language === rtlLanguage || language.startsWith(`${rtlLanguage}-`),
)
document.documentElement.dir = isRTL ? 'rtl' : 'ltr'
document.documentElement.lang = language
}, [language])
@@ -91,7 +98,10 @@ export const LocalizationProvider = ({ children }) => {
})
}
const isRTL = RTL_LANGUAGES.includes(language)
const isRTL = RTL_LANGUAGES.some(
rtlLanguage =>
language === rtlLanguage || language.startsWith(`${rtlLanguage}-`),
)
const fmt = {
date: formatDate,

View File

@@ -10,8 +10,9 @@ import {
Typography,
} from '@mui/joy'
import moment from 'moment'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useLocalization } from '../../contexts/LocalizationContext'
import { useUserProfile } from '../../queries/UserQueries'
import { useNotification } from '../../service/NotificationProvider'
@@ -26,6 +27,7 @@ import TextModal from '../Modals/Inputs/TextModal'
import SettingsLayout from './SettingsLayout'
const APITokenSettings = () => {
const { t } = useTranslation('settings')
const { data: userProfile } = useUserProfile()
const { showNotification } = useNotification()
const { fmt } = useLocalization()
@@ -38,8 +40,8 @@ const APITokenSettings = () => {
message,
title,
onConfirm,
confirmText = 'Confirm',
cancelText = 'Cancel',
confirmText = t('common.confirm'),
cancelText = t('common.cancel'),
color = 'primary',
) => {
setConfirmModalConfig({
@@ -80,23 +82,18 @@ const APITokenSettings = () => {
}
return (
<SettingsLayout title='API Tokens'>
<SettingsLayout title={t('apiTokens.title')}>
<div className='grid gap-4 py-4' id='apitokens'>
<Typography level='h3'>Access Token</Typography>
<Typography level='h3'>{t('apiTokens.accessToken')}</Typography>
<Divider />
<Typography level='body-sm'>
Create token to use with the API to update things that trigger task or
chores
</Typography>
<Typography level='body-sm'>{t('apiTokens.description')}</Typography>
{!isPlusAccount(userProfile) && (
<>
<Chip variant='soft' color='warning'>
Plus Feature
{t('common.plusFeature')}
</Chip>
<Typography level='body-sm' color='warning' sx={{ mt: 1 }}>
API tokens are not available in the Basic plan. Upgrade to Plus to
generate API tokens for integrating with external systems and
automating your tasks.
{t('apiTokens.plusNotice')}
</Typography>
</>
)}
@@ -125,7 +122,9 @@ const APITokenSettings = () => {
setShowTokenId(token.id)
}}
>
{showTokenId === token?.id ? 'Hide' : 'Show'} Token
{showTokenId === token?.id
? t('apiTokens.hideToken')
: t('apiTokens.showToken')}
</Button>
<Button
@@ -133,15 +132,15 @@ const APITokenSettings = () => {
color='danger'
onClick={() => {
showConfirmation(
`Are you sure you want to remove ${token.name}?`,
'Remove Token',
t('apiTokens.removeMessage', { name: token.name }),
t('apiTokens.removeTitle'),
() => {
DeleteLongLiveToken(token.id).then(resp => {
if (resp.ok) {
showNotification({
type: 'success',
title: 'Removed',
message: 'API token has been removed',
title: t('apiTokens.removedTitle'),
message: t('apiTokens.removedMessage'),
})
const newTokens = tokens.filter(
t => t.id !== token.id,
@@ -150,13 +149,13 @@ const APITokenSettings = () => {
}
})
},
'Remove',
'Cancel',
t('common.remove'),
t('common.cancel'),
'danger',
)
}}
>
Remove
{t('common.remove')}
</Button>
</Box>
</Box>
@@ -174,7 +173,7 @@ const APITokenSettings = () => {
navigator.clipboard.writeText(token.token)
showNotification({
type: 'success',
message: 'Token copied to clipboard',
message: t('apiTokens.tokenCopied'),
})
setShowTokenId(null)
}}
@@ -200,15 +199,15 @@ const APITokenSettings = () => {
setIsGetTokenNameModalOpen(true)
}}
>
Generate New Token
{t('apiTokens.generateNew')}
</Button>
<TextModal
isOpen={isGetTokenNameModalOpen}
title='Give a name for your new token, something to remember it by.'
title={t('apiTokens.nameModalTitle')}
onClose={() => {
setIsGetTokenNameModalOpen(false)
}}
okText={'Generate Token'}
okText={t('apiTokens.generateToken')}
onSave={handleSaveToken}
/>

View File

@@ -4,6 +4,8 @@ import { Purchases } from '@revenuecat/purchases-capacitor'
import { useQueryClient } from '@tanstack/react-query'
import moment from 'moment'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import SubscriptionModal from '../../components/SubscriptionModal'
import { useLocalization } from '../../contexts/LocalizationContext'
import { useUserProfile } from '../../queries/UserQueries'
@@ -15,6 +17,7 @@ import UserDeletionModal from '../Modals/Inputs/UserDeletionModal'
import SettingsLayout from './SettingsLayout'
const AccountSettings = () => {
const { t } = useTranslation('settings')
const { data: userProfile } = useUserProfile()
const queryClient = useQueryClient()
const { showNotification } = useNotification()
@@ -42,43 +45,49 @@ const AccountSettings = () => {
const getSubscriptionDetails = () => {
if (userProfile?.subscription === 'active') {
return `You are currently subscribed to the Plus plan. Your subscription will renew on ${fmt.date(userProfile?.expiration)}.`
return t('accountSettings.activeDescription', {
date: fmt.date(userProfile?.expiration),
})
} else if (userProfile?.subscription === 'cancelled') {
return `You have cancelled your subscription. Your account will be downgraded to the Free plan on ${fmt.date(userProfile?.expiration)}.`
return t('accountSettings.cancelledDescription', {
date: fmt.date(userProfile?.expiration),
})
} else {
return `You are currently on the Free plan. Upgrade to the Plus plan to unlock more features.`
return t('accountSettings.freeDescription')
}
}
const getSubscriptionStatus = () => {
if (userProfile?.subscription === 'active') {
return `Plus`
return t('accountSettings.plus')
} else if (userProfile?.subscription === 'cancelled') {
if (moment().isBefore(userProfile?.expiration)) {
return `Plus(until ${fmt.date(userProfile?.expiration)})`
return t('accountSettings.plusUntil', {
date: fmt.date(userProfile?.expiration),
})
}
return `Free`
return t('accountSettings.free')
} else {
return `Free`
return t('accountSettings.free')
}
}
if (!userProfile) {
return (
<SettingsLayout title='Account Settings'>
<div>Loading...</div>
<SettingsLayout title={t('accountSettings.title')}>
<div>{t('common.loading')}</div>
</SettingsLayout>
)
}
return (
<SettingsLayout title='Account Settings'>
<SettingsLayout title={t('accountSettings.title')}>
<div className='grid gap-4'>
<Typography level='body-md'>
Change your account settings, type or update your password
{t('accountSettings.description')}
</Typography>
<Typography level='title-md' mb={-1}>
Account Type : {getSubscriptionStatus()}
{t('accountSettings.accountType', { type: getSubscriptionStatus() })}
</Typography>
<Typography level='body-sm'>{getSubscriptionDetails()}</Typography>
<Box>
@@ -95,9 +104,8 @@ const AccountSettings = () => {
onClick={async () => {
if (Capacitor.isNativePlatform()) {
try {
const { RevenueCatUI } = await import(
'@revenuecat/purchases-capacitor-ui'
)
const { RevenueCatUI } =
await import('@revenuecat/purchases-capacitor-ui')
const offering = await Purchases.getOfferings()
await RevenueCatUI.presentPaywall({
@@ -110,8 +118,7 @@ const AccountSettings = () => {
queryClient.refetchQueries(['userProfile'])
showNotification({
type: 'success',
message:
'Purchase successful! Please restart the app to access Plus features.',
message: t('accountSettings.purchase.success'),
})
}
} catch (error) {
@@ -122,57 +129,53 @@ const AccountSettings = () => {
} else if (error.code === '2') {
showNotification({
type: 'error',
message:
'Store connection issue. Please check your network and try again.',
message: t('accountSettings.purchase.storeConnection'),
})
} else if (error.code === '3') {
showNotification({
type: 'error',
message:
'Purchases are not allowed on this device. Please check your device restrictions.',
message: t('accountSettings.purchase.notAllowed'),
})
} else if (error.code === '4') {
showNotification({
type: 'error',
message:
'This subscription is not available. Please try again later.',
message: t('accountSettings.purchase.unavailable'),
})
} else if (error.code === '5') {
showNotification({
type: 'error',
message:
'This purchase has already been processed. If you believe this is an error, please contact support.',
message: t('accountSettings.purchase.alreadyProcessed'),
})
} else if (error.code === '6') {
showNotification({
type: 'error',
message:
'Purchase receipt missing. Please try purchasing again.',
message: t('accountSettings.purchase.receiptMissing'),
})
} else if (error.code === '7') {
showNotification({
type: 'error',
message:
'Network error. Please check your connection and try again.',
message: t('accountSettings.purchase.networkError'),
})
} else if (error.code === '8') {
showNotification({
type: 'error',
message:
'Invalid purchase receipt. Please contact support if this persists.',
message: t('accountSettings.purchase.invalidReceipt'),
})
} else if (error.code === '9') {
showNotification({
type: 'warning',
message:
'Payment is pending approval. You will receive access once approved.',
message: t('accountSettings.purchase.pending'),
})
} else {
console.error('Unexpected purchase error:', error)
console.error('Error occurred in purchase flow')
showNotification({
type: 'error',
message: `Purchase failed: ${error.message || 'Unknown error'}. Please try again or contact support.`,
message: t('accountSettings.purchase.failed', {
error:
error.message ||
t('accountSettings.purchase.unknownError'),
}),
})
}
}
@@ -181,7 +184,7 @@ const AccountSettings = () => {
}
}}
>
Upgrade
{t('accountSettings.upgrade')}
</Button>
{userProfile?.subscription === 'active' && (
@@ -197,14 +200,14 @@ const AccountSettings = () => {
setNativeCancelModal(true)
}}
>
Cancel
{t('accountSettings.cancel')}
</Button>
)}
</Box>
{import.meta.env.VITE_IS_SELF_HOSTED === 'true' && (
<Box>
<Typography level='title-md' mb={1}>
Password :
{t('accountSettings.password')}
</Typography>
<Typography mb={1} level='body-sm'></Typography>
<Button
@@ -213,7 +216,7 @@ const AccountSettings = () => {
setChangePasswordModal(true)
}}
>
Change Password
{t('accountSettings.changePassword')}
</Button>
{changePasswordModal ? (
<PassowrdChangeModal
@@ -224,12 +227,12 @@ const AccountSettings = () => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Password changed successfully',
message: t('accountSettings.passwordChanged'),
})
} else {
showNotification({
type: 'error',
message: 'Password change failed',
message: t('accountSettings.passwordChangeFailed'),
})
}
})
@@ -243,18 +246,17 @@ const AccountSettings = () => {
<Box>
<Typography level='title-md' mb={1} color='danger'>
Danger Zone
{t('accountSettings.dangerZone')}
</Typography>
<Typography level='body-sm' mb={2} color='neutral'>
Once you delete your account, there is no going back. Please be
certain.
{t('accountSettings.dangerZoneDescription')}
</Typography>
<Button
variant='outlined'
color='danger'
onClick={() => setUserDeletionModal(true)}
>
Delete Account
{t('accountSettings.deleteAccount')}
</Button>
</Box>
</div>
@@ -271,7 +273,7 @@ const AccountSettings = () => {
if (success) {
showNotification({
type: 'success',
message: 'Account deleted successfully',
message: t('accountSettings.accountDeleted'),
})
}
}}
@@ -287,13 +289,13 @@ const AccountSettings = () => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Subscription cancelled',
message: t('accountSettings.subscriptionCancelled'),
})
window.location.reload()
} else {
showNotification({
type: 'error',
message: 'Failed to cancel subscription',
message: t('accountSettings.subscriptionCancelFailed'),
})
}
})

View File

@@ -10,6 +10,8 @@ import {
} from '@mui/joy'
import { useQueryClient } from '@tanstack/react-query'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import RealTimeSettings from '../../components/RealTimeSettings'
import { useUserProfile } from '../../queries/UserQueries'
import { useNotification } from '../../service/NotificationProvider'
@@ -27,6 +29,7 @@ import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
import SettingsLayout from './SettingsLayout'
const AdvancedSettings = () => {
const { t } = useTranslation('settings')
const { data: userProfile } = useUserProfile()
const queryClient = useQueryClient()
const { showNotification } = useNotification()
@@ -73,7 +76,7 @@ const AdvancedSettings = () => {
queryClient.invalidateQueries()
showNotification({
type: 'success',
message: 'Offline mode turned off and local data was cleared',
message: t('advanced.offlineDisabled'),
})
} catch {
setOfflineFeatureEnabled(false)
@@ -82,8 +85,7 @@ const AdvancedSettings = () => {
queryClient.invalidateQueries()
showNotification({
type: 'warning',
message:
'Offline mode was turned off, but some local data may still be stored',
message: t('advanced.offlineDisabledPartial'),
})
} finally {
setOfflineLoading(false)
@@ -93,11 +95,10 @@ const AdvancedSettings = () => {
const showDisableOfflineConfirmation = () => {
setConfirmModalConfig({
isOpen: true,
title: 'Turn Off Offline Mode',
message:
'Turning off offline mode will remove unsynced offline changes and saved offline data on this device/browser. Do you want to continue?',
confirmText: 'Turn Off & Clear Data',
cancelText: 'Cancel',
title: t('advanced.offlineDisableTitle'),
message: t('advanced.offlineDisableMessage'),
confirmText: t('advanced.offlineDisableConfirm'),
cancelText: t('common.cancel'),
color: 'danger',
onClose: isConfirmed => {
setConfirmModalConfig({})
@@ -117,7 +118,7 @@ const AdvancedSettings = () => {
queryClient.invalidateQueries()
showNotification({
type: 'success',
message: 'Offline mode turned on for this device/browser',
message: t('advanced.offlineEnabled'),
})
return
}
@@ -134,15 +135,12 @@ const AdvancedSettings = () => {
// }
return (
<SettingsLayout title='Advanced Settings'>
<SettingsLayout title={t('advanced.title')}>
<div className='grid gap-4'>
<Typography level='body-md'>
Configure advanced features like webhooks and real-time updates for
enhanced productivity.
</Typography>
<Typography level='body-md'>{t('advanced.description')}</Typography>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mt: 2 }}>
<Typography level='title-lg'>Offline Support</Typography>
<Typography level='title-lg'>{t('advanced.offlineTitle')}</Typography>
<Chip
variant='outlined'
size='sm'
@@ -154,43 +152,36 @@ const AdvancedSettings = () => {
borderColor: 'warning.main',
}}
>
Early Access
{t('common.earlyAccess')}
</Chip>
</Box>
<Typography level='body-md' mt={-1}>
Keep using Donetick when you're offline on this device/browser. Your
changes are saved locally and synced when you're back online.
{t('advanced.offlineDescription')}
</Typography>
<FormControl sx={{ mt: 1 }}>
<Checkbox
checked={offlineEnabled}
onChange={handleOfflineToggle}
variant='soft'
label='Enable Offline Support'
label={t('advanced.offlineToggle')}
disabled={offlineLoading}
overlay
/>
<FormHelperText>
Turning this off removes unsynced offline changes and saved offline
data from this device/browser.
</FormHelperText>
<FormHelperText>{t('advanced.offlineHelper')}</FormHelperText>
</FormControl>
{/* Webhook Settings - Only show for admins */}
{isAdmin && (
<>
<Typography level='title-lg' mt={2}>
Webhook Integration
{t('advanced.webhookTitle')}
</Typography>
<Typography level='body-md' mt={-1}>
Webhooks allow you to send real-time notifications to other
services when events happen in your Circle. Configure a webhook
URL to receive real-time updates.
{t('advanced.webhookDescription')}
</Typography>
{!isPlusAccount(userProfile) && (
<Typography level='body-sm' color='warning' sx={{ mt: 1 }}>
Webhook notifications are not available in the Basic plan.
Upgrade to Plus to receive real-time updates via webhooks.
{t('advanced.webhookPlusNotice')}
</Typography>
)}
<FormControl sx={{ mt: 1 }}>
@@ -204,7 +195,7 @@ const AdvancedSettings = () => {
}
}}
variant='soft'
label='Enable Webhook'
label={t('advanced.webhookToggle')}
disabled={!isPlusAccount(userProfile)}
overlay
/>
@@ -213,10 +204,10 @@ const AdvancedSettings = () => {
opacity: !isPlusAccount(userProfile) ? 0.5 : 1,
}}
>
Enable webhook notifications for tasks and things updates.{' '}
{t('advanced.webhookHelper')}{' '}
{userProfile && !isPlusAccount(userProfile) && (
<Chip variant='soft' color='warning'>
Plus Feature
{t('common.plusFeature')}
</Chip>
)}
</FormHelperText>
@@ -224,7 +215,9 @@ const AdvancedSettings = () => {
{webhookURL !== null && (
<Box>
<Typography level='title-sm'>Webhook URL</Typography>
<Typography level='title-sm'>
{t('advanced.webhookURL')}
</Typography>
<Input
value={webhookURL ? webhookURL : ''}
onChange={e => setWebhookURL(e.target.value)}
@@ -247,19 +240,19 @@ const AdvancedSettings = () => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Webhook URL updated successfully',
message: t('advanced.webhookUpdated'),
})
} else {
showNotification({
type: 'error',
message: 'Failed to update webhook URL',
message: t('advanced.webhookUpdateFailed'),
})
}
})
}}
disabled={!isPlusAccount(userProfile)}
>
Save
{t('common.save')}
</Button>
</Box>
)}
@@ -268,11 +261,10 @@ const AdvancedSettings = () => {
{/* Real-time Settings */}
<Typography level='title-lg' mt={2}>
Real-time Updates
{t('advanced.realtimeTitle')}
</Typography>
<Typography level='body-md' mt={-1}>
Configure how you receive live updates when tasks and activities
change in your circle.
{t('advanced.realtimeDescription')}
</Typography>
<RealTimeSettings />

View File

@@ -13,6 +13,9 @@ import {
} from '@mui/joy'
import { useQueryClient } from '@tanstack/react-query'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useLocalization } from '../../contexts/LocalizationContext'
import useConfirmationModal from '../../hooks/useConfirmationModal'
import { useChildUsers, useUserProfile } from '../../queries/UserQueries'
import { useNotification } from '../../service/NotificationProvider'
@@ -28,6 +31,8 @@ import PasswordChangeModal from '../Modals/Inputs/PasswordChangeModal'
import SettingsLayout from './SettingsLayout'
const ChildUserSettings = () => {
const { t } = useTranslation('settings')
const { fmt } = useLocalization()
const { data: userProfile } = useUserProfile()
const { data: childUsers, isLoading, refetch } = useChildUsers()
const { showNotification } = useNotification()
@@ -54,18 +59,20 @@ const ChildUserSettings = () => {
const result = await response.json()
showNotification({
type: 'success',
message: `Child account "${result.res.displayName}" created successfully!`,
message: t('subaccounts.createdSuccess', {
name: result.res.displayName,
}),
})
refetch()
queryClient.invalidateQueries(['childUsers'])
} else {
const error = await response.json()
throw new Error(error.error || 'Failed to create child user')
throw new Error(error.error || t('subaccounts.createFailedGeneric'))
}
} catch (error) {
showNotification({
type: 'error',
message: `Failed to create child account: ${error.message}`,
message: t('subaccounts.createFailed', { error: error.message }),
})
throw error
}
@@ -80,24 +87,28 @@ const ChildUserSettings = () => {
if (response.ok) {
showNotification({
type: 'success',
message: 'Child password updated successfully',
message: t('subaccounts.passwordUpdated'),
})
} else {
const error = await response.json()
throw new Error(error.error || 'Failed to update password')
throw new Error(
error.error || t('subaccounts.passwordUpdateFailedGeneric'),
)
}
} catch (error) {
showNotification({
type: 'error',
message: `Failed to update password: ${error.message}`,
message: t('subaccounts.passwordUpdateFailed', {
error: error.message,
}),
})
}
}
const handleDeleteChild = async (childId, childName) => {
showConfirmation(
`Are you sure you want to delete the child account "${childName}"? This action cannot be undone.`,
'Delete Sub Account',
t('subaccounts.deleteConfirmMessage', { name: childName }),
t('subaccounts.deleteConfirmTitle'),
async () => {
setDeletingChildId(childId)
try {
@@ -106,50 +117,46 @@ const ChildUserSettings = () => {
if (response.ok) {
showNotification({
type: 'success',
message: `Sub account "${childName}" deleted successfully`,
message: t('subaccounts.deleted', { name: childName }),
})
refetch()
queryClient.invalidateQueries(['childUsers'])
} else {
const error = await response.json()
throw new Error(error.error || 'Failed to delete Sub user')
throw new Error(error.error || t('subaccounts.deleteFailedGeneric'))
}
} catch (error) {
showNotification({
type: 'error',
message: `Failed to delete Sub account: ${error.message}`,
message: t('subaccounts.deleteFailed', { error: error.message }),
})
} finally {
setDeletingChildId(null)
}
},
'Delete',
'Cancel',
t('common.delete'),
t('common.cancel'),
'danger',
)
}
if (!isParentUser) {
return (
<SettingsLayout title='Sub Account Management'>
<SettingsLayout title={t('subaccounts.notParentTitle')}>
<Typography level='body-md' color='warning'>
Only primary users can manage sub accounts.
{t('subaccounts.notParentMessage')}
</Typography>
</SettingsLayout>
)
}
return (
<SettingsLayout title='Managed Accounts'>
<SettingsLayout title={t('subaccounts.title')}>
<div className='grid gap-4'>
<Typography level='body-md'>
Manage sub accounts. Sub account users can log in and complete
assigned tasks.
</Typography>
<Typography level='body-md'>{t('subaccounts.description')}</Typography>
{!isPlusAccount(userProfile) && (
<Typography level='body-sm' color='warning' sx={{ mt: 1 }}>
Sub account limited to 1 on Free plan. Upgrade to Plus to have up to
5 sub accounts.
{t('subaccounts.freePlanNotice')}
</Typography>
)}
<Box
@@ -160,33 +167,32 @@ const ChildUserSettings = () => {
}}
>
<Typography level='title-lg'>
Sub Accounts ({childUsers?.length || 0})
{t('subaccounts.count', { count: childUsers?.length || 0 })}
</Typography>
<Button
startDecorator={<PersonAddIcon />}
onClick={() => setCreateModalOpen(true)}
>
Add Sub Account
{t('subaccounts.add')}
</Button>
</Box>
{isLoading ? (
<Typography>Loading sub accounts...</Typography>
<Typography>{t('subaccounts.loading')}</Typography>
) : childUsers?.length === 0 ? (
<Card variant='soft' sx={{ textAlign: 'center', py: 4 }}>
<CardContent>
<Typography level='title-md' mb={1}>
No Sub Accounts
{t('subaccounts.emptyTitle')}
</Typography>
<Typography level='body-sm' mb={3}>
Create sub accounts so team members can log in and complete
their assigned tasks.
{t('subaccounts.emptyDescription')}
</Typography>
<Button
startDecorator={<PersonAddIcon />}
onClick={() => setCreateModalOpen(true)}
>
Add Your First Sub Account
{t('subaccounts.addFirst')}
</Button>
</CardContent>
</Card>
@@ -206,11 +212,14 @@ const ChildUserSettings = () => {
{child.displayName || child.username}
</Typography>
<Typography level='body-sm' color='neutral'>
Username: {child.username}
{t('subaccounts.username', {
username: child.username,
})}
</Typography>
<Typography level='body-xs' color='neutral'>
Created:{' '}
{new Date(child.createdAt).toLocaleDateString()}
{t('subaccounts.created', {
date: fmt.date(child.createdAt),
})}
</Typography>
</Box>
@@ -222,7 +231,7 @@ const ChildUserSettings = () => {
setSelectedChildId(child.id)
setPasswordModalOpen(true)
}}
title='Change Password'
title={t('subaccounts.changePassword')}
>
<EditIcon />
</IconButton>
@@ -237,7 +246,7 @@ const ChildUserSettings = () => {
)
}
loading={deletingChildId === child.id}
title='Delete Account'
title={t('subaccounts.deleteAccount')}
>
<DeleteIcon />
</IconButton>
@@ -253,21 +262,19 @@ const ChildUserSettings = () => {
<Box>
<Typography level='title-md' mb={2}>
How Managed Accounts Work
{t('subaccounts.howItWorksTitle')}
</Typography>
<Typography level='body-sm' mb={1}>
Managed accounts created by the primary user, these specific for
user you want to have ability to delete and reset password.
{t('subaccounts.howItWorks1')}
</Typography>
<Typography level='body-sm' mb={1}>
Sub accounts can log in with their own username and password.
{t('subaccounts.howItWorks2')}
</Typography>
<Typography level='body-sm' mb={1}>
Managed accounts can complete tasks but have limited
administrative permissions
{t('subaccounts.howItWorks3')}
</Typography>
<Typography level='body-sm'>
Managed accounts automatically added to your circle
{t('subaccounts.howItWorks4')}
</Typography>
</Box>
</div>

View File

@@ -15,6 +15,7 @@ import {
import { useQueryClient } from '@tanstack/react-query'
import moment from 'moment'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useNavigate } from 'react-router-dom'
import { useLocalization } from '../../contexts/LocalizationContext'
@@ -36,6 +37,7 @@ import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
import SettingsLayout from './SettingsLayout'
const CircleSettings = () => {
const { t } = useTranslation('settings')
const { data: userProfile } = useUserProfile()
const queryClient = useQueryClient()
const { showNotification } = useNotification()
@@ -55,8 +57,8 @@ const CircleSettings = () => {
message,
title,
onConfirm,
confirmText = 'Confirm',
cancelText = 'Cancel',
confirmText = t('common.confirm'),
cancelText = t('common.cancel'),
color = 'primary',
) => {
setConfirmModalConfig({
@@ -75,6 +77,29 @@ const CircleSettings = () => {
})
}
const roleOptions = [
{
value: 'member',
label: t('circleSettings.roles.member'),
description: t('circleSettings.roles.memberDescription'),
},
{
value: 'manager',
label: t('circleSettings.roles.manager'),
description: t('circleSettings.roles.managerDescription'),
},
{
value: 'admin',
label: t('circleSettings.roles.admin'),
description: t('circleSettings.roles.adminDescription'),
},
]
// Roles come back from the API as lowercase identifiers, so fall back to the
// raw value for anything the translations don't cover yet.
const roleLabel = role =>
roleOptions.find(option => option.value === role)?.label ?? role
const refreshMemberRequests = async () => {
setIsRefreshing(true)
try {
@@ -85,7 +110,7 @@ const CircleSettings = () => {
} catch (error) {
showNotification({
type: 'error',
message: 'Failed to refresh member requests',
message: t('circleSettings.refreshFailed'),
})
} finally {
setIsRefreshing(false)
@@ -129,21 +154,21 @@ const CircleSettings = () => {
: ''
const shareInvite = async () => {
const circleName = userCircles[0]?.name || 'my Circle'
const circleName = userCircles[0]?.name || t('circleSettings.myCircle')
try {
await Share.share({
title: `Join ${circleName} on Donetick`,
text: `I'd like to invite you to join ${circleName} on Donetick.`,
title: t('circleSettings.shareTitle', { name: circleName }),
text: t('circleSettings.shareText', { name: circleName }),
url: inviteLink,
dialogTitle: 'Share Circle invite',
dialogTitle: t('circleSettings.shareDialogTitle'),
})
} catch (error) {
if (error?.message?.toLowerCase().includes('cancel')) return
await navigator.clipboard.writeText(inviteLink)
showNotification({
type: 'success',
message: 'Invite link copied to clipboard',
message: t('circleSettings.linkCopied'),
})
}
}
@@ -153,19 +178,16 @@ const CircleSettings = () => {
}
return (
<SettingsLayout title='Circle Settings'>
<SettingsLayout title={t('circleSettings.title')}>
<div className='grid gap-4'>
<Typography level='body-md'>
Your account is automatically connected to a Circle when you create or
join one. Easily invite friends by sharing the unique Circle code or
link below. You'll receive a notification below when someone requests
to join your Circle.
{t('circleSettings.description')}
</Typography>
<Box>
<Typography level='title-sm' sx={{ mb: 1 }}>
{userCircles[0]?.userRole === 'member'
? `You part of ${userCircles[0]?.name} `
: `You circle code is:`}
{userCircles[0]?.userRole === 'member'
? t('circleSettings.memberOf', { name: userCircles[0]?.name })
: t('circleSettings.yourCircleCode')}
</Typography>
<Input
value={inviteCode}
@@ -191,11 +213,11 @@ const CircleSettings = () => {
navigator.clipboard.writeText(userCircles[0]?.invite_code)
showNotification({
type: 'success',
message: 'Code copied to clipboard',
message: t('circleSettings.codeCopied'),
})
}}
>
Copy Code
{t('circleSettings.copyCode')}
</Button>
<Button
variant='soft'
@@ -203,7 +225,7 @@ const CircleSettings = () => {
startDecorator={<IosShare />}
onClick={shareInvite}
>
Share Invite
{t('circleSettings.shareInvite')}
</Button>
{userCircles.length > 0 &&
userCircles[0]?.userRole === 'member' && (
@@ -212,36 +234,38 @@ const CircleSettings = () => {
variant='outlined'
onClick={() => {
showConfirmation(
'Are you sure you want to leave your circle?',
'Leave Circle',
t('circleSettings.leaveConfirmMessage'),
t('circleSettings.leaveConfirmTitle'),
() => {
LeaveCircle(userCircles[0]?.id).then(resp => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Left circle successfully',
message: t('circleSettings.leftCircle'),
})
} else {
showNotification({
type: 'error',
message: 'Failed to leave circle',
message: t('circleSettings.leaveFailed'),
})
}
})
},
'Leave',
'Cancel',
t('circleSettings.leaveConfirmButton'),
t('common.cancel'),
'danger',
)
}}
>
Leave Circle
{t('circleSettings.leave')}
</Button>
)}
</Box>
</Box>
<Typography level='title-md'>Circle Members</Typography>
<Typography level='title-md'>
{t('circleSettings.circleMembers')}
</Typography>
{circleMembers.map(member => (
<Card key={member.id} className='p-4'>
<Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
@@ -249,19 +273,27 @@ const CircleSettings = () => {
<Typography level='body-md'>
{member.displayName.charAt(0).toUpperCase() +
member.displayName.slice(1)}
{member.userId === userProfile.id ? '(You)' : ''}{' '}
{member.userId === userProfile.id
? t('circleSettings.you')
: ''}{' '}
<Chip>
{' '}
{member.isActive ? member.role : 'Pending Approval'}
{member.isActive
? roleLabel(member.role)
: t('circleSettings.pendingApproval')}
</Chip>
</Typography>
{member.isActive ? (
<Typography level='body-sm'>
Joined on {fmt.date(member.createdAt)}
{t('circleSettings.joinedOn', {
date: fmt.date(member.createdAt),
})}
</Typography>
) : (
<Typography level='body-sm' color='danger'>
Request to join {fmt.date(member.updatedAt)}
{t('circleSettings.requestedToJoin', {
date: fmt.date(member.updatedAt),
})}
</Typography>
)}
</Box>
@@ -273,10 +305,7 @@ const CircleSettings = () => {
sx={{ mr: 1 }}
value={member.role}
renderValue={() => (
<Typography>
{member.role.charAt(0).toUpperCase() +
member.role.slice(1)}
</Typography>
<Typography>{roleLabel(member.role)}</Typography>
)}
onChange={(e, value) => {
UpdateMemberRole(member.userId, value).then(resp => {
@@ -291,27 +320,13 @@ const CircleSettings = () => {
} else {
showNotification({
type: 'error',
message: 'Failed to update role',
message: t('circleSettings.roleUpdateFailed'),
})
}
})
}}
>
{[
{
value: 'member',
description: 'Just a regular member of the circle',
},
{
value: 'manager',
description:
'Can impersonate users and perform actions on their behalf',
},
{
value: 'admin',
description: 'Full access to the circle',
},
].map((option, index) => (
{roleOptions.map((option, index) => (
<Option value={option.value} key={index}>
<Box
sx={{
@@ -327,8 +342,7 @@ const CircleSettings = () => {
level='title-sm'
sx={{ mb: 0, mt: 0, lineHeight: 1.1 }}
>
{option.value.charAt(0).toUpperCase() +
option.value.slice(1)}
{option.label}
</Typography>
<Typography
level='body-sm'
@@ -350,8 +364,10 @@ const CircleSettings = () => {
size='sm'
onClick={() => {
showConfirmation(
`Are you sure you want to remove ${member.displayName} from your circle?`,
'Remove Member',
t('circleSettings.removeMemberMessage', {
name: member.displayName,
}),
t('circleSettings.removeMemberTitle'),
() => {
DeleteCircleMember(
member.circleId,
@@ -360,7 +376,7 @@ const CircleSettings = () => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Removed member successfully',
message: t('circleSettings.memberRemoved'),
})
queryClient.invalidateQueries(['circleMembers'])
queryClient.invalidateQueries(['userCircle'])
@@ -374,8 +390,8 @@ const CircleSettings = () => {
}
})
},
'Remove',
'Cancel',
t('common.remove'),
t('common.cancel'),
'danger',
)
}}
@@ -396,11 +412,15 @@ const CircleSettings = () => {
mb: 1,
}}
>
<Typography level='title-md'>Circle Member Requests</Typography>
<Typography level='title-md'>
{t('circleSettings.circleMemberRequests')}
</Typography>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
{lastRefresh && (
<Typography level='body-sm' color='neutral'>
Last updated: {fmt.dateTime(lastRefresh)}
{t('circleSettings.lastUpdated', {
time: fmt.dateTime(lastRefresh),
})}
</Typography>
)}
<Button
@@ -412,7 +432,9 @@ const CircleSettings = () => {
isRefreshing ? <CircularProgress size='sm' /> : <Refresh />
}
>
{isRefreshing ? 'Refreshing...' : 'Refresh'}
{isRefreshing
? t('circleSettings.refreshing')
: t('common.refresh')}
</Button>
</Box>
</Box>
@@ -420,21 +442,24 @@ const CircleSettings = () => {
{circleMemberRequests.map(request => (
<Card key={request.id} className='p-4'>
<Typography level='body-md'>
{request.displayName} wants to join your circle.
{t('circleSettings.wantsToJoin', { name: request.displayName })}
</Typography>
<Button
variant='soft'
color='success'
onClick={() => {
showConfirmation(
`Are you sure you want to accept ${request.displayName} (username: ${request.username}) to join your circle?`,
'Accept Member Request',
t('circleSettings.acceptRequestMessage', {
name: request.displayName,
username: request.username,
}),
t('circleSettings.acceptRequestTitle'),
() => {
AcceptCircleMemberRequest(request.id).then(resp => {
if (resp.ok) {
showNotification({
type: 'success',
message: 'Accepted request successfully',
message: t('circleSettings.requestAccepted'),
})
queryClient.invalidateQueries(['circleMembers'])
queryClient.invalidateQueries(['circleMemberRequests'])
@@ -449,26 +474,25 @@ const CircleSettings = () => {
}
})
},
'Accept',
'Cancel',
t('circleSettings.accept'),
t('common.cancel'),
)
}}
>
Accept
{t('circleSettings.accept')}
</Button>
</Card>
))}
<Divider> or </Divider>
<Divider> {t('circleSettings.or')} </Divider>
<Typography level='body-md'>
if want to join someone else's Circle? Ask them for their unique
Circle code or join link. Enter the code below to join their Circle.
{t('circleSettings.joinOtherDescription')}
</Typography>
<Typography level='title-sm' mb={-1}>
Enter Circle code:
{t('circleSettings.enterCircleCode')}
<Input
placeholder='Enter code'
placeholder={t('circleSettings.enterCodePlaceholder')}
value={circleInviteCode}
onChange={e => setCircleInviteCode(e.target.value)}
size='lg'
@@ -484,20 +508,19 @@ const CircleSettings = () => {
if (resp.ok) {
showNotification({
type: 'success',
message:
'Joined circle successfully, wait for the circle owner to accept your request.',
message: t('circleSettings.joinedPending'),
})
setTimeout(() => navigate('/'), 3000)
} else {
if (resp.status === 409) {
showNotification({
type: 'error',
message: 'You are already a member of this circle',
message: t('circleSettings.alreadyMember'),
})
} else {
showNotification({
type: 'error',
message: 'Failed to join circle',
message: t('circleSettings.joinFailed'),
})
}
setTimeout(() => navigate('/'), 3000)
@@ -505,7 +528,7 @@ const CircleSettings = () => {
})
}}
>
Join Circle
{t('circleSettings.joinCircle')}
</Button>
</Typography>
</div>

View File

@@ -44,7 +44,7 @@ const LocalizationSettings = () => {
]
return (
<SettingsLayout title='Localization'>
<SettingsLayout title={t('localization.title')}>
<div className='grid gap-4 py-4'>
<Typography level='body-md'>{t('localization.description')}</Typography>
@@ -71,12 +71,7 @@ const LocalizationSettings = () => {
))}
</Select>
{isRTL && (
<FormHelperText>
{t(
'localization.rtlNotice',
'This language uses right-to-left (RTL) text direction',
)}
</FormHelperText>
<FormHelperText>{t('localization.rtlNotice')}</FormHelperText>
)}
</FormControl>
@@ -110,7 +105,9 @@ const LocalizationSettings = () => {
))}
</Select>
<FormHelperText>
Preview: {sampleDate.format(dateFormat)}
{t('localization.preview', {
value: sampleDate.format(dateFormat),
})}
</FormHelperText>
</FormControl>
@@ -157,7 +154,9 @@ const LocalizationSettings = () => {
</Option>
</Select>
<FormHelperText>
Preview: {sampleDate.format(timeFormat)}
{t('localization.preview', {
value: sampleDate.format(timeFormat),
})}
</FormHelperText>
</FormControl>

View File

@@ -2,6 +2,8 @@ import { CheckCircle, Security, Smartphone } from '@mui/icons-material'
import { Alert, Box, Button, Card, Input, Stack, Typography } from '@mui/joy'
import QRCode from 'qrcode'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import AppModal from '../../components/common/AppModal'
import ModalActions from '../../components/common/ModalActions'
import {
@@ -14,6 +16,7 @@ import LoadingComponent from '../components/Loading'
import SettingsLayout from './SettingsLayout'
const MFASettings = () => {
const { t } = useTranslation('settings')
const [mfaEnabled, setMfaEnabled] = useState(false)
const [loading, setLoading] = useState(true)
const [setupModalOpen, setSetupModalOpen] = useState(false)
@@ -56,7 +59,7 @@ const MFASettings = () => {
setQrCodeDataUrl(qrCodeDataUrl)
} catch (error) {
console.error('Error generating QR code:', error)
setError('Failed to generate QR code')
setError(t('mfa.errors.qrGenerationFailed'))
}
}
@@ -79,7 +82,7 @@ const MFASettings = () => {
hasQrCodeUrl: !!data.qrCodeUrl,
hasSecret: !!data.secret,
})
setError('Invalid response from server. Missing QR code or secret.')
setError(t('mfa.errors.invalidResponse'))
return
}
if (data.backupCodes) {
@@ -98,24 +101,22 @@ const MFASettings = () => {
} else {
// Handle different error status codes
if (response.status === 404) {
setError(
'MFA setup endpoint not found. This feature may not be available yet.',
)
setError(t('mfa.errors.notFound'))
} else if (response.status === 401) {
setError('Unauthorized. Please login again.')
setError(t('mfa.errors.unauthorized'))
} else if (response.status === 500) {
setError('Server error. Please try again later.')
setError(t('mfa.errors.serverError'))
} else {
const errorData = await response.json().catch(() => ({}))
setError(
errorData.message ||
`Failed to setup MFA (${response.status}). Please try again.`,
t('mfa.errors.setupFailed', { status: response.status }),
)
}
}
} catch (error) {
console.error('Error setting up MFA:', error)
setError('Network error. Please check your connection and try again.')
setError(t('mfa.errors.networkError'))
}
}
@@ -130,12 +131,12 @@ const MFASettings = () => {
if (response.ok) {
setSetupStep(3)
setMfaEnabled(true)
setSuccess('MFA has been successfully enabled!')
setSuccess(t('mfa.enabledSuccess'))
} else {
setError('Invalid verification code. Please try again.')
setError(t('mfa.errors.invalidCode'))
}
} catch (error) {
setError('Failed to confirm MFA. Please try again.')
setError(t('mfa.errors.confirmFailed'))
console.error('Error confirming MFA:', error)
}
}
@@ -148,12 +149,12 @@ const MFASettings = () => {
setMfaEnabled(false)
setDisableModalOpen(false)
setDisableCode('')
setSuccess('MFA has been disabled successfully!')
setSuccess(t('mfa.disabledSuccess'))
} else {
setError('Invalid verification code. Please try again.')
setError(t('mfa.errors.invalidCode'))
}
} catch (error) {
setError('Failed to disable MFA. Please try again.')
setError(t('mfa.errors.disableFailed'))
console.error('Error disabling MFA:', error)
}
}
@@ -178,14 +179,9 @@ const MFASettings = () => {
}
return (
<SettingsLayout title='Multi-Factor Authentication'>
<SettingsLayout title={t('mfa.title')}>
<div className='grid gap-4 py-4' id='mfa'>
<Typography level='body-md'>
Add an extra layer of security to your account with multi-factor
authentication (MFA). When enabled, you&apos;ll need to provide a
verification code from your authenticator app in addition to your
password when signing in.
</Typography>
<Typography level='body-md'>{t('mfa.description')}</Typography>
{success && (
<Alert color='success' onClose={() => setSuccess('')}>
@@ -204,13 +200,11 @@ const MFASettings = () => {
<Box className='flex items-center gap-3'>
<Security color='primary' />
<Box>
<Typography level='title-md'>
Two-Factor Authentication
</Typography>
<Typography level='title-md'>{t('mfa.twoFactor')}</Typography>
<Typography level='body-sm' sx={{ color: 'text.secondary' }}>
{mfaEnabled
? 'Your account is protected with 2FA'
: 'Secure your account with an authenticator app'}
? t('mfa.enabledSubtitle')
: t('mfa.disabledSubtitle')}
</Typography>
</Box>
</Box>
@@ -221,7 +215,7 @@ const MFASettings = () => {
variant='outlined'
onClick={() => setDisableModalOpen(true)}
>
Disable
{t('mfa.disable')}
</Button>
) : (
<Button
@@ -229,7 +223,7 @@ const MFASettings = () => {
variant='solid'
onClick={handleSetupMFA}
>
Enable
{t('mfa.enable')}
</Button>
)}
</Box>
@@ -265,23 +259,29 @@ const MFASettings = () => {
<AppModal
open={setupModalOpen}
onClose={closeSetupModal}
title='Set up Multi-Factor Authentication'
title={t('mfa.setup.title')}
size='md'
footer={
setupStep === 1 ? (
<ModalActions
secondary={{ label: 'Cancel', onClick: closeSetupModal }}
secondary={{
label: t('common.cancel'),
onClick: closeSetupModal,
}}
primary={{
label: "I've added the account",
label: t('mfa.setup.addedAccount'),
onClick: () => setSetupStep(2),
startDecorator: <Smartphone />,
}}
/>
) : setupStep === 2 ? (
<ModalActions
secondary={{ label: 'Back', onClick: () => setSetupStep(1) }}
secondary={{
label: t('mfa.setup.back'),
onClick: () => setSetupStep(1),
}}
primary={{
label: 'Verify & Enable',
label: t('mfa.setup.verifyAndEnable'),
onClick: handleConfirmMFA,
disabled: verificationCode.length !== 6,
}}
@@ -289,7 +289,7 @@ const MFASettings = () => {
) : (
<ModalActions
primary={{
label: "I've saved my backup codes",
label: t('mfa.setup.savedBackupCodes'),
onClick: closeSetupModal,
}}
/>
@@ -299,8 +299,8 @@ const MFASettings = () => {
{setupStep === 1 && setupData && (
<Stack spacing={3}>
<Typography level='body-md'>
<strong>Step 1:</strong> Scan the QR code below with your
authenticator app (Google Authenticator, Authy, etc.)
<strong>{t('mfa.setup.step1Label')}</strong>{' '}
{t('mfa.setup.step1')}
</Typography>
<Box className='flex justify-center rounded bg-white p-4'>
@@ -310,14 +310,11 @@ const MFASettings = () => {
qrCodeDataUrl ||
`data:image/png;base64,${setupData.qrCode}`
}
alt='MFA QR Code'
alt={t('mfa.setup.qrAlt')}
style={{ maxWidth: '200px', maxHeight: '200px' }}
/>
) : (
<Alert color='danger'>
QR code could not be generated. Please try again or use the
manual entry key below.
</Alert>
<Alert color='danger'>{t('mfa.setup.qrFailed')}</Alert>
)}
</Box>
@@ -331,7 +328,7 @@ const MFASettings = () => {
}}
>
<Typography level='title-sm'>
<strong>Manual entry key:</strong>
<strong>{t('mfa.setup.manualKey')}</strong>
</Typography>
<Typography
level='body-sm'
@@ -346,12 +343,12 @@ const MFASettings = () => {
{setupStep === 2 && (
<Stack spacing={3}>
<Typography level='body-md'>
<strong>Step 2:</strong> Enter the 6-digit verification code
from your authenticator app
<strong>{t('mfa.setup.step2Label')}</strong>{' '}
{t('mfa.setup.step2')}
</Typography>
<Input
placeholder='Enter 6-digit code'
placeholder={t('mfa.setup.codePlaceholder')}
value={verificationCode}
size='lg'
// send on enter:
@@ -383,17 +380,16 @@ const MFASettings = () => {
<Box className='text-center'>
<CheckCircle color='success' sx={{ fontSize: 48, mb: 2 }} />
<Typography level='h4' color='success'>
MFA Successfully Enabled!
{t('mfa.setup.successTitle')}
</Typography>
</Box>
<Alert color='warning'>
<Typography level='title-sm' sx={{ mb: 1 }}>
Save these backup codes in a safe place
{t('mfa.setup.backupCodesTitle')}
</Typography>
<Typography level='body-sm'>
You can use these codes to access your account if you lose
your authenticator device. Each code can only be used once.
{t('mfa.setup.backupCodesDescription')}
</Typography>
</Alert>
@@ -418,15 +414,18 @@ const MFASettings = () => {
<AppModal
open={disableModalOpen}
onClose={closeDisableModal}
title='Disable Multi-Factor Authentication'
title={t('mfa.disableModal.title')}
size='sm'
role='alertdialog'
closeOnBackdrop={false}
footer={
<ModalActions
secondary={{ label: 'Cancel', onClick: closeDisableModal }}
secondary={{
label: t('common.cancel'),
onClick: closeDisableModal,
}}
primary={{
label: 'Disable MFA',
label: t('mfa.disableModal.confirm'),
color: 'danger',
onClick: handleDisableMFA,
disabled: disableCode.length !== 6,
@@ -437,17 +436,16 @@ const MFASettings = () => {
<Stack spacing={3}>
<Alert color='warning'>
<Typography level='body-sm'>
Disabling MFA will make your account less secure. Are you sure
you want to continue?
{t('mfa.disableModal.warning')}
</Typography>
</Alert>
<Typography level='body-md'>
Enter a verification code from your authenticator app to confirm:
{t('mfa.disableModal.prompt')}
</Typography>
<Input
placeholder='Enter 6-digit code'
placeholder={t('mfa.setup.codePlaceholder')}
value={disableCode}
size='lg'
onKeyDown={e => {
@@ -477,12 +475,12 @@ const MFASettings = () => {
<AppModal
open={backupCodesModalOpen}
onClose={() => setBackupCodesModalOpen(false)}
title='New Backup Codes'
title={t('mfa.backupCodesModal.title')}
size='sm'
footer={
<ModalActions
primary={{
label: "I've saved my backup codes",
label: t('mfa.setup.savedBackupCodes'),
onClick: () => setBackupCodesModalOpen(false),
}}
/>
@@ -491,8 +489,7 @@ const MFASettings = () => {
<Stack spacing={3}>
<Alert color='warning'>
<Typography level='body-sm'>
Your previous backup codes are now invalid. Save these new codes
in a safe place. Each code can only be used once.
{t('mfa.backupCodesModal.warning')}
</Typography>
</Alert>

View File

@@ -2,6 +2,7 @@ import { Capacitor } from '@capacitor/core'
import { Device } from '@capacitor/device'
import { LocalNotifications } from '@capacitor/local-notifications'
import { Preferences } from '@capacitor/preferences'
import { PushNotifications } from '@capacitor/push-notifications'
import { Android, Apple } from '@mui/icons-material'
import {
Box,
@@ -18,9 +19,10 @@ import {
Typography,
} from '@mui/joy'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { PushNotifications } from '@capacitor/push-notifications'
import { registerPushNotifications } from '../../CapacitorListener'
import { useLocalization } from '../../contexts/LocalizationContext'
import { useDeviceTokens, useUserProfile } from '../../queries/UserQueries'
import { useNotification } from '../../service/NotificationProvider'
import { isOfficialDonetickInstanceSync } from '../../utils/FeatureToggle'
@@ -31,6 +33,8 @@ import {
import SettingsLayout from './SettingsLayout'
const NotificationSetting = () => {
const { t } = useTranslation('settings')
const { fmt } = useLocalization()
const { showWarning } = useNotification()
const { data: userProfile, refetch: refetchUserProfile } = useUserProfile()
const { data: deviceTokens, refetch: refetchDevices } = useDeviceTokens()
@@ -149,26 +153,23 @@ const NotificationSetting = () => {
const handleDeviceRegistered = () => {
refetchDevices()
showWarning({
title: 'Success',
message: 'Device registered successfully for push notifications.',
title: t('common.success'),
message: t('notifications.deviceRegistered'),
})
}
const handleDeviceRegistrationFailed = event => {
const { status, error } = event.detail || {}
const { error, status } = event.detail || {}
if (status === 409) {
showWarning({
title: 'Device Limit Reached',
message:
'You have reached the maximum limit of 5 registered devices. Please remove a device before registering this one.',
title: t('notifications.deviceLimitTitle'),
message: t('notifications.deviceLimitMessage'),
})
} else {
showWarning({
title: 'Registration Failed',
message:
error ||
'Failed to register device automatically. Please try again.',
title: t('notifications.registrationFailedTitle'),
message: error || t('notifications.registrationFailedMessage'),
})
}
}
@@ -195,16 +196,16 @@ const NotificationSetting = () => {
switch (notificationTarget) {
case '1':
if (chatID === '') {
setError('Chat ID is required')
setError(t('notifications.chatIdRequired'))
return false
} else if (isNaN(chatID) || chatID === '0') {
setError('Invalid Chat ID')
setError(t('notifications.chatIdInvalid'))
return false
}
break
case '2':
if (chatID === '') {
setError('User key is required')
setError(t('notifications.userKeyRequired'))
return false
}
break
@@ -222,12 +223,12 @@ const NotificationSetting = () => {
type: Number(notificationTarget),
}).then(resp => {
if (resp.status != 200) {
alert(`Error while updating notification target: ${resp.statusText}`)
alert(t('notifications.targetUpdateFailed', { error: resp.statusText }))
return
}
refetchUserProfile()
alert('Notification target updated')
alert(t('notifications.targetUpdated'))
})
}
@@ -238,9 +239,8 @@ const NotificationSetting = () => {
const currentDeviceCount = deviceTokens ? deviceTokens.length : 0
if (currentDeviceCount >= 5) {
showWarning({
title: 'Device Limit Reached',
message:
'You have reached the maximum limit of 5 registered devices. Please remove a device before registering this one.',
title: t('notifications.deviceLimitTitle'),
message: t('notifications.deviceLimitMessage'),
})
return
}
@@ -251,9 +251,8 @@ const NotificationSetting = () => {
if (permStatus.receive !== 'granted') {
showWarning({
title: 'Permission Required',
message:
'Push notification permission is required to register this device.',
title: t('notifications.permissionRequiredTitle'),
message: t('notifications.permissionRequiredMessage'),
})
return
}
@@ -267,25 +266,25 @@ const NotificationSetting = () => {
setPushNotification(true)
showWarning({
title: 'Registration Initiated',
message:
'Push notification registration has been initiated. The device will be registered automatically.',
title: t('notifications.registrationInitiatedTitle'),
message: t('notifications.registrationInitiatedMessage'),
})
} catch (error) {
console.error('Error registering device:', error)
showWarning({
title: 'Error',
message: 'Failed to register device. Please try again.',
title: t('common.error'),
message: t('notifications.registerDeviceFailed'),
})
}
}
return (
<SettingsLayout title='Notification Settings'>
<SettingsLayout title={t('notifications.title')}>
<div className='grid gap-4 py-4' id='notifications'>
<Typography level='h3'>Device Notification</Typography>
<Typography level='h3'>{t('notifications.deviceSection')}</Typography>
<Divider />
<Typography level='body-md'>Manage your Device Notification</Typography>
<Typography level='body-md'>
{t('notifications.deviceSectionDescription')}
</Typography>
<FormControl orientation='horizontal'>
<Switch
@@ -300,9 +299,8 @@ const NotificationSetting = () => {
setNotificationPreferences({ granted: true })
} else if (resp.display === 'denied') {
showWarning({
title: 'Notification Permission Denied',
message:
'You have denied notification permissions. You can enable them later in your device settings.',
title: t('notifications.permissionDeniedTitle'),
message: t('notifications.permissionDeniedMessage'),
})
setDeviceNotification(false)
setNotificationPreferences({ granted: false })
@@ -324,11 +322,11 @@ const NotificationSetting = () => {
sx={{ mr: 2 }}
/>
<div>
<FormLabel>Device Notification</FormLabel>
<FormLabel>{t('notifications.deviceLabel')}</FormLabel>
<FormHelperText sx={{ mt: 0 }}>
{Capacitor.isNativePlatform()
? 'Receive notification on your device when a task is due'
: 'This feature is only available on mobile devices'}{' '}
? t('notifications.deviceHelper')
: t('notifications.mobileOnly')}{' '}
</FormHelperText>
</div>
</FormControl>
@@ -345,8 +343,8 @@ const NotificationSetting = () => {
LocalNotifications.schedule({
notifications: [
{
title: 'Test Notification',
body: 'You have a task due soon',
title: t('notifications.testNotification'),
body: t('notifications.testNotificationBody'),
id: 1,
schedule: { at: new Date(Date.now() + 2000) },
sound: null,
@@ -358,32 +356,32 @@ const NotificationSetting = () => {
})
}}
>
Test Notification{' '}
{t('notifications.testNotification')}{' '}
</Button>
{deviceNotification && (
<Card>
{[
{
title: 'Due Date Notification',
title: t('notifications.dueTitle'),
checked: dueNotification,
set: setDueNotification,
label: 'Notification when the task is due',
label: t('notifications.dueLabel'),
property: 'dueNotification',
disabled: false,
},
{
title: 'Pre-Due Date Notification',
title: t('notifications.preDueTitle'),
checked: preDueNotification,
set: setPreDueNotification,
label: 'Notification a few hours before the task is due',
label: t('notifications.preDueLabel'),
property: 'preDueNotification',
disabled: false,
},
{
title: 'Overdue Notification',
title: t('notifications.overdueTitle'),
checked: naggingNotification,
set: setNaggingNotification,
label: 'Notification when the task is overdue',
label: t('notifications.overdueLabel'),
property: 'naggingNotification',
disabled: false,
},
@@ -409,7 +407,7 @@ const NotificationSetting = () => {
}}
color={item.checked ? 'success' : ''}
variant='solid'
endDecorator={item.checked ? 'On' : 'Off'}
endDecorator={item.checked ? t('common.on') : t('common.off')}
slotProps={{ endDecorator: { sx: { minWidth: 24 } } }}
/>
</FormControl>
@@ -422,11 +420,11 @@ const NotificationSetting = () => {
sx={{ width: 400, justifyContent: 'space-between' }}
>
<div>
<FormLabel>Push Notifications</FormLabel>
<FormLabel>{t('notifications.pushLabel')}</FormLabel>
<FormHelperText sx={{ mt: 0 }}>
{Capacitor.isNativePlatform()
? 'Receive Nudges, Announcements, and Chore Assignments via Push Notifications'
: 'This feature is only available on mobile devices'}{' '}
? t('notifications.pushHelper')
: t('notifications.mobileOnly')}{' '}
</FormHelperText>
</div>
<Switch
@@ -446,9 +444,8 @@ const NotificationSetting = () => {
}
if (resp.receive !== 'granted') {
showWarning({
title: 'Push Notification Permission Denied',
message:
'Push notifications have been disabled. You can enable them in your device settings if needed.',
title: t('notifications.pushPermissionDeniedTitle'),
message: t('notifications.pushPermissionDeniedMessage'),
})
setPushNotification(false)
setPushNotificationPreferences({ granted: false })
@@ -463,7 +460,7 @@ const NotificationSetting = () => {
}}
color={pushNotification ? 'success' : 'neutral'}
variant={pushNotification ? 'solid' : 'outlined'}
endDecorator={pushNotification ? 'On' : 'Off'}
endDecorator={pushNotification ? t('common.on') : t('common.off')}
slotProps={{
endDecorator: {
sx: {
@@ -478,11 +475,13 @@ const NotificationSetting = () => {
{isOfficialInstance && (
<>
<Typography level='h4' sx={{ mt: 2 }}>
Registered Devices ({deviceTokens ? deviceTokens.length : 0}/5)
{t('notifications.registeredDevices', {
count: deviceTokens ? deviceTokens.length : 0,
})}
</Typography>
<Divider />
<Typography level='body-md' sx={{ mb: 2 }}>
Devices registered to receive push notifications for your account
{t('notifications.registeredDevicesDescription')}
</Typography>
{/* Show register current device option if not registered */}
@@ -508,12 +507,16 @@ const NotificationSetting = () => {
)}
<Box>
<Typography level='body-md' sx={{ fontWeight: 'bold' }}>
Current Device:{' '}
{currentDevice.platform === 'ios' ? 'iOS' : 'Android'}{' '}
{currentDevice.model}
{t('notifications.currentDevice', {
platform:
currentDevice.platform === 'ios'
? 'iOS'
: 'Android',
model: currentDevice.model,
})}
</Typography>
<Typography level='body-sm' color='neutral'>
This device is not registered for push notifications
{t('notifications.currentDeviceNotRegistered')}
</Typography>
</Box>
</Box>
@@ -525,8 +528,8 @@ const NotificationSetting = () => {
onClick={handleRegisterCurrentDevice}
>
{deviceTokens && deviceTokens.length >= 5
? 'Limit Reached'
: 'Register Device'}
? t('notifications.limitReached')
: t('notifications.registerDevice')}
</Button>
</Box>
</Card>
@@ -557,13 +560,15 @@ const NotificationSetting = () => {
sx={{ fontWeight: 'bold' }}
>
{device.platform === 'ios' ? 'iOS' : 'Android'}{' '}
{device.deviceModel || 'Unknown Device'}
{device.deviceModel ||
t('notifications.unknownDevice')}
</Typography>
{device.createdAt && (
<Typography level='body-sm' color='neutral'>
Created At:{' '}
{new Date(device.createdAt).toLocaleDateString()}
{t('notifications.deviceCreatedAt', {
date: fmt.date(device.createdAt),
})}
</Typography>
)}
</Box>
@@ -582,19 +587,19 @@ const NotificationSetting = () => {
refetchDevices()
} else {
showWarning({
title: 'Error',
message: 'Failed to unregister device',
title: t('common.error'),
message: t('notifications.unregisterFailed'),
})
}
} catch (error) {
showWarning({
title: 'Error',
message: 'Failed to unregister device',
title: t('common.error'),
message: t('notifications.unregisterFailed'),
})
}
}}
>
Remove
{t('common.remove')}
</Button>
</Box>
</Card>
@@ -602,16 +607,16 @@ const NotificationSetting = () => {
</Box>
) : (
<Typography level='body-md' color='neutral'>
No devices registered for push notifications
{t('notifications.noDevices')}
</Typography>
)}
</>
)}
<Typography level='h3'>Custom Notification</Typography>
<Typography level='h3'>{t('notifications.customSection')}</Typography>
<Divider />
<Typography level='body-md'>
Notification through other platform like Telegram or Pushover
{t('notifications.customSectionDescription')}
</Typography>
<FormControl orientation='horizontal'>
@@ -649,9 +654,9 @@ const NotificationSetting = () => {
sx={{ mr: 2 }}
/>
<div>
<FormLabel>Custom Notification</FormLabel>
<FormLabel>{t('notifications.customLabel')}</FormLabel>
<FormHelperText sx={{ mt: 0 }}>
Receive notification on other platform
{t('notifications.customHelper')}
</FormHelperText>
</div>
</FormControl>
@@ -668,16 +673,15 @@ const NotificationSetting = () => {
sx={{ maxWidth: '200px' }}
onChange={(e, selected) => setNotificationTarget(selected)}
>
<Option value='0'>None</Option>
<Option value='1'>Telegram</Option>
<Option value='2'>Pushover</Option>
<Option value='3'>Webhooks</Option>
<Option value='0'>{t('notifications.targetNone')}</Option>
<Option value='1'>{t('notifications.targetTelegram')}</Option>
<Option value='2'>{t('notifications.targetPushover')}</Option>
<Option value='3'>{t('notifications.targetWebhooks')}</Option>
</Select>
{notificationTarget === '1' && (
<>
<Typography level='body-xs'>
You need to initiate a message to the bot in order for the
Telegram notification to work{' '}
{t('notifications.telegramBotHelpBefore')}{' '}
<a
style={{
textDecoration: 'underline',
@@ -685,24 +689,25 @@ const NotificationSetting = () => {
}}
href='https://t.me/DonetickBot'
>
Click here
{t('notifications.clickHere')}
</a>{' '}
to start a chat
{t('notifications.telegramBotHelpAfter')}
</Typography>
<Typography level='body-sm'>Chat ID</Typography>
<Typography level='body-sm'>
{t('notifications.chatId')}
</Typography>
<Input
value={chatID}
onChange={e => setChatID(e.target.value)}
placeholder='User ID / Chat ID'
placeholder={t('notifications.chatIdPlaceholder')}
sx={{
width: '200px',
}}
/>
<Typography mt={0} level='body-xs'>
If you don't know your Chat ID, start chat with userinfobot
and it will send you your Chat ID.{' '}
{t('notifications.telegramChatIdHelpBefore')}{' '}
<a
style={{
textDecoration: 'underline',
@@ -710,19 +715,21 @@ const NotificationSetting = () => {
}}
href='https://t.me/userinfobot'
>
Click here
{t('notifications.clickHere')}
</a>{' '}
to start chat with userinfobot{' '}
{t('notifications.telegramChatIdHelpAfter')}{' '}
</Typography>
</>
)}
{notificationTarget === '2' && (
<>
<Typography level='body-sm'>User key</Typography>
<Typography level='body-sm'>
{t('notifications.userKey')}
</Typography>
<Input
value={chatID}
onChange={e => setChatID(e.target.value)}
placeholder='User ID'
placeholder={t('notifications.userKeyPlaceholder')}
sx={{
width: '200px',
}}
@@ -742,7 +749,7 @@ const NotificationSetting = () => {
}}
onClick={handleSave}
>
Save
{t('common.save')}
</Button>
</Box>
)}

View File

@@ -180,7 +180,7 @@ const ProfileSettings = () => {
setShowCropper(false)
setSelectedFile(null)
}}
title={t('profile.editPhoto', { defaultValue: 'Edit profile photo' })}
title={t('profile.editPhoto')}
size='sm'
closeOnBackdrop={!isUploading}
closeOnEscape={!isUploading}

View File

@@ -373,7 +373,7 @@ const SettingsOverview = () => {
borderColor: 'warning.main',
}}
>
Early Access
{t('common.earlyAccess')}
</Chip>
)}
</Box>

View File

@@ -26,6 +26,8 @@ import {
Typography,
} from '@mui/joy'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import {
DEFAULT_SIDEPANEL_CONFIG,
getSidepanelConfig,
@@ -34,8 +36,15 @@ import {
import SettingsLayout from './SettingsLayout'
const SidepanelSettings = () => {
const { t } = useTranslation('settings')
const [config, setConfig] = useState(getSidepanelConfig())
// Card names/descriptions live in the config so they can be persisted, but the
// stored copy is English. Prefer the translated string and fall back to it.
const cardName = item => t(`sidepanel.cards.${item.id}.name`, item.name)
const cardDescription = item =>
t(`sidepanel.cards.${item.id}.description`, item.description)
const getIcon = iconName => {
switch (iconName) {
case 'SupervisorAccount':
@@ -93,15 +102,14 @@ const SidepanelSettings = () => {
}
return (
<SettingsLayout title='Sidepanel Customization'>
<SettingsLayout title={t('sidepanel.title')}>
<div className='grid gap-4'>
<Box>
<Typography level='h4' sx={{ mb: 2 }}>
Sidepanel Settings
{t('sidepanel.heading')}
</Typography>
<Typography level='body-md' sx={{ mb: 3 }}>
Customize which cards appear in the sidepanel and their order. Drag
and drop to reorder, or toggle visibility for each card.
{t('sidepanel.description')}
</Typography>
<DragDropContext onDragEnd={handleDragEnd}>
@@ -176,7 +184,7 @@ const SidepanelSettings = () => {
level='title-sm'
sx={{ fontWeight: 600 }}
>
{item.name}
{cardName(item)}
</Typography>
<Typography
level='body-xs'
@@ -184,7 +192,7 @@ const SidepanelSettings = () => {
color: 'var(--joy-palette-text-tertiary)',
}}
>
- {item.description}
- {cardDescription(item)}
</Typography>
</Box>
</ListItemContent>
@@ -226,10 +234,10 @@ const SidepanelSettings = () => {
onClick={resetToDefaults}
size='sm'
>
Reset to Defaults
{t('sidepanel.resetToDefaults')}
</Button>
<FormHelperText sx={{ mt: 1 }}>
This will restore all cards to their default visibility and order.
{t('sidepanel.resetHelper')}
</FormHelperText>
</Box>
</Box>

View File

@@ -1,13 +1,9 @@
import { Capacitor } from '@capacitor/core'
import {
Button,
Card,
Chip,
LinearProgress,
Typography,
} from '@mui/joy'
import { Button, Card, Chip, LinearProgress, Typography } from '@mui/joy'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useNavigate } from 'react-router-dom'
import { useUserProfile } from '../../queries/UserQueries'
import { GetStorageUsage } from '../../utils/Fetcher'
import { isPlusAccount } from '../../utils/Helpers'
@@ -15,6 +11,7 @@ import ConfirmationModal from '../Modals/Inputs/ConfirmationModal'
import SettingsLayout from './SettingsLayout'
const StorageSettings = () => {
const { t } = useTranslation('settings')
const Navigate = useNavigate()
const { data: userProfile } = useUserProfile()
const [usage, setUsage] = useState({ used: 0, total: 0 })
@@ -25,8 +22,8 @@ const StorageSettings = () => {
message,
title,
onConfirm,
confirmText = 'Confirm',
cancelText = 'Cancel',
confirmText = t('common.confirm'),
cancelText = t('common.cancel'),
color = 'primary',
) => {
setConfirmModalConfig({
@@ -62,20 +59,19 @@ const StorageSettings = () => {
const totalMB = (usage.total / (1024 * 1024)).toFixed(2)
return (
<SettingsLayout title='Storage Settings'>
<SettingsLayout title={t('storage.title')}>
<div className='grid gap-4 py-4' id='storage'>
<Card className='p-4' sx={{ maxWidth: 500, mb: 2 }}>
<Typography level='title-md' sx={{ mb: 1 }}>
Server Storage Usage
{t('storage.serverTitle')}
{!isPlusAccount(userProfile) && (
<Chip variant='soft' color='warning' sx={{ ml: 1 }}>
Plus Feature
{t('common.plusFeature')}
</Chip>
)}
</Typography>
<Typography level='body-sm' sx={{ mb: 1 }}>
This is the storage used by your account on our servers (e.g. files,
images, and data you have uploaded).
{t('storage.serverDescription')}
</Typography>
{!isPlusAccount(userProfile) ? (
<>
@@ -91,23 +87,26 @@ const StorageSettings = () => {
}}
/>
<Typography level='body-xs' sx={{ opacity: 0.6, mb: 1 }}>
-- MB used / -- MB total (--)
{t('storage.usagePlaceholder')}
</Typography>
<Typography level='body-sm' color='warning'>
Server storage is not available in the Basic plan. Upgrade to
Plus to track your server storage usage.
{t('storage.basicPlanNotice')}
</Typography>
</>
) : loading ? (
<>
<LinearProgress sx={{ mb: 1 }} />
<Typography level='body-xs'>Loading...</Typography>
<Typography level='body-xs'>{t('common.loading')}</Typography>
</>
) : (
<>
<LinearProgress determinate value={percent} sx={{ mb: 1 }} />
<Typography level='body-xs'>
{usedMB} MB used / {totalMB} MB total ({percent}%)
{t('storage.usage', {
used: usedMB,
total: totalMB,
percent,
})}
</Typography>
</>
)}
@@ -115,72 +114,69 @@ const StorageSettings = () => {
<Card className='p-4' sx={{ maxWidth: 500, mb: 2 }}>
<Typography level='title-md' sx={{ mb: 1 }}>
{Capacitor.isNativePlatform() ? 'App' : 'Browser'} Local Storage &
Cache
{Capacitor.isNativePlatform()
? t('storage.localTitleApp')
: t('storage.localTitleBrowser')}
</Typography>
<Typography level='body-sm' sx={{ mb: 1 }}>
This is data stored locally in your browser for faster access.
Clearing this will not affect your server data, but may log you out.
{t('storage.localDescription')}
</Typography>
<Button
variant='soft'
color='danger'
onClick={() => {
showConfirmation(
'Are you sure you want to clear your local storage and cache? This will remove all your data from this browser and require login.',
'Clear All Local Storage',
t('storage.clearLocalMessage'),
t('storage.clearLocalTitle'),
() => {
localStorage.clear()
Navigate('/login')
},
'Clear All',
'Cancel',
t('storage.clearAll'),
t('common.cancel'),
'danger',
)
}}
>
Clear All Local Storage and Cache
{t('storage.clearLocal')}
</Button>
</Card>
{Capacitor.isNativePlatform() && (
<Card className='p-4' sx={{ maxWidth: 500, mb: 2 }}>
<Typography level='title-md' sx={{ mb: 1 }}>
App Preferences
{t('storage.appPreferences')}
<Chip variant='soft' color='info' sx={{ ml: 1 }}>
Device Only
{t('storage.deviceOnly')}
</Chip>
</Typography>
<Typography level='body-sm' sx={{ mb: 1 }}>
These are preferences and settings stored locally on your device
by the app. Clearing them will reset app-specific settings and may
log you out, but will not affect your server data.
{t('storage.appPreferencesDescription')}
</Typography>
<Button
variant='soft'
color='danger'
onClick={() => {
showConfirmation(
'Are you sure you want to clear all app preferences? This will reset your app settings and may require you to log in again.',
'Clear App Preferences',
t('storage.clearPreferencesMessage'),
t('storage.clearPreferencesTitle'),
async () => {
try {
const { Preferences } = await import(
'@capacitor/preferences'
)
const { Preferences } =
await import('@capacitor/preferences')
await Preferences.clear()
Navigate('/login')
} catch (e) {
// Optionally show error feedback
}
},
'Clear Preferences',
'Cancel',
t('storage.clearPreferences'),
t('common.cancel'),
'danger',
)
}}
>
Clear App Preferences
{t('storage.clearPreferences')}
</Button>
</Card>
)}

View File

@@ -1,19 +1,20 @@
import { Typography } from '@mui/joy'
import { useTranslation } from 'react-i18next'
import SettingsLayout from './SettingsLayout'
import ThemeToggle from './ThemeToggle'
const ThemeSettings = () => {
const { t } = useTranslation('settings')
return (
<SettingsLayout title="Theme Preferences">
<SettingsLayout title={t('theme.title')}>
<div className='grid gap-4'>
<Typography level='body-md'>
Choose how the site looks to you. Select a single theme, or sync with
your system and automatically switch between day and night themes.
</Typography>
<Typography level='body-md'>{t('theme.description')}</Typography>
<ThemeToggle />
</div>
</SettingsLayout>
)
}
export default ThemeSettings
export default ThemeSettings