2026-04-15 11:16:47 +08:00
const en : Record < string , string | { name : string ; category : string } [ ] > = {
2026-03-19 06:58:08 +08:00
// Common
'common.save' : 'Save' ,
2026-04-15 02:17:52 +08:00
'common.showMore' : 'Show more' ,
'common.showLess' : 'Show less' ,
2026-03-19 06:58:08 +08:00
'common.cancel' : 'Cancel' ,
'common.delete' : 'Delete' ,
'common.edit' : 'Edit' ,
'common.add' : 'Add' ,
2026-04-13 04:41:14 +08:00
'common.loading' : 'Loading...' ,
2026-04-01 16:13:35 +08:00
'common.import' : 'Import' ,
2026-03-19 06:58:08 +08:00
'common.error' : 'Error' ,
fix(i18n): comprehensive translation audit and fixes across all 14 languages
- Fix critical bug: Photos and Files pages had German text hardcoded in JSX,
now use t() keys visible correctly in all languages
- Add 16 new translation keys (photos/files UI, login validation, common errors,
rate limit message) across all 14 language files
- Add missing keys in packing, memories, and budget sections for br, de, it, es,
fr, nl, pl, cs, hu, ru, zh, zh-TW, ar
- Add 152+ missing keys for zh-TW (entire sections were absent)
- Change Vacay addon name to 'Férias' in pt-BR only
- Add client-side HTTP 429 interceptor that shows translated rate limit message
- Replace hardcoded English fallbacks in TripPlannerPage, DayPlanSidebar,
DisplaySettingsTab, MapSettingsTab, AccountTab, and TodoListPanel with t()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 20:35:22 +08:00
'common.unknownError' : 'Unknown error' ,
'common.tooManyAttempts' : 'Too many attempts. Please try again later.' ,
2026-03-19 06:58:08 +08:00
'common.back' : 'Back' ,
'common.all' : 'All' ,
'common.close' : 'Close' ,
'common.open' : 'Open' ,
'common.upload' : 'Upload' ,
'common.search' : 'Search' ,
'common.confirm' : 'Confirm' ,
'common.ok' : 'OK' ,
'common.yes' : 'Yes' ,
'common.no' : 'No' ,
'common.or' : 'or' ,
'common.none' : 'None' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'common.date' : 'Date' ,
2026-03-19 06:58:08 +08:00
'common.rename' : 'Rename' ,
'common.name' : 'Name' ,
'common.email' : 'Email' ,
'common.password' : 'Password' ,
2026-04-13 04:41:14 +08:00
'common.saving' : 'Saving...' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
'common.justNow' : 'just now' ,
'common.hoursAgo' : '{count}h ago' ,
'common.daysAgo' : '{count}d ago' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'common.saved' : 'Saved' ,
2026-04-13 04:29:11 +08:00
'trips.memberRemoved' : '{username} removed' ,
'trips.memberRemoveError' : 'Failed to remove' ,
'trips.memberAdded' : '{username} added' ,
'trips.memberAddError' : 'Failed to add' ,
2026-03-31 21:42:37 +08:00
'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.' ,
2026-03-19 06:58:08 +08:00
'common.update' : 'Update' ,
'common.change' : 'Change' ,
'common.uploading' : 'Uploading…' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'common.backToPlanning' : 'Back to Planning' ,
'common.reset' : 'Reset' ,
2026-04-13 04:29:11 +08:00
'common.expand' : 'Expand' ,
'common.collapse' : 'Collapse' ,
2026-03-19 06:58:08 +08:00
// Navbar
'nav.trip' : 'Trip' ,
'nav.share' : 'Share' ,
'nav.settings' : 'Settings' ,
'nav.admin' : 'Admin' ,
'nav.logout' : 'Log out' ,
'nav.lightMode' : 'Light Mode' ,
'nav.darkMode' : 'Dark Mode' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'nav.autoMode' : 'Auto Mode' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-29 17:10:33 +08:00
'dashboard.gridView' : 'Grid view' ,
'dashboard.listView' : 'List view' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'dashboard.currency' : 'Currency' ,
'dashboard.timezone' : 'Timezones' ,
'dashboard.localTime' : 'Local' ,
2026-03-29 06:23:52 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-04-03 17:10:21 +08:00
'dashboard.members' : 'Buddies' ,
2026-03-19 06:58:08 +08:00
'dashboard.archive' : 'Archive' ,
feat: add copy/duplicate trip from dashboard (#270)
New POST /api/trips/:id/copy endpoint that deep copies all trip
planning data (days, places, assignments, reservations, budget,
packing, accommodations, day notes) with proper FK remapping
inside a transaction. Skips files, collab data, and members.
Copy button on all dashboard card types (spotlight, grid, list,
archived) gated by trip_create permission. Translations for all
12 languages.
Also adds reminder_days to Trip interface (removes as-any casts).
2026-04-03 18:38:45 +08:00
'dashboard.copyTrip' : 'Copy' ,
'dashboard.copySuffix' : 'copy' ,
2026-03-19 06:58:08 +08:00
'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' ,
feat: add copy/duplicate trip from dashboard (#270)
New POST /api/trips/:id/copy endpoint that deep copies all trip
planning data (days, places, assignments, reservations, budget,
packing, accommodations, day notes) with proper FK remapping
inside a transaction. Skips files, collab data, and members.
Copy button on all dashboard card types (spotlight, grid, list,
archived) gated by trip_create permission. Translations for all
12 languages.
Also adds reminder_days to Trip interface (removes as-any casts).
2026-04-03 18:38:45 +08:00
'dashboard.toast.copied' : 'Trip copied!' ,
'dashboard.toast.copyError' : 'Failed to copy trip' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-04-05 22:25:09 +08:00
'dashboard.dayCount' : 'Number of Days' ,
'dashboard.dayCountHint' : 'How many days to plan for when no travel dates are set.' ,
2026-03-19 06:58:08 +08:00
'dashboard.noDateHint' : 'No date set — 7 default days will be created. You can change this anytime.' ,
'dashboard.coverImage' : 'Cover Image' ,
2026-03-29 22:51:35 +08:00
'dashboard.addCoverImage' : 'Add cover image (or drag & drop)' ,
'dashboard.addMembers' : 'Travel buddies' ,
'dashboard.addMember' : 'Add member' ,
2026-03-19 06:58:08 +08:00
'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' ,
// Settings
'settings.title' : 'Settings' ,
'settings.subtitle' : 'Configure your personal settings' ,
2026-04-05 11:31:24 +08:00
'settings.tabs.display' : 'Display' ,
'settings.tabs.map' : 'Map' ,
'settings.tabs.notifications' : 'Notifications' ,
'settings.tabs.integrations' : 'Integrations' ,
'settings.tabs.account' : 'Account' ,
2026-04-15 05:34:28 +08:00
'settings.tabs.offline' : 'Offline' ,
2026-04-05 11:31:24 +08:00
'settings.tabs.about' : 'About' ,
2026-03-19 06:58:08 +08:00
'settings.map' : 'Map' ,
'settings.mapTemplate' : 'Map Template' ,
'settings.mapTemplatePlaceholder.select' : 'Select template...' ,
'settings.mapDefaultHint' : 'Leave empty for 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.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.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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'settings.auto' : 'Auto' ,
2026-03-19 06:58:08 +08:00
'settings.language' : 'Language' ,
'settings.temperature' : 'Temperature Unit' ,
'settings.timeFormat' : 'Time Format' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'settings.routeCalculation' : 'Route Calculation' ,
2026-03-30 17:47:05 +08:00
'settings.blurBookingCodes' : 'Blur Booking Codes' ,
feat: email notifications, webhook support, ICS export — closes #110
Email Notifications:
- SMTP configuration in Admin > Settings (host, port, user, pass, from)
- App URL setting for email CTA links
- Webhook URL support (Discord, Slack, custom)
- Test email button with SMTP validation
- Beautiful HTML email template with TREK logo, slogan, red heart footer
- All notification texts translated in 8 languages (en/de/fr/es/nl/ru/zh/ar)
- Emails sent in each user's language preference
Notification Events:
- Trip invitation (member added)
- Booking created (new reservation)
- Vacay fusion invite
- Photos shared (Immich)
- Collab chat message
- Packing list category assignment
User Notification Preferences:
- Per-user toggle for each event type in Settings
- Addon-aware: Vacay/Collab/Photos toggles hidden when addon disabled
- Webhook opt-in per user
ICS Calendar Export:
- Download button next to PDF in day plan header
- Exports trip dates + all reservations with details
- Compatible with Google Calendar, Apple Calendar, Outlook
Technical:
- Nodemailer for SMTP
- notification_preferences DB table with per-event columns
- GET/PUT /auth/app-settings for admin config persistence
- POST /notifications/test-smtp for validation
- Dynamic imports for non-blocking notification sends
2026-03-30 23:07:33 +08:00
'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' ,
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
'settings.notifyVersionAvailable' : 'New version available' ,
'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.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' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'admin.notifications.title' : 'Notifications' ,
'admin.notifications.hint' : 'Choose one notification channel. Only one can be active at a time.' ,
'admin.notifications.none' : 'Disabled' ,
'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' ,
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
'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.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).' ,
feat: email notifications, webhook support, ICS export — closes #110
Email Notifications:
- SMTP configuration in Admin > Settings (host, port, user, pass, from)
- App URL setting for email CTA links
- Webhook URL support (Discord, Slack, custom)
- Test email button with SMTP validation
- Beautiful HTML email template with TREK logo, slogan, red heart footer
- All notification texts translated in 8 languages (en/de/fr/es/nl/ru/zh/ar)
- Emails sent in each user's language preference
Notification Events:
- Trip invitation (member added)
- Booking created (new reservation)
- Vacay fusion invite
- Photos shared (Immich)
- Collab chat message
- Packing list category assignment
User Notification Preferences:
- Per-user toggle for each event type in Settings
- Addon-aware: Vacay/Collab/Photos toggles hidden when addon disabled
- Webhook opt-in per user
ICS Calendar Export:
- Download button next to PDF in day plan header
- Exports trip dates + all reservations with details
- Compatible with Google Calendar, Apple Calendar, Outlook
Technical:
- Nodemailer for SMTP
- notification_preferences DB table with per-event columns
- GET/PUT /auth/app-settings for admin config persistence
- POST /notifications/test-smtp for validation
- Dynamic imports for non-blocking notification sends
2026-03-30 23:07:33 +08:00
'admin.smtp.title' : 'Email & Notifications' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'admin.smtp.hint' : 'SMTP configuration for sending email notifications.' ,
feat: email notifications, webhook support, ICS export — closes #110
Email Notifications:
- SMTP configuration in Admin > Settings (host, port, user, pass, from)
- App URL setting for email CTA links
- Webhook URL support (Discord, Slack, custom)
- Test email button with SMTP validation
- Beautiful HTML email template with TREK logo, slogan, red heart footer
- All notification texts translated in 8 languages (en/de/fr/es/nl/ru/zh/ar)
- Emails sent in each user's language preference
Notification Events:
- Trip invitation (member added)
- Booking created (new reservation)
- Vacay fusion invite
- Photos shared (Immich)
- Collab chat message
- Packing list category assignment
User Notification Preferences:
- Per-user toggle for each event type in Settings
- Addon-aware: Vacay/Collab/Photos toggles hidden when addon disabled
- Webhook opt-in per user
ICS Calendar Export:
- Download button next to PDF in day plan header
- Exports trip dates + all reservations with details
- Compatible with Google Calendar, Apple Calendar, Outlook
Technical:
- Nodemailer for SMTP
- notification_preferences DB table with per-event columns
- GET/PUT /auth/app-settings for admin config persistence
- POST /notifications/test-smtp for validation
- Dynamic imports for non-blocking notification sends
2026-03-30 23:07:33 +08:00
'admin.smtp.testButton' : 'Send test email' ,
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
'admin.webhook.hint' : 'Allow users to configure their own webhook URLs for notifications (Discord, Slack, etc.).' ,
feat: email notifications, webhook support, ICS export — closes #110
Email Notifications:
- SMTP configuration in Admin > Settings (host, port, user, pass, from)
- App URL setting for email CTA links
- Webhook URL support (Discord, Slack, custom)
- Test email button with SMTP validation
- Beautiful HTML email template with TREK logo, slogan, red heart footer
- All notification texts translated in 8 languages (en/de/fr/es/nl/ru/zh/ar)
- Emails sent in each user's language preference
Notification Events:
- Trip invitation (member added)
- Booking created (new reservation)
- Vacay fusion invite
- Photos shared (Immich)
- Collab chat message
- Packing list category assignment
User Notification Preferences:
- Per-user toggle for each event type in Settings
- Addon-aware: Vacay/Collab/Photos toggles hidden when addon disabled
- Webhook opt-in per user
ICS Calendar Export:
- Download button next to PDF in day plan header
- Exports trip dates + all reservations with details
- Compatible with Google Calendar, Apple Calendar, Outlook
Technical:
- Nodemailer for SMTP
- notification_preferences DB table with per-event columns
- GET/PUT /auth/app-settings for admin config persistence
- POST /notifications/test-smtp for validation
- Dynamic imports for non-blocking notification sends
2026-03-30 23:07:33 +08:00
'admin.smtp.testSuccess' : 'Test email sent successfully' ,
'admin.smtp.testFailed' : 'Test email failed' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'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.' ,
feat: email notifications, webhook support, ICS export — closes #110
Email Notifications:
- SMTP configuration in Admin > Settings (host, port, user, pass, from)
- App URL setting for email CTA links
- Webhook URL support (Discord, Slack, custom)
- Test email button with SMTP validation
- Beautiful HTML email template with TREK logo, slogan, red heart footer
- All notification texts translated in 8 languages (en/de/fr/es/nl/ru/zh/ar)
- Emails sent in each user's language preference
Notification Events:
- Trip invitation (member added)
- Booking created (new reservation)
- Vacay fusion invite
- Photos shared (Immich)
- Collab chat message
- Packing list category assignment
User Notification Preferences:
- Per-user toggle for each event type in Settings
- Addon-aware: Vacay/Collab/Photos toggles hidden when addon disabled
- Webhook opt-in per user
ICS Calendar Export:
- Download button next to PDF in day plan header
- Exports trip dates + all reservations with details
- Compatible with Google Calendar, Apple Calendar, Outlook
Technical:
- Nodemailer for SMTP
- notification_preferences DB table with per-event columns
- GET/PUT /auth/app-settings for admin config persistence
- POST /notifications/test-smtp for validation
- Dynamic imports for non-blocking notification sends
2026-03-30 23:07:33 +08:00
'dayplan.icsTooltip' : 'Export calendar (ICS)' ,
feat: public read-only share links with permissions — closes #79
Share links:
- Generate a public link in the trip share modal
- Choose what to share: Map & Plan, Bookings, Packing, Budget, Chat
- Permissions enforced server-side
- Delete link to revoke access instantly
Shared trip page (/shared/:token):
- Read-only view with TREK logo, cover image, trip details
- Tabbed navigation with Lucide icons (responsive on mobile)
- Interactive map with auto-fit bounds per day
- Day plan, Bookings, Packing, Budget, Chat views
- Language picker, TREK branding footer
Technical:
- share_tokens DB table with per-field permissions
- Public GET /shared/:token endpoint (no auth)
- Two-column share modal (max-w-5xl)
2026-03-31 00:02:53 +08:00
'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' ,
2026-03-31 00:24:22 +08:00
'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' ,
'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' ,
feat: public read-only share links with permissions — closes #79
Share links:
- Generate a public link in the trip share modal
- Choose what to share: Map & Plan, Bookings, Packing, Budget, Chat
- Permissions enforced server-side
- Delete link to revoke access instantly
Shared trip page (/shared/:token):
- Read-only view with TREK logo, cover image, trip details
- Tabbed navigation with Lucide icons (responsive on mobile)
- Interactive map with auto-fit bounds per day
- Day plan, Bookings, Packing, Budget, Chat views
- Language picker, TREK branding footer
Technical:
- share_tokens DB table with per-field permissions
- Public GET /shared/:token endpoint (no auth)
- Two-column share modal (max-w-5xl)
2026-03-31 00:02:53 +08:00
'share.permBudget' : 'Budget' ,
'share.permCollab' : 'Chat' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'settings.on' : 'On' ,
'settings.off' : 'Off' ,
2026-03-30 09:53:45 +08:00
'settings.mcp.title' : 'MCP Configuration' ,
'settings.mcp.endpoint' : 'MCP Endpoint' ,
'settings.mcp.clientConfig' : 'Client Configuration' ,
2026-03-30 12:59:24 +08:00
'settings.mcp.clientConfigHint' : 'Replace <your_token> 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).' ,
2026-04-10 11:20:38 +08:00
'settings.mcp.clientConfigHintOAuth' : 'Replace <your_client_id> and <your_client_secret> with the credentials shown in the OAuth 2.1 client you created above. mcp-remote will open your browser to complete the authorization the first time you connect. The path to npx may need to be adjusted for your system (e.g. C:\PROGRA~1\nodejs\npx.cmd on Windows).' ,
2026-03-30 09:53:45 +08:00
'settings.mcp.copy' : 'Copy' ,
'settings.mcp.copied' : 'Copied!' ,
'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' ,
2026-04-10 04:25:58 +08:00
'settings.mcp.apiTokensDeprecated' : 'API Tokens are deprecated and will be removed in a future release. Please use OAuth 2.1 Clients instead.' ,
'settings.oauth.clients' : 'OAuth 2.1 Clients' ,
'settings.oauth.clientsHint' : 'Register OAuth 2.1 clients to let third-party MCP applications (Claude Web, Cursor, etc.) connect without static tokens.' ,
'settings.oauth.createClient' : 'New Client' ,
'settings.oauth.noClients' : 'No OAuth clients registered.' ,
'settings.oauth.clientId' : 'Client ID' ,
'settings.oauth.clientSecret' : 'Client Secret' ,
'settings.oauth.deleteClient' : 'Delete Client' ,
'settings.oauth.deleteClientMessage' : 'This client and all active sessions will be permanently removed. Any application using it will lose access immediately.' ,
'settings.oauth.rotateSecret' : 'Rotate Secret' ,
'settings.oauth.rotateSecretMessage' : 'A new client secret will be generated and all existing sessions will be invalidated immediately. Update your application before closing this dialog.' ,
'settings.oauth.rotateSecretConfirm' : 'Rotate' ,
'settings.oauth.rotateSecretConfirming' : 'Rotating…' ,
'settings.oauth.rotateSecretDoneTitle' : 'New Secret Generated' ,
'settings.oauth.rotateSecretDoneWarning' : 'This secret is shown only once. Copy it now and update your application — all previous sessions have been invalidated.' ,
'settings.oauth.activeSessions' : 'Active OAuth Sessions' ,
'settings.oauth.sessionScopes' : 'Scopes' ,
'settings.oauth.sessionExpires' : 'Expires' ,
'settings.oauth.revoke' : 'Revoke' ,
'settings.oauth.revokeSession' : 'Revoke Session' ,
'settings.oauth.revokeSessionMessage' : 'This will immediately revoke access for this OAuth session.' ,
'settings.oauth.modal.createTitle' : 'Register OAuth Client' ,
'settings.oauth.modal.presets' : 'Quick presets' ,
'settings.oauth.modal.clientName' : 'Application Name' ,
'settings.oauth.modal.clientNamePlaceholder' : 'e.g. Claude Web, My MCP App' ,
'settings.oauth.modal.redirectUris' : 'Redirect URIs' ,
'settings.oauth.modal.redirectUrisPlaceholder' : 'https://your-app.com/callback\nhttps://your-app.com/auth' ,
'settings.oauth.modal.redirectUrisHint' : 'One URI per line. HTTPS required (localhost exempt). Exact match enforced.' ,
'settings.oauth.modal.scopes' : 'Allowed Scopes' ,
2026-04-10 08:44:45 +08:00
'settings.oauth.modal.scopesHint' : 'list_trips and get_trip_summary are always available — no scope required. They let the AI discover trip IDs needed to use any other tool.' ,
2026-04-10 04:25:58 +08:00
'settings.oauth.modal.selectAll' : 'Select all' ,
'settings.oauth.modal.deselectAll' : 'Deselect all' ,
'settings.oauth.modal.creating' : 'Registering…' ,
'settings.oauth.modal.create' : 'Register Client' ,
'settings.oauth.modal.createdTitle' : 'Client Registered' ,
'settings.oauth.modal.createdWarning' : 'The client secret is shown only once. Copy it now — it cannot be recovered.' ,
'settings.oauth.toast.createError' : 'Failed to register OAuth client' ,
'settings.oauth.toast.deleted' : 'OAuth client deleted' ,
'settings.oauth.toast.deleteError' : 'Failed to delete OAuth client' ,
'settings.oauth.toast.revoked' : 'Session revoked' ,
'settings.oauth.toast.revokeError' : 'Failed to revoke session' ,
'settings.oauth.toast.rotateError' : 'Failed to rotate client secret' ,
2026-03-19 06:58:08 +08:00
'settings.account' : 'Account' ,
2026-04-03 21:30:10 +08:00
'settings.about' : 'About' ,
2026-04-05 23:53:15 +08:00
'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.' ,
2026-03-19 06:58:08 +08:00
'settings.username' : 'Username' ,
'settings.email' : 'Email' ,
'settings.role' : 'Role' ,
'settings.roleAdmin' : 'Administrator' ,
2026-03-20 06:49:07 +08:00
'settings.oidcLinked' : 'Linked with' ,
'settings.changePassword' : 'Change Password' ,
'settings.currentPassword' : 'Current password' ,
2026-03-28 01:40:18 +08:00
'settings.currentPasswordRequired' : 'Current password is required' ,
2026-03-20 06:49:07 +08:00
'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' ,
2026-04-01 13:02:53 +08:00
'settings.passwordWeak' : 'Password must contain uppercase, lowercase, a number, and a special character' ,
2026-03-20 06:49:07 +08:00
'settings.passwordChanged' : 'Password changed successfully' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'settings.mustChangePassword' : 'You must change your password before you can continue. Please set a new password below.' ,
2026-03-20 06:49:07 +08:00
'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.' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-28 10:29:37 +08:00
'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.).' ,
2026-03-31 04:42:40 +08:00
'settings.mfa.requiredByPolicy' : 'Your administrator requires two-factor authentication. Set up an authenticator app below before continuing.' ,
2026-03-31 05:22:45 +08:00
'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' ,
2026-03-28 10:29:37 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
// Login
'login.error' : 'Login failed. Please check your credentials.' ,
'login.tagline' : 'Your Trips.\nYour Plan.' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'login.title' : 'Sign In' ,
'login.subtitle' : 'Welcome back' ,
'login.signingIn' : 'Signing in…' ,
'login.signIn' : 'Sign In' ,
'login.createAdmin' : 'Create Admin Account' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'login.createAdminHint' : 'Set up the first admin account for TREK.' ,
feat: notifications, audit logging, and admin improvements
- Add centralized notification service with webhook (Discord/Slack) and
email (SMTP) support, triggered for trip invites, booking changes,
collab messages, and trip reminders
- Webhook sends one message per event (group channel); email sends
individually per trip member, excluding the actor
- Discord invite notifications now include the invited user's name
- Add LOG_LEVEL env var (info/debug) controlling console and file output
- INFO logs show user email, action, and IP for audit events; errors
for HTTP requests
- DEBUG logs show every request with full body/query (passwords redacted),
audit details, notification params, and webhook payloads
- Add persistent trek.log file logging with 10MB rotation (5 files)
in /app/data/logs/
- Color-coded log levels in Docker console output
- Timestamps without timezone name (user sets TZ via Docker)
- Add Test Webhook and Save buttons to admin notification settings
- Move notification event toggles to admin panel
- Add daily trip reminder scheduler (9 AM, timezone-aware)
- Wire up booking create/update/delete and collab message notifications
- Add i18n keys for notification UI across all 13 languages
Made-with: Cursor
2026-03-31 20:01:33 +08:00
'login.setNewPassword' : 'Set New Password' ,
'login.setNewPasswordHint' : 'You must change your password before continuing.' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'login.emailPlaceholder' : 'your@email.com' ,
2026-03-19 06:58:08 +08:00
'login.username' : 'Username' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'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}' ,
2026-03-29 03:33:18 +08:00
'login.oidcOnly' : 'Password authentication is disabled. Please sign in using your SSO provider.' ,
2026-04-07 19:17:34 +08:00
'login.oidcLoggedOut' : 'You have been logged out. Sign in again using your SSO provider.' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'login.demoHint' : 'Try the demo — no registration needed' ,
2026-03-28 10:29:37 +08:00
'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' ,
fix(i18n): comprehensive translation audit and fixes across all 14 languages
- Fix critical bug: Photos and Files pages had German text hardcoded in JSX,
now use t() keys visible correctly in all languages
- Add 16 new translation keys (photos/files UI, login validation, common errors,
rate limit message) across all 14 language files
- Add missing keys in packing, memories, and budget sections for br, de, it, es,
fr, nl, pl, cs, hu, ru, zh, zh-TW, ar
- Add 152+ missing keys for zh-TW (entire sections were absent)
- Change Vacay addon name to 'Férias' in pt-BR only
- Add client-side HTTP 429 interceptor that shows translated rate limit message
- Replace hardcoded English fallbacks in TripPlannerPage, DayPlanSidebar,
DisplaySettingsTab, MapSettingsTab, AccountTab, and TodoListPanel with t()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 20:35:22 +08:00
'login.invalidInviteLink' : 'Invalid or expired invite link' ,
'login.oidcFailed' : 'OIDC login failed' ,
'login.usernameRequired' : 'Username is required' ,
'login.passwordMinLength' : 'Password must be at least 8 characters' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
// Register
'register.passwordMismatch' : 'Passwords do not match' ,
2026-04-01 13:02:53 +08:00
'register.passwordTooShort' : 'Password must be at least 8 characters' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
// Admin
'admin.title' : 'Administration' ,
'admin.subtitle' : 'User management and system settings' ,
'admin.tabs.users' : 'Users' ,
'admin.tabs.categories' : 'Categories' ,
'admin.tabs.backup' : 'Backup' ,
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
'admin.tabs.notifications' : 'Notifications' ,
2026-04-05 20:46:36 +08:00
'admin.tabs.audit' : 'Audit' ,
2026-03-19 06:58:08 +08:00
'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.table.email' : 'Email' ,
'admin.table.role' : 'Role' ,
'admin.table.created' : 'Created' ,
2026-03-20 06:49:07 +08:00
'admin.table.lastLogin' : 'Last Login' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'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' ,
2026-03-29 18:49:15 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'admin.tabs.settings' : 'Settings' ,
'admin.allowRegistration' : 'Allow Registration' ,
'admin.allowRegistrationHint' : 'New users can register themselves' ,
2026-04-12 02:21:22 +08:00
'admin.authMethods' : 'Authentication Methods' ,
'admin.passwordLogin' : 'Password Login' ,
'admin.passwordLoginHint' : 'Allow users to sign in with email and password' ,
'admin.passwordRegistration' : 'Password Registration' ,
'admin.passwordRegistrationHint' : 'Allow new users to register with email and password' ,
'admin.oidcLogin' : 'SSO Login' ,
'admin.oidcLoginHint' : 'Allow users to sign in with SSO' ,
'admin.oidcRegistration' : 'SSO Auto-Provisioning' ,
'admin.oidcRegistrationHint' : 'Automatically create accounts for new SSO users' ,
'admin.envOverrideHint' : 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.' ,
'admin.lockoutWarning' : 'At least one login method must remain enabled' ,
2026-03-31 04:42:40 +08:00
'admin.requireMfa' : 'Require two-factor authentication (2FA)' ,
'admin.requireMfaHint' : 'Users without 2FA must complete setup in Settings before using the app.' ,
2026-03-19 06:58:08 +08:00
'admin.apiKeys' : 'API Keys' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'admin.apiKeysHint' : 'Optional. Enables extended place data like photos and weather.' ,
2026-03-19 06:58:08 +08:00
'admin.mapsKey' : 'Google Maps API Key' ,
'admin.mapsKeyHint' : 'Required for place search. Get at console.cloud.google.com' ,
2026-03-20 06:49:07 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-20 06:49:07 +08:00
'admin.oidcTitle' : 'Single Sign-On (OIDC)' ,
'admin.oidcSubtitle' : 'Allow login via external providers like Google, Apple, Authentik or Keycloak.' ,
'admin.oidcDisplayName' : 'Display Name' ,
'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' ,
2026-03-29 03:33:18 +08:00
'admin.oidcOnlyMode' : 'Disable password authentication' ,
'admin.oidcOnlyModeHint' : 'When enabled, only SSO login is permitted. Password-based login and registration are blocked.' ,
2026-03-19 06:58:08 +08:00
2026-03-25 06:25:02 +08:00
// 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' ,
2026-03-29 21:08:56 +08:00
// Packing Templates & Bag Tracking
'admin.bagTracking.title' : 'Bag Tracking' ,
'admin.bagTracking.subtitle' : 'Enable weight and bag assignment for packing items' ,
2026-04-05 20:46:36 +08:00
'admin.tabs.config' : 'Personalization' ,
2026-03-29 20:19:06 +08:00
'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' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
// Addons
'admin.tabs.addons' : 'Addons' ,
'admin.addons.title' : 'Addons' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'admin.addons.subtitle' : 'Enable or disable features to customize your TREK experience.' ,
feat(todo): add To-Do list feature with 3-column layout
- New todo_items DB table with priority, due date, description, user assignment
- Full CRUD API with WebSocket real-time sync
- 3-column UI: sidebar filters (All, My Tasks, Overdue, Done, by Priority),
task list with inline badges, and detail/create pane
- Apple-inspired design with custom dropdowns, date picker, priority system (P1-P3)
- Mobile responsive: icon-only sidebar, bottom-sheet modals for detail/create
- Lists tab with sub-tabs (Packing List + To-Do), persisted selection
- Addon renamed from "Packing List" to "Lists"
- i18n keys for all 13 languages
- UI polish: notification colors use system theme, mobile navbar cleanup,
settings page responsive buttons
2026-04-04 22:58:24 +08:00
'admin.addons.catalog.packing.name' : 'Lists' ,
'admin.addons.catalog.packing.description' : 'Packing lists and to-do tasks for your trips' ,
2026-03-29 06:46:15 +08:00
'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.addons.catalog.vacay.name' : 'Vacay' ,
'admin.addons.catalog.vacay.description' : 'Personal vacation planner with calendar view' ,
'admin.addons.catalog.atlas.name' : 'Atlas' ,
'admin.addons.catalog.atlas.description' : 'World map with visited countries and travel stats' ,
'admin.addons.catalog.collab.name' : 'Collab' ,
'admin.addons.catalog.collab.description' : 'Real-time notes, polls, and chat for trip planning' ,
2026-03-30 02:12:47 +08:00
'admin.addons.catalog.memories.name' : 'Photos (Immich)' ,
'admin.addons.catalog.memories.description' : 'Share trip photos via your Immich instance' ,
2026-03-30 09:53:45 +08:00
'admin.addons.catalog.mcp.name' : 'MCP' ,
'admin.addons.catalog.mcp.description' : 'Model Context Protocol for AI assistant integration' ,
v2.5.2 — PWA, new branding, bug fixes
Progressive Web App:
- Service worker with Workbox caching (map tiles, API, uploads, CDN)
- Web app manifest with standalone display mode
- Custom app icon with PNG generation from SVG
- Apple meta tags, dynamic theme-color for dark/light mode
- iOS safe area handling
New Branding:
- Custom NOMAD logo (icon + text variants for light/dark mode)
- Logo used in navbar, login page, demo banner, admin, PDF export
- MuseoModerno font for login tagline
- Plane takeoff animation on login
- Liquid glass hover effect on dashboard spotlight & widgets
- Brand images protected from save/copy/drag
- "made with NOMAD" footer on PDF exports
Bug Fixes:
- Fix mobile note reorder (missing tripId prop)
- Fix Atlas city counting (strip postal codes, normalize case)
- Fix Atlas country detection (add Japanese/Korean/Thai names)
- Fix PDF note positioning (use order_index instead of sort_order)
- Fix PDF note icons (render actual icon instead of hardcoded notepad)
- Fix file source badge overflow on mobile (text truncation)
- Fix navbar dropdown z-index overlap with mobile plan/places buttons
- Fix dashboard trip card hover contrast in dark mode
- Fix day header hover color matching place background in dark mode
- Shorten settings button labels on mobile
UI Improvements:
- Mobile navbar shows icon only, desktop shows full logo
- NOMAD version badge in profile dropdown
- Top padding before first item in day planner
- Improved drag & drop stability (larger drop zones, less flickering)
2026-03-22 09:50:13 +08:00
'admin.addons.subtitleBefore' : 'Enable or disable features to customize your ' ,
'admin.addons.subtitleAfter' : ' experience.' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'admin.addons.enabled' : 'Enabled' ,
'admin.addons.disabled' : 'Disabled' ,
'admin.addons.type.trip' : 'Trip' ,
'admin.addons.type.global' : 'Global' ,
2026-03-30 09:53:45 +08:00
'admin.addons.type.integration' : 'Integration' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'admin.addons.tripHint' : 'Available as a tab within each trip' ,
'admin.addons.globalHint' : 'Available as a standalone section in the main navigation' ,
2026-03-30 09:53:45 +08:00
'admin.addons.integrationHint' : 'Backend services and API integrations with no dedicated page' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'admin.addons.toast.updated' : 'Addon updated' ,
'admin.addons.toast.error' : 'Failed to update addon' ,
'admin.addons.noAddons' : 'No addons available' ,
2026-03-24 17:02:03 +08:00
// Weather info
'admin.weather.title' : 'Weather Data' ,
'admin.weather.badge' : 'Since March 24, 2026' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'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.' ,
2026-03-24 17:02:03 +08:00
'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.' ,
// GitHub
2026-04-10 12:47:23 +08:00
'admin.tabs.mcpTokens' : 'MCP Access' ,
'admin.mcpTokens.title' : 'MCP Access' ,
'admin.mcpTokens.subtitle' : 'Manage OAuth sessions and API tokens across all users' ,
'admin.mcpTokens.sectionTitle' : 'API Tokens' ,
2026-03-30 09:53:45 +08:00
'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' ,
2026-04-10 12:47:23 +08:00
'admin.oauthSessions.sectionTitle' : 'OAuth Sessions' ,
'admin.oauthSessions.clientName' : 'Client' ,
'admin.oauthSessions.owner' : 'Owner' ,
'admin.oauthSessions.scopes' : 'Scopes' ,
'admin.oauthSessions.created' : 'Created' ,
'admin.oauthSessions.empty' : 'No active OAuth sessions' ,
'admin.oauthSessions.revokeTitle' : 'Revoke Session' ,
'admin.oauthSessions.revokeMessage' : 'This will revoke the OAuth session immediately. The client will lose MCP access.' ,
'admin.oauthSessions.revokeSuccess' : 'Session revoked' ,
'admin.oauthSessions.revokeError' : 'Failed to revoke session' ,
'admin.oauthSessions.loadError' : 'Failed to load OAuth sessions' ,
2026-03-24 17:02:03 +08:00
'admin.tabs.github' : 'GitHub' ,
feat(audit): admin audit log
Audit log
- Add audit_log table (migration + schema) with index on created_at.
- Add auditLog service (writeAudit, getClientIp) and record events for backups
(create, restore, upload-restore, delete, auto-settings), admin actions
(users, OIDC, invites, system update, demo baseline, bag tracking, packing
template delete, addons), and auth (app settings, MFA enable/disable).
- Add GET /api/admin/audit-log with pagination; fix invite insert row id lookup.
- Add AuditLogPanel and Admin tab; adminApi.auditLog.
- Add admin.tabs.audit and admin.audit.* strings in all locale files.
Note: Rebase feature branches so new DB migrations stay after existing ones
(e.g. file_links) when merging upstream.
2026-03-30 06:39:05 +08:00
'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.col.ip' : 'IP' ,
'admin.audit.col.details' : 'Details' ,
2026-03-24 17:02:03 +08:00
'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' ,
2026-03-29 17:47:45 +08:00
'admin.github.support' : 'Helps me keep building TREK' ,
2026-03-24 17:02:03 +08:00
2026-03-24 02:02:08 +08:00
'admin.update.available' : 'Update available' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'admin.update.text' : 'TREK {version} is available. You are running {current}.' ,
2026-03-24 02:02:08 +08:00
'admin.update.button' : 'View on GitHub' ,
'admin.update.install' : 'Install Update' ,
'admin.update.confirmTitle' : 'Install Update?' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'admin.update.confirmText' : 'TREK will be updated from {current} to {version}. The server will restart automatically afterwards.' ,
2026-03-24 02:02:08 +08:00
'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' ,
2026-03-24 02:17:59 +08:00
'admin.update.howTo' : 'How to Update' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'admin.update.dockerText' : 'Your TREK instance runs in Docker. To update to {version}, run the following commands on your server:' ,
2026-03-24 02:02:08 +08:00
'admin.update.reloadHint' : 'Please reload the page in a few seconds.' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
// Vacay addon
'vacay.subtitle' : 'Plan and manage vacation days' ,
'vacay.settings' : 'Settings' ,
'vacay.year' : 'Year' ,
2026-04-04 01:49:58 +08:00
'vacay.addYear' : 'Add next year' ,
'vacay.addPrevYear' : 'Add previous year' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'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' ,
2026-03-30 02:12:47 +08:00
'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' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'vacay.publicHolidays' : 'Public Holidays' ,
'vacay.publicHolidaysHint' : 'Mark public holidays in the calendar' ,
'vacay.selectCountry' : 'Select country' ,
'vacay.selectRegion' : 'Select region (optional)' ,
2026-03-29 06:16:12 +08:00
'vacay.addCalendar' : 'Add calendar' ,
'vacay.calendarLabel' : 'Label (optional)' ,
'vacay.calendarColor' : 'Color' ,
'vacay.noCalendars' : 'No holiday calendars added yet' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'vacay.companyHolidays' : 'Company Holidays' ,
'vacay.companyHolidaysHint' : 'Allow marking company-wide holiday days' ,
'vacay.companyHolidaysNoDeduct' : 'Company holidays do not count towards vacation days.' ,
2026-04-12 08:18:45 +08:00
'vacay.weekStart' : 'Week starts on' ,
'vacay.weekStartHint' : 'Choose whether the calendar week starts on Monday or Sunday' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'vacay.carryOver' : 'Carry Over' ,
'vacay.carryOverHint' : 'Automatically carry remaining vacation days into the next year' ,
'vacay.sharing' : 'Sharing' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'vacay.sharingHint' : 'Share your vacation plan with other TREK users' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'vacay.owner' : 'Owner' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'vacay.shareEmailPlaceholder' : 'Email of TREK user' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'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' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'vacay.inviteHint' : 'Invite another TREK user to share a combined vacation calendar.' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'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' ,
// Atlas addon
'atlas.subtitle' : 'Your travel footprint around the world' ,
'atlas.countries' : 'Countries' ,
'atlas.trips' : 'Trips' ,
'atlas.places' : 'Places' ,
2026-03-29 22:51:35 +08:00
'atlas.unmark' : 'Remove' ,
'atlas.confirmMark' : 'Mark this country as visited?' ,
'atlas.confirmUnmark' : 'Remove this country from your visited list?' ,
2026-04-05 09:17:33 +08:00
'atlas.confirmUnmarkRegion' : 'Remove this region from your visited list?' ,
2026-03-29 22:51:35 +08:00
'atlas.markVisited' : 'Mark as visited' ,
'atlas.markVisitedHint' : 'Add this country to your visited list' ,
2026-04-05 09:17:33 +08:00
'atlas.markRegionVisitedHint' : 'Add this region to your visited list' ,
2026-03-29 22:51:35 +08:00
'atlas.addToBucket' : 'Add to bucket list' ,
2026-03-30 20:57:31 +08:00
'atlas.addPoi' : 'Add place' ,
2026-03-31 18:27:13 +08:00
'atlas.searchCountry' : 'Search a country...' ,
2026-03-30 20:57:31 +08:00
'atlas.bucketNamePlaceholder' : 'Name (country, city, place...)' ,
'atlas.month' : 'Month' ,
'atlas.year' : 'Year' ,
2026-03-29 22:51:35 +08:00
'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' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'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.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' ,
2026-03-19 06:58:08 +08:00
// Trip Planner
'trip.tabs.plan' : 'Plan' ,
'trip.tabs.reservations' : 'Bookings' ,
v2.5.0 — Addon System, Vacay, Atlas, Dashboard Widgets & Mobile Overhaul
The biggest NOMAD update yet. Introduces a modular addon architecture and three major new features.
Addon System:
- Admin panel addon management with enable/disable toggles
- Trip addons (Packing List, Budget, Documents) dynamically show/hide in trip tabs
- Global addons appear in the main navigation for all users
Vacay — Vacation Day Planner (Global Addon):
- Monthly calendar view with international public holidays (100+ countries via Nager.Date API)
- Company holidays with auto-cleanup of conflicting entries
- User-based system: each NOMAD user is a person in the calendar
- Fusion system: invite other users to share a combined calendar with real-time WebSocket sync
- Vacation entitlement tracking with automatic carry-over to next year
- Full settings: block weekends, public holidays, company holidays, carry-over toggle
- Invite/accept/decline flow with forced confirmation modal
- Color management per user with collision detection on fusion
- Dissolve fusion with preserved entries
Atlas — Travel World Map (Global Addon):
- Fullscreen Leaflet world map with colored country polygons (GeoJSON)
- Glass-effect bottom panel with stats, continent breakdown, streak tracking
- Country tooltips with trip count, places visited, first/last visit dates
- Liquid glass hover effect on the stats panel
- Canvas renderer with tile preloading for maximum performance
- Responsive: mobile stats bars, no zoom controls on touch
Dashboard Widgets:
- Currency converter with 50 currencies, CustomSelect dropdowns, localStorage persistence
- Timezone widget with customizable city list, live updating clock
- Per-user toggle via settings button, bottom sheet on mobile
Admin Panel:
- Consistent dark mode across all tabs (CSS variable overrides)
- Online/offline status badges on user list via WebSocket
- Unified heading sizes and subtitles across all sections
- Responsive tab grid on mobile
Mobile Improvements:
- Vacay: slide-in sidebar drawer, floating toolbar, responsive calendar grid
- Atlas: top/bottom glass stat bars, no popups
- Trip Planner: fixed position content container prevents overscroll, portal-based sidebar buttons
- Dashboard: fixed viewport container, mobile widget bottom sheet
- Admin: responsive tab grid, compact buttons
- Global: overscroll-behavior fixes, modal scroll containment
Other:
- Trip tab labels: Planung→Karte, Packliste→Liste, Buchungen→Buchung (DE mobile)
- Reservation form responsive layout
- Backup panel responsive buttons
2026-03-21 06:14:06 +08:00
'trip.tabs.reservationsShort' : 'Book' ,
2026-03-19 06:58:08 +08:00
'trip.tabs.packing' : 'Packing List' ,
'trip.tabs.packingShort' : 'Packing' ,
feat(todo): add To-Do list feature with 3-column layout
- New todo_items DB table with priority, due date, description, user assignment
- Full CRUD API with WebSocket real-time sync
- 3-column UI: sidebar filters (All, My Tasks, Overdue, Done, by Priority),
task list with inline badges, and detail/create pane
- Apple-inspired design with custom dropdowns, date picker, priority system (P1-P3)
- Mobile responsive: icon-only sidebar, bottom-sheet modals for detail/create
- Lists tab with sub-tabs (Packing List + To-Do), persisted selection
- Addon renamed from "Packing List" to "Lists"
- i18n keys for all 13 languages
- UI polish: notification colors use system theme, mobile navbar cleanup,
settings page responsive buttons
2026-04-04 22:58:24 +08:00
'trip.tabs.lists' : 'Lists' ,
'trip.tabs.listsShort' : 'Lists' ,
2026-03-19 06:58:08 +08:00
'trip.tabs.budget' : 'Budget' ,
'trip.tabs.files' : 'Files' ,
'trip.loading' : 'Loading trip...' ,
2026-04-01 20:56:01 +08:00
'trip.loadingPhotos' : 'Loading place photos...' ,
2026-03-19 06:58:08 +08:00
'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?' ,
// Day Plan Sidebar
'dayplan.emptyDay' : 'No places planned for this day' ,
2026-03-30 16:15:27 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-21 22:35:05 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'dayplan.confirmed' : 'Confirmed' ,
'dayplan.pendingRes' : 'Pending' ,
'dayplan.pdf' : 'PDF' ,
'dayplan.pdfTooltip' : 'Export day plan as PDF' ,
'dayplan.pdfError' : 'Failed to export PDF' ,
// Places Sidebar
2026-03-25 23:47:10 +08:00
'places.addPlace' : 'Add Place/Activity' ,
2026-04-01 16:13:35 +08:00
'places.importGpx' : 'GPX' ,
2026-04-07 04:26:22 +08:00
'places.importKeyholeMarkup' : 'KMZ / KML' ,
2026-03-30 17:35:28 +08:00
'places.gpxImported' : '{count} places imported from GPX' ,
2026-04-07 00:32:10 +08:00
'places.kmlKmzImported' : '{count} places imported from KMZ/KML' ,
2026-03-30 21:18:22 +08:00
'places.urlResolved' : 'Place imported from URL' ,
2026-03-30 17:35:28 +08:00
'places.gpxError' : 'GPX import failed' ,
2026-04-07 20:04:27 +08:00
'places.importList' : 'List Import' ,
2026-04-07 00:32:10 +08:00
'places.kmlKmzImportError' : 'KMZ/KML import failed' ,
'places.kmlKmzInvalidType' : 'Please select a .kml or .kmz file.' ,
'places.kmlKmzTooLarge' : 'File is too large. Maximum upload size is {maxMb} MB.' ,
2026-04-07 01:13:54 +08:00
'places.kmlKmzHint' : 'Import map files from tools like Google My Maps and Google Earth.' ,
'places.kmlKmzSizeHint' : 'Max file size: {maxMb} MB' ,
'places.kmlKmzSelectFile' : 'Select File' ,
2026-04-07 00:32:10 +08:00
'places.kmlKmzSelectedFile' : 'Selected file: {name}' ,
'places.kmlKmzSummaryTitle' : 'Import summary' ,
'places.kmlKmzSummaryValues' : 'Placemarks: {total} • Imported: {created} • Skipped: {skipped}' ,
2026-04-01 16:13:35 +08:00
'places.importGoogleList' : 'Google List' ,
2026-04-10 21:15:04 +08:00
'places.importNaverList' : 'Naver List' ,
2026-04-01 16:13:35 +08:00
'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' ,
2026-04-07 20:04:27 +08:00
'places.naverListHint' : 'Paste a shared Naver Maps list link to import all places.' ,
'places.naverListImported' : '{count} places imported from "{list}"' ,
'places.naverListError' : 'Failed to import Naver Maps list' ,
2026-04-01 18:38:44 +08:00
'places.viewDetails' : 'View Details' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'places.assignToDay' : 'Add to which day?' ,
2026-03-19 06:58:08 +08:00
'places.all' : 'All' ,
'places.unplanned' : 'Unplanned' ,
'places.search' : 'Search places...' ,
'places.allCategories' : 'All Categories' ,
2026-03-30 19:52:35 +08:00
'places.categoriesSelected' : 'categories' ,
'places.clearFilter' : 'Clear filter' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'places.startTime' : 'Start' ,
'places.endTime' : 'End' ,
2026-03-25 23:47:10 +08:00
'places.endTimeBeforeStart' : 'End time is before start time' ,
'places.timeCollision' : 'Time overlap with:' ,
2026-03-19 06:58:08 +08:00
'places.formWebsite' : 'Website' ,
2026-04-14 21:38:39 +08:00
'places.formNotes' : 'Notes' ,
2026-03-19 06:58:08 +08:00
'places.formNotesPlaceholder' : 'Personal notes...' ,
'places.formReservation' : 'Reservation' ,
'places.reservationNotesPlaceholder' : 'Reservation notes, confirmation number...' ,
2026-03-20 06:49:07 +08:00
'places.mapsSearchPlaceholder' : 'Search places...' ,
'places.mapsSearchError' : 'Place search failed.' ,
2026-04-13 23:28:34 +08:00
'places.loadingDetails' : 'Loading place details…' ,
2026-03-20 06:49:07 +08:00
'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.' ,
2026-03-19 06:58:08 +08:00
'places.categoryCreateError' : 'Failed to create category' ,
'places.nameRequired' : 'Please enter a name' ,
'places.saveError' : 'Failed to save' ,
// Place Inspector
'inspector.opened' : 'Open' ,
'inspector.closed' : 'Closed' ,
'inspector.openingHours' : 'Opening Hours' ,
'inspector.showHours' : 'Show opening hours' ,
'inspector.files' : 'Files' ,
'inspector.filesCount' : '{count} files' ,
2026-04-13 04:29:11 +08:00
'inspector.remove' : 'Remove' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'inspector.addRes' : 'Reservation' ,
'inspector.editRes' : 'Edit Reservation' ,
2026-03-25 06:25:02 +08:00
'inspector.participants' : 'Participants' ,
2026-03-31 06:10:33 +08:00
'inspector.trackStats' : 'Track Stats' ,
2026-03-19 06:58:08 +08:00
// 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.status' : 'Status' ,
'reservations.datetime' : 'Date & Time' ,
2026-03-27 05:32:15 +08:00
'reservations.startTime' : 'Start time' ,
'reservations.endTime' : 'End time' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'reservations.date' : 'Date' ,
'reservations.time' : 'Time' ,
2026-03-19 06:58:08 +08:00
'reservations.timeAlt' : 'Time (alternative, e.g. 19:30)' ,
'reservations.notes' : 'Notes' ,
'reservations.notesPlaceholder' : 'Additional notes...' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'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.meta.checkIn' : 'Check-in' ,
'reservations.meta.checkOut' : 'Check-out' ,
'reservations.meta.linkAccommodation' : 'Accommodation' ,
'reservations.meta.pickAccommodation' : 'Link to accommodation' ,
'reservations.meta.noAccommodation' : 'None' ,
2026-03-29 17:14:33 +08:00
'reservations.meta.hotelPlace' : 'Accommodation' ,
'reservations.meta.pickHotel' : 'Select accommodation' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'reservations.meta.fromDay' : 'From' ,
'reservations.meta.toDay' : 'To' ,
'reservations.meta.selectDay' : 'Select day' ,
2026-03-19 06:58:08 +08:00
'reservations.type.flight' : 'Flight' ,
2026-03-29 17:14:33 +08:00
'reservations.type.hotel' : 'Accommodation' ,
2026-03-19 06:58:08 +08:00
'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}"?' ,
2026-03-30 16:15:27 +08:00
'reservations.confirm.deleteTitle' : 'Delete booking?' ,
'reservations.confirm.deleteBody' : '"{name}" will be permanently deleted.' ,
2026-03-19 06:58:08 +08:00
'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...' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'reservations.confirmationCode' : 'Booking Code' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-30 05:32:04 +08:00
'reservations.linkExisting' : 'Link existing file' ,
2026-03-19 06:58:08 +08:00
'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}"?' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'reservations.linkAssignment' : 'Link to day assignment' ,
'reservations.pickAssignment' : 'Select an assignment from your plan...' ,
'reservations.noAssignment' : 'No link (standalone)' ,
2026-04-05 05:59:30 +08:00
'reservations.price' : 'Price' ,
'reservations.budgetCategory' : 'Budget category' ,
'reservations.budgetCategoryPlaceholder' : 'e.g. Transport, Accommodation' ,
2026-04-05 06:13:07 +08:00
'reservations.budgetCategoryAuto' : 'Auto (from booking type)' ,
2026-04-05 05:59:30 +08:00
'reservations.budgetHint' : 'A budget entry will be created automatically when saving.' ,
2026-04-03 21:47:06 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
// Budget
'budget.title' : 'Budget' ,
2026-04-01 18:16:11 +08:00
'budget.exportCsv' : 'Export CSV' ,
2026-03-19 06:58:08 +08:00
'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.table.total' : 'Total' ,
'budget.table.persons' : 'Persons' ,
'budget.table.days' : 'Days' ,
'budget.table.perPerson' : 'Per Person' ,
'budget.table.perDay' : 'Per Day' ,
2026-03-26 00:31:37 +08:00
'budget.table.perPersonDay' : 'P. p / Day' ,
2026-03-19 06:58:08 +08:00
'budget.table.note' : 'Note' ,
2026-04-01 18:16:11 +08:00
'budget.table.date' : 'Date' ,
2026-03-19 06:58:08 +08:00
'budget.newEntry' : 'New Entry' ,
'budget.defaultEntry' : 'New Entry' ,
'budget.defaultCategory' : 'New Category' ,
'budget.total' : 'Total' ,
'budget.totalBudget' : 'Total Budget' ,
'budget.byCategory' : 'By Category' ,
'budget.editTooltip' : 'Click to edit' ,
2026-04-06 00:16:02 +08:00
'budget.linkedToReservation' : 'Linked to a reservation — edit the name there' ,
2026-03-19 06:58:08 +08:00
'budget.confirm.deleteCategory' : 'Are you sure you want to delete the category "{name}" with {count} entries?' ,
'budget.deleteCategory' : 'Delete Category' ,
2026-03-26 00:31:37 +08:00
'budget.perPerson' : 'Per Person' ,
'budget.paid' : 'Paid' ,
'budget.open' : 'Open' ,
'budget.noMembers' : 'No members assigned' ,
2026-03-30 17:12:22 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
// Files
'files.title' : 'Files' ,
fix(i18n): comprehensive translation audit and fixes across all 14 languages
- Fix critical bug: Photos and Files pages had German text hardcoded in JSX,
now use t() keys visible correctly in all languages
- Add 16 new translation keys (photos/files UI, login validation, common errors,
rate limit message) across all 14 language files
- Add missing keys in packing, memories, and budget sections for br, de, it, es,
fr, nl, pl, cs, hu, ru, zh, zh-TW, ar
- Add 152+ missing keys for zh-TW (entire sections were absent)
- Change Vacay addon name to 'Férias' in pt-BR only
- Add client-side HTTP 429 interceptor that shows translated rate limit message
- Replace hardcoded English fallbacks in TripPlannerPage, DayPlanSidebar,
DisplaySettingsTab, MapSettingsTab, AccountTab, and TodoListPanel with t()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 20:35:22 +08:00
'files.pageTitle' : 'Files & Documents' ,
'files.subtitle' : '{count} files for {trip}' ,
'files.downloadPdf' : 'Download PDF' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-25 06:25:02 +08:00
'files.allowedTypes' : 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 MB' ,
2026-03-19 06:58:08 +08:00
'files.uploading' : 'Uploading...' ,
'files.filterAll' : 'All' ,
'files.filterPdf' : 'PDFs' ,
'files.filterImages' : 'Images' ,
'files.filterDocs' : 'Documents' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'files.filterCollab' : 'Collab Notes' ,
'files.sourceCollab' : 'From Collab Notes' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'files.attach' : 'Attach' ,
'files.pasteHint' : 'You can also paste images from clipboard (Ctrl+V)' ,
v2.6.2 — TREK Rebrand, OSM Enrichment, File Management, Hotel Bookings & Bug Fixes
Rebrand:
- NOMAD → TREK branding across all UI, translations, server, PWA manifest
- New TREK logos (dark/light, with/without icon)
- Liquid glass toast notifications
Bugs Fixed:
- HTTPS redirect now opt-in only (FORCE_HTTPS=true), fixes #33 #43 #52 #54 #55
- PDF export "Tag" fallback uses i18n, fixes #15
- Vacay sharing color collision detection, fixes #25
- Backup settings import fix (PR #47)
- Atlas country detection uses smallest bounding box, fixes #31
- JPY and zero-decimal currencies formatted correctly, fixes #32
- HTML lang="en" instead of hardcoded "de", fixes #34
- Duplicate translation keys removed
- setSelectedAssignmentId crash fixed
New Features:
- OSM enrichment: Overpass API for opening hours, Wikimedia Commons for photos
- Reverse geocoding on map right-click to add places
- OIDC config via environment variables (OIDC_ISSUER, OIDC_CLIENT_ID, etc.), fixes #48
- Multi-arch Docker build (ARM64 + AMD64), fixes #11
- File management: star, trash/restore, upload owner, assign to places/bookings, notes
- Markdown rendering in Collab Notes with expand modal, fixes #17
- Type-specific booking fields (flight: airline/number/airports, hotel: check-in/out/days, train: number/platform/seat), fixes #35
- Hotel bookings auto-create accommodations, bidirectional sync
- Multiple hotels per day with check-in/check-out color coding
- Ko-fi and Buy Me a Coffee support cards
- GitHub releases proxy with server-side caching
2026-03-28 23:38:08 +08:00
'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...' ,
2026-03-19 06:58:08 +08:00
// Packing
'packing.title' : 'Packing List' ,
'packing.empty' : 'Packing list is empty' ,
feat: bulk import for packing lists + complete i18n sync — closes #133
Packing list bulk import:
- Import button in packing list header opens a modal
- Paste items or load CSV/TXT file
- Format: Category, Name, Weight (g), Bag, checked/unchecked
- Bags are auto-created if they don't exist
- Server endpoint POST /packing/import with transaction
i18n sync:
- Added all missing translation keys to fr, es, nl, ru, zh, ar
- All 8 language files now have matching key sets
- Includes memories, vacay weekdays, packing import, settlement,
GPX import, blur booking codes, transport timeline keys
2026-03-30 18:16:00 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'packing.progress' : '{packed} of {total} packed ({percent}%)' ,
'packing.clearChecked' : 'Remove {count} checked' ,
v2.1.0 — Real-time collaboration, performance & security overhaul
Real-Time Collaboration (WebSocket):
- WebSocket server with JWT auth and trip-based rooms
- Live sync for all CRUD operations (places, assignments, days, notes, budget, packing, reservations, files)
- Socket-based exclusion to prevent duplicate updates
- Auto-reconnect with exponential backoff
- Assignment move sync between days
Performance:
- 16 database indexes on all foreign key columns
- N+1 query fix in places, assignments and days endpoints
- Marker clustering (react-leaflet-cluster) with configurable radius
- List virtualization (react-window) for places sidebar
- useMemo for filtered places
- SQLite WAL mode + busy_timeout for concurrent writes
- Weather API: server-side cache (1h forecast, 15min current) + client sessionStorage
- Google Places photos: persisted to DB after first fetch
- Google Details: 3-tier cache (memory → sessionStorage → API)
Security:
- CORS auto-configuration (production: same-origin, dev: open)
- API keys removed from /auth/me response
- Admin-only endpoint for reading API keys
- Path traversal prevention in cover image deletion
- JWT secret persisted to file (survives restarts)
- Avatar upload file extension whitelist
- API key fallback: normal users use admin's key without exposure
- Case-insensitive email login
Dark Mode:
- Fixed hardcoded colors across PackingList, Budget, ReservationModal, ReservationsPanel
- Mobile map buttons and sidebar sheets respect dark mode
- Cluster markers always dark
UI/UX:
- Redesigned login page with animated planes, stars and feature cards
- Admin: create user functionality with CustomSelect
- Mobile: day-picker popup for assigning places to days
- Mobile: touch-friendly reorder buttons (32px targets)
- Mobile: responsive text (shorter labels on small screens)
- Packing list: index-based category colors
- i18n: translated date picker placeholder, fixed German labels
- Default map tile: CartoDB Light
2026-03-19 19:44:22 +08:00
'packing.clearCheckedShort' : 'Remove {count}' ,
2026-03-19 06:58:08 +08:00
'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' ,
2026-03-29 19:37:48 +08:00
'packing.noMembers' : 'No trip members' ,
2026-03-29 20:19:06 +08:00
'packing.addItem' : 'Add item' ,
'packing.addItemPlaceholder' : 'Item name...' ,
'packing.addCategory' : 'Add category' ,
'packing.newCategoryPlaceholder' : 'Category name (e.g. Clothing)' ,
'packing.applyTemplate' : 'Apply template' ,
2026-03-29 21:08:56 +08:00
'packing.template' : 'Template' ,
2026-03-29 20:19:06 +08:00
'packing.templateApplied' : '{count} items added from template' ,
'packing.templateError' : 'Failed to apply template' ,
2026-04-06 01:28:33 +08:00
'packing.saveAsTemplate' : 'Save as template' ,
'packing.templateName' : 'Template name' ,
'packing.templateSaved' : 'Packing list saved as template' ,
2026-03-29 21:08:56 +08:00
'packing.bags' : 'Bags' ,
'packing.noBag' : 'Unassigned' ,
'packing.totalWeight' : 'Total weight' ,
'packing.bagName' : 'Bag name...' ,
'packing.addBag' : 'Add bag' ,
2026-03-19 06:58:08 +08:00
'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 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' } ,
] ,
// 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' ,
// 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' ,
// 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.auto.interval' : 'Interval' ,
2026-03-30 17:24:02 +08:00
'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.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' ,
2026-03-19 06:58:08 +08:00
'backup.auto.keepLabel' : 'Delete old backups after' ,
2026-03-30 17:24:02 +08:00
'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' ,
2026-03-19 06:58:08 +08:00
'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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
// Photos
fix(i18n): comprehensive translation audit and fixes across all 14 languages
- Fix critical bug: Photos and Files pages had German text hardcoded in JSX,
now use t() keys visible correctly in all languages
- Add 16 new translation keys (photos/files UI, login validation, common errors,
rate limit message) across all 14 language files
- Add missing keys in packing, memories, and budget sections for br, de, it, es,
fr, nl, pl, cs, hu, ru, zh, zh-TW, ar
- Add 152+ missing keys for zh-TW (entire sections were absent)
- Change Vacay addon name to 'Férias' in pt-BR only
- Add client-side HTTP 429 interceptor that shows translated rate limit message
- Replace hardcoded English fallbacks in TripPlannerPage, DayPlanSidebar,
DisplaySettingsTab, MapSettingsTab, AccountTab, and TodoListPanel with t()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 20:35:22 +08:00
'photos.title' : 'Photos' ,
'photos.subtitle' : '{count} photos for {trip}' ,
'photos.dropHere' : 'Drop photos here...' ,
'photos.dropHereActive' : 'Drop photos here' ,
'photos.captionForAll' : 'Caption (for all)' ,
'photos.captionPlaceholder' : 'Optional caption...' ,
'photos.addCaption' : 'Add caption...' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'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' ,
2026-04-13 03:53:50 +08:00
'photos.linkDay' : 'Link Day' ,
'photos.noDay' : 'No Day' ,
'photos.dayLabel' : 'Day {number}' ,
'photos.photoSelected' : 'Photo selected' ,
'photos.photosSelected' : 'Photos selected' ,
'photos.fileTypeHint' : 'JPG, PNG, WebP · max. 10 MB · up to 30 photos' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
// 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' ,
2026-03-19 06:58:08 +08:00
// PDF
'pdf.travelPlan' : 'Travel Plan' ,
'pdf.planned' : 'Planned' ,
'pdf.costLabel' : 'Cost EUR' ,
'pdf.preview' : 'PDF Preview' ,
'pdf.saveAsPdf' : 'Save as PDF' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
// 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' ,
fix(i18n): comprehensive translation audit and fixes across all 14 languages
- Fix critical bug: Photos and Files pages had German text hardcoded in JSX,
now use t() keys visible correctly in all languages
- Add 16 new translation keys (photos/files UI, login validation, common errors,
rate limit message) across all 14 language files
- Add missing keys in packing, memories, and budget sections for br, de, it, es,
fr, nl, pl, cs, hu, ru, zh, zh-TW, ar
- Add 152+ missing keys for zh-TW (entire sections were absent)
- Change Vacay addon name to 'Férias' in pt-BR only
- Add client-side HTTP 429 interceptor that shows translated rate limit message
- Replace hardcoded English fallbacks in TripPlannerPage, DayPlanSidebar,
DisplaySettingsTab, MapSettingsTab, AccountTab, and TodoListPanel with t()
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 20:35:22 +08:00
'planner.icsExportFailed' : 'ICS export failed' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'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' ,
2026-03-25 23:47:10 +08:00
'planner.addPlace' : 'Add place/activity' ,
'planner.addPlaceShort' : '+ Add place/activity' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'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}' ,
2026-03-19 06:58:08 +08:00
// 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' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
// 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.' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'day.overview' : 'Daily Overview' ,
v2.5.7: Reservation overhaul, Day Detail Panel, i18n, paste support, auto dark mode
BREAKING: Reservations have been completely rebuilt. Existing place-level
reservations are no longer used. All reservations must be re-created via
the Bookings tab. Your trips, places, and other data are unaffected.
Reservation System (rebuilt from scratch):
- Reservations now link to specific day assignments instead of places
- Same place on different days can have independent reservations
- New assignment picker in booking modal (grouped by day, searchable)
- Removed day/place dropdowns from booking form
- Reservation badges in day plan sidebar with type-specific icons
- Reservation details in place inspector (only for selected assignment)
- Reservation summary in day detail panel
Day Detail Panel (new):
- Opens on day click in the sidebar
- Detailed weather: hourly forecast, precipitation, wind, sunrise/sunset
- Historical climate averages for dates beyond 16 days
- Accommodation management with check-in/check-out, confirmation number
- Hotel assignment across multiple days with day range picker
- Reservation overview for the day
Places:
- Places can now be assigned to the same day multiple times
- Start time + end time fields (replaces single time field)
- Map badges show multiple position numbers (e.g. "1 · 4")
- Route optimization fixed for duplicate places
- File attachments during place editing (not just creation)
- Cover image upload during trip creation (not just editing)
- Paste support (Ctrl+V) for images in trip, place, and file forms
Internationalization:
- 200+ hardcoded German strings translated to i18n (EN + DE)
- Server error messages in English
- Category seeds in English for new installations
- All planner, register, photo, packing components translated
UI/UX:
- Auto dark mode (follows system preference, configurable in settings)
- Navbar toggle switches light/dark (overrides auto)
- Sidebar minimize buttons z-index fixed
- Transport mode selector removed from day plan
- CustomSelect supports grouped headers (isHeader option)
- Optimistic updates for day notes (instant feedback)
- Booking cards redesigned with type-colored headers and structured details
Weather:
- Wind speed in mph when using Fahrenheit setting
- Weather description language matches app language
Admin:
- Weather info panel replaces OpenWeatherMap key input
- "Recommended" badge styling updated
2026-03-25 03:10:45 +08:00
'day.accommodation' : 'Accommodation' ,
'day.addAccommodation' : 'Add accommodation' ,
'day.hotelDayRange' : 'Apply to days' ,
'day.noPlacesForHotel' : 'Add places to your trip first' ,
'day.allDays' : 'All' ,
'day.checkIn' : 'Check-in' ,
'day.checkOut' : 'Check-out' ,
'day.confirmation' : 'Confirmation' ,
'day.editAccommodation' : 'Edit accommodation' ,
'day.reservations' : 'Reservations' ,
2026-03-25 07:14:53 +08:00
2026-03-30 02:12:47 +08:00
// Photos / Immich
'memories.title' : 'Photos' ,
2026-04-05 04:00:35 +08:00
'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.' ,
2026-03-30 02:12:47 +08:00
'memories.noDates' : 'Add dates to your trip to load photos.' ,
'memories.noPhotos' : 'No photos found' ,
2026-04-05 04:00:35 +08:00
'memories.noPhotosHint' : 'No photos found in {provider_name} for this trip\'s date range.' ,
2026-03-30 02:12:47 +08:00
'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' ,
2026-04-05 04:00:35 +08:00
//-------------------------
//todo section
'memories.providerUrl' : 'Server URL' ,
'memories.providerApiKey' : 'API Key' ,
'memories.providerUsername' : 'Username' ,
'memories.providerPassword' : 'Password' ,
2026-04-12 00:25:22 +08:00
'memories.providerOTP' : 'MFA code (if enabled)' ,
'memories.skipSSLVerification' : 'Skip SSL certificate verification' ,
'memories.providerUrlHintSynology' : 'Include the Photos app path in the URL, e.g. https://nas:5001/photo' ,
2026-03-30 02:12:47 +08:00
'memories.testConnection' : 'Test connection' ,
2026-04-01 21:30:59 +08:00
'memories.testFirst' : 'Test connection first' ,
2026-03-30 02:12:47 +08:00
'memories.connected' : 'Connected' ,
'memories.disconnected' : 'Not connected' ,
2026-04-05 04:00:35 +08:00
'memories.connectionSuccess' : 'Connected to {provider_name}' ,
'memories.connectionError' : 'Could not connect to {provider_name}' ,
'memories.saved' : '{provider_name} settings saved' ,
2026-04-12 00:25:22 +08:00
'memories.providerDisconnectedBanner' : 'Your {provider_name} connection is lost. Reconnect in Settings to view photos.' ,
2026-04-05 04:00:35 +08:00
'memories.saveError' : 'Could not save {provider_name} settings' ,
//------------------------
2026-03-30 02:12:47 +08:00
'memories.addPhotos' : 'Add photos' ,
2026-04-01 21:21:20 +08:00
'memories.linkAlbum' : 'Link Album' ,
2026-04-05 04:00:35 +08:00
'memories.selectAlbum' : 'Select {provider_name} Album' ,
'memories.selectAlbumMultiple' : 'Select Album' ,
2026-04-01 21:21:20 +08:00
'memories.noAlbums' : 'No albums found' ,
'memories.syncAlbum' : 'Sync album' ,
'memories.unlinkAlbum' : 'Unlink album' ,
'memories.photos' : 'photos' ,
2026-04-05 04:00:35 +08:00
'memories.selectPhotos' : 'Select photos from {provider_name}' ,
'memories.selectPhotosMultiple' : 'Select Photos' ,
2026-03-30 02:12:47 +08:00
'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' ,
2026-04-02 03:19:53 +08:00
'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' ,
2026-04-13 04:29:11 +08:00
'memories.saveRouteNotConfigured' : 'Save route is not configured for this provider' ,
'memories.testRouteNotConfigured' : 'Test route is not configured for this provider' ,
'memories.fillRequiredFields' : 'Please fill all required fields' ,
2026-03-30 02:12:47 +08:00
2026-03-25 07:14:53 +08:00
// Collab Addon
'collab.tabs.chat' : 'Chat' ,
'collab.tabs.notes' : 'Notes' ,
'collab.tabs.polls' : 'Polls' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'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' ,
2026-03-25 07:14:53 +08:00
'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' ,
2026-03-27 05:08:44 +08:00
'collab.chat.emptyDesc' : 'Share ideas, plans, and updates with your travel group' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'collab.chat.today' : 'Today' ,
'collab.chat.yesterday' : 'Yesterday' ,
'collab.chat.deletedMessage' : 'deleted a message' ,
2026-04-01 05:15:43 +08:00
'collab.chat.reply' : 'Reply' ,
2026-03-25 07:14:53 +08:00
'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...' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'collab.notes.category' : 'Category' ,
'collab.notes.noCategory' : 'No category' ,
'collab.notes.color' : 'Color' ,
'collab.notes.save' : 'Save' ,
'collab.notes.cancel' : 'Cancel' ,
'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.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' ,
2026-03-25 07:14:53 +08:00
'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' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'collab.polls.multiChoice' : 'Multiple choice' ,
2026-03-25 07:14:53 +08:00
'collab.polls.deadline' : 'Deadline' ,
v2.6.0 — Collab overhaul, route travel times, chat & notes redesign
## Collab — Complete Redesign
- iMessage-style live chat with blue bubbles, grouped messages, date separators
- Emoji reactions via right-click (desktop) or double-tap (mobile)
- Twemoji (Apple-style) emoji picker with categories
- Link previews with OG image/title/description
- Soft-delete messages with "deleted a message" placeholder
- Message reactions with real-time WebSocket sync
- Chat timestamps respect 12h/24h setting and timezone
## Collab Notes
- Redesigned note cards with colored header bar (booking-card style)
- 2-column grid layout (desktop), 1-column (mobile)
- Category settings modal for managing categories with colors
- File/image attachments on notes with mini-preview thumbnails
- Website links with OG image preview on note cards
- File preview portal (lightbox for images, inline viewer for PDF/TXT)
- Note files appear in Files tab with "From Collab Notes" badge
- Pin highlighting with tinted background
- Author avatar chip in header bar with custom tooltip
## Collab Polls
- Complete rewrite — clean Apple-style poll cards
- Animated progress bars with vote percentages
- Blue check circles for own votes, voter avatars
- Create poll modal with multi-choice toggle
- Active/closed poll sections
- Custom tooltips on voter chips
## What's Next Widget
- New widget showing upcoming trip activities
- Time display with "until" separator
- Participant chips per activity
- Day grouping (Today, Tomorrow, dates)
- Respects 12h/24h and locale settings
## Route Travel Times
- Auto-calculated walking + driving times via OSRM (free, no API key)
- Floating badge on each route segment between places
- Walking person icon + car icon with times
- Hides when zoomed out (< zoom 16)
- Toggle in Settings > Display to enable/disable
## Other Improvements
- Collab addon enabled by default for new installations
- Coming Soon removed from Collab in admin settings
- Tab state persisted across page reloads (sessionStorage)
- Day sidebar expanded/collapsed state persisted
- File preview with extension badges (PDF, TXT, etc.) in Files tab
- Collab Notes filter tab in Files
- Reservations section in Day Detail view
- Dark mode fix for invite button text color
- Chat scroll hidden (no visible scrollbar)
- Mobile: tab icons removed for space, touch-friendly UI
- Fixed 6 backend data structure bugs in Collab (polls, chat, notes)
- Soft-delete for chat messages (persists in history)
- Message reactions table (migration 28)
- Note attachments via trip_files with note_id (migration 30)
## Database Migrations
- Migration 27: budget_item_members table
- Migration 28: collab_message_reactions table
- Migration 29: soft-delete column on collab_messages
- Migration 30: note_id on trip_files, website on collab_notes
2026-03-26 05:59:39 +08:00
'collab.polls.option' : 'Option' ,
'collab.polls.options' : 'Options' ,
'collab.polls.delete' : 'Delete' ,
'collab.polls.closedSection' : 'Closed' ,
feat: add configurable permissions system with admin panel
Adds a full permissions management feature allowing admins to control
who can perform actions across the app (trip CRUD, files, places,
budget, packing, reservations, collab, members, share links).
- New server/src/services/permissions.ts: 16 configurable actions,
in-memory cache, checkPermission() helper, backwards-compatible
defaults matching upstream behaviour
- GET/PUT /admin/permissions endpoints; permissions loaded into
app-config response so clients have them on startup
- checkPermission() applied to all mutating route handlers across
10 server route files; getTripOwnerId() helper eliminates repeated
inline DB queries; trips.ts and files.ts now reuse canAccessTrip()
result to avoid redundant DB round-trips
- New client/src/store/permissionsStore.ts: Zustand store +
useCanDo() hook; TripOwnerContext type accepts both Trip and
DashboardTrip shapes without casting at call sites
- New client/src/components/Admin/PermissionsPanel.tsx: categorised
UI with per-action dropdowns, customised badge, save/reset
- AdminPage, DashboardPage, FileManager, PlacesSidebar,
TripMembersModal gated via useCanDo(); no prop drilling
- 46 perm.* translation keys added to all 12 language files
2026-04-01 02:30:12 +08:00
// 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' ,
2026-04-02 00:20:14 +08:00
// 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' ,
2026-04-07 04:26:22 +08:00
'undo.importKeyholeMarkup' : 'KMZ/KML import' ,
2026-04-02 00:20:14 +08:00
'undo.importGoogleList' : 'Google Maps import' ,
2026-04-07 20:04:27 +08:00
'undo.importNaverList' : 'Naver Maps import' ,
2026-04-02 00:20:14 +08:00
'undo.addPlace' : 'Place added' ,
'undo.done' : 'Undone: {action}' ,
feat: add in-app notification system with real-time delivery
Introduces a full in-app notification system with three types (simple,
boolean with server-side callbacks, navigate), three scopes (user, trip,
admin), fan-out persistence per recipient, and real-time push via
WebSocket. Includes a notification bell in the navbar, dropdown, dedicated
/notifications page, and a dev-only admin tab for testing all notification
variants.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:57:52 +08:00
// 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' ,
2026-04-12 00:25:22 +08:00
'notifications.synologySessionCleared.title' : 'Synology Photos disconnected' ,
'notifications.synologySessionCleared.text' : 'Your server or account changed — go to Settings to test your connection again.' ,
feat: add in-app notification system with real-time delivery
Introduces a full in-app notification system with three types (simple,
boolean with server-side callbacks, navigate), three scopes (user, trip,
admin), fan-out persistence per recipient, and real-time push via
WebSocket. Includes a notification bell in the navbar, dropdown, dedicated
/notifications page, and a dev-only admin tab for testing all notification
variants.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:57:52 +08:00
// Notification test keys (dev only)
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
'notifications.versionAvailable.title' : 'Update Available' ,
'notifications.versionAvailable.text' : 'TREK {version} is now available.' ,
'notifications.versionAvailable.button' : 'View Details' ,
feat: add in-app notification system with real-time delivery
Introduces a full in-app notification system with three types (simple,
boolean with server-side callbacks, navigate), three scopes (user, trip,
admin), fan-out persistence per recipient, and real-time push via
WebSocket. Includes a notification bell in the navbar, dropdown, dedicated
/notifications page, and a dev-only admin tab for testing all notification
variants.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:57:52 +08:00
'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}".' ,
feat(todo): add To-Do list feature with 3-column layout
- New todo_items DB table with priority, due date, description, user assignment
- Full CRUD API with WebSocket real-time sync
- 3-column UI: sidebar filters (All, My Tasks, Overdue, Done, by Priority),
task list with inline badges, and detail/create pane
- Apple-inspired design with custom dropdowns, date picker, priority system (P1-P3)
- Mobile responsive: icon-only sidebar, bottom-sheet modals for detail/create
- Lists tab with sub-tabs (Packing List + To-Do), persisted selection
- Addon renamed from "Packing List" to "Lists"
- i18n keys for all 13 languages
- UI polish: notification colors use system theme, mobile navbar cleanup,
settings page responsive buttons
2026-04-04 22:58:24 +08:00
// 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' ,
feat(notifications): add unified multi-channel notification system
Introduces a fully featured notification system with three delivery
channels (in-app, email, webhook), normalized per-user/per-event/
per-channel preferences, admin-scoped notifications, scheduled trip
reminders and version update alerts.
- New notificationService.send() as the single orchestration entry point
- In-app notifications with simple/boolean/navigate types and WebSocket push
- Per-user preference matrix with normalized notification_channel_preferences table
- Admin notification preferences stored globally in app_settings
- Migration 69 normalizes legacy notification_preferences table
- Scheduler hooks for daily trip reminders and version checks
- DevNotificationsPanel for testing in dev mode
- All new tests passing, covering dispatch, preferences, migration, boolean
responses, resilience, and full API integration (NSVC, NPREF, INOTIF,
MIGR, VNOTIF, NROUTE series)
- Previous tests passing
2026-04-05 07:20:33 +08:00
// 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.' ,
// 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' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey addon
'journey.title' : 'Journey' ,
'journey.subtitle' : 'Track your travels as they happen' ,
'journey.new' : 'New Journey' ,
'journey.create' : 'Create' ,
'journey.titlePlaceholder' : 'Where are you going?' ,
'journey.empty' : 'No journeys yet' ,
'journey.emptyHint' : 'Start documenting your next trip' ,
'journey.deleted' : 'Journey deleted' ,
'journey.createError' : 'Could not create journey' ,
'journey.deleteError' : 'Could not delete journey' ,
'journey.deleteConfirmTitle' : 'Delete' ,
'journey.deleteConfirmMessage' : 'Delete "{title}"? This cannot be undone.' ,
'journey.deleteConfirmGeneric' : 'Are you sure you want to delete this?' ,
'journey.notFound' : 'Journey not found' ,
'journey.photos' : 'Photos' ,
'journey.timelineEmpty' : 'No stops yet' ,
'journey.timelineEmptyHint' : 'Add a check-in or write a journal entry to get started' ,
'journey.status.draft' : 'Draft' ,
'journey.status.active' : 'Active' ,
'journey.status.completed' : 'Completed' ,
'journey.status.upcoming' : 'Upcoming' ,
'journey.checkin.add' : 'Check in' ,
'journey.checkin.namePlaceholder' : 'Location name' ,
'journey.checkin.notesPlaceholder' : 'Notes (optional)' ,
'journey.checkin.save' : 'Save' ,
'journey.checkin.error' : 'Could not save check-in' ,
'journey.entry.add' : 'Journal' ,
'journey.entry.edit' : 'Edit entry' ,
'journey.entry.titlePlaceholder' : 'Title (optional)' ,
'journey.entry.bodyPlaceholder' : 'What happened today?' ,
'journey.entry.save' : 'Save' ,
'journey.entry.error' : 'Could not save entry' ,
'journey.photo.add' : 'Photo' ,
'journey.photo.uploadError' : 'Upload failed' ,
'journey.share.share' : 'Share' ,
'journey.share.public' : 'Public' ,
'journey.share.linkCopied' : 'Public link copied' ,
'journey.share.disabled' : 'Public sharing disabled' ,
'journey.editor.titlePlaceholder' : 'Give this moment a name...' ,
'journey.editor.bodyPlaceholder' : 'Tell the story of this day...' ,
'journey.editor.placePlaceholder' : 'Location (optional)' ,
'journey.editor.tagsPlaceholder' : 'Tags: hidden gem, best meal, must revisit...' ,
'journey.visibility.private' : 'Private' ,
'journey.visibility.shared' : 'Shared' ,
'journey.visibility.public' : 'Public' ,
'journey.emptyState.title' : 'Your story starts here' ,
'journey.emptyState.subtitle' : 'Check in at a place or write your first journal entry' ,
// Journey Frontpage
'journey.frontpage.subtitle' : 'Turn your trips into stories you\'ll never forget' ,
'journey.frontpage.createJourney' : 'Create Journey' ,
'journey.frontpage.activeJourney' : 'Active Journey' ,
'journey.frontpage.allJourneys' : 'All Journeys' ,
'journey.frontpage.journeys' : 'journeys' ,
'journey.frontpage.createNew' : 'Create a new Journey' ,
'journey.frontpage.createNewSub' : 'Pick trips, write stories, share your adventures' ,
'journey.frontpage.live' : 'Live' ,
'journey.frontpage.synced' : 'Synced' ,
'journey.frontpage.continueWriting' : 'Continue writing' ,
'journey.frontpage.updated' : 'Updated {time}' ,
'journey.frontpage.suggestionLabel' : 'Trip just ended' ,
'journey.frontpage.suggestionText' : 'Turn <strong>{title}</strong> into a Journey' ,
'journey.frontpage.dismiss' : 'Dismiss' ,
'journey.frontpage.journeyName' : 'Journey Name' ,
'journey.frontpage.namePlaceholder' : 'e.g. Southeast Asia 2026' ,
'journey.frontpage.selectTrips' : 'Select Trips' ,
'journey.frontpage.tripsSelected' : 'trips selected' ,
'journey.frontpage.trips' : 'trips' ,
'journey.frontpage.placesImported' : 'places will be imported' ,
'journey.frontpage.places' : 'places' ,
// Journey Detail
'journey.detail.backToJourney' : 'Back to Journey' ,
'journey.detail.syncedWithTrips' : 'Synced with Trips' ,
'journey.detail.addEntry' : 'Add Entry' ,
'journey.detail.newEntry' : 'New Entry' ,
'journey.detail.editEntry' : 'Edit Entry' ,
'journey.detail.noEntries' : 'No entries yet' ,
'journey.detail.noEntriesHint' : 'Add a trip to get started with skeleton entries' ,
'journey.detail.noPhotos' : 'No photos yet' ,
'journey.detail.noPhotosHint' : 'Upload photos to entries or browse your Immich/Synology library' ,
'journey.detail.journeyStats' : 'Journey Stats' ,
'journey.detail.syncedTrips' : 'Synced Trips' ,
'journey.detail.noTripsLinked' : 'No trips linked yet' ,
'journey.detail.contributors' : 'Contributors' ,
'journey.detail.readMore' : 'Read more' ,
'journey.detail.prosCons' : 'Pros & Cons' ,
2026-04-14 02:08:31 +08:00
'journey.detail.photos' : 'photos' ,
'journey.detail.day' : 'Day {number}' ,
'journey.detail.places' : 'places' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey Detail — Stats
'journey.stats.days' : 'Days' ,
'journey.stats.cities' : 'Cities' ,
'journey.stats.entries' : 'Entries' ,
'journey.stats.photos' : 'Photos' ,
'journey.stats.places' : 'Places' ,
2026-04-15 01:58:13 +08:00
'journey.skeletons.show' : 'Show suggestions' ,
'journey.skeletons.hide' : 'Hide suggestions' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey Detail — Verdict
'journey.verdict.lovedIt' : 'Loved it' ,
'journey.verdict.couldBeBetter' : 'Could be better' ,
// Journey Detail — Synced badge
'journey.synced.places' : 'places' ,
'journey.synced.synced' : 'synced' ,
// Journey Entry Editor
'journey.editor.uploadPhotos' : 'Upload photos' ,
2026-04-15 02:12:15 +08:00
'journey.editor.uploading' : 'Uploading...' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
'journey.editor.fromGallery' : 'From Gallery' ,
'journey.editor.allPhotosAdded' : 'All photos already added' ,
'journey.editor.writeStory' : 'Write your story...' ,
'journey.editor.prosCons' : 'Pros & Cons' ,
'journey.editor.pros' : 'Pros' ,
'journey.editor.cons' : 'Cons' ,
'journey.editor.proPlaceholder' : 'Something great...' ,
'journey.editor.conPlaceholder' : 'Not so great...' ,
'journey.editor.addAnother' : 'Add another' ,
'journey.editor.date' : 'Date' ,
'journey.editor.location' : 'Location' ,
'journey.editor.searchLocation' : 'Search location...' ,
'journey.editor.mood' : 'Mood' ,
'journey.editor.weather' : 'Weather' ,
'journey.editor.photoFirst' : '1st' ,
'journey.editor.makeFirst' : 'Make 1st' ,
2026-04-14 02:08:31 +08:00
'journey.editor.searching' : 'Searching...' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey Entry — Moods
'journey.mood.amazing' : 'Amazing' ,
'journey.mood.good' : 'Good' ,
'journey.mood.neutral' : 'Neutral' ,
'journey.mood.rough' : 'Rough' ,
// Journey Entry — Weather
'journey.weather.sunny' : 'Sunny' ,
'journey.weather.partly' : 'Partly cloudy' ,
'journey.weather.cloudy' : 'Cloudy' ,
'journey.weather.rainy' : 'Rainy' ,
'journey.weather.stormy' : 'Stormy' ,
'journey.weather.cold' : 'Snowy' ,
// Journey — Trip Linking
'journey.trips.linkTrip' : 'Link Trip' ,
'journey.trips.searchTrip' : 'Search Trip' ,
'journey.trips.searchPlaceholder' : 'Trip name or destination...' ,
'journey.trips.noTripsAvailable' : 'No trips available' ,
'journey.trips.link' : 'Link' ,
'journey.trips.tripLinked' : 'Trip linked' ,
'journey.trips.linkFailed' : 'Failed to link trip' ,
'journey.trips.addTrip' : 'Add Trip' ,
'journey.trips.unlinkTrip' : 'Unlink Trip' ,
'journey.trips.unlinkMessage' : 'Unlink "{title}"? All synced entries and photos from this trip will be permanently deleted. This cannot be undone.' ,
'journey.trips.unlink' : 'Unlink' ,
'journey.trips.tripUnlinked' : 'Trip unlinked' ,
'journey.trips.unlinkFailed' : 'Failed to unlink trip' ,
'journey.trips.noTripsLinkedSettings' : 'No trips linked' ,
// Journey — Contributors
'journey.contributors.invite' : 'Invite Contributor' ,
'journey.contributors.searchUser' : 'Search User' ,
'journey.contributors.searchPlaceholder' : 'Username or email...' ,
'journey.contributors.noUsers' : 'No users found' ,
'journey.contributors.role' : 'Role' ,
'journey.contributors.added' : 'Contributor added' ,
'journey.contributors.addFailed' : 'Failed to add contributor' ,
// Journey — Share
'journey.share.publicShare' : 'Public Share' ,
'journey.share.createLink' : 'Create share link' ,
'journey.share.linkCreated' : 'Share link created' ,
'journey.share.createFailed' : 'Failed to create link' ,
'journey.share.copy' : 'Copy' ,
'journey.share.copied' : 'Copied!' ,
'journey.share.timeline' : 'Timeline' ,
'journey.share.gallery' : 'Gallery' ,
'journey.share.map' : 'Map' ,
'journey.share.removeLink' : 'Remove share link' ,
'journey.share.linkDeleted' : 'Share link deleted' ,
'journey.share.deleteFailed' : 'Failed to delete' ,
'journey.share.updateFailed' : 'Failed to update' ,
2026-04-14 02:08:31 +08:00
// Journey — Invite
'journey.invite.role' : 'Role' ,
'journey.invite.viewer' : 'Viewer' ,
'journey.invite.editor' : 'Editor' ,
'journey.invite.invite' : 'Invite' ,
'journey.invite.inviting' : 'Inviting...' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey — Settings Dialog
'journey.settings.title' : 'Journey Settings' ,
'journey.settings.coverImage' : 'Cover Image' ,
'journey.settings.changeCover' : 'Change cover' ,
'journey.settings.addCover' : 'Add cover image' ,
'journey.settings.name' : 'Name' ,
'journey.settings.subtitle' : 'Subtitle' ,
'journey.settings.subtitlePlaceholder' : 'e.g. Thailand, Vietnam & Cambodia' ,
'journey.settings.delete' : 'Delete' ,
'journey.settings.deleteJourney' : 'Delete Journey' ,
'journey.settings.deleteMessage' : 'Delete "{title}"? All entries and photos will be lost.' ,
'journey.settings.saved' : 'Settings saved' ,
'journey.settings.saveFailed' : 'Failed to save' ,
'journey.settings.coverUpdated' : 'Cover updated' ,
'journey.settings.coverFailed' : 'Upload failed' ,
2026-04-13 04:29:11 +08:00
'journey.settings.failedToDelete' : 'Failed to delete' ,
'journey.entries.deleteTitle' : 'Delete Entry' ,
'journey.photosUploaded' : '{count} photos uploaded' ,
'journey.photosAdded' : '{count} photos added' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Journey — Public Page
'journey.public.notFound' : 'Not Found' ,
'journey.public.notFoundMessage' : 'This journey doesn\'t exist or the link has expired.' ,
'journey.public.readOnly' : 'Read-only · Public Journey' ,
'journey.public.tagline' : 'Travel Resource & Exploration Kit' ,
'journey.public.sharedVia' : 'Shared via' ,
'journey.public.madeWith' : 'Made with' ,
// Journey — PDF Export
'journey.pdf.journeyBook' : 'Journey Book' ,
'journey.pdf.madeWith' : 'Made with TREK' ,
'journey.pdf.day' : 'Day' ,
'journey.pdf.theEnd' : 'The End' ,
'journey.pdf.saveAsPdf' : 'Save as PDF' ,
'journey.pdf.pages' : 'pages' ,
2026-04-14 02:08:31 +08:00
'journey.picker.tripPeriod' : 'Trip Period' ,
'journey.picker.dateRange' : 'Date Range' ,
'journey.picker.allPhotos' : 'All Photos' ,
'journey.picker.albums' : 'Albums' ,
'journey.picker.selected' : 'selected' ,
'journey.picker.addTo' : 'Add to' ,
'journey.picker.newGallery' : 'New Gallery' ,
2026-04-14 03:06:15 +08:00
'journey.picker.selectAll' : 'Select all' ,
'journey.picker.deselectAll' : 'Deselect all' ,
2026-04-14 02:08:31 +08:00
'journey.picker.noAlbums' : 'No albums found' ,
'journey.picker.selectDate' : 'Select date' ,
'journey.picker.search' : 'Search' ,
feat: Journey addon — travel journal with entries, photos, public sharing & PDF export
- 5-table schema (journeys, entries, photos, trips, contributors) with migrations 87-91
- Trip-to-Journey sync engine with skeleton entries and photo sync
- Full CRUD API for journeys, entries, photos with Immich/Synology integration
- Timeline, Gallery and Map views with entry editor (markdown, mood, weather, pros/cons)
- Journey frontpage with hero card, stats and trip suggestions
- Public share links with token-based access and photo proxy
- PDF photo book export (Polarsteps-inspired)
- Dashboard redesign: mobile greeting, live trip hero, quick actions, unified card design
- BottomNav profile sheet with settings/admin/logout
- DayPlan mobile inline place picker
- TripFormModal members management
- Vacay calendar trip date indicator dots
- Fix contributor photo access (403) for journey Immich/Synology photos
- Trip deletion cleanup for journey skeleton entries
- i18n: 231 new keys across all 14 languages (native translations, no fallbacks)
2026-04-12 01:01:34 +08:00
// Dashboard Mobile
'dashboard.greeting.morning' : 'Good morning,' ,
'dashboard.greeting.afternoon' : 'Good afternoon,' ,
'dashboard.greeting.evening' : 'Good evening,' ,
'dashboard.mobile.liveNow' : 'Live Now' ,
'dashboard.mobile.tripProgress' : 'Trip progress' ,
'dashboard.mobile.daysLeft' : '{count} days left' ,
'dashboard.mobile.places' : 'Places' ,
'dashboard.mobile.buddies' : 'Buddies' ,
'dashboard.mobile.newTrip' : 'New Trip' ,
'dashboard.mobile.currency' : 'Currency' ,
'dashboard.mobile.timezone' : 'Timezone' ,
'dashboard.mobile.upcomingTrips' : 'Upcoming Trips' ,
'dashboard.mobile.yourTrips' : 'Your Trips' ,
'dashboard.mobile.trips' : 'trips' ,
'dashboard.mobile.starts' : 'Starts' ,
'dashboard.mobile.duration' : 'Duration' ,
'dashboard.mobile.day' : 'day' ,
'dashboard.mobile.days' : 'days' ,
'dashboard.mobile.ongoing' : 'Ongoing' ,
'dashboard.mobile.startsToday' : 'Starts today' ,
'dashboard.mobile.tomorrow' : 'Tomorrow' ,
'dashboard.mobile.inDays' : 'In {count} days' ,
'dashboard.mobile.inMonths' : 'In {count} months' ,
'dashboard.mobile.completed' : 'Completed' ,
'dashboard.mobile.currencyConverter' : 'Currency Converter' ,
// BottomNav & Profile
'nav.profile' : 'Profile' ,
'nav.bottomSettings' : 'Settings' ,
'nav.bottomAdmin' : 'Admin Settings' ,
'nav.bottomLogout' : 'Logout' ,
'nav.bottomAdminBadge' : 'Admin' ,
// DayPlan Mobile
'dayplan.mobile.addPlace' : 'Add Place' ,
'dayplan.mobile.searchPlaces' : 'Search places...' ,
'dayplan.mobile.allAssigned' : 'All places assigned' ,
'dayplan.mobile.noMatch' : 'No match' ,
'dayplan.mobile.createNew' : 'Create new place' ,
'admin.addons.catalog.journey.name' : 'Journey' ,
'admin.addons.catalog.journey.description' : 'Trip tracking & travel journal with check-ins, photos, and daily stories' ,
2026-04-12 01:11:21 +08:00
2026-04-11 08:06:09 +08:00
// OAuth scope groups
'oauth.scope.group.trips' : 'Trips' ,
'oauth.scope.group.places' : 'Places' ,
'oauth.scope.group.atlas' : 'Atlas' ,
'oauth.scope.group.packing' : 'Packing' ,
'oauth.scope.group.todos' : 'To-dos' ,
'oauth.scope.group.budget' : 'Budget' ,
'oauth.scope.group.reservations' : 'Reservations' ,
'oauth.scope.group.collab' : 'Collaboration' ,
'oauth.scope.group.notifications' : 'Notifications' ,
'oauth.scope.group.vacay' : 'Vacation' ,
'oauth.scope.group.geo' : 'Geo' ,
'oauth.scope.group.weather' : 'Weather' ,
// OAuth scope labels & descriptions
'oauth.scope.trips:read.label' : 'View trips & itineraries' ,
'oauth.scope.trips:read.description' : 'Read trips, days, day notes, and members' ,
'oauth.scope.trips:write.label' : 'Edit trips & itineraries' ,
'oauth.scope.trips:write.description' : 'Create and update trips, days, notes, and manage members' ,
'oauth.scope.trips:delete.label' : 'Delete trips' ,
'oauth.scope.trips:delete.description' : 'Permanently delete entire trips — this action is irreversible' ,
'oauth.scope.trips:share.label' : 'Manage share links' ,
'oauth.scope.trips:share.description' : 'Create, update, and revoke public share links for trips' ,
'oauth.scope.places:read.label' : 'View places & map data' ,
'oauth.scope.places:read.description' : 'Read places, day assignments, tags, and categories' ,
'oauth.scope.places:write.label' : 'Manage places' ,
'oauth.scope.places:write.description' : 'Create, update, and delete places, assignments, and tags' ,
'oauth.scope.atlas:read.label' : 'View Atlas' ,
'oauth.scope.atlas:read.description' : 'Read visited countries, regions, and bucket list' ,
'oauth.scope.atlas:write.label' : 'Manage Atlas' ,
'oauth.scope.atlas:write.description' : 'Mark countries and regions visited, manage bucket list' ,
'oauth.scope.packing:read.label' : 'View packing lists' ,
'oauth.scope.packing:read.description' : 'Read packing items, bags, and category assignees' ,
'oauth.scope.packing:write.label' : 'Manage packing lists' ,
'oauth.scope.packing:write.description' : 'Add, update, delete, toggle, and reorder packing items and bags' ,
'oauth.scope.todos:read.label' : 'View to-do lists' ,
'oauth.scope.todos:read.description' : 'Read trip to-do items and category assignees' ,
'oauth.scope.todos:write.label' : 'Manage to-do lists' ,
'oauth.scope.todos:write.description' : 'Create, update, toggle, delete, and reorder to-do items' ,
'oauth.scope.budget:read.label' : 'View budget' ,
'oauth.scope.budget:read.description' : 'Read budget items and expense breakdown' ,
'oauth.scope.budget:write.label' : 'Manage budget' ,
'oauth.scope.budget:write.description' : 'Create, update, and delete budget items' ,
'oauth.scope.reservations:read.label' : 'View reservations' ,
'oauth.scope.reservations:read.description' : 'Read reservations and accommodation details' ,
'oauth.scope.reservations:write.label' : 'Manage reservations' ,
'oauth.scope.reservations:write.description' : 'Create, update, delete, and reorder reservations' ,
'oauth.scope.collab:read.label' : 'View collaboration' ,
'oauth.scope.collab:read.description' : 'Read collab notes, polls, and messages' ,
'oauth.scope.collab:write.label' : 'Manage collaboration' ,
'oauth.scope.collab:write.description' : 'Create, update, and delete collab notes, polls, and messages' ,
'oauth.scope.notifications:read.label' : 'View notifications' ,
'oauth.scope.notifications:read.description' : 'Read in-app notifications and unread counts' ,
'oauth.scope.notifications:write.label' : 'Manage notifications' ,
'oauth.scope.notifications:write.description' : 'Mark notifications as read and respond to them' ,
'oauth.scope.vacay:read.label' : 'View vacation plans' ,
'oauth.scope.vacay:read.description' : 'Read vacation planning data, entries, and stats' ,
'oauth.scope.vacay:write.label' : 'Manage vacation plans' ,
'oauth.scope.vacay:write.description' : 'Create and manage vacation entries, holidays, and team plans' ,
'oauth.scope.geo:read.label' : 'Maps & geocoding' ,
'oauth.scope.geo:read.description' : 'Search locations, resolve map URLs, and reverse geocode coordinates' ,
'oauth.scope.weather:read.label' : 'Weather forecasts' ,
'oauth.scope.weather:read.description' : 'Fetch weather forecasts for trip locations and dates' ,
2026-03-19 06:58:08 +08:00
}
export default en