Files
TREK/shared/src/i18n/en/dashboard.ts
T
Maurice e224befde7 Map/planner/dashboard polish and small community features (#1155)
* feat(planner): reorder days in a modal instead of a dropdown

The day-reorder control opened a small anchored dropdown; move it into the shared Modal (portal, dimmed backdrop, Esc/backdrop close) so it matches the Add activity dialog. Drag handles, up/down arrows and the day badges are unchanged.

* feat(map): explore reliability, Mapbox popups + compass, region-biased search

POI explore: clamp oversized viewports, query the Overpass mirrors in parallel (first valid response wins) with a per-request timeout and a short-lived cache, and surface a retry when every mirror fails - so it returns results at any zoom instead of timing out.

Mapbox renderer: add the place/POI hover popups (name, category, address, photo) the Leaflet map already had, plus a compass pill next to the explore pill that resets the view to north.

/api/maps/search: accept an optional locationBias to fix foreign-region bias and expose Google's place types in the result.

* feat(dashboard): list-view and mobile polish

Use the Archived status label for the filter and show Open dates for trips without dates; drop the unused settings button next to the view toggle. Desktop list view renders the date as a stat-style block separated from the counts.

Mobile list rows are stacked (slim cover banner + centred date), trip actions stay visible (touch has no hover), and the hero card's hover lift is disabled on touch; small spacing fix under the sidebar.

* feat: small community-requested options

Raise the plan-note subtitle limit to 250 characters and add more note icons. Expose is_archived and cover_image on the update_trip MCP tool. Add place coordinates to the PDF export. Allow creating a category from an existing to-do, and add a show/hide toggle on the admin password fields.

* test(shared): bump day-note subtitle limit assertion to 250

* test: align specs with the new search param order and archive label

Keep lang as the 3rd positional arg of the maps search controller so the existing unit test stays valid, and forward locationBias as the 4th. Add the now-used Popup to the MapViewGL mapbox mock, switch the dashboard archive-filter query to the Archived label, and expect the 4-arg search call.
2026-06-12 20:23:34 +02:00

168 lines
7.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TranslationStrings } from '../types';
const dashboard: TranslationStrings = {
'dashboard.title': 'My Trips',
'dashboard.subtitle.loading': 'Loading trips...',
'dashboard.subtitle.trips': '{count} trips ({archived} archived)',
'dashboard.subtitle.empty': 'Start your first trip',
'dashboard.subtitle.activeOne': '{count} active trip',
'dashboard.subtitle.activeMany': '{count} active trips',
'dashboard.subtitle.archivedSuffix': ' · {count} archived',
'dashboard.newTrip': 'New Trip',
'dashboard.newTripSub': 'Plan a new trip from scratch',
'dashboard.gridView': 'Grid view',
'dashboard.listView': 'List view',
'dashboard.currency': 'Currency',
'dashboard.timezone': 'Timezones',
'dashboard.localTime': 'Local',
'dashboard.timezoneCustomTitle': 'Custom Timezone',
'dashboard.timezoneCustomLabelPlaceholder': 'Label (optional)',
'dashboard.timezoneCustomTzPlaceholder': 'e.g. America/New_York',
'dashboard.timezoneCustomAdd': 'Add',
'dashboard.timezoneCustomErrorEmpty': 'Enter a timezone identifier',
'dashboard.timezoneCustomErrorInvalid':
'Invalid timezone. Use format like Europe/Berlin',
'dashboard.timezoneCustomErrorDuplicate': 'Already added',
'dashboard.emptyTitle': 'No trips yet',
'dashboard.emptyText': 'Create your first trip and start planning!',
'dashboard.emptyButton': 'Create First Trip',
'dashboard.nextTrip': 'Next Trip',
'dashboard.shared': 'Shared',
'dashboard.sharedBy': 'Shared by {name}',
'dashboard.days': 'Days',
'dashboard.places': 'Places',
'dashboard.members': 'Buddies',
'dashboard.archive': 'Archive',
'dashboard.copyTrip': 'Copy',
'dashboard.copySuffix': 'copy',
'dashboard.restore': 'Restore',
'dashboard.archived': 'Archived',
'dashboard.status.ongoing': 'Ongoing',
'dashboard.status.today': 'Today',
'dashboard.status.tomorrow': 'Tomorrow',
'dashboard.status.past': 'Past',
'dashboard.status.daysLeft': '{count} days left',
'dashboard.toast.loadError': 'Failed to load trips',
'dashboard.toast.created': 'Trip created successfully!',
'dashboard.toast.createError': 'Failed to create trip',
'dashboard.toast.updated': 'Trip updated!',
'dashboard.toast.updateError': 'Failed to update trip',
'dashboard.toast.deleted': 'Trip deleted',
'dashboard.toast.deleteError': 'Failed to delete trip',
'dashboard.toast.archived': 'Trip archived',
'dashboard.toast.archiveError': 'Failed to archive trip',
'dashboard.toast.restored': 'Trip restored',
'dashboard.toast.restoreError': 'Failed to restore trip',
'dashboard.toast.copied': 'Trip copied!',
'dashboard.toast.copyError': 'Failed to copy trip',
'dashboard.confirm.delete':
'Delete trip "{title}"? All places and plans will be permanently deleted.',
'dashboard.confirm.copy.title': 'Copy this trip?',
'dashboard.confirm.copy.willCopy': 'Will be copied',
'dashboard.confirm.copy.will1': 'Days, places & day assignments',
'dashboard.confirm.copy.will2': 'Accommodations & reservations',
'dashboard.confirm.copy.will3': 'Budget items & category order',
'dashboard.confirm.copy.will4': 'Packing lists (unchecked)',
'dashboard.confirm.copy.will5': 'TODOs (unassigned & unchecked)',
'dashboard.confirm.copy.will6': 'Day notes',
'dashboard.confirm.copy.wontCopy': "Won't be copied",
'dashboard.confirm.copy.wont1': 'Collaborators & member assignments',
'dashboard.confirm.copy.wont2': 'Collab notes, polls & messages',
'dashboard.confirm.copy.wont3': 'Files & photos',
'dashboard.confirm.copy.wont4': 'Share tokens',
'dashboard.confirm.copy.confirm': 'Copy trip',
'dashboard.editTrip': 'Edit Trip',
'dashboard.createTrip': 'Create New Trip',
'dashboard.tripTitle': 'Title',
'dashboard.tripTitlePlaceholder': 'e.g. Summer in Japan',
'dashboard.tripDescription': 'Description',
'dashboard.tripDescriptionPlaceholder': 'What is this trip about?',
'dashboard.startDate': 'Start Date',
'dashboard.endDate': 'End Date',
'dashboard.dayCount': 'Number of Days',
'dashboard.dayCountHint':
'How many days to plan for when no travel dates are set.',
'dashboard.noDateHint':
'No date set — 7 default days will be created. You can change this anytime.',
'dashboard.coverImage': 'Cover Image',
'dashboard.addCoverImage': 'Add cover image (or drag & drop)',
'dashboard.addMembers': 'Travel buddies',
'dashboard.addMember': 'Add member',
'dashboard.coverSaved': 'Cover image saved',
'dashboard.coverUploadError': 'Failed to upload',
'dashboard.coverRemoveError': 'Failed to remove',
'dashboard.titleRequired': 'Title is required',
'dashboard.endDateError': 'End date must be after start date',
'dashboard.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',
'dashboard.filter.planned': 'Planned',
'dashboard.hero.badgeLive': 'LIVE NOW',
'dashboard.hero.badgeToday': 'STARTS TODAY',
'dashboard.hero.badgeTomorrow': 'TOMORROW',
'dashboard.hero.badgeNext': 'UP NEXT',
'dashboard.hero.badgeRecent': 'RECENT',
'dashboard.hero.tripDates': 'Trip dates',
'dashboard.hero.noDates': 'Open dates',
'dashboard.hero.travelerOne': '{count} traveler',
'dashboard.hero.travelerMany': '{count} travelers',
'dashboard.hero.destinationOne': '{count} destination',
'dashboard.hero.destinationMany': '{count} destinations',
'dashboard.hero.dayUnitOne': 'day',
'dashboard.hero.dayUnitMany': 'days',
'dashboard.hero.dayLeft': 'Day left',
'dashboard.hero.daysLeft': 'Days left',
'dashboard.hero.lastDay': 'Last day',
'dashboard.hero.untilStart': 'Until start',
'dashboard.hero.startsIn': 'Trip starts in',
'dashboard.atlas.countriesVisited': 'Atlas · Countries visited',
'dashboard.atlas.ofTotal': 'of {total}',
'dashboard.atlas.tripsTotal': 'Trips total',
'dashboard.atlas.placesMapped': '{count} places mapped',
'dashboard.atlas.daysTraveled': 'Days traveled',
'dashboard.atlas.daysUnit': 'days',
'dashboard.atlas.acrossAllTrips': 'across all trips',
'dashboard.atlas.distanceFlown': 'Distance flown',
'dashboard.atlas.kmUnit': 'km',
'dashboard.atlas.aroundEquator': '≈ {count}× around the equator',
'dashboard.card.idea': 'Idea',
'dashboard.card.buddyOne': 'Buddy',
'dashboard.fx.from': 'From',
'dashboard.fx.to': 'To',
'dashboard.fx.unavailable': 'Rate unavailable',
'dashboard.tz.searchPlaceholder': 'Search timezone…',
'dashboard.tz.empty': 'No other timezones yet — add one with +',
'dashboard.upcoming.title': 'Upcoming reservations',
'dashboard.upcoming.empty': 'Nothing booked yet.',
'dashboard.aria.toggleView': 'Toggle view',
'dashboard.aria.filter': 'Filter',
'dashboard.aria.duplicate': 'Duplicate',
'dashboard.aria.refreshRates': 'Refresh rates',
'dashboard.aria.swapCurrencies': 'Swap currencies',
'dashboard.aria.addTimezone': 'Add timezone',
'dashboard.aria.removeTimezone': 'Remove {city}',
};
export default dashboard;