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.
167 lines
8.4 KiB
TypeScript
167 lines
8.4 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const dashboard: TranslationStrings = {
|
||
'dashboard.title': 'Seyahatlerim',
|
||
'dashboard.subtitle.loading': 'Seyahatler yükleniyor...',
|
||
'dashboard.subtitle.trips': '{count} seyahat ({archived} arşivde)',
|
||
'dashboard.subtitle.empty': 'İlk seyahatinizi başlatın',
|
||
'dashboard.subtitle.activeOne': '{count} etkin seyahat',
|
||
'dashboard.subtitle.activeMany': '{count} etkin seyahat',
|
||
'dashboard.subtitle.archivedSuffix': ' · {count} arşivde',
|
||
'dashboard.newTrip': 'Yeni Seyahat',
|
||
'dashboard.newTripSub': 'Sıfırdan yeni bir seyahat planla',
|
||
'dashboard.gridView': 'Izgara görünümü',
|
||
'dashboard.listView': 'Liste görünümü',
|
||
'dashboard.currency': 'Para birimi',
|
||
'dashboard.timezone': 'Saat dilimleri',
|
||
'dashboard.localTime': 'Yerel',
|
||
'dashboard.timezoneCustomTitle': 'Özel saat dilimi',
|
||
'dashboard.timezoneCustomLabelPlaceholder': 'Etiket (isteğe bağlı)',
|
||
'dashboard.timezoneCustomTzPlaceholder': 'örn. America/New_York',
|
||
'dashboard.timezoneCustomAdd': 'Ekle',
|
||
'dashboard.timezoneCustomErrorEmpty': 'Saat dilimi tanımlayıcısı girin',
|
||
'dashboard.timezoneCustomErrorInvalid': 'Geçersiz saat dilimi. Europe/Berlin gibi bir biçim kullanın',
|
||
'dashboard.timezoneCustomErrorDuplicate': 'Zaten ekli',
|
||
'dashboard.emptyTitle': 'Henüz seyahat yok',
|
||
'dashboard.emptyText': 'İlk seyahatinizi oluşturup planlamaya başlayın!',
|
||
'dashboard.emptyButton': 'İlk Seyahati Oluştur',
|
||
'dashboard.nextTrip': 'Sonraki Seyahat',
|
||
'dashboard.shared': 'Paylaşılan',
|
||
'dashboard.sharedBy': '{name} paylaştı',
|
||
'dashboard.days': 'Günler',
|
||
'dashboard.places': 'Yerler',
|
||
'dashboard.members': 'Arkadaşlar',
|
||
'dashboard.archive': 'Arşivle',
|
||
'dashboard.copyTrip': 'Kopyala',
|
||
'dashboard.copySuffix': 'kopya',
|
||
'dashboard.restore': 'Geri al',
|
||
'dashboard.archived': 'Arşivlendi',
|
||
'dashboard.status.ongoing': 'Devam ediyor',
|
||
'dashboard.status.today': 'Bugün',
|
||
'dashboard.status.tomorrow': 'Yarın',
|
||
'dashboard.status.past': 'Geçmiş',
|
||
'dashboard.status.daysLeft': '{count} gün kaldı',
|
||
'dashboard.toast.loadError': 'Seyahatler yüklenemedi',
|
||
'dashboard.loadErrorBanner': 'Sunucuya ulaşılamadı. Seyahatleriniz güvende — lütfen tekrar deneyin.',
|
||
'dashboard.retry': 'Tekrar dene',
|
||
'dashboard.toast.created': 'Seyahat oluşturuldu!',
|
||
'dashboard.toast.createError': 'Seyahat oluşturulamadı',
|
||
'dashboard.toast.updated': 'Seyahat güncellendi!',
|
||
'dashboard.toast.updateError': 'Seyahat güncellenemedi',
|
||
'dashboard.toast.deleted': 'Seyahat silindi',
|
||
'dashboard.toast.deleteError': 'Seyahat silinemedi',
|
||
'dashboard.toast.archived': 'Seyahat arşivlendi',
|
||
'dashboard.toast.archiveError': 'Arşivlenemedi',
|
||
'dashboard.toast.restored': 'Seyahat geri alındı',
|
||
'dashboard.toast.restoreError': 'Geri alınamadı',
|
||
'dashboard.toast.copied': 'Seyahat kopyalandı!',
|
||
'dashboard.toast.copyError': 'Kopyalanamadı',
|
||
'dashboard.confirm.delete': '"{title}" seyahatini sil? Tüm yerler ve planlar kalıcı olarak silinir.',
|
||
'dashboard.confirm.copy.title': 'Bu seyahat kopyalansın mı?',
|
||
'dashboard.confirm.copy.willCopy': 'Kopyalanacak',
|
||
'dashboard.confirm.copy.will1': 'Günler, yerler ve gün atamaları',
|
||
'dashboard.confirm.copy.will2': 'Konaklama ve rezervasyonlar',
|
||
'dashboard.confirm.copy.will3': 'Bütçe kalemleri ve kategori sırası',
|
||
'dashboard.confirm.copy.will4': 'Paket listeleri (işaretlenmemiş)',
|
||
'dashboard.confirm.copy.will5': 'Yapılacaklar (atanmamış ve işaretlenmemiş)',
|
||
'dashboard.confirm.copy.will6': 'Gün notları',
|
||
'dashboard.confirm.copy.wontCopy': 'Kopyalanmayacak',
|
||
'dashboard.confirm.copy.wont1': 'İşbirlikçiler ve üye atamaları',
|
||
'dashboard.confirm.copy.wont2': 'Collab notları, anketler ve mesajlar',
|
||
'dashboard.confirm.copy.wont3': 'Dosyalar ve fotoğraflar',
|
||
'dashboard.confirm.copy.wont4': 'Paylaşım jetonları',
|
||
'dashboard.confirm.copy.confirm': 'Seyahati kopyala',
|
||
'dashboard.editTrip': 'Seyahati Düzenle',
|
||
'dashboard.createTrip': 'Yeni Seyahat Oluştur',
|
||
'dashboard.tripTitle': 'Başlık',
|
||
'dashboard.tripTitlePlaceholder': 'örn. Japonya yaz tatili',
|
||
'dashboard.tripDescription': 'Açıklama',
|
||
'dashboard.tripDescriptionPlaceholder': 'Bu seyahat ne hakkında?',
|
||
'dashboard.startDate': 'Başlangıç Tarihi',
|
||
'dashboard.endDate': 'Bitiş Tarihi',
|
||
'dashboard.dayCount': 'Gün sayısı',
|
||
'dashboard.dayCountHint': 'Seyahat tarihi yoksa kaç gün planlanacağı.',
|
||
'dashboard.noDateHint': 'Tarih yok — varsayılan 7 gün oluşturulur. İstediğiniz zaman değiştirebilirsiniz.',
|
||
'dashboard.coverImage': 'Kapak Görseli',
|
||
'dashboard.addCoverImage': 'Kapak ekle (sürükleyip bırakabilirsiniz)',
|
||
'dashboard.addMembers': 'Seyahat arkadaşları',
|
||
'dashboard.addMember': 'Üye ekle',
|
||
'dashboard.coverSaved': 'Kapak kaydedildi',
|
||
'dashboard.coverUploadError': 'Yüklenemedi',
|
||
'dashboard.coverRemoveError': 'Kaldırılamadı',
|
||
'dashboard.titleRequired': 'Başlık gerekli',
|
||
'dashboard.endDateError': 'Bitiş tarihi başlangıçtan sonra olmalı',
|
||
'dashboard.greeting.morning': 'Günaydın,',
|
||
'dashboard.greeting.afternoon': 'İyi günler,',
|
||
'dashboard.greeting.evening': 'İyi akşamlar,',
|
||
'dashboard.mobile.liveNow': 'Canlı',
|
||
'dashboard.mobile.tripProgress': 'Seyahat ilerlemesi',
|
||
'dashboard.mobile.daysLeft': '{count} gün kaldı',
|
||
'dashboard.mobile.places': 'Yerler',
|
||
'dashboard.mobile.buddies': 'Arkadaşlar',
|
||
'dashboard.mobile.newTrip': 'Yeni Seyahat',
|
||
'dashboard.mobile.currency': 'Para birimi',
|
||
'dashboard.mobile.timezone': 'Saat dilimi',
|
||
'dashboard.mobile.upcomingTrips': 'Yaklaşan Seyahatler',
|
||
'dashboard.mobile.yourTrips': 'Seyahatleriniz',
|
||
'dashboard.mobile.trips': 'seyahat',
|
||
'dashboard.mobile.starts': 'Başlıyor',
|
||
'dashboard.mobile.duration': 'Süre',
|
||
'dashboard.mobile.day': 'gün',
|
||
'dashboard.mobile.days': 'gün',
|
||
'dashboard.mobile.ongoing': 'Devam ediyor',
|
||
'dashboard.mobile.startsToday': 'Bugün başlıyor',
|
||
'dashboard.mobile.tomorrow': 'Yarın',
|
||
'dashboard.mobile.inDays': '{count} gün içinde',
|
||
'dashboard.mobile.inMonths': '{count} ay içinde',
|
||
'dashboard.mobile.completed': 'Tamamlandı',
|
||
'dashboard.mobile.currencyConverter': 'Döviz çevirici',
|
||
'dashboard.filter.planned': 'Planlanan',
|
||
'dashboard.hero.badgeLive': 'ŞİMDİ CANLI',
|
||
'dashboard.hero.badgeToday': 'BUGÜN BAŞLIYOR',
|
||
'dashboard.hero.badgeTomorrow': 'YARIN',
|
||
'dashboard.hero.badgeNext': 'SIRADAKİ',
|
||
'dashboard.hero.badgeRecent': 'YAKIN ZAMANDA',
|
||
'dashboard.hero.tripDates': 'Gezi tarihleri',
|
||
'dashboard.hero.noDates': 'Tarih ayarlanmadı',
|
||
'dashboard.hero.travelerOne': '{count} gezgin',
|
||
'dashboard.hero.travelerMany': '{count} gezgin',
|
||
'dashboard.hero.destinationOne': '{count} varış noktası',
|
||
'dashboard.hero.destinationMany': '{count} varış noktası',
|
||
'dashboard.hero.dayUnitOne': 'gün',
|
||
'dashboard.hero.dayUnitMany': 'gün',
|
||
'dashboard.hero.dayLeft': 'gün kaldı',
|
||
'dashboard.hero.daysLeft': 'gün kaldı',
|
||
'dashboard.hero.lastDay': 'Son gün',
|
||
'dashboard.hero.untilStart': 'Başlangıca',
|
||
'dashboard.hero.startsIn': 'Başlamasına',
|
||
'dashboard.atlas.countriesVisited': 'Atlas · Gezilen ülkeler',
|
||
'dashboard.atlas.ofTotal': '/ {total}',
|
||
'dashboard.atlas.tripsTotal': 'Toplam gezi',
|
||
'dashboard.atlas.placesMapped': '{count} yer haritalandı',
|
||
'dashboard.atlas.daysTraveled': 'Seyahat günleri',
|
||
'dashboard.atlas.daysUnit': 'gün',
|
||
'dashboard.atlas.acrossAllTrips': 'tüm gezilerde',
|
||
'dashboard.atlas.distanceFlown': 'Uçulan mesafe',
|
||
'dashboard.atlas.kmUnit': 'km',
|
||
'dashboard.atlas.aroundEquator': '≈ ekvatorun {count}× çevresi',
|
||
'dashboard.card.idea': 'Fikir',
|
||
'dashboard.card.buddyOne': 'Arkadaş',
|
||
'dashboard.fx.from': 'Kaynak',
|
||
'dashboard.fx.to': 'Hedef',
|
||
'dashboard.fx.unavailable': 'Kur kullanılamıyor',
|
||
'dashboard.tz.searchPlaceholder': 'Saat dilimi ara…',
|
||
'dashboard.tz.empty': 'Henüz başka saat dilimi yok — + ile bir tane ekleyin',
|
||
'dashboard.upcoming.title': 'Yaklaşan rezervasyonlar',
|
||
'dashboard.upcoming.empty': 'Henüz bir şey rezerve edilmedi.',
|
||
'dashboard.aria.toggleView': 'Görünümü değiştir',
|
||
'dashboard.aria.filter': 'Filtrele',
|
||
'dashboard.aria.duplicate': 'Çoğalt',
|
||
'dashboard.aria.refreshRates': 'Kurları yenile',
|
||
'dashboard.aria.swapCurrencies': 'Para birimlerini değiştir',
|
||
'dashboard.aria.addTimezone': 'Saat dilimi ekle',
|
||
'dashboard.aria.removeTimezone': '{city} kaldır',
|
||
'dashboard.dayCountRequired': 'Gün sayısı gereklidir',
|
||
};
|
||
export default dashboard;
|