diff --git a/client/src/i18n/translations/ar.ts b/client/src/i18n/translations/ar.ts index c4016ca..d8da414 100644 --- a/client/src/i18n/translations/ar.ts +++ b/client/src/i18n/translations/ar.ts @@ -122,6 +122,7 @@ const ar: Record = { 'settings.mapTemplate': 'قالب الخريطة', 'settings.mapTemplatePlaceholder.select': 'اختر قالبًا...', 'settings.mapDefaultHint': 'اتركه فارغًا لاستخدام OpenStreetMap افتراضيًا', + 'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', 'settings.mapHint': 'قالب URL لبلاطات الخريطة', 'settings.latitude': 'خط العرض', 'settings.longitude': 'خط الطول', @@ -147,9 +148,9 @@ const ar: Record = { 'settings.off': 'إيقاف', 'settings.account': 'الحساب', 'settings.username': 'اسم المستخدم', + 'settings.email': 'البريد الإلكتروني', 'settings.role': 'الدور', 'settings.roleAdmin': 'مسؤول', - 'settings.roleUser': 'مستخدم', 'settings.oidcLinked': 'مرتبط مع', 'settings.changePassword': 'تغيير كلمة المرور', 'settings.currentPassword': 'كلمة المرور الحالية', @@ -168,7 +169,17 @@ const ar: Record = { 'settings.deleteAccountConfirm': 'حذف نهائي', 'settings.deleteBlockedTitle': 'الحذف غير ممكن', 'settings.deleteBlockedMessage': 'أنت المسؤول الوحيد. قم بترقية مستخدم آخر إلى مسؤول قبل حذف حسابك.', + 'settings.roleUser': 'مستخدم', 'settings.saveProfile': 'حفظ الملف الشخصي', + 'settings.toast.mapSaved': 'تم حفظ إعدادات الخريطة', + 'settings.toast.keysSaved': 'تم حفظ مفاتيح API', + 'settings.toast.displaySaved': 'تم حفظ إعدادات العرض', + 'settings.toast.profileSaved': 'تم حفظ الملف الشخصي', + 'settings.uploadAvatar': 'رفع صورة الملف الشخصي', + 'settings.removeAvatar': 'إزالة صورة الملف الشخصي', + 'settings.avatarUploaded': 'تم تحديث صورة الملف الشخصي', + 'settings.avatarRemoved': 'تمت إزالة صورة الملف الشخصي', + 'settings.avatarError': 'فشل الرفع', 'settings.mfa.title': 'المصادقة الثنائية (2FA)', 'settings.mfa.description': 'تضيف خطوة ثانية عند تسجيل الدخول. استخدم تطبيق مصادقة (Google Authenticator، Authy، إلخ).', 'settings.mfa.enabled': 'المصادقة الثنائية مفعّلة على حسابك.', @@ -185,15 +196,6 @@ const ar: Record = { 'settings.mfa.toastEnabled': 'تم تفعيل المصادقة الثنائية', 'settings.mfa.toastDisabled': 'تم تعطيل المصادقة الثنائية', 'settings.mfa.demoBlocked': 'غير متاح في الوضع التجريبي', - 'settings.toast.mapSaved': 'تم حفظ إعدادات الخريطة', - 'settings.toast.keysSaved': 'تم حفظ مفاتيح API', - 'settings.toast.displaySaved': 'تم حفظ إعدادات العرض', - 'settings.toast.profileSaved': 'تم حفظ الملف الشخصي', - 'settings.uploadAvatar': 'رفع صورة الملف الشخصي', - 'settings.removeAvatar': 'إزالة صورة الملف الشخصي', - 'settings.avatarUploaded': 'تم تحديث صورة الملف الشخصي', - 'settings.avatarRemoved': 'تمت إزالة صورة الملف الشخصي', - 'settings.avatarError': 'فشل الرفع', // Login 'login.error': 'فشل تسجيل الدخول. يرجى التحقق من بياناتك.', @@ -228,9 +230,16 @@ const ar: Record = { 'login.noAccount': 'ليس لديك حساب؟', 'login.hasAccount': 'لديك حساب بالفعل؟', 'login.register': 'تسجيل', + 'login.emailPlaceholder': 'your@email.com', 'login.username': 'اسم المستخدم', 'login.oidc.registrationDisabled': 'التسجيل معطّل. تواصل مع المسؤول.', 'login.oidc.noEmail': 'لم يتم استلام بريد إلكتروني من المزوّد.', + 'login.oidc.tokenFailed': 'فشلت المصادقة.', + 'login.oidc.invalidState': 'جلسة غير صالحة. حاول مرة أخرى.', + 'login.demoFailed': 'فشل الدخول إلى العرض التجريبي', + 'login.oidcSignIn': 'تسجيل الدخول عبر {name}', + 'login.oidcOnly': 'تم تعطيل المصادقة بكلمة المرور. يرجى تسجيل الدخول عبر مزود SSO.', + 'login.demoHint': 'جرّب العرض التجريبي دون الحاجة للتسجيل', 'login.mfaTitle': 'المصادقة الثنائية', 'login.mfaSubtitle': 'أدخل الرمز المكون من 6 أرقام من تطبيق المصادقة.', 'login.mfaCodeLabel': 'رمز التحقق', @@ -238,12 +247,6 @@ const ar: Record = { 'login.mfaHint': 'افتح Google Authenticator أو Authy أو أي تطبيق TOTP آخر.', 'login.mfaBack': '← العودة لتسجيل الدخول', 'login.mfaVerify': 'تحقق', - 'login.oidc.tokenFailed': 'فشلت المصادقة.', - 'login.oidc.invalidState': 'جلسة غير صالحة. حاول مرة أخرى.', - 'login.demoFailed': 'فشل الدخول إلى العرض التجريبي', - 'login.oidcSignIn': 'تسجيل الدخول عبر {name}', - 'login.oidcOnly': 'تم تعطيل المصادقة بكلمة المرور. يرجى تسجيل الدخول عبر مزود SSO.', - 'login.demoHint': 'جرّب العرض التجريبي دون الحاجة للتسجيل', // Register 'register.passwordMismatch': 'كلمتا المرور غير متطابقتين', @@ -290,6 +293,21 @@ const ar: Record = { 'admin.table.lastLogin': 'آخر تسجيل دخول', 'admin.table.actions': 'الإجراءات', 'admin.you': '(أنت)', + 'admin.editUser': 'تعديل المستخدم', + 'admin.newPassword': 'كلمة مرور جديدة', + 'admin.newPasswordHint': 'اتركه فارغًا للاحتفاظ بالحالية', + 'admin.deleteUser': 'حذف المستخدم "{name}"؟ سيتم حذف جميع الرحلات نهائيًا.', + 'admin.deleteUserTitle': 'حذف المستخدم', + 'admin.newPasswordPlaceholder': 'أدخل كلمة مرور جديدة…', + 'admin.toast.loadError': 'فشل تحميل بيانات الإدارة', + 'admin.toast.userUpdated': 'تم تحديث المستخدم', + 'admin.toast.updateError': 'فشل التحديث', + 'admin.toast.userDeleted': 'تم حذف المستخدم', + 'admin.toast.deleteError': 'فشل الحذف', + 'admin.toast.cannotDeleteSelf': 'لا يمكنك حذف حسابك الخاص', + 'admin.toast.userCreated': 'تم إنشاء المستخدم', + 'admin.toast.createError': 'فشل إنشاء المستخدم', + 'admin.toast.fieldsRequired': 'اسم المستخدم والبريد الإلكتروني وكلمة المرور مطلوبة', 'admin.createUser': 'إنشاء مستخدم', 'admin.invite.title': 'روابط الدعوة', 'admin.invite.subtitle': 'إنشاء روابط تسجيل للاستخدام المحدود', @@ -309,23 +327,36 @@ const ar: Record = { 'admin.invite.deleted': 'تم حذف رابط الدعوة', 'admin.invite.createError': 'فشل إنشاء رابط الدعوة', 'admin.invite.deleteError': 'فشل حذف رابط الدعوة', - 'admin.editUser': 'تعديل المستخدم', - 'admin.newPassword': 'كلمة مرور جديدة', - 'admin.newPasswordHint': 'اتركه فارغًا للاحتفاظ بالحالية', - 'admin.deleteUserTitle': 'حذف المستخدم', - 'admin.toast.loadError': 'فشل تحميل بيانات الإدارة', - 'admin.toast.userUpdated': 'تم تحديث المستخدم', - 'admin.toast.updateError': 'فشل التحديث', - 'admin.toast.userDeleted': 'تم حذف المستخدم', - 'admin.toast.deleteError': 'فشل الحذف', - 'admin.toast.userCreated': 'تم إنشاء المستخدم', - 'admin.toast.createError': 'فشل إنشاء المستخدم', 'admin.allowRegistration': 'السماح بالتسجيل', + 'admin.allowRegistrationHint': 'يمكن للمستخدمين الجدد التسجيل بأنفسهم', 'admin.apiKeys': 'مفاتيح API', + 'admin.apiKeysHint': 'اختياري. يُفعّل بيانات الأماكن الموسعة مثل الصور والطقس.', + 'admin.mapsKey': 'مفتاح Google Maps API', + 'admin.mapsKeyHint': 'مطلوب للبحث عن الأماكن. احصل عليه من console.cloud.google.com', + 'admin.mapsKeyHintLong': 'بدون مفتاح API، يُستخدم OpenStreetMap للبحث. مع مفتاح Google يمكن تحميل الصور والتقييمات وساعات العمل أيضًا. احصل عليه من console.cloud.google.com.', + 'admin.recommended': 'مُوصى به', + 'admin.weatherKey': 'مفتاح OpenWeatherMap API', + 'admin.weatherKeyHint': 'لبيانات الطقس. مجاني من openweathermap.org', 'admin.validateKey': 'اختبار', 'admin.keyValid': 'متصل', 'admin.keyInvalid': 'غير صالح', 'admin.keySaved': 'تم حفظ مفاتيح API', + 'admin.oidcTitle': 'تسجيل الدخول الموحد (OIDC)', + 'admin.oidcSubtitle': 'السماح بتسجيل الدخول عبر مزودين خارجيين مثل Google أو Apple أو Authentik أو Keycloak.', + 'admin.oidcDisplayName': 'الاسم المعروض', + 'admin.oidcIssuer': 'عنوان URL للمُصدر', + 'admin.oidcIssuerHint': 'عنوان OpenID Connect Issuer URL للمزود. مثال: https://accounts.google.com', + 'admin.oidcSaved': 'تم حفظ إعدادات OIDC', + 'admin.oidcOnlyMode': 'تعطيل المصادقة بكلمة المرور', + 'admin.oidcOnlyModeHint': 'عند التفعيل، يُسمح فقط بتسجيل الدخول عبر SSO. سيتم حظر تسجيل الدخول والتسجيل بكلمة المرور.', + + // File Types + 'admin.fileTypes': 'أنواع الملفات المسموح بها', + 'admin.fileTypesHint': 'حدد أنواع الملفات التي يمكن للمستخدمين رفعها.', + 'admin.fileTypesFormat': 'امتدادات مفصولة بفواصل (مثل jpg,png,pdf,doc). استخدم * للسماح بجميع الأنواع.', + 'admin.fileTypesSaved': 'تم حفظ إعدادات أنواع الملفات', + + // Packing Templates & Bag Tracking 'admin.bagTracking.title': 'تتبع الأمتعة', 'admin.bagTracking.subtitle': 'تفعيل الوزن وتعيين الأمتعة للعناصر', 'admin.packingTemplates.title': 'قوالب التعبئة', @@ -345,8 +376,26 @@ const ar: Record = { 'admin.packingTemplates.createError': 'فشل إنشاء القالب', 'admin.packingTemplates.deleteError': 'فشل حذف القالب', 'admin.packingTemplates.saveError': 'فشل الحفظ', + + // Addons 'admin.addons.title': 'الإضافات', 'admin.addons.subtitle': 'فعّل أو عطّل الميزات لتخصيص تجربة TREK.', + 'admin.addons.catalog.memories.name': 'الذكريات', + 'admin.addons.catalog.memories.description': 'ألبومات صور مشتركة لكل رحلة', + 'admin.addons.catalog.packing.name': 'التعبئة', + 'admin.addons.catalog.packing.description': 'قوائم تحقق لإعداد أمتعتك لكل رحلة', + 'admin.addons.catalog.budget.name': 'الميزانية', + 'admin.addons.catalog.budget.description': 'تتبع النفقات وخطط ميزانية الرحلة', + 'admin.addons.catalog.documents.name': 'المستندات', + 'admin.addons.catalog.documents.description': 'حفظ وإدارة وثائق السفر', + 'admin.addons.catalog.vacay.name': 'الإجازة', + 'admin.addons.catalog.vacay.description': 'مخطط إجازات شخصي مع عرض تقويم', + 'admin.addons.catalog.atlas.name': 'الأطلس', + 'admin.addons.catalog.atlas.description': 'خريطة العالم مع الدول التي تمت زيارتها وإحصائيات السفر', + 'admin.addons.catalog.collab.name': 'التعاون', + 'admin.addons.catalog.collab.description': 'ملاحظات واستطلاعات ودردشة لحظية لتخطيط الرحلة', + 'admin.addons.subtitleBefore': 'فعّل أو عطّل الميزات لتخصيص تجربة ', + 'admin.addons.subtitleAfter': '.', 'admin.addons.enabled': 'مفعّل', 'admin.addons.disabled': 'معطّل', 'admin.addons.type.trip': 'رحلة', @@ -355,8 +404,21 @@ const ar: Record = { 'admin.addons.globalHint': 'متاح كقسم مستقل في التنقل الرئيسي', 'admin.addons.toast.updated': 'تم تحديث الإضافة', 'admin.addons.toast.error': 'فشل تحديث الإضافة', + 'admin.addons.noAddons': 'لا توجد إضافات متاحة', + + // Weather info 'admin.weather.title': 'بيانات الطقس', + 'admin.weather.badge': 'منذ 24 مارس 2026', 'admin.weather.description': 'يستخدم TREK خدمة Open-Meteo كمصدر لبيانات الطقس. وهي خدمة مجانية ومفتوحة المصدر ولا تتطلب مفتاح API.', + 'admin.weather.forecast': 'توقعات 16 يومًا', + 'admin.weather.forecastDesc': 'سابقًا 5 أيام (OpenWeatherMap)', + 'admin.weather.climate': 'بيانات المناخ التاريخية', + 'admin.weather.climateDesc': 'متوسطات آخر 85 سنة للأيام بعد توقعات الـ 16 يومًا', + 'admin.weather.requests': '10,000 طلب / يوم', + 'admin.weather.requestsDesc': 'مجاني، بدون مفتاح API', + 'admin.weather.locationHint': 'يعتمد الطقس على أول مكان بإحداثيات في كل يوم. إذا لم يكن هناك مكان مخصص ليوم ما، يُستخدم أي مكان من قائمة الأماكن كمرجع.', + + // GitHub 'admin.github.title': 'سجل الإصدارات', 'admin.github.subtitle': 'آخر التحديثات من {repo}', 'admin.github.latest': 'الأحدث', @@ -368,240 +430,26 @@ const ar: Record = { 'admin.github.error': 'فشل تحميل الإصدارات', 'admin.github.by': 'بواسطة', 'admin.github.support': 'يساعدني في تطوير TREK', + 'admin.update.available': 'يتوفر تحديث', + 'admin.update.text': 'TREK {version} متوفر. أنت تستخدم {current}.', 'admin.update.button': 'عرض على GitHub', 'admin.update.install': 'تثبيت التحديث', + 'admin.update.confirmTitle': 'تثبيت التحديث؟', + 'admin.update.confirmText': 'سيتم تحديث TREK من {current} إلى {version}. سيُعاد تشغيل الخادم تلقائيًا بعد ذلك.', + 'admin.update.dataInfo': 'جميع بياناتك (الرحلات، المستخدمون، مفاتيح API، المرفوعات، الإجازة، الأطلس، الميزانيات) ستبقى محفوظة.', + 'admin.update.warning': 'سيكون التطبيق غير متاح لفترة وجيزة أثناء إعادة التشغيل.', 'admin.update.confirm': 'حدّث الآن', 'admin.update.installing': 'جارٍ التحديث…', 'admin.update.success': 'تم تثبيت التحديث. ستتم إعادة تشغيل الخادم…', 'admin.update.failed': 'فشل التحديث', + 'admin.update.backupHint': 'نوصي بإنشاء نسخة احتياطية قبل التحديث.', + 'admin.update.backupLink': 'الذهاب إلى النسخ الاحتياطي', + 'admin.update.howTo': 'كيفية التحديث', + 'admin.update.dockerText': 'يعمل TREK الخاص بك في Docker. للتحديث إلى {version}، نفّذ الأوامر التالية على الخادم:', 'admin.update.reloadHint': 'يرجى إعادة تحميل الصفحة بعد بضع ثوانٍ.', - // Trip / planner - 'trip.tabs.plan': 'الخطة', - 'trip.tabs.reservations': 'الحجوزات', - 'trip.tabs.reservationsShort': 'حجز', - 'trip.tabs.packing': 'قائمة التجهيز', - 'trip.tabs.packingShort': 'تجهيز', - 'trip.tabs.budget': 'الميزانية', - 'trip.tabs.files': 'الملفات', - 'trip.loading': 'جارٍ تحميل الرحلة...', - 'trip.mobilePlan': 'الخطة', - 'trip.mobilePlaces': 'الأماكن', - 'trip.toast.placeUpdated': 'تم تحديث المكان', - 'trip.toast.placeAdded': 'تمت إضافة المكان', - 'trip.toast.placeDeleted': 'تم حذف المكان', - 'trip.toast.selectDay': 'يرجى اختيار يوم أولًا', - 'trip.toast.assignedToDay': 'تم إسناد المكان إلى اليوم', - 'trip.toast.reorderError': 'فشل إعادة الترتيب', - 'trip.toast.reservationUpdated': 'تم تحديث الحجز', - 'trip.toast.reservationAdded': 'تمت إضافة الحجز', - 'trip.toast.deleted': 'تم الحذف', - 'trip.confirm.deletePlace': 'هل تريد حذف هذا المكان؟', - - 'dayplan.emptyDay': 'لا توجد أماكن مخططة لهذا اليوم', - 'dayplan.addNote': 'إضافة ملاحظة', - 'dayplan.editNote': 'تعديل الملاحظة', - 'dayplan.noteTitle': 'ملاحظة', - 'dayplan.noteSubtitle': 'ملاحظة يومية', - 'dayplan.totalCost': 'إجمالي التكلفة', - 'dayplan.days': 'الأيام', - 'dayplan.dayN': 'اليوم {n}', - 'dayplan.calculating': 'جارٍ الحساب...', - 'dayplan.route': 'المسار', - 'dayplan.optimize': 'تحسين', - 'dayplan.optimized': 'تم تحسين المسار', - 'dayplan.routeError': 'فشل حساب المسار', - 'dayplan.toast.needTwoPlaces': 'يلزم مكانان على الأقل لتحسين المسار', - 'dayplan.toast.routeOptimized': 'تم تحسين المسار', - 'dayplan.toast.noGeoPlaces': 'لم يتم العثور على أماكن بإحداثيات لحساب المسار', - 'dayplan.confirmed': 'مؤكد', - 'dayplan.pendingRes': 'قيد الانتظار', - 'dayplan.pdf': 'PDF', - 'dayplan.pdfTooltip': 'تصدير خطة اليوم بصيغة PDF', - 'dayplan.pdfError': 'فشل تصدير PDF', - - 'planner.places': 'الأماكن', - 'planner.bookings': 'الحجوزات', - 'planner.packingList': 'قائمة التجهيز', - 'planner.documents': 'المستندات', - 'planner.dayPlan': 'خطة اليوم', - 'planner.reservations': 'الحجوزات', - 'planner.minTwoPlaces': 'يلزم مكانان على الأقل مع إحداثيات', - 'planner.noGeoPlaces': 'لا توجد أماكن بإحداثيات', - 'planner.routeCalculated': 'تم حساب المسار', - 'planner.routeCalcFailed': 'تعذر حساب المسار', - 'planner.routeError': 'خطأ أثناء حساب المسار', - 'planner.routeOptimized': 'تم تحسين المسار', - 'planner.reservationUpdated': 'تم تحديث الحجز', - 'planner.reservationAdded': 'تمت إضافة الحجز', - 'planner.confirmDeleteReservation': 'حذف الحجز؟', - 'planner.reservationDeleted': 'تم حذف الحجز', - 'planner.days': 'الأيام', - 'planner.allPlaces': 'كل الأماكن', - 'planner.totalPlaces': 'إجمالي {n} أماكن', - 'planner.noDaysPlanned': 'لا توجد أيام مخططة بعد', - 'planner.editTrip': 'تعديل الرحلة ←', - 'planner.placeOne': 'مكان واحد', - 'planner.placeN': '{n} أماكن', - 'planner.addNote': 'إضافة ملاحظة', - 'planner.noEntries': 'لا توجد عناصر لهذا اليوم', - 'planner.addPlace': 'إضافة مكان/نشاط', - 'planner.addPlaceShort': '+ إضافة مكان/نشاط', - 'planner.totalCost': 'إجمالي التكلفة', - 'planner.searchPlaces': 'ابحث عن أماكن…', - 'planner.allCategories': 'كل الفئات', - 'planner.noPlacesFound': 'لم يتم العثور على أماكن', - 'planner.addFirstPlace': 'أضف أول مكان', - 'planner.noReservations': 'لا توجد حجوزات', - 'planner.addFirstReservation': 'أضف أول حجز', - 'planner.new': 'جديد', - 'planner.addToDay': '+ يوم', - 'planner.calculating': 'جارٍ الحساب…', - 'planner.route': 'المسار', - 'planner.optimize': 'تحسين', - 'planner.openGoogleMaps': 'فتح في Google Maps', - 'planner.selectDayHint': 'اختر يومًا من القائمة اليسرى لعرض خطة اليوم', - 'planner.noPlacesForDay': 'لا توجد أماكن لهذا اليوم بعد', - 'planner.addPlacesLink': 'إضافة أماكن ←', - 'planner.noReservation': 'لا يوجد حجز', - 'planner.removeFromDay': 'إزالة من اليوم', - 'planner.addToThisDay': 'إضافة إلى اليوم', - 'planner.overview': 'نظرة عامة', - 'planner.noDays': 'لا توجد أيام بعد', - 'planner.editTripToAddDays': 'عدّل الرحلة لإضافة أيام', - 'planner.dayCount': '{n} أيام', - 'planner.clickToUnlock': 'انقر لفتح القفل', - 'planner.dayDetails': 'تفاصيل اليوم', - 'planner.dayN': 'اليوم {n}', - - // Places - 'places.addPlace': 'إضافة مكان/نشاط', - 'places.assignToDay': 'إلى أي يوم تريد الإضافة؟', - 'places.unplanned': 'غير مخطط', - 'places.search': 'ابحث عن أماكن...', - 'places.allCategories': 'كل الفئات', - 'places.count': '{count} أماكن', - 'places.countSingular': 'مكان واحد', - 'places.allPlanned': 'تم تخطيط جميع الأماكن', - 'places.noneFound': 'لم يتم العثور على أماكن', - 'places.editPlace': 'تعديل المكان', - 'places.formName': 'الاسم', - 'places.formDescription': 'الوصف', - 'places.formAddress': 'العنوان', - 'places.formCategory': 'الفئة', - 'places.noCategory': 'بلا فئة', - 'places.formTime': 'الوقت', - 'places.startTime': 'البداية', - 'places.endTime': 'النهاية', - 'places.endTimeBeforeStart': 'وقت النهاية قبل وقت البداية', - 'places.formWebsite': 'الموقع الإلكتروني', - 'places.formReservation': 'حجز', - 'places.mapsSearchPlaceholder': 'ابحث عن أماكن...', - 'places.mapsSearchError': 'فشل البحث عن المكان.', - 'places.categoryCreateError': 'فشل إنشاء الفئة', - 'places.nameRequired': 'يرجى إدخال اسم', - 'places.saveError': 'فشل الحفظ', - - // Reservations - 'reservations.title': 'الحجوزات', - 'reservations.empty': 'لا توجد حجوزات بعد', - 'reservations.emptyHint': 'أضف حجوزات للرحلات الجوية والفنادق وغير ذلك', - 'reservations.add': 'إضافة حجز', - 'reservations.addManual': 'حجز يدوي', - 'reservations.confirmed': 'مؤكد', - 'reservations.pending': 'قيد الانتظار', - 'reservations.fromPlan': 'من الخطة', - 'reservations.showFiles': 'عرض الملفات', - 'reservations.editTitle': 'تعديل الحجز', - 'reservations.status': 'الحالة', - 'reservations.datetime': 'التاريخ والوقت', - 'reservations.startTime': 'وقت البداية', - 'reservations.endTime': 'وقت النهاية', - 'reservations.notes': 'ملاحظات', - 'reservations.meta.airline': 'شركة الطيران', - 'reservations.meta.flightNumber': 'رقم الرحلة', - 'reservations.meta.from': 'من', - 'reservations.meta.to': 'إلى', - 'reservations.meta.platform': 'المنصة', - 'reservations.meta.seat': 'المقعد', - 'reservations.type.flight': 'رحلة جوية', - 'reservations.type.hotel': 'إقامة', - 'reservations.type.restaurant': 'مطعم', - 'reservations.type.train': 'قطار', - 'reservations.type.car': 'سيارة مستأجرة', - 'reservations.type.cruise': 'رحلة بحرية', - 'reservations.type.event': 'فعالية', - 'reservations.type.tour': 'جولة', - 'reservations.type.other': 'أخرى', - 'reservations.confirm.delete': 'هل تريد حذف الحجز "{name}"؟', - 'reservations.toast.updated': 'تم تحديث الحجز', - 'reservations.toast.removed': 'تم حذف الحجز', - 'reservations.toast.fileUploaded': 'تم رفع الملف', - 'reservations.toast.uploadError': 'فشل الرفع', - 'reservations.newTitle': 'حجز جديد', - 'reservations.bookingType': 'نوع الحجز', - 'reservations.titleLabel': 'العنوان', - 'reservations.locationAddress': 'الموقع / العنوان', - 'reservations.confirmationCode': 'رمز الحجز', - 'reservations.day': 'اليوم', - 'reservations.noDay': 'بلا يوم', - 'reservations.place': 'المكان', - 'reservations.noPlace': 'بلا مكان', - 'reservations.uploading': 'جارٍ الرفع...', - 'reservations.attachFile': 'إرفاق ملف', - 'reservations.toast.saveError': 'فشل الحفظ', - 'reservations.toast.updateError': 'فشل التحديث', - 'reservations.toast.deleteError': 'فشل الحذف', - 'reservations.confirm.remove': 'إزالة الحجز "{name}"؟', - 'reservations.linkAssignment': 'ربط بخطة اليوم', - 'reservations.pickAssignment': 'اختر عنصرًا من خطتك...', - 'reservations.noAssignment': 'بلا ربط', - - // Files / photos - 'files.title': 'الملفات', - 'files.count': '{count} ملفات', - 'files.countSingular': 'ملف واحد', - 'files.uploaded': 'تم رفع {count}', - 'files.uploadError': 'فشل الرفع', - 'files.dropzone': 'أسقط الملفات هنا', - 'files.dropzoneHint': 'أو انقر للتصفح', - 'files.uploading': 'جارٍ الرفع...', - 'files.filterAll': 'الكل', - 'files.filterPdf': 'ملفات PDF', - 'files.filterImages': 'الصور', - 'files.filterDocs': 'المستندات', - 'files.filterCollab': 'ملاحظات Collab', - 'files.sourceCollab': 'من ملاحظات Collab', - 'files.empty': 'لا توجد ملفات بعد', - 'files.emptyHint': 'ارفع ملفات لإرفاقها برحلتك', - 'files.openTab': 'فتح في تبويب جديد', - 'files.confirm.delete': 'هل تريد حذف هذا الملف؟', - 'files.toast.deleted': 'تم حذف الملف', - 'files.toast.deleteError': 'فشل حذف الملف', - 'files.sourcePlan': 'خطة اليوم', - 'files.sourceBooking': 'الحجز', - 'files.attach': 'إرفاق', - 'files.trash': 'سلة المهملات', - 'files.trashEmpty': 'سلة المهملات فارغة', - 'files.emptyTrash': 'إفراغ السلة', - 'files.restore': 'استعادة', - 'files.assign': 'إسناد', - 'files.assignTitle': 'إسناد ملف', - 'files.assignPlace': 'المكان', - 'files.assignBooking': 'الحجز', - 'files.unassigned': 'غير مسند', - 'files.unlink': 'إزالة الرابط', - - 'photos.allDays': 'كل الأيام', - 'photos.noPhotos': 'لا توجد صور بعد', - 'photos.uploadHint': 'ارفع صور رحلتك', - 'photos.clickToSelect': 'أو انقر للاختيار', - 'photos.linkPlace': 'ربط بمكان', - 'photos.noPlace': 'بلا مكان', - 'photos.uploadN': 'رفع {n} صورة', - - // Vacay + // Vacay addon 'vacay.subtitle': 'خطط وأدر أيام الإجازة', 'vacay.settings': 'الإعدادات', 'vacay.year': 'السنة', @@ -616,6 +464,7 @@ const ar: Record = { 'vacay.editPerson': 'تعديل الشخص', 'vacay.removePerson': 'إزالة الشخص', 'vacay.removePersonConfirm': 'إزالة {name}؟', + 'vacay.removePersonHint': 'سيتم حذف جميع إدخالات الإجازة لهذا الشخص نهائيًا.', 'vacay.personName': 'الاسم', 'vacay.personNamePlaceholder': 'أدخل الاسم', 'vacay.color': 'اللون', @@ -673,29 +522,17 @@ const ar: Record = { 'vacay.acceptFusion': 'قبول ودمج', 'vacay.inviteTitle': 'طلب دمج', 'vacay.inviteWantsToFuse': 'يريد مشاركة تقويم إجازة معك.', + 'vacay.fuseInfo1': 'سيرى كلاكما جميع إدخالات الإجازة في تقويم مشترك واحد.', + 'vacay.fuseInfo2': 'يمكن لكلا الطرفين إنشاء وتعديل الإدخالات لبعضهما البعض.', + 'vacay.fuseInfo3': 'يمكن لكلا الطرفين حذف الإدخالات وتغيير مستحقات الإجازة.', + 'vacay.fuseInfo4': 'تتم مشاركة الإعدادات مثل العطل الرسمية وعطل الشركة.', + 'vacay.fuseInfo5': 'يمكن فك الدمج في أي وقت من قبل أي طرف. ستبقى إدخالاتك محفوظة.', - // Atlas + // Atlas addon 'atlas.subtitle': 'بصمتك السفرية حول العالم', 'atlas.countries': 'الدول', 'atlas.trips': 'الرحلات', 'atlas.places': 'الأماكن', - 'atlas.days': 'الأيام', - 'atlas.visitedCountries': 'الدول التي تمت زيارتها', - 'atlas.cities': 'المدن', - 'atlas.noData': 'لا توجد بيانات سفر بعد', - 'atlas.noDataHint': 'أنشئ رحلة وأضف أماكن لرؤية خريطتك العالمية', - 'atlas.lastTrip': 'آخر رحلة', - 'atlas.nextTrip': 'الرحلة القادمة', - 'atlas.daysLeft': 'يوم متبقٍ', - 'atlas.streak': 'سلسلة', - 'atlas.year': 'سنة', - 'atlas.years': 'سنوات', - 'atlas.tripSingular': 'رحلة', - 'atlas.tripPlural': 'رحلات', - 'atlas.placeVisited': 'مكان تمت زيارته', - 'atlas.placesVisited': 'أماكن تمت زيارتها', - 'atlas.firstVisit': 'أول رحلة', - 'atlas.lastVisitLabel': 'آخر رحلة', 'atlas.unmark': 'إزالة', 'atlas.confirmMark': 'تعيين هذا البلد كمُزار؟', 'atlas.confirmUnmark': 'إزالة هذا البلد من قائمة المُزارة؟', @@ -711,8 +548,319 @@ const ar: Record = { 'atlas.bucketNotesPlaceholder': 'ملاحظات (اختياري)', 'atlas.bucketEmpty': 'قائمة أمنياتك فارغة', 'atlas.bucketEmptyHint': 'أضف أماكن تحلم بزيارتها', + 'atlas.days': 'الأيام', + 'atlas.visitedCountries': 'الدول التي تمت زيارتها', + 'atlas.cities': 'المدن', + 'atlas.noData': 'لا توجد بيانات سفر بعد', + 'atlas.noDataHint': 'أنشئ رحلة وأضف أماكن لرؤية خريطتك العالمية', + 'atlas.lastTrip': 'آخر رحلة', + 'atlas.nextTrip': 'الرحلة القادمة', + 'atlas.daysLeft': 'يوم متبقٍ', + 'atlas.streak': 'سلسلة', + 'atlas.year': 'سنة', + 'atlas.years': 'سنوات', + 'atlas.yearInRow': 'سنة متتالية', + 'atlas.yearsInRow': 'سنوات متتالية', + 'atlas.tripIn': 'رحلة في', + 'atlas.tripsIn': 'رحلات في', + 'atlas.since': 'منذ', + 'atlas.europe': 'أوروبا', + 'atlas.asia': 'آسيا', + 'atlas.northAmerica': 'أمريكا الشمالية', + 'atlas.southAmerica': 'أمريكا الجنوبية', + 'atlas.africa': 'أفريقيا', + 'atlas.oceania': 'أوقيانوسيا', + 'atlas.other': 'أخرى', + 'atlas.firstVisit': 'أول رحلة', + 'atlas.lastVisitLabel': 'آخر رحلة', + 'atlas.tripSingular': 'رحلة', + 'atlas.tripPlural': 'رحلات', + 'atlas.placeVisited': 'مكان تمت زيارته', + 'atlas.placesVisited': 'أماكن تمت زيارتها', + + // Trip Planner + 'trip.tabs.plan': 'الخطة', + 'trip.tabs.reservations': 'الحجوزات', + 'trip.tabs.reservationsShort': 'حجز', + 'trip.tabs.packing': 'قائمة التجهيز', + 'trip.tabs.packingShort': 'تجهيز', + 'trip.tabs.budget': 'الميزانية', + 'trip.tabs.files': 'الملفات', + 'trip.loading': 'جارٍ تحميل الرحلة...', + 'trip.mobilePlan': 'الخطة', + 'trip.mobilePlaces': 'الأماكن', + 'trip.toast.placeUpdated': 'تم تحديث المكان', + 'trip.toast.placeAdded': 'تمت إضافة المكان', + 'trip.toast.placeDeleted': 'تم حذف المكان', + 'trip.toast.selectDay': 'يرجى اختيار يوم أولًا', + 'trip.toast.assignedToDay': 'تم إسناد المكان إلى اليوم', + 'trip.toast.reorderError': 'فشل إعادة الترتيب', + 'trip.toast.reservationUpdated': 'تم تحديث الحجز', + 'trip.toast.reservationAdded': 'تمت إضافة الحجز', + 'trip.toast.deleted': 'تم الحذف', + 'trip.confirm.deletePlace': 'هل تريد حذف هذا المكان؟', + + // Day Plan Sidebar + 'dayplan.emptyDay': 'لا توجد أماكن مخططة لهذا اليوم', + 'dayplan.addNote': 'إضافة ملاحظة', + 'dayplan.editNote': 'تعديل الملاحظة', + 'dayplan.noteAdd': 'إضافة ملاحظة', + 'dayplan.noteEdit': 'تعديل الملاحظة', + 'dayplan.noteTitle': 'ملاحظة', + 'dayplan.noteSubtitle': 'ملاحظة يومية', + 'dayplan.totalCost': 'إجمالي التكلفة', + 'dayplan.days': 'الأيام', + 'dayplan.dayN': 'اليوم {n}', + 'dayplan.calculating': 'جارٍ الحساب...', + 'dayplan.route': 'المسار', + 'dayplan.optimize': 'تحسين', + 'dayplan.optimized': 'تم تحسين المسار', + 'dayplan.routeError': 'فشل حساب المسار', + 'dayplan.toast.needTwoPlaces': 'يلزم مكانان على الأقل لتحسين المسار', + 'dayplan.toast.routeOptimized': 'تم تحسين المسار', + 'dayplan.toast.noGeoPlaces': 'لم يتم العثور على أماكن بإحداثيات لحساب المسار', + 'dayplan.confirmed': 'مؤكد', + 'dayplan.pendingRes': 'قيد الانتظار', + 'dayplan.pdf': 'PDF', + 'dayplan.pdfTooltip': 'تصدير خطة اليوم بصيغة PDF', + 'dayplan.pdfError': 'فشل تصدير PDF', + + // Places Sidebar + 'places.addPlace': 'إضافة مكان/نشاط', + 'places.assignToDay': 'إلى أي يوم تريد الإضافة؟', + 'places.all': 'الكل', + 'places.unplanned': 'غير مخطط', + 'places.search': 'ابحث عن أماكن...', + 'places.allCategories': 'كل الفئات', + 'places.count': '{count} أماكن', + 'places.countSingular': 'مكان واحد', + 'places.allPlanned': 'تم تخطيط جميع الأماكن', + 'places.noneFound': 'لم يتم العثور على أماكن', + 'places.editPlace': 'تعديل المكان', + 'places.formName': 'الاسم', + 'places.formNamePlaceholder': 'مثال: برج إيفل', + 'places.formDescription': 'الوصف', + 'places.formDescriptionPlaceholder': 'وصف مختصر...', + 'places.formAddress': 'العنوان', + 'places.formAddressPlaceholder': 'الشارع، المدينة، البلد', + 'places.formLat': 'خط العرض (مثال: 48.8566)', + 'places.formLng': 'خط الطول (مثال: 2.3522)', + 'places.formCategory': 'الفئة', + 'places.noCategory': 'بلا فئة', + 'places.categoryNamePlaceholder': 'اسم الفئة', + 'places.formTime': 'الوقت', + 'places.startTime': 'البداية', + 'places.endTime': 'النهاية', + 'places.endTimeBeforeStart': 'وقت النهاية قبل وقت البداية', + 'places.timeCollision': 'تداخل في الوقت مع:', + 'places.formWebsite': 'الموقع الإلكتروني', + 'places.formNotesPlaceholder': 'ملاحظات شخصية...', + 'places.formReservation': 'حجز', + 'places.reservationNotesPlaceholder': 'ملاحظات الحجز، رقم التأكيد...', + 'places.mapsSearchPlaceholder': 'ابحث عن أماكن...', + 'places.mapsSearchError': 'فشل البحث عن المكان.', + 'places.osmHint': 'يتم البحث عبر OpenStreetMap (بدون صور أو ساعات عمل أو تقييمات). أضف مفتاح Google API في الإعدادات للحصول على جميع التفاصيل.', + 'places.osmActive': 'البحث عبر OpenStreetMap (بدون صور أو تقييمات أو ساعات عمل). أضف مفتاح Google API في الإعدادات لبيانات موسعة.', + 'places.categoryCreateError': 'فشل إنشاء الفئة', + 'places.nameRequired': 'يرجى إدخال اسم', + 'places.saveError': 'فشل الحفظ', + + // Place Inspector + 'inspector.opened': 'مفتوح', + 'inspector.closed': 'مغلق', + 'inspector.openingHours': 'ساعات العمل', + 'inspector.showHours': 'عرض ساعات العمل', + 'inspector.files': 'الملفات', + 'inspector.filesCount': '{count} ملفات', + 'inspector.removeFromDay': 'إزالة من اليوم', + 'inspector.addToDay': 'إضافة إلى اليوم', + 'inspector.confirmedRes': 'حجز مؤكد', + 'inspector.pendingRes': 'حجز قيد الانتظار', + 'inspector.google': 'فتح في Google Maps', + 'inspector.website': 'فتح الموقع الإلكتروني', + 'inspector.addRes': 'حجز', + 'inspector.editRes': 'تعديل الحجز', + 'inspector.participants': 'المشاركون', + + // Reservations + 'reservations.title': 'الحجوزات', + 'reservations.empty': 'لا توجد حجوزات بعد', + 'reservations.emptyHint': 'أضف حجوزات للرحلات الجوية والفنادق وغير ذلك', + 'reservations.add': 'إضافة حجز', + 'reservations.addManual': 'حجز يدوي', + 'reservations.placeHint': 'نصيحة: يُفضل إنشاء الحجوزات مباشرة من مكان لربطها بخطة اليوم.', + 'reservations.confirmed': 'مؤكد', + 'reservations.pending': 'قيد الانتظار', + 'reservations.summary': '{confirmed} مؤكدة، {pending} قيد الانتظار', + 'reservations.fromPlan': 'من الخطة', + 'reservations.showFiles': 'عرض الملفات', + 'reservations.editTitle': 'تعديل الحجز', + 'reservations.status': 'الحالة', + 'reservations.datetime': 'التاريخ والوقت', + 'reservations.startTime': 'وقت البداية', + 'reservations.endTime': 'وقت النهاية', + 'reservations.date': 'التاريخ', + 'reservations.time': 'الوقت', + 'reservations.timeAlt': 'الوقت (بديل، مثل 19:30)', + 'reservations.notes': 'ملاحظات', + 'reservations.notesPlaceholder': 'ملاحظات إضافية...', + 'reservations.meta.airline': 'شركة الطيران', + 'reservations.meta.flightNumber': 'رقم الرحلة', + 'reservations.meta.from': 'من', + 'reservations.meta.to': 'إلى', + 'reservations.meta.trainNumber': 'رقم القطار', + 'reservations.meta.platform': 'المنصة', + 'reservations.meta.seat': 'المقعد', + 'reservations.meta.checkIn': 'تسجيل الوصول', + 'reservations.meta.checkOut': 'تسجيل المغادرة', + 'reservations.meta.linkAccommodation': 'الإقامة', + 'reservations.meta.pickAccommodation': 'ربط بالإقامة', + 'reservations.meta.noAccommodation': 'لا يوجد', + 'reservations.meta.hotelPlace': 'الإقامة', + 'reservations.meta.pickHotel': 'اختر الإقامة', + 'reservations.meta.fromDay': 'من', + 'reservations.meta.toDay': 'إلى', + 'reservations.meta.selectDay': 'اختر يومًا', + 'reservations.type.flight': 'رحلة جوية', + 'reservations.type.hotel': 'إقامة', + 'reservations.type.restaurant': 'مطعم', + 'reservations.type.train': 'قطار', + 'reservations.type.car': 'سيارة مستأجرة', + 'reservations.type.cruise': 'رحلة بحرية', + 'reservations.type.event': 'فعالية', + 'reservations.type.tour': 'جولة', + 'reservations.type.other': 'أخرى', + 'reservations.confirm.delete': 'هل تريد حذف الحجز "{name}"؟', + 'reservations.toast.updated': 'تم تحديث الحجز', + 'reservations.toast.removed': 'تم حذف الحجز', + 'reservations.toast.fileUploaded': 'تم رفع الملف', + 'reservations.toast.uploadError': 'فشل الرفع', + 'reservations.newTitle': 'حجز جديد', + 'reservations.bookingType': 'نوع الحجز', + 'reservations.titleLabel': 'العنوان', + 'reservations.titlePlaceholder': 'مثال: Lufthansa LH123، فندق أدلون، ...', + 'reservations.locationAddress': 'الموقع / العنوان', + 'reservations.locationPlaceholder': 'العنوان، المطار، الفندق...', + 'reservations.confirmationCode': 'رمز الحجز', + 'reservations.confirmationPlaceholder': 'مثال: ABC12345', + 'reservations.day': 'اليوم', + 'reservations.noDay': 'بلا يوم', + 'reservations.place': 'المكان', + 'reservations.noPlace': 'بلا مكان', + 'reservations.pendingSave': 'سيتم الحفظ…', + 'reservations.uploading': 'جارٍ الرفع...', + 'reservations.attachFile': 'إرفاق ملف', + 'reservations.toast.saveError': 'فشل الحفظ', + 'reservations.toast.updateError': 'فشل التحديث', + 'reservations.toast.deleteError': 'فشل الحذف', + 'reservations.confirm.remove': 'إزالة الحجز "{name}"؟', + 'reservations.linkAssignment': 'ربط بخطة اليوم', + 'reservations.pickAssignment': 'اختر عنصرًا من خطتك...', + 'reservations.noAssignment': 'بلا ربط', + + // Budget + 'budget.title': 'الميزانية', + 'budget.emptyTitle': 'لم يتم إنشاء ميزانية بعد', + 'budget.emptyText': 'أنشئ فئات وإدخالات لتخطيط ميزانية سفرك', + 'budget.emptyPlaceholder': 'أدخل اسم الفئة...', + 'budget.createCategory': 'إنشاء فئة', + 'budget.category': 'الفئة', + 'budget.categoryName': 'اسم الفئة', + 'budget.table.name': 'الاسم', + 'budget.table.total': 'الإجمالي', + 'budget.table.persons': 'الأشخاص', + 'budget.table.days': 'الأيام', + 'budget.table.perPerson': 'لكل شخص', + 'budget.table.perDay': 'لكل يوم', + 'budget.table.perPersonDay': 'لكل شخص / يوم', + 'budget.table.note': 'ملاحظة', + 'budget.newEntry': 'إدخال جديد', + 'budget.defaultEntry': 'إدخال جديد', + 'budget.defaultCategory': 'فئة جديدة', + 'budget.total': 'الإجمالي', + 'budget.totalBudget': 'إجمالي الميزانية', + 'budget.byCategory': 'حسب الفئة', + 'budget.editTooltip': 'انقر للتعديل', + 'budget.confirm.deleteCategory': 'هل تريد حذف الفئة "{name}" مع {count} إدخالات؟', + 'budget.deleteCategory': 'حذف الفئة', + 'budget.perPerson': 'لكل شخص', + 'budget.paid': 'مدفوع', + 'budget.open': 'مفتوح', + 'budget.noMembers': 'لا أعضاء معينون', + + // Files + 'files.title': 'الملفات', + 'files.count': '{count} ملفات', + 'files.countSingular': 'ملف واحد', + 'files.uploaded': 'تم رفع {count}', + 'files.uploadError': 'فشل الرفع', + 'files.dropzone': 'أسقط الملفات هنا', + 'files.dropzoneHint': 'أو انقر للتصفح', + 'files.allowedTypes': 'صور، PDF، DOC، DOCX، XLS، XLSX، TXT، CSV · حد أقصى 50 ميغابايت', + 'files.uploading': 'جارٍ الرفع...', + 'files.filterAll': 'الكل', + 'files.filterPdf': 'ملفات PDF', + 'files.filterImages': 'الصور', + 'files.filterDocs': 'المستندات', + 'files.filterCollab': 'ملاحظات Collab', + 'files.sourceCollab': 'من ملاحظات Collab', + 'files.empty': 'لا توجد ملفات بعد', + 'files.emptyHint': 'ارفع ملفات لإرفاقها برحلتك', + 'files.openTab': 'فتح في تبويب جديد', + 'files.confirm.delete': 'هل تريد حذف هذا الملف؟', + 'files.toast.deleted': 'تم حذف الملف', + 'files.toast.deleteError': 'فشل حذف الملف', + 'files.sourcePlan': 'خطة اليوم', + 'files.sourceBooking': 'الحجز', + 'files.attach': 'إرفاق', + 'files.pasteHint': 'يمكنك أيضًا لصق الصور من الحافظة (Ctrl+V)', + 'files.trash': 'سلة المهملات', + 'files.trashEmpty': 'سلة المهملات فارغة', + 'files.emptyTrash': 'إفراغ السلة', + 'files.restore': 'استعادة', + 'files.star': 'تمييز', + 'files.unstar': 'إلغاء التمييز', + 'files.assign': 'إسناد', + 'files.assignTitle': 'إسناد ملف', + 'files.assignPlace': 'المكان', + 'files.assignBooking': 'الحجز', + 'files.unassigned': 'غير مسند', + 'files.unlink': 'إزالة الرابط', + 'files.toast.trashed': 'تم النقل إلى سلة المهملات', + 'files.toast.restored': 'تمت استعادة الملف', + 'files.toast.trashEmptied': 'تم إفراغ سلة المهملات', + 'files.toast.assigned': 'تم إسناد الملف', + 'files.toast.assignError': 'فشل الإسناد', + 'files.toast.restoreError': 'فشلت الاستعادة', + 'files.confirm.permanentDelete': 'حذف هذا الملف نهائيًا؟ لا يمكن التراجع عن ذلك.', + 'files.confirm.emptyTrash': 'حذف جميع ملفات سلة المهملات نهائيًا؟ لا يمكن التراجع عن ذلك.', + 'files.noteLabel': 'ملاحظة', + 'files.notePlaceholder': 'أضف ملاحظة...', // Packing + 'packing.title': 'قائمة التجهيز', + 'packing.empty': 'قائمة التجهيز فارغة', + 'packing.progress': '{packed} من {total} جُهّز ({percent}%)', + 'packing.clearChecked': 'إزالة {count} محدد', + 'packing.clearCheckedShort': 'إزالة {count}', + 'packing.suggestions': 'اقتراحات', + 'packing.suggestionsTitle': 'إضافة اقتراحات', + 'packing.allSuggested': 'تمت إضافة جميع الاقتراحات', + 'packing.allPacked': 'تم تجهيز الكل!', + 'packing.addPlaceholder': 'إضافة عنصر جديد...', + 'packing.categoryPlaceholder': 'الفئة...', + 'packing.filterAll': 'الكل', + 'packing.filterOpen': 'مفتوح', + 'packing.filterDone': 'تم', + 'packing.emptyTitle': 'قائمة التجهيز فارغة', + 'packing.emptyHint': 'أضف عناصر أو استخدم الاقتراحات', + 'packing.emptyFiltered': 'لا توجد عناصر مطابقة لهذا الفلتر', + 'packing.menuRename': 'إعادة تسمية', + 'packing.menuCheckAll': 'تحديد الكل', + 'packing.menuUncheckAll': 'إلغاء تحديد الكل', + 'packing.menuDeleteCat': 'حذف الفئة', + 'packing.assignUser': 'تعيين مستخدم', + 'packing.noMembers': 'لا أعضاء', 'packing.addItem': 'إضافة عنصر', 'packing.addItemPlaceholder': 'اسم العنصر...', 'packing.addCategory': 'إضافة فئة', @@ -721,15 +869,256 @@ const ar: Record = { 'packing.template': 'قالب', 'packing.templateApplied': 'تمت إضافة {count} عنصر من القالب', 'packing.templateError': 'فشل تطبيق القالب', - 'packing.assignUser': 'تعيين مستخدم', - 'packing.noMembers': 'لا أعضاء', 'packing.bags': 'أمتعة', 'packing.noBag': 'غير معيّن', 'packing.totalWeight': 'الوزن الإجمالي', 'packing.bagName': 'الاسم...', 'packing.addBag': 'إضافة أمتعة', + 'packing.changeCategory': 'تغيير الفئة', + 'packing.confirm.clearChecked': 'هل تريد إزالة {count} عنصر محدد؟', + 'packing.confirm.deleteCat': 'هل تريد حذف الفئة "{name}" مع {count} عنصر؟', + 'packing.defaultCategory': 'أخرى', + 'packing.toast.saveError': 'فشل الحفظ', + 'packing.toast.deleteError': 'فشل الحذف', + 'packing.toast.renameError': 'فشلت إعادة التسمية', + 'packing.toast.addError': 'فشلت الإضافة', - // Collab + // Packing suggestions + 'packing.suggestions.items': [ + { name: 'جواز السفر', category: 'المستندات' }, + { name: 'بطاقة الهوية', category: 'المستندات' }, + { name: 'تأمين السفر', category: 'المستندات' }, + { name: 'تذاكر الطيران', category: 'المستندات' }, + { name: 'بطاقة ائتمان', category: 'المالية' }, + { name: 'نقد', category: 'المالية' }, + { name: 'تأشيرة', category: 'المستندات' }, + { name: 'قمصان', category: 'الملابس' }, + { name: 'بنطلونات', category: 'الملابس' }, + { name: 'ملابس داخلية', category: 'الملابس' }, + { name: 'جوارب', category: 'الملابس' }, + { name: 'جاكيت', category: 'الملابس' }, + { name: 'ملابس نوم', category: 'الملابس' }, + { name: 'ملابس سباحة', category: 'الملابس' }, + { name: 'معطف مطر', category: 'الملابس' }, + { name: 'أحذية مريحة', category: 'الملابس' }, + { name: 'فرشاة أسنان', category: 'أدوات العناية' }, + { name: 'معجون أسنان', category: 'أدوات العناية' }, + { name: 'شامبو', category: 'أدوات العناية' }, + { name: 'مزيل عرق', category: 'أدوات العناية' }, + { name: 'واقي شمس', category: 'أدوات العناية' }, + { name: 'شفرة حلاقة', category: 'أدوات العناية' }, + { name: 'شاحن', category: 'الإلكترونيات' }, + { name: 'بطارية محمولة', category: 'الإلكترونيات' }, + { name: 'سماعات', category: 'الإلكترونيات' }, + { name: 'محول سفر', category: 'الإلكترونيات' }, + { name: 'كاميرا', category: 'الإلكترونيات' }, + { name: 'مسكنات ألم', category: 'الصحة' }, + { name: 'لاصقات جروح', category: 'الصحة' }, + { name: 'مطهر', category: 'الصحة' }, + ], + + // Members / Sharing + 'members.shareTrip': 'مشاركة الرحلة', + 'members.inviteUser': 'دعوة مستخدم', + 'members.selectUser': 'اختر مستخدمًا…', + 'members.invite': 'دعوة', + 'members.allHaveAccess': 'جميع المستخدمين لديهم صلاحية الوصول بالفعل.', + 'members.access': 'الصلاحية', + 'members.person': 'شخص', + 'members.persons': 'أشخاص', + 'members.you': 'أنت', + 'members.owner': 'المالك', + 'members.leaveTrip': 'مغادرة الرحلة', + 'members.removeAccess': 'إزالة الصلاحية', + 'members.confirmLeave': 'مغادرة الرحلة؟ ستفقد صلاحية الوصول.', + 'members.confirmRemove': 'إزالة صلاحية هذا المستخدم؟', + 'members.loadError': 'فشل تحميل الأعضاء', + 'members.added': 'تمت الإضافة', + 'members.addError': 'فشلت الإضافة', + 'members.removed': 'تمت إزالة العضو', + 'members.removeError': 'فشلت الإزالة', + + // Categories (Admin) + 'categories.title': 'الفئات', + 'categories.subtitle': 'إدارة فئات الأماكن', + 'categories.new': 'فئة جديدة', + 'categories.empty': 'لا توجد فئات بعد', + 'categories.namePlaceholder': 'اسم الفئة', + 'categories.icon': 'الأيقونة', + 'categories.color': 'اللون', + 'categories.customColor': 'اختيار لون مخصص', + 'categories.preview': 'معاينة', + 'categories.defaultName': 'فئة', + 'categories.update': 'تحديث', + 'categories.create': 'إنشاء', + 'categories.confirm.delete': 'حذف الفئة؟ لن يتم حذف الأماكن التابعة لهذه الفئة.', + 'categories.toast.loadError': 'فشل تحميل الفئات', + 'categories.toast.nameRequired': 'يرجى إدخال اسم', + 'categories.toast.updated': 'تم تحديث الفئة', + 'categories.toast.created': 'تم إنشاء الفئة', + 'categories.toast.saveError': 'فشل الحفظ', + 'categories.toast.deleted': 'تم حذف الفئة', + 'categories.toast.deleteError': 'فشل الحذف', + + // Backup (Admin) + 'backup.title': 'النسخ الاحتياطي', + 'backup.subtitle': 'قاعدة البيانات وجميع الملفات المرفوعة', + 'backup.refresh': 'تحديث', + 'backup.upload': 'رفع نسخة احتياطية', + 'backup.uploading': 'جارٍ الرفع…', + 'backup.create': 'إنشاء نسخة', + 'backup.creating': 'جارٍ الإنشاء…', + 'backup.empty': 'لا توجد نسخ احتياطية بعد', + 'backup.createFirst': 'إنشاء أول نسخة', + 'backup.download': 'تنزيل', + 'backup.restore': 'استعادة', + 'backup.confirm.restore': 'استعادة النسخة "{name}"؟\n\nسيتم استبدال جميع البيانات الحالية بالنسخة.', + 'backup.confirm.uploadRestore': 'رفع واستعادة النسخة "{name}"؟\n\nسيتم الكتابة فوق جميع البيانات الحالية.', + 'backup.confirm.delete': 'حذف النسخة "{name}"؟', + 'backup.toast.loadError': 'فشل تحميل النسخ الاحتياطية', + 'backup.toast.created': 'تم إنشاء النسخة الاحتياطية بنجاح', + 'backup.toast.createError': 'فشل إنشاء النسخة', + 'backup.toast.restored': 'تمت الاستعادة. ستُعاد تحميل الصفحة…', + 'backup.toast.restoreError': 'فشلت الاستعادة', + 'backup.toast.uploadError': 'فشل الرفع', + 'backup.toast.deleted': 'تم حذف النسخة', + 'backup.toast.deleteError': 'فشل الحذف', + 'backup.toast.downloadError': 'فشل التنزيل', + 'backup.toast.settingsSaved': 'تم حفظ إعدادات النسخ الاحتياطي التلقائي', + 'backup.toast.settingsError': 'فشل حفظ الإعدادات', + 'backup.auto.title': 'النسخ الاحتياطي التلقائي', + 'backup.auto.subtitle': 'نسخ احتياطي تلقائي وفق جدول زمني', + 'backup.auto.enable': 'تفعيل النسخ التلقائي', + 'backup.auto.enableHint': 'سيتم إنشاء نسخ احتياطية تلقائيًا وفق الجدول المختار', + 'backup.auto.interval': 'الفترة', + 'backup.auto.keepLabel': 'حذف النسخ القديمة بعد', + 'backup.interval.hourly': 'كل ساعة', + 'backup.interval.daily': 'يوميًا', + 'backup.interval.weekly': 'أسبوعيًا', + 'backup.interval.monthly': 'شهريًا', + 'backup.keep.1day': 'يوم واحد', + 'backup.keep.3days': '3 أيام', + 'backup.keep.7days': '7 أيام', + 'backup.keep.14days': '14 يومًا', + 'backup.keep.30days': '30 يومًا', + 'backup.keep.forever': 'الاحتفاظ للأبد', + + // Photos + 'photos.allDays': 'كل الأيام', + 'photos.noPhotos': 'لا توجد صور بعد', + 'photos.uploadHint': 'ارفع صور رحلتك', + 'photos.clickToSelect': 'أو انقر للاختيار', + 'photos.linkPlace': 'ربط بمكان', + 'photos.noPlace': 'بلا مكان', + 'photos.uploadN': 'رفع {n} صورة', + + // Backup restore modal + 'backup.restoreConfirmTitle': 'استعادة النسخة الاحتياطية؟', + 'backup.restoreWarning': 'سيتم استبدال جميع البيانات الحالية (الرحلات، الأماكن، المستخدمون، المرفوعات) بالنسخة نهائيًا. لا يمكن التراجع عن ذلك.', + 'backup.restoreTip': 'نصيحة: أنشئ نسخة احتياطية للحالة الحالية قبل الاستعادة.', + 'backup.restoreConfirm': 'نعم، استعادة', + + // PDF + 'pdf.travelPlan': 'خطة السفر', + 'pdf.planned': 'مخطط', + 'pdf.costLabel': 'التكلفة EUR', + 'pdf.preview': 'معاينة PDF', + 'pdf.saveAsPdf': 'حفظ كـ PDF', + + // Planner + 'planner.places': 'الأماكن', + 'planner.bookings': 'الحجوزات', + 'planner.packingList': 'قائمة التجهيز', + 'planner.documents': 'المستندات', + 'planner.dayPlan': 'خطة اليوم', + 'planner.reservations': 'الحجوزات', + 'planner.minTwoPlaces': 'يلزم مكانان على الأقل مع إحداثيات', + 'planner.noGeoPlaces': 'لا توجد أماكن بإحداثيات', + 'planner.routeCalculated': 'تم حساب المسار', + 'planner.routeCalcFailed': 'تعذر حساب المسار', + 'planner.routeError': 'خطأ أثناء حساب المسار', + 'planner.routeOptimized': 'تم تحسين المسار', + 'planner.reservationUpdated': 'تم تحديث الحجز', + 'planner.reservationAdded': 'تمت إضافة الحجز', + 'planner.confirmDeleteReservation': 'حذف الحجز؟', + 'planner.reservationDeleted': 'تم حذف الحجز', + 'planner.days': 'الأيام', + 'planner.allPlaces': 'كل الأماكن', + 'planner.totalPlaces': 'إجمالي {n} أماكن', + 'planner.noDaysPlanned': 'لا توجد أيام مخططة بعد', + 'planner.editTrip': 'تعديل الرحلة ←', + 'planner.placeOne': 'مكان واحد', + 'planner.placeN': '{n} أماكن', + 'planner.addNote': 'إضافة ملاحظة', + 'planner.noEntries': 'لا توجد عناصر لهذا اليوم', + 'planner.addPlace': 'إضافة مكان/نشاط', + 'planner.addPlaceShort': '+ إضافة مكان/نشاط', + 'planner.resPending': 'حجز قيد الانتظار · ', + 'planner.resConfirmed': 'حجز مؤكد · ', + 'planner.notePlaceholder': 'ملاحظة…', + 'planner.noteTimePlaceholder': 'الوقت (اختياري)', + 'planner.noteExamplePlaceholder': 'مثال: S3 الساعة 14:30 من المحطة المركزية، عبّارة من الرصيف 7، استراحة غداء…', + 'planner.totalCost': 'إجمالي التكلفة', + 'planner.searchPlaces': 'ابحث عن أماكن…', + 'planner.allCategories': 'كل الفئات', + 'planner.noPlacesFound': 'لم يتم العثور على أماكن', + 'planner.addFirstPlace': 'أضف أول مكان', + 'planner.noReservations': 'لا توجد حجوزات', + 'planner.addFirstReservation': 'أضف أول حجز', + 'planner.new': 'جديد', + 'planner.addToDay': '+ يوم', + 'planner.calculating': 'جارٍ الحساب…', + 'planner.route': 'المسار', + 'planner.optimize': 'تحسين', + 'planner.openGoogleMaps': 'فتح في Google Maps', + 'planner.selectDayHint': 'اختر يومًا من القائمة اليسرى لعرض خطة اليوم', + 'planner.noPlacesForDay': 'لا توجد أماكن لهذا اليوم بعد', + 'planner.addPlacesLink': 'إضافة أماكن ←', + 'planner.minTotal': 'دقيقة إجمالًا', + 'planner.noReservation': 'لا يوجد حجز', + 'planner.removeFromDay': 'إزالة من اليوم', + 'planner.addToThisDay': 'إضافة إلى اليوم', + 'planner.overview': 'نظرة عامة', + 'planner.noDays': 'لا توجد أيام بعد', + 'planner.editTripToAddDays': 'عدّل الرحلة لإضافة أيام', + 'planner.dayCount': '{n} أيام', + 'planner.clickToUnlock': 'انقر لفتح القفل', + 'planner.keepPosition': 'الحفاظ على الموضع أثناء تحسين المسار', + 'planner.dayDetails': 'تفاصيل اليوم', + 'planner.dayN': 'اليوم {n}', + + // Dashboard Stats + 'stats.countries': 'الدول', + 'stats.cities': 'المدن', + 'stats.trips': 'الرحلات', + 'stats.places': 'الأماكن', + 'stats.worldProgress': 'التقدم حول العالم', + 'stats.visited': 'تمت زيارتها', + 'stats.remaining': 'المتبقية', + 'stats.visitedCountries': 'الدول التي تمت زيارتها', + + // Day Detail Panel + 'day.precipProb': 'احتمال هطول الأمطار', + 'day.precipitation': 'الهطول', + 'day.wind': 'الرياح', + 'day.sunrise': 'شروق الشمس', + 'day.sunset': 'غروب الشمس', + 'day.hourlyForecast': 'التوقعات بالساعة', + 'day.climateHint': 'متوسطات تاريخية — التوقعات الفعلية متاحة خلال 16 يومًا من هذا التاريخ.', + 'day.noWeather': 'لا تتوفر بيانات طقس. أضف مكانًا بإحداثيات.', + 'day.overview': 'ملخص اليوم', + 'day.accommodation': 'الإقامة', + 'day.addAccommodation': 'إضافة إقامة', + 'day.hotelDayRange': 'تطبيق على الأيام', + 'day.noPlacesForHotel': 'أضف أماكن إلى رحلتك أولًا', + 'day.allDays': 'الكل', + 'day.checkIn': 'تسجيل الوصول', + 'day.checkOut': 'تسجيل المغادرة', + 'day.confirmation': 'التأكيد', + 'day.editAccommodation': 'تعديل الإقامة', + 'day.reservations': 'الحجوزات', + + // Collab Addon 'collab.tabs.chat': 'الدردشة', 'collab.tabs.notes': 'الملاحظات', 'collab.tabs.polls': 'الاستطلاعات', @@ -773,6 +1162,7 @@ const ar: Record = { 'collab.notes.categorySettings': 'إدارة الفئات', 'collab.notes.create': 'إنشاء', 'collab.notes.website': 'الموقع الإلكتروني', + 'collab.notes.websitePlaceholder': 'https://...', 'collab.notes.attachFiles': 'إرفاق ملفات', 'collab.notes.noCategoriesYet': 'لا توجد فئات بعد', 'collab.notes.emptyDesc': 'أنشئ ملاحظة للبدء', diff --git a/client/src/i18n/translations/es.ts b/client/src/i18n/translations/es.ts index 16e39d2..cf913d5 100644 --- a/client/src/i18n/translations/es.ts +++ b/client/src/i18n/translations/es.ts @@ -558,7 +558,6 @@ const es: Record = { 'trip.tabs.packing': 'Lista de equipaje', 'trip.tabs.packingShort': 'Equipaje', 'trip.tabs.budget': 'Presupuesto', - 'trip.tabs.memories': 'Recuerdos', 'trip.tabs.files': 'Archivos', 'trip.loading': 'Cargando viaje...', 'trip.mobilePlan': 'Plan', @@ -940,39 +939,11 @@ const es: Record = { // Photos 'photos.allDays': 'Todos los días', - 'photos.title': 'Recuerdos', 'photos.noPhotos': 'Aún no hay fotos', 'photos.uploadHint': 'Sube y organiza las fotos compartidas de este viaje', 'photos.clickToSelect': 'o haz clic para seleccionar', - 'photos.dropHere': 'Suelta aquí las fotos...', - 'photos.dropTitle': 'Suelta aquí las fotos', - 'photos.fileHint': 'JPG, PNG, GIF, WebP · máx. 10 MB · hasta 30 fotos', - 'photos.selectedCount': '{count} foto(s) seleccionada(s)', - 'photos.sharedAlbum': '{count} recuerdos en este álbum compartido', - 'photos.sharedAlbumFor': '{count} recuerdos en {trip}', - 'photos.allPlaces': 'Todos los lugares', - 'photos.view.grid': 'Cuadrícula', - 'photos.view.day': 'Por día', - 'photos.view.place': 'Por lugar', - 'photos.stats.total': 'Fotos', - 'photos.stats.days': 'Días', - 'photos.stats.places': 'Lugares', - 'photos.stats.latest': 'Última subida', - 'photos.sectionCount': '{count} foto(s)', - 'photos.ungrouped': 'Sin clasificar', - 'photos.featured': 'Recuerdo destacado', - 'photos.coverFallback': 'Portada del álbum compartido', - 'photos.coverHint': 'Una imagen destacada para este álbum de viaje', - 'photos.mapTitle': 'Mapa de recuerdos', - 'photos.mapHint': 'Explora los lugares vinculados en el mismo mapa que usamos en el plan', - 'photos.mapEmpty': 'Vincula tus fotos a lugares para verlas ubicadas en el mapa.', - 'photos.linkDay': 'Vincular día', - 'photos.noDay': 'Sin día', 'photos.linkPlace': 'Vincular lugar', 'photos.noPlace': 'Sin lugar', - 'photos.captionLabel': 'Pie de foto (para todas)', - 'photos.captionPlaceholder': 'Pie de foto opcional...', - 'photos.addCaption': 'Añadir un pie de foto...', 'photos.uploadN': 'Subida de {n} foto(s)', 'admin.addons.catalog.memories.name': 'Recuerdos', 'admin.addons.catalog.memories.description': 'Álbumes de fotos compartidos para cada viaje', @@ -1063,9 +1034,6 @@ const es: Record = { 'planner.keepPosition': 'Mantener posición durante la optimización de ruta', 'planner.dayDetails': 'Detalles del día', 'planner.dayN': 'Día {n}', - 'planner.notes': 'Notas', - 'planner.addDayNote': 'Añadir notas para este día...', - // Dashboard Stats 'stats.countries': 'Países', 'stats.cities': 'Ciudades',