Files
TREK/shared/src/i18n/ar/dashboard.ts
T
Maurice ebbbf91d60 fix(dashboard): show an error instead of a blank trip list when the server is unreachable (#1283)
When the backend or identity provider was unreachable, a returning user with a
persisted session landed on the dashboard with an empty trip grid and no error.
That looks identical to a logged-in user who simply has no trips, so people
assumed their data had been lost.

Three client-side layers were quietly swallowing the failure: the auth check
only cleared state on a 401, so a 5xx or a network error left the stale session
in place and kept rendering the protected route; the offline-first trip repo
turned a failed fetch into the empty cache without throwing; and the dashboard
had neither an error nor an empty state, so a blank grid meant both "outage" and
"no trips".

The auth check now tells genuine offline (keep serving the cache silently, the
PWA happy path) apart from a server outage while online (keep the session but
flag it). The dashboard shows a reassuring "couldn't reach the server, your
trips are safe" banner with a retry, and a real zero-trip account finally gets a
proper empty state so the two cases never look alike. New strings added across
all locales.
2026-06-23 21:23:39 +02:00

167 lines
9.6 KiB
TypeScript

import type { TranslationStrings } from '../types';
const dashboard: TranslationStrings = {
'dashboard.title': 'رحلاتي',
'dashboard.subtitle.loading': 'جارٍ تحميل الرحلات...',
'dashboard.subtitle.trips': '{count} رحلة ({archived} مؤرشفة)',
'dashboard.subtitle.empty': 'ابدأ رحلتك الأولى',
'dashboard.subtitle.activeOne': '{count} رحلة نشطة',
'dashboard.subtitle.activeMany': '{count} رحلات نشطة',
'dashboard.subtitle.archivedSuffix': ' · {count} مؤرشفة',
'dashboard.newTrip': 'رحلة جديدة',
'dashboard.newTripSub': 'خطّط لرحلة جديدة من الصفر',
'dashboard.gridView': 'عرض شبكي',
'dashboard.listView': 'عرض قائمة',
'dashboard.currency': 'العملة',
'dashboard.timezone': 'المناطق الزمنية',
'dashboard.localTime': 'المحلي',
'dashboard.timezoneCustomTitle': 'منطقة زمنية مخصصة',
'dashboard.timezoneCustomLabelPlaceholder': 'الاسم (اختياري)',
'dashboard.timezoneCustomTzPlaceholder': 'مثال: Asia/Riyadh',
'dashboard.timezoneCustomAdd': 'إضافة',
'dashboard.timezoneCustomErrorEmpty': 'أدخل معرّف منطقة زمنية',
'dashboard.timezoneCustomErrorInvalid': 'منطقة زمنية غير صالحة. استخدم صيغة مثل Asia/Riyadh',
'dashboard.timezoneCustomErrorDuplicate': 'مضافة بالفعل',
'dashboard.emptyTitle': 'لا توجد رحلات بعد',
'dashboard.emptyText': 'أنشئ رحلتك الأولى وابدأ التخطيط',
'dashboard.emptyButton': 'إنشاء أول رحلة',
'dashboard.nextTrip': 'الرحلة القادمة',
'dashboard.shared': 'مشتركة',
'dashboard.sharedBy': 'شاركها {name}',
'dashboard.days': 'الأيام',
'dashboard.places': 'الأماكن',
'dashboard.members': 'ال חברים',
'dashboard.archive': 'أرشفة',
'dashboard.copyTrip': 'نسخ',
'dashboard.copySuffix': 'نسخة',
'dashboard.restore': 'استعادة',
'dashboard.archived': 'مؤرشفة',
'dashboard.status.ongoing': 'جارية',
'dashboard.status.today': 'اليوم',
'dashboard.status.tomorrow': 'غدًا',
'dashboard.status.past': 'منتهية',
'dashboard.status.daysLeft': 'متبقي {count} يوم',
'dashboard.toast.loadError': 'فشل تحميل الرحلات',
'dashboard.loadErrorBanner': 'تعذّر الوصول إلى الخادم. رحلاتك في أمان — يرجى المحاولة مرة أخرى.',
'dashboard.retry': 'إعادة المحاولة',
'dashboard.toast.created': 'تم إنشاء الرحلة بنجاح',
'dashboard.toast.createError': 'فشل إنشاء الرحلة',
'dashboard.toast.updated': 'تم تحديث الرحلة',
'dashboard.toast.updateError': 'فشل تحديث الرحلة',
'dashboard.toast.deleted': 'تم حذف الرحلة',
'dashboard.toast.deleteError': 'فشل حذف الرحلة',
'dashboard.toast.archived': 'تمت أرشفة الرحلة',
'dashboard.toast.archiveError': 'فشل الأرشفة',
'dashboard.toast.restored': 'تمت استعادة الرحلة',
'dashboard.toast.restoreError': 'فشل الاستعادة',
'dashboard.toast.copied': 'تم نسخ الرحلة!',
'dashboard.toast.copyError': 'فشل نسخ الرحلة',
'dashboard.confirm.delete': 'حذف الرحلة "{title}"؟ سيتم حذف جميع الأماكن والخطط نهائيًا.',
'dashboard.editTrip': 'تعديل الرحلة',
'dashboard.createTrip': 'إنشاء رحلة جديدة',
'dashboard.tripTitle': 'العنوان',
'dashboard.tripTitlePlaceholder': 'مثال: صيف في اليابان',
'dashboard.tripDescription': 'الوصف',
'dashboard.tripDescriptionPlaceholder': 'عمّ تتحدث هذه الرحلة؟',
'dashboard.startDate': 'تاريخ البداية',
'dashboard.endDate': 'تاريخ النهاية',
'dashboard.dayCount': 'عدد الأيام',
'dashboard.dayCountHint': 'عدد الأيام المراد التخطيط لها عندما لا يتم تحديد تواريخ السفر.',
'dashboard.noDateHint': 'لا يوجد تاريخ محدد. سيتم إنشاء 7 أيام افتراضية ويمكنك تغيير ذلك لاحقًا.',
'dashboard.coverImage': 'صورة الغلاف',
'dashboard.addCoverImage': 'إضافة صورة غلاف',
'dashboard.addMembers': 'رفاق السفر',
'dashboard.addMember': 'إضافة عضو',
'dashboard.coverSaved': 'تم حفظ صورة الغلاف',
'dashboard.coverUploadError': 'فشل الرفع',
'dashboard.coverRemoveError': 'فشل الإزالة',
'dashboard.titleRequired': 'العنوان مطلوب',
'dashboard.endDateError': 'يجب أن يكون تاريخ النهاية بعد البداية',
'dashboard.filter.planned': 'مخطط لها',
'dashboard.hero.badgeLive': 'مباشر الآن',
'dashboard.hero.badgeToday': 'تبدأ اليوم',
'dashboard.hero.badgeTomorrow': 'غدًا',
'dashboard.hero.badgeNext': 'التالية',
'dashboard.hero.badgeRecent': 'مؤخرًا',
'dashboard.hero.tripDates': 'تواريخ الرحلة',
'dashboard.hero.noDates': 'لا توجد تواريخ',
'dashboard.hero.travelerOne': '{count} مسافر',
'dashboard.hero.travelerMany': '{count} مسافرين',
'dashboard.hero.destinationOne': '{count} وجهة',
'dashboard.hero.destinationMany': '{count} وجهات',
'dashboard.hero.dayUnitOne': 'يوم',
'dashboard.hero.dayUnitMany': 'أيام',
'dashboard.hero.dayLeft': 'بقي يوم',
'dashboard.hero.daysLeft': 'الأيام المتبقية',
'dashboard.hero.lastDay': 'اليوم الأخير',
'dashboard.hero.untilStart': 'حتى البداية',
'dashboard.hero.startsIn': 'تبدأ الرحلة بعد',
'dashboard.atlas.countriesVisited': 'أطلس · الدول المُزارة',
'dashboard.atlas.ofTotal': 'من {total}',
'dashboard.atlas.tripsTotal': 'إجمالي الرحلات',
'dashboard.atlas.placesMapped': '{count} مكان على الخريطة',
'dashboard.atlas.daysTraveled': 'أيام السفر',
'dashboard.atlas.daysUnit': 'أيام',
'dashboard.atlas.acrossAllTrips': 'عبر جميع الرحلات',
'dashboard.atlas.distanceFlown': 'المسافة المقطوعة جوًا',
'dashboard.atlas.kmUnit': 'km',
'dashboard.atlas.aroundEquator': '≈ {count}× حول خط الاستواء',
'dashboard.card.idea': 'فكرة',
'dashboard.card.buddyOne': 'رفيق',
'dashboard.fx.from': 'من',
'dashboard.fx.to': 'إلى',
'dashboard.fx.unavailable': 'السعر غير متاح',
'dashboard.tz.searchPlaceholder': 'ابحث عن منطقة زمنية…',
'dashboard.tz.empty': 'لا توجد مناطق زمنية أخرى بعد — أضف واحدة بالزر +',
'dashboard.upcoming.title': 'الحجوزات القادمة',
'dashboard.upcoming.empty': 'لا شيء محجوز بعد.',
'dashboard.confirm.copy.title': 'نسخ هذه الرحلة؟',
'dashboard.confirm.copy.willCopy': 'سيتم نسخه',
'dashboard.confirm.copy.will1': 'الأيام والأماكن وتوزيعات اليوم',
'dashboard.confirm.copy.will2': 'أماكن الإقامة والحجوزات',
'dashboard.confirm.copy.will3': 'بنود الميزانية وترتيب الفئات',
'dashboard.confirm.copy.will4': 'قوائم الأمتعة (غير محددة)',
'dashboard.confirm.copy.will5': 'المهام (غير معيّنة وغير محددة)',
'dashboard.confirm.copy.will6': 'ملاحظات اليوم',
'dashboard.confirm.copy.wontCopy': 'لن يتم نسخه',
'dashboard.confirm.copy.wont1': 'المتعاونون وتعيينات الأعضاء',
'dashboard.confirm.copy.wont2': 'الملاحظات والاستطلاعات والرسائل المشتركة',
'dashboard.confirm.copy.wont3': 'الملفات والصور',
'dashboard.confirm.copy.wont4': 'رموز المشاركة',
'dashboard.confirm.copy.confirm': 'نسخ الرحلة',
'dashboard.greeting.morning': 'صباح الخير،',
'dashboard.greeting.afternoon': 'مساء الخير،',
'dashboard.greeting.evening': 'مساء الخير،',
'dashboard.mobile.liveNow': 'مباشر الآن',
'dashboard.mobile.tripProgress': 'تقدّم الرحلة',
'dashboard.mobile.daysLeft': 'بقي {count} يوم',
'dashboard.mobile.places': 'الأماكن',
'dashboard.mobile.buddies': 'الرفاق',
'dashboard.mobile.newTrip': 'رحلة جديدة',
'dashboard.mobile.currency': 'العملة',
'dashboard.mobile.timezone': 'المنطقة الزمنية',
'dashboard.mobile.upcomingTrips': 'الرحلات القادمة',
'dashboard.mobile.yourTrips': 'رحلاتك',
'dashboard.mobile.trips': 'رحلات',
'dashboard.mobile.starts': 'تبدأ',
'dashboard.mobile.duration': 'المدة',
'dashboard.mobile.day': 'يوم',
'dashboard.mobile.days': 'أيام',
'dashboard.mobile.ongoing': 'جارية',
'dashboard.mobile.startsToday': 'تبدأ اليوم',
'dashboard.mobile.tomorrow': 'غدًا',
'dashboard.mobile.inDays': 'خلال {count} يوم',
'dashboard.mobile.inMonths': 'خلال {count} شهر',
'dashboard.mobile.completed': 'مكتملة',
'dashboard.mobile.currencyConverter': 'محوّل العملات',
'dashboard.aria.toggleView': 'تبديل العرض',
'dashboard.aria.filter': 'تصفية',
'dashboard.aria.duplicate': 'تكرار',
'dashboard.aria.refreshRates': 'تحديث الأسعار',
'dashboard.aria.swapCurrencies': 'تبديل العملات',
'dashboard.aria.addTimezone': 'إضافة منطقة زمنية',
'dashboard.aria.removeTimezone': 'إزالة {city}',
'dashboard.dayCountRequired': 'عدد الأيام مطلوب',
};
export default dashboard;