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:
@@ -0,0 +1,81 @@
|
||||
// Reine Funktion zur Erzeugung eines Übersetzungs-Prompts für ein bestehendes
|
||||
// Ausflugsziel. Ergänzung zu js/ai/promptBuilder.js (das neue Ausflugsziele
|
||||
// recherchiert) - hier wird stattdessen ein einzelnes, bereits vorhandenes
|
||||
// Place-Objekt an eine externe KI übergeben, mit der Bitte, name/
|
||||
// shortDescription/description in eine Zielsprache zu übersetzen (Englisch/
|
||||
// Spanisch/Französisch) und als JSON zurückzuliefern, das direkt in das
|
||||
// "translations"-Feld des Datenmodells passt (siehe js/models/schema.js,
|
||||
// js/models/place.js).
|
||||
//
|
||||
// Getrennt von EventMap.i18n (UI-Sprachumschalter, js/i18n/*.js): dort geht
|
||||
// es um die Sprache der App-Oberfläche, hier um die Sprache von
|
||||
// Ortsinhalten, die von einer externen KI übersetzt werden - beide Konzepte
|
||||
// bewusst nicht vermischt.
|
||||
|
||||
(function () {
|
||||
const TARGET_LANGUAGE_LABELS = {
|
||||
en: 'Englisch (English)',
|
||||
es: 'Spanisch (Español)',
|
||||
fr: 'Französisch (Français)',
|
||||
};
|
||||
|
||||
function buildTranslationJsonTemplate(place, targetLanguage) {
|
||||
return `{
|
||||
"id": "${place.id}",
|
||||
"translations": {
|
||||
"${targetLanguage}": {
|
||||
"name": "...",
|
||||
"shortDescription": "...",
|
||||
"description": "..."
|
||||
}
|
||||
}
|
||||
}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {object} place Bestehendes Place-Objekt (id/name/shortDescription/description werden gelesen)
|
||||
* @param {'en'|'es'|'fr'} targetLanguage
|
||||
* @returns {string}
|
||||
*/
|
||||
function buildTranslationPrompt(place, targetLanguage) {
|
||||
const label = TARGET_LANGUAGE_LABELS[targetLanguage] || targetLanguage;
|
||||
|
||||
const sourceText = JSON.stringify(
|
||||
{
|
||||
name: place.name,
|
||||
shortDescription: place.shortDescription,
|
||||
description: place.description,
|
||||
},
|
||||
null,
|
||||
2
|
||||
);
|
||||
|
||||
const sections = [
|
||||
'Du bist ein sorgfältiger Übersetzer für Beschreibungen familienfreundlicher Ausflugsziele.',
|
||||
`Übersetze die folgenden drei Textfelder eines Ausflugsziels ins ${label}. Übersetze inhaltlich ` +
|
||||
'korrekt und natürlich klingend, ohne neue Informationen zu erfinden oder bestehende Informationen ' +
|
||||
'zu verändern. Eigennamen (z.B. Orts- und Straßennamen) bleiben unverändert, sofern im ' +
|
||||
'Zielsprachenraum kein gebräuchlicher, etablierter Name existiert.',
|
||||
'',
|
||||
'1. Ausgangstext (Deutsch)',
|
||||
'```json',
|
||||
sourceText,
|
||||
'```',
|
||||
'',
|
||||
'2. Ausgabeformat',
|
||||
'Antworte ausschließlich mit einem einzigen, gültigen JSON-Objekt - ohne einleitenden oder ' +
|
||||
'abschließenden Fließtext, ohne Markdown-Codeblock-Auszeichnung außerhalb des JSON und ohne ' +
|
||||
'Kommentare innerhalb des JSON. Das Feld "id" muss exakt wie unten vorgegeben übernommen werden.',
|
||||
'',
|
||||
'Zielformat (bitte exakt einhalten, "..." durch die übersetzten Texte ersetzen)',
|
||||
'```json',
|
||||
buildTranslationJsonTemplate(place, targetLanguage),
|
||||
'```',
|
||||
];
|
||||
|
||||
return sections.join('\n');
|
||||
}
|
||||
|
||||
EventMap.ai.buildTranslationPrompt = buildTranslationPrompt;
|
||||
EventMap.ai.TARGET_LANGUAGE_LABELS = TARGET_LANGUAGE_LABELS;
|
||||
})();
|
||||
Reference in New Issue
Block a user