Seed-Daten per Fetch von externem Server laden, UI-Sprachumschalter (DE/EN) und KI-Übersetzungs-Prompt-Generator ergänzen
- Beispieldaten werden nicht mehr eingebettet (data/seed.js entfernt), sondern beim ersten Start per fetch(EventMap.config.SEED_DATA_URL) von einem externen, selbst gehosteten Server geladen (siehe ADR 0001, Revision 2026-07-28). - Neuer UI-Sprachumschalter (Deutsch/Englisch) für die Bedienoberfläche: js/i18n/strings.js + js/i18n/i18n.js, Sprachwahl im Menü, Persistenz über settings.language, Retranslation ohne Reload. - Neuer Menüpunkt "Ausflugsziel übersetzen (KI)": erzeugt einen Prompt, der eine externe KI bittet, Name/Beschreibungen eines bestehenden Ortes ins Englische, Spanische oder Französische zu übersetzen (js/ai/translatePromptBuilder.js, js/ui/translatePromptGenerator.js). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+36
-14
@@ -98,28 +98,34 @@
|
||||
});
|
||||
}
|
||||
|
||||
function setupLanguageSwitcher() {
|
||||
const select = document.getElementById('language-select');
|
||||
if (!select) return;
|
||||
|
||||
select.value = EventMap.i18n.getLanguage();
|
||||
select.addEventListener('change', () => {
|
||||
EventMap.i18n.setLanguage(select.value);
|
||||
});
|
||||
}
|
||||
|
||||
function setupGeolocationButton() {
|
||||
const button = document.getElementById('locate-btn');
|
||||
if (!button) return;
|
||||
|
||||
const defaultLabel = button.textContent;
|
||||
|
||||
button.addEventListener('click', () => {
|
||||
button.disabled = true;
|
||||
button.textContent = 'Standort wird ermittelt…';
|
||||
button.textContent = EventMap.i18n.t('menu.locating');
|
||||
|
||||
requestUserLocation({
|
||||
onSuccess: ({ lat, lng }) => {
|
||||
centerOnCoords(lat, lng, 13);
|
||||
button.disabled = false;
|
||||
button.textContent = defaultLabel;
|
||||
button.textContent = EventMap.i18n.t('menu.locate');
|
||||
},
|
||||
onError: () => {
|
||||
button.disabled = false;
|
||||
button.textContent = defaultLabel;
|
||||
showFatalError(
|
||||
'Standort konnte nicht ermittelt werden. Bitte Standortfreigabe im Browser prüfen.'
|
||||
);
|
||||
button.textContent = EventMap.i18n.t('menu.locate');
|
||||
showFatalError(EventMap.i18n.t('status.geolocationError'));
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -140,16 +146,14 @@
|
||||
const cancelBtn = document.getElementById('map-picking-cancel-btn');
|
||||
if (!button || !hint || !cancelBtn) return;
|
||||
|
||||
const defaultLabel = button.textContent;
|
||||
|
||||
function endPicking() {
|
||||
button.textContent = defaultLabel;
|
||||
button.textContent = EventMap.i18n.t('menu.pickLocation');
|
||||
button.classList.remove('btn--active');
|
||||
hint.hidden = true;
|
||||
}
|
||||
|
||||
function beginPicking() {
|
||||
button.textContent = 'Klicke auf die Karte …';
|
||||
button.textContent = EventMap.i18n.t('menu.pickLocationActive');
|
||||
button.classList.add('btn--active');
|
||||
hint.hidden = false;
|
||||
|
||||
@@ -196,6 +200,15 @@
|
||||
});
|
||||
}
|
||||
|
||||
function setupTranslatePromptGeneratorButton() {
|
||||
const button = document.getElementById('open-translate-prompt-generator-btn');
|
||||
if (!button) return;
|
||||
|
||||
button.addEventListener('click', () => {
|
||||
EventMap.ui.openTranslatePromptGenerator();
|
||||
});
|
||||
}
|
||||
|
||||
function setupImportButton() {
|
||||
const button = document.getElementById('open-import-btn');
|
||||
if (!button) return;
|
||||
@@ -215,7 +228,10 @@
|
||||
}
|
||||
|
||||
async function bootstrap() {
|
||||
await initStore();
|
||||
EventMap.i18n.init();
|
||||
setupLanguageSwitcher();
|
||||
|
||||
const { seedLoadFailed } = await initStore();
|
||||
initMap('map');
|
||||
initFilterPanel('filter-panel');
|
||||
initList('place-list');
|
||||
@@ -223,14 +239,20 @@
|
||||
initForm('place-form-modal');
|
||||
initManualLocationForm('manual-location-modal');
|
||||
initPromptGenerator('prompt-generator-modal');
|
||||
EventMap.ui.initTranslatePromptGenerator('translate-prompt-generator-modal');
|
||||
initImport('import-modal');
|
||||
setupGeolocationButton();
|
||||
setupManualLocationButton();
|
||||
setupPickLocationButton();
|
||||
setupAddPlaceButton();
|
||||
setupPromptGeneratorButton();
|
||||
setupTranslatePromptGeneratorButton();
|
||||
setupImportButton();
|
||||
setupBackupButton();
|
||||
|
||||
if (seedLoadFailed) {
|
||||
showFatalError(EventMap.i18n.t('status.seedLoadFailed'));
|
||||
}
|
||||
}
|
||||
|
||||
setupStatusClose();
|
||||
@@ -238,6 +260,6 @@
|
||||
|
||||
bootstrap().catch((err) => {
|
||||
console.error('EventMap: Initialisierung fehlgeschlagen.', err);
|
||||
showFatalError('Die Anwendung konnte nicht geladen werden. Bitte Seite neu laden.');
|
||||
showFatalError(EventMap.i18n.t('status.bootstrapFailed'));
|
||||
});
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user