diff options
| author | LalleSX | 2026-10-24 14:58:21 +0200 |
|---|---|---|
| committer | LalleSX | 2026-10-24 14:58:21 +0200 |
| commit | 73b09270c54acab810c10a80bed1d77c1a7bb2ab (patch) | |
| tree | e5bae1180c9a76345cc7779a24988875542d2dd9 /src/i18n/present.ts | |
| parent | Add tests for math rendering and interactive scenes; update navigation and viewport handling (diff) | |
| download | 3D-Electrophysics-main.tar.gz 3D-Electrophysics-main.zip | |
Diffstat (limited to 'src/i18n/present.ts')
| -rw-r--r-- | src/i18n/present.ts | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/i18n/present.ts b/src/i18n/present.ts new file mode 100644 index 0000000..d734efd --- /dev/null +++ b/src/i18n/present.ts @@ -0,0 +1,76 @@ +import type { Choice, Experiment, ExperimentId, Measurement, Parameters, Slider, TestId } from '../experiments'; +import { measurementLabel, word, getLanguage, type Language } from '../i18n'; +import type { TestLesson } from '../test4'; +import { danishLessons, danishTest } from './da'; +import type { LessonText, TestCopy } from './lesson-text'; +import { narrate } from './narrate'; + +interface Catalog { + lessons: Record<ExperimentId, LessonText>; + test: (id: TestId) => TestCopy; + narrate: (id: TestId, p: Parameters) => string; +} + +const catalogs: Record<Exclude<Language, 'en'>, Catalog> = { + da: { lessons: danishLessons, test: danishTest, narrate }, +}; + +function localizeMeasurements(measurements: Measurement[]): Measurement[] { + return measurements.map(measurement => ({ + label: measurementLabel(measurement.label), + value: word(measurement.value), + unit: word(measurement.unit), + })); +} + +function localizeControls(experiment: Experiment, lessons: Record<ExperimentId, LessonText>): (Slider | Choice)[] { + const copy = lessons[experiment.id].controls; + return experiment.controls.map(control => { + const text = copy[control.id]; + if (!text) return control; + if (control.kind === 'range') return { ...control, label: text.label }; + return { + ...control, + label: text.label, + options: control.options.map(option => ({ ...option, label: text.options?.[option.value] ?? option.label })), + }; + }); +} + +export function presentLesson<T extends Experiment>(experiment: T): T { + const measure = (p: Parameters) => localizeMeasurements(experiment.measure(p)); + const language = getLanguage(); + if (language === 'en') return { ...experiment, measure }; + const catalog = catalogs[language]; + const text = catalog.lessons[experiment.id]; + const localized = { + ...experiment, + title: text.title, + shortTitle: text.shortTitle, + description: text.description, + explanation: text.explanation, + challenge: text.challenge, + limits: text.limits, + sceneNote: text.sceneNote, + legend: experiment.legend.map(([colour], index) => [colour, text.legend[index] ?? experiment.legend[index][1]] as [string, string]), + source: { ...experiment.source, title: text.sourceTitle }, + controls: localizeControls(experiment, catalog.lessons), + equations: text.equations ?? experiment.equations, + measure, + }; + if (!('questions' in experiment)) return localized as T; + const lesson = experiment as unknown as TestLesson; + const test = catalog.test(lesson.id); + return { + ...localized, + questions: test.questions, + prediction: test.prediction, + predictionAnswer: test.predictionAnswer, + answers: lesson.answers.map((part, index) => ({ + ...part, + title: test.answers[index].title, + steps: part.steps.map((step, stepIndex) => ({ ...step, why: test.answers[index].steps[stepIndex] })), + })), + observe: (p: Parameters) => catalog.narrate(lesson.id, p), + } as T; +} |