Files
eventmap/js/ai/translatePromptBuilder.js
T
dapelzaandClaude Sonnet 5 2aaff8f680 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>
2026-07-28 15:16:31 +02:00

82 lines
3.0 KiB
JavaScript

// 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;
})();