Skip to content

Commit 968c0e8

Browse files
nextlevelshitMichael Czechowski
authored andcommitted
feat(i18n): 5 high-value DE module translations (grid + JS + semantic) (#192)
Co-authored-by: Michael Czechowski <mail@dailysh.it> Co-committed-by: Michael Czechowski <mail@dailysh.it>
1 parent 864bdf1 commit 968c0e8

6 files changed

Lines changed: 671 additions & 5 deletions

File tree

lessons/de/33-html-semantic.json

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
{
2+
"$schema": "../schemas/code-crispies-module-schema.json",
3+
"id": "html-semantic",
4+
"title": "Semantisches HTML",
5+
"mode": "html",
6+
"description": "Verwende aussagekräftige HTML-Elemente zur korrekten Strukturierung von Inhalten.",
7+
"difficulty": "beginner",
8+
"lessons": [
9+
{
10+
"id": "semantic-1",
11+
"title": "Das <article>-Element",
12+
"description": "The <kbd>&lt;article&gt;</kbd> element represents self-contained content that could be distributed independently, like a blog post, news article, or comment.<br><br><pre>&lt;article&gt;\n &lt;h2&gt;Article Title&lt;/h2&gt;\n &lt;p&gt;Article content...&lt;/p&gt;\n&lt;/article&gt;</pre>",
13+
"task": "Umschließe den Blogpost-Inhalt mit einem <kbd>&lt;article&gt;</kbd>-Element.",
14+
"previewHTML": "",
15+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } article { padding: 1rem; background: #f9f9f9; border-left: 4px solid steelblue; border-radius: 4px; } h2 { margin: 0 0 8px; color: steelblue; } p { margin: 0; color: #555; line-height: 1.5; }",
16+
"sandboxCSS": "",
17+
"codePrefix": "",
18+
"initialCode": "<h2>My First Post</h2>\n<p>This is a blog post about learning HTML.</p>",
19+
"codeSuffix": "",
20+
"solution": "<article>\n<h2>My First Post</h2>\n<p>This is a blog post about learning HTML.</p>\n</article>",
21+
"previewContainer": "preview-area",
22+
"validations": [
23+
{
24+
"type": "contains",
25+
"value": "<article>",
26+
"message": "Füge ein öffnendes <kbd>&lt;article&gt;</kbd>-Tag hinzu"
27+
},
28+
{
29+
"type": "contains",
30+
"value": "</article>",
31+
"message": "Füge ein schließendes <kbd>&lt;/article&gt;</kbd>-Tag hinzu"
32+
}
33+
]
34+
},
35+
{
36+
"id": "semantic-2",
37+
"title": "Das <section>-Element",
38+
"description": "The <kbd>&lt;section&gt;</kbd> element represents a thematic grouping of content, typically with a heading. Use it to divide a page into logical sections.<br><br><pre>&lt;section&gt;\n &lt;h2&gt;Features&lt;/h2&gt;\n &lt;p&gt;Our product features...&lt;/p&gt;\n&lt;/section&gt;</pre>",
39+
"task": "Umschließe den Features-Inhalt mit einem <kbd>&lt;section&gt;</kbd>-Element.",
40+
"previewHTML": "",
41+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } section { padding: 1rem; background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); border-radius: 8px; } h2 { margin: 0 0 12px; } ul { margin: 0; padding-left: 1.5rem; } li { margin: 4px 0; color: #444; }",
42+
"sandboxCSS": "",
43+
"codePrefix": "",
44+
"initialCode": "<h2>Features</h2>\n<ul>\n <li>Fast performance</li>\n <li>Easy to use</li>\n</ul>",
45+
"codeSuffix": "",
46+
"solution": "<section>\n<h2>Features</h2>\n<ul>\n <li>Fast performance</li>\n <li>Easy to use</li>\n</ul>\n</section>",
47+
"previewContainer": "preview-area",
48+
"validations": [
49+
{
50+
"type": "contains",
51+
"value": "<section>",
52+
"message": "Füge ein öffnendes <kbd>&lt;section&gt;</kbd>-Tag hinzu"
53+
},
54+
{
55+
"type": "contains",
56+
"value": "</section>",
57+
"message": "Füge ein schließendes <kbd>&lt;/section&gt;</kbd>-Tag hinzu"
58+
}
59+
]
60+
},
61+
{
62+
"id": "semantic-3",
63+
"title": "Das <aside>-Element",
64+
"description": "The <kbd>&lt;aside&gt;</kbd> element represents content tangentially related to the main content, like sidebars, pull quotes, or related links.<br><br><pre>&lt;aside&gt;\n &lt;h3&gt;Related&lt;/h3&gt;\n &lt;ul&gt;...&lt;/ul&gt;\n&lt;/aside&gt;</pre>",
65+
"task": "Umschließe die verwandten Links mit einem <kbd>&lt;aside&gt;</kbd>-Element.",
66+
"previewHTML": "",
67+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } aside { padding: 1rem; background: #fff8e7; border: 1px solid #ffe0a6; border-radius: 8px; } h3 { margin: 0 0 8px; color: #b8860b; font-size: 0.9rem; text-transform: uppercase; } ul { margin: 0; padding-left: 1.2rem; } li { margin: 4px 0; } a { color: #b8860b; }",
68+
"sandboxCSS": "",
69+
"codePrefix": "",
70+
"initialCode": "<h3>Related Posts</h3>\n<ul>\n <li><a href=\"#\">CSS Basics</a></li>\n <li><a href=\"#\">HTML Tips</a></li>\n</ul>",
71+
"codeSuffix": "",
72+
"solution": "<aside>\n<h3>Related Posts</h3>\n<ul>\n <li><a href=\"#\">CSS Basics</a></li>\n <li><a href=\"#\">HTML Tips</a></li>\n</ul>\n</aside>",
73+
"previewContainer": "preview-area",
74+
"validations": [
75+
{
76+
"type": "contains",
77+
"value": "<aside>",
78+
"message": "Füge ein öffnendes <kbd>&lt;aside&gt;</kbd>-Tag hinzu"
79+
},
80+
{
81+
"type": "contains",
82+
"value": "</aside>",
83+
"message": "Füge ein schließendes <kbd>&lt;/aside&gt;</kbd>-Tag hinzu"
84+
}
85+
]
86+
}
87+
]
88+
}

lessons/de/50-js-variables.json

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{
2+
"$schema": "../schemas/code-crispies-module-schema.json",
3+
"id": "js-variables",
4+
"title": "JS Variablen",
5+
"description": "Lerne Variablen mit let und const zu deklarieren und mit grundlegenden Datentypen in JavaScript zu arbeiten",
6+
"mode": "javascript",
7+
"difficulty": "beginner",
8+
"lessons": [
9+
{
10+
"id": "js-const",
11+
"title": "Konstanten",
12+
"description": "Use <kbd>const</kbd> to declare a variable that cannot be reassigned. Constants are the default choice for most values in modern JavaScript.",
13+
"task": "Deklariere eine Konstante namens <kbd>name</kbd> mit dem Wert <kbd>\"Alice\"</kbd>",
14+
"previewHTML": "<p id=\"out\">Waiting...</p>",
15+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
16+
"sandboxCSS": "",
17+
"initialCode": "",
18+
"codePrefix": "",
19+
"codeSuffix": "\ndocument.getElementById('out').textContent = name;",
20+
"solution": "const name = \"Alice\";",
21+
"previewContainer": "preview-area",
22+
"validations": [
23+
{
24+
"type": "contains",
25+
"value": "const",
26+
"message": "Verwende <kbd>const</kbd> zur Deklaration"
27+
},
28+
{
29+
"type": "regex",
30+
"value": "const\\s+name\\s*=",
31+
"message": "Deklariere eine Konstante namens <kbd>name</kbd>"
32+
},
33+
{
34+
"type": "regex",
35+
"value": "\"Alice\"|'Alice'|`Alice`",
36+
"message": "Setze den Wert auf <kbd>\"Alice\"</kbd>"
37+
}
38+
]
39+
},
40+
{
41+
"id": "js-let",
42+
"title": "Let-Variablen",
43+
"description": "Use <kbd>let</kbd> to declare variables that you plan to reassign later. Unlike <kbd>const</kbd>, a <kbd>let</kbd> variable can change its value.",
44+
"task": "Deklariere eine Variable <kbd>count</kbd> mit <kbd>let</kbd> auf <kbd>0</kbd>, dann weise ihr <kbd>5</kbd> zu.",
45+
"previewHTML": "<p id=\"out\">Waiting...</p>",
46+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
47+
"sandboxCSS": "",
48+
"initialCode": "",
49+
"codePrefix": "",
50+
"codeSuffix": "\ndocument.getElementById('out').textContent = count;",
51+
"solution": "let count = 0;\ncount = 5;",
52+
"previewContainer": "preview-area",
53+
"validations": [
54+
{
55+
"type": "regex",
56+
"value": "let\\s+count\\s*=\\s*0",
57+
"message": "Beginne mit <kbd>let count = 0;</kbd>"
58+
},
59+
{
60+
"type": "regex",
61+
"value": "count\\s*=\\s*5",
62+
"message": "Weise count erneut <kbd>5</kbd> zu"
63+
}
64+
]
65+
},
66+
{
67+
"id": "js-string",
68+
"title": "Template-Literale",
69+
"description": "Template literals use backticks <kbd>`</kbd> and <kbd>${}</kbd> to embed expressions inside strings. This makes building dynamic text much easier than string concatenation.",
70+
"task": "Erstelle eine Konstante <kbd>msg</kbd> mit einem Template-Literal: <kbd>`Hello, ${name}!`</kbd>",
71+
"previewHTML": "<p id=\"out\">Waiting...</p>",
72+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
73+
"sandboxCSS": "",
74+
"initialCode": "",
75+
"codePrefix": "const name = \"World\";\n",
76+
"codeSuffix": "\ndocument.getElementById('out').textContent = msg;",
77+
"solution": "const msg = `Hello, ${name}!`;",
78+
"previewContainer": "preview-area",
79+
"validations": [
80+
{
81+
"type": "regex",
82+
"value": "const\\s+msg\\s*=",
83+
"message": "Deklariere eine Konstante namens <kbd>msg</kbd>"
84+
},
85+
{
86+
"type": "contains",
87+
"value": "${name}",
88+
"message": "Verwende <kbd>${name}</kbd> in Backticks zum Einbetten der Variable"
89+
},
90+
{
91+
"type": "regex",
92+
"value": "`.*\\$\\{name\\}.*`",
93+
"message": "Umschließe den ganzen String mit Backticks <kbd>`</kbd>"
94+
}
95+
]
96+
},
97+
{
98+
"id": "js-array",
99+
"title": "Arrays",
100+
"description": "Arrays store ordered lists of values in square brackets. Access items by index (starting at 0) and use <kbd>.length</kbd> to get the count.",
101+
"task": "Erstelle eine Konstante <kbd>colors</kbd> mit einem Array: <kbd>[\"red\", \"green\", \"blue\"]</kbd>",
102+
"previewHTML": "<p id=\"out\">Waiting...</p>",
103+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
104+
"sandboxCSS": "",
105+
"initialCode": "",
106+
"codePrefix": "",
107+
"codeSuffix": "\ndocument.getElementById('out').textContent = colors.join(', ');",
108+
"solution": "const colors = [\"red\", \"green\", \"blue\"];",
109+
"previewContainer": "preview-area",
110+
"validations": [
111+
{
112+
"type": "regex",
113+
"value": "const\\s+colors\\s*=",
114+
"message": "Deklariere eine Konstante namens <kbd>colors</kbd>"
115+
},
116+
{
117+
"type": "contains",
118+
"value": "[",
119+
"message": "Verwende eckige Klammern <kbd>[</kbd> für ein Array"
120+
},
121+
{
122+
"type": "regex",
123+
"value": "(\"red\"|'red'|`red`)",
124+
"message": "Füge <kbd>\"red\"</kbd> ins Array ein"
125+
},
126+
{
127+
"type": "regex",
128+
"value": "(\"green\"|'green'|`green`)",
129+
"message": "Füge <kbd>\"green\"</kbd> ins Array ein"
130+
},
131+
{
132+
"type": "regex",
133+
"value": "(\"blue\"|'blue'|`blue`)",
134+
"message": "Füge <kbd>\"blue\"</kbd> ins Array ein"
135+
}
136+
]
137+
}
138+
]
139+
}

lessons/de/51-js-dom.json

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{
2+
"$schema": "../schemas/code-crispies-module-schema.json",
3+
"id": "js-dom",
4+
"title": "JS DOM",
5+
"description": "Lerne HTML-Elemente mit JavaScript-DOM-Methoden wie querySelector auszuwählen und zu verändern",
6+
"mode": "javascript",
7+
"difficulty": "beginner",
8+
"lessons": [
9+
{
10+
"id": "js-query",
11+
"title": "querySelector",
12+
"description": "Use <kbd>document.querySelector()</kbd> to find the first element matching a CSS selector. It returns a single element you can then modify.",
13+
"task": "Wähle das <kbd>h1</kbd>-Element aus und speichere es in einer Konstante namens <kbd>title</kbd>",
14+
"previewHTML": "<h1>Hello</h1><p id=\"out\">Waiting...</p>",
15+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
16+
"sandboxCSS": "",
17+
"initialCode": "",
18+
"codePrefix": "",
19+
"codeSuffix": "\ndocument.getElementById('out').textContent = title.tagName;",
20+
"solution": "const title = document.querySelector('h1');",
21+
"previewContainer": "preview-area",
22+
"validations": [
23+
{
24+
"type": "contains",
25+
"value": "querySelector",
26+
"message": "Verwende <kbd>document.querySelector()</kbd>"
27+
},
28+
{
29+
"type": "regex",
30+
"value": "querySelector\\(['\"`]h1['\"`]\\)",
31+
"message": "Übergib <kbd>'h1'</kbd> als Selektor"
32+
},
33+
{
34+
"type": "regex",
35+
"value": "const\\s+title\\s*=",
36+
"message": "Speichere das Ergebnis in einer Konstante <kbd>title</kbd>"
37+
}
38+
]
39+
},
40+
{
41+
"id": "js-text",
42+
"title": "textContent",
43+
"description": "The <kbd>textContent</kbd> property lets you read or change the text inside an element. Setting it replaces all existing text.",
44+
"task": "Wähle das <kbd>.msg</kbd>-Element aus und setze sein <kbd>textContent</kbd> auf <kbd>\"Done!\"</kbd>",
45+
"previewHTML": "<p class=\"msg\">Waiting...</p>",
46+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; }",
47+
"sandboxCSS": "",
48+
"initialCode": "",
49+
"codePrefix": "",
50+
"codeSuffix": "",
51+
"solution": "document.querySelector('.msg').textContent = \"Done!\";",
52+
"previewContainer": "preview-area",
53+
"validations": [
54+
{
55+
"type": "contains",
56+
"value": "querySelector",
57+
"message": "Verwende <kbd>querySelector</kbd> zum Finden des Elements"
58+
},
59+
{
60+
"type": "contains",
61+
"value": "textContent",
62+
"message": "Verwende die <kbd>textContent</kbd>-Eigenschaft"
63+
},
64+
{
65+
"type": "regex",
66+
"value": "(\"Done!\"|'Done!'|`Done!`)",
67+
"message": "Setze den Text auf <kbd>\"Done!\"</kbd>"
68+
}
69+
]
70+
},
71+
{
72+
"id": "js-style",
73+
"title": "Inline-Styles",
74+
"description": "Access the <kbd>style</kbd> property to set inline CSS on an element. CSS properties with dashes become camelCase: <kbd>background-color</kbd> becomes <kbd>backgroundColor</kbd>.",
75+
"task": "Wähle das <kbd>.box</kbd>-Element aus und setze sein <kbd>style.color</kbd> auf <kbd>\"coral\"</kbd>",
76+
"previewHTML": "<p class=\"box\">Style me!</p>",
77+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { font-size: 1.5rem; font-weight: bold; }",
78+
"sandboxCSS": "",
79+
"initialCode": "",
80+
"codePrefix": "",
81+
"codeSuffix": "",
82+
"solution": "document.querySelector('.box').style.color = \"coral\";",
83+
"previewContainer": "preview-area",
84+
"validations": [
85+
{
86+
"type": "contains",
87+
"value": "querySelector",
88+
"message": "Verwende <kbd>querySelector</kbd> zum Finden des Elements"
89+
},
90+
{
91+
"type": "contains",
92+
"value": ".style.",
93+
"message": "Verwende die <kbd>.style</kbd>-Eigenschaft für CSS"
94+
},
95+
{
96+
"type": "regex",
97+
"value": "style\\.color\\s*=",
98+
"message": "Setze <kbd>style.color</kbd> am Element"
99+
},
100+
{
101+
"type": "regex",
102+
"value": "(\"coral\"|'coral'|`coral`)",
103+
"message": "Setze die Farbe auf <kbd>\"coral\"</kbd>"
104+
}
105+
]
106+
},
107+
{
108+
"id": "js-classlist",
109+
"title": "classList",
110+
"description": "The <kbd>classList</kbd> property provides methods to add, remove, or toggle CSS classes on an element without touching other classes.",
111+
"task": "Wähle das <kbd>.card</kbd>-Element aus und füge die Klasse <kbd>\"active\"</kbd> mit <kbd>classList.add()</kbd> hinzu",
112+
"previewHTML": "<div class=\"card\">Toggle me</div>",
113+
"previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .card { padding: 1rem; border: 2px solid gray; border-radius: 8px; } .active { border-color: coral; background: #fff0ee; }",
114+
"sandboxCSS": "",
115+
"initialCode": "",
116+
"codePrefix": "",
117+
"codeSuffix": "",
118+
"solution": "document.querySelector('.card').classList.add(\"active\");",
119+
"previewContainer": "preview-area",
120+
"validations": [
121+
{
122+
"type": "contains",
123+
"value": "classList",
124+
"message": "Verwende die <kbd>classList</kbd>-Eigenschaft"
125+
},
126+
{
127+
"type": "regex",
128+
"value": "classList\\.add\\(",
129+
"message": "Rufe <kbd>classList.add()</kbd> auf"
130+
},
131+
{
132+
"type": "regex",
133+
"value": "(\"active\"|'active'|`active`)",
134+
"message": "Füge die Klasse <kbd>\"active\"</kbd> hinzu"
135+
}
136+
]
137+
}
138+
]
139+
}

0 commit comments

Comments
 (0)