mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-22 23:01:48 +00:00
c0b5d941dd
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': 'Perjalananku',
|
||
'dashboard.subtitle.loading': 'Memuat perjalanan...',
|
||
'dashboard.subtitle.trips': '{count} perjalanan ({archived} diarsipkan)',
|
||
'dashboard.subtitle.empty': 'Mulai perjalanan pertamamu',
|
||
'dashboard.subtitle.activeOne': '{count} perjalanan aktif',
|
||
'dashboard.subtitle.activeMany': '{count} perjalanan aktif',
|
||
'dashboard.subtitle.archivedSuffix': ' · {count} diarsipkan',
|
||
'dashboard.newTrip': 'Perjalanan Baru',
|
||
'dashboard.newTripSub': 'Rencanakan perjalanan baru dari awal',
|
||
'dashboard.gridView': 'Tampilan grid',
|
||
'dashboard.listView': 'Tampilan daftar',
|
||
'dashboard.currency': 'Mata uang',
|
||
'dashboard.timezone': 'Zona waktu',
|
||
'dashboard.localTime': 'Lokal',
|
||
'dashboard.timezoneCustomTitle': 'Zona Waktu Kustom',
|
||
'dashboard.timezoneCustomLabelPlaceholder': 'Label (opsional)',
|
||
'dashboard.timezoneCustomTzPlaceholder': 'mis. America/New_York',
|
||
'dashboard.timezoneCustomAdd': 'Tambah',
|
||
'dashboard.timezoneCustomErrorEmpty': 'Masukkan pengenal zona waktu',
|
||
'dashboard.timezoneCustomErrorInvalid': 'Zona waktu tidak valid. Gunakan format seperti Europe/Berlin',
|
||
'dashboard.timezoneCustomErrorDuplicate': 'Sudah ditambahkan',
|
||
'dashboard.emptyTitle': 'Belum ada perjalanan',
|
||
'dashboard.emptyText': 'Buat perjalanan pertamamu dan mulai merencanakan!',
|
||
'dashboard.emptyButton': 'Buat Perjalanan Pertama',
|
||
'dashboard.nextTrip': 'Perjalanan Berikutnya',
|
||
'dashboard.shared': 'Dibagikan',
|
||
'dashboard.sharedBy': 'Dibagikan oleh {name}',
|
||
'dashboard.days': 'Hari',
|
||
'dashboard.places': 'Tempat',
|
||
'dashboard.members': 'Teman perjalanan',
|
||
'dashboard.archive': 'Arsipkan',
|
||
'dashboard.copyTrip': 'Salin',
|
||
'dashboard.copySuffix': 'salinan',
|
||
'dashboard.restore': 'Pulihkan',
|
||
'dashboard.archived': 'Diarsipkan',
|
||
'dashboard.status.ongoing': 'Sedang berlangsung',
|
||
'dashboard.status.today': 'Hari ini',
|
||
'dashboard.status.tomorrow': 'Besok',
|
||
'dashboard.status.past': 'Sudah lewat',
|
||
'dashboard.status.daysLeft': '{count} hari lagi',
|
||
'dashboard.toast.loadError': 'Gagal memuat perjalanan',
|
||
'dashboard.loadErrorBanner': 'Tidak dapat terhubung ke server. Perjalananmu aman — silakan coba lagi.',
|
||
'dashboard.retry': 'Coba lagi',
|
||
'dashboard.toast.created': 'Perjalanan berhasil dibuat!',
|
||
'dashboard.toast.createError': 'Gagal membuat perjalanan',
|
||
'dashboard.toast.updated': 'Perjalanan diperbarui!',
|
||
'dashboard.toast.updateError': 'Gagal memperbarui perjalanan',
|
||
'dashboard.toast.deleted': 'Perjalanan dihapus',
|
||
'dashboard.toast.deleteError': 'Gagal menghapus perjalanan',
|
||
'dashboard.toast.archived': 'Perjalanan diarsipkan',
|
||
'dashboard.toast.archiveError': 'Gagal mengarsipkan perjalanan',
|
||
'dashboard.toast.restored': 'Perjalanan dipulihkan',
|
||
'dashboard.toast.restoreError': 'Gagal memulihkan perjalanan',
|
||
'dashboard.toast.copied': 'Perjalanan disalin!',
|
||
'dashboard.toast.copyError': 'Gagal menyalin perjalanan',
|
||
'dashboard.confirm.delete': 'Hapus perjalanan "{title}"? Semua tempat dan rencana akan dihapus permanen.',
|
||
'dashboard.editTrip': 'Edit Perjalanan',
|
||
'dashboard.createTrip': 'Buat Perjalanan Baru',
|
||
'dashboard.tripTitle': 'Judul',
|
||
'dashboard.tripTitlePlaceholder': 'mis. Musim Panas di Jepang',
|
||
'dashboard.tripDescription': 'Deskripsi',
|
||
'dashboard.tripDescriptionPlaceholder': 'Perjalanan ini tentang apa?',
|
||
'dashboard.startDate': 'Tanggal Mulai',
|
||
'dashboard.endDate': 'Tanggal Selesai',
|
||
'dashboard.dayCount': 'Jumlah Hari',
|
||
'dashboard.dayCountHint': 'Berapa hari yang ingin direncanakan jika tanggal perjalanan belum diatur.',
|
||
'dashboard.noDateHint': 'Belum ada tanggal — 7 hari default akan dibuat. Bisa diubah kapan saja.',
|
||
'dashboard.coverImage': 'Gambar Sampul',
|
||
'dashboard.addCoverImage': 'Tambah gambar sampul (atau seret & lepas)',
|
||
'dashboard.addMembers': 'Teman perjalanan',
|
||
'dashboard.addMember': 'Tambah anggota',
|
||
'dashboard.coverSaved': 'Gambar sampul tersimpan',
|
||
'dashboard.coverUploadError': 'Gagal mengunggah',
|
||
'dashboard.coverRemoveError': 'Gagal menghapus',
|
||
'dashboard.titleRequired': 'Judul wajib diisi',
|
||
'dashboard.endDateError': 'Tanggal selesai harus setelah tanggal mulai',
|
||
'dashboard.greeting.morning': 'Selamat pagi,',
|
||
'dashboard.greeting.afternoon': 'Selamat siang,',
|
||
'dashboard.greeting.evening': 'Selamat malam,',
|
||
'dashboard.mobile.liveNow': 'Sedang Berlangsung',
|
||
'dashboard.mobile.tripProgress': 'Progres perjalanan',
|
||
'dashboard.mobile.daysLeft': '{count} hari lagi',
|
||
'dashboard.mobile.places': 'Tempat',
|
||
'dashboard.mobile.buddies': 'Teman',
|
||
'dashboard.mobile.newTrip': 'Perjalanan Baru',
|
||
'dashboard.mobile.currency': 'Mata Uang',
|
||
'dashboard.mobile.timezone': 'Zona Waktu',
|
||
'dashboard.mobile.upcomingTrips': 'Perjalanan Mendatang',
|
||
'dashboard.mobile.yourTrips': 'Perjalananmu',
|
||
'dashboard.mobile.trips': 'perjalanan',
|
||
'dashboard.mobile.starts': 'Mulai',
|
||
'dashboard.mobile.duration': 'Durasi',
|
||
'dashboard.mobile.day': 'hari',
|
||
'dashboard.mobile.days': 'hari',
|
||
'dashboard.mobile.ongoing': 'Sedang berlangsung',
|
||
'dashboard.mobile.startsToday': 'Mulai hari ini',
|
||
'dashboard.mobile.tomorrow': 'Besok',
|
||
'dashboard.mobile.inDays': 'Dalam {count} hari',
|
||
'dashboard.mobile.inMonths': 'Dalam {count} bulan',
|
||
'dashboard.mobile.completed': 'Selesai',
|
||
'dashboard.mobile.currencyConverter': 'Konverter Mata Uang',
|
||
'dashboard.filter.planned': 'Direncanakan',
|
||
'dashboard.hero.badgeLive': 'SEDANG BERLANGSUNG',
|
||
'dashboard.hero.badgeToday': 'MULAI HARI INI',
|
||
'dashboard.hero.badgeTomorrow': 'BESOK',
|
||
'dashboard.hero.badgeNext': 'BERIKUTNYA',
|
||
'dashboard.hero.badgeRecent': 'TERBARU',
|
||
'dashboard.hero.tripDates': 'Tanggal perjalanan',
|
||
'dashboard.hero.noDates': 'Tanggal belum diatur',
|
||
'dashboard.hero.travelerOne': '{count} pelancong',
|
||
'dashboard.hero.travelerMany': '{count} pelancong',
|
||
'dashboard.hero.destinationOne': '{count} destinasi',
|
||
'dashboard.hero.destinationMany': '{count} destinasi',
|
||
'dashboard.hero.dayUnitOne': 'hari',
|
||
'dashboard.hero.dayUnitMany': 'hari',
|
||
'dashboard.hero.dayLeft': 'Hari tersisa',
|
||
'dashboard.hero.daysLeft': 'Hari tersisa',
|
||
'dashboard.hero.lastDay': 'Hari terakhir',
|
||
'dashboard.hero.untilStart': 'Hingga mulai',
|
||
'dashboard.hero.startsIn': 'Mulai dalam',
|
||
'dashboard.atlas.countriesVisited': 'Atlas · Negara dikunjungi',
|
||
'dashboard.atlas.ofTotal': 'dari {total}',
|
||
'dashboard.atlas.tripsTotal': 'Total perjalanan',
|
||
'dashboard.atlas.placesMapped': '{count} tempat dipetakan',
|
||
'dashboard.atlas.daysTraveled': 'Hari perjalanan',
|
||
'dashboard.atlas.daysUnit': 'hari',
|
||
'dashboard.atlas.acrossAllTrips': 'di semua perjalanan',
|
||
'dashboard.atlas.distanceFlown': 'Jarak terbang',
|
||
'dashboard.atlas.kmUnit': 'km',
|
||
'dashboard.atlas.aroundEquator': '≈ {count}× keliling khatulistiwa',
|
||
'dashboard.card.idea': 'Ide',
|
||
'dashboard.card.buddyOne': 'Teman',
|
||
'dashboard.fx.from': 'Dari',
|
||
'dashboard.fx.to': 'Ke',
|
||
'dashboard.fx.unavailable': 'Kurs tidak tersedia',
|
||
'dashboard.tz.searchPlaceholder': 'Cari zona waktu…',
|
||
'dashboard.tz.empty': 'Belum ada zona waktu lain — tambahkan dengan +',
|
||
'dashboard.upcoming.title': 'Reservasi mendatang',
|
||
'dashboard.upcoming.empty': 'Belum ada yang dipesan.',
|
||
'dashboard.confirm.copy.title': 'Salin perjalanan ini?',
|
||
'dashboard.confirm.copy.willCopy': 'Akan disalin',
|
||
'dashboard.confirm.copy.will1': 'Hari, tempat & penugasan harian',
|
||
'dashboard.confirm.copy.will2': 'Akomodasi & reservasi',
|
||
'dashboard.confirm.copy.will3': 'Item anggaran & urutan kategori',
|
||
'dashboard.confirm.copy.will4': 'Daftar bawaan (belum dicentang)',
|
||
'dashboard.confirm.copy.will5': 'Tugas (belum ditugaskan & dicentang)',
|
||
'dashboard.confirm.copy.will6': 'Catatan harian',
|
||
'dashboard.confirm.copy.wontCopy': 'Tidak akan disalin',
|
||
'dashboard.confirm.copy.wont1': 'Kolaborator & penugasan anggota',
|
||
'dashboard.confirm.copy.wont2': 'Catatan, jajak pendapat & pesan bersama',
|
||
'dashboard.confirm.copy.wont3': 'Berkas & foto',
|
||
'dashboard.confirm.copy.wont4': 'Token berbagi',
|
||
'dashboard.confirm.copy.confirm': 'Salin perjalanan',
|
||
'dashboard.aria.toggleView': 'Ganti tampilan',
|
||
'dashboard.aria.filter': 'Filter',
|
||
'dashboard.aria.duplicate': 'Duplikat',
|
||
'dashboard.aria.refreshRates': 'Segarkan kurs',
|
||
'dashboard.aria.swapCurrencies': 'Tukar mata uang',
|
||
'dashboard.aria.addTimezone': 'Tambah zona waktu',
|
||
'dashboard.aria.removeTimezone': 'Hapus {city}',
|
||
'dashboard.dayCountRequired': 'Jumlah hari wajib diisi',
|
||
};
|
||
export default dashboard;
|