diff --git a/client/src/i18n/translations/id.ts b/client/src/i18n/translations/id.ts index 2cb895a1..e6bb27f5 100644 --- a/client/src/i18n/translations/id.ts +++ b/client/src/i18n/translations/id.ts @@ -1,1703 +1,2181 @@ -const en: Record = { +const id: Record = { // Common - 'common.save': 'Save', - 'common.cancel': 'Cancel', - 'common.delete': 'Delete', - 'common.edit': 'Edit', - 'common.add': 'Add', - 'common.loading': 'Loading...', - 'common.import': 'Import', - 'common.error': 'Error', - 'common.back': 'Back', - 'common.all': 'All', - 'common.close': 'Close', - 'common.open': 'Open', - 'common.upload': 'Upload', - 'common.search': 'Search', - 'common.confirm': 'Confirm', + 'common.save': 'Simpan', + 'common.showMore': 'Tampilkan lebih banyak', + 'common.showLess': 'Tampilkan lebih sedikit', + 'common.cancel': 'Batal', + 'common.delete': 'Hapus', + 'common.edit': 'Sunting', + 'common.add': 'Tambah', + 'common.loading': 'Memuat...', + 'common.import': 'Impor', + 'common.error': 'Kesalahan', + 'common.unknownError': 'Kesalahan tidak diketahui', + 'common.tooManyAttempts': 'Terlalu banyak percobaan. Coba lagi nanti.', + 'common.back': 'Kembali', + 'common.all': 'Semua', + 'common.close': 'Tutup', + 'common.open': 'Buka', + 'common.upload': 'Unggah', + 'common.search': 'Cari', + 'common.confirm': 'Konfirmasi', 'common.ok': 'OK', - 'common.yes': 'Yes', - 'common.no': 'No', - 'common.or': 'or', - 'common.none': 'None', - 'common.date': 'Date', - 'common.rename': 'Rename', - 'common.name': 'Name', + 'common.yes': 'Ya', + 'common.no': 'Tidak', + 'common.or': 'atau', + 'common.none': 'Tidak ada', + 'common.date': 'Tanggal', + 'common.rename': 'Ganti nama', + 'common.name': 'Nama', 'common.email': 'Email', - 'common.password': 'Password', - 'common.saving': 'Saving...', - 'common.saved': 'Saved', - 'trips.reminder': 'Reminder', - 'trips.reminderNone': 'None', - 'trips.reminderDay': 'day', - 'trips.reminderDays': 'days', - 'trips.reminderCustom': 'Custom', - 'trips.reminderDaysBefore': 'days before departure', - 'trips.reminderDisabledHint': 'Trip reminders are disabled. Enable them in Admin > Settings > Notifications.', - 'common.update': 'Update', - 'common.change': 'Change', - 'common.uploading': 'Uploading…', - 'common.backToPlanning': 'Back to Planning', - 'common.reset': 'Reset', + 'common.password': 'Kata sandi', + 'common.saving': 'Menyimpan...', + 'common.justNow': 'baru saja', + 'common.hoursAgo': '{count}j lalu', + 'common.daysAgo': '{count}h lalu', + 'common.saved': 'Tersimpan', + 'trips.memberRemoved': '{username} dihapus', + 'trips.memberRemoveError': 'Gagal menghapus', + 'trips.memberAdded': '{username} ditambahkan', + 'trips.memberAddError': 'Gagal menambahkan', + 'trips.reminder': 'Pengingat', + 'trips.reminderNone': 'Tidak ada', + 'trips.reminderDay': 'hari', + 'trips.reminderDays': 'hari', + 'trips.reminderCustom': 'Kustom', + 'trips.reminderDaysBefore': 'hari sebelum keberangkatan', + 'trips.reminderDisabledHint': 'Pengingat perjalanan dinonaktifkan. Aktifkan di Admin > Pengaturan > Notifikasi.', + 'common.update': 'Perbarui', + 'common.change': 'Ubah', + 'common.uploading': 'Mengunggah…', + 'common.backToPlanning': 'Kembali ke Perencanaan', + 'common.reset': 'Atur ulang', + 'common.expand': 'Perluas', + 'common.collapse': 'Ciutkan', // Navbar - 'nav.trip': 'Trip', - 'nav.share': 'Share', - 'nav.settings': 'Settings', + 'nav.trip': 'Perjalanan', + 'nav.share': 'Bagikan', + 'nav.settings': 'Pengaturan', 'nav.admin': 'Admin', - 'nav.logout': 'Log out', - 'nav.lightMode': 'Light Mode', - 'nav.darkMode': 'Dark Mode', - 'nav.autoMode': 'Auto Mode', + 'nav.logout': 'Keluar', + 'nav.lightMode': 'Mode Terang', + 'nav.darkMode': 'Mode Gelap', + 'nav.autoMode': 'Mode Otomatis', 'nav.administrator': 'Administrator', // Dashboard - 'dashboard.title': 'My Trips', - 'dashboard.subtitle.loading': 'Loading trips...', - 'dashboard.subtitle.trips': '{count} trips ({archived} archived)', - 'dashboard.subtitle.empty': 'Start your first trip', - 'dashboard.subtitle.activeOne': '{count} active trip', - 'dashboard.subtitle.activeMany': '{count} active trips', - 'dashboard.subtitle.archivedSuffix': ' · {count} archived', - 'dashboard.newTrip': 'New Trip', - 'dashboard.gridView': 'Grid view', - 'dashboard.listView': 'List view', - 'dashboard.currency': 'Currency', - 'dashboard.timezone': 'Timezones', - 'dashboard.localTime': 'Local', - 'dashboard.timezoneCustomTitle': 'Custom Timezone', - 'dashboard.timezoneCustomLabelPlaceholder': 'Label (optional)', - 'dashboard.timezoneCustomTzPlaceholder': 'e.g. America/New_York', - 'dashboard.timezoneCustomAdd': 'Add', - 'dashboard.timezoneCustomErrorEmpty': 'Enter a timezone identifier', - 'dashboard.timezoneCustomErrorInvalid': 'Invalid timezone. Use format like Europe/Berlin', - 'dashboard.timezoneCustomErrorDuplicate': 'Already added', - 'dashboard.emptyTitle': 'No trips yet', - 'dashboard.emptyText': 'Create your first trip and start planning!', - 'dashboard.emptyButton': 'Create First Trip', - 'dashboard.nextTrip': 'Next Trip', - 'dashboard.shared': 'Shared', - 'dashboard.sharedBy': 'Shared by {name}', - 'dashboard.days': 'Days', - 'dashboard.places': 'Places', - 'dashboard.members': 'Buddies', - 'dashboard.archive': 'Archive', - 'dashboard.copyTrip': 'Copy', - 'dashboard.copySuffix': 'copy', - 'dashboard.restore': 'Restore', - 'dashboard.archived': 'Archived', - 'dashboard.status.ongoing': 'Ongoing', - 'dashboard.status.today': 'Today', - 'dashboard.status.tomorrow': 'Tomorrow', - 'dashboard.status.past': 'Past', - 'dashboard.status.daysLeft': '{count} days left', - 'dashboard.toast.loadError': 'Failed to load trips', - 'dashboard.toast.created': 'Trip created successfully!', - 'dashboard.toast.createError': 'Failed to create trip', - 'dashboard.toast.updated': 'Trip updated!', - 'dashboard.toast.updateError': 'Failed to update trip', - 'dashboard.toast.deleted': 'Trip deleted', - 'dashboard.toast.deleteError': 'Failed to delete trip', - 'dashboard.toast.archived': 'Trip archived', - 'dashboard.toast.archiveError': 'Failed to archive trip', - 'dashboard.toast.restored': 'Trip restored', - 'dashboard.toast.restoreError': 'Failed to restore trip', - 'dashboard.toast.copied': 'Trip copied!', - 'dashboard.toast.copyError': 'Failed to copy trip', - 'dashboard.confirm.delete': 'Delete trip "{title}"? All places and plans will be permanently deleted.', - 'dashboard.editTrip': 'Edit Trip', - 'dashboard.createTrip': 'Create New Trip', - 'dashboard.tripTitle': 'Title', - 'dashboard.tripTitlePlaceholder': 'e.g. Summer in Japan', - 'dashboard.tripDescription': 'Description', - 'dashboard.tripDescriptionPlaceholder': 'What is this trip about?', - 'dashboard.startDate': 'Start Date', - 'dashboard.endDate': 'End Date', - 'dashboard.dayCount': 'Number of Days', - 'dashboard.dayCountHint': 'How many days to plan for when no travel dates are set.', - 'dashboard.noDateHint': 'No date set — 7 default days will be created. You can change this anytime.', - 'dashboard.coverImage': 'Cover Image', - 'dashboard.addCoverImage': 'Add cover image (or drag & drop)', - 'dashboard.addMembers': 'Travel buddies', - 'dashboard.addMember': 'Add member', - 'dashboard.coverSaved': 'Cover image saved', - 'dashboard.coverUploadError': 'Failed to upload', - 'dashboard.coverRemoveError': 'Failed to remove', - 'dashboard.titleRequired': 'Title is required', - 'dashboard.endDateError': 'End date must be after start date', + '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.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.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', // Settings - 'settings.title': 'Settings', - 'settings.subtitle': 'Configure your personal settings', - 'settings.tabs.display': 'Display', - 'settings.tabs.map': 'Map', - 'settings.tabs.notifications': 'Notifications', - 'settings.tabs.integrations': 'Integrations', - 'settings.tabs.account': 'Account', - 'settings.tabs.about': 'About', - 'settings.map': 'Map', - 'settings.mapTemplate': 'Map Template', - 'settings.mapTemplatePlaceholder.select': 'Select template...', - 'settings.mapDefaultHint': 'Leave empty for OpenStreetMap (default)', + 'settings.title': 'Pengaturan', + 'settings.subtitle': 'Atur pengaturan pribadimu', + 'settings.tabs.display': 'Tampilan', + 'settings.tabs.map': 'Peta', + 'settings.tabs.notifications': 'Notifikasi', + 'settings.tabs.integrations': 'Integrasi', + 'settings.tabs.account': 'Akun', + 'settings.tabs.offline': 'Offline', + 'settings.tabs.about': 'Tentang', + 'settings.map': 'Peta', + 'settings.mapTemplate': 'Template Peta', + 'settings.mapTemplatePlaceholder.select': 'Pilih template...', + 'settings.mapDefaultHint': 'Kosongkan untuk OpenStreetMap (default)', 'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', - 'settings.mapHint': 'URL template for map tiles', - 'settings.latitude': 'Latitude', - 'settings.longitude': 'Longitude', - 'settings.saveMap': 'Save Map', + 'settings.mapHint': 'Template URL untuk tile peta', + 'settings.latitude': 'Lintang', + 'settings.longitude': 'Bujur', + 'settings.saveMap': 'Simpan Peta', 'settings.apiKeys': 'API Keys', 'settings.mapsKey': 'Google Maps API Key', - 'settings.mapsKeyHint': 'For place search. Requires Places API (New). Get at console.cloud.google.com', + 'settings.mapsKeyHint': 'Untuk pencarian tempat. Memerlukan Places API (New). Dapatkan di console.cloud.google.com', 'settings.weatherKey': 'OpenWeatherMap API Key', - 'settings.weatherKeyHint': 'For weather data. Free at openweathermap.org/api', - 'settings.keyPlaceholder': 'Enter key...', - 'settings.configured': 'Configured', - 'settings.saveKeys': 'Save Keys', - 'settings.display': 'Display', - 'settings.colorMode': 'Color Mode', - 'settings.light': 'Light', - 'settings.dark': 'Dark', - 'settings.auto': 'Auto', - 'settings.language': 'Language', - 'settings.temperature': 'Temperature Unit', - 'settings.timeFormat': 'Time Format', - 'settings.routeCalculation': 'Route Calculation', - 'settings.blurBookingCodes': 'Blur Booking Codes', - 'settings.notifications': 'Notifications', - 'settings.notifyTripInvite': 'Trip invitations', - 'settings.notifyBookingChange': 'Booking changes', - 'settings.notifyTripReminder': 'Trip reminders', - 'settings.notifyVacayInvite': 'Vacay fusion invitations', - 'settings.notifyPhotosShared': 'Shared photos (Immich)', - 'settings.notifyCollabMessage': 'Chat messages (Collab)', - 'settings.notifyPackingTagged': 'Packing list: assignments', - 'settings.notifyWebhook': 'Webhook notifications', - 'settings.notifyVersionAvailable': 'New version available', + 'settings.weatherKeyHint': 'Untuk data cuaca. Gratis di openweathermap.org/api', + 'settings.keyPlaceholder': 'Masukkan key...', + 'settings.configured': 'Sudah dikonfigurasi', + 'settings.saveKeys': 'Simpan Keys', + 'settings.display': 'Tampilan', + 'settings.colorMode': 'Mode Warna', + 'settings.light': 'Terang', + 'settings.dark': 'Gelap', + 'settings.auto': 'Otomatis', + 'settings.language': 'Bahasa', + 'settings.temperature': 'Satuan Suhu', + 'settings.timeFormat': 'Format Waktu', + 'settings.routeCalculation': 'Perhitungan Rute', + 'settings.blurBookingCodes': 'Sembunyikan Kode Pemesanan', + 'settings.notifications': 'Notifikasi', + 'settings.notifyTripInvite': 'Undangan perjalanan', + 'settings.notifyBookingChange': 'Perubahan pemesanan', + 'settings.notifyTripReminder': 'Pengingat perjalanan', + 'settings.notifyVacayInvite': 'Undangan Vacay fusion', + 'settings.notifyPhotosShared': 'Foto dibagikan (Immich)', + 'settings.notifyCollabMessage': 'Pesan chat (Collab)', + 'settings.notifyPackingTagged': 'Daftar bawaan: penugasan', + 'settings.notifyWebhook': 'Notifikasi webhook', + 'settings.notifyVersionAvailable': 'Versi baru tersedia', 'settings.notificationPreferences.email': 'Email', 'settings.notificationPreferences.webhook': 'Webhook', 'settings.notificationPreferences.inapp': 'In-App', - 'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.', + 'settings.notificationPreferences.noChannels': 'Belum ada saluran notifikasi yang dikonfigurasi. Minta admin untuk mengatur notifikasi email atau webhook.', 'settings.webhookUrl.label': 'Webhook URL', 'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...', - 'settings.webhookUrl.hint': 'Enter your Discord, Slack, or custom webhook URL to receive notifications.', - 'settings.webhookUrl.save': 'Save', - 'settings.webhookUrl.saved': 'Webhook URL saved', - 'settings.webhookUrl.test': 'Test', - 'settings.webhookUrl.testSuccess': 'Test webhook sent successfully', - 'settings.webhookUrl.testFailed': 'Test webhook failed', - 'admin.notifications.title': 'Notifications', - 'admin.notifications.hint': 'Choose one notification channel. Only one can be active at a time.', - 'admin.notifications.none': 'Disabled', + 'settings.webhookUrl.hint': 'Masukkan URL webhook Discord, Slack, atau kustom untuk menerima notifikasi.', + 'settings.webhookUrl.save': 'Simpan', + 'settings.webhookUrl.saved': 'Webhook URL tersimpan', + 'settings.webhookUrl.test': 'Uji', + 'settings.webhookUrl.testSuccess': 'Test webhook berhasil dikirim', + 'settings.webhookUrl.testFailed': 'Test webhook gagal', + 'admin.notifications.title': 'Notifikasi', + 'admin.notifications.hint': 'Pilih satu saluran notifikasi. Hanya satu yang bisa aktif sekaligus.', + 'admin.notifications.none': 'Dinonaktifkan', 'admin.notifications.email': 'Email (SMTP)', 'admin.notifications.webhook': 'Webhook', - 'admin.notifications.save': 'Save notification settings', - 'admin.notifications.saved': 'Notification settings saved', - 'admin.notifications.testWebhook': 'Send test webhook', - 'admin.notifications.testWebhookSuccess': 'Test webhook sent successfully', - 'admin.notifications.testWebhookFailed': 'Test webhook failed', + 'admin.notifications.save': 'Simpan pengaturan notifikasi', + 'admin.notifications.saved': 'Pengaturan notifikasi tersimpan', + 'admin.notifications.testWebhook': 'Kirim test webhook', + 'admin.notifications.testWebhookSuccess': 'Test webhook berhasil dikirim', + 'admin.notifications.testWebhookFailed': 'Test webhook gagal', 'admin.notifications.emailPanel.title': 'Email (SMTP)', 'admin.notifications.webhookPanel.title': 'Webhook', 'admin.notifications.inappPanel.title': 'In-App', - 'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.', + 'admin.notifications.inappPanel.hint': 'Notifikasi in-app selalu aktif dan tidak bisa dinonaktifkan secara global.', 'admin.notifications.adminWebhookPanel.title': 'Admin Webhook', - 'admin.notifications.adminWebhookPanel.hint': 'This webhook is used exclusively for admin notifications (e.g. version alerts). It is separate from per-user webhooks and always fires when set.', - 'admin.notifications.adminWebhookPanel.saved': 'Admin webhook URL saved', - 'admin.notifications.adminWebhookPanel.testSuccess': 'Test webhook sent successfully', - 'admin.notifications.adminWebhookPanel.testFailed': 'Test webhook failed', - 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin webhook always fires when a URL is configured', - 'admin.notifications.adminNotificationsHint': 'Configure which channels deliver admin-only notifications (e.g. version alerts).', - 'admin.smtp.title': 'Email & Notifications', - 'admin.smtp.hint': 'SMTP configuration for sending email notifications.', - 'admin.smtp.testButton': 'Send test email', - 'admin.webhook.hint': 'Allow users to configure their own webhook URLs for notifications (Discord, Slack, etc.).', - 'admin.smtp.testSuccess': 'Test email sent successfully', - 'admin.smtp.testFailed': 'Test email failed', - 'settings.notificationsDisabled': 'Notifications are not configured. Ask an admin to enable email or webhook notifications.', - 'settings.notificationsActive': 'Active channel', - 'settings.notificationsManagedByAdmin': 'Notification events are configured by your administrator.', - 'dayplan.icsTooltip': 'Export calendar (ICS)', - 'share.linkTitle': 'Public Link', - 'share.linkHint': 'Create a link anyone can use to view this trip without logging in. Read-only — no editing possible.', - 'share.createLink': 'Create link', - 'share.deleteLink': 'Delete link', - 'share.createError': 'Could not create link', - 'common.copy': 'Copy', - 'common.copied': 'Copied', - 'share.permMap': 'Map & Plan', - 'share.permBookings': 'Bookings', - 'share.permPacking': 'Packing', - 'shared.expired': 'Link expired or invalid', - 'shared.expiredHint': 'This shared trip link is no longer active.', - 'shared.readOnly': 'Read-only shared view', - 'shared.tabPlan': 'Plan', - 'shared.tabBookings': 'Bookings', - 'shared.tabPacking': 'Packing', - 'shared.tabBudget': 'Budget', + 'admin.notifications.adminWebhookPanel.hint': 'Webhook ini digunakan khusus untuk notifikasi admin (mis. peringatan versi). Terpisah dari webhook per pengguna dan selalu berjalan jika diatur.', + 'admin.notifications.adminWebhookPanel.saved': 'Admin webhook URL tersimpan', + 'admin.notifications.adminWebhookPanel.testSuccess': 'Test webhook berhasil dikirim', + 'admin.notifications.adminWebhookPanel.testFailed': 'Test webhook gagal', + 'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin webhook selalu berjalan jika URL dikonfigurasi', + 'admin.notifications.adminNotificationsHint': 'Atur saluran mana yang mengirimkan notifikasi khusus admin (mis. peringatan versi).', + 'admin.smtp.title': 'Email & Notifikasi', + 'admin.smtp.hint': 'Konfigurasi SMTP untuk pengiriman notifikasi email.', + 'admin.smtp.testButton': 'Kirim email uji', + 'admin.webhook.hint': 'Izinkan pengguna mengatur URL webhook sendiri untuk notifikasi (Discord, Slack, dll.).', + 'admin.smtp.testSuccess': 'Email uji berhasil dikirim', + 'admin.smtp.testFailed': 'Email uji gagal', + 'settings.notificationsDisabled': 'Notifikasi belum dikonfigurasi. Minta admin untuk mengaktifkan notifikasi email atau webhook.', + 'settings.notificationsActive': 'Saluran aktif', + 'settings.notificationsManagedByAdmin': 'Acara notifikasi dikonfigurasi oleh administrator.', + 'dayplan.icsTooltip': 'Ekspor kalender (ICS)', + 'share.linkTitle': 'Tautan Publik', + 'share.linkHint': 'Buat tautan yang bisa digunakan siapa saja untuk melihat perjalanan ini tanpa masuk. Hanya baca — tidak bisa diedit.', + 'share.createLink': 'Buat tautan', + 'share.deleteLink': 'Hapus tautan', + 'share.createError': 'Gagal membuat tautan', + 'common.copy': 'Salin', + 'common.copied': 'Disalin', + 'share.permMap': 'Peta & Rencana', + 'share.permBookings': 'Pemesanan', + 'share.permPacking': 'Bawaan', + 'shared.expired': 'Tautan kedaluwarsa atau tidak valid', + 'shared.expiredHint': 'Tautan perjalanan bersama ini tidak lagi aktif.', + 'shared.readOnly': 'Tampilan bersama — hanya baca', + 'shared.tabPlan': 'Rencana', + 'shared.tabBookings': 'Pemesanan', + 'shared.tabPacking': 'Bawaan', + 'shared.tabBudget': 'Anggaran', 'shared.tabChat': 'Chat', - 'shared.days': 'days', - 'shared.places': 'places', - 'shared.other': 'Other', - 'shared.totalBudget': 'Total Budget', - 'shared.messages': 'messages', - 'shared.sharedVia': 'Shared via', - 'shared.confirmed': 'Confirmed', - 'shared.pending': 'Pending', - 'share.permBudget': 'Budget', + 'shared.days': 'hari', + 'shared.places': 'tempat', + 'shared.other': 'Lainnya', + 'shared.totalBudget': 'Total Anggaran', + 'shared.messages': 'pesan', + 'shared.sharedVia': 'Dibagikan via', + 'shared.confirmed': 'Dikonfirmasi', + 'shared.pending': 'Menunggu', + 'share.permBudget': 'Anggaran', 'share.permCollab': 'Chat', - 'settings.on': 'On', - 'settings.off': 'Off', - 'settings.mcp.title': 'MCP Configuration', + 'settings.on': 'Aktif', + 'settings.off': 'Nonaktif', + 'settings.mcp.title': 'Konfigurasi MCP', 'settings.mcp.endpoint': 'MCP Endpoint', - 'settings.mcp.clientConfig': 'Client Configuration', - 'settings.mcp.clientConfigHint': 'Replace with an API token from the list below. The path to npx may need to be adjusted for your system (e.g. C:\\PROGRA~1\\nodejs\\npx.cmd on Windows).', - 'settings.mcp.copy': 'Copy', - 'settings.mcp.copied': 'Copied!', + 'settings.mcp.clientConfig': 'Konfigurasi Client', + 'settings.mcp.clientConfigHint': 'Ganti dengan API token dari daftar di bawah. Path ke npx mungkin perlu disesuaikan untuk sistemmu (mis. C:\\PROGRA~1\\nodejs\\npx.cmd di Windows).', + 'settings.mcp.clientConfigHintOAuth': 'Ganti dan dengan kredensial dari klien OAuth 2.1 yang kamu buat di atas. mcp-remote akan membuka browser untuk menyelesaikan otorisasi pertama kali kamu terhubung. Path ke npx mungkin perlu disesuaikan untuk sistemmu (misalnya C:\\PROGRA~1\\nodejs\\npx.cmd di Windows).', + 'settings.mcp.copy': 'Salin', + 'settings.mcp.copied': 'Disalin!', 'settings.mcp.apiTokens': 'API Tokens', - 'settings.mcp.createToken': 'Create New Token', - 'settings.mcp.noTokens': 'No tokens yet. Create one to connect MCP clients.', - 'settings.mcp.tokenCreatedAt': 'Created', - 'settings.mcp.tokenUsedAt': 'Used', - 'settings.mcp.deleteTokenTitle': 'Delete Token', - 'settings.mcp.deleteTokenMessage': 'This token will stop working immediately. Any MCP client using it will lose access.', - 'settings.mcp.modal.createTitle': 'Create API Token', - 'settings.mcp.modal.tokenName': 'Token Name', - 'settings.mcp.modal.tokenNamePlaceholder': 'e.g. Claude Desktop, Work laptop', - 'settings.mcp.modal.creating': 'Creating…', - 'settings.mcp.modal.create': 'Create Token', - 'settings.mcp.modal.createdTitle': 'Token Created', - 'settings.mcp.modal.createdWarning': 'This token will only be shown once. Copy and store it now — it cannot be recovered.', - 'settings.mcp.modal.done': 'Done', - 'settings.mcp.toast.created': 'Token created', - 'settings.mcp.toast.createError': 'Failed to create token', - 'settings.mcp.toast.deleted': 'Token deleted', - 'settings.mcp.toast.deleteError': 'Failed to delete token', - 'settings.account': 'Account', - 'settings.about': 'About', - 'settings.about.reportBug': 'Report a Bug', - 'settings.about.reportBugHint': 'Found an issue? Let us know', - 'settings.about.featureRequest': 'Feature Request', - 'settings.about.featureRequestHint': 'Suggest a new feature', - 'settings.about.wikiHint': 'Documentation & guides', - 'settings.about.description': 'TREK is a self-hosted travel planner that helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place, on your own server.', - 'settings.about.madeWith': 'Made with', - 'settings.about.madeBy': 'by Maurice and a growing open-source community.', - 'settings.username': 'Username', + 'settings.mcp.createToken': 'Buat Token Baru', + 'settings.mcp.noTokens': 'Belum ada token. Buat satu untuk menghubungkan MCP client.', + 'settings.mcp.tokenCreatedAt': 'Dibuat', + 'settings.mcp.tokenUsedAt': 'Digunakan', + 'settings.mcp.deleteTokenTitle': 'Hapus Token', + 'settings.mcp.deleteTokenMessage': 'Token ini akan langsung berhenti bekerja. MCP client yang menggunakannya akan kehilangan akses.', + 'settings.mcp.modal.createTitle': 'Buat API Token', + 'settings.mcp.modal.tokenName': 'Nama Token', + 'settings.mcp.modal.tokenNamePlaceholder': 'mis. Claude Desktop, Laptop kerja', + 'settings.mcp.modal.creating': 'Membuat…', + 'settings.mcp.modal.create': 'Buat Token', + 'settings.mcp.modal.createdTitle': 'Token Dibuat', + 'settings.mcp.modal.createdWarning': 'Token ini hanya ditampilkan sekali. Salin dan simpan sekarang — tidak bisa dipulihkan.', + 'settings.mcp.modal.done': 'Selesai', + 'settings.mcp.toast.created': 'Token dibuat', + 'settings.mcp.toast.createError': 'Gagal membuat token', + 'settings.mcp.toast.deleted': 'Token dihapus', + 'settings.mcp.toast.deleteError': 'Gagal menghapus token', + 'settings.mcp.apiTokensDeprecated': 'API Token sudah tidak digunakan dan akan dihapus di rilis mendatang. Gunakan OAuth 2.1 Client sebagai gantinya.', + 'settings.oauth.clients': 'Klien OAuth 2.1', + 'settings.oauth.clientsHint': 'Daftarkan klien OAuth 2.1 agar aplikasi MCP pihak ketiga (Claude Web, Cursor, dll.) dapat terhubung tanpa token statis.', + 'settings.oauth.createClient': 'Klien Baru', + 'settings.oauth.noClients': 'Belum ada klien OAuth yang terdaftar.', + 'settings.oauth.clientId': 'ID Klien', + 'settings.oauth.clientSecret': 'Rahasia Klien', + 'settings.oauth.deleteClient': 'Hapus Klien', + 'settings.oauth.deleteClientMessage': 'Klien ini dan semua sesi aktif akan dihapus permanen. Aplikasi yang menggunakannya akan langsung kehilangan akses.', + 'settings.oauth.rotateSecret': 'Putar Ulang Secret', + 'settings.oauth.rotateSecretMessage': 'Secret klien baru akan dibuat dan semua sesi yang ada langsung dibatalkan. Perbarui aplikasimu sebelum menutup dialog ini.', + 'settings.oauth.rotateSecretConfirm': 'Putar Ulang', + 'settings.oauth.rotateSecretConfirming': 'Memutar ulang…', + 'settings.oauth.rotateSecretDoneTitle': 'Secret Baru Dibuat', + 'settings.oauth.rotateSecretDoneWarning': 'Secret ini hanya ditampilkan sekali. Salin sekarang dan perbarui aplikasimu — semua sesi sebelumnya telah dibatalkan.', + 'settings.oauth.activeSessions': 'Sesi OAuth Aktif', + 'settings.oauth.sessionScopes': 'Cakupan', + 'settings.oauth.sessionExpires': 'Kedaluwarsa', + 'settings.oauth.revoke': 'Cabut', + 'settings.oauth.revokeSession': 'Cabut Sesi', + 'settings.oauth.revokeSessionMessage': 'Ini akan segera mencabut akses untuk sesi OAuth ini.', + 'settings.oauth.modal.createTitle': 'Daftarkan OAuth Client', + 'settings.oauth.modal.presets': 'Preset cepat', + 'settings.oauth.modal.clientName': 'Nama Aplikasi', + 'settings.oauth.modal.clientNamePlaceholder': 'mis. Claude Web, Aplikasi MCP Saya', + 'settings.oauth.modal.redirectUris': 'Redirect URI', + 'settings.oauth.modal.redirectUrisPlaceholder': 'https://aplikasiku.com/callback\nhttps://aplikasiku.com/auth', + 'settings.oauth.modal.redirectUrisHint': 'Satu URI per baris. HTTPS wajib (localhost dikecualikan). Kecocokan tepat diberlakukan.', + 'settings.oauth.modal.scopes': 'Cakupan yang Diizinkan', + 'settings.oauth.modal.scopesHint': 'list_trips dan get_trip_summary selalu tersedia — tidak perlu cakupan. Keduanya memungkinkan AI menemukan ID perjalanan yang diperlukan untuk menggunakan alat lainnya.', + 'settings.oauth.modal.selectAll': 'Pilih semua', + 'settings.oauth.modal.deselectAll': 'Batalkan semua', + 'settings.oauth.modal.creating': 'Mendaftarkan…', + 'settings.oauth.modal.create': 'Daftarkan Client', + 'settings.oauth.modal.createdTitle': 'Client Terdaftar', + 'settings.oauth.modal.createdWarning': 'Client secret hanya ditampilkan sekali. Salin sekarang — tidak dapat dipulihkan.', + 'settings.oauth.toast.createError': 'Gagal mendaftarkan klien OAuth', + 'settings.oauth.toast.deleted': 'Klien OAuth dihapus', + 'settings.oauth.toast.deleteError': 'Gagal menghapus klien OAuth', + 'settings.oauth.toast.revoked': 'Sesi dicabut', + 'settings.oauth.toast.revokeError': 'Gagal mencabut sesi', + 'settings.oauth.toast.rotateError': 'Gagal memutar ulang client secret', + 'settings.account': 'Akun', + 'settings.about': 'Tentang', + 'settings.about.reportBug': 'Laporkan Bug', + 'settings.about.reportBugHint': 'Menemukan masalah? Beri tahu kami', + 'settings.about.featureRequest': 'Permintaan Fitur', + 'settings.about.featureRequestHint': 'Sarankan fitur baru', + 'settings.about.wikiHint': 'Dokumentasi & panduan', + 'settings.about.description': 'TREK adalah perencana perjalanan self-hosted yang membantu kamu mengatur perjalanan dari ide pertama hingga kenangan terakhir. Perencanaan harian, anggaran, daftar bawaan, foto dan masih banyak lagi — semua di satu tempat, di servermu sendiri.', + 'settings.about.madeWith': 'Dibuat dengan', + 'settings.about.madeBy': 'oleh Maurice dan komunitas open-source yang terus berkembang.', + 'settings.username': 'Nama pengguna', 'settings.email': 'Email', - 'settings.role': 'Role', + 'settings.role': 'Peran', 'settings.roleAdmin': 'Administrator', - 'settings.oidcLinked': 'Linked with', - 'settings.changePassword': 'Change Password', - 'settings.currentPassword': 'Current password', - 'settings.currentPasswordRequired': 'Current password is required', - 'settings.newPassword': 'New password', - 'settings.confirmPassword': 'Confirm new password', - 'settings.updatePassword': 'Update password', - 'settings.passwordRequired': 'Please enter current and new password', - 'settings.passwordTooShort': 'Password must be at least 8 characters', - 'settings.passwordMismatch': 'Passwords do not match', - 'settings.passwordWeak': 'Password must contain uppercase, lowercase, a number, and a special character', - 'settings.passwordChanged': 'Password changed successfully', - 'settings.mustChangePassword': 'You must change your password before you can continue. Please set a new password below.', - 'settings.deleteAccount': 'Delete account', - 'settings.deleteAccountTitle': 'Delete your account?', - 'settings.deleteAccountWarning': 'Your account and all your trips, places, and files will be permanently deleted. This action cannot be undone.', - 'settings.deleteAccountConfirm': 'Delete permanently', - 'settings.deleteBlockedTitle': 'Deletion not possible', - 'settings.deleteBlockedMessage': 'You are the only administrator. Promote another user to admin before deleting your account.', - 'settings.roleUser': 'User', - 'settings.saveProfile': 'Save Profile', - 'settings.toast.mapSaved': 'Map settings saved', - 'settings.toast.keysSaved': 'API keys saved', - 'settings.toast.displaySaved': 'Display settings saved', - 'settings.toast.profileSaved': 'Profile saved', - 'settings.uploadAvatar': 'Upload Profile Picture', - 'settings.removeAvatar': 'Remove Profile Picture', - 'settings.avatarUploaded': 'Profile picture updated', - 'settings.avatarRemoved': 'Profile picture removed', - 'settings.avatarError': 'Upload failed', - 'settings.mfa.title': 'Two-factor authentication (2FA)', - 'settings.mfa.description': 'Adds a second step when you sign in with email and password. Use an authenticator app (Google Authenticator, Authy, etc.).', - 'settings.mfa.requiredByPolicy': 'Your administrator requires two-factor authentication. Set up an authenticator app below before continuing.', - 'settings.mfa.backupTitle': 'Backup codes', - 'settings.mfa.backupDescription': 'Use these one-time backup codes if you lose access to your authenticator app.', - 'settings.mfa.backupWarning': 'Save these codes now. Each code can only be used once.', - 'settings.mfa.backupCopy': 'Copy codes', - 'settings.mfa.backupDownload': 'Download TXT', - 'settings.mfa.backupPrint': 'Print / PDF', - 'settings.mfa.backupCopied': 'Backup codes copied', - 'settings.mfa.enabled': '2FA is enabled on your account.', - 'settings.mfa.disabled': '2FA is not enabled.', - 'settings.mfa.setup': 'Set up authenticator', - 'settings.mfa.scanQr': 'Scan this QR code with your app, or enter the secret manually.', - 'settings.mfa.secretLabel': 'Secret key (manual entry)', - 'settings.mfa.codePlaceholder': '6-digit code', - 'settings.mfa.enable': 'Enable 2FA', - 'settings.mfa.cancelSetup': 'Cancel', - 'settings.mfa.disableTitle': 'Disable 2FA', - 'settings.mfa.disableHint': 'Enter your account password and a current code from your authenticator.', - 'settings.mfa.disable': 'Disable 2FA', - 'settings.mfa.toastEnabled': 'Two-factor authentication enabled', - 'settings.mfa.toastDisabled': 'Two-factor authentication disabled', - 'settings.mfa.demoBlocked': 'Not available in demo mode', + 'settings.oidcLinked': 'Terhubung dengan', + 'settings.changePassword': 'Ganti Kata Sandi', + 'settings.currentPassword': 'Kata sandi saat ini', + 'settings.currentPasswordRequired': 'Kata sandi saat ini wajib diisi', + 'settings.newPassword': 'Kata sandi baru', + 'settings.confirmPassword': 'Konfirmasi kata sandi baru', + 'settings.updatePassword': 'Perbarui kata sandi', + 'settings.passwordRequired': 'Masukkan kata sandi saat ini dan kata sandi baru', + 'settings.passwordTooShort': 'Kata sandi minimal 8 karakter', + 'settings.passwordMismatch': 'Kata sandi tidak cocok', + 'settings.passwordWeak': 'Kata sandi harus mengandung huruf besar, huruf kecil, angka, dan karakter khusus', + 'settings.passwordChanged': 'Kata sandi berhasil diubah', + 'settings.mustChangePassword': 'Kamu harus mengubah kata sandi sebelum melanjutkan. Atur kata sandi baru di bawah ini.', + 'settings.deleteAccount': 'Hapus akun', + 'settings.deleteAccountTitle': 'Hapus akunmu?', + 'settings.deleteAccountWarning': 'Akunmu beserta semua perjalanan, tempat, dan file akan dihapus permanen. Tindakan ini tidak bisa dibatalkan.', + 'settings.deleteAccountConfirm': 'Hapus permanen', + 'settings.deleteBlockedTitle': 'Penghapusan tidak memungkinkan', + 'settings.deleteBlockedMessage': 'Kamu satu-satunya administrator. Promosikan pengguna lain menjadi admin sebelum menghapus akunmu.', + 'settings.roleUser': 'Pengguna', + 'settings.saveProfile': 'Simpan Profil', + 'settings.toast.mapSaved': 'Pengaturan peta tersimpan', + 'settings.toast.keysSaved': 'API keys tersimpan', + 'settings.toast.displaySaved': 'Pengaturan tampilan tersimpan', + 'settings.toast.profileSaved': 'Profil tersimpan', + 'settings.uploadAvatar': 'Unggah Foto Profil', + 'settings.removeAvatar': 'Hapus Foto Profil', + 'settings.avatarUploaded': 'Foto profil diperbarui', + 'settings.avatarRemoved': 'Foto profil dihapus', + 'settings.avatarError': 'Gagal mengunggah', + 'settings.mfa.title': 'Autentikasi dua faktor (2FA)', + 'settings.mfa.description': 'Menambahkan langkah kedua saat masuk dengan email dan kata sandi. Gunakan aplikasi autentikator (Google Authenticator, Authy, dll.).', + 'settings.mfa.requiredByPolicy': 'Administrator mengharuskan autentikasi dua faktor. Atur aplikasi autentikator di bawah ini sebelum melanjutkan.', + 'settings.mfa.backupTitle': 'Kode cadangan', + 'settings.mfa.backupDescription': 'Gunakan kode cadangan sekali pakai ini jika kamu kehilangan akses ke aplikasi autentikator.', + 'settings.mfa.backupWarning': 'Simpan kode ini sekarang. Setiap kode hanya bisa digunakan sekali.', + 'settings.mfa.backupCopy': 'Salin kode', + 'settings.mfa.backupDownload': 'Unduh TXT', + 'settings.mfa.backupPrint': 'Cetak / PDF', + 'settings.mfa.backupCopied': 'Kode cadangan disalin', + 'settings.mfa.enabled': '2FA aktif di akunmu.', + 'settings.mfa.disabled': '2FA belum diaktifkan.', + 'settings.mfa.setup': 'Atur autentikator', + 'settings.mfa.scanQr': 'Pindai kode QR ini dengan aplikasimu, atau masukkan secret secara manual.', + 'settings.mfa.secretLabel': 'Kunci secret (entri manual)', + 'settings.mfa.codePlaceholder': 'Kode 6 digit', + 'settings.mfa.enable': 'Aktifkan 2FA', + 'settings.mfa.cancelSetup': 'Batal', + 'settings.mfa.disableTitle': 'Nonaktifkan 2FA', + 'settings.mfa.disableHint': 'Masukkan kata sandi akun dan kode terkini dari aplikasi autentikatormu.', + 'settings.mfa.disable': 'Nonaktifkan 2FA', + 'settings.mfa.toastEnabled': 'Autentikasi dua faktor diaktifkan', + 'settings.mfa.toastDisabled': 'Autentikasi dua faktor dinonaktifkan', + 'settings.mfa.demoBlocked': 'Tidak tersedia dalam mode demo', // Login - 'login.error': 'Login failed. Please check your credentials.', - 'login.tagline': 'Your Trips.\nYour Plan.', - 'login.description': 'Plan trips collaboratively with interactive maps, budgets, and real-time sync.', - 'login.features.maps': 'Interactive Maps', - 'login.features.mapsDesc': 'Google Places, routes & clustering', - 'login.features.realtime': 'Real-Time Sync', - 'login.features.realtimeDesc': 'Plan together via WebSocket', - 'login.features.budget': 'Budget Tracking', - 'login.features.budgetDesc': 'Categories, charts & per-person costs', - 'login.features.collab': 'Collaboration', - 'login.features.collabDesc': 'Multi-user with shared trips', - 'login.features.packing': 'Packing Lists', - 'login.features.packingDesc': 'Categories, progress & suggestions', - 'login.features.bookings': 'Reservations', - 'login.features.bookingsDesc': 'Flights, hotels, restaurants & more', - 'login.features.files': 'Documents', - 'login.features.filesDesc': 'Upload & manage documents', - 'login.features.routes': 'Smart Routes', - 'login.features.routesDesc': 'Auto-optimize & Google Maps export', - 'login.selfHosted': 'Self-hosted \u00B7 Open Source \u00B7 Your data stays yours', - 'login.title': 'Sign In', - 'login.subtitle': 'Welcome back', - 'login.signingIn': 'Signing in…', - 'login.signIn': 'Sign In', - 'login.createAdmin': 'Create Admin Account', - 'login.createAdminHint': 'Set up the first admin account for TREK.', - 'login.setNewPassword': 'Set New Password', - 'login.setNewPasswordHint': 'You must change your password before continuing.', - 'login.createAccount': 'Create Account', - 'login.createAccountHint': 'Register a new account.', - 'login.creating': 'Creating…', - 'login.noAccount': "Don't have an account?", - 'login.hasAccount': 'Already have an account?', - 'login.register': 'Register', - 'login.emailPlaceholder': 'your@email.com', - 'login.username': 'Username', - 'login.oidc.registrationDisabled': 'Registration is disabled. Contact your administrator.', - 'login.oidc.noEmail': 'No email received from provider.', - 'login.oidc.tokenFailed': 'Authentication failed.', - 'login.oidc.invalidState': 'Invalid session. Please try again.', - 'login.demoFailed': 'Demo login failed', - 'login.oidcSignIn': 'Sign in with {name}', - 'login.oidcOnly': 'Password authentication is disabled. Please sign in using your SSO provider.', - 'login.oidcLoggedOut': 'You have been logged out. Sign in again using your SSO provider.', - 'login.demoHint': 'Try the demo — no registration needed', - 'login.mfaTitle': 'Two-factor authentication', - 'login.mfaSubtitle': 'Enter the 6-digit code from your authenticator app.', - 'login.mfaCodeLabel': 'Verification code', - 'login.mfaCodeRequired': 'Enter the code from your authenticator app.', - 'login.mfaHint': 'Open Google Authenticator, Authy, or another TOTP app.', - 'login.mfaBack': '← Back to sign in', - 'login.mfaVerify': 'Verify', + 'login.error': 'Login gagal. Periksa kembali kredensial kamu.', + 'login.tagline': 'Perjalananmu.\nRencanamu.', + 'login.description': 'Rencanakan perjalanan bersama dengan peta interaktif, anggaran, dan sinkronisasi real-time.', + 'login.features.maps': 'Peta Interaktif', + 'login.features.mapsDesc': 'Google Places, rute & pengelompokan', + 'login.features.realtime': 'Sinkronisasi Real-Time', + 'login.features.realtimeDesc': 'Rencanakan bersama via WebSocket', + 'login.features.budget': 'Pelacak Anggaran', + 'login.features.budgetDesc': 'Kategori, grafik & biaya per orang', + 'login.features.collab': 'Kolaborasi', + 'login.features.collabDesc': 'Multi-pengguna dengan perjalanan bersama', + 'login.features.packing': 'Daftar Packing', + 'login.features.packingDesc': 'Kategori, progres & saran', + 'login.features.bookings': 'Reservasi', + 'login.features.bookingsDesc': 'Penerbangan, hotel, restoran & lainnya', + 'login.features.files': 'Dokumen', + 'login.features.filesDesc': 'Unggah & kelola dokumen', + 'login.features.routes': 'Rute Cerdas', + 'login.features.routesDesc': 'Optimasi otomatis & ekspor ke Google Maps', + 'login.selfHosted': 'Self-hosted \u00B7 Open Source \u00B7 Datamu tetap milikmu', + 'login.title': 'Masuk', + 'login.subtitle': 'Selamat datang kembali', + 'login.signingIn': 'Sedang masuk…', + 'login.signIn': 'Masuk', + 'login.createAdmin': 'Buat Akun Admin', + 'login.createAdminHint': 'Siapkan akun admin pertama untuk TREK.', + 'login.setNewPassword': 'Atur Kata Sandi Baru', + 'login.setNewPasswordHint': 'Kamu harus mengganti kata sandi sebelum melanjutkan.', + 'login.createAccount': 'Buat Akun', + 'login.createAccountHint': 'Daftarkan akun baru.', + 'login.creating': 'Membuat…', + 'login.noAccount': 'Belum punya akun?', + 'login.hasAccount': 'Sudah punya akun?', + 'login.register': 'Daftar', + 'login.emailPlaceholder': 'kamu@email.com', + 'login.username': 'Nama pengguna', + 'login.oidc.registrationDisabled': 'Pendaftaran dinonaktifkan. Hubungi administrator kamu.', + 'login.oidc.noEmail': 'Tidak ada email yang diterima dari penyedia.', + 'login.oidc.tokenFailed': 'Autentikasi gagal.', + 'login.oidc.invalidState': 'Sesi tidak valid. Coba lagi.', + 'login.demoFailed': 'Login demo gagal', + 'login.oidcSignIn': 'Masuk dengan {name}', + 'login.oidcOnly': 'Autentikasi kata sandi dinonaktifkan. Masuk menggunakan penyedia SSO kamu.', + 'login.oidcLoggedOut': 'Kamu telah keluar. Masuk kembali menggunakan penyedia SSO kamu.', + 'login.demoHint': 'Coba demo — tidak perlu registrasi', + 'login.mfaTitle': 'Autentikasi dua faktor', + 'login.mfaSubtitle': 'Masukkan kode 6 digit dari aplikasi autentikator kamu.', + 'login.mfaCodeLabel': 'Kode verifikasi', + 'login.mfaCodeRequired': 'Masukkan kode dari aplikasi autentikator kamu.', + 'login.mfaHint': 'Buka Google Authenticator, Authy, atau aplikasi TOTP lainnya.', + 'login.mfaBack': '← Kembali ke halaman masuk', + 'login.mfaVerify': 'Verifikasi', + 'login.invalidInviteLink': 'Tautan undangan tidak valid atau sudah kedaluwarsa', + 'login.oidcFailed': 'Login OIDC gagal', + 'login.usernameRequired': 'Nama pengguna wajib diisi', + 'login.passwordMinLength': 'Kata sandi minimal 8 karakter', // Register - 'register.passwordMismatch': 'Passwords do not match', - 'register.passwordTooShort': 'Password must be at least 8 characters', - 'register.failed': 'Registration failed', - 'register.getStarted': 'Get Started', - 'register.subtitle': 'Create an account and start planning your dream trips.', - 'register.feature1': 'Unlimited trip plans', - 'register.feature2': 'Interactive map view', - 'register.feature3': 'Manage places and categories', - 'register.feature4': 'Track reservations', - 'register.feature5': 'Create packing lists', - 'register.feature6': 'Store photos and files', - 'register.createAccount': 'Create Account', - 'register.startPlanning': 'Start your trip planning', - 'register.minChars': 'Min. 6 characters', - 'register.confirmPassword': 'Confirm Password', - 'register.repeatPassword': 'Repeat password', - 'register.registering': 'Registering...', - 'register.register': 'Register', - 'register.hasAccount': 'Already have an account?', - 'register.signIn': 'Sign In', + 'register.passwordMismatch': 'Kata sandi tidak cocok', + 'register.passwordTooShort': 'Kata sandi minimal 8 karakter', + 'register.failed': 'Pendaftaran gagal', + 'register.getStarted': 'Mulai Sekarang', + 'register.subtitle': 'Buat akun dan mulai rencanakan perjalanan impianmu.', + 'register.feature1': 'Rencana perjalanan tak terbatas', + 'register.feature2': 'Tampilan peta interaktif', + 'register.feature3': 'Kelola tempat dan kategori', + 'register.feature4': 'Lacak reservasi', + 'register.feature5': 'Buat daftar packing', + 'register.feature6': 'Simpan foto dan file', + 'register.createAccount': 'Buat Akun', + 'register.startPlanning': 'Mulai rencanakan perjalananmu', + 'register.minChars': 'Min. 6 karakter', + 'register.confirmPassword': 'Konfirmasi Kata Sandi', + 'register.repeatPassword': 'Ulangi kata sandi', + 'register.registering': 'Mendaftar...', + 'register.register': 'Daftar', + 'register.hasAccount': 'Sudah punya akun?', + 'register.signIn': 'Masuk', // Admin - 'admin.title': 'Administration', - 'admin.subtitle': 'User management and system settings', - 'admin.tabs.users': 'Users', - 'admin.tabs.categories': 'Categories', + 'admin.title': 'Administrasi', + 'admin.subtitle': 'Manajemen pengguna dan pengaturan sistem', + 'admin.tabs.users': 'Pengguna', + 'admin.tabs.categories': 'Kategori', 'admin.tabs.backup': 'Backup', - 'admin.tabs.notifications': 'Notifications', + 'admin.tabs.notifications': 'Notifikasi', 'admin.tabs.audit': 'Audit', - 'admin.stats.users': 'Users', - 'admin.stats.trips': 'Trips', - 'admin.stats.places': 'Places', - 'admin.stats.photos': 'Photos', - 'admin.stats.files': 'Files', - 'admin.table.user': 'User', + 'admin.stats.users': 'Pengguna', + 'admin.stats.trips': 'Perjalanan', + 'admin.stats.places': 'Tempat', + 'admin.stats.photos': 'Foto', + 'admin.stats.files': 'File', + 'admin.table.user': 'Pengguna', 'admin.table.email': 'Email', - 'admin.table.role': 'Role', - 'admin.table.created': 'Created', - 'admin.table.lastLogin': 'Last Login', - 'admin.table.actions': 'Actions', - 'admin.you': '(You)', - 'admin.editUser': 'Edit User', - 'admin.newPassword': 'New Password', - 'admin.newPasswordHint': 'Leave empty to keep current password', - 'admin.deleteUser': 'Delete user "{name}"? All trips will be permanently deleted.', - 'admin.deleteUserTitle': 'Delete user', - 'admin.newPasswordPlaceholder': 'Enter new password…', - 'admin.toast.loadError': 'Failed to load admin data', - 'admin.toast.userUpdated': 'User updated', - 'admin.toast.updateError': 'Failed to update', - 'admin.toast.userDeleted': 'User deleted', - 'admin.toast.deleteError': 'Failed to delete', - 'admin.toast.cannotDeleteSelf': 'Cannot delete your own account', - 'admin.toast.userCreated': 'User created', - 'admin.toast.createError': 'Failed to create user', - 'admin.toast.fieldsRequired': 'Username, email and password are required', - 'admin.createUser': 'Create User', - 'admin.invite.title': 'Invite Links', - 'admin.invite.subtitle': 'Create one-time registration links', - 'admin.invite.create': 'Create Link', - 'admin.invite.createAndCopy': 'Create & Copy', - 'admin.invite.empty': 'No invite links created yet', - 'admin.invite.maxUses': 'Max. Uses', - 'admin.invite.expiry': 'Expires after', - 'admin.invite.uses': 'used', - 'admin.invite.expiresAt': 'expires', - 'admin.invite.createdBy': 'by', - 'admin.invite.active': 'Active', - 'admin.invite.expired': 'Expired', - 'admin.invite.usedUp': 'Used up', - 'admin.invite.copied': 'Invite link copied to clipboard', - 'admin.invite.copyLink': 'Copy link', - 'admin.invite.deleted': 'Invite link deleted', - 'admin.invite.createError': 'Failed to create invite link', - 'admin.invite.deleteError': 'Failed to delete invite link', - 'admin.tabs.settings': 'Settings', - 'admin.allowRegistration': 'Allow Registration', - 'admin.allowRegistrationHint': 'New users can register themselves', - 'admin.requireMfa': 'Require two-factor authentication (2FA)', - 'admin.requireMfaHint': 'Users without 2FA must complete setup in Settings before using the app.', - 'admin.apiKeys': 'API Keys', - 'admin.apiKeysHint': 'Optional. Enables extended place data like photos and weather.', - 'admin.mapsKey': 'Google Maps API Key', - 'admin.mapsKeyHint': 'Required for place search. Get at console.cloud.google.com', - 'admin.mapsKeyHintLong': 'Without an API key, OpenStreetMap is used for place search. With a Google API key, photos, ratings, and opening hours can be loaded as well. Get one at console.cloud.google.com.', - 'admin.recommended': 'Recommended', - 'admin.weatherKey': 'OpenWeatherMap API Key', - 'admin.weatherKeyHint': 'For weather data. Free at openweathermap.org', - 'admin.validateKey': 'Test', - 'admin.keyValid': 'Connected', - 'admin.keyInvalid': 'Invalid', - 'admin.keySaved': 'API keys saved', + 'admin.table.role': 'Peran', + 'admin.table.created': 'Dibuat', + 'admin.table.lastLogin': 'Login Terakhir', + 'admin.table.actions': 'Tindakan', + 'admin.you': '(Kamu)', + 'admin.editUser': 'Edit Pengguna', + 'admin.newPassword': 'Kata Sandi Baru', + 'admin.newPasswordHint': 'Kosongkan untuk mempertahankan kata sandi saat ini', + 'admin.deleteUser': 'Hapus pengguna "{name}"? Semua perjalanan akan dihapus secara permanen.', + 'admin.deleteUserTitle': 'Hapus pengguna', + 'admin.newPasswordPlaceholder': 'Masukkan kata sandi baru…', + 'admin.toast.loadError': 'Gagal memuat data admin', + 'admin.toast.userUpdated': 'Pengguna diperbarui', + 'admin.toast.updateError': 'Gagal memperbarui', + 'admin.toast.userDeleted': 'Pengguna dihapus', + 'admin.toast.deleteError': 'Gagal menghapus', + 'admin.toast.cannotDeleteSelf': 'Tidak bisa menghapus akun sendiri', + 'admin.toast.userCreated': 'Pengguna dibuat', + 'admin.toast.createError': 'Gagal membuat pengguna', + 'admin.toast.fieldsRequired': 'Nama pengguna, email, dan kata sandi wajib diisi', + 'admin.createUser': 'Buat Pengguna', + 'admin.invite.title': 'Tautan Undangan', + 'admin.invite.subtitle': 'Buat tautan pendaftaran sekali pakai', + 'admin.invite.create': 'Buat Tautan', + 'admin.invite.createAndCopy': 'Buat & Salin', + 'admin.invite.empty': 'Belum ada tautan undangan yang dibuat', + 'admin.invite.maxUses': 'Maks. Penggunaan', + 'admin.invite.expiry': 'Kedaluwarsa setelah', + 'admin.invite.uses': 'digunakan', + 'admin.invite.expiresAt': 'kedaluwarsa', + 'admin.invite.createdBy': 'oleh', + 'admin.invite.active': 'Aktif', + 'admin.invite.expired': 'Kedaluwarsa', + 'admin.invite.usedUp': 'Habis dipakai', + 'admin.invite.copied': 'Tautan undangan disalin ke clipboard', + 'admin.invite.copyLink': 'Salin tautan', + 'admin.invite.deleted': 'Tautan undangan dihapus', + 'admin.invite.createError': 'Gagal membuat tautan undangan', + 'admin.invite.deleteError': 'Gagal menghapus tautan undangan', + 'admin.tabs.settings': 'Pengaturan', + 'admin.allowRegistration': 'Izinkan Pendaftaran', + 'admin.allowRegistrationHint': 'Pengguna baru dapat mendaftar sendiri', + 'admin.authMethods': 'Metode Autentikasi', + 'admin.passwordLogin': 'Login dengan Kata Sandi', + 'admin.passwordLoginHint': 'Izinkan pengguna masuk dengan email dan kata sandi', + 'admin.passwordRegistration': 'Pendaftaran dengan Kata Sandi', + 'admin.passwordRegistrationHint': 'Izinkan pengguna baru mendaftar dengan email dan kata sandi', + 'admin.oidcLogin': 'Login SSO', + 'admin.oidcLoginHint': 'Izinkan pengguna masuk dengan SSO', + 'admin.oidcRegistration': 'Penyediaan Otomatis SSO', + 'admin.oidcRegistrationHint': 'Buat akun otomatis untuk pengguna SSO baru', + 'admin.envOverrideHint': 'Pengaturan login kata sandi dikendalikan oleh variabel lingkungan OIDC_ONLY dan tidak dapat diubah di sini.', + 'admin.lockoutWarning': 'Minimal satu metode login harus tetap aktif', + 'admin.requireMfa': 'Wajibkan autentikasi dua faktor (2FA)', + 'admin.requireMfaHint': 'Pengguna tanpa 2FA harus menyelesaikan pengaturan di Pengaturan sebelum menggunakan aplikasi.', + 'admin.apiKeys': 'Kunci API', + 'admin.apiKeysHint': 'Opsional. Mengaktifkan data tempat yang lebih lengkap seperti foto dan cuaca.', + 'admin.mapsKey': 'Kunci API Google Maps', + 'admin.mapsKeyHint': 'Diperlukan untuk pencarian tempat. Dapatkan di console.cloud.google.com', + 'admin.mapsKeyHintLong': 'Tanpa kunci API, OpenStreetMap digunakan untuk pencarian tempat. Dengan kunci API Google, foto, rating, dan jam buka juga bisa dimuat. Dapatkan di console.cloud.google.com.', + 'admin.recommended': 'Direkomendasikan', + 'admin.weatherKey': 'Kunci API OpenWeatherMap', + 'admin.weatherKeyHint': 'Untuk data cuaca. Gratis di openweathermap.org', + 'admin.validateKey': 'Uji', + 'admin.keyValid': 'Terhubung', + 'admin.keyInvalid': 'Tidak valid', + 'admin.keySaved': 'Kunci API disimpan', 'admin.oidcTitle': 'Single Sign-On (OIDC)', - 'admin.oidcSubtitle': 'Allow login via external providers like Google, Apple, Authentik or Keycloak.', - 'admin.oidcDisplayName': 'Display Name', + 'admin.oidcSubtitle': 'Izinkan login melalui penyedia eksternal seperti Google, Apple, Authentik, atau Keycloak.', + 'admin.oidcDisplayName': 'Nama Tampilan', 'admin.oidcIssuer': 'Issuer URL', - 'admin.oidcIssuerHint': 'The OpenID Connect Issuer URL of the provider. e.g. https://accounts.google.com', - 'admin.oidcSaved': 'OIDC configuration saved', - 'admin.oidcOnlyMode': 'Disable password authentication', - 'admin.oidcOnlyModeHint': 'When enabled, only SSO login is permitted. Password-based login and registration are blocked.', + 'admin.oidcIssuerHint': 'Issuer URL OpenID Connect dari penyedia. Contoh: https://accounts.google.com', + 'admin.oidcSaved': 'Konfigurasi OIDC disimpan', + 'admin.oidcOnlyMode': 'Nonaktifkan autentikasi kata sandi', + 'admin.oidcOnlyModeHint': 'Jika diaktifkan, hanya login SSO yang diizinkan. Login dan pendaftaran berbasis kata sandi diblokir.', // File Types - 'admin.fileTypes': 'Allowed File Types', - 'admin.fileTypesHint': 'Configure which file types users can upload.', - 'admin.fileTypesFormat': 'Comma-separated extensions (e.g. jpg,png,pdf,doc). Use * to allow all types.', - 'admin.fileTypesSaved': 'File type settings saved', + 'admin.fileTypes': 'Jenis File yang Diizinkan', + 'admin.fileTypesHint': 'Atur jenis file apa saja yang boleh diunggah pengguna.', + 'admin.fileTypesFormat': 'Ekstensi dipisahkan koma (contoh: jpg,png,pdf,doc). Gunakan * untuk mengizinkan semua jenis.', + 'admin.fileTypesSaved': 'Pengaturan jenis file disimpan', // Packing Templates & Bag Tracking - 'admin.bagTracking.title': 'Bag Tracking', - 'admin.bagTracking.subtitle': 'Enable weight and bag assignment for packing items', - 'admin.tabs.config': 'Personalization', - 'admin.tabs.templates': 'Packing Templates', - 'admin.packingTemplates.title': 'Packing Templates', - 'admin.packingTemplates.subtitle': 'Create reusable packing lists for your trips', - 'admin.packingTemplates.create': 'New Template', - 'admin.packingTemplates.namePlaceholder': 'Template name (e.g. Beach Holiday)', - 'admin.packingTemplates.empty': 'No templates created yet', - 'admin.packingTemplates.items': 'items', - 'admin.packingTemplates.categories': 'categories', - 'admin.packingTemplates.itemName': 'Item name', - 'admin.packingTemplates.itemCategory': 'Category', - 'admin.packingTemplates.categoryName': 'Category name (e.g. Clothing)', - 'admin.packingTemplates.addCategory': 'Add category', - 'admin.packingTemplates.created': 'Template created', - 'admin.packingTemplates.deleted': 'Template deleted', - 'admin.packingTemplates.loadError': 'Failed to load templates', - 'admin.packingTemplates.createError': 'Failed to create template', - 'admin.packingTemplates.deleteError': 'Failed to delete template', - 'admin.packingTemplates.saveError': 'Failed to save', + 'admin.bagTracking.title': 'Pelacak Tas', + 'admin.bagTracking.subtitle': 'Aktifkan berat dan penugasan tas untuk item packing', + 'admin.tabs.config': 'Personalisasi', + 'admin.tabs.templates': 'Template Packing', + 'admin.packingTemplates.title': 'Template Packing', + 'admin.packingTemplates.subtitle': 'Buat daftar packing yang bisa digunakan ulang untuk perjalananmu', + 'admin.packingTemplates.create': 'Template Baru', + 'admin.packingTemplates.namePlaceholder': 'Nama template (contoh: Liburan Pantai)', + 'admin.packingTemplates.empty': 'Belum ada template yang dibuat', + 'admin.packingTemplates.items': 'item', + 'admin.packingTemplates.categories': 'kategori', + 'admin.packingTemplates.itemName': 'Nama item', + 'admin.packingTemplates.itemCategory': 'Kategori', + 'admin.packingTemplates.categoryName': 'Nama kategori (contoh: Pakaian)', + 'admin.packingTemplates.addCategory': 'Tambah kategori', + 'admin.packingTemplates.created': 'Template dibuat', + 'admin.packingTemplates.deleted': 'Template dihapus', + 'admin.packingTemplates.loadError': 'Gagal memuat template', + 'admin.packingTemplates.createError': 'Gagal membuat template', + 'admin.packingTemplates.deleteError': 'Gagal menghapus template', + 'admin.packingTemplates.saveError': 'Gagal menyimpan', // Addons - 'admin.tabs.addons': 'Addons', - 'admin.addons.title': 'Addons', - 'admin.addons.subtitle': 'Enable or disable features to customize your TREK experience.', - 'admin.addons.catalog.packing.name': 'Lists', - 'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips', - 'admin.addons.catalog.budget.name': 'Budget', - 'admin.addons.catalog.budget.description': 'Track expenses and plan your trip budget', - 'admin.addons.catalog.documents.name': 'Documents', - 'admin.addons.catalog.documents.description': 'Store and manage travel documents', + 'admin.tabs.addons': 'Addon', + 'admin.addons.title': 'Addon', + 'admin.addons.subtitle': 'Aktifkan atau nonaktifkan fitur untuk menyesuaikan pengalaman TREK kamu.', + 'admin.addons.catalog.packing.name': 'Daftar', + 'admin.addons.catalog.packing.description': 'Daftar packing dan tugas to-do untuk perjalananmu', + 'admin.addons.catalog.budget.name': 'Anggaran', + 'admin.addons.catalog.budget.description': 'Lacak pengeluaran dan rencanakan anggaran perjalananmu', + 'admin.addons.catalog.documents.name': 'Dokumen', + 'admin.addons.catalog.documents.description': 'Simpan dan kelola dokumen perjalanan', 'admin.addons.catalog.vacay.name': 'Vacay', - 'admin.addons.catalog.vacay.description': 'Personal vacation planner with calendar view', + 'admin.addons.catalog.vacay.description': 'Perencana liburan pribadi dengan tampilan kalender', 'admin.addons.catalog.atlas.name': 'Atlas', - 'admin.addons.catalog.atlas.description': 'World map with visited countries and travel stats', + 'admin.addons.catalog.atlas.description': 'Peta dunia dengan negara yang pernah dikunjungi dan statistik perjalanan', 'admin.addons.catalog.collab.name': 'Collab', - 'admin.addons.catalog.collab.description': 'Real-time notes, polls, and chat for trip planning', - 'admin.addons.catalog.memories.name': 'Photos (Immich)', - 'admin.addons.catalog.memories.description': 'Share trip photos via your Immich instance', + 'admin.addons.catalog.collab.description': 'Catatan real-time, polling, dan chat untuk perencanaan perjalanan', + 'admin.addons.catalog.memories.name': 'Foto (Immich)', + 'admin.addons.catalog.memories.description': 'Bagikan foto perjalanan melalui instans Immich kamu', 'admin.addons.catalog.mcp.name': 'MCP', - 'admin.addons.catalog.mcp.description': 'Model Context Protocol for AI assistant integration', - 'admin.addons.subtitleBefore': 'Enable or disable features to customize your ', - 'admin.addons.subtitleAfter': ' experience.', - 'admin.addons.enabled': 'Enabled', - 'admin.addons.disabled': 'Disabled', - 'admin.addons.type.trip': 'Trip', + 'admin.addons.catalog.mcp.description': 'Model Context Protocol untuk integrasi asisten AI', + 'admin.addons.subtitleBefore': 'Aktifkan atau nonaktifkan fitur untuk menyesuaikan ', + 'admin.addons.subtitleAfter': ' kamu.', + 'admin.addons.enabled': 'Aktif', + 'admin.addons.disabled': 'Nonaktif', + 'admin.addons.type.trip': 'Perjalanan', 'admin.addons.type.global': 'Global', - 'admin.addons.type.integration': 'Integration', - 'admin.addons.tripHint': 'Available as a tab within each trip', - 'admin.addons.globalHint': 'Available as a standalone section in the main navigation', - 'admin.addons.integrationHint': 'Backend services and API integrations with no dedicated page', - 'admin.addons.toast.updated': 'Addon updated', - 'admin.addons.toast.error': 'Failed to update addon', - 'admin.addons.noAddons': 'No addons available', + 'admin.addons.type.integration': 'Integrasi', + 'admin.addons.tripHint': 'Tersedia sebagai tab di setiap perjalanan', + 'admin.addons.globalHint': 'Tersedia sebagai bagian mandiri di navigasi utama', + 'admin.addons.integrationHint': 'Layanan backend dan integrasi API tanpa halaman tersendiri', + 'admin.addons.toast.updated': 'Addon diperbarui', + 'admin.addons.toast.error': 'Gagal memperbarui addon', + 'admin.addons.noAddons': 'Tidak ada addon yang tersedia', // Weather info - 'admin.weather.title': 'Weather Data', - 'admin.weather.badge': 'Since March 24, 2026', - 'admin.weather.description': 'TREK uses Open-Meteo as its weather data source. Open-Meteo is a free, open-source weather service — no API key required.', - 'admin.weather.forecast': '16-day forecast', - 'admin.weather.forecastDesc': 'Previously 5 days (OpenWeatherMap)', - 'admin.weather.climate': 'Historical climate data', - 'admin.weather.climateDesc': 'Averages from the last 85 years for days beyond the 16-day forecast', - 'admin.weather.requests': '10,000 requests / day', - 'admin.weather.requestsDesc': 'Free, no API key required', - 'admin.weather.locationHint': 'Weather is based on the first place with coordinates in each day. If no place is assigned to a day, any place from the place list is used as a reference.', + 'admin.weather.title': 'Data Cuaca', + 'admin.weather.badge': 'Sejak 24 Maret 2026', + 'admin.weather.description': 'TREK menggunakan Open-Meteo sebagai sumber data cuaca. Open-Meteo adalah layanan cuaca gratis dan open-source — tidak perlu kunci API.', + 'admin.weather.forecast': 'Prakiraan 16 hari', + 'admin.weather.forecastDesc': 'Sebelumnya 5 hari (OpenWeatherMap)', + 'admin.weather.climate': 'Data iklim historis', + 'admin.weather.climateDesc': 'Rata-rata dari 85 tahun terakhir untuk hari di luar prakiraan 16 hari', + 'admin.weather.requests': '10.000 permintaan / hari', + 'admin.weather.requestsDesc': 'Gratis, tidak perlu kunci API', + 'admin.weather.locationHint': 'Cuaca didasarkan pada tempat pertama dengan koordinat di setiap hari. Jika tidak ada tempat yang ditetapkan untuk suatu hari, tempat mana pun dari daftar tempat digunakan sebagai referensi.', // GitHub - 'admin.tabs.mcpTokens': 'MCP Tokens', - 'admin.mcpTokens.title': 'MCP Tokens', - 'admin.mcpTokens.subtitle': 'Manage API tokens across all users', - 'admin.mcpTokens.owner': 'Owner', - 'admin.mcpTokens.tokenName': 'Token Name', - 'admin.mcpTokens.created': 'Created', - 'admin.mcpTokens.lastUsed': 'Last Used', - 'admin.mcpTokens.never': 'Never', - 'admin.mcpTokens.empty': 'No MCP tokens have been created yet', - 'admin.mcpTokens.deleteTitle': 'Delete Token', - 'admin.mcpTokens.deleteMessage': 'This will revoke the token immediately. The user will lose MCP access through this token.', - 'admin.mcpTokens.deleteSuccess': 'Token deleted', - 'admin.mcpTokens.deleteError': 'Failed to delete token', - 'admin.mcpTokens.loadError': 'Failed to load tokens', + 'admin.tabs.mcpTokens': 'Akses MCP', + 'admin.mcpTokens.title': 'Akses MCP', + 'admin.mcpTokens.subtitle': 'Kelola sesi OAuth dan token API di semua pengguna', + 'admin.mcpTokens.sectionTitle': 'Token API', + 'admin.mcpTokens.owner': 'Pemilik', + 'admin.mcpTokens.tokenName': 'Nama Token', + 'admin.mcpTokens.created': 'Dibuat', + 'admin.mcpTokens.lastUsed': 'Terakhir Digunakan', + 'admin.mcpTokens.never': 'Tidak pernah', + 'admin.mcpTokens.empty': 'Belum ada token MCP yang dibuat', + 'admin.mcpTokens.deleteTitle': 'Hapus Token', + 'admin.mcpTokens.deleteMessage': 'Ini akan mencabut token segera. Pengguna akan kehilangan akses MCP melalui token ini.', + 'admin.mcpTokens.deleteSuccess': 'Token dihapus', + 'admin.mcpTokens.deleteError': 'Gagal menghapus token', + 'admin.mcpTokens.loadError': 'Gagal memuat token', + 'admin.oauthSessions.sectionTitle': 'Sesi OAuth', + 'admin.oauthSessions.clientName': 'Klien', + 'admin.oauthSessions.owner': 'Pemilik', + 'admin.oauthSessions.scopes': 'Cakupan', + 'admin.oauthSessions.created': 'Dibuat', + 'admin.oauthSessions.empty': 'Tidak ada sesi OAuth aktif', + 'admin.oauthSessions.revokeTitle': 'Cabut Sesi', + 'admin.oauthSessions.revokeMessage': 'Ini akan segera mencabut sesi OAuth. Client akan kehilangan akses MCP.', + 'admin.oauthSessions.revokeSuccess': 'Sesi dicabut', + 'admin.oauthSessions.revokeError': 'Gagal mencabut sesi', + 'admin.oauthSessions.loadError': 'Gagal memuat sesi OAuth', 'admin.tabs.github': 'GitHub', - 'admin.audit.subtitle': 'Security-sensitive and administration events (backups, users, MFA, settings).', - 'admin.audit.empty': 'No audit entries yet.', - 'admin.audit.refresh': 'Refresh', - 'admin.audit.loadMore': 'Load more', - 'admin.audit.showing': '{count} loaded · {total} total', - 'admin.audit.col.time': 'Time', - 'admin.audit.col.user': 'User', - 'admin.audit.col.action': 'Action', - 'admin.audit.col.resource': 'Resource', + 'admin.audit.subtitle': 'Peristiwa sensitif keamanan dan administrasi (backup, pengguna, MFA, pengaturan).', + 'admin.audit.empty': 'Belum ada entri audit.', + 'admin.audit.refresh': 'Segarkan', + 'admin.audit.loadMore': 'Muat lebih banyak', + 'admin.audit.showing': '{count} dimuat · {total} total', + 'admin.audit.col.time': 'Waktu', + 'admin.audit.col.user': 'Pengguna', + 'admin.audit.col.action': 'Tindakan', + 'admin.audit.col.resource': 'Sumber Daya', 'admin.audit.col.ip': 'IP', - 'admin.audit.col.details': 'Details', - 'admin.github.title': 'Release History', - 'admin.github.subtitle': 'Latest updates from {repo}', - 'admin.github.latest': 'Latest', - 'admin.github.prerelease': 'Pre-release', - 'admin.github.showDetails': 'Show details', - 'admin.github.hideDetails': 'Hide details', - 'admin.github.loadMore': 'Load more', - 'admin.github.loading': 'Loading...', - 'admin.github.error': 'Failed to load releases', - 'admin.github.by': 'by', - 'admin.github.support': 'Helps me keep building TREK', + 'admin.audit.col.details': 'Detail', + 'admin.github.title': 'Riwayat Rilis', + 'admin.github.subtitle': 'Pembaruan terbaru dari {repo}', + 'admin.github.latest': 'Terbaru', + 'admin.github.prerelease': 'Pra-rilis', + 'admin.github.showDetails': 'Tampilkan detail', + 'admin.github.hideDetails': 'Sembunyikan detail', + 'admin.github.loadMore': 'Muat lebih banyak', + 'admin.github.loading': 'Memuat...', + 'admin.github.error': 'Gagal memuat rilis', + 'admin.github.by': 'oleh', + 'admin.github.support': 'Bantu saya terus mengembangkan TREK', - 'admin.update.available': 'Update available', - 'admin.update.text': 'TREK {version} is available. You are running {current}.', - 'admin.update.button': 'View on GitHub', - 'admin.update.install': 'Install Update', - 'admin.update.confirmTitle': 'Install Update?', - 'admin.update.confirmText': 'TREK will be updated from {current} to {version}. The server will restart automatically afterwards.', - 'admin.update.dataInfo': 'All your data (trips, users, API keys, uploads, Vacay, Atlas, budgets) will be preserved.', - 'admin.update.warning': 'The app will be briefly unavailable during the restart.', - 'admin.update.confirm': 'Update Now', - 'admin.update.installing': 'Updating…', - 'admin.update.success': 'Update installed! Server is restarting…', - 'admin.update.failed': 'Update failed', - 'admin.update.backupHint': 'We recommend creating a backup before updating.', - 'admin.update.backupLink': 'Go to Backup', - 'admin.update.howTo': 'How to Update', - 'admin.update.dockerText': 'Your TREK instance runs in Docker. To update to {version}, run the following commands on your server:', - 'admin.update.reloadHint': 'Please reload the page in a few seconds.', + 'admin.update.available': 'Pembaruan tersedia', + 'admin.update.text': 'TREK {version} tersedia. Kamu menggunakan {current}.', + 'admin.update.button': 'Lihat di GitHub', + 'admin.update.install': 'Pasang Pembaruan', + 'admin.update.confirmTitle': 'Pasang Pembaruan?', + 'admin.update.confirmText': 'TREK akan diperbarui dari {current} ke {version}. Server akan restart otomatis setelahnya.', + 'admin.update.dataInfo': 'Semua datamu (perjalanan, pengguna, kunci API, unggahan, Vacay, Atlas, anggaran) akan dipertahankan.', + 'admin.update.warning': 'Aplikasi akan tidak tersedia sebentar selama restart.', + 'admin.update.confirm': 'Perbarui Sekarang', + 'admin.update.installing': 'Memperbarui…', + 'admin.update.success': 'Pembaruan terpasang! Server sedang restart…', + 'admin.update.failed': 'Pembaruan gagal', + 'admin.update.backupHint': 'Kami merekomendasikan membuat backup sebelum memperbarui.', + 'admin.update.backupLink': 'Pergi ke Backup', + 'admin.update.howTo': 'Cara Memperbarui', + 'admin.update.dockerText': 'Instans TREK kamu berjalan di Docker. Untuk memperbarui ke {version}, jalankan perintah berikut di servermu:', + 'admin.update.reloadHint': 'Muat ulang halaman dalam beberapa detik.', // Vacay addon - 'vacay.subtitle': 'Plan and manage vacation days', - 'vacay.settings': 'Settings', - 'vacay.year': 'Year', - 'vacay.addYear': 'Add next year', - 'vacay.addPrevYear': 'Add previous year', - 'vacay.removeYear': 'Remove year', - 'vacay.removeYearConfirm': 'Remove {year}?', - 'vacay.removeYearHint': 'All vacation entries and company holidays for this year will be permanently deleted.', - 'vacay.remove': 'Remove', - 'vacay.persons': 'Persons', - 'vacay.noPersons': 'No persons added', - 'vacay.addPerson': 'Add Person', - 'vacay.editPerson': 'Edit Person', - 'vacay.removePerson': 'Remove Person', - 'vacay.removePersonConfirm': 'Remove {name}?', - 'vacay.removePersonHint': 'All vacation entries for this person will be permanently deleted.', - 'vacay.personName': 'Name', - 'vacay.personNamePlaceholder': 'Enter name', - 'vacay.color': 'Color', - 'vacay.add': 'Add', - 'vacay.legend': 'Legend', - 'vacay.publicHoliday': 'Public Holiday', - 'vacay.companyHoliday': 'Company Holiday', - 'vacay.weekend': 'Weekend', - 'vacay.modeVacation': 'Vacation', - 'vacay.modeCompany': 'Company Holiday', - 'vacay.entitlement': 'Entitlement', - 'vacay.entitlementDays': 'Days', - 'vacay.used': 'Used', - 'vacay.remaining': 'Left', - 'vacay.carriedOver': 'from {year}', - 'vacay.blockWeekends': 'Block Weekends', - 'vacay.blockWeekendsHint': 'Prevent vacation entries on weekend days', - 'vacay.weekendDays': 'Weekend days', - 'vacay.mon': 'Mon', - 'vacay.tue': 'Tue', - 'vacay.wed': 'Wed', - 'vacay.thu': 'Thu', - 'vacay.fri': 'Fri', - 'vacay.sat': 'Sat', - 'vacay.sun': 'Sun', - 'vacay.publicHolidays': 'Public Holidays', - 'vacay.publicHolidaysHint': 'Mark public holidays in the calendar', - 'vacay.selectCountry': 'Select country', - 'vacay.selectRegion': 'Select region (optional)', - 'vacay.addCalendar': 'Add calendar', - 'vacay.calendarLabel': 'Label (optional)', - 'vacay.calendarColor': 'Color', - 'vacay.noCalendars': 'No holiday calendars added yet', - 'vacay.companyHolidays': 'Company Holidays', - 'vacay.companyHolidaysHint': 'Allow marking company-wide holiday days', - 'vacay.companyHolidaysNoDeduct': 'Company holidays do not count towards vacation days.', - 'vacay.carryOver': 'Carry Over', - 'vacay.carryOverHint': 'Automatically carry remaining vacation days into the next year', - 'vacay.sharing': 'Sharing', - 'vacay.sharingHint': 'Share your vacation plan with other TREK users', - 'vacay.owner': 'Owner', - 'vacay.shareEmailPlaceholder': 'Email of TREK user', - 'vacay.shareSuccess': 'Plan shared successfully', - 'vacay.shareError': 'Could not share plan', - 'vacay.dissolve': 'Dissolve Fusion', - 'vacay.dissolveHint': 'Separate calendars again. Your entries will be kept.', - 'vacay.dissolveAction': 'Dissolve', - 'vacay.dissolved': 'Calendar separated', - 'vacay.fusedWith': 'Fused with', - 'vacay.you': 'you', - 'vacay.noData': 'No data', - 'vacay.changeColor': 'Change color', - 'vacay.inviteUser': 'Invite User', - 'vacay.inviteHint': 'Invite another TREK user to share a combined vacation calendar.', - 'vacay.selectUser': 'Select user', - 'vacay.sendInvite': 'Send Invite', - 'vacay.inviteSent': 'Invite sent', - 'vacay.inviteError': 'Could not send invite', - 'vacay.pending': 'pending', - 'vacay.noUsersAvailable': 'No users available', - 'vacay.accept': 'Accept', - 'vacay.decline': 'Decline', - 'vacay.acceptFusion': 'Accept & Fuse', - 'vacay.inviteTitle': 'Fusion Request', - 'vacay.inviteWantsToFuse': 'wants to share a vacation calendar with you.', - 'vacay.fuseInfo1': 'Both of you will see all vacation entries in one shared calendar.', - 'vacay.fuseInfo2': 'Both parties can create and edit entries for each other.', - 'vacay.fuseInfo3': 'Both parties can delete entries and change vacation entitlements.', - 'vacay.fuseInfo4': 'Settings like public holidays and company holidays are shared.', - 'vacay.fuseInfo5': 'The fusion can be dissolved at any time by either party. Your entries will be preserved.', - 'nav.myTrips': 'My Trips', + 'vacay.subtitle': 'Rencanakan dan kelola hari cuti', + 'vacay.settings': 'Pengaturan', + 'vacay.year': 'Tahun', + 'vacay.addYear': 'Tambah tahun berikutnya', + 'vacay.addPrevYear': 'Tambah tahun sebelumnya', + 'vacay.removeYear': 'Hapus tahun', + 'vacay.removeYearConfirm': 'Hapus {year}?', + 'vacay.removeYearHint': 'Semua entri cuti dan hari libur perusahaan untuk tahun ini akan dihapus secara permanen.', + 'vacay.remove': 'Hapus', + 'vacay.persons': 'Orang', + 'vacay.noPersons': 'Belum ada orang ditambahkan', + 'vacay.addPerson': 'Tambah Orang', + 'vacay.editPerson': 'Edit Orang', + 'vacay.removePerson': 'Hapus Orang', + 'vacay.removePersonConfirm': 'Hapus {name}?', + 'vacay.removePersonHint': 'Semua entri cuti untuk orang ini akan dihapus secara permanen.', + 'vacay.personName': 'Nama', + 'vacay.personNamePlaceholder': 'Masukkan nama', + 'vacay.color': 'Warna', + 'vacay.add': 'Tambah', + 'vacay.legend': 'Keterangan', + 'vacay.publicHoliday': 'Hari Libur Nasional', + 'vacay.companyHoliday': 'Hari Libur Perusahaan', + 'vacay.weekend': 'Akhir Pekan', + 'vacay.modeVacation': 'Cuti', + 'vacay.modeCompany': 'Hari Libur Perusahaan', + 'vacay.entitlement': 'Jatah Cuti', + 'vacay.entitlementDays': 'Hari', + 'vacay.used': 'Terpakai', + 'vacay.remaining': 'Sisa', + 'vacay.carriedOver': 'dari {year}', + 'vacay.blockWeekends': 'Blokir Akhir Pekan', + 'vacay.blockWeekendsHint': 'Cegah entri cuti pada hari akhir pekan', + 'vacay.weekendDays': 'Hari akhir pekan', + 'vacay.mon': 'Sen', + 'vacay.tue': 'Sel', + 'vacay.wed': 'Rab', + 'vacay.thu': 'Kam', + 'vacay.fri': 'Jum', + 'vacay.sat': 'Sab', + 'vacay.sun': 'Min', + 'vacay.publicHolidays': 'Hari Libur Nasional', + 'vacay.publicHolidaysHint': 'Tandai hari libur nasional di kalender', + 'vacay.selectCountry': 'Pilih negara', + 'vacay.selectRegion': 'Pilih wilayah (opsional)', + 'vacay.addCalendar': 'Tambah kalender', + 'vacay.calendarLabel': 'Label (opsional)', + 'vacay.calendarColor': 'Warna', + 'vacay.noCalendars': 'Belum ada kalender hari libur ditambahkan', + 'vacay.companyHolidays': 'Hari Libur Perusahaan', + 'vacay.companyHolidaysHint': 'Izinkan penandaan hari libur seluruh perusahaan', + 'vacay.companyHolidaysNoDeduct': 'Hari libur perusahaan tidak dipotong dari jatah cuti.', + 'vacay.weekStart': 'Awal minggu', + 'vacay.weekStartHint': 'Pilih apakah minggu kalender dimulai pada hari Senin atau Minggu', + 'vacay.carryOver': 'Carry Over Cuti', + 'vacay.carryOverHint': 'Otomatis pindahkan sisa hari cuti ke tahun berikutnya', + 'vacay.sharing': 'Berbagi', + 'vacay.sharingHint': 'Bagikan rencana cuti kamu dengan pengguna TREK lainnya', + 'vacay.owner': 'Pemilik', + 'vacay.shareEmailPlaceholder': 'Email pengguna TREK', + 'vacay.shareSuccess': 'Rencana berhasil dibagikan', + 'vacay.shareError': 'Gagal membagikan rencana', + 'vacay.dissolve': 'Pisahkan Gabungan', + 'vacay.dissolveHint': 'Pisahkan kalender kembali. Entri kamu akan tetap disimpan.', + 'vacay.dissolveAction': 'Pisahkan', + 'vacay.dissolved': 'Kalender dipisahkan', + 'vacay.fusedWith': 'Digabung dengan', + 'vacay.you': 'kamu', + 'vacay.noData': 'Tidak ada data', + 'vacay.changeColor': 'Ganti warna', + 'vacay.inviteUser': 'Undang Pengguna', + 'vacay.inviteHint': 'Undang pengguna TREK lain untuk berbagi kalender cuti bersama.', + 'vacay.selectUser': 'Pilih pengguna', + 'vacay.sendInvite': 'Kirim Undangan', + 'vacay.inviteSent': 'Undangan terkirim', + 'vacay.inviteError': 'Gagal mengirim undangan', + 'vacay.pending': 'menunggu', + 'vacay.noUsersAvailable': 'Tidak ada pengguna tersedia', + 'vacay.accept': 'Terima', + 'vacay.decline': 'Tolak', + 'vacay.acceptFusion': 'Terima & Gabung', + 'vacay.inviteTitle': 'Permintaan Penggabungan', + 'vacay.inviteWantsToFuse': 'ingin berbagi kalender cuti bersamamu.', + 'vacay.fuseInfo1': 'Kalian berdua akan melihat semua entri cuti dalam satu kalender bersama.', + 'vacay.fuseInfo2': 'Kedua pihak dapat membuat dan mengedit entri satu sama lain.', + 'vacay.fuseInfo3': 'Kedua pihak dapat menghapus entri dan mengubah jatah cuti.', + 'vacay.fuseInfo4': 'Pengaturan seperti hari libur nasional dan hari libur perusahaan dibagikan bersama.', + 'vacay.fuseInfo5': 'Penggabungan dapat dipisahkan kapan saja oleh salah satu pihak. Entri kamu akan tetap disimpan.', + 'nav.myTrips': 'Perjalananku', // Atlas addon - 'atlas.subtitle': 'Your travel footprint around the world', - 'atlas.countries': 'Countries', - 'atlas.trips': 'Trips', - 'atlas.places': 'Places', - 'atlas.unmark': 'Remove', - 'atlas.confirmMark': 'Mark this country as visited?', - 'atlas.confirmUnmark': 'Remove this country from your visited list?', - 'atlas.confirmUnmarkRegion': 'Remove this region from your visited list?', - 'atlas.markVisited': 'Mark as visited', - 'atlas.markVisitedHint': 'Add this country to your visited list', - 'atlas.markRegionVisitedHint': 'Add this region to your visited list', - 'atlas.addToBucket': 'Add to bucket list', - 'atlas.addPoi': 'Add place', - 'atlas.searchCountry': 'Search a country...', - 'atlas.bucketNamePlaceholder': 'Name (country, city, place...)', - 'atlas.month': 'Month', - 'atlas.year': 'Year', - 'atlas.addToBucketHint': 'Save as a place you want to visit', - 'atlas.bucketWhen': 'When do you plan to visit?', - 'atlas.statsTab': 'Stats', - 'atlas.bucketTab': 'Bucket List', - 'atlas.addBucket': 'Add to bucket list', - 'atlas.bucketNotesPlaceholder': 'Notes (optional)', - 'atlas.bucketEmpty': 'Your bucket list is empty', - 'atlas.bucketEmptyHint': 'Add places you dream of visiting', - 'atlas.days': 'Days', - 'atlas.visitedCountries': 'Visited Countries', - 'atlas.cities': 'Cities', - 'atlas.noData': 'No travel data yet', - 'atlas.noDataHint': 'Create a trip and add places to see your world map', - 'atlas.lastTrip': 'Last trip', - 'atlas.nextTrip': 'Next trip', - 'atlas.daysLeft': 'days left', - 'atlas.streak': 'Streak', - 'atlas.years': 'years', - 'atlas.yearInRow': 'year in a row', - 'atlas.yearsInRow': 'years in a row', - 'atlas.tripIn': 'trip in', - 'atlas.tripsIn': 'trips in', - 'atlas.since': 'since', - 'atlas.europe': 'Europe', + 'atlas.subtitle': 'Jejak perjalananmu di seluruh dunia', + 'atlas.countries': 'Negara', + 'atlas.trips': 'Perjalanan', + 'atlas.places': 'Tempat', + 'atlas.unmark': 'Hapus', + 'atlas.confirmMark': 'Tandai negara ini sebagai sudah dikunjungi?', + 'atlas.confirmUnmark': 'Hapus negara ini dari daftar kunjunganmu?', + 'atlas.confirmUnmarkRegion': 'Hapus wilayah ini dari daftar kunjunganmu?', + 'atlas.markVisited': 'Tandai sudah dikunjungi', + 'atlas.markVisitedHint': 'Tambahkan negara ini ke daftar kunjunganmu', + 'atlas.markRegionVisitedHint': 'Tambahkan wilayah ini ke daftar kunjunganmu', + 'atlas.addToBucket': 'Tambah ke bucket list', + 'atlas.addPoi': 'Tambah tempat', + 'atlas.searchCountry': 'Cari negara...', + 'atlas.bucketNamePlaceholder': 'Nama (negara, kota, tempat...)', + 'atlas.month': 'Bulan', + 'atlas.year': 'Tahun', + 'atlas.addToBucketHint': 'Simpan sebagai tempat yang ingin dikunjungi', + 'atlas.bucketWhen': 'Kapan kamu berencana mengunjunginya?', + 'atlas.statsTab': 'Statistik', + 'atlas.bucketTab': 'Daftar Impian', + 'atlas.addBucket': 'Tambah ke daftar impian', + 'atlas.bucketNotesPlaceholder': 'Catatan (opsional)', + 'atlas.bucketEmpty': 'Daftar impianmu masih kosong', + 'atlas.bucketEmptyHint': 'Tambahkan tempat-tempat yang ingin kamu kunjungi', + 'atlas.days': 'Hari', + 'atlas.visitedCountries': 'Negara yang Dikunjungi', + 'atlas.cities': 'Kota', + 'atlas.noData': 'Belum ada data perjalanan', + 'atlas.noDataHint': 'Buat perjalanan dan tambahkan tempat untuk melihat peta duniamu', + 'atlas.lastTrip': 'Perjalanan terakhir', + 'atlas.nextTrip': 'Perjalanan berikutnya', + 'atlas.daysLeft': 'hari lagi', + 'atlas.streak': 'Rentetan', + 'atlas.years': 'tahun', + 'atlas.yearInRow': 'tahun berturut-turut', + 'atlas.yearsInRow': 'tahun berturut-turut', + 'atlas.tripIn': 'perjalanan ke', + 'atlas.tripsIn': 'perjalanan ke', + 'atlas.since': 'sejak', + 'atlas.europe': 'Eropa', 'atlas.asia': 'Asia', - 'atlas.northAmerica': 'N. America', - 'atlas.southAmerica': 'S. America', - 'atlas.africa': 'Africa', - 'atlas.oceania': 'Oceania', - 'atlas.other': 'Other', - 'atlas.firstVisit': 'First trip', - 'atlas.lastVisitLabel': 'Last trip', - 'atlas.tripSingular': 'Trip', - 'atlas.tripPlural': 'Trips', - 'atlas.placeVisited': 'Place visited', - 'atlas.placesVisited': 'Places visited', + 'atlas.northAmerica': 'Amerika Utara', + 'atlas.southAmerica': 'Amerika Selatan', + 'atlas.africa': 'Afrika', + 'atlas.oceania': 'Oseania', + 'atlas.other': 'Lainnya', + 'atlas.firstVisit': 'Perjalanan pertama', + 'atlas.lastVisitLabel': 'Perjalanan terakhir', + 'atlas.tripSingular': 'Perjalanan', + 'atlas.tripPlural': 'Perjalanan', + 'atlas.placeVisited': 'Tempat dikunjungi', + 'atlas.placesVisited': 'Tempat dikunjungi', // Trip Planner - 'trip.tabs.plan': 'Plan', - 'trip.tabs.reservations': 'Bookings', - 'trip.tabs.reservationsShort': 'Book', - 'trip.tabs.packing': 'Packing List', - 'trip.tabs.packingShort': 'Packing', - 'trip.tabs.lists': 'Lists', - 'trip.tabs.listsShort': 'Lists', - 'trip.tabs.budget': 'Budget', - 'trip.tabs.files': 'Files', - 'trip.loading': 'Loading trip...', - 'trip.loadingPhotos': 'Loading place photos...', - 'trip.mobilePlan': 'Plan', - 'trip.mobilePlaces': 'Places', - 'trip.toast.placeUpdated': 'Place updated', - 'trip.toast.placeAdded': 'Place added', - 'trip.toast.placeDeleted': 'Place deleted', - 'trip.toast.selectDay': 'Please select a day first', - 'trip.toast.assignedToDay': 'Place assigned to day', - 'trip.toast.reorderError': 'Failed to reorder', - 'trip.toast.reservationUpdated': 'Reservation updated', - 'trip.toast.reservationAdded': 'Reservation added', - 'trip.toast.deleted': 'Deleted', - 'trip.confirm.deletePlace': 'Are you sure you want to delete this place?', + 'trip.tabs.plan': 'Rencana', + 'trip.tabs.reservations': 'Pemesanan', + 'trip.tabs.reservationsShort': 'Pesan', + 'trip.tabs.packing': 'Daftar Perlengkapan', + 'trip.tabs.packingShort': 'Perlengkapan', + 'trip.tabs.lists': 'Daftar', + 'trip.tabs.listsShort': 'Daftar', + 'trip.tabs.budget': 'Anggaran', + 'trip.tabs.files': 'File', + 'trip.loading': 'Memuat perjalanan...', + 'trip.loadingPhotos': 'Memuat foto tempat...', + 'trip.mobilePlan': 'Rencana', + 'trip.mobilePlaces': 'Tempat', + 'trip.toast.placeUpdated': 'Tempat diperbarui', + 'trip.toast.placeAdded': 'Tempat ditambahkan', + 'trip.toast.placeDeleted': 'Tempat dihapus', + 'trip.toast.selectDay': 'Pilih hari terlebih dahulu', + 'trip.toast.assignedToDay': 'Tempat ditambahkan ke hari', + 'trip.toast.reorderError': 'Gagal mengurutkan ulang', + 'trip.toast.reservationUpdated': 'Reservasi diperbarui', + 'trip.toast.reservationAdded': 'Reservasi ditambahkan', + 'trip.toast.deleted': 'Dihapus', + 'trip.confirm.deletePlace': 'Apakah kamu yakin ingin menghapus tempat ini?', // Day Plan Sidebar - 'dayplan.emptyDay': 'No places planned for this day', - 'dayplan.cannotReorderTransport': 'Bookings with a fixed time cannot be reordered', - 'dayplan.confirmRemoveTimeTitle': 'Remove time?', - 'dayplan.confirmRemoveTimeBody': 'This place has a fixed time ({time}). Moving it will remove the time and allow free sorting.', - 'dayplan.confirmRemoveTimeAction': 'Remove time & move', - 'dayplan.cannotDropOnTimed': 'Items cannot be placed between time-bound entries', - 'dayplan.cannotBreakChronology': 'This would break the chronological order of timed items and bookings', - 'dayplan.addNote': 'Add Note', - 'dayplan.editNote': 'Edit Note', - 'dayplan.noteAdd': 'Add Note', - 'dayplan.noteEdit': 'Edit Note', - 'dayplan.noteTitle': 'Note', - 'dayplan.noteSubtitle': 'Daily Note', - 'dayplan.totalCost': 'Total Cost', - 'dayplan.days': 'Days', - 'dayplan.dayN': 'Day {n}', - 'dayplan.calculating': 'Calculating...', - 'dayplan.route': 'Route', - 'dayplan.optimize': 'Optimize', - 'dayplan.optimized': 'Route optimized', - 'dayplan.routeError': 'Failed to calculate route', - 'dayplan.toast.needTwoPlaces': 'At least two places needed for route optimization', - 'dayplan.toast.routeOptimized': 'Route optimized', - 'dayplan.toast.noGeoPlaces': 'No places with coordinates found for route calculation', - 'dayplan.confirmed': 'Confirmed', - 'dayplan.pendingRes': 'Pending', + 'dayplan.emptyDay': 'Belum ada tempat yang direncanakan untuk hari ini', + 'dayplan.cannotReorderTransport': 'Pemesanan dengan waktu tetap tidak bisa diurutkan ulang', + 'dayplan.confirmRemoveTimeTitle': 'Hapus waktu?', + 'dayplan.confirmRemoveTimeBody': 'Tempat ini memiliki waktu tetap ({time}). Memindahkannya akan menghapus waktu dan mengizinkan pengurutan bebas.', + 'dayplan.confirmRemoveTimeAction': 'Hapus waktu & pindahkan', + 'dayplan.cannotDropOnTimed': 'Item tidak dapat ditempatkan di antara entri yang terikat waktu', + 'dayplan.cannotBreakChronology': 'Ini akan merusak urutan kronologis item bertanggal dan pemesanan', + 'dayplan.addNote': 'Tambah Catatan', + 'dayplan.editNote': 'Edit Catatan', + 'dayplan.noteAdd': 'Tambah Catatan', + 'dayplan.noteEdit': 'Edit Catatan', + 'dayplan.noteTitle': 'Catatan', + 'dayplan.noteSubtitle': 'Catatan Harian', + 'dayplan.totalCost': 'Total Biaya', + 'dayplan.days': 'Hari', + 'dayplan.dayN': 'Hari {n}', + 'dayplan.calculating': 'Menghitung...', + 'dayplan.route': 'Rute', + 'dayplan.optimize': 'Optimalkan', + 'dayplan.optimized': 'Rute dioptimalkan', + 'dayplan.routeError': 'Gagal menghitung rute', + 'dayplan.toast.needTwoPlaces': 'Diperlukan minimal dua tempat untuk optimasi rute', + 'dayplan.toast.routeOptimized': 'Rute dioptimalkan', + 'dayplan.toast.noGeoPlaces': 'Tidak ditemukan tempat dengan koordinat untuk kalkulasi rute', + 'dayplan.confirmed': 'Dikonfirmasi', + 'dayplan.pendingRes': 'Menunggu', 'dayplan.pdf': 'PDF', - 'dayplan.pdfTooltip': 'Export day plan as PDF', - 'dayplan.pdfError': 'Failed to export PDF', + 'dayplan.pdfTooltip': 'Ekspor rencana hari sebagai PDF', + 'dayplan.pdfError': 'Gagal mengekspor PDF', // Places Sidebar - 'places.addPlace': 'Add Place/Activity', - 'places.importGpx': 'GPX', - 'places.gpxImported': '{count} places imported from GPX', - 'places.urlResolved': 'Place imported from URL', - 'places.gpxError': 'GPX import failed', - 'places.importGoogleList': 'Google List', - 'places.googleListHint': 'Paste a shared Google Maps list link to import all places.', - 'places.googleListImported': '{count} places imported from "{list}"', - 'places.googleListError': 'Failed to import Google Maps list', - 'places.viewDetails': 'View Details', - 'places.assignToDay': 'Add to which day?', - 'places.all': 'All', - 'places.unplanned': 'Unplanned', - 'places.search': 'Search places...', - 'places.allCategories': 'All Categories', - 'places.categoriesSelected': 'categories', - 'places.clearFilter': 'Clear filter', - 'places.count': '{count} places', - 'places.countSingular': '1 place', - 'places.allPlanned': 'All places are planned', - 'places.noneFound': 'No places found', - 'places.editPlace': 'Edit Place', - 'places.formName': 'Name', - 'places.formNamePlaceholder': 'e.g. Eiffel Tower', - 'places.formDescription': 'Description', - 'places.formDescriptionPlaceholder': 'Short description...', - 'places.formAddress': 'Address', - 'places.formAddressPlaceholder': 'Street, City, Country', - 'places.formLat': 'Latitude (e.g. 48.8566)', - 'places.formLng': 'Longitude (e.g. 2.3522)', - 'places.formCategory': 'Category', - 'places.noCategory': 'No Category', - 'places.categoryNamePlaceholder': 'Category name', - 'places.formTime': 'Time', - 'places.startTime': 'Start', - 'places.endTime': 'End', - 'places.endTimeBeforeStart': 'End time is before start time', - 'places.timeCollision': 'Time overlap with:', - 'places.formWebsite': 'Website', - 'places.formNotesPlaceholder': 'Personal notes...', - 'places.formReservation': 'Reservation', - 'places.reservationNotesPlaceholder': 'Reservation notes, confirmation number...', - 'places.mapsSearchPlaceholder': 'Search places...', - 'places.mapsSearchError': 'Place search failed.', - 'places.osmHint': 'Using OpenStreetMap search (no photos, opening hours, or ratings). Add a Google API key in settings for full details.', - 'places.osmActive': 'Search via OpenStreetMap (no photos, ratings or opening hours). Add a Google API key in Settings for enhanced data.', - 'places.categoryCreateError': 'Failed to create category', - 'places.nameRequired': 'Please enter a name', - 'places.saveError': 'Failed to save', + 'places.addPlace': 'Tambah Tempat/Aktivitas', + 'places.importFile': 'Impor file', + 'places.sidebarDrop': 'Lepas untuk mengimpor', + 'places.importFileHint': 'Impor file .gpx, .kml, atau .kmz dari Google My Maps, Google Earth, atau pelacak GPS.', + 'places.importFileDropHere': 'Klik untuk memilih file atau seret dan lepas di sini', + 'places.importFileDropActive': 'Lepas file untuk memilih', + 'places.importFileUnsupported': 'Jenis file tidak didukung. Gunakan .gpx, .kml, atau .kmz.', + 'places.importFileTooLarge': 'File terlalu besar. Ukuran unggah maksimum adalah {maxMb} MB.', + 'places.importFileError': 'Impor gagal', + 'places.importAllSkipped': 'Semua tempat sudah ada di perjalanan.', + 'places.gpxImported': '{count} tempat diimpor dari GPX', + 'places.kmlKmzImported': '{count} tempat diimpor dari KMZ/KML', + 'places.urlResolved': 'Tempat diimpor dari URL', + 'places.importList': 'Impor Daftar', + 'places.kmlKmzSummaryValues': 'Placemark: {total} • Diimpor: {created} • Dilewati: {skipped}', + 'places.importGoogleList': 'Daftar Google', + 'places.importNaverList': 'Daftar Naver', + 'places.googleListHint': 'Tempel tautan daftar Google Maps yang dibagikan untuk mengimpor semua tempat.', + 'places.googleListImported': '{count} tempat diimpor dari "{list}"', + 'places.googleListError': 'Gagal mengimpor daftar Google Maps', + 'places.naverListHint': 'Tempel tautan daftar Naver Maps yang dibagikan untuk mengimpor semua tempat.', + 'places.naverListImported': '{count} tempat diimpor dari "{list}"', + 'places.naverListError': 'Gagal mengimpor daftar Naver Maps', + 'places.viewDetails': 'Lihat Detail', + 'places.assignToDay': 'Tambah ke hari mana?', + 'places.all': 'Semua', + 'places.unplanned': 'Belum direncanakan', + 'places.search': 'Cari tempat...', + 'places.allCategories': 'Semua Kategori', + 'places.categoriesSelected': 'kategori', + 'places.clearFilter': 'Hapus filter', + 'places.count': '{count} tempat', + 'places.countSingular': '1 tempat', + 'places.allPlanned': 'Semua tempat sudah direncanakan', + 'places.noneFound': 'Tidak ada tempat ditemukan', + 'places.editPlace': 'Edit Tempat', + 'places.formName': 'Nama', + 'places.formNamePlaceholder': 'mis. Menara Eiffel', + 'places.formDescription': 'Deskripsi', + 'places.formDescriptionPlaceholder': 'Deskripsi singkat...', + 'places.formAddress': 'Alamat', + 'places.formAddressPlaceholder': 'Jalan, Kota, Negara', + 'places.formLat': 'Lintang (mis. 48.8566)', + 'places.formLng': 'Bujur (mis. 2.3522)', + 'places.formCategory': 'Kategori', + 'places.noCategory': 'Tanpa Kategori', + 'places.categoryNamePlaceholder': 'Nama kategori', + 'places.formTime': 'Waktu', + 'places.startTime': 'Mulai', + 'places.endTime': 'Selesai', + 'places.endTimeBeforeStart': 'Waktu selesai lebih awal dari waktu mulai', + 'places.timeCollision': 'Waktu tumpang tindih dengan:', + 'places.formWebsite': 'Situs web', + 'places.formNotes': 'Catatan', + 'places.formNotesPlaceholder': 'Catatan pribadi...', + 'places.formReservation': 'Reservasi', + 'places.reservationNotesPlaceholder': 'Catatan reservasi, nomor konfirmasi...', + 'places.mapsSearchPlaceholder': 'Cari tempat...', + 'places.mapsSearchError': 'Pencarian tempat gagal.', + 'places.loadingDetails': 'Memuat detail tempat…', + 'places.osmHint': 'Menggunakan pencarian OpenStreetMap (tanpa foto, jam buka, atau penilaian). Tambahkan Google API key di pengaturan untuk detail lengkap.', + 'places.osmActive': 'Pencarian via OpenStreetMap (tanpa foto, penilaian, atau jam buka). Tambahkan Google API key di Pengaturan untuk data yang lebih lengkap.', + 'places.categoryCreateError': 'Gagal membuat kategori', + 'places.nameRequired': 'Harap masukkan nama', + 'places.saveError': 'Gagal menyimpan', // Place Inspector - 'inspector.opened': 'Open', - 'inspector.closed': 'Closed', - 'inspector.openingHours': 'Opening Hours', - 'inspector.showHours': 'Show opening hours', - 'inspector.files': 'Files', - 'inspector.filesCount': '{count} files', - 'inspector.removeFromDay': 'Remove from Day', - 'inspector.addToDay': 'Add to Day', - 'inspector.confirmedRes': 'Confirmed Reservation', - 'inspector.pendingRes': 'Pending Reservation', - 'inspector.google': 'Open in Google Maps', - 'inspector.website': 'Open Website', - 'inspector.addRes': 'Reservation', - 'inspector.editRes': 'Edit Reservation', - 'inspector.participants': 'Participants', - 'inspector.trackStats': 'Track Stats', + 'inspector.opened': 'Buka', + 'inspector.closed': 'Tutup', + 'inspector.openingHours': 'Jam Buka', + 'inspector.showHours': 'Tampilkan jam buka', + 'inspector.files': 'File', + 'inspector.filesCount': '{count} file', + 'inspector.remove': 'Hapus', + 'inspector.removeFromDay': 'Hapus dari Hari', + 'inspector.addToDay': 'Tambah ke Hari', + 'inspector.confirmedRes': 'Reservasi Dikonfirmasi', + 'inspector.pendingRes': 'Reservasi Menunggu', + 'inspector.google': 'Buka di Google Maps', + 'inspector.website': 'Buka Situs Web', + 'inspector.addRes': 'Reservasi', + 'inspector.editRes': 'Edit Reservasi', + 'inspector.participants': 'Peserta', + 'inspector.trackStats': 'Statistik Jalur', // Reservations - 'reservations.title': 'Bookings', - 'reservations.empty': 'No reservations yet', - 'reservations.emptyHint': 'Add reservations for flights, hotels and more', - 'reservations.add': 'Add Reservation', - 'reservations.addManual': 'Manual Booking', - 'reservations.placeHint': 'Tip: Reservations are best created directly from a place to link them with your day plan.', - 'reservations.confirmed': 'Confirmed', - 'reservations.pending': 'Pending', - 'reservations.summary': '{confirmed} confirmed, {pending} pending', - 'reservations.fromPlan': 'From Plan', - 'reservations.showFiles': 'Show Files', - 'reservations.editTitle': 'Edit Reservation', + 'reservations.title': 'Pemesanan', + 'reservations.empty': 'Belum ada reservasi', + 'reservations.emptyHint': 'Tambahkan reservasi untuk penerbangan, hotel, dan lainnya', + 'reservations.add': 'Tambah Reservasi', + 'reservations.addManual': 'Pemesanan Manual', + 'reservations.placeHint': 'Tips: Reservasi paling baik dibuat langsung dari sebuah tempat agar terhubung dengan rencana harianmu.', + 'reservations.confirmed': 'Dikonfirmasi', + 'reservations.pending': 'Tertunda', + 'reservations.summary': '{confirmed} dikonfirmasi, {pending} tertunda', + 'reservations.fromPlan': 'Dari Rencana', + 'reservations.showFiles': 'Tampilkan File', + 'reservations.editTitle': 'Edit Reservasi', 'reservations.status': 'Status', - 'reservations.datetime': 'Date & Time', - 'reservations.startTime': 'Start time', - 'reservations.endTime': 'End time', - 'reservations.date': 'Date', - 'reservations.time': 'Time', - 'reservations.timeAlt': 'Time (alternative, e.g. 19:30)', - 'reservations.notes': 'Notes', - 'reservations.notesPlaceholder': 'Additional notes...', - 'reservations.meta.airline': 'Airline', - 'reservations.meta.flightNumber': 'Flight No.', - 'reservations.meta.from': 'From', - 'reservations.meta.to': 'To', - 'reservations.meta.trainNumber': 'Train No.', - 'reservations.meta.platform': 'Platform', - 'reservations.meta.seat': 'Seat', + 'reservations.datetime': 'Tanggal & Waktu', + 'reservations.startTime': 'Waktu mulai', + 'reservations.endTime': 'Waktu selesai', + 'reservations.date': 'Tanggal', + 'reservations.time': 'Waktu', + 'reservations.timeAlt': 'Waktu (alternatif, mis. 19:30)', + 'reservations.notes': 'Catatan', + 'reservations.notesPlaceholder': 'Catatan tambahan...', + 'reservations.meta.airline': 'Maskapai', + 'reservations.meta.flightNumber': 'No. Penerbangan', + 'reservations.meta.from': 'Dari', + 'reservations.meta.to': 'Ke', + 'reservations.meta.trainNumber': 'No. Kereta', + 'reservations.meta.platform': 'Peron', + 'reservations.meta.seat': 'Kursi', 'reservations.meta.checkIn': 'Check-in', 'reservations.meta.checkOut': 'Check-out', - 'reservations.meta.linkAccommodation': 'Accommodation', - 'reservations.meta.pickAccommodation': 'Link to accommodation', - 'reservations.meta.noAccommodation': 'None', - 'reservations.meta.hotelPlace': 'Accommodation', - 'reservations.meta.pickHotel': 'Select accommodation', - 'reservations.meta.fromDay': 'From', - 'reservations.meta.toDay': 'To', - 'reservations.meta.selectDay': 'Select day', - 'reservations.type.flight': 'Flight', - 'reservations.type.hotel': 'Accommodation', - 'reservations.type.restaurant': 'Restaurant', - 'reservations.type.train': 'Train', - 'reservations.type.car': 'Rental Car', - 'reservations.type.cruise': 'Cruise', - 'reservations.type.event': 'Event', - 'reservations.type.tour': 'Tour', - 'reservations.type.other': 'Other', - 'reservations.confirm.delete': 'Are you sure you want to delete the reservation "{name}"?', - 'reservations.confirm.deleteTitle': 'Delete booking?', - 'reservations.confirm.deleteBody': '"{name}" will be permanently deleted.', - 'reservations.toast.updated': 'Reservation updated', - 'reservations.toast.removed': 'Reservation deleted', - 'reservations.toast.fileUploaded': 'File uploaded', - 'reservations.toast.uploadError': 'Failed to upload', - 'reservations.newTitle': 'New Reservation', - 'reservations.bookingType': 'Booking Type', - 'reservations.titleLabel': 'Title', - 'reservations.titlePlaceholder': 'e.g. Lufthansa LH123, Hotel Adlon, ...', - 'reservations.locationAddress': 'Location / Address', - 'reservations.locationPlaceholder': 'Address, Airport, Hotel...', - 'reservations.confirmationCode': 'Booking Code', - 'reservations.confirmationPlaceholder': 'e.g. ABC12345', - 'reservations.day': 'Day', - 'reservations.noDay': 'No Day', - 'reservations.place': 'Place', - 'reservations.noPlace': 'No Place', - 'reservations.pendingSave': 'will be saved…', - 'reservations.uploading': 'Uploading...', - 'reservations.attachFile': 'Attach file', - 'reservations.linkExisting': 'Link existing file', - 'reservations.toast.saveError': 'Failed to save', - 'reservations.toast.updateError': 'Failed to update', - 'reservations.toast.deleteError': 'Failed to delete', - 'reservations.confirm.remove': 'Remove reservation for "{name}"?', - 'reservations.linkAssignment': 'Link to day assignment', - 'reservations.pickAssignment': 'Select an assignment from your plan...', - 'reservations.noAssignment': 'No link (standalone)', - 'reservations.price': 'Price', - 'reservations.budgetCategory': 'Budget category', - 'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation', - 'reservations.budgetCategoryAuto': 'Auto (from booking type)', - 'reservations.budgetHint': 'A budget entry will be created automatically when saving.', - 'reservations.departureDate': 'Departure', - 'reservations.arrivalDate': 'Arrival', - 'reservations.departureTime': 'Dep. time', - 'reservations.arrivalTime': 'Arr. time', - 'reservations.pickupDate': 'Pickup', - 'reservations.returnDate': 'Return', - 'reservations.pickupTime': 'Pickup time', - 'reservations.returnTime': 'Return time', - 'reservations.endDate': 'End date', - 'reservations.meta.departureTimezone': 'Dep. TZ', - 'reservations.meta.arrivalTimezone': 'Arr. TZ', - 'reservations.span.departure': 'Departure', - 'reservations.span.arrival': 'Arrival', - 'reservations.span.inTransit': 'In transit', - 'reservations.span.pickup': 'Pickup', - 'reservations.span.return': 'Return', - 'reservations.span.active': 'Active', - 'reservations.span.start': 'Start', - 'reservations.span.end': 'End', - 'reservations.span.ongoing': 'Ongoing', - 'reservations.validation.endBeforeStart': 'End date/time must be after start date/time', + 'reservations.meta.linkAccommodation': 'Akomodasi', + 'reservations.meta.pickAccommodation': 'Hubungkan ke akomodasi', + 'reservations.meta.noAccommodation': 'Tidak ada', + 'reservations.meta.hotelPlace': 'Akomodasi', + 'reservations.meta.pickHotel': 'Pilih akomodasi', + 'reservations.meta.fromDay': 'Dari', + 'reservations.meta.toDay': 'Sampai', + 'reservations.meta.selectDay': 'Pilih hari', + 'reservations.type.flight': 'Penerbangan', + 'reservations.type.hotel': 'Akomodasi', + 'reservations.type.restaurant': 'Restoran', + 'reservations.type.train': 'Kereta', + 'reservations.type.car': 'Mobil Sewa', + 'reservations.type.cruise': 'Kapal Pesiar', + 'reservations.type.event': 'Acara', + 'reservations.type.tour': 'Tur', + 'reservations.type.other': 'Lainnya', + 'reservations.confirm.delete': 'Yakin ingin menghapus reservasi "{name}"?', + 'reservations.confirm.deleteTitle': 'Hapus pemesanan?', + 'reservations.confirm.deleteBody': '"{name}" akan dihapus permanen.', + 'reservations.toast.updated': 'Reservasi diperbarui', + 'reservations.toast.removed': 'Reservasi dihapus', + 'reservations.toast.fileUploaded': 'File diunggah', + 'reservations.toast.uploadError': 'Gagal mengunggah', + 'reservations.newTitle': 'Reservasi Baru', + 'reservations.bookingType': 'Jenis Pemesanan', + 'reservations.titleLabel': 'Judul', + 'reservations.titlePlaceholder': 'mis. Lufthansa LH123, Hotel Adlon, ...', + 'reservations.locationAddress': 'Lokasi / Alamat', + 'reservations.locationPlaceholder': 'Alamat, Bandara, Hotel...', + 'reservations.confirmationCode': 'Kode Pemesanan', + 'reservations.confirmationPlaceholder': 'mis. ABC12345', + 'reservations.day': 'Hari', + 'reservations.noDay': 'Tanpa Hari', + 'reservations.place': 'Tempat', + 'reservations.noPlace': 'Tanpa Tempat', + 'reservations.pendingSave': 'akan disimpan…', + 'reservations.uploading': 'Mengunggah...', + 'reservations.attachFile': 'Lampirkan file', + 'reservations.linkExisting': 'Hubungkan file yang ada', + 'reservations.toast.saveError': 'Gagal menyimpan', + 'reservations.toast.updateError': 'Gagal memperbarui', + 'reservations.toast.deleteError': 'Gagal menghapus', + 'reservations.confirm.remove': 'Hapus reservasi untuk "{name}"?', + 'reservations.linkAssignment': 'Hubungkan ke jadwal harian', + 'reservations.pickAssignment': 'Pilih jadwal dari rencanamu...', + 'reservations.noAssignment': 'Tanpa tautan (mandiri)', + 'reservations.price': 'Harga', + 'reservations.budgetCategory': 'Kategori anggaran', + 'reservations.budgetCategoryPlaceholder': 'mis. Transportasi, Akomodasi', + 'reservations.budgetCategoryAuto': 'Otomatis (dari jenis pemesanan)', + 'reservations.budgetHint': 'Entri anggaran akan dibuat otomatis saat menyimpan.', + 'reservations.departureDate': 'Keberangkatan', + 'reservations.arrivalDate': 'Kedatangan', + 'reservations.departureTime': 'Waktu berangkat', + 'reservations.arrivalTime': 'Waktu tiba', + 'reservations.pickupDate': 'Penjemputan', + 'reservations.returnDate': 'Pengembalian', + 'reservations.pickupTime': 'Waktu jemput', + 'reservations.returnTime': 'Waktu kembali', + 'reservations.endDate': 'Tanggal selesai', + 'reservations.meta.departureTimezone': 'TZ Berangkat', + 'reservations.meta.arrivalTimezone': 'TZ Tiba', + 'reservations.span.departure': 'Keberangkatan', + 'reservations.span.arrival': 'Kedatangan', + 'reservations.span.inTransit': 'Dalam perjalanan', + 'reservations.span.pickup': 'Penjemputan', + 'reservations.span.return': 'Pengembalian', + 'reservations.span.active': 'Aktif', + 'reservations.span.start': 'Mulai', + 'reservations.span.end': 'Selesai', + 'reservations.span.ongoing': 'Berlangsung', + 'reservations.validation.endBeforeStart': 'Tanggal/waktu selesai harus setelah tanggal/waktu mulai', // Budget - 'budget.title': 'Budget', - 'budget.exportCsv': 'Export CSV', - 'budget.emptyTitle': 'No budget created yet', - 'budget.emptyText': 'Create categories and entries to plan your travel budget', - 'budget.emptyPlaceholder': 'Enter category name...', - 'budget.createCategory': 'Create Category', - 'budget.category': 'Category', - 'budget.categoryName': 'Category Name', - 'budget.table.name': 'Name', + 'budget.title': 'Anggaran', + 'budget.exportCsv': 'Ekspor CSV', + 'budget.emptyTitle': 'Belum ada anggaran', + 'budget.emptyText': 'Buat kategori dan entri untuk merencanakan anggaran perjalananmu', + 'budget.emptyPlaceholder': 'Masukkan nama kategori...', + 'budget.createCategory': 'Buat Kategori', + 'budget.category': 'Kategori', + 'budget.categoryName': 'Nama Kategori', + 'budget.table.name': 'Nama', 'budget.table.total': 'Total', - 'budget.table.persons': 'Persons', - 'budget.table.days': 'Days', - 'budget.table.perPerson': 'Per Person', - 'budget.table.perDay': 'Per Day', - 'budget.table.perPersonDay': 'P. p / Day', - 'budget.table.note': 'Note', - 'budget.table.date': 'Date', - 'budget.newEntry': 'New Entry', - 'budget.defaultEntry': 'New Entry', - 'budget.defaultCategory': 'New Category', + 'budget.table.persons': 'Orang', + 'budget.table.days': 'Hari', + 'budget.table.perPerson': 'Per Orang', + 'budget.table.perDay': 'Per Hari', + 'budget.table.perPersonDay': 'P. o / Hari', + 'budget.table.note': 'Catatan', + 'budget.table.date': 'Tanggal', + 'budget.newEntry': 'Entri Baru', + 'budget.defaultEntry': 'Entri Baru', + 'budget.defaultCategory': 'Kategori Baru', 'budget.total': 'Total', - 'budget.totalBudget': 'Total Budget', - 'budget.byCategory': 'By Category', - 'budget.editTooltip': 'Click to edit', - 'budget.linkedToReservation': 'Linked to a reservation — edit the name there', - 'budget.confirm.deleteCategory': 'Are you sure you want to delete the category "{name}" with {count} entries?', - 'budget.deleteCategory': 'Delete Category', - 'budget.perPerson': 'Per Person', - 'budget.paid': 'Paid', - 'budget.open': 'Open', - 'budget.noMembers': 'No members assigned', - 'budget.settlement': 'Settlement', - 'budget.settlementInfo': 'Click a member avatar on a budget item to mark them green — this means they paid. The settlement then shows who owes whom and how much.', - 'budget.netBalances': 'Net Balances', + 'budget.totalBudget': 'Total Anggaran', + 'budget.byCategory': 'Per Kategori', + 'budget.editTooltip': 'Klik untuk edit', + 'budget.linkedToReservation': 'Terhubung ke reservasi — edit nama di sana', + 'budget.confirm.deleteCategory': 'Yakin ingin menghapus kategori "{name}" dengan {count} entri?', + 'budget.deleteCategory': 'Hapus Kategori', + 'budget.perPerson': 'Per Orang', + 'budget.paid': 'Sudah dibayar', + 'budget.open': 'Belum dibayar', + 'budget.noMembers': 'Tidak ada anggota yang ditugaskan', + 'budget.settlement': 'Penyelesaian', + 'budget.settlementInfo': 'Klik foto anggota di item anggaran untuk menandainya hijau — artinya mereka sudah bayar. Penyelesaian lalu menunjukkan siapa berhutang ke siapa dan berapa.', + 'budget.netBalances': 'Saldo Bersih', // Files - 'files.title': 'Files', - 'files.count': '{count} files', - 'files.countSingular': '1 file', - 'files.uploaded': '{count} uploaded', - 'files.uploadError': 'Upload failed', - 'files.dropzone': 'Drop files here', - 'files.dropzoneHint': 'or click to browse', - 'files.allowedTypes': 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 MB', - 'files.uploading': 'Uploading...', - 'files.filterAll': 'All', + 'files.title': 'File', + 'files.pageTitle': 'File & Dokumen', + 'files.subtitle': '{count} file untuk {trip}', + 'files.downloadPdf': 'Unduh PDF', + 'files.count': '{count} file', + 'files.countSingular': '1 berkas', + 'files.uploaded': '{count} diunggah', + 'files.uploadError': 'Gagal mengunggah', + 'files.dropzone': 'Jatuhkan file di sini', + 'files.dropzoneHint': 'atau klik untuk memilih', + 'files.allowedTypes': 'Gambar, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Maks 50 MB', + 'files.uploading': 'Mengunggah...', + 'files.filterAll': 'Semua', 'files.filterPdf': 'PDFs', - 'files.filterImages': 'Images', - 'files.filterDocs': 'Documents', - 'files.filterCollab': 'Collab Notes', - 'files.sourceCollab': 'From Collab Notes', - 'files.empty': 'No files yet', - 'files.emptyHint': 'Upload files to attach them to your trip', - 'files.openTab': 'Open in new tab', - 'files.confirm.delete': 'Are you sure you want to delete this file?', - 'files.toast.deleted': 'File deleted', - 'files.toast.deleteError': 'Failed to delete file', - 'files.sourcePlan': 'Day Plan', - 'files.sourceBooking': 'Booking', - 'files.attach': 'Attach', - 'files.pasteHint': 'You can also paste images from clipboard (Ctrl+V)', - 'files.trash': 'Trash', - 'files.trashEmpty': 'Trash is empty', - 'files.emptyTrash': 'Empty Trash', - 'files.restore': 'Restore', - 'files.star': 'Star', - 'files.unstar': 'Unstar', - 'files.assign': 'Assign', - 'files.assignTitle': 'Assign File', - 'files.assignPlace': 'Place', - 'files.assignBooking': 'Booking', - 'files.unassigned': 'Unassigned', - 'files.unlink': 'Remove link', - 'files.toast.trashed': 'Moved to trash', - 'files.toast.restored': 'File restored', - 'files.toast.trashEmptied': 'Trash emptied', - 'files.toast.assigned': 'File assigned', - 'files.toast.assignError': 'Assignment failed', - 'files.toast.restoreError': 'Restore failed', - 'files.confirm.permanentDelete': 'Permanently delete this file? This cannot be undone.', - 'files.confirm.emptyTrash': 'Permanently delete all trashed files? This cannot be undone.', - 'files.noteLabel': 'Note', - 'files.notePlaceholder': 'Add a note...', + 'files.filterImages': 'Gambar', + 'files.filterDocs': 'Dokumen', + 'files.filterCollab': 'Catatan Collab', + 'files.sourceCollab': 'Dari Catatan Collab', + 'files.empty': 'Belum ada file', + 'files.emptyHint': 'Unggah file untuk melampirkannya ke perjalananmu', + 'files.openTab': 'Buka di tab baru', + 'files.confirm.delete': 'Yakin ingin menghapus file ini?', + 'files.toast.deleted': 'File dihapus', + 'files.toast.deleteError': 'Gagal menghapus file', + 'files.sourcePlan': 'Rencana Harian', + 'files.sourceBooking': 'Pemesanan', + 'files.attach': 'Lampirkan', + 'files.pasteHint': 'Kamu juga bisa menempel gambar dari clipboard (Ctrl+V)', + 'files.trash': 'Sampah', + 'files.trashEmpty': 'Sampah kosong', + 'files.emptyTrash': 'Kosongkan Sampah', + 'files.restore': 'Pulihkan', + 'files.star': 'Bintang', + 'files.unstar': 'Hapus bintang', + 'files.assign': 'Tugaskan', + 'files.assignTitle': 'Tugaskan File', + 'files.assignPlace': 'Tempat', + 'files.assignBooking': 'Pemesanan', + 'files.unassigned': 'Tidak ditugaskan', + 'files.unlink': 'Hapus tautan', + 'files.toast.trashed': 'Dipindahkan ke sampah', + 'files.toast.restored': 'File dipulihkan', + 'files.toast.trashEmptied': 'Sampah dikosongkan', + 'files.toast.assigned': 'File ditugaskan', + 'files.toast.assignError': 'Penugasan gagal', + 'files.toast.restoreError': 'Pemulihan gagal', + 'files.confirm.permanentDelete': 'Hapus file ini secara permanen? Tindakan ini tidak bisa dibatalkan.', + 'files.confirm.emptyTrash': 'Hapus semua file di sampah secara permanen? Tindakan ini tidak bisa dibatalkan.', + 'files.noteLabel': 'Catatan', + 'files.notePlaceholder': 'Tambahkan catatan...', // Packing - 'packing.title': 'Packing List', - 'packing.empty': 'Packing list is empty', - 'packing.import': 'Import', - 'packing.importTitle': 'Import Packing List', - 'packing.importHint': 'One item per line. Format: Category, Name, Weight in g (optional), Bag (optional), checked/unchecked (optional)', - 'packing.importPlaceholder': 'Hygiene, Toothbrush\nClothing, T-Shirts, 200\nDocuments, Passport, , Carry-on\nElectronics, Charger, 50, Suitcase, checked', - 'packing.importCsv': 'Load CSV/TXT', - 'packing.importAction': 'Import {count}', - 'packing.importSuccess': '{count} items imported', - 'packing.importError': 'Import failed', - 'packing.importEmpty': 'No items to import', - 'packing.progress': '{packed} of {total} packed ({percent}%)', - 'packing.clearChecked': 'Remove {count} checked', - 'packing.clearCheckedShort': 'Remove {count}', - 'packing.suggestions': 'Suggestions', - 'packing.suggestionsTitle': 'Add Suggestions', - 'packing.allSuggested': 'All suggestions added', - 'packing.allPacked': 'All packed!', - 'packing.addPlaceholder': 'Add new item...', - 'packing.categoryPlaceholder': 'Category...', - 'packing.filterAll': 'All', - 'packing.filterOpen': 'Open', - 'packing.filterDone': 'Done', - 'packing.emptyTitle': 'Packing list is empty', - 'packing.emptyHint': 'Add items or use the suggestions', - 'packing.emptyFiltered': 'No items match this filter', - 'packing.menuRename': 'Rename', - 'packing.menuCheckAll': 'Check All', - 'packing.menuUncheckAll': 'Uncheck All', - 'packing.menuDeleteCat': 'Delete Category', - 'packing.assignUser': 'Assign user', - 'packing.noMembers': 'No trip members', - 'packing.addItem': 'Add item', - 'packing.addItemPlaceholder': 'Item name...', - 'packing.addCategory': 'Add category', - 'packing.newCategoryPlaceholder': 'Category name (e.g. Clothing)', - 'packing.applyTemplate': 'Apply template', + 'packing.title': 'Daftar Bawaan', + 'packing.empty': 'Daftar bawaan kosong', + 'packing.import': 'Impor', + 'packing.importTitle': 'Impor Daftar Bawaan', + 'packing.importHint': 'Satu item per baris. Format: Kategori, Nama, Berat dalam g (opsional), Tas (opsional), checked/unchecked (opsional)', + 'packing.importPlaceholder': 'Kebersihan, Sikat Gigi\nPakaian, Kaos, 200\nDokumen, Paspor, , Kabin\nElektronik, Charger, 50, Koper, checked', + 'packing.importCsv': 'Muat CSV/TXT', + 'packing.importAction': 'Impor {count}', + 'packing.importSuccess': '{count} item berhasil diimpor', + 'packing.importError': 'Impor gagal', + 'packing.importEmpty': 'Tidak ada item untuk diimpor', + 'packing.progress': '{packed} dari {total} sudah dikemas ({percent}%)', + 'packing.clearChecked': 'Hapus {count} yang dicentang', + 'packing.clearCheckedShort': 'Hapus {count}', + 'packing.suggestions': 'Saran', + 'packing.suggestionsTitle': 'Tambah Saran', + 'packing.allSuggested': 'Semua saran sudah ditambahkan', + 'packing.allPacked': 'Semua sudah dikemas!', + 'packing.addPlaceholder': 'Tambah item baru...', + 'packing.categoryPlaceholder': 'Kategori...', + 'packing.filterAll': 'Semua', + 'packing.filterOpen': 'Belum', + 'packing.filterDone': 'Selesai', + 'packing.emptyTitle': 'Daftar bawaan kosong', + 'packing.emptyHint': 'Tambah item atau gunakan saran', + 'packing.emptyFiltered': 'Tidak ada item yang cocok dengan filter ini', + 'packing.menuRename': 'Ganti Nama', + 'packing.menuCheckAll': 'Centang Semua', + 'packing.menuUncheckAll': 'Hapus Centang Semua', + 'packing.menuDeleteCat': 'Hapus Kategori', + 'packing.noMembers': 'Tidak ada anggota perjalanan', + 'packing.addItem': 'Tambah item', + 'packing.addItemPlaceholder': 'Nama item...', + 'packing.addCategory': 'Tambah kategori', + 'packing.newCategoryPlaceholder': 'Nama kategori (contoh: Pakaian)', + 'packing.applyTemplate': 'Terapkan template', 'packing.template': 'Template', - 'packing.templateApplied': '{count} items added from template', - 'packing.templateError': 'Failed to apply template', - 'packing.saveAsTemplate': 'Save as template', - 'packing.templateName': 'Template name', - 'packing.templateSaved': 'Packing list saved as template', - 'packing.assignUser': 'Assign user', - 'packing.bags': 'Bags', - 'packing.noBag': 'Unassigned', - 'packing.totalWeight': 'Total weight', - 'packing.bagName': 'Bag name...', - 'packing.addBag': 'Add bag', - 'packing.changeCategory': 'Change Category', - 'packing.confirm.clearChecked': 'Are you sure you want to remove {count} checked items?', - 'packing.confirm.deleteCat': 'Are you sure you want to delete the category "{name}" with {count} items?', - 'packing.defaultCategory': 'Other', - 'packing.toast.saveError': 'Failed to save', - 'packing.toast.deleteError': 'Failed to delete', - 'packing.toast.renameError': 'Failed to rename', - 'packing.toast.addError': 'Failed to add', + 'packing.templateApplied': '{count} item ditambahkan dari template', + 'packing.templateError': 'Gagal menerapkan template', + 'packing.saveAsTemplate': 'Simpan sebagai template', + 'packing.templateName': 'Nama template', + 'packing.templateSaved': 'Daftar bawaan disimpan sebagai template', + 'packing.bags': 'Tas', + 'packing.noBag': 'Belum ditugaskan', + 'packing.totalWeight': 'Total berat', + 'packing.bagName': 'Nama tas...', + 'packing.addBag': 'Tambah tas', + 'packing.changeCategory': 'Ganti Kategori', + 'packing.confirm.clearChecked': 'Yakin ingin menghapus {count} item yang dicentang?', + 'packing.confirm.deleteCat': 'Yakin ingin menghapus kategori "{name}" beserta {count} item di dalamnya?', + 'packing.defaultCategory': 'Lainnya', + 'packing.toast.saveError': 'Gagal menyimpan', + 'packing.toast.deleteError': 'Gagal menghapus', + 'packing.toast.renameError': 'Gagal mengganti nama', + 'packing.toast.addError': 'Gagal menambahkan', // Packing suggestions 'packing.suggestions.items': [ - { name: 'Passport', category: 'Documents' }, - { name: 'ID Card', category: 'Documents' }, - { name: 'Travel Insurance', category: 'Documents' }, - { name: 'Flight Tickets', category: 'Documents' }, - { name: 'Credit Card', category: 'Finances' }, - { name: 'Cash', category: 'Finances' }, - { name: 'Visa', category: 'Documents' }, - { name: 'T-Shirts', category: 'Clothing' }, - { name: 'Pants', category: 'Clothing' }, - { name: 'Underwear', category: 'Clothing' }, - { name: 'Socks', category: 'Clothing' }, - { name: 'Jacket', category: 'Clothing' }, - { name: 'Sleepwear', category: 'Clothing' }, - { name: 'Swimwear', category: 'Clothing' }, - { name: 'Rain Jacket', category: 'Clothing' }, - { name: 'Comfortable Shoes', category: 'Clothing' }, - { name: 'Toothbrush', category: 'Toiletries' }, - { name: 'Toothpaste', category: 'Toiletries' }, - { name: 'Shampoo', category: 'Toiletries' }, - { name: 'Deodorant', category: 'Toiletries' }, - { name: 'Sunscreen', category: 'Toiletries' }, - { name: 'Razor', category: 'Toiletries' }, - { name: 'Charger', category: 'Electronics' }, - { name: 'Power Bank', category: 'Electronics' }, - { name: 'Headphones', category: 'Electronics' }, - { name: 'Travel Adapter', category: 'Electronics' }, - { name: 'Camera', category: 'Electronics' }, - { name: 'Pain Medication', category: 'Health' }, - { name: 'Band-Aids', category: 'Health' }, - { name: 'Disinfectant', category: 'Health' }, + { name: 'Paspor', category: 'Dokumen' }, + { name: 'KTP', category: 'Dokumen' }, + { name: 'Asuransi Perjalanan', category: 'Dokumen' }, + { name: 'Tiket Penerbangan', category: 'Dokumen' }, + { name: 'Kartu Kredit', category: 'Keuangan' }, + { name: 'Uang Tunai', category: 'Keuangan' }, + { name: 'Visa', category: 'Dokumen' }, + { name: 'Kaos', category: 'Pakaian' }, + { name: 'Celana', category: 'Pakaian' }, + { name: 'Pakaian Dalam', category: 'Pakaian' }, + { name: 'Kaos Kaki', category: 'Pakaian' }, + { name: 'Jaket', category: 'Pakaian' }, + { name: 'Pakaian Tidur', category: 'Pakaian' }, + { name: 'Pakaian Renang', category: 'Pakaian' }, + { name: 'Jas Hujan', category: 'Pakaian' }, + { name: 'Sepatu Nyaman', category: 'Pakaian' }, + { name: 'Sikat Gigi', category: 'Perlengkapan Mandi' }, + { name: 'Pasta Gigi', category: 'Perlengkapan Mandi' }, + { name: 'Sampo', category: 'Perlengkapan Mandi' }, + { name: 'Deodoran', category: 'Perlengkapan Mandi' }, + { name: 'Tabir Surya', category: 'Perlengkapan Mandi' }, + { name: 'Pisau Cukur', category: 'Perlengkapan Mandi' }, + { name: 'Charger', category: 'Elektronik' }, + { name: 'Power Bank', category: 'Elektronik' }, + { name: 'Headphone', category: 'Elektronik' }, + { name: 'Adaptor Perjalanan', category: 'Elektronik' }, + { name: 'Kamera', category: 'Elektronik' }, + { name: 'Obat Pereda Nyeri', category: 'Kesehatan' }, + { name: 'Plester', category: 'Kesehatan' }, + { name: 'Disinfektan', category: 'Kesehatan' }, ], // Members / Sharing - 'members.shareTrip': 'Share Trip', - 'members.inviteUser': 'Invite User', - 'members.selectUser': 'Select user…', - 'members.invite': 'Invite', - 'members.allHaveAccess': 'All users already have access.', - 'members.access': 'Access', - 'members.person': 'person', - 'members.persons': 'persons', - 'members.you': 'you', - 'members.owner': 'Owner', - 'members.leaveTrip': 'Leave trip', - 'members.removeAccess': 'Remove access', - 'members.confirmLeave': 'Leave trip? You will lose access.', - 'members.confirmRemove': 'Remove access for this user?', - 'members.loadError': 'Failed to load members', - 'members.added': 'added', - 'members.addError': 'Failed to add', - 'members.removed': 'Member removed', - 'members.removeError': 'Failed to remove', + 'members.shareTrip': 'Bagikan Perjalanan', + 'members.inviteUser': 'Undang Pengguna', + 'members.selectUser': 'Pilih pengguna…', + 'members.invite': 'Undang', + 'members.allHaveAccess': 'Semua pengguna sudah punya akses.', + 'members.access': 'Akses', + 'members.person': 'orang', + 'members.persons': 'orang', + 'members.you': 'kamu', + 'members.owner': 'Pemilik', + 'members.leaveTrip': 'Keluar dari perjalanan', + 'members.removeAccess': 'Hapus akses', + 'members.confirmLeave': 'Keluar dari perjalanan? Kamu akan kehilangan akses.', + 'members.confirmRemove': 'Hapus akses untuk pengguna ini?', + 'members.loadError': 'Gagal memuat anggota', + 'members.added': 'ditambahkan', + 'members.addError': 'Gagal menambahkan', + 'members.removed': 'Anggota dihapus', + 'members.removeError': 'Gagal menghapus', // Categories (Admin) - 'categories.title': 'Categories', - 'categories.subtitle': 'Manage categories for places', - 'categories.new': 'New Category', - 'categories.empty': 'No categories yet', - 'categories.namePlaceholder': 'Category name', - 'categories.icon': 'Icon', - 'categories.color': 'Color', - 'categories.customColor': 'Choose custom color', - 'categories.preview': 'Preview', - 'categories.defaultName': 'Category', - 'categories.update': 'Update', - 'categories.create': 'Create', - 'categories.confirm.delete': 'Delete category? Places in this category will not be deleted.', - 'categories.toast.loadError': 'Failed to load categories', - 'categories.toast.nameRequired': 'Please enter a name', - 'categories.toast.updated': 'Category updated', - 'categories.toast.created': 'Category created', - 'categories.toast.saveError': 'Failed to save', - 'categories.toast.deleted': 'Category deleted', - 'categories.toast.deleteError': 'Failed to delete', + 'categories.title': 'Kategori', + 'categories.subtitle': 'Kelola kategori untuk tempat', + 'categories.new': 'Kategori Baru', + 'categories.empty': 'Belum ada kategori', + 'categories.namePlaceholder': 'Nama kategori', + 'categories.icon': 'Ikon', + 'categories.color': 'Warna', + 'categories.customColor': 'Pilih warna kustom', + 'categories.preview': 'Pratinjau', + 'categories.defaultName': 'Kategori', + 'categories.update': 'Perbarui', + 'categories.create': 'Buat', + 'categories.confirm.delete': 'Hapus kategori? Tempat dalam kategori ini tidak akan dihapus.', + 'categories.toast.loadError': 'Gagal memuat kategori', + 'categories.toast.nameRequired': 'Harap masukkan nama', + 'categories.toast.updated': 'Kategori diperbarui', + 'categories.toast.created': 'Kategori dibuat', + 'categories.toast.saveError': 'Gagal menyimpan', + 'categories.toast.deleted': 'Kategori dihapus', + 'categories.toast.deleteError': 'Gagal menghapus', // Backup (Admin) - 'backup.title': 'Data Backup', - 'backup.subtitle': 'Database and all uploaded files', - 'backup.refresh': 'Refresh', - 'backup.upload': 'Upload Backup', - 'backup.uploading': 'Uploading…', - 'backup.create': 'Create Backup', - 'backup.creating': 'Creating…', - 'backup.empty': 'No backups yet', - 'backup.createFirst': 'Create first backup', - 'backup.download': 'Download', - 'backup.restore': 'Restore', - 'backup.confirm.restore': 'Restore backup "{name}"?\n\nAll current data will be replaced with the backup.', - 'backup.confirm.uploadRestore': 'Upload and restore backup file "{name}"?\n\nAll current data will be overwritten.', - 'backup.confirm.delete': 'Delete backup "{name}"?', - 'backup.toast.loadError': 'Failed to load backups', - 'backup.toast.created': 'Backup created successfully', - 'backup.toast.createError': 'Failed to create backup', - 'backup.toast.restored': 'Backup restored. Page will reload…', - 'backup.toast.restoreError': 'Failed to restore', - 'backup.toast.uploadError': 'Failed to upload', - 'backup.toast.deleted': 'Backup deleted', - 'backup.toast.deleteError': 'Failed to delete', - 'backup.toast.downloadError': 'Download failed', - 'backup.toast.settingsSaved': 'Auto-backup settings saved', - 'backup.toast.settingsError': 'Failed to save settings', - 'backup.auto.title': 'Auto-Backup', - 'backup.auto.subtitle': 'Automatic backup on a schedule', - 'backup.auto.enable': 'Enable auto-backup', - 'backup.auto.enableHint': 'Backups will be created automatically on the chosen schedule', + 'backup.title': 'Pencadangan Data', + 'backup.subtitle': 'Database dan semua file yang diunggah', + 'backup.refresh': 'Segarkan', + 'backup.upload': 'Unggah Cadangan', + 'backup.uploading': 'Mengunggah…', + 'backup.create': 'Buat Cadangan', + 'backup.creating': 'Membuat…', + 'backup.empty': 'Belum ada cadangan', + 'backup.createFirst': 'Buat cadangan pertama', + 'backup.download': 'Unduh', + 'backup.restore': 'Pulihkan', + 'backup.confirm.restore': 'Pulihkan cadangan "{name}"?\n\nSemua data saat ini akan digantikan dengan cadangan.', + 'backup.confirm.uploadRestore': 'Unggah dan pulihkan file cadangan "{name}"?\n\nSemua data saat ini akan ditimpa.', + 'backup.confirm.delete': 'Hapus cadangan "{name}"?', + 'backup.toast.loadError': 'Gagal memuat cadangan', + 'backup.toast.created': 'Cadangan berhasil dibuat', + 'backup.toast.createError': 'Gagal membuat cadangan', + 'backup.toast.restored': 'Cadangan dipulihkan. Halaman akan dimuat ulang…', + 'backup.toast.restoreError': 'Gagal memulihkan', + 'backup.toast.uploadError': 'Gagal mengunggah', + 'backup.toast.deleted': 'Cadangan dihapus', + 'backup.toast.deleteError': 'Gagal menghapus', + 'backup.toast.downloadError': 'Unduhan gagal', + 'backup.toast.settingsSaved': 'Pengaturan pencadangan otomatis disimpan', + 'backup.toast.settingsError': 'Gagal menyimpan pengaturan', + 'backup.auto.title': 'Cadangan Otomatis', + 'backup.auto.subtitle': 'Pencadangan otomatis sesuai jadwal', + 'backup.auto.enable': 'Aktifkan cadangan otomatis', + 'backup.auto.enableHint': 'Cadangan akan dibuat secara otomatis sesuai jadwal yang dipilih', 'backup.auto.interval': 'Interval', - 'backup.auto.hour': 'Run at hour', - 'backup.auto.hourHint': 'Server local time ({format} format)', - 'backup.auto.dayOfWeek': 'Day of week', - 'backup.auto.dayOfMonth': 'Day of month', - 'backup.auto.dayOfMonthHint': 'Limited to 1–28 for compatibility with all months', - 'backup.auto.scheduleSummary': 'Schedule', - 'backup.auto.summaryDaily': 'Every day at {hour}:00', - 'backup.auto.summaryWeekly': 'Every {day} at {hour}:00', - 'backup.auto.summaryMonthly': 'Day {day} of every month at {hour}:00', + 'backup.auto.hour': 'Jalankan pada jam', + 'backup.auto.hourHint': 'Waktu lokal server (format {format})', + 'backup.auto.dayOfWeek': 'Hari dalam seminggu', + 'backup.auto.dayOfMonth': 'Tanggal dalam sebulan', + 'backup.auto.dayOfMonthHint': 'Dibatasi 1–28 agar kompatibel dengan semua bulan', + 'backup.auto.scheduleSummary': 'Jadwal', + 'backup.auto.summaryDaily': 'Setiap hari pukul {hour}:00', + 'backup.auto.summaryWeekly': 'Setiap {day} pukul {hour}:00', + 'backup.auto.summaryMonthly': 'Tanggal {day} setiap bulan pukul {hour}:00', 'backup.auto.envLocked': 'Docker', - 'backup.auto.envLockedHint': 'Auto-backup is configured via Docker environment variables. To change these settings, update your docker-compose.yml and restart the container.', - 'backup.auto.copyEnv': 'Copy Docker env vars', - 'backup.auto.envCopied': 'Docker env vars copied to clipboard', - 'backup.auto.keepLabel': 'Delete old backups after', - 'backup.dow.sunday': 'Sun', - 'backup.dow.monday': 'Mon', - 'backup.dow.tuesday': 'Tue', - 'backup.dow.wednesday': 'Wed', - 'backup.dow.thursday': 'Thu', - 'backup.dow.friday': 'Fri', - 'backup.dow.saturday': 'Sat', - 'backup.interval.hourly': 'Hourly', - 'backup.interval.daily': 'Daily', - 'backup.interval.weekly': 'Weekly', - 'backup.interval.monthly': 'Monthly', - 'backup.keep.1day': '1 day', - 'backup.keep.3days': '3 days', - 'backup.keep.7days': '7 days', - 'backup.keep.14days': '14 days', - 'backup.keep.30days': '30 days', - 'backup.keep.forever': 'Keep forever', + 'backup.auto.envLockedHint': 'Cadangan otomatis dikonfigurasi melalui variabel lingkungan Docker. Untuk mengubah pengaturan ini, perbarui docker-compose.yml kamu dan restart container.', + 'backup.auto.copyEnv': 'Salin variabel env Docker', + 'backup.auto.envCopied': 'Variabel env Docker disalin ke clipboard', + 'backup.auto.keepLabel': 'Hapus cadangan lama setelah', + 'backup.dow.sunday': 'Min', + 'backup.dow.monday': 'Sen', + 'backup.dow.tuesday': 'Sel', + 'backup.dow.wednesday': 'Rab', + 'backup.dow.thursday': 'Kam', + 'backup.dow.friday': 'Jum', + 'backup.dow.saturday': 'Sab', + 'backup.interval.hourly': 'Per jam', + 'backup.interval.daily': 'Harian', + 'backup.interval.weekly': 'Mingguan', + 'backup.interval.monthly': 'Bulanan', + 'backup.keep.1day': '1 hari', + 'backup.keep.3days': '3 hari', + 'backup.keep.7days': '7 hari', + 'backup.keep.14days': '14 hari', + 'backup.keep.30days': '30 hari', + 'backup.keep.forever': 'Simpan selamanya', // Photos - 'photos.allDays': 'All Days', - 'photos.noPhotos': 'No photos yet', - 'photos.uploadHint': 'Upload your travel photos', - 'photos.clickToSelect': 'or click to select', - 'photos.linkPlace': 'Link Place', - 'photos.noPlace': 'No Place', - 'photos.uploadN': '{n} photo(s) upload', + 'photos.title': 'Foto', + 'photos.subtitle': '{count} foto untuk {trip}', + 'photos.dropHere': 'Lepas foto di sini...', + 'photos.dropHereActive': 'Lepas foto di sini', + 'photos.captionForAll': 'Keterangan (untuk semua)', + 'photos.captionPlaceholder': 'Keterangan opsional...', + 'photos.addCaption': 'Tambah keterangan...', + 'photos.allDays': 'Semua Hari', + 'photos.noPhotos': 'Belum ada foto', + 'photos.uploadHint': 'Unggah foto perjalananmu', + 'photos.clickToSelect': 'atau klik untuk memilih', + 'photos.linkPlace': 'Tautkan Tempat', + 'photos.noPlace': 'Tanpa Tempat', + 'photos.uploadN': 'Unggah {n} foto', + 'photos.linkDay': 'Tautkan Hari', + 'photos.noDay': 'Tanpa Hari', + 'photos.dayLabel': 'Hari {number}', + 'photos.photoSelected': 'Foto dipilih', + 'photos.photosSelected': 'Foto dipilih', + 'photos.fileTypeHint': 'JPG, PNG, WebP · maks. 10 MB · hingga 30 foto', // Backup restore modal - 'backup.restoreConfirmTitle': 'Restore Backup?', - 'backup.restoreWarning': 'All current data (trips, places, users, uploads) will be permanently replaced by the backup. This action cannot be undone.', - 'backup.restoreTip': 'Tip: Create a backup of the current state before restoring.', - 'backup.restoreConfirm': 'Yes, restore', + 'backup.restoreConfirmTitle': 'Pulihkan Cadangan?', + 'backup.restoreWarning': 'Semua data saat ini (perjalanan, tempat, pengguna, unggahan) akan digantikan secara permanen oleh cadangan ini. Tindakan ini tidak dapat dibatalkan.', + 'backup.restoreTip': 'Tips: Buat cadangan kondisi saat ini sebelum memulihkan.', + 'backup.restoreConfirm': 'Ya, pulihkan', // PDF - 'pdf.travelPlan': 'Travel Plan', - 'pdf.planned': 'Planned', - 'pdf.costLabel': 'Cost EUR', - 'pdf.preview': 'PDF Preview', - 'pdf.saveAsPdf': 'Save as PDF', + 'pdf.travelPlan': 'Rencana Perjalanan', + 'pdf.planned': 'Direncanakan', + 'pdf.costLabel': 'Biaya EUR', + 'pdf.preview': 'Pratinjau PDF', + 'pdf.saveAsPdf': 'Simpan sebagai PDF', // Planner - 'planner.places': 'Places', - 'planner.bookings': 'Bookings', - 'planner.packingList': 'Packing List', - 'planner.documents': 'Documents', - 'planner.dayPlan': 'Day Plan', - 'planner.reservations': 'Reservations', - 'planner.minTwoPlaces': 'At least 2 places with coordinates needed', - 'planner.noGeoPlaces': 'No places with coordinates available', - 'planner.routeCalculated': 'Route calculated', - 'planner.routeCalcFailed': 'Route could not be calculated', - 'planner.routeError': 'Error calculating route', - 'planner.routeOptimized': 'Route optimized', - 'planner.reservationUpdated': 'Reservation updated', - 'planner.reservationAdded': 'Reservation added', - 'planner.confirmDeleteReservation': 'Delete reservation?', - 'planner.reservationDeleted': 'Reservation deleted', - 'planner.days': 'Days', - 'planner.allPlaces': 'All Places', - 'planner.totalPlaces': '{n} places total', - 'planner.noDaysPlanned': 'No days planned yet', - 'planner.editTrip': 'Edit trip \u2192', - 'planner.placeOne': '1 place', - 'planner.placeN': '{n} places', - 'planner.addNote': 'Add note', - 'planner.noEntries': 'No entries for this day', - 'planner.addPlace': 'Add place/activity', - 'planner.addPlaceShort': '+ Add place/activity', - 'planner.resPending': 'Reservation pending · ', - 'planner.resConfirmed': 'Reservation confirmed · ', - 'planner.notePlaceholder': 'Note\u2026', - 'planner.noteTimePlaceholder': 'Time (optional)', - 'planner.noteExamplePlaceholder': 'e.g. S3 at 14:30 from central station, ferry from pier 7, lunch break\u2026', - 'planner.totalCost': 'Total cost', - 'planner.searchPlaces': 'Search places\u2026', - 'planner.allCategories': 'All Categories', - 'planner.noPlacesFound': 'No places found', - 'planner.addFirstPlace': 'Add first place', - 'planner.noReservations': 'No reservations', - 'planner.addFirstReservation': 'Add first reservation', - 'planner.new': 'New', - 'planner.addToDay': '+ Day', - 'planner.calculating': 'Calculating\u2026', - 'planner.route': 'Route', - 'planner.optimize': 'Optimize', - 'planner.openGoogleMaps': 'Open in Google Maps', - 'planner.selectDayHint': 'Select a day from the left list to see the day plan', - 'planner.noPlacesForDay': 'No places for this day yet', - 'planner.addPlacesLink': 'Add places \u2192', - 'planner.minTotal': 'min. total', - 'planner.noReservation': 'No reservation', - 'planner.removeFromDay': 'Remove from day', - 'planner.addToThisDay': 'Add to day', - 'planner.overview': 'Overview', - 'planner.noDays': 'No days yet', - 'planner.editTripToAddDays': 'Edit trip to add days', - 'planner.dayCount': '{n} Days', - 'planner.clickToUnlock': 'Click to unlock', - 'planner.keepPosition': 'Keep position during route optimization', - 'planner.dayDetails': 'Day details', - 'planner.dayN': 'Day {n}', + 'planner.places': 'Tempat', + 'planner.bookings': 'Pemesanan', + 'planner.packingList': 'Daftar Bawaan', + 'planner.documents': 'Dokumen', + 'planner.dayPlan': 'Rencana Hari', + 'planner.reservations': 'Reservasi', + 'planner.minTwoPlaces': 'Dibutuhkan minimal 2 tempat dengan koordinat', + 'planner.noGeoPlaces': 'Tidak ada tempat dengan koordinat yang tersedia', + 'planner.routeCalculated': 'Rute berhasil dihitung', + 'planner.routeCalcFailed': 'Rute tidak dapat dihitung', + 'planner.routeError': 'Terjadi kesalahan saat menghitung rute', + 'planner.icsExportFailed': 'Ekspor ICS gagal', + 'planner.routeOptimized': 'Rute dioptimalkan', + 'planner.reservationUpdated': 'Reservasi diperbarui', + 'planner.reservationAdded': 'Reservasi ditambahkan', + 'planner.confirmDeleteReservation': 'Hapus reservasi?', + 'planner.reservationDeleted': 'Reservasi dihapus', + 'planner.days': 'Hari', + 'planner.allPlaces': 'Semua Tempat', + 'planner.totalPlaces': '{n} tempat total', + 'planner.noDaysPlanned': 'Belum ada hari yang direncanakan', + 'planner.editTrip': 'Edit perjalanan \u2192', + 'planner.placeOne': '1 tempat', + 'planner.placeN': '{n} tempat', + 'planner.addNote': 'Tambah catatan', + 'planner.noEntries': 'Tidak ada entri untuk hari ini', + 'planner.addPlace': 'Tambah tempat/aktivitas', + 'planner.addPlaceShort': '+ Tambah tempat/aktivitas', + 'planner.resPending': 'Reservasi tertunda · ', + 'planner.resConfirmed': 'Reservasi dikonfirmasi · ', + 'planner.notePlaceholder': 'Catatan\u2026', + 'planner.noteTimePlaceholder': 'Waktu (opsional)', + 'planner.noteExamplePlaceholder': 'mis. S3 pukul 14:30 dari stasiun pusat, feri dari dermaga 7, istirahat makan siang\u2026', + 'planner.totalCost': 'Total biaya', + 'planner.searchPlaces': 'Cari tempat\u2026', + 'planner.allCategories': 'Semua Kategori', + 'planner.noPlacesFound': 'Tempat tidak ditemukan', + 'planner.addFirstPlace': 'Tambah tempat pertama', + 'planner.noReservations': 'Tidak ada reservasi', + 'planner.addFirstReservation': 'Tambah reservasi pertama', + 'planner.new': 'Baru', + 'planner.addToDay': '+ Hari', + 'planner.calculating': 'Menghitung\u2026', + 'planner.route': 'Rute', + 'planner.optimize': 'Optimalkan', + 'planner.openGoogleMaps': 'Buka di Google Maps', + 'planner.selectDayHint': 'Pilih hari dari daftar kiri untuk melihat rencana hari', + 'planner.noPlacesForDay': 'Belum ada tempat untuk hari ini', + 'planner.addPlacesLink': 'Tambah tempat \u2192', + 'planner.minTotal': 'total min.', + 'planner.noReservation': 'Tidak ada reservasi', + 'planner.removeFromDay': 'Hapus dari hari', + 'planner.addToThisDay': 'Tambah ke hari ini', + 'planner.overview': 'Ikhtisar', + 'planner.noDays': 'Belum ada hari', + 'planner.editTripToAddDays': 'Edit perjalanan untuk menambah hari', + 'planner.dayCount': '{n} Hari', + 'planner.clickToUnlock': 'Klik untuk membuka kunci', + 'planner.keepPosition': 'Pertahankan posisi saat mengoptimalkan rute', + 'planner.dayDetails': 'Detail hari', + 'planner.dayN': 'Hari {n}', // Dashboard Stats - 'stats.countries': 'Countries', - 'stats.cities': 'Cities', - 'stats.trips': 'Trips', - 'stats.places': 'Places', - 'stats.worldProgress': 'World Progress', - 'stats.visited': 'visited', - 'stats.remaining': 'remaining', - 'stats.visitedCountries': 'Visited Countries', + 'stats.countries': 'Negara', + 'stats.cities': 'Kota', + 'stats.trips': 'Perjalanan', + 'stats.places': 'Tempat', + 'stats.worldProgress': 'Progres Dunia', + 'stats.visited': 'dikunjungi', + 'stats.remaining': 'tersisa', + 'stats.visitedCountries': 'Negara yang Dikunjungi', // Day Detail Panel - 'day.precipProb': 'Rain probability', - 'day.precipitation': 'Precipitation', - 'day.wind': 'Wind', - 'day.sunrise': 'Sunrise', - 'day.sunset': 'Sunset', - 'day.hourlyForecast': 'Hourly Forecast', - 'day.climateHint': 'Historical averages — real forecast available within 16 days of this date.', - 'day.noWeather': 'No weather data available. Add a place with coordinates.', - 'day.overview': 'Daily Overview', - 'day.accommodation': 'Accommodation', - 'day.addAccommodation': 'Add accommodation', - 'day.hotelDayRange': 'Apply to days', - 'day.noPlacesForHotel': 'Add places to your trip first', - 'day.allDays': 'All', + 'day.precipProb': 'Peluang hujan', + 'day.precipitation': 'Curah hujan', + 'day.wind': 'Angin', + 'day.sunrise': 'Matahari terbit', + 'day.sunset': 'Matahari terbenam', + 'day.hourlyForecast': 'Prakiraan Per Jam', + 'day.climateHint': 'Rata-rata historis — prakiraan nyata tersedia dalam 16 hari dari tanggal ini.', + 'day.noWeather': 'Data cuaca tidak tersedia. Tambahkan tempat dengan koordinat.', + 'day.overview': 'Ikhtisar Harian', + 'day.accommodation': 'Akomodasi', + 'day.addAccommodation': 'Tambah akomodasi', + 'day.hotelDayRange': 'Terapkan ke hari', + 'day.noPlacesForHotel': 'Tambahkan tempat ke perjalananmu terlebih dahulu', + 'day.allDays': 'Semua', 'day.checkIn': 'Check-in', 'day.checkOut': 'Check-out', - 'day.confirmation': 'Confirmation', - 'day.editAccommodation': 'Edit accommodation', - 'day.reservations': 'Reservations', + 'day.confirmation': 'Konfirmasi', + 'day.editAccommodation': 'Edit akomodasi', + 'day.reservations': 'Reservasi', // Photos / Immich - 'memories.title': 'Photos', - 'memories.notConnected': '{provider_name} not connected', - 'memories.notConnectedHint': 'Connect your {provider_name} instance in Settings to be able add photos to this trip.', - 'memories.notConnectedMultipleHint': 'Connect any of these photo providers: {provider_names} in Settings to be able add photos to this trip.', - 'memories.noDates': 'Add dates to your trip to load photos.', - 'memories.noPhotos': 'No photos found', - 'memories.noPhotosHint': 'No photos found in {provider_name} for this trip\'s date range.', - 'memories.photosFound': 'photos', - 'memories.fromOthers': 'from others', - 'memories.sharePhotos': 'Share photos', - 'memories.sharing': 'Sharing', - 'memories.reviewTitle': 'Review your photos', - 'memories.reviewHint': 'Click photos to exclude them from sharing.', - 'memories.shareCount': 'Share {count} photos', + 'memories.title': 'Foto', + 'memories.notConnected': '{provider_name} belum terhubung', + 'memories.notConnectedHint': 'Hubungkan instans {provider_name} kamu di Pengaturan untuk dapat menambahkan foto ke perjalanan ini.', + 'memories.notConnectedMultipleHint': 'Hubungkan salah satu penyedia foto berikut: {provider_names} di Pengaturan untuk dapat menambahkan foto ke perjalanan ini.', + 'memories.noDates': 'Tambahkan tanggal ke perjalananmu untuk memuat foto.', + 'memories.noPhotos': 'Foto tidak ditemukan', + 'memories.noPhotosHint': 'Tidak ada foto ditemukan di {provider_name} untuk rentang tanggal perjalanan ini.', + 'memories.photosFound': 'foto', + 'memories.fromOthers': 'dari orang lain', + 'memories.sharePhotos': 'Bagikan foto', + 'memories.sharing': 'Berbagi', + 'memories.reviewTitle': 'Tinjau foto kamu', + 'memories.reviewHint': 'Klik foto untuk mengecualikannya dari berbagi.', + 'memories.shareCount': 'Bagikan {count} foto', //------------------------- //todo section - 'memories.providerUrl': 'Server URL', + 'memories.providerUrl': 'URL Server', 'memories.providerApiKey': 'API Key', - 'memories.providerUsername': 'Username', - 'memories.providerPassword': 'Password', - 'memories.testConnection': 'Test connection', - 'memories.testFirst': 'Test connection first', - 'memories.connected': 'Connected', - 'memories.disconnected': 'Not connected', - 'memories.connectionSuccess': 'Connected to {provider_name}', - 'memories.connectionError': 'Could not connect to {provider_name}', - 'memories.saved': '{provider_name} settings saved', - 'memories.saveError': 'Could not save {provider_name} settings', + 'memories.providerUsername': 'Nama pengguna', + 'memories.providerPassword': 'Kata sandi', + 'memories.providerOTP': 'Kode MFA (jika diaktifkan)', + 'memories.skipSSLVerification': 'Lewati verifikasi sertifikat SSL', + 'memories.providerUrlHintSynology': 'Sertakan path aplikasi Photos di URL, mis. https://nas:5001/photo', + 'memories.testConnection': 'Uji koneksi', + 'memories.testFirst': 'Uji koneksi terlebih dahulu', + 'memories.connected': 'Terhubung', + 'memories.disconnected': 'Tidak terhubung', + 'memories.connectionSuccess': 'Terhubung ke {provider_name}', + 'memories.connectionError': 'Tidak dapat terhubung ke {provider_name}', + 'memories.saved': 'Pengaturan {provider_name} disimpan', + 'memories.providerDisconnectedBanner': 'Koneksi {provider_name} kamu terputus. Hubungkan ulang di Pengaturan untuk melihat foto.', + 'memories.saveError': 'Tidak dapat menyimpan pengaturan {provider_name}', //------------------------ - 'memories.addPhotos': 'Add photos', - 'memories.linkAlbum': 'Link Album', - 'memories.selectAlbum': 'Select {provider_name} Album', - 'memories.selectAlbumMultiple': 'Select Album', - 'memories.noAlbums': 'No albums found', - 'memories.syncAlbum': 'Sync album', - 'memories.unlinkAlbum': 'Unlink album', - 'memories.photos': 'photos', - 'memories.selectPhotos': 'Select photos from {provider_name}', - 'memories.selectPhotosMultiple': 'Select Photos', - 'memories.selectHint': 'Tap photos to select them.', - 'memories.selected': 'selected', - 'memories.addSelected': 'Add {count} photos', - 'memories.alreadyAdded': 'Added', - 'memories.private': 'Private', - 'memories.stopSharing': 'Stop sharing', - 'memories.oldest': 'Oldest first', - 'memories.newest': 'Newest first', - 'memories.allLocations': 'All locations', - 'memories.tripDates': 'Trip dates', - 'memories.allPhotos': 'All photos', - 'memories.confirmShareTitle': 'Share with trip members?', - 'memories.confirmShareHint': '{count} photos will be visible to all members of this trip. You can make individual photos private later.', - 'memories.confirmShareButton': 'Share photos', - 'memories.error.loadAlbums': 'Failed to load albums', - 'memories.error.linkAlbum': 'Failed to link album', - 'memories.error.unlinkAlbum': 'Failed to unlink album', - 'memories.error.syncAlbum': 'Failed to sync album', - 'memories.error.loadPhotos': 'Failed to load photos', - 'memories.error.addPhotos': 'Failed to add photos', - 'memories.error.removePhoto': 'Failed to remove photo', - 'memories.error.toggleSharing': 'Failed to update sharing', + 'memories.addPhotos': 'Tambah foto', + 'memories.linkAlbum': 'Tautkan Album', + 'memories.selectAlbum': 'Pilih Album {provider_name}', + 'memories.selectAlbumMultiple': 'Pilih Album', + 'memories.noAlbums': 'Tidak ada album ditemukan', + 'memories.syncAlbum': 'Sinkronkan album', + 'memories.unlinkAlbum': 'Putuskan tautan album', + 'memories.photos': 'foto', + 'memories.selectPhotos': 'Pilih foto dari {provider_name}', + 'memories.selectPhotosMultiple': 'Pilih Foto', + 'memories.selectHint': 'Ketuk foto untuk memilihnya.', + 'memories.selected': 'dipilih', + 'memories.addSelected': 'Tambah {count} foto', + 'memories.alreadyAdded': 'Sudah ditambahkan', + 'memories.private': 'Privat', + 'memories.stopSharing': 'Berhenti berbagi', + 'memories.oldest': 'Terlama dulu', + 'memories.newest': 'Terbaru dulu', + 'memories.allLocations': 'Semua lokasi', + 'memories.tripDates': 'Tanggal perjalanan', + 'memories.allPhotos': 'Semua foto', + 'memories.confirmShareTitle': 'Bagikan ke anggota perjalanan?', + 'memories.confirmShareHint': '{count} foto akan terlihat oleh semua anggota perjalanan ini. Kamu bisa membuat foto tertentu menjadi privat nanti.', + 'memories.confirmShareButton': 'Bagikan foto', + 'memories.error.loadAlbums': 'Gagal memuat album', + 'memories.error.linkAlbum': 'Gagal menautkan album', + 'memories.error.unlinkAlbum': 'Gagal memutuskan tautan album', + 'memories.error.syncAlbum': 'Gagal menyinkronkan album', + 'memories.error.loadPhotos': 'Gagal memuat foto', + 'memories.error.addPhotos': 'Gagal menambahkan foto', + 'memories.error.removePhoto': 'Gagal menghapus foto', + 'memories.error.toggleSharing': 'Gagal memperbarui berbagi', + 'memories.saveRouteNotConfigured': 'Rute simpan tidak dikonfigurasi untuk penyedia ini', + 'memories.testRouteNotConfigured': 'Rute uji tidak dikonfigurasi untuk penyedia ini', + 'memories.fillRequiredFields': 'Harap isi semua kolom yang wajib diisi', // Collab Addon 'collab.tabs.chat': 'Chat', - 'collab.tabs.notes': 'Notes', - 'collab.tabs.polls': 'Polls', - 'collab.whatsNext.title': "What's Next", - 'collab.whatsNext.today': 'Today', - 'collab.whatsNext.tomorrow': 'Tomorrow', - 'collab.whatsNext.empty': 'No upcoming activities', - 'collab.whatsNext.until': 'to', - 'collab.whatsNext.emptyHint': 'Activities with times will appear here', - 'collab.chat.send': 'Send', - 'collab.chat.placeholder': 'Type a message...', - 'collab.chat.empty': 'Start the conversation', - 'collab.chat.emptyHint': 'Messages are shared with all trip members', - 'collab.chat.emptyDesc': 'Share ideas, plans, and updates with your travel group', - 'collab.chat.today': 'Today', - 'collab.chat.yesterday': 'Yesterday', - 'collab.chat.deletedMessage': 'deleted a message', - 'collab.chat.reply': 'Reply', - 'collab.chat.loadMore': 'Load older messages', - 'collab.chat.justNow': 'just now', - 'collab.chat.minutesAgo': '{n}m ago', - 'collab.chat.hoursAgo': '{n}h ago', - 'collab.notes.title': 'Notes', - 'collab.notes.new': 'New Note', - 'collab.notes.empty': 'No notes yet', - 'collab.notes.emptyHint': 'Start capturing ideas and plans', - 'collab.notes.all': 'All', - 'collab.notes.titlePlaceholder': 'Note title', - 'collab.notes.contentPlaceholder': 'Write something...', - 'collab.notes.categoryPlaceholder': 'Category', - 'collab.notes.newCategory': 'New category...', - 'collab.notes.category': 'Category', - 'collab.notes.noCategory': 'No category', - 'collab.notes.color': 'Color', - 'collab.notes.save': 'Save', - 'collab.notes.cancel': 'Cancel', + 'collab.tabs.notes': 'Catatan', + 'collab.tabs.polls': 'Polling', + 'collab.whatsNext.title': 'Berikutnya', + 'collab.whatsNext.today': 'Hari ini', + 'collab.whatsNext.tomorrow': 'Besok', + 'collab.whatsNext.empty': 'Tidak ada aktivitas mendatang', + 'collab.whatsNext.until': 'sampai', + 'collab.whatsNext.emptyHint': 'Aktivitas dengan waktu akan muncul di sini', + 'collab.chat.send': 'Kirim', + 'collab.chat.placeholder': 'Ketik pesan...', + 'collab.chat.empty': 'Mulai percakapan', + 'collab.chat.emptyHint': 'Pesan dibagikan kepada semua anggota perjalanan', + 'collab.chat.emptyDesc': 'Bagikan ide, rencana, dan update dengan grup perjalananmu', + 'collab.chat.today': 'Hari ini', + 'collab.chat.yesterday': 'Kemarin', + 'collab.chat.deletedMessage': 'menghapus pesan', + 'collab.chat.reply': 'Balas', + 'collab.chat.loadMore': 'Muat pesan lebih lama', + 'collab.chat.justNow': 'baru saja', + 'collab.chat.minutesAgo': '{n}m lalu', + 'collab.chat.hoursAgo': '{n}j lalu', + 'collab.notes.title': 'Catatan', + 'collab.notes.new': 'Catatan Baru', + 'collab.notes.empty': 'Belum ada catatan', + 'collab.notes.emptyHint': 'Mulai catat ide dan rencana', + 'collab.notes.all': 'Semua', + 'collab.notes.titlePlaceholder': 'Judul catatan', + 'collab.notes.contentPlaceholder': 'Tulis sesuatu...', + 'collab.notes.categoryPlaceholder': 'Kategori', + 'collab.notes.newCategory': 'Kategori baru...', + 'collab.notes.category': 'Kategori', + 'collab.notes.noCategory': 'Tanpa kategori', + 'collab.notes.color': 'Warna', + 'collab.notes.save': 'Simpan', + 'collab.notes.cancel': 'Batal', 'collab.notes.edit': 'Edit', - 'collab.notes.delete': 'Delete', - 'collab.notes.pin': 'Pin', - 'collab.notes.unpin': 'Unpin', - 'collab.notes.daysAgo': '{n}d ago', - 'collab.notes.categorySettings': 'Manage Categories', - 'collab.notes.create': 'Create', + 'collab.notes.delete': 'Hapus', + 'collab.notes.pin': 'Sematkan', + 'collab.notes.unpin': 'Lepas sematan', + 'collab.notes.daysAgo': '{n}h lalu', + 'collab.notes.categorySettings': 'Kelola Kategori', + 'collab.notes.create': 'Buat', 'collab.notes.website': 'Website', 'collab.notes.websitePlaceholder': 'https://...', - 'collab.notes.attachFiles': 'Attach files', - 'collab.notes.noCategoriesYet': 'No categories yet', - 'collab.notes.emptyDesc': 'Create a note to get started', - 'collab.polls.title': 'Polls', - 'collab.polls.new': 'New Poll', - 'collab.polls.empty': 'No polls yet', - 'collab.polls.emptyHint': 'Ask the group and vote together', - 'collab.polls.question': 'Question', - 'collab.polls.questionPlaceholder': 'What should we do?', - 'collab.polls.addOption': '+ Add option', - 'collab.polls.optionPlaceholder': 'Option {n}', - 'collab.polls.create': 'Create Poll', - 'collab.polls.close': 'Close', - 'collab.polls.closed': 'Closed', - 'collab.polls.votes': '{n} votes', - 'collab.polls.vote': '{n} vote', - 'collab.polls.multipleChoice': 'Multiple choice', - 'collab.polls.multiChoice': 'Multiple choice', - 'collab.polls.deadline': 'Deadline', - 'collab.polls.option': 'Option', - 'collab.polls.options': 'Options', - 'collab.polls.delete': 'Delete', - 'collab.polls.closedSection': 'Closed', + 'collab.notes.attachFiles': 'Lampirkan file', + 'collab.notes.noCategoriesYet': 'Belum ada kategori', + 'collab.notes.emptyDesc': 'Buat catatan untuk memulai', + 'collab.polls.title': 'Polling', + 'collab.polls.new': 'Polling Baru', + 'collab.polls.empty': 'Belum ada polling', + 'collab.polls.emptyHint': 'Tanyakan ke grup dan voting bersama', + 'collab.polls.question': 'Pertanyaan', + 'collab.polls.questionPlaceholder': 'Apa yang harus kita lakukan?', + 'collab.polls.addOption': '+ Tambah pilihan', + 'collab.polls.optionPlaceholder': 'Pilihan {n}', + 'collab.polls.create': 'Buat Polling', + 'collab.polls.close': 'Tutup', + 'collab.polls.closed': 'Ditutup', + 'collab.polls.votes': '{n} suara', + 'collab.polls.vote': '{n} suara', + 'collab.polls.multipleChoice': 'Pilihan ganda', + 'collab.polls.multiChoice': 'Pilihan ganda', + 'collab.polls.deadline': 'Tenggat waktu', + 'collab.polls.option': 'Pilihan', + 'collab.polls.options': 'Pilihan', + 'collab.polls.delete': 'Hapus', + 'collab.polls.closedSection': 'Ditutup', // Permissions - 'admin.tabs.permissions': 'Permissions', - 'perm.title': 'Permission Settings', - 'perm.subtitle': 'Control who can perform actions across the application', - 'perm.saved': 'Permission settings saved', - 'perm.resetDefaults': 'Reset to defaults', - 'perm.customized': 'customized', - 'perm.level.admin': 'Admin only', - 'perm.level.tripOwner': 'Trip owner', - 'perm.level.tripMember': 'Trip members', - 'perm.level.everybody': 'Everyone', - 'perm.cat.trip': 'Trip Management', - 'perm.cat.members': 'Member Management', - 'perm.cat.files': 'Files', - 'perm.cat.content': 'Content & Schedule', - 'perm.cat.extras': 'Budget, Packing & Collaboration', - 'perm.action.trip_create': 'Create trips', - 'perm.action.trip_edit': 'Edit trip details', - 'perm.action.trip_delete': 'Delete trips', - 'perm.action.trip_archive': 'Archive / unarchive trips', - 'perm.action.trip_cover_upload': 'Upload cover image', - 'perm.action.member_manage': 'Add / remove members', - 'perm.action.file_upload': 'Upload files', - 'perm.action.file_edit': 'Edit file metadata', - 'perm.action.file_delete': 'Delete files', - 'perm.action.place_edit': 'Add / edit / delete places', - 'perm.action.day_edit': 'Edit days, notes & assignments', - 'perm.action.reservation_edit': 'Manage reservations', - 'perm.action.budget_edit': 'Manage budget', - 'perm.action.packing_edit': 'Manage packing lists', - 'perm.action.collab_edit': 'Collaboration (notes, polls, chat)', - 'perm.action.share_manage': 'Manage share links', - 'perm.actionHint.trip_create': 'Who can create new trips', - 'perm.actionHint.trip_edit': 'Who can change trip name, dates, description and currency', - 'perm.actionHint.trip_delete': 'Who can permanently delete a trip', - 'perm.actionHint.trip_archive': 'Who can archive or unarchive a trip', - 'perm.actionHint.trip_cover_upload': 'Who can upload or change the cover image', - 'perm.actionHint.member_manage': 'Who can invite or remove trip members', - 'perm.actionHint.file_upload': 'Who can upload files to a trip', - 'perm.actionHint.file_edit': 'Who can edit file descriptions and links', - 'perm.actionHint.file_delete': 'Who can move files to trash or permanently delete them', - 'perm.actionHint.place_edit': 'Who can add, edit or delete places', - 'perm.actionHint.day_edit': 'Who can edit days, day notes and place assignments', - 'perm.actionHint.reservation_edit': 'Who can create, edit or delete reservations', - 'perm.actionHint.budget_edit': 'Who can create, edit or delete budget items', - 'perm.actionHint.packing_edit': 'Who can manage packing items and bags', - 'perm.actionHint.collab_edit': 'Who can create notes, polls and send messages', - 'perm.actionHint.share_manage': 'Who can create or delete public share links', + 'admin.tabs.permissions': 'Izin', + 'perm.title': 'Pengaturan Izin', + 'perm.subtitle': 'Kendalikan siapa yang bisa melakukan tindakan di aplikasi', + 'perm.saved': 'Pengaturan izin disimpan', + 'perm.resetDefaults': 'Kembalikan ke default', + 'perm.customized': 'dikustomisasi', + 'perm.level.admin': 'Hanya Admin', + 'perm.level.tripOwner': 'Pemilik perjalanan', + 'perm.level.tripMember': 'Anggota perjalanan', + 'perm.level.everybody': 'Semua orang', + 'perm.cat.trip': 'Manajemen Perjalanan', + 'perm.cat.members': 'Manajemen Anggota', + 'perm.cat.files': 'File', + 'perm.cat.content': 'Konten & Jadwal', + 'perm.cat.extras': 'Anggaran, Perlengkapan & Kolaborasi', + 'perm.action.trip_create': 'Buat perjalanan', + 'perm.action.trip_edit': 'Edit detail perjalanan', + 'perm.action.trip_delete': 'Hapus perjalanan', + 'perm.action.trip_archive': 'Arsipkan / batalkan arsip perjalanan', + 'perm.action.trip_cover_upload': 'Unggah gambar sampul', + 'perm.action.member_manage': 'Tambah / hapus anggota', + 'perm.action.file_upload': 'Unggah file', + 'perm.action.file_edit': 'Edit metadata file', + 'perm.action.file_delete': 'Hapus file', + 'perm.action.place_edit': 'Tambah / edit / hapus tempat', + 'perm.action.day_edit': 'Edit hari, catatan & penugasan', + 'perm.action.reservation_edit': 'Kelola reservasi', + 'perm.action.budget_edit': 'Kelola anggaran', + 'perm.action.packing_edit': 'Kelola daftar perlengkapan', + 'perm.action.collab_edit': 'Kolaborasi (catatan, polling, chat)', + 'perm.action.share_manage': 'Kelola tautan berbagi', + 'perm.actionHint.trip_create': 'Siapa yang bisa membuat perjalanan baru', + 'perm.actionHint.trip_edit': 'Siapa yang bisa mengubah nama, tanggal, deskripsi, dan mata uang perjalanan', + 'perm.actionHint.trip_delete': 'Siapa yang bisa menghapus perjalanan secara permanen', + 'perm.actionHint.trip_archive': 'Siapa yang bisa mengarsipkan atau membatalkan arsip perjalanan', + 'perm.actionHint.trip_cover_upload': 'Siapa yang bisa mengunggah atau mengganti gambar sampul', + 'perm.actionHint.member_manage': 'Siapa yang bisa mengundang atau menghapus anggota perjalanan', + 'perm.actionHint.file_upload': 'Siapa yang bisa mengunggah file ke perjalanan', + 'perm.actionHint.file_edit': 'Siapa yang bisa mengedit deskripsi dan tautan file', + 'perm.actionHint.file_delete': 'Siapa yang bisa memindahkan file ke sampah atau menghapusnya secara permanen', + 'perm.actionHint.place_edit': 'Siapa yang bisa menambah, mengedit, atau menghapus tempat', + 'perm.actionHint.day_edit': 'Siapa yang bisa mengedit hari, catatan hari, dan penugasan tempat', + 'perm.actionHint.reservation_edit': 'Siapa yang bisa membuat, mengedit, atau menghapus reservasi', + 'perm.actionHint.budget_edit': 'Siapa yang bisa membuat, mengedit, atau menghapus item anggaran', + 'perm.actionHint.packing_edit': 'Siapa yang bisa mengelola item perlengkapan dan tas', + 'perm.actionHint.collab_edit': 'Siapa yang bisa membuat catatan, polling, dan mengirim pesan', + 'perm.actionHint.share_manage': 'Siapa yang bisa membuat atau menghapus tautan berbagi publik', // Undo - 'undo.button': 'Undo', - 'undo.tooltip': 'Undo: {action}', - 'undo.assignPlace': 'Place assigned to day', - 'undo.removeAssignment': 'Place removed from day', - 'undo.reorder': 'Places reordered', - 'undo.optimize': 'Route optimized', - 'undo.deletePlace': 'Place deleted', - 'undo.moveDay': 'Place moved to another day', - 'undo.lock': 'Place lock toggled', - 'undo.importGpx': 'GPX import', - 'undo.importGoogleList': 'Google Maps import', - 'undo.addPlace': 'Place added', - 'undo.done': 'Undone: {action}', + 'undo.button': 'Batalkan', + 'undo.tooltip': 'Batalkan: {action}', + 'undo.assignPlace': 'Tempat ditambahkan ke hari', + 'undo.removeAssignment': 'Tempat dihapus dari hari', + 'undo.reorder': 'Tempat diurutkan ulang', + 'undo.optimize': 'Rute dioptimalkan', + 'undo.deletePlace': 'Tempat dihapus', + 'undo.moveDay': 'Tempat dipindah ke hari lain', + 'undo.lock': 'Kunci tempat diubah', + 'undo.importGpx': 'Impor GPX', + 'undo.importKeyholeMarkup': 'Impor KMZ/KML', + 'undo.importGoogleList': 'Impor Google Maps', + 'undo.importNaverList': 'Impor Naver Maps', + 'undo.addPlace': 'Tempat ditambahkan', + 'undo.done': 'Dibatalkan: {action}', // Notifications - 'notifications.title': 'Notifications', - 'notifications.markAllRead': 'Mark all read', - 'notifications.deleteAll': 'Delete all', - 'notifications.showAll': 'Show all notifications', - 'notifications.empty': 'No notifications', - 'notifications.emptyDescription': "You're all caught up!", - 'notifications.all': 'All', - 'notifications.unreadOnly': 'Unread', - 'notifications.markRead': 'Mark as read', - 'notifications.markUnread': 'Mark as unread', - 'notifications.delete': 'Delete', - 'notifications.system': 'System', + 'notifications.title': 'Notifikasi', + 'notifications.markAllRead': 'Tandai semua dibaca', + 'notifications.deleteAll': 'Hapus semua', + 'notifications.showAll': 'Tampilkan semua notifikasi', + 'notifications.empty': 'Tidak ada notifikasi', + 'notifications.emptyDescription': 'Semuanya sudah terbaca!', + 'notifications.all': 'Semua', + 'notifications.unreadOnly': 'Belum dibaca', + 'notifications.markRead': 'Tandai sudah dibaca', + 'notifications.markUnread': 'Tandai belum dibaca', + 'notifications.delete': 'Hapus', + 'notifications.system': 'Sistem', + 'notifications.synologySessionCleared.title': 'Synology Photos terputus', + 'notifications.synologySessionCleared.text': 'Server atau akun kamu berubah — buka Pengaturan untuk menguji koneksi lagi.', // Notification test keys (dev only) - 'notifications.versionAvailable.title': 'Update Available', - 'notifications.versionAvailable.text': 'TREK {version} is now available.', - 'notifications.versionAvailable.button': 'View Details', - 'notifications.test.title': 'Test notification from {actor}', - 'notifications.test.text': 'This is a simple test notification.', - 'notifications.test.booleanTitle': '{actor} asks for your approval', - 'notifications.test.booleanText': 'This is a test boolean notification. Choose an action below.', - 'notifications.test.accept': 'Approve', - 'notifications.test.decline': 'Decline', - 'notifications.test.navigateTitle': 'Check something out', - 'notifications.test.navigateText': 'This is a test navigate notification.', - 'notifications.test.goThere': 'Go there', - 'notifications.test.adminTitle': 'Admin broadcast', - 'notifications.test.adminText': '{actor} sent a test notification to all admins.', - 'notifications.test.tripTitle': '{actor} posted in your trip', - 'notifications.test.tripText': 'Test notification for trip "{trip}".', + 'notifications.versionAvailable.title': 'Pembaruan Tersedia', + 'notifications.versionAvailable.text': 'TREK {version} kini tersedia.', + 'notifications.versionAvailable.button': 'Lihat Detail', + 'notifications.test.title': 'Notifikasi uji dari {actor}', + 'notifications.test.text': 'Ini adalah notifikasi uji sederhana.', + 'notifications.test.booleanTitle': '{actor} meminta persetujuanmu', + 'notifications.test.booleanText': 'Ini adalah notifikasi uji boolean. Pilih tindakan di bawah.', + 'notifications.test.accept': 'Setujui', + 'notifications.test.decline': 'Tolak', + 'notifications.test.navigateTitle': 'Cek sesuatu', + 'notifications.test.navigateText': 'Ini adalah notifikasi uji navigasi.', + 'notifications.test.goThere': 'Ke sana', + 'notifications.test.adminTitle': 'Siaran Admin', + 'notifications.test.adminText': '{actor} mengirim notifikasi uji ke semua admin.', + 'notifications.test.tripTitle': '{actor} memposting di perjalananmu', + 'notifications.test.tripText': 'Notifikasi uji untuk perjalanan "{trip}".', // Todo - 'todo.subtab.packing': 'Packing List', - 'todo.subtab.todo': 'To-Do', - 'todo.completed': 'completed', - 'todo.filter.all': 'All', - 'todo.filter.open': 'Open', - 'todo.filter.done': 'Done', - 'todo.uncategorized': 'Uncategorized', - 'todo.namePlaceholder': 'Task name', - 'todo.descriptionPlaceholder': 'Description (optional)', - 'todo.unassigned': 'Unassigned', - 'todo.noCategory': 'No category', - 'todo.hasDescription': 'Has description', - 'todo.addItem': 'Add new task...', - 'todo.newCategory': 'Category name', - 'todo.addCategory': 'Add category', - 'todo.newItem': 'New task', - 'todo.empty': 'No tasks yet. Add a task to get started!', - 'todo.filter.my': 'My Tasks', - 'todo.filter.overdue': 'Overdue', - 'todo.sidebar.tasks': 'Tasks', - 'todo.sidebar.categories': 'Categories', - 'todo.detail.title': 'Task', - 'todo.detail.description': 'Description', - 'todo.detail.category': 'Category', - 'todo.detail.dueDate': 'Due date', - 'todo.detail.assignedTo': 'Assigned to', - 'todo.detail.delete': 'Delete', - 'todo.detail.save': 'Save changes', - 'todo.sortByPrio': 'Priority', - 'todo.detail.priority': 'Priority', - 'todo.detail.noPriority': 'None', - 'todo.detail.create': 'Create task', + 'todo.subtab.packing': 'Daftar Perlengkapan', + 'todo.subtab.todo': 'Tugas', + 'todo.completed': 'selesai', + 'todo.filter.all': 'Semua', + 'todo.filter.open': 'Terbuka', + 'todo.filter.done': 'Selesai', + 'todo.uncategorized': 'Tanpa kategori', + 'todo.namePlaceholder': 'Nama tugas', + 'todo.descriptionPlaceholder': 'Deskripsi (opsional)', + 'todo.unassigned': 'Belum ditugaskan', + 'todo.noCategory': 'Tanpa kategori', + 'todo.hasDescription': 'Ada deskripsi', + 'todo.addItem': 'Tambah tugas baru...', + 'todo.newCategory': 'Nama kategori', + 'todo.addCategory': 'Tambah kategori', + 'todo.newItem': 'Tugas baru', + 'todo.empty': 'Belum ada tugas. Tambah tugas untuk memulai!', + 'todo.filter.my': 'Tugasku', + 'todo.filter.overdue': 'Terlambat', + 'todo.sidebar.tasks': 'Tugas', + 'todo.sidebar.categories': 'Kategori', + 'todo.detail.title': 'Tugas', + 'todo.detail.description': 'Deskripsi', + 'todo.detail.category': 'Kategori', + 'todo.detail.dueDate': 'Tenggat waktu', + 'todo.detail.assignedTo': 'Ditugaskan ke', + 'todo.detail.delete': 'Hapus', + 'todo.detail.save': 'Simpan perubahan', + 'todo.sortByPrio': 'Prioritas', + 'todo.detail.priority': 'Prioritas', + 'todo.detail.noPriority': 'Tidak ada', + 'todo.detail.create': 'Buat tugas', // Notifications — dev test events - 'notif.test.title': '[Test] Notification', - 'notif.test.simple.text': 'This is a simple test notification.', - 'notif.test.boolean.text': 'Do you accept this test notification?', - 'notif.test.navigate.text': 'Click below to navigate to the dashboard.', + 'notif.test.title': '[Test] Notifikasi', + 'notif.test.simple.text': 'Ini adalah notifikasi uji sederhana.', + 'notif.test.boolean.text': 'Apakah kamu menerima notifikasi uji ini?', + 'notif.test.navigate.text': 'Klik di bawah untuk pergi ke dasbor.', // Notifications - 'notif.trip_invite.title': 'Trip Invitation', - 'notif.trip_invite.text': '{actor} invited you to {trip}', - 'notif.booking_change.title': 'Booking Updated', - 'notif.booking_change.text': '{actor} updated a booking in {trip}', - 'notif.trip_reminder.title': 'Trip Reminder', - 'notif.trip_reminder.text': 'Your trip {trip} is coming up soon!', - 'notif.vacay_invite.title': 'Vacay Fusion Invite', - 'notif.vacay_invite.text': '{actor} invited you to fuse vacation plans', - 'notif.photos_shared.title': 'Photos Shared', - 'notif.photos_shared.text': '{actor} shared {count} photo(s) in {trip}', - 'notif.collab_message.title': 'New Message', - 'notif.collab_message.text': '{actor} sent a message in {trip}', - 'notif.packing_tagged.title': 'Packing Assignment', - 'notif.packing_tagged.text': '{actor} assigned you to {category} in {trip}', - 'notif.version_available.title': 'New Version Available', - 'notif.version_available.text': 'TREK {version} is now available', - 'notif.action.view_trip': 'View Trip', - 'notif.action.view_collab': 'View Messages', - 'notif.action.view_packing': 'View Packing', - 'notif.action.view_photos': 'View Photos', - 'notif.action.view_vacay': 'View Vacay', - 'notif.action.view_admin': 'Go to Admin', - 'notif.action.view': 'View', - 'notif.action.accept': 'Accept', - 'notif.action.decline': 'Decline', - 'notif.generic.title': 'Notification', - 'notif.generic.text': 'You have a new notification', - 'notif.dev.unknown_event.title': '[DEV] Unknown Event', - 'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG', -} + 'notif.trip_invite.title': 'Undangan Perjalanan', + 'notif.trip_invite.text': '{actor} mengundangmu ke {trip}', + 'notif.booking_change.title': 'Pemesanan Diperbarui', + 'notif.booking_change.text': '{actor} memperbarui pemesanan di {trip}', + 'notif.trip_reminder.title': 'Pengingat Perjalanan', + 'notif.trip_reminder.text': 'Perjalananmu {trip} akan segera dimulai!', + 'notif.vacay_invite.title': 'Undangan Vacay Fusion', + 'notif.vacay_invite.text': '{actor} mengundangmu untuk menggabungkan rencana liburan', + 'notif.photos_shared.title': 'Foto Dibagikan', + 'notif.photos_shared.text': '{actor} membagikan {count} foto di {trip}', + 'notif.collab_message.title': 'Pesan Baru', + 'notif.collab_message.text': '{actor} mengirim pesan di {trip}', + 'notif.packing_tagged.title': 'Penugasan Perlengkapan', + 'notif.packing_tagged.text': '{actor} menugaskanmu ke {category} di {trip}', + 'notif.version_available.title': 'Versi Baru Tersedia', + 'notif.version_available.text': 'TREK {version} kini tersedia', + 'notif.action.view_trip': 'Lihat Perjalanan', + 'notif.action.view_collab': 'Lihat Pesan', + 'notif.action.view_packing': 'Lihat Perlengkapan', + 'notif.action.view_photos': 'Lihat Foto', + 'notif.action.view_vacay': 'Lihat Vacay', + 'notif.action.view_admin': 'Ke Admin', + 'notif.action.view': 'Lihat', + 'notif.action.accept': 'Terima', + 'notif.action.decline': 'Tolak', + 'notif.generic.title': 'Notifikasi', + 'notif.generic.text': 'Kamu punya notifikasi baru', + 'notif.dev.unknown_event.title': '[DEV] Event Tidak Dikenal', + 'notif.dev.unknown_event.text': 'Tipe event "{event}" tidak terdaftar di EVENT_NOTIFICATION_CONFIG', -export default en + // Journey addon + 'journey.title': 'Journey', + 'journey.subtitle': 'Lacak perjalananmu saat terjadi', + 'journey.new': 'Journey Baru', + 'journey.create': 'Buat', + 'journey.titlePlaceholder': 'Ke mana kamu pergi?', + 'journey.empty': 'Belum ada journey', + 'journey.emptyHint': 'Mulai mendokumentasikan perjalananmu berikutnya', + 'journey.deleted': 'Journey dihapus', + 'journey.createError': 'Tidak dapat membuat journey', + 'journey.deleteError': 'Tidak dapat menghapus journey', + 'journey.deleteConfirmTitle': 'Hapus', + 'journey.deleteConfirmMessage': 'Hapus "{title}"? Tindakan ini tidak dapat dibatalkan.', + 'journey.deleteConfirmGeneric': 'Apakah kamu yakin ingin menghapus ini?', + 'journey.notFound': 'Journey tidak ditemukan', + 'journey.photos': 'Foto', + 'journey.timelineEmpty': 'Belum ada persinggahan', + 'journey.timelineEmptyHint': 'Tambahkan check-in atau tulis entri jurnal untuk memulai', + 'journey.status.draft': 'Draf', + 'journey.status.active': 'Aktif', + 'journey.status.completed': 'Selesai', + 'journey.status.upcoming': 'Mendatang', + 'journey.checkin.add': 'Check in', + 'journey.checkin.namePlaceholder': 'Nama lokasi', + 'journey.checkin.notesPlaceholder': 'Catatan (opsional)', + 'journey.checkin.save': 'Simpan', + 'journey.checkin.error': 'Tidak dapat menyimpan check-in', + 'journey.entry.add': 'Jurnal', + 'journey.entry.edit': 'Edit entri', + 'journey.entry.titlePlaceholder': 'Judul (opsional)', + 'journey.entry.bodyPlaceholder': 'Apa yang terjadi hari ini?', + 'journey.entry.save': 'Simpan', + 'journey.entry.error': 'Tidak dapat menyimpan entri', + 'journey.photo.add': 'Foto', + 'journey.photo.uploadError': 'Unggah gagal', + 'journey.share.share': 'Bagikan', + 'journey.share.public': 'Publik', + 'journey.share.linkCopied': 'Tautan publik disalin', + 'journey.share.disabled': 'Berbagi publik dinonaktifkan', + 'journey.editor.titlePlaceholder': 'Beri nama momen ini...', + 'journey.editor.bodyPlaceholder': 'Ceritakan kisah hari ini...', + 'journey.editor.placePlaceholder': 'Lokasi (opsional)', + 'journey.editor.tagsPlaceholder': 'Tag: permata tersembunyi, makan terbaik, wajib dikunjungi lagi...', + 'journey.visibility.private': 'Pribadi', + 'journey.visibility.shared': 'Dibagikan', + 'journey.visibility.public': 'Publik', + 'journey.emptyState.title': 'Kisahmu dimulai di sini', + 'journey.emptyState.subtitle': 'Check in di suatu tempat atau tulis entri jurnal pertamamu', + + // Journey Frontpage + 'journey.frontpage.subtitle': 'Ubah perjalananmu menjadi kisah yang tak terlupakan', + 'journey.frontpage.createJourney': 'Buat Journey', + 'journey.frontpage.activeJourney': 'Journey Aktif', + 'journey.frontpage.allJourneys': 'Semua Journey', + 'journey.frontpage.journeys': 'journey', + 'journey.frontpage.createNew': 'Buat Journey baru', + 'journey.frontpage.createNewSub': 'Pilih perjalanan, tulis cerita, bagikan petualanganmu', + 'journey.frontpage.live': 'Langsung', + 'journey.frontpage.synced': 'Tersinkron', + 'journey.frontpage.continueWriting': 'Lanjutkan menulis', + 'journey.frontpage.updated': 'Diperbarui {time}', + 'journey.frontpage.suggestionLabel': 'Perjalanan baru saja selesai', + 'journey.frontpage.suggestionText': 'Ubah {title} menjadi Journey', + 'journey.frontpage.dismiss': 'Tutup', + 'journey.frontpage.journeyName': 'Nama Journey', + 'journey.frontpage.namePlaceholder': 'mis. Asia Tenggara 2026', + 'journey.frontpage.selectTrips': 'Pilih Perjalanan', + 'journey.frontpage.tripsSelected': 'perjalanan dipilih', + 'journey.frontpage.trips': 'perjalanan', + 'journey.frontpage.placesImported': 'tempat akan diimpor', + 'journey.frontpage.places': 'tempat', + + // Journey Detail + 'journey.detail.backToJourney': 'Kembali ke Journey', + 'journey.detail.syncedWithTrips': 'Tersinkron dengan Perjalanan', + 'journey.detail.addEntry': 'Tambah Entri', + 'journey.detail.newEntry': 'Entri Baru', + 'journey.detail.editEntry': 'Edit Entri', + 'journey.detail.noEntries': 'Belum ada entri', + 'journey.detail.noEntriesHint': 'Tambahkan perjalanan untuk mulai dengan entri kerangka', + 'journey.detail.noPhotos': 'Belum ada foto', + 'journey.detail.noPhotosHint': 'Unggah foto ke entri atau jelajahi galeri Immich/Synology-mu', + 'journey.detail.journeyStats': 'Statistik Journey', + 'journey.detail.syncedTrips': 'Perjalanan Tersinkron', + 'journey.detail.noTripsLinked': 'Belum ada perjalanan yang ditautkan', + 'journey.detail.contributors': 'Kontributor', + 'journey.detail.readMore': 'Baca selengkapnya', + 'journey.detail.prosCons': 'Pro & Kontra', + 'journey.detail.photos': 'foto', + 'journey.detail.day': 'Hari {number}', + 'journey.detail.places': 'tempat', + + // Journey Detail — Stats + 'journey.stats.days': 'Hari', + 'journey.stats.cities': 'Kota', + 'journey.stats.entries': 'Entri', + 'journey.stats.photos': 'Foto', + 'journey.stats.places': 'Tempat', + 'journey.skeletons.show': 'Tampilkan saran', + 'journey.skeletons.hide': 'Sembunyikan saran', + + // Journey Detail — Verdict + 'journey.verdict.lovedIt': 'Sangat suka', + 'journey.verdict.couldBeBetter': 'Bisa lebih baik', + + // Journey Detail — Synced badge + 'journey.synced.places': 'tempat', + 'journey.synced.synced': 'tersinkron', + + // Journey Entry Editor + 'journey.editor.uploadPhotos': 'Unggah foto', + 'journey.editor.uploading': 'Mengunggah...', + 'journey.editor.fromGallery': 'Dari Galeri', + 'journey.editor.allPhotosAdded': 'Semua foto sudah ditambahkan', + 'journey.editor.writeStory': 'Tulis kisahmu...', + 'journey.editor.prosCons': 'Pro & Kontra', + 'journey.editor.pros': 'Pro', + 'journey.editor.cons': 'Kontra', + 'journey.editor.proPlaceholder': 'Sesuatu yang bagus...', + 'journey.editor.conPlaceholder': 'Tidak begitu bagus...', + 'journey.editor.addAnother': 'Tambah lagi', + 'journey.editor.date': 'Tanggal', + 'journey.editor.location': 'Lokasi', + 'journey.editor.searchLocation': 'Cari lokasi...', + 'journey.editor.mood': 'Suasana Hati', + 'journey.editor.weather': 'Cuaca', + 'journey.editor.photoFirst': '1.', + 'journey.editor.makeFirst': 'Jadikan ke-1', + 'journey.editor.searching': 'Mencari...', + + // Journey Entry — Moods + 'journey.mood.amazing': 'Luar biasa', + 'journey.mood.good': 'Baik', + 'journey.mood.neutral': 'Biasa', + 'journey.mood.rough': 'Berat', + + // Journey Entry — Weather + 'journey.weather.sunny': 'Cerah', + 'journey.weather.partly': 'Berawan sebagian', + 'journey.weather.cloudy': 'Mendung', + 'journey.weather.rainy': 'Hujan', + 'journey.weather.stormy': 'Badai', + 'journey.weather.cold': 'Bersalju', + + // Journey — Trip Linking + 'journey.trips.linkTrip': 'Tautkan Perjalanan', + 'journey.trips.searchTrip': 'Cari Perjalanan', + 'journey.trips.searchPlaceholder': 'Nama perjalanan atau tujuan...', + 'journey.trips.noTripsAvailable': 'Tidak ada perjalanan tersedia', + 'journey.trips.link': 'Tautkan', + 'journey.trips.tripLinked': 'Perjalanan ditautkan', + 'journey.trips.linkFailed': 'Gagal menautkan perjalanan', + 'journey.trips.addTrip': 'Tambah Perjalanan', + 'journey.trips.unlinkTrip': 'Lepas Tautan Perjalanan', + 'journey.trips.unlinkMessage': 'Lepas tautan "{title}"? Semua entri dan foto yang tersinkron dari perjalanan ini akan dihapus permanen. Tindakan ini tidak dapat dibatalkan.', + 'journey.trips.unlink': 'Lepas Tautan', + 'journey.trips.tripUnlinked': 'Tautan perjalanan dilepas', + 'journey.trips.unlinkFailed': 'Gagal melepas tautan perjalanan', + 'journey.trips.noTripsLinkedSettings': 'Tidak ada perjalanan yang ditautkan', + + // Journey — Contributors + 'journey.contributors.invite': 'Undang Kontributor', + 'journey.contributors.searchUser': 'Cari Pengguna', + 'journey.contributors.searchPlaceholder': 'Nama pengguna atau email...', + 'journey.contributors.noUsers': 'Tidak ada pengguna ditemukan', + 'journey.contributors.role': 'Peran', + 'journey.contributors.added': 'Kontributor ditambahkan', + 'journey.contributors.addFailed': 'Gagal menambahkan kontributor', + + // Journey — Share + 'journey.share.publicShare': 'Berbagi Publik', + 'journey.share.createLink': 'Buat tautan berbagi', + 'journey.share.linkCreated': 'Tautan berbagi dibuat', + 'journey.share.createFailed': 'Gagal membuat tautan', + 'journey.share.copy': 'Salin', + 'journey.share.copied': 'Disalin!', + 'journey.share.timeline': 'Linimasa', + 'journey.share.gallery': 'Galeri', + 'journey.share.map': 'Peta', + 'journey.share.removeLink': 'Hapus tautan berbagi', + 'journey.share.linkDeleted': 'Tautan berbagi dihapus', + 'journey.share.deleteFailed': 'Gagal menghapus', + 'journey.share.updateFailed': 'Gagal memperbarui', + + // Journey — Invite + 'journey.invite.role': 'Peran', + 'journey.invite.viewer': 'Penonton', + 'journey.invite.editor': 'Editor', + 'journey.invite.invite': 'Undang', + 'journey.invite.inviting': 'Mengundang...', + + // Journey — Settings Dialog + 'journey.settings.title': 'Pengaturan Journey', + 'journey.settings.coverImage': 'Gambar Sampul', + 'journey.settings.changeCover': 'Ubah sampul', + 'journey.settings.addCover': 'Tambah gambar sampul', + 'journey.settings.name': 'Nama', + 'journey.settings.subtitle': 'Subjudul', + 'journey.settings.subtitlePlaceholder': 'mis. Thailand, Vietnam & Kamboja', + 'journey.settings.delete': 'Hapus', + 'journey.settings.deleteJourney': 'Hapus Journey', + 'journey.settings.deleteMessage': 'Hapus "{title}"? Semua entri dan foto akan hilang.', + 'journey.settings.saved': 'Pengaturan disimpan', + 'journey.settings.saveFailed': 'Gagal menyimpan', + 'journey.settings.coverUpdated': 'Sampul diperbarui', + 'journey.settings.coverFailed': 'Unggah gagal', + 'journey.settings.failedToDelete': 'Gagal menghapus', + 'journey.entries.deleteTitle': 'Hapus Entri', + 'journey.photosUploaded': '{count} foto diunggah', + 'journey.photosAdded': '{count} foto ditambahkan', + + // Journey — Public Page + 'journey.public.notFound': 'Tidak Ditemukan', + 'journey.public.notFoundMessage': 'Journey ini tidak ada atau tautan telah kedaluwarsa.', + 'journey.public.readOnly': 'Hanya baca · Journey Publik', + 'journey.public.tagline': 'Travel Resource & Exploration Kit', + 'journey.public.sharedVia': 'Dibagikan melalui', + 'journey.public.madeWith': 'Dibuat dengan', + + // Journey — PDF Export + 'journey.pdf.journeyBook': 'Buku Journey', + 'journey.pdf.madeWith': 'Dibuat dengan TREK', + 'journey.pdf.day': 'Hari', + 'journey.pdf.theEnd': 'Tamat', + 'journey.pdf.saveAsPdf': 'Simpan sebagai PDF', + 'journey.pdf.pages': 'halaman', + 'journey.picker.tripPeriod': 'Periode Perjalanan', + 'journey.picker.dateRange': 'Rentang Tanggal', + 'journey.picker.allPhotos': 'Semua Foto', + 'journey.picker.albums': 'Album', + 'journey.picker.selected': 'dipilih', + 'journey.picker.addTo': 'Tambahkan ke', + 'journey.picker.newGallery': 'Galeri Baru', + 'journey.picker.selectAll': 'Pilih semua', + 'journey.picker.deselectAll': 'Batalkan semua', + 'journey.picker.noAlbums': 'Tidak ada album ditemukan', + 'journey.picker.selectDate': 'Pilih tanggal', + 'journey.picker.search': 'Cari', + + // Dashboard Mobile + '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', + + // BottomNav & Profile + 'nav.profile': 'Profil', + 'nav.bottomSettings': 'Pengaturan', + 'nav.bottomAdmin': 'Pengaturan Admin', + 'nav.bottomLogout': 'Keluar', + 'nav.bottomAdminBadge': 'Admin', + + // DayPlan Mobile + 'dayplan.mobile.addPlace': 'Tambah Tempat', + 'dayplan.mobile.searchPlaces': 'Cari tempat...', + 'dayplan.mobile.allAssigned': 'Semua tempat sudah ditugaskan', + 'dayplan.mobile.noMatch': 'Tidak ditemukan', + 'dayplan.mobile.createNew': 'Buat tempat baru', + + 'admin.addons.catalog.journey.name': 'Journey', + 'admin.addons.catalog.journey.description': 'Pelacakan perjalanan & jurnal dengan check-in, foto, dan cerita harian', + + // OAuth scope groups + 'oauth.scope.group.trips': 'Perjalanan', + 'oauth.scope.group.places': 'Tempat', + 'oauth.scope.group.atlas': 'Atlas', + 'oauth.scope.group.packing': 'Perlengkapan', + 'oauth.scope.group.todos': 'To-do', + 'oauth.scope.group.budget': 'Anggaran', + 'oauth.scope.group.reservations': 'Reservasi', + 'oauth.scope.group.collab': 'Kolaborasi', + 'oauth.scope.group.notifications': 'Notifikasi', + 'oauth.scope.group.vacay': 'Liburan', + 'oauth.scope.group.geo': 'Geo', + 'oauth.scope.group.weather': 'Cuaca', + + // OAuth scope labels & descriptions + 'oauth.scope.trips:read.label': 'Lihat perjalanan & itinerari', + 'oauth.scope.trips:read.description': 'Baca perjalanan, hari, catatan harian, dan anggota', + 'oauth.scope.trips:write.label': 'Edit perjalanan & itinerari', + 'oauth.scope.trips:write.description': 'Buat dan perbarui perjalanan, hari, catatan, dan kelola anggota', + 'oauth.scope.trips:delete.label': 'Hapus perjalanan', + 'oauth.scope.trips:delete.description': 'Hapus permanen seluruh perjalanan — tindakan ini tidak dapat dibatalkan', + 'oauth.scope.trips:share.label': 'Kelola tautan berbagi', + 'oauth.scope.trips:share.description': 'Buat, perbarui, dan cabut tautan berbagi publik untuk perjalanan', + 'oauth.scope.places:read.label': 'Lihat tempat & data peta', + 'oauth.scope.places:read.description': 'Baca tempat, penugasan hari, tag, dan kategori', + 'oauth.scope.places:write.label': 'Kelola tempat', + 'oauth.scope.places:write.description': 'Buat, perbarui, dan hapus tempat, penugasan, dan tag', + 'oauth.scope.atlas:read.label': 'Lihat Atlas', + 'oauth.scope.atlas:read.description': 'Baca negara yang dikunjungi, wilayah, dan daftar impian', + 'oauth.scope.atlas:write.label': 'Kelola Atlas', + 'oauth.scope.atlas:write.description': 'Tandai negara dan wilayah yang dikunjungi, kelola daftar impian', + 'oauth.scope.packing:read.label': 'Lihat daftar perlengkapan', + 'oauth.scope.packing:read.description': 'Baca barang perlengkapan, tas, dan penugasan kategori', + 'oauth.scope.packing:write.label': 'Kelola daftar perlengkapan', + 'oauth.scope.packing:write.description': 'Tambah, perbarui, hapus, centang, dan urutkan barang dan tas', + 'oauth.scope.todos:read.label': 'Lihat daftar to-do', + 'oauth.scope.todos:read.description': 'Baca item to-do perjalanan dan penugasan kategori', + 'oauth.scope.todos:write.label': 'Kelola daftar to-do', + 'oauth.scope.todos:write.description': 'Buat, perbarui, centang, hapus, dan urutkan item to-do', + 'oauth.scope.budget:read.label': 'Lihat anggaran', + 'oauth.scope.budget:read.description': 'Baca item anggaran dan rincian pengeluaran', + 'oauth.scope.budget:write.label': 'Kelola anggaran', + 'oauth.scope.budget:write.description': 'Buat, perbarui, dan hapus item anggaran', + 'oauth.scope.reservations:read.label': 'Lihat reservasi', + 'oauth.scope.reservations:read.description': 'Baca reservasi dan detail akomodasi', + 'oauth.scope.reservations:write.label': 'Kelola reservasi', + 'oauth.scope.reservations:write.description': 'Buat, perbarui, hapus, dan urutkan reservasi', + 'oauth.scope.collab:read.label': 'Lihat kolaborasi', + 'oauth.scope.collab:read.description': 'Baca catatan, polling, dan pesan kolaborasi', + 'oauth.scope.collab:write.label': 'Kelola kolaborasi', + 'oauth.scope.collab:write.description': 'Buat, perbarui, dan hapus catatan, polling, dan pesan kolaborasi', + 'oauth.scope.notifications:read.label': 'Lihat notifikasi', + 'oauth.scope.notifications:read.description': 'Baca notifikasi dalam aplikasi dan jumlah yang belum dibaca', + 'oauth.scope.notifications:write.label': 'Kelola notifikasi', + 'oauth.scope.notifications:write.description': 'Tandai notifikasi sebagai telah dibaca dan tanggapi', + 'oauth.scope.vacay:read.label': 'Lihat rencana liburan', + 'oauth.scope.vacay:read.description': 'Baca data perencanaan liburan, entri, dan statistik', + 'oauth.scope.vacay:write.label': 'Kelola rencana liburan', + 'oauth.scope.vacay:write.description': 'Buat dan kelola entri liburan, hari libur, dan rencana tim', + 'oauth.scope.geo:read.label': 'Peta & geokoding', + 'oauth.scope.geo:read.description': 'Cari lokasi, selesaikan URL peta, dan geokode terbalik koordinat', + 'oauth.scope.weather:read.label': 'Prakiraan cuaca', + 'oauth.scope.weather:read.description': 'Ambil prakiraan cuaca untuk lokasi dan tanggal perjalanan', + + +}; + +export default id; diff --git a/client/tests/unit/i18n/index.test.ts b/client/tests/unit/i18n/index.test.ts index 3b15721b..c042debd 100644 --- a/client/tests/unit/i18n/index.test.ts +++ b/client/tests/unit/i18n/index.test.ts @@ -91,7 +91,7 @@ describe('isRtlLanguage', () => { describe('SUPPORTED_LANGUAGES', () => { it('FE-COMP-I18N-009: contains expected entries with value/label shape', () => { expect(Array.isArray(SUPPORTED_LANGUAGES)).toBe(true) - expect(SUPPORTED_LANGUAGES).toHaveLength(14) + expect(SUPPORTED_LANGUAGES).toHaveLength(15) expect(SUPPORTED_LANGUAGES).toContainEqual(expect.objectContaining({ value: 'en', label: 'English' })) expect(SUPPORTED_LANGUAGES).toContainEqual(expect.objectContaining({ value: 'ar', label: 'العربية' })) })