diff --git a/client/src/i18n/translations/de.js b/client/src/i18n/translations/de.js index 154bc82..da07029 100644 --- a/client/src/i18n/translations/de.js +++ b/client/src/i18n/translations/de.js @@ -138,14 +138,14 @@ const de = { 'settings.passwordTooShort': 'Passwort muss mindestens 8 Zeichen lang sein', 'settings.passwordMismatch': 'Passwörter stimmen nicht überein', 'settings.passwordChanged': 'Passwort erfolgreich geändert', - 'settings.deleteAccount': 'Account löschen', + 'settings.deleteAccount': 'Löschen', 'settings.deleteAccountTitle': 'Account wirklich löschen?', 'settings.deleteAccountWarning': 'Dein Account und alle deine Reisen, Orte und Dateien werden unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.', 'settings.deleteAccountConfirm': 'Endgültig löschen', 'settings.deleteBlockedTitle': 'Löschung nicht möglich', 'settings.deleteBlockedMessage': 'Du bist der einzige Administrator. Ernenne zuerst einen anderen Benutzer zum Admin, bevor du deinen Account löschen kannst.', 'settings.roleUser': 'Benutzer', - 'settings.saveProfile': 'Profil speichern', + 'settings.saveProfile': 'Speichern', 'settings.toast.mapSaved': 'Karteneinstellungen gespeichert', 'settings.toast.keysSaved': 'API-Schlüssel gespeichert', 'settings.toast.displaySaved': 'Anzeigeeinstellungen gespeichert', diff --git a/client/src/pages/TripPlannerPage.jsx b/client/src/pages/TripPlannerPage.jsx index 4fdbd75..906297c 100644 --- a/client/src/pages/TripPlannerPage.jsx +++ b/client/src/pages/TripPlannerPage.jsx @@ -495,7 +495,7 @@ export default function TripPlannerPage() {
{mobileSidebarOpen === 'left' - ? { handleSelectDay(id); setMobileSidebarOpen(null) }} onPlaceClick={handlePlaceClick} onReorder={handleReorder} onUpdateDayTitle={handleUpdateDayTitle} onAssignToDay={handleAssignToDay} onRouteCalculated={(r) => { if (r) { setRoute(r.coordinates); setRouteInfo({ distance: r.distanceText, duration: r.durationText }) } }} reservations={reservations} onAddReservation={(dayId) => { setEditingReservation(null); tripStore.setSelectedDay(dayId); setShowReservationModal(true); setMobileSidebarOpen(null) }} /> + ? { handleSelectDay(id); setMobileSidebarOpen(null) }} onPlaceClick={handlePlaceClick} onReorder={handleReorder} onUpdateDayTitle={handleUpdateDayTitle} onAssignToDay={handleAssignToDay} onRouteCalculated={(r) => { if (r) { setRoute(r.coordinates); setRouteInfo({ distance: r.distanceText, duration: r.durationText }) } }} reservations={reservations} onAddReservation={(dayId) => { setEditingReservation(null); tripStore.setSelectedDay(dayId); setShowReservationModal(true); setMobileSidebarOpen(null) }} /> : { setEditingPlace(null); setShowPlaceForm(true); setMobileSidebarOpen(null) }} onAssignToDay={handleAssignToDay} days={days} isMobile /> }
diff --git a/server/src/routes/atlas.js b/server/src/routes/atlas.js index 45a5ab3..aa40f85 100644 --- a/server/src/routes/atlas.js +++ b/server/src/routes/atlas.js @@ -61,9 +61,12 @@ function getCountryFromAddress(address) { 'malaysia':'MY','colombia':'CO','kolumbien':'CO','peru':'PE','chile':'CL','iran':'IR', 'iraq':'IQ','irak':'IQ','pakistan':'PK','kenya':'KE','kenia':'KE','nigeria':'NG', 'saudi arabia':'SA','saudi-arabien':'SA','albania':'AL','albanien':'AL', + '日本':'JP','中国':'CN','한국':'KR','대한민국':'KR','ไทย':'TH', }; const normalized = last.toLowerCase(); if (NAME_TO_CODE[normalized]) return NAME_TO_CODE[normalized]; + // Try original case (for non-Latin scripts like 日本) + if (NAME_TO_CODE[last]) return NAME_TO_CODE[last]; // Try 2-letter code directly if (last.length === 2 && last === last.toUpperCase()) return last; return null; @@ -130,12 +133,16 @@ router.get('/stats', (req, res) => { }); // Unique cities (extract city from address — second to last comma segment) + // Strip postal codes and normalize to avoid duplicates like "Tokyo" vs "Tokyo 131-0045" const citySet = new Set(); for (const place of places) { if (place.address) { const parts = place.address.split(',').map(s => s.trim()).filter(Boolean); - if (parts.length >= 2) citySet.add(parts[parts.length - 2]); - else if (parts.length === 1) citySet.add(parts[0]); + let raw = parts.length >= 2 ? parts[parts.length - 2] : parts[0]; + if (raw) { + const city = raw.replace(/[\d\-−〒]+/g, '').trim().toLowerCase(); + if (city) citySet.add(city); + } } } const totalCities = citySet.size;