- 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>
109 lines
4.0 KiB
JavaScript
109 lines
4.0 KiB
JavaScript
// Übersetzungstabelle für die App-Oberfläche (UI-Sprachumschalter, Phase A
|
||
// laut ADR 0002). Reine Datendatei ohne Logik - die Auflösung/Fallback-Kette
|
||
// übernimmt js/i18n/i18n.js.
|
||
//
|
||
// WICHTIG: Dies ist von EventMap.ai.buildPrompt()/buildTranslationPrompt()
|
||
// (js/ai/promptBuilder.js, js/ai/translatePromptBuilder.js) komplett getrennt.
|
||
// Dort geht es um die Sprache, in der eine externe KI Ortsbeschreibungen
|
||
// verfasst/übersetzt (Datenebene) - hier um die Sprache der Bedienoberfläche
|
||
// selbst (UI-Ebene). Nicht vermischen.
|
||
|
||
window.EventMap = window.EventMap || {};
|
||
window.EventMap.i18n = window.EventMap.i18n || {};
|
||
|
||
(function () {
|
||
const STRINGS = {
|
||
de: {
|
||
documentTitle: 'EventMap – Familienfreundliche Ausflugsziele',
|
||
header: {
|
||
title: 'EventMap',
|
||
subtitle: 'Familienfreundliche Ausflugsziele auf der Karte',
|
||
menuToggleLabel: 'Menü öffnen',
|
||
},
|
||
settings: {
|
||
languageLabel: 'Anzeigesprache',
|
||
},
|
||
menu: {
|
||
ariaLabel: 'Aktionen',
|
||
locate: 'Meinen Standort verwenden',
|
||
locating: 'Standort wird ermittelt…',
|
||
manualLocation: 'Standort manuell eingeben',
|
||
pickLocation: '📍 Standort auf Karte wählen',
|
||
pickLocationActive: 'Klicke auf die Karte …',
|
||
addPlace: '+ Neues Ausflugsziel hinzufügen',
|
||
promptGenerator: '🤖 Neue Ausflugsziele mit KI erstellen',
|
||
translatePlace: '🌐 Ausflugsziel übersetzen (KI)',
|
||
import: '📥 KI-Ausflugsziele importieren',
|
||
backup: '💾 Daten sichern/wiederherstellen',
|
||
},
|
||
status: {
|
||
closeLabel: 'Meldung schließen',
|
||
geolocationError: 'Standort konnte nicht ermittelt werden. Bitte Standortfreigabe im Browser prüfen.',
|
||
seedLoadFailed: 'Beispieldaten konnten nicht geladen werden. Du kannst trotzdem eigene Ausflugsziele hinzufügen.',
|
||
bootstrapFailed: 'Die Anwendung konnte nicht geladen werden. Bitte Seite neu laden.',
|
||
},
|
||
map: {
|
||
ariaLabel: 'Karte',
|
||
loading: 'Karte wird geladen…',
|
||
pickingHint: 'Klicke auf die Karte, um den Standort auszuwählen.',
|
||
pickingCancel: 'Abbrechen',
|
||
},
|
||
filterPanel: {
|
||
ariaLabel: 'Filter und Suche',
|
||
},
|
||
list: {
|
||
ariaLabel: 'Ergebnisliste',
|
||
title: 'Ausflugsziele',
|
||
loading: 'Lade Ausflugsziele…',
|
||
},
|
||
},
|
||
en: {
|
||
documentTitle: 'EventMap – Family-friendly outing destinations',
|
||
header: {
|
||
title: 'EventMap',
|
||
subtitle: 'Family-friendly outing destinations on the map',
|
||
menuToggleLabel: 'Open menu',
|
||
},
|
||
settings: {
|
||
languageLabel: 'Display language',
|
||
},
|
||
menu: {
|
||
ariaLabel: 'Actions',
|
||
locate: 'Use my location',
|
||
locating: 'Locating…',
|
||
manualLocation: 'Enter location manually',
|
||
pickLocation: '📍 Pick location on map',
|
||
pickLocationActive: 'Click on the map …',
|
||
addPlace: '+ Add new destination',
|
||
promptGenerator: '🤖 Create new destinations with AI',
|
||
translatePlace: '🌐 Translate destination (AI)',
|
||
import: '📥 Import AI destinations',
|
||
backup: '💾 Backup/restore data',
|
||
},
|
||
status: {
|
||
closeLabel: 'Dismiss message',
|
||
geolocationError: 'Could not determine your location. Please check location permissions in your browser.',
|
||
seedLoadFailed: 'Sample data could not be loaded. You can still add your own destinations.',
|
||
bootstrapFailed: 'The application could not be loaded. Please reload the page.',
|
||
},
|
||
map: {
|
||
ariaLabel: 'Map',
|
||
loading: 'Loading map…',
|
||
pickingHint: 'Click on the map to choose the location.',
|
||
pickingCancel: 'Cancel',
|
||
},
|
||
filterPanel: {
|
||
ariaLabel: 'Filter and search',
|
||
},
|
||
list: {
|
||
ariaLabel: 'Results list',
|
||
title: 'Destinations',
|
||
loading: 'Loading destinations…',
|
||
},
|
||
},
|
||
};
|
||
|
||
EventMap.i18n.STRINGS = STRINGS;
|
||
EventMap.i18n.SUPPORTED_LANGUAGES = Object.keys(STRINGS);
|
||
})();
|