diff --git a/remotion/src/Root.tsx b/remotion/src/Root.tsx index f992c4b..573f829 100644 --- a/remotion/src/Root.tsx +++ b/remotion/src/Root.tsx @@ -13,6 +13,7 @@ import {F02} from './folge02/Folge02'; import {F03} from './folge03/Folge03'; import {F08} from './folge08/Folge08'; import {F09} from './folge09/Folge09'; +import {LernShorts} from './folge90/Folge90'; import {Banner, BannerRahmen, Profilbild} from './kanal/KanalBilder'; import {VorschauF01, VorschauF09} from './kanal/Vorschaubild'; import {ShortKompositionen} from './shorts/Short'; @@ -39,6 +40,7 @@ export const Root: React.FC = () => ( + diff --git a/remotion/src/folge90/Folge90.tsx b/remotion/src/folge90/Folge90.tsx new file mode 100644 index 0000000..c9e18f5 --- /dev/null +++ b/remotion/src/folge90/Folge90.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import {AbsoluteFill, Composition} from 'remotion'; +import {baueFolge, type SzenenEintrag} from '../baukasten/folge'; +import {mitKlang} from '../baukasten/geraeusche'; +import {Musik} from '../baukasten/musik'; +import {S_GIRAFFE, Giraffe} from './giraffe'; +import {H, W} from './hochformat'; +import {S_IGEL, Igel} from './igel'; + +// Lern-Shorts „Pinos Wissen“ (Hochformat, je ca. 30 s): kurze Sachfragen mit Pino, Noa und Lulu. +// Kürzel F90 nur für die Werkzeuge (Stimmen: npx tsx werkzeuge/stimmen.mts F90 --sprache de). +// Rendern: npx remotion render src/index.ts L01-igel out.mp4 --props='{"sprache":"de"}' + +const garten = {atmo: 'garten_tag', atmoLaut: 0.08}; +const musik = {datei: 'musik/folge01/lied.mp3', lautstaerke: 0.12, ducken: 0.5, rein: 0.5, raus: 1.2}; + +export const SZENEN: SzenenEintrag[] = [ + {name: 'Igel', datei: 'igel.tsx', plan: S_IGEL, K: mitKlang(Igel, S_IGEL, garten), musik}, + {name: 'Giraffe', datei: 'giraffe.tsx', plan: S_GIRAFFE, K: mitKlang(Giraffe, S_GIRAFFE, garten), musik}, +]; + +// für werkzeuge/szenenliste.mts (Stimmen); nicht als Querformat-Folge registriert +export const F90 = baueFolge('F90', SZENEN); + +const IDS = ['L01-igel', 'L02-giraffe']; + +export const LernShorts: React.FC = () => ( + <> + {SZENEN.map((sz, i) => { + const K: React.FC = () => ( + + + {sz.musik && } + + ); + return ; + })} + +); diff --git a/remotion/src/folge90/bilder.tsx b/remotion/src/folge90/bilder.tsx new file mode 100644 index 0000000..673abb4 --- /dev/null +++ b/remotion/src/folge90/bilder.tsx @@ -0,0 +1,74 @@ +import React from 'react'; + +// Kleine Bilder für die Lern-Shorts, im Stil von Apfel und Blume (baukasten/natur.tsx): +// flache Formen, warme Farben, ca. 200 px groß, Mitte bei 0/0. + +const Rahmen: React.FC<{children: React.ReactNode; s?: number}> = ({children, s = 1}) => ( + + {children} + +); + +export const Kaefer: React.FC = () => ( + + {/* Beinchen */} + {[-1, 1].flatMap((seite) => + [-28, 0, 28].map((y) => ), + )} + {/* Fühler */} + + + + + + +); + +export const Wurm: React.FC = () => ( + + + {[-62, -38, -14, 12, 36].map((x, i) => ( + + ))} + + +); + +export const Schnecke: React.FC = () => ( + + + + + + + + +); + +export const Milch: React.FC = () => ( + + + + + + +); + +export const ApfelBild: React.FC = () => ( + + + + + + + + +); + +// Sanftes „lieber nicht“: roter Ring mit Querstrich über dem Bild +export const Nein: React.FC = () => ( + + + + +); diff --git a/remotion/src/folge90/giraffe.tsx b/remotion/src/folge90/giraffe.tsx new file mode 100644 index 0000000..476b7c0 --- /dev/null +++ b/remotion/src/folge90/giraffe.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import {useCurrentFrame} from 'remotion'; +import {Figur} from '../baukasten/figur'; +import {Blende, atmen, huepfer} from '../baukasten/helfer'; +import {Blaetterwind} from '../baukasten/natur'; +import {Ort} from '../baukasten/orte'; +import {Buehne, FrageKarte, HochUntertitel, Hochformat, Wort} from './hochformat'; +import {TEXTE, plane} from './plan'; + +// Lern-Short „Wer ist am größten?“: Pino, Noa und Lulu nebeneinander – klein, mittel, groß. +// Jede Figur hüpft bzw. wiegt sich, wenn sie genannt wird, darüber erscheint das Wort. +// Zum Schluss sagen die Kinder die drei Wörter mit (Pause, die Wörter pulsieren nacheinander). + +export const S_GIRAFFE = plane('giraffe', [ + {id: 'bild0', dauer: 1.0}, + {id: 'e1', wer: 'ERZ', pause: 3}, + {id: 'e2', wer: 'ERZ', pause: 0.4}, + {id: 'e3', wer: 'ERZ', pause: 0.4}, + {id: 'e4', wer: 'ERZ'}, + {id: 'l1', wer: 'LULU'}, + {id: 'e5', wer: 'ERZ'}, + {id: 'e6', wer: 'ERZ', pause: 3.5}, + {id: 'bild1', dauer: 1.0}, +]); + +const Z = 1.5; +const MITTE = 960; +const Y = 815; // Fußlinie etwas weiter hinten auf der Wiese, damit die Füße über den Untertiteln bleiben +const PLATZ = {pino: 700, noa: 870, lulu: 1110}; +// Bühne → Bildschirm (Hochformat), für die Wörter über den Figuren +const sx = (x: number) => 540 + (x - MITTE) * Z; +const sy = (y: number) => 960 + (y - 540) * Z; + +export const Giraffe: React.FC = () => { + const f = useCurrentFrame(); + const {z, dauer} = S_GIRAFFE; + const mitsagen = z.e6.ende + 6; + const w = (n: 1 | 2 | 3) => TEXTE.zeilen[`giraffe/w${n}`]; + return ( + + + + + = z.e4.start && f < z.l1.ende ? Math.sin((f - z.e4.start) * 0.15) * 1.5 : 0} + stauchY={atmen(f, 3)} + /> + + + + + + + + + + + ); +}; diff --git a/remotion/src/folge90/hochformat.tsx b/remotion/src/folge90/hochformat.tsx new file mode 100644 index 0000000..98f7f84 --- /dev/null +++ b/remotion/src/folge90/hochformat.tsx @@ -0,0 +1,105 @@ +import React from 'react'; +import {AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion'; +import {SCHRIFT, Untertitel} from '../baukasten/untertitel'; +import type {Geplant} from '../baukasten/zeit'; +import {TEXTE} from './plan'; + +// Lern-Shorts im Hochformat (1080 × 1920). Die Szene spielt auf der gewohnten Bühne (1920 × 1080, +// Figuren und Orte wie in den Folgen); `Buehne` schneidet daraus den Hochformat-Ausschnitt. +// Frage oben, Untertitel über dem Bereich, den YouTube unten mit Titel und Knöpfen verdeckt. + +export const W = 1080; +export const H = 1920; +export const VOLL = H / 1080; // kleinste Vergrößerung, bei der die Bühne das Hochformat füllt + +export const Buehne: React.FC<{x: number; y?: number; z?: number; children: React.ReactNode}> = ({x, y = 540, z = VOLL, children}) => { + const halbB = W / 2 / z; + const halbH = H / 2 / z; + // Ist der Ausschnitt größer als die Bühne, bleibt sie mittig (oben/unten Papierrand) + const bx = halbB * 2 >= 1920 ? 960 : Math.min(1920 - halbB, Math.max(halbB, x)); + const by = halbH * 2 >= 1080 ? 540 : Math.min(1080 - halbH, Math.max(halbH, y)); + return ( +
+ {children} +
+ ); +}; + +const KARTE = { + background: 'rgba(255, 250, 240, 0.92)', + borderRadius: 40, + boxShadow: '0 8px 30px rgba(60, 40, 20, 0.22)', + fontFamily: SCHRIFT, + textAlign: 'center', +} as const; + +// Frage oben, darunter klein der Kanalname +export const FrageKarte: React.FC<{text: string}> = ({text}) => { + const f = useCurrentFrame(); + const {fps} = useVideoConfig(); + const s = spring({frame: f - 4, fps, config: {damping: 14}}); + return ( +
+
+
{text}
+
{TEXTE.zeilen.kanal}
+
+
+ ); +}; + +// Untertitel der Folgen, nach oben versetzt (unten liegen im Shorts-Player Titel und Knöpfe) +export const HochUntertitel: React.FC<{zeilen: Geplant[]}> = ({zeilen}) => ( +
+ +
+); + +// Runde Bildkarte, die bei `ab` aufploppt (Bildschirm-Koordinaten des Hochformats) +export const BildKarte: React.FC<{x: number; y: number; ab: number; r?: number; aus?: number; children: React.ReactNode}> = ({x, y, ab, r = 150, aus = 1e9, children}) => { + const f = useCurrentFrame(); + const {fps} = useVideoConfig(); + const s = spring({frame: f - ab, fps, config: {damping: 11}}); + const weg = interpolate(f, [aus, aus + 10], [1, 0], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}); + if (f < ab) return null; + return ( +
+ {children} +
+ ); +}; + +// Großes Wort zum Mitsagen (klein – mittel – groß) +// `puls`: Zeitpunkte, an denen das Wort noch einmal kurz groß wird (beim Mitsagen) +export const Wort: React.FC<{text: string; x: number; y: number; ab: number; puls?: number[]; groesse?: number; farbe?: string}> = ({text, x, y, ab, puls = [], groesse = 90, farbe = '#c8502c'}) => { + const f = useCurrentFrame(); + const {fps} = useVideoConfig(); + if (f < ab) return null; + const pulsen = puls.reduce((m, p) => m + 0.35 * Math.max(0, Math.sin(Math.PI * Math.min(1, Math.max(0, (f - p) / 18)))), 0); + const s = spring({frame: f - ab, fps, config: {damping: 10}}) + pulsen; + return ( +
+ {text} +
+ ); +}; + +// `hintergrund`: füllt oben und unten, wenn die Bühne das Hochformat nicht ganz ausfüllt +export const Hochformat: React.FC<{hintergrund?: string; children: React.ReactNode}> = ({hintergrund = '#f4ead8', children}) => ( + {children} +); diff --git a/remotion/src/folge90/igel.tsx b/remotion/src/folge90/igel.tsx new file mode 100644 index 0000000..0b8448f --- /dev/null +++ b/remotion/src/folge90/igel.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import {useCurrentFrame} from 'remotion'; +import {Figur} from '../baukasten/figur'; +import {Blende, atmen, huepfer} from '../baukasten/helfer'; +import {Blaetterwind} from '../baukasten/natur'; +import {Ort} from '../baukasten/orte'; +import {ApfelBild, Kaefer, Milch, Nein, Schnecke, Wurm} from './bilder'; +import {BildKarte, Buehne, FrageKarte, HochUntertitel, Hochformat} from './hochformat'; +import {TEXTE, plane} from './plan'; + +// Lern-Short „Was frisst ein Igel?“: Pino groß in der Mitte, darüber ploppen Käfer, Wurm und Schnecke +// auf; Milch und Obst sind nichts für Igel (sanft durchgestrichen). Passt zum Elternhinweis aus Folge 1. + +export const S_IGEL = plane('igel', [ + {id: 'bild0', dauer: 1.0}, + {id: 'e1', wer: 'ERZ', pause: 3}, + {id: 'p1', wer: 'PINO'}, + {id: 'e2', wer: 'ERZ', pause: 0.3}, + {id: 'e3', wer: 'ERZ', pause: 0.3}, + {id: 'e4', wer: 'ERZ'}, + {id: 'p2', wer: 'PINO'}, + {id: 'e5', wer: 'ERZ'}, + {id: 'p3', wer: 'PINO'}, + {id: 'bild1', dauer: 1.2}, +]); + +const PINO = {x: 960, y: 790, hoehe: 300}; + +export const Igel: React.FC = () => { + const f = useCurrentFrame(); + const {z, dauer} = S_IGEL; + const hops = huepfer(f, z.p1.start, 16, 10) + huepfer(f, z.p2.start, 16, 10) + huepfer(f, z.p3.start, 16, 10); + return ( + + + + + + + + {/* Das fressen Igel */} + + + + + + + + + + {/* Das lieber nicht */} + + + + + + + + + + + + ); +}; diff --git a/remotion/src/folge90/plan.ts b/remotion/src/folge90/plan.ts new file mode 100644 index 0000000..b77fb8e --- /dev/null +++ b/remotion/src/folge90/plan.ts @@ -0,0 +1,29 @@ +import {SPRACHE, type FolgenTexte} from '../baukasten/sprache'; +import {plane as basis, type PlanOptionen, type Zeile} from '../baukasten/zeit'; +import DE from './texte/de.json'; +import ES from './texte/es.json'; +import FR from './texte/fr.json'; +import STIMMEN_DE from './stimmen/de.json'; +import STIMMEN_ES from './stimmen/es.json'; +import STIMMEN_FR from './stimmen/fr.json'; + +// Sprechtexte stehen nur in texte/.json (Schlüssel „szene/zeile“), +// die Szenen enthalten nur Ablauf und Bewegung. Aufnahmen je Sprache in +// stimmen/.json bzw. public/stimmen/folge90// (erzeugt von +// werkzeuge/stimmen.mts). + +export const TEXTE: FolgenTexte = {de: DE, es: ES, fr: FR}[SPRACHE]; +const AUFNAHMEN = {de: STIMMEN_DE, es: STIMMEN_ES, fr: STIMMEN_FR}[SPRACHE]; + +export const TITEL = TEXTE.titel; + +// Zeitplan einer Szene dieser Folge, mit den Texten der gewählten Sprache +export const plane = (szene: string, zeilen: Zeile[], opt: PlanOptionen = {}) => + basis( + zeilen.map((z) => { + if (z.text !== undefined || !z.wer) return z; + const text = TEXTE.zeilen[`${szene}/${z.id}`]; + return {...z, text: text ?? `[fehlt: ${szene}/${z.id}]`}; + }), + {...opt, szene, aufnahmen: AUFNAHMEN, ordner: `stimmen/folge90/${SPRACHE}`}, + ); diff --git a/remotion/src/folge90/stimmen/de.json b/remotion/src/folge90/stimmen/de.json new file mode 100644 index 0000000..78e453d --- /dev/null +++ b/remotion/src/folge90/stimmen/de.json @@ -0,0 +1,77 @@ +{ + "igel/e1": { + "datei": "igel-e1.mp3", + "dauer": 3, + "text": "Was frisst ein Igel? Was meinst du?" + }, + "igel/p1": { + "datei": "igel-p1.mp3", + "dauer": 1.65, + "text": "Ich verrate es dir!" + }, + "igel/e2": { + "datei": "igel-e2.mp3", + "dauer": 2.04, + "text": "Igel fressen Käfer," + }, + "igel/e3": { + "datei": "igel-e3.mp3", + "dauer": 1.07, + "text": "Würmer" + }, + "igel/e4": { + "datei": "igel-e4.mp3", + "dauer": 1.49, + "text": "und Schnecken." + }, + "igel/p2": { + "datei": "igel-p2.mp3", + "dauer": 2.12, + "text": "Mmmh, lecker!" + }, + "igel/e5": { + "datei": "igel-e5.mp3", + "dauer": 4.91, + "text": "Milch und Obst sind nichts für Igel. Davon bekommen sie Bauchweh." + }, + "igel/p3": { + "datei": "igel-p3.mp3", + "dauer": 2.27, + "text": "Den Apfel schenke ich Noa!" + }, + "giraffe/e1": { + "datei": "giraffe-e1.mp3", + "dauer": 4.36, + "text": "Wer ist am größten? Pino, Noa oder Lulu?" + }, + "giraffe/e2": { + "datei": "giraffe-e2.mp3", + "dauer": 1.72, + "text": "Pino ist klein." + }, + "giraffe/e3": { + "datei": "giraffe-e3.mp3", + "dauer": 1.8, + "text": "Noa ist mittel." + }, + "giraffe/e4": { + "datei": "giraffe-e4.mp3", + "dauer": 2.69, + "text": "Und Lulu ist ganz groß!" + }, + "giraffe/l1": { + "datei": "giraffe-l1.mp3", + "dauer": 1.96, + "text": "Ich bin eine Giraffe!" + }, + "giraffe/e5": { + "datei": "giraffe-e5.mp3", + "dauer": 5.88, + "text": "Kein Tier auf der Welt ist so hoch wie eine Giraffe. So hoch wie ein Haus!" + }, + "giraffe/e6": { + "datei": "giraffe-e6.mp3", + "dauer": 3.47, + "text": "Sag mit: klein, mittel, groß!" + } +} diff --git a/remotion/src/folge90/stimmen/es.json b/remotion/src/folge90/stimmen/es.json new file mode 100644 index 0000000..5445a57 --- /dev/null +++ b/remotion/src/folge90/stimmen/es.json @@ -0,0 +1,77 @@ +{ + "igel/e1": { + "datei": "igel-e1.mp3", + "dauer": 2.85, + "text": "¿Qué come un erizo? ¿Tú qué crees?" + }, + "igel/p1": { + "datei": "igel-p1.mp3", + "dauer": 1.15, + "text": "¡Te lo cuento!" + }, + "igel/e2": { + "datei": "igel-e2.mp3", + "dauer": 2.77, + "text": "Los erizos comen escarabajos," + }, + "igel/e3": { + "datei": "igel-e3.mp3", + "dauer": 1.23, + "text": "gusanos" + }, + "igel/e4": { + "datei": "igel-e4.mp3", + "dauer": 1.41, + "text": "y caracoles." + }, + "igel/p2": { + "datei": "igel-p2.mp3", + "dauer": 2.12, + "text": "¡Mmm, qué rico!" + }, + "igel/e5": { + "datei": "igel-e5.mp3", + "dauer": 4.91, + "text": "La leche y la fruta no son para erizos. Les duele la tripa." + }, + "igel/p3": { + "datei": "igel-p3.mp3", + "dauer": 2.51, + "text": "¡La manzana se la regalo a Noa!" + }, + "giraffe/e1": { + "datei": "giraffe-e1.mp3", + "dauer": 3.97, + "text": "¿Quién es el más alto? ¿Pino, Noa o Lulu?" + }, + "giraffe/e2": { + "datei": "giraffe-e2.mp3", + "dauer": 1.72, + "text": "Pino es pequeño." + }, + "giraffe/e3": { + "datei": "giraffe-e3.mp3", + "dauer": 1.8, + "text": "Noa es mediana." + }, + "giraffe/e4": { + "datei": "giraffe-e4.mp3", + "dauer": 2.51, + "text": "¡Y Lulu es muy alta!" + }, + "giraffe/l1": { + "datei": "giraffe-l1.mp3", + "dauer": 1.96, + "text": "¡Soy una jirafa!" + }, + "giraffe/e5": { + "datei": "giraffe-e5.mp3", + "dauer": 5.88, + "text": "Ningún animal del mundo es tan alto como una jirafa. ¡Tan alto como una casa!" + }, + "giraffe/e6": { + "datei": "giraffe-e6.mp3", + "dauer": 4.36, + "text": "Dilo conmigo: pequeño, mediano, grande." + } +} diff --git a/remotion/src/folge90/stimmen/fr.json b/remotion/src/folge90/stimmen/fr.json new file mode 100644 index 0000000..1843b00 --- /dev/null +++ b/remotion/src/folge90/stimmen/fr.json @@ -0,0 +1,77 @@ +{ + "igel/e1": { + "datei": "igel-e1.mp3", + "dauer": 2.59, + "text": "Que mange un hérisson ? Qu'est-ce que tu crois ?" + }, + "igel/p1": { + "datei": "igel-p1.mp3", + "dauer": 1.57, + "text": "Je vais te le dire !" + }, + "igel/e2": { + "datei": "igel-e2.mp3", + "dauer": 2.59, + "text": "Les hérissons mangent des scarabées," + }, + "igel/e3": { + "datei": "igel-e3.mp3", + "dauer": 1.8, + "text": "des vers de terre" + }, + "igel/e4": { + "datei": "igel-e4.mp3", + "dauer": 1.49, + "text": "et des escargots." + }, + "igel/p2": { + "datei": "igel-p2.mp3", + "dauer": 1.96, + "text": "Miam, c'est bon !" + }, + "igel/e5": { + "datei": "igel-e5.mp3", + "dauer": 4.83, + "text": "Le lait et les fruits, ce n'est pas pour les hérissons. Ça leur donne mal au ventre." + }, + "igel/p3": { + "datei": "igel-p3.mp3", + "dauer": 2.27, + "text": "La pomme, je la donne à Noa !" + }, + "giraffe/e1": { + "datei": "giraffe-e1.mp3", + "dauer": 3.79, + "text": "Qui est le plus grand ? Pino, Noa ou Lulu ?" + }, + "giraffe/e2": { + "datei": "giraffe-e2.mp3", + "dauer": 1.65, + "text": "Pino est petit." + }, + "giraffe/e3": { + "datei": "giraffe-e3.mp3", + "dauer": 1.72, + "text": "Noa est moyenne." + }, + "giraffe/e4": { + "datei": "giraffe-e4.mp3", + "dauer": 2.43, + "text": "Et Lulu est très grande !" + }, + "giraffe/l1": { + "datei": "giraffe-l1.mp3", + "dauer": 1.8, + "text": "Je suis une girafe !" + }, + "giraffe/e5": { + "datei": "giraffe-e5.mp3", + "dauer": 5.25, + "text": "Aucun animal au monde n'est aussi haut qu'une girafe. Aussi haut qu'une maison !" + }, + "giraffe/e6": { + "datei": "giraffe-e6.mp3", + "dauer": 3.63, + "text": "Dis avec moi : petit, moyen, grand !" + } +} diff --git a/remotion/src/folge90/texte/de.json b/remotion/src/folge90/texte/de.json new file mode 100644 index 0000000..4c56bd3 --- /dev/null +++ b/remotion/src/folge90/texte/de.json @@ -0,0 +1,26 @@ +{ + "titel": "Pinos Wissen", + "zeilen": { + "igel/e1": "Was frisst ein Igel? Was meinst du?", + "igel/p1": "Ich verrate es dir!", + "igel/e2": "Igel fressen Käfer,", + "igel/e3": "Würmer", + "igel/e4": "und Schnecken.", + "igel/p2": "Mmmh, lecker!", + "igel/e5": "Milch und Obst sind nichts für Igel. Davon bekommen sie Bauchweh.", + "igel/p3": "Den Apfel schenke ich Noa!", + "giraffe/e1": "Wer ist am größten? Pino, Noa oder Lulu?", + "giraffe/e2": "Pino ist klein.", + "giraffe/e3": "Noa ist mittel.", + "giraffe/e4": "Und Lulu ist ganz groß!", + "giraffe/l1": "Ich bin eine Giraffe!", + "giraffe/e5": "Kein Tier auf der Welt ist so hoch wie eine Giraffe. So hoch wie ein Haus!", + "giraffe/e6": "Sag mit: klein, mittel, groß!", + "igel/frage": "Was frisst ein Igel?", + "giraffe/frage": "Wer ist am größten?", + "giraffe/w1": "klein", + "giraffe/w2": "mittel", + "giraffe/w3": "groß", + "kanal": "Pinos kleine Welt" + } +} \ No newline at end of file diff --git a/remotion/src/folge90/texte/es.json b/remotion/src/folge90/texte/es.json new file mode 100644 index 0000000..d0eaa57 --- /dev/null +++ b/remotion/src/folge90/texte/es.json @@ -0,0 +1,26 @@ +{ + "titel": "Pino sabe", + "zeilen": { + "igel/e1": "¿Qué come un erizo? ¿Tú qué crees?", + "igel/p1": "¡Te lo cuento!", + "igel/e2": "Los erizos comen escarabajos,", + "igel/e3": "gusanos", + "igel/e4": "y caracoles.", + "igel/p2": "¡Mmm, qué rico!", + "igel/e5": "La leche y la fruta no son para erizos. Les duele la tripa.", + "igel/p3": "¡La manzana se la regalo a Noa!", + "giraffe/e1": "¿Quién es el más alto? ¿Pino, Noa o Lulu?", + "giraffe/e2": "Pino es pequeño.", + "giraffe/e3": "Noa es mediana.", + "giraffe/e4": "¡Y Lulu es muy alta!", + "giraffe/l1": "¡Soy una jirafa!", + "giraffe/e5": "Ningún animal del mundo es tan alto como una jirafa. ¡Tan alto como una casa!", + "giraffe/e6": "Dilo conmigo: pequeño, mediano, grande.", + "igel/frage": "¿Qué come un erizo?", + "giraffe/frage": "¿Quién es el más alto?", + "giraffe/w1": "pequeño", + "giraffe/w2": "mediano", + "giraffe/w3": "grande", + "kanal": "El pequeño mundo de Pino" + } +} \ No newline at end of file diff --git a/remotion/src/folge90/texte/fr.json b/remotion/src/folge90/texte/fr.json new file mode 100644 index 0000000..52232bf --- /dev/null +++ b/remotion/src/folge90/texte/fr.json @@ -0,0 +1,26 @@ +{ + "titel": "Pino sait tout", + "zeilen": { + "igel/e1": "Que mange un hérisson ? Qu'est-ce que tu crois ?", + "igel/p1": "Je vais te le dire !", + "igel/e2": "Les hérissons mangent des scarabées,", + "igel/e3": "des vers de terre", + "igel/e4": "et des escargots.", + "igel/p2": "Miam, c'est bon !", + "igel/e5": "Le lait et les fruits, ce n'est pas pour les hérissons. Ça leur donne mal au ventre.", + "igel/p3": "La pomme, je la donne à Noa !", + "giraffe/e1": "Qui est le plus grand ? Pino, Noa ou Lulu ?", + "giraffe/e2": "Pino est petit.", + "giraffe/e3": "Noa est moyenne.", + "giraffe/e4": "Et Lulu est très grande !", + "giraffe/l1": "Je suis une girafe !", + "giraffe/e5": "Aucun animal au monde n'est aussi haut qu'une girafe. Aussi haut qu'une maison !", + "giraffe/e6": "Dis avec moi : petit, moyen, grand !", + "igel/frage": "Que mange un hérisson ?", + "giraffe/frage": "Qui est le plus grand ?", + "giraffe/w1": "petit", + "giraffe/w2": "moyen", + "giraffe/w3": "grand", + "kanal": "Le petit monde de Pino" + } +} \ No newline at end of file