diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.da.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.da.png
new file mode 100644
index 00000000..5ba438f4
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.da.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.el.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.el.png
new file mode 100644
index 00000000..726ad467
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.el.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.id.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.id.png
new file mode 100644
index 00000000..2c2c2aaf
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.id.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.ms.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.ms.png
new file mode 100644
index 00000000..e46e8f6b
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.ms.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.no.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.no.png
new file mode 100644
index 00000000..34dadbc9
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.no.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.sv.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.sv.png
new file mode 100644
index 00000000..99b8b33e
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.sv.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.th.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.th.png
new file mode 100644
index 00000000..738d8267
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.th.png differ
diff --git a/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.vi.png b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.vi.png
new file mode 100644
index 00000000..6c9b78f2
Binary files /dev/null and b/translated_images/codespace.bcecbdf5d2747d3d17da67a78ad911c8853d68102e34748ec372cde1e9236e1d.vi.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.da.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.da.png
new file mode 100644
index 00000000..2bb6ac4d
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.da.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.el.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.el.png
new file mode 100644
index 00000000..ead637b8
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.el.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.id.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.id.png
new file mode 100644
index 00000000..c9721733
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.id.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.ms.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.ms.png
new file mode 100644
index 00000000..b3381689
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.ms.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.no.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.no.png
new file mode 100644
index 00000000..2bfb1ffb
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.no.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.sv.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.sv.png
new file mode 100644
index 00000000..b2b0fb86
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.sv.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.th.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.th.png
new file mode 100644
index 00000000..0a83f772
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.th.png differ
diff --git a/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.vi.png b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.vi.png
new file mode 100644
index 00000000..8eca6f0c
Binary files /dev/null and b/translated_images/playground-choice.1d23ba7d407f47584c9f446c77f0bcf70cae794cc9c8d7849a3cca4a3693e6c4.vi.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.da.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.da.png
new file mode 100644
index 00000000..fdf7e04e
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.da.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.el.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.el.png
new file mode 100644
index 00000000..38c0a257
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.el.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.id.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.id.png
new file mode 100644
index 00000000..142ffdca
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.id.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.ms.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.ms.png
new file mode 100644
index 00000000..bf24a570
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.ms.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.no.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.no.png
new file mode 100644
index 00000000..927f8236
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.no.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.sv.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.sv.png
new file mode 100644
index 00000000..ac99c638
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.sv.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.th.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.th.png
new file mode 100644
index 00000000..9a9074f6
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.th.png differ
diff --git a/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.vi.png b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.vi.png
new file mode 100644
index 00000000..cdc5ced3
Binary files /dev/null and b/translated_images/playground.d2b927122224ff8ff4028fc842176e353c339147d8925455f36c92fb1655c477.vi.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.da.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.da.png
new file mode 100644
index 00000000..ab305aa3
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.da.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.el.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.el.png
new file mode 100644
index 00000000..0b443407
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.el.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.id.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.id.png
new file mode 100644
index 00000000..ec69b600
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.id.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.ms.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.ms.png
new file mode 100644
index 00000000..e1ea54c6
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.ms.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.no.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.no.png
new file mode 100644
index 00000000..43666dc6
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.no.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.sv.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.sv.png
new file mode 100644
index 00000000..80690e80
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.sv.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.th.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.th.png
new file mode 100644
index 00000000..b11a1800
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.th.png differ
diff --git a/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.vi.png b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.vi.png
new file mode 100644
index 00000000..cae2ed73
Binary files /dev/null and b/translated_images/screenshot.0a1ee0d123df681b4501eb53ffb267519fcc20aa653eabecef1e7561ddfb1cab.vi.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.da.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.da.png
new file mode 100644
index 00000000..2ecfc77a
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.da.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.el.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.el.png
new file mode 100644
index 00000000..72cc31af
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.el.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.id.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.id.png
new file mode 100644
index 00000000..897fc71e
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.id.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.ms.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.ms.png
new file mode 100644
index 00000000..e5ced953
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.ms.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.no.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.no.png
new file mode 100644
index 00000000..d3ee18da
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.no.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.sv.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.sv.png
new file mode 100644
index 00000000..6b00a650
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.sv.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.th.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.th.png
new file mode 100644
index 00000000..8442c949
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.th.png differ
diff --git a/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.vi.png b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.vi.png
new file mode 100644
index 00000000..81c72bcf
Binary files /dev/null and b/translated_images/template.67ad477109d29a2b04599a83c964c87fcde041256d4f04d3589cbb00c696f76c.vi.png differ
diff --git a/translations/da/1-getting-started-lessons/1-intro-to-programming-languages/README.md b/translations/da/1-getting-started-lessons/1-intro-to-programming-languages/README.md
index 9e1a15e0..a39acedb 100644
--- a/translations/da/1-getting-started-lessons/1-intro-to-programming-languages/README.md
+++ b/translations/da/1-getting-started-lessons/1-intro-to-programming-languages/README.md
@@ -1,8 +1,8 @@
# JavaScript Grundlæggende: Datatyper
-
+
> Sketchnote af [Tomomi Imura](https://twitter.com/girlie_mac)
## Quiz før lektionen
-[Quiz før lektionen](https://ff-quizzes.netlify.app/web/quiz/7)
+[Quiz før lektionen](https://ff-quizzes.netlify.app/web/)
Denne lektion dækker det grundlæggende i JavaScript, sproget der giver interaktivitet på nettet.
@@ -26,15 +26,16 @@ Denne lektion dækker det grundlæggende i JavaScript, sproget der giver interak
> 🎥 Klik på billederne ovenfor for videoer om variabler og datatyper
Lad os starte med variabler og de datatyper, der fylder dem!
+
## Variabler
-Variabler gemmer værdier, der kan bruges og ændres gennem din kode.
+Variabler gemmer værdier, som kan bruges og ændres i din kode.
At oprette og **deklarere** en variabel har følgende syntaks **[nøgleord] [navn]**. Det består af to dele:
- **Nøgleord**. Nøgleord kan være `let` eller `var`.
-✅ Nøgleordet `let` blev introduceret i ES6 og giver din variabel en såkaldt _blokscope_. Det anbefales, at du bruger `let` frem for `var`. Vi vil dække blokscopes mere detaljeret i fremtidige dele.
+✅ Nøgleordet `let` blev introduceret i ES6 og giver din variabel en såkaldt _blokscope_. Det anbefales, at du bruger `let` frem for `var`. Vi vil dække blokscope mere detaljeret i fremtidige dele.
- **Variabelnavnet**, dette er et navn, du selv vælger.
### Opgave - arbejde med variabler
@@ -53,7 +54,7 @@ At oprette og **deklarere** en variabel har følgende syntaks **[nøgleord] [nav
myVariable = 123;
```
- > Bemærk: brugen af `=` i denne lektion betyder, at vi bruger en "tildelingsoperator", der bruges til at sætte en værdi til en variabel. Det angiver ikke lighed.
+ > Bemærk: brugen af `=` i denne lektion betyder, at vi bruger en "tildelingsoperator", som bruges til at sætte en værdi til en variabel. Det angiver ikke lighed.
`myVariable` er nu blevet *initialiseret* med værdien 123.
@@ -73,11 +74,11 @@ At oprette og **deklarere** en variabel har følgende syntaks **[nøgleord] [nav
Når en variabel er deklareret, kan du ændre dens værdi på ethvert tidspunkt i din kode med operatoren `=` og den nye værdi.
- ✅ Prøv det! Du kan skrive JavaScript direkte i din browser. Åbn et browservindue og navigér til Developer Tools. I konsollen finder du en prompt; skriv `let myVariable = 123`, tryk retur, og skriv derefter `myVariable`. Hvad sker der? Bemærk, du vil lære mere om disse begreber i efterfølgende lektioner.
+ ✅ Prøv det! Du kan skrive JavaScript direkte i din browser. Åbn et browservindue og navigér til Developer Tools. I konsollen finder du en prompt; skriv `let myVariable = 123`, tryk på return, og skriv derefter `myVariable`. Hvad sker der? Bemærk, du vil lære mere om disse begreber i efterfølgende lektioner.
## Konstanter
-Deklaration og initialisering af en konstant følger de samme koncepter som en variabel, med undtagelse af nøgleordet `const`. Konstanter deklareres typisk med store bogstaver.
+Deklaration og initialisering af en konstant følger de samme principper som en variabel, med undtagelse af nøgleordet `const`. Konstanter deklareres typisk med store bogstaver.
```javascript
const MY_VARIABLE = 123;
@@ -114,9 +115,9 @@ Konstanter ligner variabler, med to undtagelser:
## Datatyper
-Variabler kan gemme mange forskellige typer værdier, som tal og tekst. Disse forskellige typer værdier er kendt som **datatyper**. Datatyper er en vigtig del af softwareudvikling, fordi de hjælper udviklere med at træffe beslutninger om, hvordan koden skal skrives, og hvordan softwaren skal køre. Desuden har nogle datatyper unikke funktioner, der hjælper med at transformere eller udtrække yderligere information fra en værdi.
+Variabler kan gemme mange forskellige typer værdier, som tal og tekst. Disse forskellige typer værdier kaldes **datatyper**. Datatyper er en vigtig del af softwareudvikling, fordi de hjælper udviklere med at træffe beslutninger om, hvordan koden skal skrives, og hvordan softwaren skal fungere. Desuden har nogle datatyper unikke funktioner, der hjælper med at transformere eller udtrække yderligere information fra en værdi.
-✅ Datatyper kaldes også JavaScript dataprimitiver, da de er de laveste niveau datatyper, der leveres af sproget. Der er 7 primitive datatyper: string, number, bigint, boolean, undefined, null og symbol. Tag et øjeblik til at visualisere, hvad hver af disse primitiver kan repræsentere. Hvad er en `zebra`? Hvad med `0`? `true`?
+✅ Datatyper kaldes også JavaScript-dataprimitiver, da de er de mest grundlæggende datatyper, som sproget tilbyder. Der er 7 primitive datatyper: string, number, bigint, boolean, undefined, null og symbol. Tag et øjeblik til at visualisere, hvad hver af disse primitiver kan repræsentere. Hvad er en `zebra`? Hvad med `0`? `true`?
### Tal
@@ -126,7 +127,7 @@ I det foregående afsnit var værdien af `myVariable` en tal-datatype.
Variabler kan gemme alle typer tal, inklusive decimaler eller negative tal. Tal kan også bruges med aritmetiske operatorer, som dækkes i [næste afsnit](../../../../2-js-basics/1-data-types).
-### Aritmetiske Operatorer
+### Aritmetiske operatorer
Der er flere typer operatorer, der kan bruges til at udføre aritmetiske funktioner, og nogle er listet her:
@@ -150,11 +151,11 @@ Strings er sæt af tegn, der er placeret mellem enkelt- eller dobbeltanførselst
Husk at bruge anførselstegn, når du skriver en string, ellers vil JavaScript antage, at det er et variabelnavn.
-### Formatering af Strings
+### Formatering af strings
Strings er tekstuelle og vil kræve formatering fra tid til anden.
-For at **konkatenere** to eller flere strings, eller sætte dem sammen, brug operatoren `+`.
+For at **konkatenere** to eller flere strings, eller sætte dem sammen, bruges operatoren `+`.
```javascript
let myString1 = "Hello";
@@ -168,7 +169,7 @@ myString1 + ", " + myString2 + "!"; //Hello, World!
✅ Hvorfor er `1 + 1 = 2` i JavaScript, men `'1' + '1' = 11?` Tænk over det. Hvad med `'1' + 1`?
-**Template literals** er en anden måde at formatere strings på, undtagen i stedet for anførselstegn bruges backtick. Alt, der ikke er almindelig tekst, skal placeres inde i pladsholdere `${ }`. Dette inkluderer eventuelle variabler, der kan være strings.
+**Template literals** er en anden måde at formatere strings på, bortset fra at der bruges backticks i stedet for anførselstegn. Alt, der ikke er almindelig tekst, skal placeres i placeholders `${ }`. Dette inkluderer eventuelle variabler, der kan være strings.
```javascript
let myString1 = "Hello";
@@ -189,16 +190,16 @@ Booleans kan kun have to værdier: `true` eller `false`. Booleans kan hjælpe me
- `let myTrueBool = true`
- `let myFalseBool = false`
-✅ En variabel kan betragtes som 'truthy', hvis den evalueres til en boolean `true`. Interessant nok er [alle værdier truthy, medmindre de er defineret som falsy](https://developer.mozilla.org/docs/Glossary/Truthy) i JavaScript.
+✅ En variabel kan betragtes som 'truthy', hvis den evalueres til en boolean `true`. Interessant nok er [alle værdier i JavaScript truthy, medmindre de er defineret som falsy](https://developer.mozilla.org/docs/Glossary/Truthy).
---
## 🚀 Udfordring
-JavaScript er berygtet for sine overraskende måder at håndtere datatyper på fra tid til anden. Undersøg lidt om disse 'gotchas'. For eksempel: case sensitivity kan drille! Prøv dette i din konsol: `let age = 1; let Age = 2; age == Age` (resulterer i `false` -- hvorfor?). Hvilke andre gotchas kan du finde?
+JavaScript er berygtet for sine overraskende måder at håndtere datatyper på. Undersøg lidt om disse 'gotchas'. For eksempel: case sensitivity kan drille! Prøv dette i din konsol: `let age = 1; let Age = 2; age == Age` (resulterer i `false` -- hvorfor?). Hvilke andre gotchas kan du finde?
## Quiz efter lektionen
-[Quiz efter lektionen](https://ff-quizzes.netlify.app/web/quiz/8)
+[Quiz efter lektionen](https://ff-quizzes.netlify.app)
## Gennemgang & Selvstudie
@@ -211,4 +212,4 @@ Tag et kig på [denne liste over JavaScript-øvelser](https://css-tricks.com/sni
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/2-js-basics/2-functions-methods/README.md b/translations/da/2-js-basics/2-functions-methods/README.md
index 917554d9..ac3eb0ce 100644
--- a/translations/da/2-js-basics/2-functions-methods/README.md
+++ b/translations/da/2-js-basics/2-functions-methods/README.md
@@ -1,8 +1,8 @@
-# Opret et spil ved hjælp af events
+# Oprettelse af et spil ved hjælp af events
## Quiz før forelæsning
@@ -15,40 +15,40 @@ CO_OP_TRANSLATOR_METADATA:
## Event-drevet programmering
-Når vi opretter en browserbaseret applikation, giver vi en grafisk brugergrænseflade (GUI) til brugeren, som de kan bruge til at interagere med det, vi har bygget. Den mest almindelige måde at interagere med browseren på er ved at klikke og skrive i forskellige elementer. Udfordringen, vi står over for som udviklere, er, at vi ikke ved, hvornår de vil udføre disse handlinger!
+Når vi skaber en browserbaseret applikation, leverer vi en grafisk brugergrænseflade (GUI), som brugeren kan bruge til at interagere med det, vi har bygget. Den mest almindelige måde at interagere med browseren på er ved at klikke og skrive i forskellige elementer. Udfordringen som udvikler er, at vi ikke ved, hvornår de vil udføre disse handlinger!
-[Event-drevet programmering](https://en.wikipedia.org/wiki/Event-driven_programming) er navnet på den type programmering, vi skal bruge for at oprette vores GUI. Hvis vi bryder denne sætning lidt ned, ser vi, at det centrale ord her er **event**. [Event](https://www.merriam-webster.com/dictionary/event), ifølge Merriam-Webster, er defineret som "noget, der sker". Dette beskriver vores situation perfekt. Vi ved, at noget vil ske, som vi ønsker at udføre kode som svar på, men vi ved ikke, hvornår det vil finde sted.
+[Event-drevet programmering](https://en.wikipedia.org/wiki/Event-driven_programming) er navnet på den type programmering, vi skal bruge for at skabe vores GUI. Hvis vi bryder denne sætning lidt ned, ser vi, at kerneordet her er **event**. [Event](https://www.merriam-webster.com/dictionary/event), ifølge Merriam-Webster, defineres som "noget, der sker". Dette beskriver vores situation perfekt. Vi ved, at noget vil ske, som vi ønsker at udføre kode som svar på, men vi ved ikke, hvornår det vil finde sted.
Måden, vi markerer en sektion af kode, vi ønsker at udføre, er ved at oprette en funktion. Når vi tænker på [procedureprogrammering](https://en.wikipedia.org/wiki/Procedural_programming), kaldes funktioner i en specifik rækkefølge. Det samme gælder for event-drevet programmering. Forskellen er **hvordan** funktionerne kaldes.
For at håndtere events (knapklik, indtastning osv.) registrerer vi **event listeners**. En event listener er en funktion, der lytter efter, at en event opstår, og udfører noget som svar. Event listeners kan opdatere UI, foretage kald til serveren eller hvad der ellers skal gøres som svar på brugerens handling. Vi tilføjer en event listener ved at bruge [addEventListener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) og angive en funktion, der skal udføres.
-> **NOTE:** Det er værd at fremhæve, at der er mange måder at oprette event listeners på. Du kan bruge anonyme funktioner eller oprette navngivne. Du kan bruge forskellige genveje, som at indstille `click`-egenskaben eller bruge `addEventListener`. I vores øvelse vil vi fokusere på `addEventListener` og anonyme funktioner, da det sandsynligvis er den mest almindelige teknik, webudviklere bruger. Det er også den mest fleksible, da `addEventListener` fungerer for alle events, og event-navnet kan angives som en parameter.
+> **NOTE:** Det er værd at fremhæve, at der er mange måder at oprette event listeners på. Du kan bruge anonyme funktioner eller oprette navngivne funktioner. Du kan bruge forskellige genveje, som at sætte `click`-egenskaben eller bruge `addEventListener`. I vores øvelse vil vi fokusere på `addEventListener` og anonyme funktioner, da det sandsynligvis er den mest almindelige teknik, webudviklere bruger. Det er også den mest fleksible, da `addEventListener` fungerer for alle events, og event-navnet kan angives som en parameter.
### Almindelige events
-Der er [masser af events](https://developer.mozilla.org/docs/Web/Events), du kan lytte til, når du opretter en applikation. Grundlæggende hæver alt, hvad en bruger gør på en side, en event, hvilket giver dig stor magt til at sikre, at de får den oplevelse, du ønsker. Heldigvis vil du normalt kun have brug for en lille håndfuld events. Her er nogle almindelige (inklusive de to, vi vil bruge, når vi opretter vores spil):
+Der er [mange events](https://developer.mozilla.org/docs/Web/Events) tilgængelige, som du kan lytte til, når du opretter en applikation. Grundlæggende udløser alt, hvad en bruger gør på en side, en event, hvilket giver dig stor magt til at sikre, at de får den oplevelse, du ønsker. Heldigvis har du normalt kun brug for en lille håndfuld events. Her er nogle almindelige (inklusive de to, vi vil bruge, når vi opretter vores spil):
-- [click](https://developer.mozilla.org/docs/Web/API/Element/click_event): Brugeren klikkede på noget, typisk en knap eller hyperlink
-- [contextmenu](https://developer.mozilla.org/docs/Web/API/Element/contextmenu_event): Brugeren klikkede med højre museknap
+- [click](https://developer.mozilla.org/docs/Web/API/Element/click_event): Brugeren klikkede på noget, typisk en knap eller et hyperlink
+- [contextmenu](https://developer.mozilla.org/docs/Web/API/Element/contextmenu_event): Brugeren klikkede på højre museknap
- [select](https://developer.mozilla.org/docs/Web/API/Element/select_event): Brugeren markerede noget tekst
- [input](https://developer.mozilla.org/docs/Web/API/Element/input_event): Brugeren indtastede noget tekst
-## Opret spillet
+## Oprettelse af spillet
-Vi skal oprette et spil for at udforske, hvordan events fungerer i JavaScript. Vores spil vil teste en spillers skrivefærdigheder, som er en af de mest undervurderede færdigheder, alle udviklere bør have. Vi bør alle øve os på at skrive! Den generelle flow af spillet vil se sådan ud:
+Vi skal oprette et spil for at udforske, hvordan events fungerer i JavaScript. Vores spil vil teste en spillers skrivefærdigheder, som er en af de mest undervurderede færdigheder, alle udviklere bør have. Vi bør alle øve os i at skrive! Den generelle spilflow vil se sådan ud:
- Spilleren klikker på startknappen og præsenteres for et citat, de skal skrive
- Spilleren skriver citatet så hurtigt som muligt i en tekstboks
- - Når hvert ord er færdigt, fremhæves det næste
- - Hvis spilleren laver en tastefejl, opdateres tekstboksen til rød
+ - Når hvert ord er færdiggjort, fremhæves det næste
+ - Hvis spilleren laver en tastefejl, bliver tekstboksen rød
- Når spilleren fuldfører citatet, vises en succesmeddelelse med den forløbne tid
Lad os bygge vores spil og lære om events!
### Filstruktur
-Vi skal bruge i alt tre filer: **index.html**, **script.js** og **style.css**. Lad os starte med at opsætte dem for at gøre livet lidt lettere for os.
+Vi skal bruge i alt tre filer: **index.html**, **script.js** og **style.css**. Lad os starte med at sætte dem op for at gøre livet lidt lettere for os.
- Opret en ny mappe til dit arbejde ved at åbne en konsol eller terminal og udføre følgende kommando:
@@ -73,14 +73,14 @@ code .
## Opret brugergrænsefladen
-Hvis vi undersøger kravene, ved vi, at vi skal bruge en håndfuld elementer på vores HTML-side. Dette er lidt som en opskrift, hvor vi har brug for nogle ingredienser:
+Hvis vi ser på kravene, ved vi, at vi skal bruge en håndfuld elementer på vores HTML-side. Dette er lidt som en opskrift, hvor vi har brug for nogle ingredienser:
- Et sted at vise citatet, som brugeren skal skrive
- Et sted at vise meddelelser, som en succesmeddelelse
- En tekstboks til indtastning
- En startknap
-Hvert af disse vil have brug for IDs, så vi kan arbejde med dem i vores JavaScript. Vi vil også tilføje referencer til de CSS- og JavaScript-filer, vi skal oprette.
+Hvert af disse elementer skal have ID'er, så vi kan arbejde med dem i vores JavaScript. Vi tilføjer også referencer til de CSS- og JavaScript-filer, vi skal oprette.
Opret en ny fil med navnet **index.html**. Tilføj følgende HTML:
@@ -107,16 +107,16 @@ Opret en ny fil med navnet **index.html**. Tilføj følgende HTML:
### Start applikationen
-Det er altid bedst at udvikle iterativt for at se, hvordan tingene ser ud. Lad os starte vores applikation. Der er en fantastisk udvidelse til Visual Studio Code kaldet [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon), som både vil hoste din applikation lokalt og opdatere browseren hver gang du gemmer.
+Det er altid bedst at udvikle iterativt for at se, hvordan tingene ser ud. Lad os starte vores applikation. Der er en fantastisk udvidelse til Visual Studio Code kaldet [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon), som både hoster din applikation lokalt og opdaterer browseren, hver gang du gemmer.
- Installer [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) ved at følge linket og klikke på **Install**
- - Du vil blive bedt om at åbne Visual Studio Code via browseren og derefter af Visual Studio Code om at udføre installationen
+ - Du vil blive bedt om at åbne Visual Studio Code via browseren og derefter udføre installationen i Visual Studio Code
- Genstart Visual Studio Code, hvis det bliver bedt om det
-- Når det er installeret, klik Ctrl-Shift-P (eller Cmd-Shift-P) i Visual Studio Code for at åbne kommandopaletten
+- Når det er installeret, skal du i Visual Studio Code trykke på Ctrl-Shift-P (eller Cmd-Shift-P) for at åbne kommandopaletten
- Skriv **Live Server: Open with Live Server**
- Live Server vil begynde at hoste din applikation
- Åbn en browser og naviger til **https://localhost:5500**
-- Du bør nu se den side, du har oprettet!
+- Du skulle nu kunne se den side, du har oprettet!
Lad os tilføje noget funktionalitet.
@@ -138,7 +138,7 @@ Opret en ny fil med navnet **style.css**, og tilføj følgende syntaks.
}
```
-✅ Når det kommer til CSS, kan du layout din side, som du vil. Brug lidt tid på at gøre siden mere tiltalende:
+✅ Når det kommer til CSS, kan du designe din side, som du vil. Brug lidt tid på at gøre siden mere tiltalende:
- Vælg en anden skrifttype
- Farvelæg overskrifterne
@@ -146,24 +146,24 @@ Opret en ny fil med navnet **style.css**, og tilføj følgende syntaks.
## JavaScript
-Med vores UI oprettet er det tid til at fokusere på JavaScript, som vil give logikken. Vi vil opdele dette i en håndfuld trin:
+Med vores UI oprettet er det tid til at fokusere på JavaScript, som vil levere logikken. Vi vil opdele dette i en håndfuld trin:
- [Opret konstanterne](../../../../4-typing-game/typing-game)
- [Event listener til at starte spillet](../../../../4-typing-game/typing-game)
- [Event listener til indtastning](../../../../4-typing-game/typing-game)
-Men først, opret en ny fil med navnet **script.js**.
+Men først skal du oprette en ny fil med navnet **script.js**.
### Tilføj konstanterne
-Vi skal bruge nogle elementer for at gøre vores programmering lidt lettere. Igen, ligesom en opskrift, her er hvad vi skal bruge:
+Vi skal bruge nogle elementer for at gøre vores programmering lettere. Igen, ligesom en opskrift, her er hvad vi skal bruge:
-- Array med listen over alle citater
-- Tomt array til at gemme alle ordene for det aktuelle citat
-- Plads til at gemme indekset for det ord, spilleren aktuelt skriver
-- Tiden, spilleren klikkede på start
+- En array med listen over alle citater
+- En tom array til at gemme alle ordene for det aktuelle citat
+- Et sted til at gemme indekset for det ord, spilleren aktuelt skriver
+- Tiden, hvor spilleren klikkede på start
-Vi vil også have referencer til UI-elementerne:
+Vi skal også have referencer til UI-elementerne:
- Tekstboksen (**typed-value**)
- Citatvisningen (**quote**)
@@ -194,9 +194,9 @@ const typedValueElement = document.getElementById('typed-value');
✅ Tilføj flere citater til dit spil
-> **NOTE:** Vi kan hente elementerne, når vi vil i koden, ved at bruge `document.getElementById`. Fordi vi regelmæssigt vil referere til disse elementer, undgår vi tastefejl med strenglitteraler ved at bruge konstanter. Frameworks som [Vue.js](https://vuejs.org/) eller [React](https://reactjs.org/) kan hjælpe dig med bedre at centralisere din kode.
+> **NOTE:** Vi kan hente elementerne, når som helst vi vil i koden, ved at bruge `document.getElementById`. Fordi vi ofte vil referere til disse elementer, undgår vi tastefejl med strenglitteraler ved at bruge konstanter. Frameworks som [Vue.js](https://vuejs.org/) eller [React](https://reactjs.org/) kan hjælpe dig med bedre at centralisere din kode.
-Tag et øjeblik til at se en video om brugen af `const`, `let` og `var`
+Tag et øjeblik til at se en video om brugen af `const`, `let` og `var`.
[](https://youtube.com/watch?v=JNIXfGiDWM8 "Typer af variabler")
@@ -204,9 +204,9 @@ Tag et øjeblik til at se en video om brugen af `const`, `let` og `var`
### Tilføj startlogik
-For at starte spillet vil spilleren klikke på start. Selvfølgelig ved vi ikke, hvornår de vil klikke på start. Dette er, hvor en [event listener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) kommer i spil. En event listener giver os mulighed for at lytte efter, at noget sker (en event) og udføre kode som svar. I vores tilfælde ønsker vi at udføre kode, når brugeren klikker på start.
+For at starte spillet vil spilleren klikke på start. Selvfølgelig ved vi ikke, hvornår de vil klikke på start. Dette er, hvor en [event listener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) kommer i spil. En event listener giver os mulighed for at lytte efter, at noget sker (en event), og udføre kode som svar. I vores tilfælde ønsker vi at udføre kode, når brugeren klikker på start.
-Når brugeren klikker på **start**, skal vi vælge et citat, opsætte brugergrænsefladen og opsætte sporing for det aktuelle ord og timing. Nedenfor er den JavaScript, du skal tilføje; vi diskuterer det lige efter scriptblokken.
+Når brugeren klikker på **start**, skal vi vælge et citat, opsætte brugergrænsefladen og opsætte sporing for det aktuelle ord og tidtagning. Nedenfor er den JavaScript, du skal tilføje; vi diskuterer det lige efter scriptblokken.
```javascript
// at the end of script.js
@@ -245,23 +245,23 @@ Lad os bryde koden ned!
- Opsætning af ordsporing
- Brug af [Math.floor](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) og [Math.random](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random) giver os mulighed for tilfældigt at vælge et citat fra `quotes`-arrayet
- - Vi konverterer `quote` til et array af `words`, så vi kan spore det ord, spilleren aktuelt skriver
+ - Vi konverterer `quote` til en array af `words`, så vi kan spore det ord, spilleren aktuelt skriver
- `wordIndex` sættes til 0, da spilleren starter med det første ord
- Opsætning af UI
- - Opret et array af `spanWords`, som indeholder hvert ord inde i et `span`-element
- - Dette giver os mulighed for at fremhæve ordet på displayet
- - `join` arrayet for at oprette en streng, som vi kan bruge til at opdatere `innerHTML` på `quoteElement`
+ - Opret en array af `spanWords`, som indeholder hvert ord inde i et `span`-element
+ - Dette giver os mulighed for at fremhæve ordet på skærmen
+ - `join` arrayet for at skabe en streng, som vi kan bruge til at opdatere `innerHTML` på `quoteElement`
- Dette vil vise citatet til spilleren
- - Indstil `className` for det første `span`-element til `highlight` for at fremhæve det som gult
- - Rens `messageElement` ved at indstille `innerText` til `''`
+ - Sæt `className` for det første `span`-element til `highlight` for at fremhæve det som gult
+ - Rens `messageElement` ved at sætte `innerText` til `''`
- Opsætning af tekstboksen
- Ryd den aktuelle `value` på `typedValueElement`
- - Indstil `focus` til `typedValueElement`
+ - Sæt `focus` til `typedValueElement`
- Start timeren ved at kalde `getTime`
### Tilføj indtastningslogik
-Når spilleren skriver, vil en `input`-event blive rejst. Denne event listener vil kontrollere, om spilleren skriver ordet korrekt, og håndtere spillets aktuelle status. Vend tilbage til **script.js**, og tilføj følgende kode til slutningen. Vi vil bryde det ned bagefter.
+Når spilleren skriver, vil en `input`-event blive udløst. Denne event listener vil kontrollere, om spilleren skriver ordet korrekt, og håndtere spillets aktuelle status. Tilføj følgende kode til slutningen af **script.js**. Vi vil bryde det ned bagefter.
```javascript
// at the end of script.js
@@ -300,27 +300,27 @@ typedValueElement.addEventListener('input', () => {
});
```
-Lad os bryde koden ned! Vi starter med at hente det aktuelle ord og den værdi, spilleren har skrevet indtil videre. Derefter har vi en vandfaldslogik, hvor vi kontrollerer, om citatet er fuldført, ordet er fuldført, ordet er korrekt, eller (endelig), om der er en fejl.
+Lad os bryde koden ned! Vi starter med at hente det aktuelle ord og den værdi, spilleren har skrevet indtil videre. Derefter har vi en kaskadelogik, hvor vi tjekker, om citatet er fuldført, ordet er fuldført, ordet er korrekt, eller (endelig), om der er en fejl.
-- Citatet er fuldført, angivet ved at `typedValue` er lig med `currentWord`, og `wordIndex` er lig med en mindre end `length` af `words`
+- Citatet er fuldført, angivet ved, at `typedValue` er lig med `currentWord`, og `wordIndex` er lig med en mindre end længden af `words`
- Beregn `elapsedTime` ved at trække `startTime` fra den aktuelle tid
- Divider `elapsedTime` med 1.000 for at konvertere fra millisekunder til sekunder
- Vis en succesmeddelelse
-- Ordet er fuldført, angivet ved at `typedValue` slutter med et mellemrum (slutningen af et ord) og `typedValue` er lig med `currentWord`
- - Indstil `value` på `typedElement` til `''` for at tillade, at det næste ord kan skrives
+- Ordet er fuldført, angivet ved, at `typedValue` slutter med et mellemrum (slutningen af et ord), og `typedValue` er lig med `currentWord`
+ - Sæt `value` på `typedElement` til `''` for at tillade, at det næste ord kan skrives
- Inkrementer `wordIndex` for at gå videre til det næste ord
- - Loop gennem alle `childNodes` af `quoteElement` for at indstille `className` til `''` for at vende tilbage til standardvisning
- - Indstil `className` for det aktuelle ord til `highlight` for at markere det som det næste ord, der skal skrives
-- Ordet er aktuelt skrevet korrekt (men ikke fuldført), angivet ved at `currentWord` starter med `typedValue`
+ - Gennemgå alle `childNodes` af `quoteElement` for at sætte `className` til `''` for at vende tilbage til standardvisning
+ - Sæt `className` for det aktuelle ord til `highlight` for at markere det som det næste ord, der skal skrives
+- Ordet er aktuelt skrevet korrekt (men ikke fuldført), angivet ved, at `currentWord` starter med `typedValue`
- Sørg for, at `typedValueElement` vises som standard ved at rydde `className`
- Hvis vi er nået hertil, har vi en fejl
- - Indstil `className` på `typedValueElement` til `error`
+ - Sæt `className` på `typedValueElement` til `error`
## Test din applikation
-Du er nået til slutningen! Det sidste trin er at sikre, at vores applikation fungerer. Prøv det! Vær ikke bekymret, hvis der er fejl; **alle udviklere** har fejl. Undersøg meddelelserne og debug efter behov.
+Du er nået til slutningen! Det sidste trin er at sikre, at vores applikation fungerer. Prøv det! Vær ikke bekymret, hvis der er fejl; **alle udviklere** oplever fejl. Undersøg meddelelserne og fejlret efter behov.
-Klik på **start**, og begynd at skrive! Det skulle se lidt ud som animationen, vi så før.
+Klik på **start**, og begynd at skrive! Det skulle se lidt ud som animationen, vi så tidligere.

@@ -333,21 +333,20 @@ Tilføj mere funktionalitet
- Deaktiver `input`-event listeneren ved fuldførelse, og aktiver den igen, når knappen klikkes
- Deaktiver tekstboksen, når spilleren fuldfører citatet
- Vis en modal dialogboks med succesmeddelelsen
-- Gem høje scorer ved hjælp af [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)
-
+- Gem high scores ved hjælp af [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)
## Quiz efter forelæsning
[Quiz efter forelæsning](https://ff-quizzes.netlify.app/web/quiz/22)
## Gennemgang & Selvstudie
-Læs om [alle de tilgængelige begivenheder](https://developer.mozilla.org/docs/Web/Events) for udviklere via webbrowseren, og overvej de scenarier, hvor du ville bruge hver enkelt.
+Læs om [alle de tilgængelige hændelser](https://developer.mozilla.org/docs/Web/Events) for udviklere via webbrowseren, og overvej de scenarier, hvor du ville bruge hver enkelt.
## Opgave
-[Opret et nyt tastaturspil](assignment.md)
+[Skab et nyt tastaturspil](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/5-browser-extension/1-about-browsers/README.md b/translations/da/5-browser-extension/1-about-browsers/README.md
index 90d97515..e15f20e4 100644
--- a/translations/da/5-browser-extension/1-about-browsers/README.md
+++ b/translations/da/5-browser-extension/1-about-browsers/README.md
@@ -1,8 +1,8 @@
-# Browserudvidelsesprojekt del 2: Kald en API, brug lokal lagring
+# Browserudvidelsesprojekt Del 2: Kald en API, brug lokal lagring
## Quiz før lektionen
@@ -21,7 +21,7 @@ I denne lektion vil du kalde en API ved at indsende din browserudvidelses formul
### Opsæt elementerne til manipulation i udvidelsen:
-På dette tidspunkt har du oprettet HTML til formularen og resultaternes `
` for din browserudvidelse. Fra nu af skal du arbejde i filen `/src/index.js` og bygge din udvidelse lidt efter lidt. Henvis til [den forrige lektion](../1-about-browsers/README.md) for at få din projektopsætning og byggeprocessen på plads.
+På dette tidspunkt har du opbygget HTML'en til formularen og resultaternes `
` for din browserudvidelse. Fra nu af skal du arbejde i filen `/src/index.js` og bygge din udvidelse lidt efter lidt. Henvis til [den forrige lektion](../1-about-browsers/README.md) for at få din projektopsætning og byggeprocessen på plads.
Arbejd i din `index.js`-fil, og start med at oprette nogle `const`-variabler til at holde værdierne forbundet med forskellige felter:
@@ -41,11 +41,11 @@ const myregion = document.querySelector('.my-region');
const clearBtn = document.querySelector('.clear-btn');
```
-Alle disse felter refereres til via deres CSS-klasse, som du opsatte i HTML i den forrige lektion.
+Alle disse felter refereres til via deres CSS-klasse, som du opsatte i HTML'en i den forrige lektion.
### Tilføj lyttere
-Tilføj derefter event listeners til formularen og knappen, der nulstiller formularen, så der sker noget, hvis en bruger indsender formularen eller klikker på nulstillingsknappen. Tilføj også kaldet til at initialisere appen nederst i filen:
+Tilføj derefter event listeners til formularen og nulstillingsknappen, der nulstiller formularen, så hvis en bruger indsender formularen eller klikker på nulstillingsknappen, sker der noget, og tilføj kaldet til at initialisere appen nederst i filen:
```JavaScript
form.addEventListener('submit', (e) => handleSubmit(e));
@@ -53,7 +53,7 @@ clearBtn.addEventListener('click', (e) => reset(e));
init();
```
-✅ Bemærk den forkortede metode, der bruges til at lytte efter en submit- eller klikbegivenhed, og hvordan begivenheden sendes til handleSubmit- eller reset-funktionerne. Kan du skrive den tilsvarende lange version af denne forkortelse? Hvilken foretrækker du?
+✅ Bemærk den forkortede metode, der bruges til at lytte efter en submit- eller klikbegivenhed, og hvordan begivenheden sendes til handleSubmit- eller reset-funktionerne. Kan du skrive den længere version af denne forkortelse? Hvilken foretrækker du?
### Byg init()-funktionen og reset()-funktionen:
@@ -92,10 +92,9 @@ function reset(e) {
}
```
-
I denne funktion er der noget interessant logik. Når du læser igennem den, kan du se, hvad der sker?
-- To `const` oprettes for at tjekke, om brugeren har gemt en APIKey og regionskode i lokal lagring.
+- To `const` oprettes for at kontrollere, om brugeren har gemt en APIKey og regionskode i lokal lagring.
- Hvis en af dem er null, vis formularen ved at ændre dens stil til at blive vist som 'block'.
- Skjul resultaterne, loading og clearBtn, og sæt eventuel fejltekst til en tom streng.
- Hvis der findes en nøgle og region, start en rutine for at:
@@ -104,19 +103,19 @@ I denne funktion er der noget interessant logik. Når du læser igennem den, kan
- Skjule formularen.
- Vise nulstillingsknappen.
-Før du går videre, er det nyttigt at lære om et meget vigtigt koncept, der er tilgængeligt i browsere: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage). LocalStorage er en nyttig måde at gemme strenge i browseren som et `key-value`-par. Denne type webopbevaring kan manipuleres af JavaScript til at administrere data i browseren. LocalStorage udløber ikke, mens SessionStorage, en anden slags webopbevaring, ryddes, når browseren lukkes. De forskellige typer lagring har fordele og ulemper ved deres brug.
+Før du går videre, er det nyttigt at lære om et meget vigtigt koncept, der er tilgængeligt i browsere: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage). LocalStorage er en nyttig måde at gemme strenge i browseren som et `key-value`-par. Denne type webopbevaring kan manipuleres af JavaScript til at administrere data i browseren. LocalStorage udløber ikke, mens SessionStorage, en anden slags webopbevaring, ryddes, når browseren lukkes. De forskellige typer opbevaring har fordele og ulemper ved deres brug.
> Bemærk - din browserudvidelse har sin egen lokale lagring; hovedbrowser-vinduet er en anden instans og opfører sig separat.
-Du sætter din APIKey til at have en strengværdi, for eksempel, og du kan se, at den er sat i Edge ved at "inspicere" en webside (du kan højreklikke på en browser for at inspicere) og gå til fanen Applications for at se lagringen.
+Du sætter din APIKey til at have en strengværdi, for eksempel, og du kan se, at den er sat i Edge ved at "inspicere" en webside (du kan højreklikke på en browser for at inspicere) og gå til fanen Applications for at se opbevaringen.

-✅ Tænk over situationer, hvor du IKKE ville ønske at gemme nogle data i LocalStorage. Generelt er det en dårlig idé at placere API-nøgler i LocalStorage! Kan du se hvorfor? I vores tilfælde, da vores app udelukkende er til læring og ikke vil blive udgivet i en app-butik, vil vi bruge denne metode.
+✅ Tænk over situationer, hvor du IKKE ville ønske at gemme nogle data i LocalStorage. Generelt er det en dårlig idé at placere APIKeys i LocalStorage! Kan du se hvorfor? I vores tilfælde, da vores app udelukkende er til læring og ikke vil blive udgivet i en app-butik, vil vi bruge denne metode.
-Bemærk, at du bruger Web API til at manipulere LocalStorage, enten ved at bruge `getItem()`, `setItem()` eller `removeItem()`. Det er bredt understøttet på tværs af browsere.
+Bemærk, at du bruger Web API'en til at manipulere LocalStorage, enten ved at bruge `getItem()`, `setItem()` eller `removeItem()`. Det er bredt understøttet på tværs af browsere.
-Før du bygger `displayCarbonUsage()`-funktionen, der kaldes i `init()`, lad os bygge funktionaliteten til at håndtere den indledende formularindsendelse.
+Før du bygger funktionen `displayCarbonUsage()`, der kaldes i `init()`, lad os bygge funktionaliteten til at håndtere den indledende formularindsendelse.
### Håndter formularindsendelsen
@@ -128,12 +127,11 @@ function handleSubmit(e) {
setUpUser(apiKey.value, region.value);
}
```
-
-✅ Frisk din hukommelse op - HTML'en, du opsatte i den sidste lektion, har to inputfelter, hvis `values` fanges via de `const`, du opsatte øverst i filen, og de er begge `required`, så browseren forhindrer brugere i at indtaste null-værdier.
+✅ Frisk din hukommelse op - HTML'en, du opsatte i den sidste lektion, har to inputfelter, hvis `values` fanges via de `const`, du opsatte øverst i filen, og de er begge `required`, så browseren stopper brugere fra at indtaste null-værdier.
### Opsæt brugeren
-Videre til `setUpUser`-funktionen, her sætter du værdier for lokal lagring for apiKey og regionName. Tilføj en ny funktion:
+Videre til funktionen `setUpUser`, her sætter du værdier for lokal lagring for apiKey og regionName. Tilføj en ny funktion:
```JavaScript
function setUpUser(apiKey, regionName) {
@@ -146,20 +144,19 @@ function setUpUser(apiKey, regionName) {
displayCarbonUsage(apiKey, regionName);
}
```
-
Denne funktion viser en loading-besked, mens API'en kaldes. På dette tidspunkt er du nået til at oprette den vigtigste funktion i denne browserudvidelse!
### Vis kulstofbrug
Endelig er det tid til at forespørge API'en!
-Før vi går videre, bør vi diskutere API'er. API'er, eller [Application Programming Interfaces](https://www.webopedia.com/TERM/A/API.html), er et kritisk element i en webudviklers værktøjskasse. De giver standardmåder for programmer til at interagere og grænseflade med hinanden. For eksempel, hvis du bygger en hjemmeside, der skal forespørge en database, kan nogen have oprettet en API, du kan bruge. Mens der findes mange typer API'er, er en af de mest populære en [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
+Før vi går videre, bør vi diskutere API'er. API'er, eller [Application Programming Interfaces](https://www.webopedia.com/TERM/A/API.html), er et kritisk element i en webudviklers værktøjskasse. De giver standardmåder for programmer at interagere og grænseflade med hinanden. For eksempel, hvis du bygger en hjemmeside, der skal forespørge en database, kan nogen have oprettet en API, du kan bruge. Mens der findes mange typer API'er, er en af de mest populære en [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
-✅ Udtrykket 'REST' står for 'Representational State Transfer' og indebærer brug af forskelligt konfigurerede URL'er til at hente data. Lav lidt research om de forskellige typer API'er, der er tilgængelige for udviklere. Hvilket format tiltaler dig?
+✅ Udtrykket 'REST' står for 'Representational State Transfer' og indebærer brugen af forskellige konfigurerede URL'er til at hente data. Lav lidt research om de forskellige typer API'er, der er tilgængelige for udviklere. Hvilket format tiltaler dig?
-Der er vigtige ting at bemærke om denne funktion. Først, bemærk [`async`-nøgleordet](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). At skrive dine funktioner, så de kører asynkront, betyder, at de venter på, at en handling, såsom data, der returneres, bliver fuldført, før de fortsætter.
+Der er vigtige ting at bemærke om denne funktion. Først, bemærk nøgleordet [`async`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). At skrive dine funktioner, så de kører asynkront, betyder, at de venter på en handling, såsom at data returneres, før de fortsætter.
-Her er en hurtig video om `async`:
+Her er en kort video om `async`:
[](https://youtube.com/watch?v=YwmlRkrxvkk "Async og Await til håndtering af promises")
@@ -207,8 +204,8 @@ async function displayCarbonUsage(apiKey, region) {
Dette er en stor funktion. Hvad sker der her?
-- Efter bedste praksis bruger du et `async`-nøgleord for at få denne funktion til at opføre sig asynkront. Funktionen indeholder et `try/catch`-blok, da den vil returnere et løfte, når API'en returnerer data. Fordi du ikke har kontrol over hastigheden, som API'en vil svare med (den kan muligvis slet ikke svare!), skal du håndtere denne usikkerhed ved at kalde den asynkront.
-- Du forespørger co2signal API'en for at få data om din region ved hjælp af din APIKey. For at bruge den nøgle skal du bruge en type autentificering i dine header-parametre.
+- I overensstemmelse med bedste praksis bruger du nøgleordet `async` for at få denne funktion til at opføre sig asynkront. Funktionen indeholder et `try/catch`-blok, da den vil returnere et løfte, når API'en returnerer data. Fordi du ikke har kontrol over hastigheden, som API'en vil svare med (den kan muligvis slet ikke svare!), skal du håndtere denne usikkerhed ved at kalde den asynkront.
+- Du forespørger co2signal API'en for at få data om din regions kulstofbrug ved hjælp af din APIKey. For at bruge den nøgle skal du bruge en type autentificering i dine header-parametre.
- Når API'en svarer, tildeler du forskellige elementer af dens responsdata til de dele af din skærm, du opsatte til at vise disse data.
- Hvis der opstår en fejl, eller hvis der ikke er noget resultat, viser du en fejlmeddelelse.
@@ -220,7 +217,7 @@ Tillykke! Hvis du bygger din udvidelse (`npm run build`) og opdaterer den i din
## 🚀 Udfordring
-Vi har diskuteret flere typer API'er indtil videre i disse lektioner. Vælg en web-API og undersøg i dybden, hvad den tilbyder. For eksempel, kig på API'er, der er tilgængelige i browsere, såsom [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API). Hvad gør en API fremragende efter din mening?
+Vi har diskuteret flere typer API'er indtil videre i disse lektioner. Vælg en web-API og undersøg i dybden, hvad den tilbyder. For eksempel, tag et kig på API'er, der er tilgængelige i browsere, såsom [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API). Hvad gør en API fantastisk efter din mening?
## Quiz efter lektionen
@@ -232,9 +229,9 @@ Du lærte om LocalStorage og API'er i denne lektion, begge meget nyttige for den
## Opgave
-[Adoptér en API](assignment.md)
+[Adopt an API](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/5-browser-extension/3-background-tasks-and-performance/README.md b/translations/da/5-browser-extension/3-background-tasks-and-performance/README.md
index e4fa2e17..1a078182 100644
--- a/translations/da/5-browser-extension/3-background-tasks-and-performance/README.md
+++ b/translations/da/5-browser-extension/3-background-tasks-and-performance/README.md
@@ -1,43 +1,43 @@
-# Browserudvidelsesprojekt Del 3: Lær om baggrundsopgaver og ydeevne
+# Browserudvidelsesprojekt Del 3: Lær om Baggrundsopgaver og Ydeevne
-## Quiz før lektionen
+## Quiz før forelæsning
-[Quiz før lektionen](https://ff-quizzes.netlify.app/web/quiz/27)
+[Quiz før forelæsning](https://ff-quizzes.netlify.app/web/quiz/27)
### Introduktion
-I de sidste to lektioner i dette modul lærte du, hvordan man bygger en formular og et visningsområde til data hentet fra en API. Det er en meget standard måde at skabe en webtilstedeværelse på nettet. Du lærte endda, hvordan man håndterer asynkron datahentning. Din browserudvidelse er næsten færdig.
+I de sidste to lektioner af dette modul lærte du, hvordan man bygger en formular og et visningsområde til data hentet fra en API. Det er en meget standard måde at skabe en webtilstedeværelse på nettet. Du lærte endda, hvordan man håndterer asynkron datahentning. Din browserudvidelse er næsten færdig.
-Det, der mangler, er at håndtere nogle baggrundsopgaver, herunder opdatering af farven på udvidelsens ikon. Derfor er det et godt tidspunkt at tale om, hvordan browseren håndterer denne type opgaver. Lad os tænke på disse browseropgaver i konteksten af ydeevnen for dine webressourcer, mens du bygger dem.
+Det, der mangler, er at håndtere nogle baggrundsopgaver, herunder at opdatere farven på udvidelsens ikon. Dette er derfor et godt tidspunkt at tale om, hvordan browseren håndterer denne type opgaver. Lad os tænke på disse browseropgaver i sammenhæng med ydeevnen af dine webressourcer, mens du bygger dem.
## Grundlæggende om webydeevne
> "Webstedets ydeevne handler om to ting: hvor hurtigt siden indlæses, og hvor hurtigt koden på den kører." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
-Emnet om, hvordan man gør sine websites lynhurtige på alle slags enheder, for alle slags brugere, i alle slags situationer, er ikke overraskende omfattende. Her er nogle punkter at huske på, når du bygger enten et standard webprojekt eller en browserudvidelse.
+Emnet om, hvordan man gør dine websteder lynhurtige på alle slags enheder, for alle slags brugere, i alle slags situationer, er ikke overraskende omfattende. Her er nogle punkter at huske på, mens du bygger enten et standard webprojekt eller en browserudvidelse.
Det første, du skal gøre for at sikre, at dit websted kører effektivt, er at indsamle data om dets ydeevne. Det første sted at gøre dette er i udviklerværktøjerne i din webbrowser. I Edge kan du vælge knappen "Indstillinger og mere" (ikonet med de tre prikker øverst til højre i browseren), derefter navigere til Flere værktøjer > Udviklerværktøjer og åbne fanen Ydeevne. Du kan også bruge tastaturgenvejene `Ctrl` + `Shift` + `I` på Windows eller `Option` + `Command` + `I` på Mac for at åbne udviklerværktøjerne.
-Fanen Ydeevne indeholder et profileringsværktøj. Åbn et websted (prøv for eksempel [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)) og klik på 'Optag'-knappen, og opdater derefter webstedet. Stop optagelsen når som helst, og du vil kunne se de rutiner, der genereres for at 'script', 'render' og 'male' webstedet:
+Fanen Ydeevne indeholder et profileringsværktøj. Åbn et websted (prøv for eksempel [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)) og klik på 'Optag'-knappen, og opdater derefter siden. Stop optagelsen når som helst, og du vil kunne se de rutiner, der genereres for at 'script', 'render' og 'male' siden:

-✅ Besøg [Microsoft Dokumentation](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) om ydeevnepanelet i Edge
+✅ Besøg [Microsoft Dokumentation](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) om Ydeevne-panelet i Edge
-> Tip: For at få en nøjagtig aflæsning af dit websteds opstartstid, skal du rydde din browsers cache.
+> Tip: For at få en præcis måling af dit websteds opstartstid, ryd din browsers cache
Vælg elementer i profilens tidslinje for at zoome ind på begivenheder, der sker, mens din side indlæses.
-Få et snapshot af din sides ydeevne ved at vælge en del af profilens tidslinje og se på oversigtspanelet:
+Få et øjebliksbillede af din sides ydeevne ved at vælge en del af profilens tidslinje og kigge på oversigtspanelet:

@@ -45,29 +45,29 @@ Tjek begivenhedslogpanelet for at se, om nogen begivenhed tog længere end 15 ms

-✅ Lær din profiler at kende! Åbn udviklerværktøjerne på dette websted og se, om der er nogen flaskehalse. Hvilken ressource indlæses langsomst? Hurtigst?
+✅ Lær din profiler at kende! Åbn udviklerværktøjerne på dette websted og se, om der er nogen flaskehalse. Hvad er den langsomst indlæsende ressource? Den hurtigste?
## Profileringstjek
Generelt er der nogle "problemområder", som enhver webudvikler bør holde øje med, når de bygger et websted, for at undgå ubehagelige overraskelser, når det er tid til at implementere i produktion.
-**Ressourcestørrelser**: Internettet er blevet 'tungere' og dermed langsommere i løbet af de seneste år. Noget af denne vægt skyldes brugen af billeder.
+**Ressourcestørrelser**: Internettet er blevet 'tungere' og dermed langsommere i løbet af de sidste par år. Noget af denne vægt skyldes brugen af billeder.
-✅ Gennemse [Internetarkivet](https://httparchive.org/reports/page-weight) for et historisk overblik over sidens vægt og mere.
+✅ Kig gennem [Internetarkivet](https://httparchive.org/reports/page-weight) for et historisk overblik over sidens vægt og mere.
-En god praksis er at sikre, at dine billeder er optimerede og leveres i den rigtige størrelse og opløsning til dine brugere.
+En god praksis er at sikre, at dine billeder er optimeret og leveret i den rigtige størrelse og opløsning til dine brugere.
-**DOM-gennemløb**: Browseren skal opbygge sin Document Object Model baseret på den kode, du skriver, så det er i interesse for god sideydeevne at holde dine tags minimale og kun bruge og style det, siden har brug for. I denne forbindelse kunne overskydende CSS, der er knyttet til en side, optimeres; stilarter, der kun skal bruges på én side, behøver for eksempel ikke at være inkluderet i hovedstilarket.
+**DOM-gennemløb**: Browseren skal bygge sin Document Object Model baseret på den kode, du skriver, så det er i god sidens ydeevnes interesse at holde dine tags minimale og kun bruge og style det, som siden har brug for. For eksempel kan overskydende CSS, der er knyttet til en side, optimeres; stilarter, der kun skal bruges på én side, behøver ikke at være inkluderet i hoved-stilarket.
**JavaScript**: Enhver JavaScript-udvikler bør holde øje med 'render-blokerende' scripts, der skal indlæses, før resten af DOM'en kan gennemløbes og males til browseren. Overvej at bruge `defer` med dine inline scripts (som det gøres i Terrarium-modulet).
✅ Prøv nogle websteder på en [Site Speed Test-webside](https://www.webpagetest.org/) for at lære mere om de almindelige tjek, der udføres for at bestemme webstedets ydeevne.
-Nu hvor du har en idé om, hvordan browseren gengiver de ressourcer, du sender til den, lad os se på de sidste par ting, du skal gøre for at fuldføre din udvidelse:
+Nu hvor du har en idé om, hvordan browseren gengiver de ressourcer, du sender til den, lad os se på de sidste par ting, du skal gøre for at færdiggøre din udvidelse:
### Opret en funktion til at beregne farve
-Arbejd i `/src/index.js`, og tilføj en funktion kaldet `calculateColor()` efter rækken af `const`-variabler, du har oprettet for at få adgang til DOM'en:
+Arbejd i `/src/index.js`, og tilføj en funktion kaldet `calculateColor()` efter rækken af `const`-variabler, du satte for at få adgang til DOM'en:
```JavaScript
function calculateColor(value) {
@@ -88,17 +88,17 @@ function calculateColor(value) {
}
```
-Hvad sker der her? Du sender en værdi (kulstofintensiteten) fra API-kaldet, du fuldførte i sidste lektion, og derefter beregner du, hvor tæt dens værdi er på indekset præsenteret i farvearrayet. Derefter sender du den nærmeste farveværdi videre til chrome runtime.
+Hvad sker der her? Du sender en værdi (kulstofintensiteten) fra API-kaldet, du færdiggjorde i den sidste lektion, og derefter beregner du, hvor tæt dens værdi er på indekset præsenteret i farvearrayet. Derefter sender du den nærmeste farveværdi videre til chrome runtime.
Chrome.runtime har [en API](https://developer.chrome.com/extensions/runtime), der håndterer alle slags baggrundsopgaver, og din udvidelse udnytter dette:
-> "Brug chrome.runtime API'en til at hente baggrundssiden, returnere detaljer om manifestet og lytte til og reagere på begivenheder i appens eller udvidelsens livscyklus. Du kan også bruge denne API til at konvertere den relative sti for URL'er til fuldt kvalificerede URL'er."
+> "Brug chrome.runtime API'en til at hente baggrundssiden, returnere detaljer om manifestet og lytte til og reagere på begivenheder i appens eller udvidelsens livscyklus. Du kan også bruge denne API til at konvertere relative stier til fuldt kvalificerede URL'er."
-✅ Hvis du udvikler denne browserudvidelse til Edge, kan det overraske dig, at du bruger en chrome API. De nyere Edge-browserversioner kører på Chromium-browsermotoren, så du kan udnytte disse værktøjer.
+✅ Hvis du udvikler denne browserudvidelse til Edge, kan det overraske dig, at du bruger en chrome API. De nyere versioner af Edge-browseren kører på Chromium-browsermotoren, så du kan udnytte disse værktøjer.
> Bemærk, hvis du vil profilere en browserudvidelse, skal du starte udviklerværktøjerne fra selve udvidelsen, da den er sin egen separate browserinstans.
-### Indstil en standardfarve for ikonet
+### Indstil en standard ikonfarve
Nu, i `init()`-funktionen, skal du indstille ikonet til at være generisk grønt til at starte med ved igen at kalde chromes `updateIcon`-handling:
@@ -113,14 +113,14 @@ chrome.runtime.sendMessage({
### Kald funktionen, udfør kaldet
-Dernæst skal du kalde den funktion, du lige har oprettet, ved at tilføje den til det løfte, der returneres af C02Signal API'en:
+Kald derefter den funktion, du lige har oprettet, ved at tilføje den til løftet returneret af C02Signal API:
```JavaScript
//let CO2...
calculateColor(CO2);
```
-Og endelig, i `/dist/background.js`, tilføj lytteren til disse baggrundsaktionskald:
+Og endelig, i `/dist/background.js`, tilføj lytteren til disse baggrundshandlingskald:
```JavaScript
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
@@ -142,9 +142,9 @@ function drawIcon(value) {
}
```
-I denne kode tilføjer du en lytter til eventuelle beskeder, der kommer til baggrundsopgavehåndteringen. Hvis den kaldes 'updateIcon', køres den næste kode for at tegne et ikon med den korrekte farve ved hjælp af Canvas API'en.
+I denne kode tilføjer du en lytter til eventuelle beskeder, der kommer til baggrundsopgavehåndteringen. Hvis den kaldes 'updateIcon', køres den næste kode for at tegne et ikon i den korrekte farve ved hjælp af Canvas API'en.
-✅ Du lærer mere om Canvas API'en i [Space Game-lektionerne](../../6-space-game/2-drawing-to-canvas/README.md).
+✅ Du vil lære mere om Canvas API'en i [Space Game-lektionerne](../../6-space-game/2-drawing-to-canvas/README.md).
Nu skal du genopbygge din udvidelse (`npm run build`), opdatere og starte din udvidelse og se farven ændre sig. Er det et godt tidspunkt at tage en pause eller vaske op? Nu ved du det!
@@ -154,17 +154,17 @@ Tillykke, du har bygget en nyttig browserudvidelse og lært mere om, hvordan bro
## 🚀 Udfordring
-Undersøg nogle open source-websteder, der har eksisteret i lang tid, og baseret på deres GitHub-historik, se om du kan afgøre, hvordan de blev optimeret gennem årene for ydeevne, hvis overhovedet. Hvad er det mest almindelige problemområde?
+Undersøg nogle open source-websteder, der har eksisteret i lang tid, og se, baseret på deres GitHub-historik, om du kan afgøre, hvordan de blev optimeret over årene for ydeevne, hvis overhovedet. Hvad er det mest almindelige problemområde?
-## Quiz efter lektionen
+## Quiz efter forelæsning
-[Quiz efter lektionen](https://ff-quizzes.netlify.app/web/quiz/28)
+[Quiz efter forelæsning](https://ff-quizzes.netlify.app/web/quiz/28)
## Gennemgang & Selvstudie
Overvej at tilmelde dig et [ydeevne-nyhedsbrev](https://perf.email/)
-Undersøg nogle af de måder, browsere vurderer webydeevne ved at kigge gennem ydeevnefanerne i deres webværktøjer. Finder du nogen større forskelle?
+Undersøg nogle af de måder, browsere vurderer webydeevne på ved at kigge gennem ydeevnefanerne i deres webværktøjer. Finder du nogen større forskelle?
## Opgave
@@ -173,4 +173,4 @@ Undersøg nogle af de måder, browsere vurderer webydeevne ved at kigge gennem y
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/6-space-game/1-introduction/README.md b/translations/da/6-space-game/1-introduction/README.md
index 75435f58..8961c9a1 100644
--- a/translations/da/6-space-game/1-introduction/README.md
+++ b/translations/da/6-space-game/1-introduction/README.md
@@ -1,13 +1,13 @@
-# Byg et rumspil del 1: Introduktion
+# Byg et Rumspil Del 1: Introduktion

@@ -15,24 +15,24 @@ CO_OP_TRANSLATOR_METADATA:
[Quiz før forelæsning](https://ff-quizzes.netlify.app/web/quiz/29)
-### Arv og komposition i spiludvikling
+### Arv og Komposition i spiludvikling
-I tidligere lektioner var der ikke meget behov for at bekymre sig om designarkitekturen i de apps, du byggede, da projekterne var meget små i omfang. Men når dine applikationer vokser i størrelse og omfang, bliver arkitektoniske beslutninger en større bekymring. Der er to hovedtilgange til at skabe større applikationer i JavaScript: *komposition* eller *arv*. Begge har fordele og ulemper, men lad os forklare dem inden for konteksten af et spil.
+I tidligere lektioner var der ikke meget behov for at bekymre sig om designarkitekturen i de apps, du byggede, da projekterne var meget små i omfang. Men når dine applikationer vokser i størrelse og kompleksitet, bliver arkitektoniske beslutninger en større bekymring. Der er to hovedtilgange til at skabe større applikationer i JavaScript: *komposition* eller *arv*. Begge har deres fordele og ulemper, men lad os forklare dem i konteksten af et spil.
✅ En af de mest berømte programmeringsbøger nogensinde handler om [designmønstre](https://en.wikipedia.org/wiki/Design_Patterns).
-I et spil har du `spilobjekter`, som er objekter, der findes på en skærm. Det betyder, at de har en placering i et kartesisk koordinatsystem, karakteriseret ved at have en `x` og `y` koordinat. Når du udvikler et spil, vil du bemærke, at alle dine spilobjekter har en standardegenskab, fælles for hvert spil, du skaber, nemlig elementer, der er:
+I et spil har du `spilobjekter`, som er objekter, der eksisterer på en skærm. Det betyder, at de har en placering i et kartesisk koordinatsystem, karakteriseret ved at have en `x`- og `y`-koordinat. Når du udvikler et spil, vil du bemærke, at alle dine spilobjekter har en standardegenskab, som er fælles for hvert spil, du skaber, nemlig elementer, der er:
- **positionsbaserede** De fleste, hvis ikke alle, spilelementer er positionsbaserede. Det betyder, at de har en placering, en `x` og `y`.
-- **bevægelige** Dette er objekter, der kan flytte sig til en ny placering. Typisk er det en helt, et monster eller en NPC (en ikke-spilbar karakter), men ikke for eksempel et statisk objekt som et træ.
-- **selvdestruerende** Disse objekter eksisterer kun i en bestemt periode, før de sætter sig selv op til sletning. Normalt er dette repræsenteret af en `dead` eller `destroyed` boolean, der signalerer til spilmotoren, at dette objekt ikke længere skal vises.
-- **nedkøling** 'Nedkøling' er en typisk egenskab blandt kortvarige objekter. Et typisk eksempel er et stykke tekst eller en grafisk effekt som en eksplosion, der kun skal ses i nogle få millisekunder.
+- **bevægelige** Dette er objekter, der kan flytte sig til en ny placering. Typisk er det en helt, et monster eller en NPC (en ikke-spiller karakter), men ikke for eksempel et statisk objekt som et træ.
+- **selvdestruerende** Disse objekter eksisterer kun i en bestemt periode, før de markerer sig selv til sletning. Normalt repræsenteres dette af en `dead` eller `destroyed` boolean, der signalerer til spilmotoren, at dette objekt ikke længere skal vises.
+- **cool-down** 'Cool-down' er en typisk egenskab blandt kortlivede objekter. Et typisk eksempel er et stykke tekst eller en grafisk effekt som en eksplosion, der kun skal ses i nogle få millisekunder.
✅ Tænk på et spil som Pac-Man. Kan du identificere de fire objekttyper, der er nævnt ovenfor, i dette spil?
-### Udtryk adfærd
+### Udtryk af adfærd
-Alt det, vi beskrev ovenfor, er adfærd, som spilobjekter kan have. Så hvordan koder vi dem? Vi kan udtrykke denne adfærd som metoder, der er knyttet til enten klasser eller objekter.
+Alt det, vi har beskrevet ovenfor, er adfærd, som spilobjekter kan have. Så hvordan koder vi det? Vi kan udtrykke denne adfærd som metoder, der er knyttet til enten klasser eller objekter.
**Klasser**
@@ -88,7 +88,7 @@ hero.moveTo(5,5);
const tree = new Tree();
```
-✅ Brug et par minutter på at forestille dig en Pac-Man helt (Inky, Pinky eller Blinky, for eksempel) og hvordan det ville blive skrevet i JavaScript.
+✅ Brug et par minutter på at forestille dig en Pac-Man-helt (Inky, Pinky eller Blinky, for eksempel) og hvordan den ville blive skrevet i JavaScript.
**Komposition**
@@ -149,9 +149,9 @@ Et andet mønster, der er almindeligt i spiludvikling, adresserer problemet med
✅ Pub/Sub står for 'publish-subscribe'
-Dette mønster adresserer ideen om, at de forskellige dele af din applikation ikke bør kende til hinanden. Hvorfor er det sådan? Det gør det meget lettere at se, hvad der generelt foregår, hvis de forskellige dele er adskilt. Det gør det også lettere pludselig at ændre adfærd, hvis du har brug for det. Hvordan opnår vi dette? Vi gør det ved at etablere nogle begreber:
+Dette mønster adresserer ideen om, at de forskellige dele af din applikation ikke bør kende til hinanden. Hvorfor det? Det gør det meget lettere at få et overblik, hvis de forskellige dele er adskilt. Det gør det også lettere at ændre adfærd, hvis det er nødvendigt. Hvordan opnår vi dette? Vi gør det ved at etablere nogle begreber:
-- **besked**: En besked er normalt en tekststreng ledsaget af en valgfri payload (et stykke data, der præciserer, hvad beskeden handler om). En typisk besked i et spil kan være `KEY_PRESSED_ENTER`.
+- **besked**: En besked er normalt en tekststreng ledsaget af en valgfri nyttelast (et stykke data, der præciserer, hvad beskeden handler om). En typisk besked i et spil kan være `KEY_PRESSED_ENTER`.
- **udgiver**: Dette element *udgiver* en besked og sender den ud til alle abonnenter.
- **abonnent**: Dette element *lytter* til specifikke beskeder og udfører en opgave som resultat af at modtage denne besked, såsom at affyre en laser.
@@ -204,7 +204,7 @@ window.addEventListener('keyup', (evt) => {
});
```
-Ovenfor forbinder vi en tastaturhændelse, `ArrowLeft`, og sender beskeden `HERO_MOVE_LEFT`. Vi lytter til den besked og flytter `hero` som resultat. Styrken ved dette mønster er, at event listeneren og helten ikke kender til hinanden. Du kan omdanne `ArrowLeft` til `A`-tasten. Derudover ville det være muligt at gøre noget helt andet på `ArrowLeft` ved at lave nogle få ændringer i eventEmitter's `on`-funktion:
+Ovenfor forbinder vi en tastaturhændelse, `ArrowLeft`, og sender beskeden `HERO_MOVE_LEFT`. Vi lytter til den besked og flytter `hero` som resultat. Styrken ved dette mønster er, at event listeneren og helten ikke kender til hinanden. Du kan ommappe `ArrowLeft` til `A`-tasten. Derudover ville det være muligt at gøre noget helt andet på `ArrowLeft` ved at lave nogle få ændringer i eventEmitter's `on`-funktion:
```javascript
eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
@@ -212,13 +212,13 @@ eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
});
```
-Efterhånden som tingene bliver mere komplicerede, når dit spil vokser, forbliver dette mønster det samme i kompleksitet, og din kode forbliver ren. Det anbefales virkelig at adoptere dette mønster.
+Når tingene bliver mere komplekse, efterhånden som dit spil vokser, forbliver dette mønster det samme i kompleksitet, og din kode forbliver ren. Det anbefales virkelig at adoptere dette mønster.
---
## 🚀 Udfordring
-Tænk over, hvordan pub-sub-mønsteret kan forbedre et spil. Hvilke dele bør udsende hændelser, og hvordan bør spillet reagere på dem? Nu har du chancen for at være kreativ og tænke på et nyt spil og hvordan dets dele kunne opføre sig.
+Tænk over, hvordan pub-sub-mønsteret kan forbedre et spil. Hvilke dele bør udsende hændelser, og hvordan skal spillet reagere på dem? Nu har du chancen for at være kreativ og tænke på et nyt spil og hvordan dets dele kunne opføre sig.
## Quiz efter forelæsning
@@ -230,9 +230,9 @@ Lær mere om Pub/Sub ved at [læse om det](https://docs.microsoft.com/azure/arch
## Opgave
-[Mock et spil](assignment.md)
+[Mock et spil op](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/6-space-game/2-drawing-to-canvas/README.md b/translations/da/6-space-game/2-drawing-to-canvas/README.md
index c8fcd367..2948564b 100644
--- a/translations/da/6-space-game/2-drawing-to-canvas/README.md
+++ b/translations/da/6-space-game/2-drawing-to-canvas/README.md
@@ -1,25 +1,25 @@
-# Byg et Rumspil Del 2: Tegn Helten og Monstrene på Canvas
+# Byg et rumspil del 2: Tegn helten og monstre på lærredet
## Quiz før forelæsning
[Quiz før forelæsning](https://ff-quizzes.netlify.app/web/quiz/31)
-## Canvas
+## Lærredet
-Canvas er et HTML-element, der som standard ikke har noget indhold; det er en tom flade. Du skal tilføje indhold ved at tegne på det.
+Lærredet er et HTML-element, der som standard ikke har noget indhold; det er en tom flade. Du skal tilføje indhold ved at tegne på det.
-✅ Læs [mere om Canvas API'et](https://developer.mozilla.org/docs/Web/API/Canvas_API) på MDN.
+✅ Læs [mere om Canvas API](https://developer.mozilla.org/docs/Web/API/Canvas_API) på MDN.
-Sådan ser det typisk ud, når det erklæres som en del af sidens body:
+Her er, hvordan det typisk deklareres som en del af sidens body:
```html
@@ -27,24 +27,24 @@ Sådan ser det typisk ud, når det erklæres som en del af sidens body:
Ovenfor sætter vi `id`, `width` og `height`.
-- `id`: angiv dette, så du kan få en reference, når du skal interagere med det.
+- `id`: sæt dette, så du kan få en reference, når du skal interagere med det.
- `width`: dette er elementets bredde.
- `height`: dette er elementets højde.
## Tegning af simpel geometri
-Canvas bruger et kartesisk koordinatsystem til at tegne ting. Det betyder, at det bruger en x-akse og en y-akse til at angive, hvor noget er placeret. Positionen `0,0` er øverste venstre hjørne, og nederste højre hjørne er det, du har angivet som CANVAS' BREDDE og HØJDE.
+Lærredet bruger et kartesisk koordinatsystem til at tegne ting. Det betyder, at det bruger en x-akse og y-akse til at udtrykke, hvor noget er placeret. Placeringen `0,0` er øverste venstre hjørne, og nederste højre hjørne er det, du har angivet som lærredets BREDDE og HØJDE.
-
+
> Billede fra [MDN](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)
-For at tegne på canvas-elementet skal du gennemgå følgende trin:
+For at tegne på lærredselementet skal du følge disse trin:
-1. **Få en reference** til Canvas-elementet.
-2. **Få en reference** til Context-elementet, der sidder på Canvas-elementet.
-3. **Udfør en tegneoperation** ved hjælp af Context-elementet.
+1. **Få en reference** til lærredselementet.
+1. **Få en reference** til kontekstelementet, der sidder på lærredselementet.
+1. **Udfør en tegneoperation** ved hjælp af kontekstelementet.
-Koden for ovenstående trin ser typisk sådan ud:
+Kode for ovenstående trin ser typisk sådan ud:
```javascript
// draws a red rectangle
@@ -61,21 +61,21 @@ ctx.fillStyle = 'red';
ctx.fillRect(0,0, 200, 200) // x,y,width, height
```
-✅ Canvas API'et fokuserer primært på 2D-former, men du kan også tegne 3D-elementer på en webside; til dette kan du bruge [WebGL API'et](https://developer.mozilla.org/docs/Web/API/WebGL_API).
+✅ Canvas API fokuserer primært på 2D-former, men du kan også tegne 3D-elementer på en hjemmeside; til dette kan du bruge [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API).
-Du kan tegne mange forskellige ting med Canvas API'et, såsom:
+Du kan tegne mange forskellige ting med Canvas API, såsom:
-- **Geometriske former**, vi har allerede vist, hvordan man tegner et rektangel, men der er meget mere, du kan tegne.
-- **Tekst**, du kan tegne tekst med enhver skrifttype og farve, du ønsker.
-- **Billeder**, du kan tegne et billede baseret på en billedfil som f.eks. en .jpg eller .png.
+- **Geometriske former**, vi har allerede vist, hvordan man tegner et rektangel, men der er meget mere, du kan tegne.
+- **Tekst**, du kan tegne tekst med enhver skrifttype og farve, du ønsker.
+- **Billeder**, du kan tegne et billede baseret på en billedfil som f.eks. en .jpg eller .png.
✅ Prøv det! Du ved, hvordan man tegner et rektangel, kan du tegne en cirkel på en side? Tag et kig på nogle interessante Canvas-tegninger på CodePen. Her er et [særligt imponerende eksempel](https://codepen.io/dissimulate/pen/KrAwx).
-## Indlæs og tegn en billedressource
+## Indlæs og tegn en billedfil
-Du indlæser en billedressource ved at oprette et `Image`-objekt og sætte dets `src`-egenskab. Derefter lytter du til `load`-hændelsen for at vide, hvornår det er klar til brug. Koden ser sådan ud:
+Du indlæser en billedfil ved at oprette et `Image`-objekt og sætte dets `src`-egenskab. Derefter lytter du til `load`-begivenheden for at vide, hvornår det er klar til brug. Koden ser sådan ud:
-### Indlæs ressource
+### Indlæs fil
```javascript
const img = new Image();
@@ -85,9 +85,9 @@ img.onload = () => {
}
```
-### Mønster for indlæsning af ressource
+### Indlæsningsmønster
-Det anbefales at pakke ovenstående ind i en konstruktion som denne, så det er nemmere at bruge, og du kun forsøger at manipulere det, når det er fuldt indlæst:
+Det anbefales at pakke ovenstående ind i en konstruktion som denne, så det er lettere at bruge, og du kun forsøger at manipulere det, når det er fuldt indlæst:
```javascript
function loadAsset(path) {
@@ -128,19 +128,19 @@ async function run() {
### Hvad skal bygges
-Du skal bygge en webside med et Canvas-element. Det skal vise en sort skærm `1024*768`. Vi har givet dig to billeder:
+Du skal bygge en webside med et lærredselement. Det skal vise en sort skærm `1024*768`. Vi har givet dig to billeder:
-- Helteskib
+- Helteskib

-- 5*5 monster
+- 5*5 monster

-### Anbefalede trin for at starte udviklingen
+### Anbefalede trin til at starte udviklingen
-Find de filer, der er blevet oprettet til dig i undermappen `your-work`. Den bør indeholde følgende:
+Find de filer, der er oprettet til dig i undermappen `your-work`. Den bør indeholde følgende:
```bash
-| assets
@@ -151,7 +151,7 @@ Find de filer, der er blevet oprettet til dig i undermappen `your-work`. Den bø
-| package.json
```
-Åbn en kopi af denne mappe i Visual Studio Code. Du skal have et lokalt udviklingsmiljø opsat, helst med Visual Studio Code med NPM og Node installeret. Hvis du ikke har `npm` opsat på din computer, [sådan gør du det](https://www.npmjs.com/get-npm).
+Åbn en kopi af denne mappe i Visual Studio Code. Du skal have et lokalt udviklingsmiljø sat op, helst med Visual Studio Code med NPM og Node installeret. Hvis du ikke har `npm` sat op på din computer, [sådan gør du](https://www.npmjs.com/get-npm).
Start dit projekt ved at navigere til mappen `your_work`:
@@ -168,16 +168,16 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
Tilføj den nødvendige kode til `your-work/app.js` for at løse nedenstående:
-1. **Tegn** et canvas med sort baggrund
- > tip: tilføj to linjer under den relevante TODO i `/app.js`, der sætter `ctx`-elementet til at være sort og top/venstre koordinater til at være 0,0, og højden og bredden til at svare til canvas.
-2. **Indlæs** teksturer
- > tip: tilføj spiller- og fjendebilleder ved hjælp af `await loadTexture` og angiv billedstien. Du vil endnu ikke kunne se dem på skærmen!
-3. **Tegn** helten i midten af skærmen i den nederste halvdel
- > tip: brug `drawImage` API'et til at tegne heroImg på skærmen, og sæt `canvas.width / 2 - 45` og `canvas.height - canvas.height / 4)`.
-4. **Tegn** 5*5 monstre
- > tip: Nu kan du fjerne kommenteringen af koden for at tegne fjender på skærmen. Gå derefter til funktionen `createEnemies` og byg den ud.
+1. **Tegn** et lærred med sort baggrund
+ > tip: tilføj to linjer under den relevante TODO i `/app.js`, der sætter `ctx`-elementet til sort og top/venstre koordinater til 0,0 og højden og bredden til at matche lærredet.
+2. **Indlæs** teksturer
+ > tip: tilføj spiller- og fjendebilleder ved hjælp af `await loadTexture` og angiv stien til billedet. Du vil ikke se dem på skærmen endnu!
+3. **Tegn** helten i midten af skærmen i den nederste halvdel
+ > tip: brug `drawImage` API til at tegne heroImg på skærmen, og sæt `canvas.width / 2 - 45` og `canvas.height - canvas.height / 4)`.
+4. **Tegn** 5*5 monstre
+ > tip: Nu kan du fjerne kommentaren fra koden for at tegne fjender på skærmen. Gå derefter til funktionen `createEnemies` og byg den ud.
- Først, opsæt nogle konstanter:
+ Først skal du opsætte nogle konstanter:
```javascript
const MONSTER_TOTAL = 5;
@@ -186,7 +186,7 @@ Tilføj den nødvendige kode til `your-work/app.js` for at løse nedenstående:
const STOP_X = START_X + MONSTER_WIDTH;
```
- derefter, opret en løkke for at tegne arrayet af monstre på skærmen:
+ derefter oprette en løkke for at tegne arrayet af monstre på skærmen:
```javascript
for (let x = START_X; x < STOP_X; x += 98) {
@@ -198,19 +198,19 @@ Tilføj den nødvendige kode til `your-work/app.js` for at løse nedenstående:
## Resultat
-Det færdige resultat bør se sådan ud:
+Det færdige resultat skal se sådan ud:

## Løsning
-Prøv venligst at løse det selv først, men hvis du sidder fast, kan du se en [løsning](../../../../6-space-game/2-drawing-to-canvas/solution/app.js).
+Prøv først at løse det selv, men hvis du går i stå, kan du se en [løsning](../../../../6-space-game/2-drawing-to-canvas/solution/app.js).
---
## 🚀 Udfordring
-Du har lært om at tegne med det 2D-fokuserede Canvas API; tag et kig på [WebGL API'et](https://developer.mozilla.org/docs/Web/API/WebGL_API), og prøv at tegne et 3D-objekt.
+Du har lært om at tegne med det 2D-fokuserede Canvas API; tag et kig på [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API), og prøv at tegne et 3D-objekt.
## Quiz efter forelæsning
@@ -218,13 +218,13 @@ Du har lært om at tegne med det 2D-fokuserede Canvas API; tag et kig på [WebGL
## Gennemgang & Selvstudie
-Lær mere om Canvas API'et ved at [læse om det](https://developer.mozilla.org/docs/Web/API/Canvas_API).
+Lær mere om Canvas API ved at [læse om det](https://developer.mozilla.org/docs/Web/API/Canvas_API).
## Opgave
-[Leg med Canvas API'et](assignment.md)
+[Leg med Canvas API](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/6-space-game/3-moving-elements-around/README.md b/translations/da/6-space-game/3-moving-elements-around/README.md
index 302c7449..3e64c2f6 100644
--- a/translations/da/6-space-game/3-moving-elements-around/README.md
+++ b/translations/da/6-space-game/3-moving-elements-around/README.md
@@ -1,8 +1,8 @@
-# Byg et rumspil del 4: Tilføj en laser og registrer kollisioner
+# Byg et Rumspil Del 4: Tilføjelse af en Laser og Registrering af Kollisioner
## Quiz før lektionen
[Quiz før lektionen](https://ff-quizzes.netlify.app/web/quiz/35)
-I denne lektion lærer du, hvordan du skyder med laser ved hjælp af JavaScript! Vi vil tilføje to ting til vores spil:
+I denne lektion lærer du, hvordan man skyder med lasere ved hjælp af JavaScript! Vi tilføjer to ting til vores spil:
-- **En laser**: Denne laser bliver skudt fra din helts rumskib og bevæger sig lodret opad.
-- **Kollisionsregistrering**: Som en del af implementeringen af evnen til at *skyde* vil vi også tilføje nogle gode spilleregler:
- - **Laser rammer fjende**: Fjenden dør, hvis den bliver ramt af en laser.
- - **Laser rammer toppen af skærmen**: En laser bliver ødelagt, hvis den rammer den øverste del af skærmen.
- - **Fjende og helt kolliderer**: En fjende og helten bliver ødelagt, hvis de rammer hinanden.
- - **Fjende rammer bunden af skærmen**: En fjende og helten bliver ødelagt, hvis fjenden rammer bunden af skærmen.
+- **En laser**: Denne laser affyres fra din helts skib og bevæger sig lodret opad.
+- **Registrering af kollisioner**, som en del af implementeringen af evnen til at *skyde*, tilføjer vi også nogle spændende spilleregler:
+ - **Laser rammer fjende**: Fjenden dør, hvis den rammes af en laser.
+ - **Laser rammer toppen af skærmen**: En laser destrueres, hvis den rammer den øverste del af skærmen.
+ - **Fjende og helt kollision**: En fjende og helten destrueres, hvis de rammer hinanden.
+ - **Fjende rammer bunden af skærmen**: En fjende og helten destrueres, hvis fjenden rammer bunden af skærmen.
Kort sagt, du -- *helten* -- skal ramme alle fjender med en laser, før de når bunden af skærmen.
-✅ Lav lidt research om det allerførste computerspil nogensinde. Hvad var dets funktionalitet?
+✅ Lav lidt research om det allerførste computerspil, der nogensinde blev skrevet. Hvad var dets funktionalitet?
-Lad os være heroiske sammen!
+Lad os være heltemodige sammen!
-## Kollisionsregistrering
+## Registrering af kollisioner
-Hvordan registrerer vi kollisioner? Vi skal tænke på vores spilobjekter som rektangler, der bevæger sig rundt. Hvorfor det, spørger du måske? Jo, det billede, der bruges til at tegne et spilobjekt, er et rektangel: det har en `x`, `y`, `bredde` og `højde`.
+Hvordan registrerer vi kollisioner? Vi skal tænke på vores spilobjekter som rektangler, der bevæger sig rundt. Hvorfor det, spørger du måske? Jo, billedet, der bruges til at tegne et spilobjekt, er et rektangel: det har en `x`, `y`, `bredde` og `højde`.
-Hvis to rektangler, dvs. en helt og en fjende, *skærer hinanden*, har du en kollision. Hvad der skal ske derefter, afhænger af spillereglerne. For at implementere kollisionsregistrering skal du derfor bruge følgende:
+Hvis to rektangler, dvs. en helt og en fjende, *overlapper*, har du en kollision. Hvad der derefter skal ske, afhænger af spillereglerne. For at implementere registrering af kollisioner skal du derfor bruge følgende:
-1. En måde at få en rektangelrepræsentation af et spilobjekt, noget i stil med dette:
+1. En måde at få en rektangelrepræsentation af et spilobjekt, noget i denne stil:
```javascript
rectFromGameObject() {
@@ -58,32 +58,32 @@ Hvis to rektangler, dvs. en helt og en fjende, *skærer hinanden*, har du en kol
}
```
-## Hvordan ødelægger vi ting
+## Hvordan destruerer vi ting
-For at ødelægge ting i et spil skal du lade spillet vide, at det ikke længere skal tegne dette objekt i spil-loopet, der udløses med et bestemt interval. En måde at gøre dette på er at markere et spilobjekt som *dødt*, når noget sker, som så:
+For at destruerer ting i et spil skal du fortælle spillet, at det ikke længere skal tegne dette objekt i spillets løkke, som udløses med et bestemt interval. En måde at gøre dette på er at markere et spilobjekt som *dødt*, når noget sker, som dette:
```javascript
// collision happened
enemy.dead = true
```
-Derefter kan du sortere *døde* objekter fra, før skærmen bliver tegnet igen, som så:
+Derefter kan du sortere *døde* objekter fra, før skærmen genmales, som dette:
```javascript
gameObjects = gameObject.filter(go => !go.dead);
```
-## Hvordan skyder vi en laser
+## Hvordan affyrer vi en laser
-At skyde en laser betyder at reagere på en tastaturhændelse og oprette et objekt, der bevæger sig i en bestemt retning. Vi skal derfor udføre følgende trin:
+At affyre en laser betyder at reagere på en tastaturhændelse og skabe et objekt, der bevæger sig i en bestemt retning. Vi skal derfor udføre følgende trin:
-1. **Opret et laserobjekt**: fra toppen af heltenes rumskib, som ved oprettelse begynder at bevæge sig opad mod toppen af skærmen.
-2. **Tilføj kode til en tastaturhændelse**: Vi skal vælge en tast på tastaturet, der repræsenterer spilleren, der skyder laseren.
+1. **Opret et laserobjekt**: fra toppen af helteskibet, som ved oprettelse begynder at bevæge sig opad mod skærmens top.
+2. **Tilføj kode til en tastaturhændelse**: vi skal vælge en tast på tastaturet, der repræsenterer spillerens affyring af laseren.
3. **Opret et spilobjekt, der ligner en laser**, når tasten trykkes.
## Cooldown på vores laser
-Laseren skal affyres hver gang du trykker på en tast, f.eks. *mellemrum*. For at forhindre spillet i at producere alt for mange lasere på kort tid, skal vi løse dette. Løsningen er at implementere en såkaldt *cooldown*, en timer, der sikrer, at en laser kun kan affyres med bestemte intervaller. Du kan implementere det på følgende måde:
+Laseren skal affyres hver gang du trykker på en tast, f.eks. *mellemrumstasten*. For at forhindre spillet i at producere alt for mange lasere på kort tid, skal vi løse dette. Løsningen er at implementere en såkaldt *cooldown*, en timer, der sikrer, at en laser kun kan affyres med bestemte intervaller. Du kan implementere det på følgende måde:
```javascript
class Cooldown {
@@ -109,19 +109,19 @@ class Weapon {
}
```
-✅ Henvis til lektion 1 i rumspilsserien for at minde dig selv om *cooldowns*.
+✅ Gå tilbage til lektion 1 i rumspilsserien for at minde dig selv om *cooldowns*.
## Hvad skal bygges
-Du skal tage den eksisterende kode (som du burde have ryddet op i og refaktoreret) fra den forrige lektion og udvide den. Enten start med koden fra del II eller brug koden fra [Del III - starter](../../../../../../../../../your-work).
+Du skal tage den eksisterende kode (som du burde have ryddet op i og refaktoreret) fra den forrige lektion og udvide den. Start enten med koden fra del II eller brug koden fra [Del III - startkode](../../../../../../../../../your-work).
-> tip: Laseren, du skal arbejde med, er allerede i din assets-mappe og refereret af din kode.
+> tip: Laseren, du skal arbejde med, findes allerede i din assets-mappe og er refereret i din kode.
-- **Tilføj kollisionsregistrering**, når en laser kolliderer med noget, skal følgende regler gælde:
- 1. **Laser rammer fjende**: Fjenden dør, hvis den bliver ramt af en laser.
- 2. **Laser rammer toppen af skærmen**: En laser bliver ødelagt, hvis den rammer den øverste del af skærmen.
- 3. **Fjende og helt kolliderer**: En fjende og helten bliver ødelagt, hvis de rammer hinanden.
- 4. **Fjende rammer bunden af skærmen**: En fjende og helten bliver ødelagt, hvis fjenden rammer bunden af skærmen.
+- **Tilføj registrering af kollisioner**, når en laser kolliderer med noget, skal følgende regler gælde:
+ 1. **Laser rammer fjende**: Fjenden dør, hvis den rammes af en laser.
+ 2. **Laser rammer toppen af skærmen**: En laser destrueres, hvis den rammer den øverste del af skærmen.
+ 3. **Fjende og helt kollision**: En fjende og helten destrueres, hvis de rammer hinanden.
+ 4. **Fjende rammer bunden af skærmen**: En fjende og helten destrueres, hvis fjenden rammer bunden af skærmen.
## Anbefalede trin
@@ -137,7 +137,7 @@ Find de filer, der er blevet oprettet til dig i undermappen `your-work`. Den bø
-| package.json
```
-Du starter dit projekt i mappen `your_work` ved at skrive:
+Du starter dit projekt i `your_work`-mappen ved at skrive:
```bash
cd your-work
@@ -148,7 +148,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
### Tilføj kode
-1. **Opsæt en rektangelrepræsentation af dit spilobjekt for at håndtere kollisioner**. Nedenstående kode giver dig mulighed for at få en rektangelrepræsentation af et `GameObject`. Rediger din GameObject-klasse for at udvide den:
+1. **Opsæt en rektangelrepræsentation af dit spilobjekt for at håndtere kollisioner** Følgende kode giver dig mulighed for at få en rektangelrepræsentation af et `GameObject`. Rediger din GameObject-klasse for at udvide den:
```javascript
rectFromGameObject() {
@@ -161,7 +161,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
}
```
-2. **Tilføj kode, der kontrollerer kollisioner**. Dette vil være en ny funktion, der tester, om to rektangler skærer hinanden:
+2. **Tilføj kode, der tjekker kollisioner** Dette vil være en ny funktion, der tester, om to rektangler overlapper:
```javascript
function intersectRect(r1, r2) {
@@ -174,8 +174,8 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
}
```
-3. **Tilføj laser-skydningsfunktionalitet**
- 1. **Tilføj tastaturhændelsesmeddelelse**. *Mellemrumstasten* skal oprette en laser lige over heltenes rumskib. Tilføj tre konstanter i Messages-objektet:
+3. **Tilføj laser-affyringsfunktionalitet**
+ 1. **Tilføj tastaturhændelse**. *Mellemrumstasten* skal skabe en laser lige over helteskibet. Tilføj tre konstanter i Messages-objektet:
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
@@ -183,7 +183,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
COLLISION_ENEMY_HERO: "COLLISION_ENEMY_HERO",
```
- 1. **Håndter mellemrumstasten**. Rediger funktionen `window.addEventListener` keyup for at håndtere mellemrumstasten:
+ 1. **Håndter mellemrumstasten**. Rediger `window.addEventListener` keyup-funktionen for at håndtere mellemrumstasten:
```javascript
} else if(evt.keyCode === 32) {
@@ -191,7 +191,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
}
```
- 1. **Tilføj lyttere**. Rediger funktionen `initGame()` for at sikre, at helten kan skyde, når mellemrumstasten trykkes:
+ 1. **Tilføj lyttere**. Rediger `initGame()`-funktionen for at sikre, at helten kan affyre, når mellemrumstasten trykkes:
```javascript
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
@@ -209,7 +209,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
})
```
- 1. **Bevæg objektet**, Sørg for, at laseren gradvist bevæger sig mod toppen af skærmen. Du opretter en ny Laser-klasse, der udvider `GameObject`, som du har gjort før:
+ 1. **Bevæg objekt**, Sørg for, at laseren gradvist bevæger sig mod toppen af skærmen. Du opretter en ny Laser-klasse, der udvider `GameObject`, som du har gjort før:
```javascript
class Laser extends GameObject {
@@ -252,11 +252,11 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
}
```
- Sørg for at tilføje `updateGameObjects()` til dit spil-loop i `window.onload`.
+ Sørg for at tilføje `updateGameObjects()` i din spillykke i `window.onload`.
4. **Implementer cooldown** på laseren, så den kun kan affyres med bestemte intervaller.
- Til sidst skal du redigere Hero-klassen, så den kan håndtere cooldown:
+ Til sidst rediger Hero-klassen, så den kan håndtere cooldown:
```javascript
class Hero extends GameObject {
@@ -285,7 +285,7 @@ Ovenstående starter en HTTP-server på adressen `http://localhost:5000`. Åbn e
}
```
-På dette tidspunkt har dit spil noget funktionalitet! Du kan navigere med dine piletaster, skyde en laser med din mellemrumstast, og fjender forsvinder, når du rammer dem. Godt gået!
+På dette tidspunkt har dit spil noget funktionalitet! Du kan navigere med piletasterne, affyre en laser med mellemrumstasten, og fjender forsvinder, når du rammer dem. Godt gået!
---
@@ -299,7 +299,7 @@ Tilføj en eksplosion! Tag et kig på spilassets i [Space Art-repoet](../../../.
## Gennemgang & Selvstudie
-Eksperimenter med intervallerne i dit spil indtil videre. Hvad sker der, når du ændrer dem? Læs mere om [JavaScript timing events](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
+Eksperimentér med intervallerne i dit spil indtil videre. Hvad sker der, når du ændrer dem? Læs mere om [JavaScript timing events](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
## Opgave
@@ -308,4 +308,4 @@ Eksperimenter med intervallerne i dit spil indtil videre. Hvad sker der, når du
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/6-space-game/5-keeping-score/README.md b/translations/da/6-space-game/5-keeping-score/README.md
index 8015a25e..de784ec4 100644
--- a/translations/da/6-space-game/5-keeping-score/README.md
+++ b/translations/da/6-space-game/5-keeping-score/README.md
@@ -1,23 +1,23 @@
# Byg et Rumspil Del 5: Point og Liv
-## Quiz før lektion
+## Quiz før lektionen
-[Quiz før lektion](https://ff-quizzes.netlify.app/web/quiz/37)
+[Quiz før lektionen](https://ff-quizzes.netlify.app/web/quiz/37)
-I denne lektion vil du lære, hvordan du tilføjer point til et spil og beregner liv.
+I denne lektion lærer du, hvordan du tilføjer point til et spil og beregner liv.
## Tegn tekst på skærmen
-For at kunne vise en spilscore på skærmen skal du vide, hvordan man placerer tekst på skærmen. Svaret er at bruge metoden `fillText()` på canvas-objektet. Du kan også kontrollere andre aspekter som hvilken skrifttype der skal bruges, tekstens farve og endda dens justering (venstre, højre, center). Nedenfor er der noget kode, der tegner tekst på skærmen.
+For at kunne vise en spilscore på skærmen skal du vide, hvordan man placerer tekst på skærmen. Svaret er at bruge `fillText()`-metoden på canvas-objektet. Du kan også styre andre aspekter som hvilken skrifttype, der skal bruges, tekstens farve og endda dens justering (venstre, højre, center). Nedenfor er noget kode, der tegner tekst på skærmen.
```javascript
ctx.font = "30px Arial";
@@ -30,14 +30,14 @@ ctx.fillText("show this on the screen", 0, 0);
## Liv som et spilkoncept
-Konceptet med at have liv i et spil er blot et tal. I konteksten af et rumspil er det almindeligt at tildele et sæt liv, der bliver trukket fra ét ad gangen, når dit rumskib tager skade. Det er en god idé at vise en grafisk repræsentation af dette, som for eksempel små rumskibe eller hjerter i stedet for et tal.
+Konceptet med at have liv i et spil er blot et tal. I konteksten af et rumspil er det almindeligt at tildele et sæt liv, som trækkes fra ét ad gangen, når dit skib tager skade. Det er en god idé at vise en grafisk repræsentation af dette, som for eksempel små skibe eller hjerter i stedet for et tal.
## Hvad skal bygges
Lad os tilføje følgende til dit spil:
-- **Spilscore**: For hver fjendtlig rumskib, der bliver ødelagt, skal helten tildeles nogle point. Vi foreslår 100 point pr. skib. Spilscoren skal vises nederst til venstre.
-- **Liv**: Dit rumskib har tre liv. Du mister et liv, hver gang et fjendtligt rumskib kolliderer med dig. En livscore skal vises nederst til højre og bestå af følgende grafik .
+- **Spilscore**: For hver fjendeskib, der bliver ødelagt, skal helten tildeles nogle point. Vi foreslår 100 point pr. skib. Spilscoren skal vises nederst til venstre.
+- **Liv**: Dit skib har tre liv. Du mister et liv, hver gang et fjendeskib kolliderer med dig. En livscore skal vises nederst til højre og bestå af følgende grafik .
## Anbefalede trin
@@ -53,24 +53,24 @@ Find de filer, der er blevet oprettet til dig i undermappen `your-work`. Den bø
-| package.json
```
-Start dit projekt i mappen `your_work` ved at skrive:
+Du starter dit projekt i mappen `your_work` ved at skrive:
```bash
cd your-work
npm start
```
-Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åbn en browser og indtast den adresse. Lige nu bør den vise helten og alle fjenderne, og når du trykker på venstre og højre piletaster, bevæger helten sig og kan skyde fjender ned.
+Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åbn en browser og indtast den adresse. Lige nu bør den vise helten og alle fjenderne, og når du trykker på dine venstre og højre piletaster, bevæger helten sig og kan skyde fjender ned.
### Tilføj kode
-1. **Kopier de nødvendige aktiver** fra mappen `solution/assets/` til mappen `your-work`; du vil tilføje en `life.png`-fil. Tilføj lifeImg til funktionen window.onload:
+1. **Kopier de nødvendige ressourcer** fra mappen `solution/assets/` til mappen `your-work`; du skal tilføje en `life.png`-ressource. Tilføj `lifeImg` til `window.onload`-funktionen:
```javascript
lifeImg = await loadTexture("assets/life.png");
```
-1. Tilføj `lifeImg` til listen over aktiver:
+1. Tilføj `lifeImg` til listen over ressourcer:
```javascript
let heroImg,
@@ -82,7 +82,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
2. **Tilføj variabler**. Tilføj kode, der repræsenterer din samlede score (0) og resterende liv (3), og vis disse scores på skærmen.
-3. **Udvid `updateGameObjects()`-funktionen**. Udvid `updateGameObjects()`-funktionen til at håndtere fjendtlige kollisioner:
+3. **Udvid `updateGameObjects()`-funktionen**. Udvid `updateGameObjects()`-funktionen til at håndtere fjendekollisioner:
```javascript
enemies.forEach(enemy => {
@@ -94,7 +94,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
```
4. **Tilføj `liv` og `point`**.
- 1. **Initialiser variabler**. Under `this.cooldown = 0` i klassen `Hero`, sæt liv og point:
+ 1. **Initialiser variabler**. Under `this.cooldown = 0` i `Hero`-klassen, sæt liv og point:
```javascript
this.life = 3;
@@ -128,7 +128,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
```
- 1. **Tilføj metoder til spil-loopet**. Sørg for at tilføje disse funktioner til din window.onload-funktion under `updateGameObjects()`:
+ 1. **Tilføj metoder til spilloopet**. Sørg for at tilføje disse funktioner til din `window.onload`-funktion under `updateGameObjects()`:
```javascript
drawPoints();
@@ -137,9 +137,9 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
1. **Implementer spilleregler**. Implementer følgende spilleregler:
- 1. **For hver kollision mellem helten og en fjende**, træk et liv fra.
+ 1. **For hver helt og fjendekollision**, træk et liv fra.
- Udvid klassen `Hero` til at gøre dette fradrag:
+ Udvid `Hero`-klassen til at gøre dette fradrag:
```javascript
decrementLife() {
@@ -152,7 +152,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
2. **For hver laser, der rammer en fjende**, øg spilscoren med 100 point.
- Udvid klassen Hero til at gøre denne forøgelse:
+ Udvid `Hero`-klassen til at gøre denne forøgelse:
```javascript
incrementPoints() {
@@ -175,9 +175,9 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
});
```
-✅ Lav lidt research for at opdage andre spil, der er lavet med JavaScript/Canvas. Hvad er deres fælles træk?
+✅ Lav lidt research for at opdage andre spil, der er lavet med JavaScript/Canvas. Hvad er deres fællestræk?
-Når du er færdig med dette arbejde, bør du kunne se de små 'livs'-rumskibe nederst til højre, point nederst til venstre, og du bør se din livstæller falde, når du kolliderer med fjender, og dine point stige, når du skyder fjender. Godt gået! Dit spil er næsten færdigt.
+Når du er færdig med dette arbejde, bør du kunne se de små 'livsskibe' nederst til højre, point nederst til venstre, og du bør se din livstæller falde, når du kolliderer med fjender, og dine point stige, når du skyder fjender. Godt gået! Dit spil er næsten færdigt.
---
@@ -185,13 +185,13 @@ Når du er færdig med dette arbejde, bør du kunne se de små 'livs'-rumskibe n
Din kode er næsten færdig. Kan du forestille dig dine næste skridt?
-## Quiz efter lektion
+## Quiz efter lektionen
-[Quiz efter lektion](https://ff-quizzes.netlify.app/web/quiz/38)
+[Quiz efter lektionen](https://ff-quizzes.netlify.app/web/quiz/38)
## Gennemgang & Selvstudie
-Undersøg nogle måder, hvorpå du kan øge og mindske spilscorer og liv. Der findes nogle interessante spilmotorer som [PlayFab](https://playfab.com). Hvordan kunne brugen af en af disse forbedre dit spil?
+Undersøg nogle måder, hvorpå du kan øge og mindske spilscore og liv. Der findes nogle interessante spilmotorer som [PlayFab](https://playfab.com). Hvordan kunne brugen af en af disse forbedre dit spil?
## Opgave
@@ -200,4 +200,4 @@ Undersøg nogle måder, hvorpå du kan øge og mindske spilscorer og liv. Der fi
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at opnå nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/6-space-game/6-end-condition/README.md b/translations/da/6-space-game/6-end-condition/README.md
index 18967214..c9913021 100644
--- a/translations/da/6-space-game/6-end-condition/README.md
+++ b/translations/da/6-space-game/6-end-condition/README.md
@@ -1,36 +1,36 @@
-# Byg et Rumspil Del 6: Afslutning og Genstart
+# Byg et Rumspil Del 6: Afslut og Genstart
## Quiz før forelæsning
[Quiz før forelæsning](https://ff-quizzes.netlify.app/web/quiz/39)
-Der er forskellige måder at udtrykke en *slutbetingelse* i et spil. Det er op til dig som spillets skaber at definere, hvorfor spillet er slut. Her er nogle mulige grunde, hvis vi antager, at vi taler om det rumspil, du har bygget indtil videre:
+Der er forskellige måder at udtrykke en *slutbetingelse* i et spil. Det er op til dig som spilskaber at definere, hvorfor spillet slutter. Her er nogle mulige grunde, hvis vi antager, at vi taler om det rumspil, du har bygget indtil videre:
-- **`N` fjendtlige skibe er blevet ødelagt**: Det er ret almindeligt, hvis du deler et spil op i forskellige niveauer, at du skal ødelægge `N` fjendtlige skibe for at fuldføre et niveau.
+- **`N` fjendtlige skibe er blevet ødelagt**: Det er ret almindeligt, hvis du opdeler et spil i forskellige niveauer, at du skal ødelægge `N` fjendtlige skibe for at fuldføre et niveau.
- **Dit skib er blevet ødelagt**: Der findes helt sikkert spil, hvor du taber, hvis dit skib bliver ødelagt. En anden almindelig tilgang er at have et koncept med liv. Hver gang dit skib bliver ødelagt, mister du et liv. Når alle liv er tabt, taber du spillet.
-- **Du har samlet `N` point**: En anden almindelig slutbetingelse er, at du samler point. Hvordan du får point, er op til dig, men det er ret almindeligt at tildele point til forskellige aktiviteter som at ødelægge et fjendtligt skib eller måske samle genstande, som bliver *droppet*, når de ødelægges.
-- **Fuldfør et niveau**: Dette kan involvere flere betingelser såsom `X` fjendtlige skibe ødelagt, `Y` point samlet eller måske, at en specifik genstand er blevet samlet.
+- **Du har samlet `N` point**: En anden almindelig slutbetingelse er, at du skal samle point. Hvordan du får point, er op til dig, men det er ret almindeligt at tildele point for forskellige aktiviteter som at ødelægge et fjendtligt skib eller måske samle genstande, som bliver *droppet*, når de ødelægges.
+- **Fuldfør et niveau**: Dette kan involvere flere betingelser, såsom `X` fjendtlige skibe ødelagt, `Y` point samlet eller måske, at en specifik genstand er blevet samlet.
## Genstart
Hvis folk nyder dit spil, vil de sandsynligvis gerne spille det igen. Når spillet slutter af en eller anden grund, bør du tilbyde en mulighed for at genstarte.
-✅ Tænk lidt over, under hvilke betingelser du synes, et spil slutter, og hvordan du bliver bedt om at genstarte.
+✅ Tænk lidt over, under hvilke betingelser du synes, et spil slutter, og hvordan du bliver opfordret til at genstarte.
## Hvad skal bygges
-Du vil tilføje disse regler til dit spil:
+Du skal tilføje følgende regler til dit spil:
-1. **Vind spillet**. Når alle fjendtlige skibe er blevet ødelagt, vinder du spillet. Derudover skal der vises en form for sejrsmelding.
+1. **Vinde spillet**. Når alle fjendtlige skibe er blevet ødelagt, vinder du spillet. Derudover skal der vises en form for sejrsmeddelelse.
1. **Genstart**. Når alle dine liv er tabt, eller spillet er vundet, skal du tilbyde en måde at genstarte spillet på. Husk! Du skal reinitialisere spillet, og den tidligere spiltilstand skal ryddes.
## Anbefalede trin
@@ -48,20 +48,20 @@ Find de filer, der er blevet oprettet til dig i undermappen `your-work`. Den bø
-| package.json
```
-Start dit projekt i mappen `your_work` ved at skrive:
+Du starter dit projekt i mappen `your_work` ved at skrive:
```bash
cd your-work
npm start
```
-Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åbn en browser og indtast den adresse. Dit spil bør være i en spilbar tilstand.
+Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åbn en browser, og indtast den adresse. Dit spil bør være i en spilbar tilstand.
-> tip: For at undgå advarsler i Visual Studio Code, rediger funktionen `window.onload` til at kalde `gameLoopId` som den er (uden `let`), og deklarer `gameLoopId` øverst i filen, uafhængigt: `let gameLoopId;`
+> tip: For at undgå advarsler i Visual Studio Code skal du redigere funktionen `window.onload` til at kalde `gameLoopId` som den er (uden `let`), og erklære `gameLoopId` øverst i filen uafhængigt: `let gameLoopId;`
### Tilføj kode
-1. **Spor slutbetingelse**. Tilføj kode, der holder styr på antallet af fjender, eller om helteskibet er blevet ødelagt ved at tilføje disse to funktioner:
+1. **Spor slutbetingelse**. Tilføj kode, der holder styr på antallet af fjender, eller om helteskibet er blevet ødelagt, ved at tilføje disse to funktioner:
```javascript
function isHeroDead() {
@@ -74,7 +74,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
}
```
-1. **Tilføj logik til beskedhåndtering**. Rediger `eventEmitter` til at håndtere disse betingelser:
+1. **Tilføj logik til meddelelseshåndterere**. Rediger `eventEmitter` til at håndtere disse betingelser:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@@ -108,16 +108,16 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
});
```
-1. **Tilføj nye beskedtyper**. Tilføj disse beskeder til constants-objektet:
+1. **Tilføj nye meddelelsestyper**. Tilføj disse meddelelser til konstantobjektet:
```javascript
GAME_END_LOSS: "GAME_END_LOSS",
GAME_END_WIN: "GAME_END_WIN",
```
-2. **Tilføj genstartskode**. Tilføj kode, der genstarter spillet ved tryk på en valgt knap.
+2. **Tilføj genstartskode** kode, der genstarter spillet ved tryk på en valgt knap.
- 1. **Lyt til tastetryk `Enter`**. Rediger din vindues eventListener til at lytte efter dette tryk:
+ 1. **Lyt efter tastetryk `Enter`**. Rediger din vindues `eventListener` til at lytte efter dette tryk:
```javascript
else if(evt.key === "Enter") {
@@ -125,7 +125,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
}
```
- 1. **Tilføj genstartsbesked**. Tilføj denne besked til din Messages constant:
+ 1. **Tilføj genstartsmeddelelse**. Tilføj denne meddelelse til dine meddelelseskonstanter:
```javascript
KEY_EVENT_ENTER: "KEY_EVENT_ENTER",
@@ -133,9 +133,9 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
1. **Implementer spilleregler**. Implementer følgende spilleregler:
- 1. **Spillerens vindbetingelse**. Når alle fjendtlige skibe er ødelagt, vis en sejrsmelding.
+ 1. **Spillerens sejrsbetingelse**. Når alle fjendtlige skibe er ødelagt, vis en sejrsmeddelelse.
- 1. Først, opret en `displayMessage()`-funktion:
+ 1. Først skal du oprette en funktion `displayMessage()`:
```javascript
function displayMessage(message, color = "red") {
@@ -146,7 +146,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
}
```
- 1. Opret en `endGame()`-funktion:
+ 1. Opret en funktion `endGame()`:
```javascript
function endGame(win) {
@@ -171,7 +171,7 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
}
```
- 1. **Genstartlogik**. Når alle liv er tabt, eller spilleren har vundet spillet, vis, at spillet kan genstartes. Genstart desuden spillet, når genstartstasten trykkes (du kan beslutte, hvilken tast der skal bruges til genstart).
+ 1. **Genstartlogik**. Når alle liv er tabt, eller spilleren har vundet spillet, vis, at spillet kan genstartes. Genstart desuden spillet, når genstartstasten trykkes (du kan selv bestemme, hvilken tast der skal bruges til genstart).
1. Opret funktionen `resetGame()`:
@@ -210,13 +210,13 @@ Ovenstående vil starte en HTTP-server på adressen `http://localhost:5000`. Åb
}
```
-👽 💥 🚀 Tillykke, kaptajn! Dit spil er færdigt! Godt klaret! 🚀 💥 👽
+👽 💥 🚀 Tillykke, Kaptajn! Dit spil er færdigt! Godt klaret! 🚀 💥 👽
---
## 🚀 Udfordring
-Tilføj en lyd! Kan du tilføje en lyd for at forbedre din spiloplevelse, måske når der er et laserhit, eller helten dør eller vinder? Se denne [sandbox](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) for at lære, hvordan man afspiller lyd med JavaScript.
+Tilføj en lyd! Kan du tilføje en lyd for at forbedre din spiloplevelse, måske når der er et laserhit, eller når helten dør eller vinder? Tag et kig på denne [sandbox](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) for at lære, hvordan man afspiller lyd ved hjælp af JavaScript.
## Quiz efter forelæsning
@@ -224,13 +224,13 @@ Tilføj en lyd! Kan du tilføje en lyd for at forbedre din spiloplevelse, måske
## Gennemgang & Selvstudie
-Din opgave er at skabe et nyt prøve-spil, så udforsk nogle af de interessante spil derude for at se, hvilken type spil du kunne bygge.
+Din opgave er at skabe et nyt eksempelspil, så udforsk nogle af de interessante spil derude for at se, hvilken type spil du kunne bygge.
## Opgave
-[Byg et prøve-spil](assignment.md)
+[Byg et Eksempelspil](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/7-bank-project/1-template-route/README.md b/translations/da/7-bank-project/1-template-route/README.md
index c9d9b921..fd31ea7a 100644
--- a/translations/da/7-bank-project/1-template-route/README.md
+++ b/translations/da/7-bank-project/1-template-route/README.md
@@ -1,13 +1,13 @@
-# Byg en Bankapp Del 1: HTML-skabeloner og Ruter i en Webapp
+# Byg en bankapp Del 1: HTML-skabeloner og ruter i en webapp
## Quiz før lektionen
@@ -15,7 +15,7 @@ CO_OP_TRANSLATOR_METADATA:
### Introduktion
-Siden JavaScript blev introduceret i browsere, er hjemmesider blevet mere interaktive og komplekse end nogensinde før. Webteknologier bruges nu ofte til at skabe fuldt funktionelle applikationer, der kører direkte i en browser, og som vi kalder [webapplikationer](https://en.wikipedia.org/wiki/Web_application). Da webapps er meget interaktive, ønsker brugerne ikke at vente på, at hele siden genindlæses, hver gang en handling udføres. Derfor bruges JavaScript til at opdatere HTML direkte via DOM'en for at give en mere gnidningsfri brugeroplevelse.
+Siden JavaScript blev introduceret i browsere, er hjemmesider blevet mere interaktive og komplekse end nogensinde før. Webteknologier bruges nu ofte til at skabe fuldt funktionelle applikationer, der kører direkte i en browser, og som vi kalder [webapplikationer](https://en.wikipedia.org/wiki/Web_application). Da webapps er meget interaktive, ønsker brugerne ikke at vente på, at hele siden genindlæses, hver gang en handling udføres. Derfor bruges JavaScript til at opdatere HTML direkte via DOM'en for at give en mere flydende brugeroplevelse.
I denne lektion vil vi lægge fundamentet for at skabe en bankwebapp ved at bruge HTML-skabeloner til at lave flere skærme, der kan vises og opdateres uden at genindlæse hele HTML-siden.
@@ -25,7 +25,7 @@ Du skal bruge en lokal webserver for at teste den webapp, vi bygger i denne lekt
### Forberedelse
-På din computer skal du oprette en mappe kaldet `bank` med en fil ved navn `index.html` indeni. Vi starter med denne HTML [grundstruktur](https://en.wikipedia.org/wiki/Boilerplate_code):
+På din computer skal du oprette en mappe kaldet `bank` med en fil ved navn `index.html` indeni. Vi starter med denne HTML-[grundstruktur](https://en.wikipedia.org/wiki/Boilerplate_code):
```html
@@ -45,26 +45,26 @@ På din computer skal du oprette en mappe kaldet `bank` med en fil ved navn `ind
## HTML-skabeloner
-Hvis du vil oprette flere skærme til en webside, kunne en løsning være at lave én HTML-fil for hver skærm, du vil vise. Men denne løsning har nogle ulemper:
+Hvis du vil oprette flere skærme til en webside, kunne en løsning være at lave en HTML-fil for hver skærm, du vil vise. Denne løsning har dog nogle ulemper:
-- Hele HTML'en skal genindlæses, når du skifter skærm, hvilket kan være langsomt.
+- Du skal genindlæse hele HTML'en, når du skifter skærm, hvilket kan være langsomt.
- Det er svært at dele data mellem de forskellige skærme.
-En anden tilgang er at have kun én HTML-fil og definere flere [HTML-skabeloner](https://developer.mozilla.org/docs/Web/HTML/Element/template) ved hjælp af ``-elementet. En skabelon er en genanvendelig HTML-blok, der ikke vises af browseren og skal instansieres ved kørselstidspunktet ved hjælp af JavaScript.
+En anden tilgang er kun at have én HTML-fil og definere flere [HTML-skabeloner](https://developer.mozilla.org/docs/Web/HTML/Element/template) ved hjælp af ``-elementet. En skabelon er en genanvendelig HTML-blok, der ikke vises af browseren og skal instansieres under kørslen ved hjælp af JavaScript.
### Opgave
-Vi opretter en bankapp med to skærme: login-siden og dashboardet. Først tilføjer vi i HTML-body'en et pladsholder-element, som vi vil bruge til at instansiere de forskellige skærme i vores app:
+Vi vil oprette en bankapp med to skærme: login-siden og dashboardet. Først tilføjer vi i HTML-body'en et pladsholder-element, som vi vil bruge til at instansiere de forskellige skærme i vores app:
```html
Loading...
```
-Vi giver det en `id` for at gøre det nemmere at finde det med JavaScript senere.
+Vi giver det et `id` for at gøre det nemmere at finde det med JavaScript senere.
> Tip: Da indholdet af dette element vil blive erstattet, kan vi indsætte en indlæsningsmeddelelse eller indikator, der vises, mens appen indlæses.
-Dernæst tilføjer vi HTML-skabelonen til login-siden nedenfor. For nu vil vi kun tilføje en titel og en sektion, der indeholder et link, som vi vil bruge til navigation.
+Dernæst tilføjer vi HTML-skabelonen til login-siden nedenfor. For nu vil vi kun tilføje en titel og en sektion med et link, som vi vil bruge til at navigere.
```html
@@ -106,7 +106,7 @@ Derefter tilføjer vi en anden HTML-skabelon til dashboard-siden. Denne side vil
```
-> Tip: Når du opretter HTML-skabeloner, kan du, hvis du vil se, hvordan de ser ud, kommentere `` og `` linjerne ved at omslutte dem med ``.
+> Tip: Når du opretter HTML-skabeloner, kan du, hvis du vil se, hvordan de ser ud, kommentere ``- og ``-linjerne ved at omslutte dem med ``.
✅ Hvorfor tror du, vi bruger `id`-attributter på skabelonerne? Kunne vi bruge noget andet som klasser?
@@ -114,7 +114,7 @@ Derefter tilføjer vi en anden HTML-skabelon til dashboard-siden. Denne side vil
Hvis du prøver din nuværende HTML-fil i en browser, vil du se, at den sidder fast på "Loading...". Det skyldes, at vi skal tilføje noget JavaScript-kode for at instansiere og vise HTML-skabelonerne.
-Instansiering af en skabelon sker normalt i 3 trin:
+At instansiere en skabelon gøres normalt i 3 trin:
1. Hent skabelonelementet i DOM'en, for eksempel ved hjælp af [`document.getElementById`](https://developer.mozilla.org/docs/Web/API/Document/getElementById).
2. Klon skabelonelementet ved hjælp af [`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode).
@@ -154,7 +154,7 @@ updateRoute('login');
## Oprettelse af ruter
-Når vi taler om en webapp, kalder vi *Routing* intentionen om at kortlægge **URL'er** til specifikke skærme, der skal vises. På en hjemmeside med flere HTML-filer sker dette automatisk, da filstierne afspejles i URL'en. For eksempel med disse filer i din projektmappe:
+Når vi taler om en webapp, kalder vi *Routing* for hensigten om at kortlægge **URLs** til specifikke skærme, der skal vises. På et websted med flere HTML-filer sker dette automatisk, da filstierne afspejles i URL'en. For eksempel med disse filer i din projektmappe:
```
mywebsite/index.html
@@ -183,7 +183,7 @@ const routes = {
};
```
-Lad os nu ændre lidt på `updateRoute`-funktionen. I stedet for at sende `templateId` direkte som et argument, vil vi hente det ved først at kigge på den aktuelle URL og derefter bruge vores kort til at få den tilsvarende skabelon-id-værdi. Vi kan bruge [`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname) til kun at få stisektionen fra URL'en.
+Lad os nu ændre funktionen `updateRoute` en smule. I stedet for at sende `templateId` direkte som et argument, vil vi hente det ved først at kigge på den aktuelle URL og derefter bruge vores kort til at få den tilsvarende skabelon-id-værdi. Vi kan bruge [`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname) til kun at få sti-sektionen fra URL'en.
```js
function updateRoute() {
@@ -198,7 +198,7 @@ function updateRoute() {
}
```
-Her kortlagde vi de ruter, vi erklærede, til den tilsvarende skabelon. Du kan prøve, at det fungerer korrekt ved manuelt at ændre URL'en i din browser.
+Her kortlagde vi de ruter, vi erklærede, til den tilsvarende skabelon. Du kan prøve, om det fungerer korrekt, ved manuelt at ændre URL'en i din browser.
✅ Hvad sker der, hvis du indtaster en ukendt sti i URL'en? Hvordan kunne vi løse dette?
@@ -209,11 +209,11 @@ Det næste trin for vores app er at tilføje muligheden for at navigere mellem s
1. Opdatering af den aktuelle URL
2. Opdatering af den viste skabelon baseret på den nye URL
-Vi har allerede taget os af den anden del med `updateRoute`-funktionen, så vi skal finde ud af, hvordan vi opdaterer den aktuelle URL.
+Vi har allerede taget os af den anden del med funktionen `updateRoute`, så vi skal finde ud af, hvordan vi opdaterer den aktuelle URL.
-Vi skal bruge JavaScript og mere specifikt [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState), som gør det muligt at opdatere URL'en og oprette en ny post i browserens historik uden at genindlæse HTML'en.
+Vi skal bruge JavaScript og mere specifikt [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState), som giver mulighed for at opdatere URL'en og oprette en ny post i browserens historik uden at genindlæse HTML'en.
-> Bemærk: Mens HTML-anker-elementet [``](https://developer.mozilla.org/docs/Web/HTML/Element/a) kan bruges alene til at oprette hyperlinks til forskellige URL'er, vil det som standard få browseren til at genindlæse HTML'en. Det er nødvendigt at forhindre denne adfærd, når man håndterer routing med brugerdefineret JavaScript, ved at bruge `preventDefault()`-funktionen på klikbegivenheden.
+> Bemærk: Selvom HTML-anker-elementet [``](https://developer.mozilla.org/docs/Web/HTML/Element/a) kan bruges alene til at oprette hyperlinks til forskellige URLs, vil det som standard få browseren til at genindlæse HTML'en. Det er nødvendigt at forhindre denne adfærd, når man håndterer routing med brugerdefineret JavaScript, ved at bruge funktionen `preventDefault()` på klikbegivenheden.
### Opgave
@@ -226,9 +226,9 @@ function navigate(path) {
}
```
-Denne metode opdaterer først den aktuelle URL baseret på den givne sti og opdaterer derefter skabelonen. Egenskaben `window.location.origin` returnerer URL-roden, hvilket gør det muligt for os at rekonstruere en komplet URL ud fra en given sti.
+Denne metode opdaterer først den aktuelle URL baseret på den givne sti og opdaterer derefter skabelonen. Egenskaben `window.location.origin` returnerer URL-roden, hvilket giver os mulighed for at rekonstruere en komplet URL ud fra en given sti.
-Nu hvor vi har denne funktion, kan vi tage os af problemet, vi har, hvis en sti ikke matcher nogen defineret rute. Vi ændrer `updateRoute`-funktionen ved at tilføje en fallback til en af de eksisterende ruter, hvis vi ikke kan finde et match.
+Nu hvor vi har denne funktion, kan vi tage os af problemet, vi har, hvis en sti ikke matcher nogen defineret rute. Vi ændrer funktionen `updateRoute` ved at tilføje en fallback til en af de eksisterende ruter, hvis vi ikke kan finde et match.
```js
function updateRoute() {
@@ -242,7 +242,7 @@ function updateRoute() {
...
```
-Hvis en rute ikke kan findes, omdirigerer vi nu til `login`-siden.
+Hvis en rute ikke kan findes, omdirigerer vi nu til login-siden.
Lad os nu oprette en funktion til at få URL'en, når et link klikkes, og forhindre browserens standard linkadfærd:
@@ -261,23 +261,23 @@ Lad os fuldføre navigationssystemet ved at tilføje bindinger til vores *Login*
Logout
```
-`event`-objektet ovenfor fanger `click`-begivenheden og sender den til vores `onLinkClick`-funktion.
+Objektet `event` ovenfor fanger `click`-begivenheden og sender den til vores funktion `onLinkClick`.
-Ved hjælp af [`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick)-attributten binder vi `click`-begivenheden til JavaScript-koden, her kaldet til `navigate()`-funktionen.
+Ved hjælp af attributten [`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) binder vi `click`-begivenheden til JavaScript-koden, her kaldet til funktionen `navigate()`.
-Prøv at klikke på disse links, du burde nu kunne navigere mellem de forskellige skærme i din app.
+Prøv at klikke på disse links. Du burde nu kunne navigere mellem de forskellige skærme i din app.
✅ Metoden `history.pushState` er en del af HTML5-standarden og implementeret i [alle moderne browsere](https://caniuse.com/?search=pushState). Hvis du bygger en webapp til ældre browsere, er der et trick, du kan bruge i stedet for dette API: Ved at bruge et [hash (`#`)](https://en.wikipedia.org/wiki/URI_fragment) før stien kan du implementere routing, der fungerer med almindelig anker-navigation og ikke genindlæser siden, da dens formål var at skabe interne links inden for en side.
## Håndtering af browserens tilbage- og fremadknapper
-Brug af `history.pushState` opretter nye poster i browserens navigationshistorik. Du kan tjekke det ved at holde *tilbage-knappen* i din browser nede, det skulle vise noget som dette:
+Brugen af `history.pushState` opretter nye poster i browserens navigationshistorik. Du kan tjekke det ved at holde *tilbage-knappen* i din browser, det skulle vise noget som dette:

Hvis du prøver at klikke på tilbage-knappen et par gange, vil du se, at den aktuelle URL ændres, og historikken opdateres, men den samme skabelon bliver ved med at blive vist.
-Det skyldes, at applikationen ikke ved, at vi skal kalde `updateRoute()` hver gang historikken ændres. Hvis du kigger på [`history.pushState`-dokumentationen](https://developer.mozilla.org/docs/Web/API/History/pushState), kan du se, at hvis tilstanden ændres - hvilket betyder, at vi flyttede til en anden URL - udløses [`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event)-begivenheden. Vi vil bruge det til at løse dette problem.
+Det skyldes, at applikationen ikke ved, at vi skal kalde `updateRoute()` hver gang historikken ændres. Hvis du kigger på dokumentationen for [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState), kan du se, at hvis tilstanden ændres - hvilket betyder, at vi flyttede til en anden URL - udløses begivenheden [`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event). Vi vil bruge det til at løse dette problem.
### Opgave
@@ -288,13 +288,13 @@ window.onpopstate = () => updateRoute();
updateRoute();
```
-> Bemærk: Vi brugte en [pilesyntaks](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions) her til at erklære vores `popstate`-begivenhedshåndtering for kortfattethed, men en almindelig funktion ville fungere på samme måde.
+> Bemærk: Vi brugte en [arrow-funktion](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions) her til at erklære vores `popstate`-begivenhedshåndtering for kortfattethed, men en almindelig funktion ville fungere på samme måde.
-Her er en genopfriskningsvideo om pilesyntaks:
+Her er en genopfriskningsvideo om arrow-funktioner:
-[](https://youtube.com/watch?v=OP6eEbOj2sc "Pilesyntaks")
+[](https://youtube.com/watch?v=OP6eEbOj2sc "Arrow-funktioner")
-> 🎥 Klik på billedet ovenfor for en video om pilesyntaks.
+> 🎥 Klik på billedet ovenfor for en video om arrow-funktioner.
Prøv nu at bruge tilbage- og fremadknapperne i din browser, og tjek, at den viste rute opdateres korrekt denne gang.
@@ -314,9 +314,9 @@ Routing er en af de overraskende vanskelige dele af webudvikling, især efterhå
## Opgave
-[Forbedr routing](assignment.md)
+[Forbedr routingen](assignment.md)
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/7-bank-project/2-forms/README.md b/translations/da/7-bank-project/2-forms/README.md
index 25a13579..fd15cdfe 100644
--- a/translations/da/7-bank-project/2-forms/README.md
+++ b/translations/da/7-bank-project/2-forms/README.md
@@ -1,8 +1,8 @@
-# Byg en Bankapp Del 4: Koncepter for Tilstandshåndtering
+# Byg en Bankapp Del 4: Koncepter inden for State Management
-## Quiz før Forelæsning
+## Quiz før forelæsning
[Quiz før forelæsning](https://ff-quizzes.netlify.app/web/quiz/47)
### Introduktion
-Når en webapplikation vokser, bliver det en udfordring at holde styr på alle dataflows. Hvilken kode henter data, hvilken side bruger det, hvor og hvornår skal det opdateres... det er nemt at ende med rodet kode, der er svær at vedligeholde. Dette gælder især, når du skal dele data mellem forskellige sider i din app, for eksempel brugerdata. Konceptet *tilstandshåndtering* har altid eksisteret i alle slags programmer, men efterhånden som webapps bliver mere komplekse, er det nu et nøglepunkt at tænke over under udviklingen.
+Når en webapplikation vokser, bliver det en udfordring at holde styr på alle dataflows. Hvilken kode henter data, hvilken side bruger det, hvor og hvornår skal det opdateres...det er nemt at ende med rodet kode, der er svær at vedligeholde. Dette er især tilfældet, når du skal dele data mellem forskellige sider i din app, for eksempel brugerdata. Konceptet *state management* har altid eksisteret i alle slags programmer, men efterhånden som webapps bliver mere komplekse, er det nu et centralt punkt at tænke over under udviklingen.
-I denne sidste del vil vi gennemgå den app, vi har bygget, for at genoverveje, hvordan tilstanden håndteres, så vi kan understøtte browseropdatering på ethvert tidspunkt og bevare data på tværs af brugersessioner.
+I denne sidste del vil vi gennemgå den app, vi har bygget, for at genoverveje, hvordan state håndteres, så vi kan understøtte browseropdatering på ethvert tidspunkt og bevare data på tværs af brugersessioner.
### Forudsætninger
@@ -32,32 +32,32 @@ curl http://localhost:5000/api
---
-## Genovervej tilstandshåndtering
+## Genovervej state management
-I [den forrige lektion](../3-data/README.md) introducerede vi et grundlæggende koncept for tilstand i vores app med den globale `account`-variabel, som indeholder bankdata for den aktuelt loggede bruger. Men vores nuværende implementering har nogle mangler. Prøv at opdatere siden, når du er på dashboardet. Hvad sker der?
+I [den forrige lektion](../3-data/README.md) introducerede vi et grundlæggende koncept for state i vores app med den globale `account`-variabel, som indeholder bankdata for den aktuelt loggede bruger. Men vores nuværende implementering har nogle mangler. Prøv at opdatere siden, når du er på dashboardet. Hvad sker der?
-Der er 3 problemer med den nuværende kode:
+Der er tre problemer med den nuværende kode:
-- Tilstanden gemmes ikke, da en browseropdatering sender dig tilbage til login-siden.
-- Der er flere funktioner, der ændrer tilstanden. Når appen vokser, kan det gøre det svært at holde styr på ændringerne, og det er nemt at glemme at opdatere én.
-- Tilstanden ryddes ikke op, så når du klikker på *Log ud*, er kontodataene stadig der, selvom du er på login-siden.
+- State bliver ikke bevaret, da en browseropdatering sender dig tilbage til login-siden.
+- Der er flere funktioner, der ændrer state. Efterhånden som appen vokser, kan det gøre det svært at spore ændringer, og det er nemt at glemme at opdatere en.
+- State bliver ikke ryddet op, så når du klikker på *Logout*, er kontodata stadig der, selvom du er på login-siden.
-Vi kunne opdatere vores kode for at tackle disse problemer ét ad gangen, men det ville skabe mere kodegentagelse og gøre appen mere kompleks og svær at vedligeholde. Eller vi kunne tage et par minutter og genoverveje vores strategi.
+Vi kunne opdatere vores kode for at tackle disse problemer ét ad gangen, men det ville skabe mere kodegentagelse og gøre appen mere kompleks og svær at vedligeholde. Eller vi kunne tage et øjeblik og genoverveje vores strategi.
> Hvilke problemer prøver vi egentlig at løse her?
-[Tilstandshåndtering](https://en.wikipedia.org/wiki/State_management) handler om at finde en god tilgang til at løse disse to specifikke problemer:
+[State management](https://en.wikipedia.org/wiki/State_management) handler om at finde en god tilgang til at løse disse to specifikke problemer:
- Hvordan holder vi dataflows i en app forståelige?
-- Hvordan holder vi tilstandsdata altid synkroniseret med brugergrænsefladen (og omvendt)?
+- Hvordan holder vi state-data altid i sync med brugergrænsefladen (og omvendt)?
-Når du har taget hånd om disse, kan andre problemer, du måtte have, enten allerede være løst eller være blevet lettere at løse. Der er mange mulige tilgange til at løse disse problemer, men vi vil vælge en almindelig løsning, der består i **at centralisere dataene og måderne at ændre dem på**. Dataflows ville se sådan ud:
+Når du har taget hånd om disse, kan andre problemer enten allerede være løst eller være blevet lettere at løse. Der er mange mulige tilgange til at løse disse problemer, men vi vil vælge en almindelig løsning, der består i **at centralisere data og måderne at ændre dem på**. Dataflows ville se sådan ud:
-
+
-> Vi dækker ikke her den del, hvor data automatisk udløser opdatering af visningen, da det er knyttet til mere avancerede koncepter inden for [Reaktiv Programmering](https://en.wikipedia.org/wiki/Reactive_programming). Det er et godt emne at dykke ned i, hvis du er interesseret.
+> Vi vil ikke dække den del, hvor data automatisk udløser opdatering af visningen, da det er knyttet til mere avancerede koncepter inden for [Reactive Programming](https://en.wikipedia.org/wiki/Reactive_programming). Det er et godt emne til en dybere dykning.
-✅ Der findes mange biblioteker med forskellige tilgange til tilstandshåndtering, hvor [Redux](https://redux.js.org) er en populær mulighed. Tag et kig på de koncepter og mønstre, der bruges, da det ofte er en god måde at lære om potentielle problemer, du kan stå over for i store webapps, og hvordan de kan løses.
+✅ Der findes mange biblioteker med forskellige tilgange til state management, hvor [Redux](https://redux.js.org) er en populær mulighed. Tag et kig på de koncepter og mønstre, der bruges, da det ofte er en god måde at lære om potentielle problemer, du kan stå over for i store webapps, og hvordan de kan løses.
### Opgave
@@ -75,11 +75,11 @@ let state = {
};
```
-Ideen er at *centralisere* alle vores appdata i et enkelt tilstandsobjekt. Vi har kun `account` i tilstanden for nu, så det ændrer ikke meget, men det skaber en vej for fremtidige udvidelser.
+Ideen er at *centralisere* alle vores appdata i et enkelt state-objekt. Vi har kun `account` i state lige nu, så det ændrer ikke meget, men det skaber en vej for fremtidige udvidelser.
-Vi skal også opdatere de funktioner, der bruger det. I `register()`- og `login()`-funktionerne skal du erstatte `account = ...` med `state.account = ...`;
+Vi skal også opdatere de funktioner, der bruger det. I funktionerne `register()` og `login()` skal du erstatte `account = ...` med `state.account = ...`;
-Øverst i `updateDashboard()`-funktionen skal du tilføje denne linje:
+Øverst i funktionen `updateDashboard()` skal du tilføje denne linje:
```js
const account = state.account;
@@ -89,13 +89,13 @@ Denne refaktorering i sig selv har ikke bragt mange forbedringer, men ideen var
## Spor dataændringer
-Nu hvor vi har etableret `state`-objektet til at gemme vores data, er det næste skridt at centralisere opdateringerne. Målet er at gøre det lettere at holde styr på eventuelle ændringer og hvornår de sker.
+Nu hvor vi har oprettet `state`-objektet til at gemme vores data, er næste skridt at centralisere opdateringerne. Målet er at gøre det lettere at holde styr på eventuelle ændringer og hvornår de sker.
-For at undgå, at der foretages ændringer i `state`-objektet, er det også en god praksis at betragte det som [*uforanderligt*](https://en.wikipedia.org/wiki/Immutable_object), hvilket betyder, at det slet ikke kan ændres. Det betyder også, at du skal oprette et nyt tilstandsobjekt, hvis du vil ændre noget i det. Ved at gøre dette bygger du en beskyttelse mod potentielt uønskede [sideeffekter](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) og åbner op for muligheder for nye funktioner i din app, som at implementere fortryd/gendan, samtidig med at det bliver lettere at fejlfinde. For eksempel kunne du logge hver ændring, der foretages i tilstanden, og holde en historik over ændringerne for at forstå kilden til en fejl.
+For at undgå, at der foretages ændringer i `state`-objektet, er det også en god praksis at betragte det som [*immutable*](https://en.wikipedia.org/wiki/Immutable_object), hvilket betyder, at det slet ikke kan ændres. Det betyder også, at du skal oprette et nyt state-objekt, hvis du vil ændre noget i det. Ved at gøre dette bygger du en beskyttelse mod potentielt uønskede [side effects](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) og åbner op for nye funktioner i din app, som f.eks. implementering af undo/redo, samtidig med at det bliver lettere at debugge. For eksempel kunne du logge hver ændring, der foretages i state, og holde en historik over ændringerne for at forstå kilden til en fejl.
-I JavaScript kan du bruge [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) til at oprette en uforanderlig version af et objekt. Hvis du forsøger at foretage ændringer i et uforanderligt objekt, vil der blive rejst en undtagelse.
+I JavaScript kan du bruge [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) til at oprette en immutable version af et objekt. Hvis du forsøger at foretage ændringer i et immutable objekt, vil der blive rejst en undtagelse.
-✅ Kender du forskellen mellem et *shallow* og et *deep* uforanderligt objekt? Du kan læse om det [her](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze).
+✅ Kender du forskellen mellem et *shallow* og et *deep* immutable objekt? Du kan læse om det [her](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze).
### Opgave
@@ -110,9 +110,9 @@ function updateState(property, newData) {
}
```
-I denne funktion opretter vi et nyt tilstandsobjekt og kopierer data fra den tidligere tilstand ved hjælp af [*spread (`...`) operatoren*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Derefter overskriver vi en bestemt egenskab i tilstandsobjektet med de nye data ved hjælp af [bracket notation](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` til tildeling. Til sidst låser vi objektet for at forhindre ændringer ved hjælp af `Object.freeze()`. Vi har kun `account`-egenskaben gemt i tilstanden for nu, men med denne tilgang kan du tilføje så mange egenskaber, som du har brug for i tilstanden.
+I denne funktion opretter vi et nyt state-objekt og kopierer data fra det tidligere state ved hjælp af [*spread (`...`) operatoren*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Derefter overskriver vi en bestemt egenskab i state-objektet med de nye data ved hjælp af [bracket notation](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` til tildeling. Til sidst låser vi objektet for at forhindre ændringer ved hjælp af `Object.freeze()`. Vi har kun egenskaben `account` gemt i state lige nu, men med denne tilgang kan du tilføje så mange egenskaber, som du har brug for i state.
-Vi opdaterer også `state`-initialiseringen for at sikre, at den oprindelige tilstand også er låst:
+Vi opdaterer også `state`-initialiseringen for at sikre, at den oprindelige state også er frosset:
```js
let state = Object.freeze({
@@ -126,13 +126,13 @@ Derefter opdaterer vi `register`-funktionen ved at erstatte `state.account = res
updateState('account', result);
```
-Gør det samme med `login`-funktionen, og erstat `state.account = data;` med:
+Gør det samme med `login`-funktionen ved at erstatte `state.account = data;` med:
```js
updateState('account', data);
```
-Vi benytter nu lejligheden til at løse problemet med, at kontodata ikke ryddes, når brugeren klikker på *Log ud*.
+Vi benytter nu lejligheden til at løse problemet med, at kontodata ikke bliver ryddet, når brugeren klikker på *Logout*.
Opret en ny funktion `logout()`:
@@ -147,45 +147,45 @@ I `updateDashboard()` skal du erstatte omdirigeringen `return navigate('/login')
Prøv at registrere en ny konto, logge ud og logge ind igen for at kontrollere, at alt stadig fungerer korrekt.
-> Tip: Du kan se alle tilstandsændringer ved at tilføje `console.log(state)` nederst i `updateState()` og åbne konsollen i din browsers udviklingsværktøjer.
+> Tip: Du kan se alle state-ændringer ved at tilføje `console.log(state)` nederst i `updateState()` og åbne konsollen i din browsers udviklingsværktøjer.
-## Bevar tilstanden
+## Bevar state
-De fleste webapps har brug for at gemme data for at kunne fungere korrekt. Alle kritiske data gemmes normalt i en database og tilgås via et server-API, som for eksempel brugerens kontodata i vores tilfælde. Men nogle gange er det også interessant at gemme nogle data i klientappen, der kører i din browser, for at give en bedre brugeroplevelse eller forbedre indlæsningsydelsen.
+De fleste webapps har brug for at bevare data for at kunne fungere korrekt. Alle kritiske data gemmes normalt i en database og tilgås via et server-API, som f.eks. brugerens kontodata i vores tilfælde. Men nogle gange kan det også være interessant at bevare nogle data i klientappen, der kører i din browser, for at give en bedre brugeroplevelse eller forbedre indlæsningshastigheden.
-Når du vil gemme data i din browser, er der nogle vigtige spørgsmål, du bør stille dig selv:
+Når du vil bevare data i din browser, er der nogle vigtige spørgsmål, du bør stille dig selv:
-- *Er dataene følsomme?* Du bør undgå at gemme følsomme data på klienten, såsom brugeradgangskoder.
+- *Er dataene følsomme?* Du bør undgå at gemme følsomme data på klienten, såsom brugerens adgangskoder.
- *Hvor længe har du brug for at gemme disse data?* Planlægger du kun at tilgå disse data under den aktuelle session, eller vil du have dem gemt for evigt?
-Der er flere måder at gemme information i en webapp på, afhængigt af hvad du vil opnå. For eksempel kan du bruge URL'er til at gemme en søgeforespørgsel og gøre den delbar mellem brugere. Du kan også bruge [HTTP-cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies), hvis dataene skal deles med serveren, som for eksempel [autentifikations](https://en.wikipedia.org/wiki/Authentication)-information.
+Der er flere måder at gemme information i en webapp på, afhængigt af hvad du vil opnå. For eksempel kan du bruge URL'er til at gemme en søgeforespørgsel og gøre den delbar mellem brugere. Du kan også bruge [HTTP cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies), hvis dataene skal deles med serveren, som f.eks. [autentifikations](https://en.wikipedia.org/wiki/Authentication)-information.
En anden mulighed er at bruge en af de mange browser-API'er til at gemme data. To af dem er særligt interessante:
-- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): en [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database), der gør det muligt at gemme data, der er specifikke for det aktuelle websted, på tværs af forskellige sessioner. De data, der gemmes i den, udløber aldrig.
-- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage): denne fungerer på samme måde som `localStorage`, bortset fra at de data, der gemmes i den, slettes, når sessionen slutter (når browseren lukkes).
+- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): en [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database), der gør det muligt at bevare data, der er specifikke for det aktuelle websted, på tværs af forskellige sessioner. De gemte data udløber aldrig.
+- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage): denne fungerer på samme måde som `localStorage`, bortset fra at de gemte data ryddes, når sessionen slutter (når browseren lukkes).
Bemærk, at begge disse API'er kun tillader at gemme [strings](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String). Hvis du vil gemme komplekse objekter, skal du serialisere dem til [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON)-formatet ved hjælp af [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
-✅ Hvis du vil oprette en webapp, der ikke arbejder med en server, er det også muligt at oprette en database på klienten ved hjælp af [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Denne er forbeholdt avancerede brugsscenarier eller hvis du har brug for at gemme betydelige mængder data, da den er mere kompleks at bruge.
+✅ Hvis du vil oprette en webapp, der ikke arbejder med en server, er det også muligt at oprette en database på klienten ved hjælp af [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Denne er reserveret til avancerede brugsscenarier eller hvis du har brug for at gemme betydelige mængder data, da den er mere kompleks at bruge.
### Opgave
-Vi ønsker, at vores brugere forbliver logget ind, indtil de eksplicit klikker på *Log ud*-knappen, så vi bruger `localStorage` til at gemme kontodata. Først definerer vi en nøgle, som vi vil bruge til at gemme vores data.
+Vi vil gerne have, at vores brugere forbliver logget ind, indtil de eksplicit klikker på *Logout*-knappen, så vi bruger `localStorage` til at gemme kontodata. Først definerer vi en nøgle, som vi vil bruge til at gemme vores data.
```js
const storageKey = 'savedAccount';
```
-Tilføj derefter denne linje i slutningen af `updateState()`-funktionen:
+Tilføj derefter denne linje nederst i `updateState()`-funktionen:
```js
localStorage.setItem(storageKey, JSON.stringify(state.account));
```
-Med dette vil brugerens kontodata blive gemt og altid være opdateret, da vi tidligere centraliserede alle vores tilstandsopdateringer. Det er her, vi begynder at drage fordel af alle vores tidligere refaktoreringer 🙂.
+Med dette vil brugerens kontodata blive bevaret og altid være opdateret, da vi tidligere centraliserede alle vores state-opdateringer. Det er her, vi begynder at drage fordel af alle vores tidligere refaktoreringer 🙂.
-Da dataene gemmes, skal vi også sørge for at gendanne dem, når appen indlæses. Da vi begynder at få mere initialiseringskode, kan det være en god idé at oprette en ny `init`-funktion, der også inkluderer vores tidligere kode nederst i `app.js`:
+Da dataene gemmes, skal vi også tage os af at gendanne dem, når appen indlæses. Da vi begynder at have mere initialiseringskode, kan det være en god idé at oprette en ny `init`-funktion, der også inkluderer vores tidligere kode nederst i `app.js`:
```js
function init() {
@@ -202,15 +202,15 @@ function init() {
init();
```
-Her henter vi de gemte data, og hvis der er nogen, opdaterer vi tilstanden i overensstemmelse hermed. Det er vigtigt at gøre dette *før* opdatering af ruten, da der kan være kode, der afhænger af tilstanden under sideopdateringen.
+Her henter vi de gemte data, og hvis der er nogen, opdaterer vi state tilsvarende. Det er vigtigt at gøre dette *før* opdatering af ruten, da der kan være kode, der afhænger af state under sideopdateringen.
-Vi kan også gøre *Dashboard*-siden til vores applikations standardside, da vi nu gemmer kontodataene. Hvis der ikke findes data, sørger dashboardet for at omdirigere til *Login*-siden alligevel. I `updateRoute()` skal du erstatte fallbacken `return navigate('/login');` med `return navigate('/dashboard');`.
+Vi kan også gøre *Dashboard*-siden til vores applikations standardside, da vi nu bevarer kontodata. Hvis der ikke findes data, sørger dashboardet for at omdirigere til *Login*-siden alligevel. I `updateRoute()` skal du erstatte fallback `return navigate('/login');` med `return navigate('/dashboard');`.
-Log nu ind i appen og prøv at opdatere siden. Du bør forblive på dashboardet. Med den opdatering har vi taget hånd om alle vores oprindelige problemer...
+Log nu ind i appen og prøv at opdatere siden. Du bør forblive på dashboardet. Med denne opdatering har vi taget hånd om alle vores oprindelige problemer...
## Opdater dataene
-...Men vi har måske også skabt et nyt. Ups!
+...Men vi har måske også skabt et nyt problem. Ups!
Gå til dashboardet ved hjælp af `test`-kontoen, og kør derefter denne kommando i en terminal for at oprette en ny transaktion:
@@ -223,9 +223,9 @@ curl --request POST \
Prøv at opdatere dashboard-siden i browseren nu. Hvad sker der? Ser du den nye transaktion?
-Tilstanden gemmes på ubestemt tid takket være `localStorage`, men det betyder også, at den aldrig opdateres, før du logger ud af appen og logger ind igen!
+State bevares på ubestemt tid takket være `localStorage`, men det betyder også, at det aldrig opdateres, før du logger ud af appen og logger ind igen!
-En mulig strategi for at løse det er at genindlæse kontodataene, hver gang dashboardet indlæses, for at undgå forældede data.
+En mulig strategi for at løse dette er at genindlæse kontodataene hver gang dashboardet indlæses, for at undgå forældede data.
### Opgave
@@ -247,9 +247,9 @@ async function updateAccountData() {
}
```
-Denne metode tjekker, at vi i øjeblikket er logget ind, og genindlæser derefter kontodataene fra serveren.
+Denne metode kontrollerer, at vi i øjeblikket er logget ind, og genindlæser derefter kontodataene fra serveren.
-Opret en anden funktion kaldet `refresh`:
+Opret en anden funktion ved navn `refresh`:
```js
async function refresh() {
@@ -258,7 +258,7 @@ async function refresh() {
}
```
-Denne opdaterer kontodataene og tager sig derefter af at opdatere HTML'en på dashboard-siden. Det er den, vi skal kalde, når dashboard-ruten indlæses. Opdater rutedefinitionen med:
+Denne opdaterer kontodataene og sørger derefter for at opdatere HTML'en på dashboard-siden. Det er den, vi skal kalde, når dashboard-ruten indlæses. Opdater rutedefinitionen med:
```js
const routes = {
@@ -267,28 +267,28 @@ const routes = {
};
```
-Prøv at genindlæse dashboardet nu, det bør vise de opdaterede kontodata.
+Prøv at genindlæse dashboardet nu, det burde vise de opdaterede kontodata.
---
## 🚀 Udfordring
-Nu hvor vi genindlæser kontodataene, hver gang dashboardet indlæses, tror du så, at vi stadig har brug for at gemme *alle kontodata*?
+Nu hvor vi genindlæser kontodataene hver gang dashboardet indlæses, tror du, vi stadig har brug for at bevare *alle kontodata*?
-Prøv at arbejde sammen om at ændre, hvad der gemmes og indlæses fra `localStorage`, så det kun inkluderer det, der absolut er nødvendigt for, at appen fungerer.
+Prøv at arbejde sammen om at ændre, hvad der gemmes og hentes fra `localStorage`, så det kun inkluderer det, der er absolut nødvendigt for, at appen fungerer.
+
+## Quiz efter forelæsning
-## Quiz efter Forelæsning
[Quiz efter forelæsning](https://ff-quizzes.netlify.app/web/quiz/48)
## Opgave
+[Implementer "Tilføj transaktion"-dialog](assignment.md)
-[Implementer dialogen "Tilføj transaktion"](assignment.md)
-
-Her er et eksempel på resultatet efter at have fuldført opgaven:
+Her er et eksempelresultat efter at have fuldført opgaven:
-
+
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/8-code-editor/1-using-a-code-editor/README.md b/translations/da/8-code-editor/1-using-a-code-editor/README.md
index b97ec3f7..960f75b8 100644
--- a/translations/da/8-code-editor/1-using-a-code-editor/README.md
+++ b/translations/da/8-code-editor/1-using-a-code-editor/README.md
@@ -1,15 +1,15 @@
# Brug af en kodeeditor
-Denne lektion dækker det grundlæggende i at bruge [VSCode.dev](https://vscode.dev), en webbaseret kodeeditor, så du kan foretage ændringer i din kode og bidrage til et projekt uden at installere noget på din computer.
+Denne lektion dækker det grundlæggende i at bruge [VSCode.dev](https://vscode.dev), en webbaseret kodeeditor, så du kan foretage ændringer i din kode og bidrage til et projekt uden at skulle installere noget på din computer.
## Læringsmål
@@ -25,11 +25,11 @@ Før du begynder, skal du oprette en konto hos [GitHub](https://github.com). Gå
### Introduktion
-En kodeeditor er et essentielt værktøj til at skrive programmer og samarbejde om eksisterende kodeprojekter. Når du forstår det grundlæggende i en editor og hvordan du udnytter dens funktioner, kan du anvende dem, når du skriver kode.
+En kodeeditor er et vigtigt værktøj til at skrive programmer og samarbejde om eksisterende kodeprojekter. Når du forstår det grundlæggende i en editor og hvordan du udnytter dens funktioner, kan du anvende dem, når du skriver kode.
## Kom godt i gang med VSCode.dev
-[VSCode.dev](https://vscode.dev) er en kodeeditor på nettet. Du behøver ikke installere noget for at bruge den, det er ligesom at åbne en hvilken som helst anden hjemmeside. For at komme i gang med editoren skal du åbne følgende link: [https://vscode.dev](https://vscode.dev). Hvis du ikke er logget ind på [GitHub](https://github.com/), skal du følge anvisningerne for at logge ind eller oprette en ny konto og derefter logge ind.
+[VSCode.dev](https://vscode.dev) er en kodeeditor på nettet. Du behøver ikke at installere noget for at bruge den, det er lige så nemt som at åbne en hvilken som helst anden hjemmeside. For at komme i gang med editoren skal du åbne følgende link: [https://vscode.dev](https://vscode.dev). Hvis du ikke er logget ind på [GitHub](https://github.com/), skal du følge vejledningen for at logge ind eller oprette en ny konto og derefter logge ind.
Når editoren er indlæst, bør den se nogenlunde sådan ud:
@@ -37,29 +37,29 @@ Når editoren er indlæst, bør den se nogenlunde sådan ud:
Der er tre hovedsektioner, fra venstre mod højre:
-1. _Aktivitetsbjælken_, som inkluderer nogle ikoner, som forstørrelsesglasset 🔎, tandhjulet ⚙️ og et par andre.
+1. _Aktivitetsbjælken_, som inkluderer nogle ikoner, som for eksempel forstørrelsesglasset 🔎, tandhjulet ⚙️ og et par andre.
2. Den udvidede aktivitetsbjælke, som som standard viser _Explorer_, kaldet _sidebjælken_.
3. Og til sidst kodeområdet til højre.
Klik på hvert af ikonerne for at vise en anden menu. Når du er færdig, skal du klikke på _Explorer_, så du er tilbage, hvor du startede.
-Når du begynder at oprette kode eller ændre eksisterende kode, vil det ske i det største område til højre. Du vil også bruge dette område til at visualisere eksisterende kode, hvilket du vil gøre næste gang.
+Når du begynder at oprette kode eller ændre eksisterende kode, sker det i det største område til højre. Du vil også bruge dette område til at visualisere eksisterende kode, hvilket du vil gøre næste gang.
## Åbn et GitHub-repository
-Det første, du skal gøre, er at åbne et GitHub-repository. Der er flere måder at åbne et repository på. I denne sektion vil du se to forskellige måder, du kan åbne et repository på, så du kan begynde at arbejde med ændringer.
+Det første, du skal gøre, er at åbne et GitHub-repository. Der er flere måder at åbne et repository på. I dette afsnit vil du se to forskellige måder, du kan åbne et repository på, så du kan begynde at arbejde med ændringer.
### 1. Med editoren
-Brug selve editoren til at åbne et fjernrepository. Hvis du går til [VSCode.dev](https://vscode.dev), vil du se en knap med teksten _"Open Remote Repository"_:
+Brug selve editoren til at åbne et eksternt repository. Hvis du går til [VSCode.dev](https://vscode.dev), vil du se en knap med teksten _"Open Remote Repository"_:
-
+
-Du kan også bruge kommandopaletten. Kommandopaletten er en inputboks, hvor du kan skrive et ord, der er en del af en kommando eller handling, for at finde den rigtige kommando at udføre. Brug menuen øverst til venstre, vælg derefter _View_, og vælg _Command Palette_, eller brug følgende tastaturgenvej: Ctrl-Shift-P (på MacOS er det Command-Shift-P).
+Du kan også bruge kommando-paletten. Kommando-paletten er en inputboks, hvor du kan skrive et hvilket som helst ord, der er en del af en kommando eller handling, for at finde den rigtige kommando at udføre. Brug menuen øverst til venstre, vælg derefter _View_, og vælg derefter _Command Palette_, eller brug følgende tastaturgenvej: Ctrl-Shift-P (på MacOS ville det være Command-Shift-P).

-Når menuen åbnes, skal du skrive _open remote repository_ og derefter vælge den første mulighed. Flere repositories, som du er en del af eller har åbnet for nylig, vil blive vist. Du kan også bruge en fuld GitHub-URL til at vælge et. Brug følgende URL og indsæt den i boksen:
+Når menuen åbnes, skal du skrive _open remote repository_ og derefter vælge den første mulighed. Flere repositories, som du er en del af, eller som du for nylig har åbnet, vil blive vist. Du kan også bruge en fuld GitHub-URL til at vælge et. Brug følgende URL og indsæt den i boksen:
```
https://github.com/microsoft/Web-Dev-For-Beginners
@@ -67,9 +67,9 @@ https://github.com/microsoft/Web-Dev-For-Beginners
✅ Hvis det lykkes, vil du se alle filer for dette repository indlæst i teksteditoren.
-### 2. Brug af URL'en
+### 2. Brug af URL
-Du kan også bruge en URL direkte til at indlæse et repository. For eksempel er den fulde URL for det aktuelle repository [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners), men du kan bytte GitHub-domænet med `VSCode.dev/github` og indlæse repositoryet direkte. Den resulterende URL ville være [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners).
+Du kan også bruge en URL direkte til at indlæse et repository. For eksempel er den fulde URL for det aktuelle repository [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners), men du kan erstatte GitHub-domænet med `VSCode.dev/github` og indlæse repositoryet direkte. Den resulterende URL ville være [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners).
## Rediger filer
@@ -77,39 +77,37 @@ Når du har åbnet repositoryet i browseren/vscode.dev, er det næste skridt at
### 1. Opret en ny fil
-Du kan enten oprette en fil inde i en eksisterende mappe eller oprette den i rodkataloget/mappen. For at oprette en ny fil skal du åbne en placering/mappe, hvor du vil gemme filen, og vælge ikonet _'New file ...'_ på aktivitetsbjælken _(venstre)_, give den et navn og trykke på enter.
+Du kan enten oprette en fil i en eksisterende mappe eller oprette den i rodmappen. For at oprette en ny fil skal du åbne den placering/mappe, hvor du vil gemme filen, vælge ikonet _'New file ...'_ på aktivitetsbjælken _(venstre)_, give den et navn og trykke enter.

### 2. Rediger og gem en fil i repositoryet
-Brug af vscode.dev er nyttigt, når du vil foretage hurtige opdateringer af dit projekt uden at skulle indlæse software lokalt.
-For at opdatere din kode skal du klikke på 'Explorer'-ikonet, som også er placeret på aktivitetsbjælken, for at se filer og mapper i repositoryet.
-Vælg en fil for at åbne den i kodeområdet, foretag dine ændringer og gem.
+At bruge vscode.dev er nyttigt, når du hurtigt vil opdatere dit projekt uden at skulle indlæse nogen software lokalt. For at opdatere din kode skal du klikke på 'Explorer'-ikonet, som også findes på aktivitetsbjælken, for at se filer og mapper i repositoryet. Vælg en fil for at åbne den i kodeområdet, foretag dine ændringer og gem.

Når du er færdig med at opdatere dit projekt, skal du vælge ikonet _`source control`_, som indeholder alle de nye ændringer, du har foretaget i dit repository.
-For at se de ændringer, du har foretaget i dit projekt, skal du vælge filerne i mappen `Changes` i den udvidede aktivitetsbjælke. Dette vil åbne et 'Working Tree', hvor du visuelt kan se de ændringer, du har foretaget i filen. Rød viser en udeladelse i projektet, mens grøn angiver en tilføjelse.
+For at se de ændringer, du har foretaget i dit projekt, skal du vælge filen(e) i mappen `Changes` i den udvidede aktivitetsbjælke. Dette åbner et 'Working Tree', så du visuelt kan se de ændringer, du har foretaget i filen. Rød viser en fjernelse fra projektet, mens grøn angiver en tilføjelse.

-Hvis du er tilfreds med de ændringer, du har foretaget, skal du holde musen over mappen `Changes` og klikke på `+`-knappen for at stage ændringerne. At stage betyder simpelthen at forberede dine ændringer til at blive committet til GitHub.
+Hvis du er tilfreds med de ændringer, du har foretaget, skal du holde musen over mappen `Changes` og klikke på `+`-knappen for at stage ændringerne. At stage betyder blot at forberede dine ændringer til at blive committet til GitHub.
-Hvis du derimod ikke er tilfreds med nogle ændringer og vil kassere dem, skal du holde musen over mappen `Changes` og vælge ikonet `undo`.
+Hvis du derimod ikke er tilfreds med nogle ændringer og ønsker at kassere dem, skal du holde musen over mappen `Changes` og vælge ikonet `undo`.
-Derefter skal du skrive en `commit message` _(En beskrivelse af den ændring, du har foretaget i projektet)_, klikke på ikonet `check` for at committe og pushe dine ændringer.
+Derefter skal du skrive en `commit-besked` _(En beskrivelse af den ændring, du har foretaget i projektet)_, klikke på `check-ikonet` for at committe og pushe dine ændringer.
-Når du er færdig med at arbejde på dit projekt, skal du vælge ikonet `hamburger menu` øverst til venstre for at vende tilbage til repositoryet på github.com.
+Når du er færdig med at arbejde på dit projekt, skal du vælge `hamburger-menuikonet` øverst til venstre for at vende tilbage til repositoryet på github.com.

## Brug af udvidelser
-Installation af udvidelser i VSCode giver dig mulighed for at tilføje nye funktioner og tilpasse udviklingsmiljøet i din editor for at forbedre din udviklingsworkflow. Disse udvidelser hjælper dig også med at tilføje understøttelse af flere programmeringssprog og er ofte enten generiske udvidelser eller sprog-specifikke udvidelser.
+At installere udvidelser i VSCode giver dig mulighed for at tilføje nye funktioner og tilpasse udviklingsmiljøet i din editor for at forbedre din udviklingsarbejdsgang. Disse udvidelser hjælper dig også med at tilføje understøttelse af flere programmeringssprog og er ofte enten generiske udvidelser eller sprog-specifikke udvidelser.
-For at gennemse listen over alle tilgængelige udvidelser skal du klikke på ikonet _`Extensions`_ på aktivitetsbjælken og begynde at skrive navnet på udvidelsen i tekstfeltet mærket _'Search Extensions in Marketplace'_.
+For at gennemse listen over alle tilgængelige udvidelser skal du klikke på ikonet _`Extensions`_ på aktivitetsbjælken og begynde at skrive navnet på udvidelsen i tekstfeltet mærket _'Search Extensions in Marketplace'_.
Du vil se en liste over udvidelser, hver med **udvidelsens navn, udgiverens navn, en kort beskrivelse, antal downloads** og **en stjernebedømmelse**.

@@ -122,13 +120,13 @@ Du kan også se alle tidligere installerede udvidelser ved at udvide mappen _`In
For at installere en udvidelse skal du skrive udvidelsens navn i søgefeltet og klikke på den for at se yderligere oplysninger om udvidelsen i kodeområdet, når den vises i den udvidede aktivitetsbjælke.
-Du kan enten klikke på den _blå install-knap_ i den udvidede aktivitetsbjælke for at installere eller bruge install-knappen, der vises i kodeområdet, når du vælger udvidelsen for at indlæse yderligere oplysninger.
+Du kan enten klikke på den _blå installer-knap_ i den udvidede aktivitetsbjælke for at installere eller bruge installer-knappen, der vises i kodeområdet, når du vælger udvidelsen for at indlæse yderligere oplysninger.

### 2. Tilpas udvidelser
-Efter installation af udvidelsen kan du have behov for at ændre dens adfærd og tilpasse den baseret på dine præferencer. For at gøre dette skal du vælge ikonet Extensions, og denne gang vil din udvidelse vises i mappen _Installed_, klikke på _**Gear-ikonet**_ og navigere til _Extensions Setting_.
+Efter installation af udvidelsen kan det være nødvendigt at ændre dens adfærd og tilpasse den baseret på dine præferencer. For at gøre dette skal du vælge ikonet Extensions, og denne gang vil din udvidelse vises i mappen _Installed_, klikke på _**Gear-ikonet**_ og navigere til _Extensions Setting_.

@@ -136,7 +134,7 @@ Efter installation af udvidelsen kan du have behov for at ændre dens adfærd og
Efter installation og brug af din udvidelse tilbyder vscode.dev muligheder for at administrere din udvidelse baseret på forskellige behov. For eksempel kan du vælge at:
-- **Deaktivere:** _(Du deaktiverer midlertidigt en udvidelse, når du ikke længere har brug for den, men ikke vil afinstallere den helt)_
+- **Deaktivere:** _(Du kan midlertidigt deaktivere en udvidelse, når du ikke længere har brug for den, men ikke ønsker at afinstallere den helt)_
Vælg den installerede udvidelse i den udvidede aktivitetsbjælke > klik på Gear-ikonet > vælg 'Disable' eller 'Disable (Workspace)' **ELLER** Åbn udvidelsen i kodeområdet og klik på den blå Disable-knap.
@@ -146,13 +144,13 @@ Efter installation og brug af din udvidelse tilbyder vscode.dev muligheder for a
## Opgave
-[Opret en CV-hjemmeside ved hjælp af vscode.dev](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
+[Opret et CV-websted ved hjælp af vscode.dev](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
## Gennemgang & Selvstudie
-Læs mere om [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) og nogle af dens andre funktioner.
+Læs mere om [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) og nogle af dets andre funktioner.
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/8-code-editor/1-using-a-code-editor/assignment.md b/translations/da/8-code-editor/1-using-a-code-editor/assignment.md
index b9f370fe..5c5126a5 100644
--- a/translations/da/8-code-editor/1-using-a-code-editor/assignment.md
+++ b/translations/da/8-code-editor/1-using-a-code-editor/assignment.md
@@ -1,21 +1,21 @@
-# Opret en CV-hjemmeside ved hjælp af vscode.dev
+# Opret et CV-website ved hjælp af vscode.dev
-_Hvor sejt ville det ikke være, hvis en rekrutterer bad om dit CV, og du sendte dem et link?_ 😎
+_Hvor fedt ville det ikke være, hvis en rekrutterer bad om dit CV, og du sendte dem et link?_ 😎
## Mål
Efter denne opgave vil du lære at:
-- Oprette en hjemmeside til at fremvise dit CV
+- Oprette et website til at fremvise dit CV
### Forudsætninger
@@ -25,7 +25,7 @@ Efter denne opgave vil du lære at:
**Trin 1:** Opret et nyt GitHub-repository og giv det navnet `my-resume`
-**Trin 2** Opret en `index.html`-fil i dit repository. Vi tilføjer mindst én fil direkte på github.com, da du ikke kan åbne et tomt repository på vscode.dev.
+**Trin 2:** Opret en `index.html`-fil i dit repository. Vi tilføjer mindst én fil direkte på github.com, da du ikke kan åbne et tomt repository på vscode.dev.
Klik på linket `creating a new file`, skriv navnet `index.html`, og vælg knappen `Commit new file`.
@@ -33,7 +33,7 @@ Klik på linket `creating a new file`, skriv navnet `index.html`, og vælg knapp
**Trin 3:** Åbn [VSCode.dev](https://vscode.dev) og vælg knappen `Open Remote Repository`.
-Kopier URL'en til det repository, du lige har oprettet til din CV-hjemmeside, og indsæt det i inputfeltet:
+Kopier URL'en til det repository, du lige har oprettet til dit CV-website, og indsæt det i inputfeltet:
_Erstat `your-username` med dit GitHub-brugernavn_
@@ -41,14 +41,14 @@ _Erstat `your-username` med dit GitHub-brugernavn_
https://github.com/your-username/my-resume
```
-✅ Hvis det lykkes, vil du se dit projekt og index.html-filen åbne i teksteditoren i browseren.
+✅ Hvis det lykkes, vil du se dit projekt og `index.html`-filen åbne i teksteditoren i browseren.

-**Trin 4:** Åbn `index.html`-filen, indsæt koden nedenfor i dit kodeområde, og gem.
+**Trin 4:** Åbn `index.html`-filen, indsæt koden nedenfor i kodeområdet, og gem.
- HTML-kode, der styrer indholdet på din CV-hjemmeside.
+ HTML-kode, der styrer indholdet på dit CV-website.
@@ -143,12 +143,12 @@ https://github.com/your-username/my-resume
Tilføj dine CV-oplysninger for at erstatte _pladsholderteksten_ i HTML-koden.
-**Trin 5:** Hold musen over My-Resume-mappen, klik på ikonet `New File ...`, og opret 2 nye filer i dit projekt: `style.css` og `codeswing.json`.
+**Trin 5:** Hold musen over mappen `My-Resume`, klik på ikonet `New File ...`, og opret 2 nye filer i dit projekt: `style.css` og `codeswing.json`.
**Trin 6:** Åbn `style.css`-filen, indsæt koden nedenfor, og gem.
- CSS-kode til at formatere layoutet på siden.
+ CSS-kode til at formatere layoutet på websitet.
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
@@ -217,9 +217,9 @@ Tilføj dine CV-oplysninger for at erstatte _pladsholderteksten_ i HTML-koden.
"styles": []
}
-**Trin 7:** Installer `Codeswing-udvidelsen` for at visualisere CV-hjemmesiden i kodeområdet.
+**Trin 7:** Installer `Codeswing-udvidelsen` for at visualisere CV-websitet i kodeområdet.
-Klik på _`Extensions`_-ikonet på aktivitetslinjen, og skriv Codeswing. Klik enten på den _blå installeringsknap_ på den udvidede aktivitetslinje for at installere eller brug installeringsknappen, der vises i kodeområdet, når du vælger udvidelsen for at indlæse yderligere oplysninger. Umiddelbart efter installationen af udvidelsen, observer ændringerne i dit projekt i kodeområdet 😃
+Klik på ikonet _`Extensions`_ på aktivitetslinjen, og skriv Codeswing. Klik enten på den _blå installer-knap_ på den udvidede aktivitetslinje for at installere eller brug installer-knappen, der vises i kodeområdet, når du vælger udvidelsen for at indlæse yderligere oplysninger. Umiddelbart efter installationen af udvidelsen skal du observere ændringerne i dit projekt i kodeområdet 😃

@@ -227,15 +227,15 @@ Dette er, hvad du vil se på din skærm, efter du har installeret udvidelsen.

-Hvis du er tilfreds med de ændringer, du har lavet, skal du holde musen over `Changes`-mappen og klikke på `+`-knappen for at stage ændringerne.
+Hvis du er tilfreds med de ændringer, du har lavet, skal du holde musen over mappen `Changes` og klikke på `+`-knappen for at stage ændringerne.
-Skriv en commit-besked _(En beskrivelse af de ændringer, du har lavet i projektet)_, og commit dine ændringer ved at klikke på `check`. Når du er færdig med at arbejde på dit projekt, skal du vælge hamburger-menuikonet øverst til venstre for at vende tilbage til repository'et på GitHub.
+Skriv en commit-besked _(En beskrivelse af de ændringer, du har lavet i projektet)_, og commit dine ændringer ved at klikke på `check`. Når du er færdig med at arbejde på dit projekt, skal du vælge hamburgerikonet øverst til venstre for at vende tilbage til repositoryet på GitHub.
-Tillykke 🎉 Du har lige oprettet din CV-hjemmeside ved hjælp af vscode.dev i få trin.
+Tillykke 🎉 Du har lige oprettet dit CV-website ved hjælp af vscode.dev i få trin.
## 🚀 Udfordring
-Åbn et fjernrepository, som du har tilladelse til at foretage ændringer i, og opdater nogle filer. Prøv derefter at oprette en ny branch med dine ændringer og lave en Pull Request.
+Åbn et eksternt repository, som du har tilladelse til at foretage ændringer i, og opdater nogle filer. Prøv derefter at oprette en ny gren med dine ændringer og lave en Pull Request.
## Gennemgang & Selvstudie
@@ -244,4 +244,4 @@ Læs mere om [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?W
---
**Ansvarsfraskrivelse**:
-Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på at sikre nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/9-chat-project/README.md b/translations/da/9-chat-project/README.md
new file mode 100644
index 00000000..98b9ed2d
--- /dev/null
+++ b/translations/da/9-chat-project/README.md
@@ -0,0 +1,389 @@
+
+# Chatprojekt
+
+Dette chatprojekt viser, hvordan man bygger en Chat Assistent ved hjælp af GitHub Models.
+
+Her er, hvordan det færdige projekt ser ud:
+
+
+
+
+
+Lidt kontekst: At bygge chatassistenter ved hjælp af generativ AI er en fantastisk måde at begynde at lære om AI. Det, du vil lære, er at integrere generativ AI i en webapp gennem denne lektion. Lad os komme i gang.
+
+## Forbindelse til generativ AI
+
+Til backend bruger vi GitHub Models. Det er en fremragende tjeneste, der giver dig mulighed for at bruge AI gratis. Gå til dens playground og hent kode, der svarer til det backend-sprog, du har valgt. Her ser det sådan ud på [GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground)
+
+
+
+
+
+Som nævnt skal du vælge fanen "Code" og din valgte runtime.
+
+
+
+
+
+I dette tilfælde vælger vi Python, hvilket betyder, at vi vælger denne kode:
+
+```python
+"""Run this model in Python
+
+> pip install openai
+"""
+import os
+from openai import OpenAI
+
+# To authenticate with the model you will need to generate a personal access token (PAT) in your GitHub settings.
+# Create your PAT token by following instructions here: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
+client = OpenAI(
+ base_url="https://models.github.ai/inference",
+ api_key=os.environ["GITHUB_TOKEN"],
+)
+
+response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": "",
+ },
+ {
+ "role": "user",
+ "content": "What is the capital of France?",
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+)
+
+print(response.choices[0].message.content)
+```
+
+Lad os rydde op i denne kode, så den er genanvendelig:
+
+```python
+def call_llm(prompt: str, system_message: str):
+ response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": system_message,
+ },
+ {
+ "role": "user",
+ "content": prompt,
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+ )
+
+ return response.choices[0].message.content
+```
+
+Med denne funktion `call_llm` kan vi nu tage en prompt og en systemprompt, og funktionen returnerer resultatet.
+
+### Tilpas AI Assistenten
+
+Hvis du vil tilpasse AI-assistenten, kan du specificere, hvordan du vil have den til at opføre sig, ved at udfylde systemprompten som vist her:
+
+```python
+call_llm("Tell me about you", "You're Albert Einstein, you only know of things in the time you were alive")
+```
+
+## Eksponér det via en Web API
+
+Fantastisk, vi har AI-delen klar. Lad os se, hvordan vi kan integrere det i en Web API. Til Web API vælger vi Flask, men enhver webframework burde fungere. Her er koden:
+
+```python
+# api.py
+from flask import Flask, request, jsonify
+from llm import call_llm
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+
+@app.route("/", methods=["GET"])
+def index():
+ return "Welcome to this API. Call POST /hello with 'message': 'my message' as JSON payload"
+
+
+@app.route("/hello", methods=["POST"])
+def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0", port=5000)
+```
+
+Her opretter vi en Flask API og definerer en standardrute "/" og "/chat". Sidstnævnte er beregnet til at blive brugt af vores frontend til at sende spørgsmål til den.
+
+For at integrere *llm.py* skal vi gøre følgende:
+
+- Importere funktionen `call_llm`:
+
+ ```python
+ from llm import call_llm
+ from flask import Flask, request
+ ```
+
+- Kalde den fra "/chat"-ruten:
+
+ ```python
+ @app.route("/hello", methods=["POST"])
+ def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+ ```
+
+ Her parser vi den indkommende anmodning for at hente egenskaben `message` fra JSON-bodyen. Derefter kalder vi LLM med dette kald:
+
+ ```python
+ response = call_llm(message, "You are a helpful assistant")
+
+ # return the response as JSON
+ return jsonify({
+ "response": response
+ })
+ ```
+
+Fantastisk, nu har vi gjort, hvad der er nødvendigt.
+
+### Konfigurer Cors
+
+Vi bør nævne, at vi opsætter noget som CORS, cross-origin resource sharing. Det betyder, at fordi vores backend og frontend vil køre på forskellige porte, skal vi tillade frontenden at kalde backend. Der er et stykke kode i *api.py*, der opsætter dette:
+
+```python
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+```
+
+Lige nu er det sat op til at tillade "*", hvilket er alle oprindelser, og det er lidt usikkert. Vi bør begrænse det, når vi går i produktion.
+
+## Kør dit projekt
+
+Ok, så vi har *llm.py* og *api.py*. Hvordan kan vi få dette til at fungere med en backend? Der er to ting, vi skal gøre:
+
+- Installere afhængigheder:
+
+ ```sh
+ cd backend
+ python -m venv venv
+ source ./venv/bin/activate
+
+ pip install openai flask flask-cors openai
+ ```
+
+- Starte API'en:
+
+ ```sh
+ python api.py
+ ```
+
+ Hvis du er i Codespaces, skal du gå til Ports nederst i editoren, højreklikke på det og klikke på "Port Visibility" og vælge "Public".
+
+### Arbejd på en frontend
+
+Nu hvor vi har en API oppe at køre, lad os oprette en frontend til dette. En helt basal frontend, som vi vil forbedre trinvis. I en *frontend*-mappe skal du oprette følgende:
+
+```text
+backend/
+frontend/
+index.html
+app.js
+styles.css
+```
+
+Lad os starte med **index.html**:
+
+```html
+
+
+
+
+
+
+
+
+
+```
+
+Ovenstående er det absolut minimum, du har brug for til at understøtte et chatvindue, da det består af en textarea, hvor beskeder vil blive vist, et inputfelt til at skrive beskeder og en knap til at sende beskeden til backend. Lad os se på JavaScript i *app.js*.
+
+**app.js**
+
+```js
+// app.js
+
+(function(){
+ // 1. set up elements
+ const messages = document.getElementById("messages");
+ const form = document.getElementById("form");
+ const input = document.getElementById("input");
+
+ const BASE_URL = "change this";
+ const API_ENDPOINT = `${BASE_URL}/hello`;
+
+ // 2. create a function that talks to our backend
+ async function callApi(text) {
+ const response = await fetch(API_ENDPOINT, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ message: text })
+ });
+ let json = await response.json();
+ return json.response;
+ }
+
+ // 3. add response to our textarea
+ function appendMessage(text, role) {
+ const el = document.createElement("div");
+ el.className = `message ${role}`;
+ el.innerHTML = text;
+ messages.appendChild(el);
+ }
+
+ // 4. listen to submit events
+ form.addEventListener("submit", async(e) => {
+ e.preventDefault();
+ // someone clicked the button in the form
+
+ // get input
+ const text = input.value.trim();
+
+ appendMessage(text, "user")
+
+ // reset it
+ input.value = '';
+
+ const reply = await callApi(text);
+
+ // add to messages
+ appendMessage(reply, "assistant");
+
+ })
+})();
+```
+
+Lad os gennemgå koden sektion for sektion:
+
+- 1) Her får vi en reference til alle vores elementer, som vi vil referere til senere i koden.
+- 2) I denne sektion opretter vi en funktion, der bruger den indbyggede `fetch`-metode til at kalde vores backend.
+- 3) `appendMessage` hjælper med at tilføje svar samt det, du som bruger skriver.
+- 4) Her lytter vi til submit-eventet, og vi ender med at læse inputfeltet, placere brugerens besked i textarea, kalde API'en og vise svaret i textarea.
+
+Lad os se på styling næste gang. Her kan du virkelig gå amok og få det til at se ud, som du vil, men her er nogle forslag:
+
+**styles.css**
+
+```
+.message {
+ background: #222;
+ box-shadow: 0 0 0 10px orange;
+ padding: 10px:
+ margin: 5px;
+}
+
+.message.user {
+ background: blue;
+}
+
+.message.assistant {
+ background: grey;
+}
+```
+
+Med disse tre klasser vil du style beskeder forskelligt afhængigt af, om de kommer fra assistenten eller dig som bruger. Hvis du vil have inspiration, kan du tjekke `solution/frontend/styles.css`-mappen.
+
+### Skift Base Url
+
+Der var én ting, vi ikke satte, og det var `BASE_URL`. Dette er ikke kendt, før din backend er startet. For at sætte det:
+
+- Hvis du kører API'en lokalt, skal det sættes til noget som `http://localhost:5000`.
+- Hvis det kører i Codespaces, skal det se ud som "[name]app.github.dev".
+
+## Opgave
+
+Opret din egen mappe *project* med indhold som følger:
+
+```text
+project/
+ frontend/
+ index.html
+ app.js
+ styles.css
+ backend/
+ api.py
+ llm.py
+```
+
+Kopier indholdet fra det, der blev instrueret ovenfor, men føl dig fri til at tilpasse det efter din smag.
+
+## Løsning
+
+[Løsning](./solution/README.md)
+
+## Bonus
+
+Prøv at ændre personligheden af AI-assistenten. Når du kalder `call_llm` i *api.py*, kan du ændre det andet argument til det, du ønsker, for eksempel:
+
+```python
+call_llm(message, "You are Captain Picard")
+```
+
+Ændr også CSS og tekst efter din smag, så lav ændringer i *index.html* og *styles.css*.
+
+## Opsummering
+
+Fantastisk, du har lært fra bunden, hvordan man opretter en personlig assistent ved hjælp af AI. Vi har gjort det ved hjælp af GitHub Models, en backend i Python og en frontend i HTML, CSS og JavaScript.
+
+## Opsætning med Codespaces
+
+- Naviger til: [Web Dev For Beginners repo](https://github.com/microsoft/Web-Dev-For-Beginners)
+- Opret fra en skabelon (sørg for, at du er logget ind på GitHub) i øverste højre hjørne:
+
+ 
+
+- Når du er i dit repo, skal du oprette en Codespace:
+
+ 
+
+ Dette skulle starte et miljø, du nu kan arbejde med.
+
+---
+
+**Ansvarsfraskrivelse**:
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/9-chat-project/solution/README.md b/translations/da/9-chat-project/solution/README.md
new file mode 100644
index 00000000..532fdb63
--- /dev/null
+++ b/translations/da/9-chat-project/solution/README.md
@@ -0,0 +1,55 @@
+
+# Kør kode
+
+## Opsætning
+
+Opret virtuelt miljø
+
+```sh
+cd backend
+python -m venv venv
+source ./venv/bin/activate
+```
+
+## Installer afhængigheder
+
+```sh
+pip install openai flask flask-cors
+```
+
+## Kør API
+
+```sh
+python api.py
+```
+
+## Kør frontend
+
+Sørg for, at du står i frontend-mappen
+
+Find *app.js*, og ændr `BASE_URL` til URL'en for din backend
+
+Kør det
+
+```
+npx http-server -p 8000
+```
+
+Prøv at skrive en besked i chatten, du bør se et svar (forudsat at du kører dette i en Codespace eller har opsat en adgangstoken).
+
+## Opsæt adgangstoken (hvis du ikke kører dette i en Codespace)
+
+Se [Opsæt PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
+
+---
+
+**Ansvarsfraskrivelse**:
+Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.
\ No newline at end of file
diff --git a/translations/da/README.md b/translations/da/README.md
index e93cfe91..2128ec71 100644
--- a/translations/da/README.md
+++ b/translations/da/README.md
@@ -1,8 +1,8 @@
-# Εισαγωγή στις Γλώσσες Προγραμματισμού και τα Εργαλεία του Επαγγέλματος
+# Εισαγωγή στις Γλώσσες Προγραμματισμού και Εργαλεία του Επαγγέλματος
-Αυτό το μάθημα καλύπτει τις βασικές αρχές των γλωσσών προγραμματισμού. Τα θέματα που καλύπτονται εδώ ισχύουν για τις περισσότερες σύγχρονες γλώσσες προγραμματισμού. Στην ενότητα "Εργαλεία του Επαγγέλματος", θα μάθετε για χρήσιμο λογισμικό που σας βοηθά ως προγραμματιστή.
+Αυτό το μάθημα καλύπτει τα βασικά των γλωσσών προγραμματισμού. Τα θέματα που καλύπτονται εδώ ισχύουν για τις περισσότερες σύγχρονες γλώσσες προγραμματισμού σήμερα. Στην ενότητα "Εργαλεία του Επαγγέλματος", θα μάθετε για χρήσιμο λογισμικό που σας βοηθά ως προγραμματιστή.
-
-> Σκίτσο από την [Tomomi Imura](https://twitter.com/girlie_mac)
+
+> Σημειώσεις από [Tomomi Imura](https://twitter.com/girlie_mac)
-## Ερωτηματολόγιο Πριν το Μάθημα
-[Ερωτηματολόγιο Πριν το Μάθημα](https://forms.office.com/r/dru4TE0U9n?origin=lprLink)
+## Ερωτηματολόγιο πριν το μάθημα
+[Ερωτηματολόγιο πριν το μάθημα](https://forms.office.com/r/dru4TE0U9n?origin=lprLink)
## Εισαγωγή
Σε αυτό το μάθημα, θα καλύψουμε:
-- Τι είναι ο προγραμματισμός;
-- Τύποι γλωσσών προγραμματισμού
-- Βασικά στοιχεία ενός προγράμματος
-- Χρήσιμο λογισμικό και εργαλεία για τον επαγγελματία προγραμματιστή
+- Τι είναι ο προγραμματισμός;
+- Τύποι γλωσσών προγραμματισμού
+- Βασικά στοιχεία ενός προγράμματος
+- Χρήσιμο λογισμικό και εργαλεία για τον επαγγελματία προγραμματιστή
> Μπορείτε να παρακολουθήσετε αυτό το μάθημα στο [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon)!
## Τι είναι ο Προγραμματισμός;
-Ο προγραμματισμός (γνωστός και ως κωδικοποίηση) είναι η διαδικασία συγγραφής οδηγιών για μια συσκευή, όπως ένας υπολογιστής ή μια κινητή συσκευή. Γράφουμε αυτές τις οδηγίες με μια γλώσσα προγραμματισμού, η οποία στη συνέχεια ερμηνεύεται από τη συσκευή. Αυτά τα σύνολα οδηγιών μπορεί να αναφέρονται με διάφορα ονόματα, όπως *πρόγραμμα*, *υπολογιστικό πρόγραμμα*, *εφαρμογή (app)* και *εκτελέσιμο αρχείο*.
+Ο προγραμματισμός (γνωστός και ως κωδικοποίηση) είναι η διαδικασία γραφής οδηγιών για μια συσκευή, όπως ένας υπολογιστής ή μια κινητή συσκευή. Γράφουμε αυτές τις οδηγίες με μια γλώσσα προγραμματισμού, η οποία στη συνέχεια ερμηνεύεται από τη συσκευή. Αυτά τα σύνολα οδηγιών μπορεί να αναφέρονται με διάφορα ονόματα, όπως *πρόγραμμα*, *πρόγραμμα υπολογιστή*, *εφαρμογή (app)* και *εκτελέσιμο*.
-Ένα *πρόγραμμα* μπορεί να είναι οτιδήποτε έχει γραφτεί με κώδικα: ιστοσελίδες, παιχνίδια και εφαρμογές κινητών είναι προγράμματα. Αν και είναι δυνατό να δημιουργηθεί ένα πρόγραμμα χωρίς να γραφτεί κώδικας, η υποκείμενη λογική ερμηνεύεται από τη συσκευή και αυτή η λογική πιθανότατα έχει γραφτεί με κώδικα. Ένα πρόγραμμα που *τρέχει* ή *εκτελεί* κώδικα εκτελεί οδηγίες. Η συσκευή με την οποία διαβάζετε αυτό το μάθημα τρέχει ένα πρόγραμμα για να το εμφανίσει στην οθόνη σας.
+Ένα *πρόγραμμα* μπορεί να είναι οτιδήποτε έχει γραφτεί με κώδικα: ιστοσελίδες, παιχνίδια και εφαρμογές κινητών είναι προγράμματα. Παρόλο που είναι δυνατό να δημιουργηθεί ένα πρόγραμμα χωρίς να γραφτεί κώδικας, η υποκείμενη λογική ερμηνεύεται από τη συσκευή και αυτή η λογική πιθανότατα έχει γραφτεί με κώδικα. Ένα πρόγραμμα που *τρέχει* ή *εκτελεί* κώδικα εκτελεί οδηγίες. Η συσκευή που χρησιμοποιείτε για να διαβάσετε αυτό το μάθημα τρέχει ένα πρόγραμμα για να το εμφανίσει στην οθόνη σας.
-✅ Κάντε λίγη έρευνα: Ποιος θεωρείται ότι ήταν ο πρώτος προγραμματιστής υπολογιστών στον κόσμο;
+✅ Κάντε λίγη έρευνα: ποιος θεωρείται ότι ήταν ο πρώτος προγραμματιστής υπολογιστών στον κόσμο;
## Γλώσσες Προγραμματισμού
-Οι γλώσσες προγραμματισμού επιτρέπουν στους προγραμματιστές να γράφουν οδηγίες για μια συσκευή. Οι συσκευές μπορούν να κατανοήσουν μόνο δυαδικό κώδικα (1 και 0), και για *τους περισσότερους* προγραμματιστές αυτός δεν είναι ένας αποδοτικός τρόπος επικοινωνίας. Οι γλώσσες προγραμματισμού είναι το μέσο επικοινωνίας μεταξύ ανθρώπων και υπολογιστών.
+Οι γλώσσες προγραμματισμού επιτρέπουν στους προγραμματιστές να γράφουν οδηγίες για μια συσκευή. Οι συσκευές μπορούν να κατανοήσουν μόνο δυαδικό (1s και 0s), και για *τους περισσότερους* προγραμματιστές αυτός δεν είναι ένας πολύ αποτελεσματικός τρόπος επικοινωνίας. Οι γλώσσες προγραμματισμού είναι το μέσο επικοινωνίας μεταξύ ανθρώπων και υπολογιστών.
Οι γλώσσες προγραμματισμού έχουν διαφορετικές μορφές και μπορεί να εξυπηρετούν διαφορετικούς σκοπούς. Για παράδειγμα, η JavaScript χρησιμοποιείται κυρίως για εφαρμογές ιστού, ενώ η Bash χρησιμοποιείται κυρίως για λειτουργικά συστήματα.
-*Γλώσσες χαμηλού επιπέδου* συνήθως απαιτούν λιγότερα βήματα για να ερμηνεύσει μια συσκευή τις οδηγίες σε σύγκριση με *γλώσσες υψηλού επιπέδου*. Ωστόσο, αυτό που κάνει τις γλώσσες υψηλού επιπέδου δημοφιλείς είναι η αναγνωσιμότητα και η υποστήριξή τους. Η JavaScript θεωρείται γλώσσα υψηλού επιπέδου.
+*Γλώσσες χαμηλού επιπέδου* συνήθως απαιτούν λιγότερα βήματα από *γλώσσες υψηλού επιπέδου* για να ερμηνεύσει μια συσκευή τις οδηγίες. Ωστόσο, αυτό που κάνει τις γλώσσες υψηλού επιπέδου δημοφιλείς είναι η αναγνωσιμότητα και η υποστήριξή τους. Η JavaScript θεωρείται γλώσσα υψηλού επιπέδου.
-Ο παρακάτω κώδικας δείχνει τη διαφορά μεταξύ μιας γλώσσας υψηλού επιπέδου (JavaScript) και μιας γλώσσας χαμηλού επιπέδου (ARM assembly code).
+Ο παρακάτω κώδικας δείχνει τη διαφορά μεταξύ μιας γλώσσας υψηλού επιπέδου με JavaScript και μιας γλώσσας χαμηλού επιπέδου με κώδικα ARM assembly.
```javascript
let number = 10
@@ -89,64 +89,65 @@ back add r0,r1
## Στοιχεία ενός Προγράμματος
-Μια μεμονωμένη οδηγία σε ένα πρόγραμμα ονομάζεται *δήλωση* και συνήθως έχει έναν χαρακτήρα ή διάστημα γραμμής που υποδεικνύει πού τελειώνει ή *τερματίζει*. Ο τρόπος τερματισμού ενός προγράμματος διαφέρει ανάλογα με τη γλώσσα.
+Μια μεμονωμένη οδηγία σε ένα πρόγραμμα ονομάζεται *δήλωση* και συνήθως έχει έναν χαρακτήρα ή διάστημα γραμμής που υποδεικνύει πού τελειώνει ή *τερματίζει* η οδηγία. Ο τρόπος τερματισμού ενός προγράμματος διαφέρει ανάλογα με τη γλώσσα.
-Οι δηλώσεις μέσα σε ένα πρόγραμμα μπορεί να βασίζονται σε δεδομένα που παρέχονται από έναν χρήστη ή από αλλού για να εκτελέσουν οδηγίες. Τα δεδομένα μπορούν να αλλάξουν τη συμπεριφορά ενός προγράμματος, γι' αυτό οι γλώσσες προγραμματισμού διαθέτουν έναν τρόπο προσωρινής αποθήκευσης δεδομένων για μελλοντική χρήση. Αυτά ονομάζονται *μεταβλητές*. Οι μεταβλητές είναι δηλώσεις που δίνουν εντολή σε μια συσκευή να αποθηκεύσει δεδομένα στη μνήμη της. Οι μεταβλητές στα προγράμματα είναι παρόμοιες με τις μεταβλητές στα μαθηματικά, όπου έχουν ένα μοναδικό όνομα και η τιμή τους μπορεί να αλλάξει με την πάροδο του χρόνου.
+Οι δηλώσεις μέσα σε ένα πρόγραμμα μπορεί να βασίζονται σε δεδομένα που παρέχονται από έναν χρήστη ή από αλλού για να εκτελέσουν οδηγίες. Τα δεδομένα μπορούν να αλλάξουν τον τρόπο που συμπεριφέρεται ένα πρόγραμμα, γι' αυτό οι γλώσσες προγραμματισμού διαθέτουν έναν τρόπο προσωρινής αποθήκευσης δεδομένων ώστε να μπορούν να χρησιμοποιηθούν αργότερα. Αυτά ονομάζονται *μεταβλητές*. Οι μεταβλητές είναι δηλώσεις που δίνουν οδηγίες σε μια συσκευή να αποθηκεύσει δεδομένα στη μνήμη της. Οι μεταβλητές στα προγράμματα είναι παρόμοιες με τις μεταβλητές στην άλγεβρα, όπου έχουν ένα μοναδικό όνομα και η τιμή τους μπορεί να αλλάξει με την πάροδο του χρόνου.
-Υπάρχει πιθανότητα ορισμένες δηλώσεις να μην εκτελεστούν από μια συσκευή. Αυτό συνήθως συμβαίνει σκόπιμα από τον προγραμματιστή ή κατά λάθος όταν προκύψει ένα απρόσμενο σφάλμα. Αυτός ο τύπος ελέγχου σε μια εφαρμογή την καθιστά πιο ανθεκτική και ευκολότερη στη συντήρηση. Συνήθως, αυτές οι αλλαγές στον έλεγχο συμβαίνουν όταν πληρούνται ορισμένες συνθήκες. Μια κοινή δήλωση που χρησιμοποιείται στον σύγχρονο προγραμματισμό για τον έλεγχο της εκτέλεσης ενός προγράμματος είναι η δήλωση `if..else`.
+Υπάρχει πιθανότητα κάποιες δηλώσεις να μην εκτελεστούν από μια συσκευή. Αυτό συνήθως γίνεται σκόπιμα όταν γράφεται από τον προγραμματιστή ή κατά λάθος όταν προκύπτει ένα απρόσμενο σφάλμα. Αυτός ο τύπος ελέγχου πάνω σε μια εφαρμογή την καθιστά πιο ανθεκτική και ευκολότερη στη συντήρηση. Συνήθως, αυτές οι αλλαγές στον έλεγχο συμβαίνουν όταν πληρούνται ορισμένες συνθήκες. Μια κοινή δήλωση που χρησιμοποιείται στον σύγχρονο προγραμματισμό για τον έλεγχο του τρόπου λειτουργίας ενός προγράμματος είναι η δήλωση `if..else`.
✅ Θα μάθετε περισσότερα για αυτόν τον τύπο δήλωσης σε επόμενα μαθήματα.
## Εργαλεία του Επαγγέλματος
-[](https://youtube.com/watch?v=69WJeXGBdxg "Εργαλεία του Επαγγέλματος")
+[](https://youtube.com/watch?v=69WJeXGBdxg "Tools of the Trade")
-> 🎥 Κάντε κλικ στην παραπάνω εικόνα για ένα βίντεο σχετικά με τα εργαλεία
+> 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο σχετικά με τα εργαλεία
-Σε αυτή την ενότητα, θα μάθετε για κάποιο λογισμικό που μπορεί να σας φανεί πολύ χρήσιμο καθώς ξεκινάτε το επαγγελματικό σας ταξίδι στον προγραμματισμό.
+Σε αυτή την ενότητα, θα μάθετε για κάποιο λογισμικό που μπορεί να βρείτε πολύ χρήσιμο καθώς ξεκινάτε το επαγγελματικό σας ταξίδι στον προγραμματισμό.
-Ένα **περιβάλλον ανάπτυξης** είναι ένα μοναδικό σύνολο εργαλείων και χαρακτηριστικών που χρησιμοποιεί συχνά ένας προγραμματιστής κατά τη συγγραφή λογισμικού. Μερικά από αυτά τα εργαλεία έχουν προσαρμοστεί για τις συγκεκριμένες ανάγκες ενός προγραμματιστή και μπορεί να αλλάξουν με την πάροδο του χρόνου αν ο προγραμματιστής αλλάξει προτεραιότητες στη δουλειά, στα προσωπικά του έργα ή όταν χρησιμοποιεί διαφορετική γλώσσα προγραμματισμού. Τα περιβάλλοντα ανάπτυξης είναι τόσο μοναδικά όσο και οι προγραμματιστές που τα χρησιμοποιούν.
+Ένα **περιβάλλον ανάπτυξης** είναι ένα μοναδικό σύνολο εργαλείων και χαρακτηριστικών που χρησιμοποιεί συχνά ένας προγραμματιστής κατά τη συγγραφή λογισμικού. Ορισμένα από αυτά τα εργαλεία έχουν προσαρμοστεί για τις συγκεκριμένες ανάγκες ενός προγραμματιστή και μπορεί να αλλάξουν με την πάροδο του χρόνου αν ο προγραμματιστής αλλάξει προτεραιότητες στη δουλειά, στα προσωπικά του έργα ή όταν χρησιμοποιεί διαφορετική γλώσσα προγραμματισμού. Τα περιβάλλοντα ανάπτυξης είναι τόσο μοναδικά όσο και οι προγραμματιστές που τα χρησιμοποιούν.
### Επεξεργαστές Κώδικα
-Ένα από τα πιο κρίσιμα εργαλεία για την ανάπτυξη λογισμικού είναι ο επεξεργαστής κώδικα. Οι επεξεργαστές είναι το μέρος όπου γράφετε τον κώδικά σας και μερικές φορές όπου τον εκτελείτε.
+Ένα από τα πιο κρίσιμα εργαλεία για την ανάπτυξη λογισμικού είναι ο επεξεργαστής κώδικα. Οι επεξεργαστές είναι το μέρος όπου γράφετε τον κώδικά σας και μερικές φορές όπου εκτελείτε τον κώδικά σας.
Οι προγραμματιστές βασίζονται στους επεξεργαστές για μερικούς επιπλέον λόγους:
-- Το *Debugging* βοηθά στον εντοπισμό σφαλμάτων και λαθών, εξετάζοντας τον κώδικα γραμμή προς γραμμή. Μερικοί επεξεργαστές διαθέτουν δυνατότητες debugging, οι οποίες μπορούν να προσαρμοστούν και να προστεθούν για συγκεκριμένες γλώσσες προγραμματισμού.
-- Η *επισήμανση σύνταξης* προσθέτει χρώματα και μορφοποίηση κειμένου στον κώδικα, καθιστώντας τον πιο ευανάγνωστο. Οι περισσότεροι επεξεργαστές επιτρέπουν προσαρμοσμένη επισήμανση σύνταξης.
-- Οι *επεκτάσεις και οι ενσωματώσεις* είναι εξειδικευμένα εργαλεία για προγραμματιστές, φτιαγμένα από προγραμματιστές. Αυτά τα εργαλεία δεν περιλαμβάνονται στον βασικό επεξεργαστή. Για παράδειγμα, πολλοί προγραμματιστές τεκμηριώνουν τον κώδικά τους για να εξηγήσουν πώς λειτουργεί. Μπορεί να εγκαταστήσουν μια επέκταση ορθογραφικού ελέγχου για να εντοπίσουν τυπογραφικά λάθη μέσα στην τεκμηρίωση. Οι περισσότερες επεκτάσεις προορίζονται για χρήση σε έναν συγκεκριμένο επεξεργαστή και οι περισσότεροι επεξεργαστές διαθέτουν έναν τρόπο αναζήτησης διαθέσιμων επεκτάσεων.
-- Η *προσαρμογή* επιτρέπει στους προγραμματιστές να δημιουργήσουν ένα μοναδικό περιβάλλον ανάπτυξης που να ταιριάζει στις ανάγκες τους. Οι περισσότεροι επεξεργαστές είναι εξαιρετικά προσαρμόσιμοι και μπορεί επίσης να επιτρέπουν στους προγραμματιστές να δημιουργούν προσαρμοσμένες επεκτάσεις.
+- *Εντοπισμός σφαλμάτων* βοηθά στην αποκάλυψη σφαλμάτων και λαθών περνώντας τον κώδικα γραμμή προς γραμμή. Ορισμένοι επεξεργαστές διαθέτουν δυνατότητες εντοπισμού σφαλμάτων που μπορούν να προσαρμοστούν και να προστεθούν για συγκεκριμένες γλώσσες προγραμματισμού.
+- *Χρωματική επισήμανση σύνταξης* προσθέτει χρώματα και μορφοποίηση κειμένου στον κώδικα, καθιστώντας τον ευκολότερο στην ανάγνωση. Οι περισσότεροι επεξεργαστές επιτρέπουν προσαρμοσμένη χρωματική επισήμανση σύνταξης.
+- *Επεκτάσεις και Ενσωματώσεις* είναι εξειδικευμένα εργαλεία για προγραμματιστές, από προγραμματιστές. Αυτά τα εργαλεία δεν περιλαμβάνονταν στον βασικό επεξεργαστή. Για παράδειγμα, πολλοί προγραμματιστές τεκμηριώνουν τον κώδικά τους για να εξηγήσουν πώς λειτουργεί. Μπορεί να εγκαταστήσουν μια επέκταση ορθογραφικού ελέγχου για να εντοπίσουν τυπογραφικά λάθη μέσα στην τεκμηρίωση. Οι περισσότερες επεκτάσεις προορίζονται για χρήση μέσα σε έναν συγκεκριμένο επεξεργαστή και οι περισσότεροι επεξεργαστές διαθέτουν έναν τρόπο αναζήτησης διαθέσιμων επεκτάσεων.
+- *Προσαρμογή* επιτρέπει στους προγραμματιστές να δημιουργήσουν ένα μοναδικό περιβάλλον ανάπτυξης που να ταιριάζει στις ανάγκες τους. Οι περισσότεροι επεξεργαστές είναι εξαιρετικά προσαρμόσιμοι και μπορεί επίσης να επιτρέπουν στους προγραμματιστές να δημιουργούν προσαρμοσμένες επεκτάσεις.
#### Δημοφιλείς Επεξεργαστές και Επεκτάσεις για Ανάπτυξη Ιστού
-- [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)
- - [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
- - [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare)
- - [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
-- [Atom](https://atom.io/)
- - [spell-check](https://atom.io/packages/spell-check)
- - [teletype](https://atom.io/packages/teletype)
- - [atom-beautify](https://atom.io/packages/atom-beautify)
-- [Sublimetext](https://www.sublimetext.com/)
- - [emmet](https://emmet.io/)
- - [SublimeLinter](http://www.sublimelinter.com/en/stable/)
+- [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)
+ - [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
+ - [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare)
+ - [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
+- [Atom](https://atom.io/)
+ - [spell-check](https://atom.io/packages/spell-check)
+ - [teletype](https://atom.io/packages/teletype)
+ - [atom-beautify](https://atom.io/packages/atom-beautify)
+
+- [Sublimetext](https://www.sublimetext.com/)
+ - [emmet](https://emmet.io/)
+ - [SublimeLinter](http://www.sublimelinter.com/en/stable/)
### Περιηγητές
-Ένα άλλο κρίσιμο εργαλείο είναι ο περιηγητής. Οι προγραμματιστές ιστού βασίζονται στον περιηγητή για να δουν πώς εκτελείται ο κώδικάς τους στον ιστό. Χρησιμοποιείται επίσης για την εμφάνιση των οπτικών στοιχείων μιας ιστοσελίδας που έχουν γραφτεί στον επεξεργαστή, όπως το HTML.
+Ένα άλλο κρίσιμο εργαλείο είναι ο περιηγητής. Οι προγραμματιστές ιστού βασίζονται στον περιηγητή για να δουν πώς τρέχει ο κώδικάς τους στο διαδίκτυο. Χρησιμοποιείται επίσης για την εμφάνιση των οπτικών στοιχείων μιας ιστοσελίδας που έχουν γραφτεί στον επεξεργαστή, όπως το HTML.
-Πολλοί περιηγητές διαθέτουν *εργαλεία προγραμματιστή* (DevTools) που περιέχουν ένα σύνολο χρήσιμων χαρακτηριστικών και πληροφοριών για να βοηθήσουν τους προγραμματιστές να συλλέξουν και να καταγράψουν σημαντικές πληροφορίες σχετικά με την εφαρμογή τους. Για παράδειγμα: Εάν μια ιστοσελίδα έχει σφάλματα, είναι μερικές φορές χρήσιμο να γνωρίζουμε πότε συνέβησαν. Τα DevTools σε έναν περιηγητή μπορούν να ρυθμιστούν για να καταγράψουν αυτές τις πληροφορίες.
+Πολλοί περιηγητές διαθέτουν *εργαλεία προγραμματιστή* (DevTools) που περιέχουν ένα σύνολο χρήσιμων χαρακτηριστικών και πληροφοριών για να βοηθήσουν τους προγραμματιστές να συλλέξουν και να καταγράψουν σημαντικές πληροφορίες σχετικά με την εφαρμογή τους. Για παράδειγμα: Εάν μια ιστοσελίδα έχει σφάλματα, είναι μερικές φορές χρήσιμο να γνωρίζουμε πότε συνέβησαν. Τα DevTools σε έναν περιηγητή μπορούν να ρυθμιστούν ώστε να καταγράφουν αυτές τις πληροφορίες.
#### Δημοφιλείς Περιηγητές και DevTools
-- [Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)
-- [Chrome](https://developers.google.com/web/tools/chrome-devtools/)
-- [Firefox](https://developer.mozilla.org/docs/Tools)
+- [Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)
+- [Chrome](https://developers.google.com/web/tools/chrome-devtools/)
+- [Firefox](https://developer.mozilla.org/docs/Tools)
### Εργαλεία Γραμμής Εντολών
-Μερικοί προγραμματιστές προτιμούν μια λιγότερο γραφική προσέγγιση για τις καθημερινές τους εργασίες και βασίζονται στη γραμμή εντολών για να το πετύχουν αυτό. Η συγγραφή κώδικα απαιτεί σημαντική ποσότητα πληκτρολόγησης και μερικοί προγραμματιστές προτιμούν να μην διακόπτουν τη ροή τους στο πληκτρολόγιο. Χρησιμοποιούν συντομεύσεις πληκτρολογίου για να εναλλάσσονται μεταξύ παραθύρων επιφάνειας εργασίας, να εργάζονται σε διαφορετικά αρχεία και να χρησιμοποιούν εργαλεία. Οι περισσότερες εργασίες μπορούν να ολοκληρωθούν με το ποντίκι, αλλά ένα πλεονέκτημα της γραμμής εντολών είναι ότι πολλά μπορούν να γίνουν με εργαλεία γραμμής εντολών χωρίς την ανάγκη εναλλαγής μεταξύ ποντικιού και πληκτρολογίου. Ένα άλλο πλεονέκτημα της γραμμής εντολών είναι ότι είναι παραμετροποιήσιμη και μπορείτε να αποθηκεύσετε μια προσαρμοσμένη διαμόρφωση, να την αλλάξετε αργότερα και να την εισαγάγετε σε άλλες μηχανές ανάπτυξης. Επειδή τα περιβάλλοντα ανάπτυξης είναι τόσο μοναδικά για κάθε προγραμματιστή, μερικοί αποφεύγουν τη γραμμή εντολών, άλλοι βασίζονται αποκλειστικά σε αυτήν, ενώ άλλοι προτιμούν έναν συνδυασμό των δύο.
+Ορισμένοι προγραμματιστές προτιμούν μια λιγότερο γραφική προβολή για τις καθημερινές τους εργασίες και βασίζονται στη γραμμή εντολών για να το πετύχουν αυτό. Η γραφή κώδικα απαιτεί σημαντική ποσότητα πληκτρολόγησης και ορισμένοι προγραμματιστές προτιμούν να μην διακόπτουν τη ροή τους στο πληκτρολόγιο. Χρησιμοποιούν συντομεύσεις πληκτρολογίου για να εναλλάσσονται μεταξύ παραθύρων επιφάνειας εργασίας, να εργάζονται σε διαφορετικά αρχεία και να χρησιμοποιούν εργαλεία. Οι περισσότερες εργασίες μπορούν να ολοκληρωθούν με το ποντίκι, αλλά ένα πλεονέκτημα της γραμμής εντολών είναι ότι πολλά μπορούν να γίνουν με εργαλεία γραμμής εντολών χωρίς την ανάγκη εναλλαγής μεταξύ ποντικιού και πληκτρολογίου. Ένα άλλο πλεονέκτημα της γραμμής εντολών είναι ότι είναι παραμετροποιήσιμη και μπορείτε να αποθηκεύσετε μια προσαρμοσμένη ρύθμιση, να την αλλάξετε αργότερα και να την εισαγάγετε σε άλλες μηχανές ανάπτυξης. Επειδή τα περιβάλλοντα ανάπτυξης είναι τόσο μοναδικά για κάθε προγραμματιστή, κάποιοι θα αποφύγουν τη χρήση της γραμμής εντολών, κάποιοι θα βασίζονται αποκλειστικά σε αυτήν και κάποιοι προτιμούν έναν συνδυασμό των δύο.
### Δημοφιλείς Επιλογές Γραμμής Εντολών
@@ -156,40 +157,41 @@ back add r0,r1
#### Windows
-- [Powershell](https://docs.microsoft.com/powershell/scripting/overview?view=powershell-7/?WT.mc_id=academic-77807-sagibbon) 💻
-- [Command Line](https://docs.microsoft.com/windows-server/administration/windows-commands/windows-commands/?WT.mc_id=academic-77807-sagibbon) (γνωστό και ως CMD) 💻
-- [Windows Terminal](https://docs.microsoft.com/windows/terminal/?WT.mc_id=academic-77807-sagibbon)
-- [mintty](https://mintty.github.io/)
-
+- [Powershell](https://docs.microsoft.com/powershell/scripting/overview?view=powershell-7/?WT.mc_id=academic-77807-sagibbon) 💻
+- [Command Line](https://docs.microsoft.com/windows-server/administration/windows-commands/windows-commands/?WT.mc_id=academic-77807-sagibbon) (γνωστό και ως CMD) 💻
+- [Windows Terminal](https://docs.microsoft.com/windows/terminal/?WT.mc_id=academic-77807-sagibbon)
+- [mintty](https://mintty.github.io/)
+
#### MacOS
-- [Terminal](https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/mac) 💻
-- [iTerm](https://iterm2.com/)
-- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
+- [Terminal](https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/mac) 💻
+- [iTerm](https://iterm2.com/)
+- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
#### Linux
-- [Bash](https://www.gnu.org/software/bash/manual/html_node/index.html) 💻
-- [KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)
-- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
+- [Bash](https://www.gnu.org/software/bash/manual/html_node/index.html) 💻
+- [KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)
+- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
#### Δημοφιλή Εργαλεία Γραμμής Εντολών
-- [Git](https://git-scm.com/) (💻 στα περισσότερα λειτουργικά συστήματα)
-- [NPM](https://www.npmjs.com/)
-- [Yarn](https://classic.yarnpkg.com/en/docs/cli/)
+- [Git](https://git-scm.com/) (💻 στα περισσότερα λειτουργικά συστήματα)
+- [NPM](https://www.npmjs.com/)
+- [Yarn](https://classic.yarnpkg.com/en/docs/cli/)
### Τεκμηρίωση
-Όταν ένας προγραμματιστής θέλει να μάθει κάτι νέο, πιθανότατα θα στραφεί στην τεκμηρίωση για να μάθει πώς να το χρησιμοποιεί. Οι προγραμματιστές συχνά βασίζονται στην τεκμηρίωση για να τους καθοδηγήσει σχετικά με τη σωστή χρήση εργαλείων και γλωσσών, αλλά και για να αποκτήσουν βαθύτερη γνώση για το πώς λειτουργούν.
+Όταν ένας προγραμματιστής θέλει να μάθει κάτι νέο, πιθανότατα θα στραφεί στην τεκμηρίωση για να μάθει πώς να το χρησιμοποιήσει. Οι προγραμματιστές συχνά βασίζονται στην τεκμηρίωση για να τους καθοδηγήσει σχετικά με το πώς να χρησιμοποιούν εργαλεία και γλώσσες σωστά, καθώς και για να αποκτήσουν βαθύτερη γνώση του πώς λειτουργούν.
#### Δημοφιλείς Πηγές Τεκμηρίωσης για Ανάπτυξη Ιστού
-- [Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web), από τη Mozilla, τους εκδότες του περιηγητή [Firefox](https://www.mozilla.org/firefox/)
-- [Frontend Masters](https://frontendmasters.com/learn/)
-- [Web.dev](https://web.dev), από τη Google, εκδότες του [Chrome](https://www
+- [Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web), από τη Mozilla, τους εκδότες του περιηγητή [Firefox](https://www.mozilla.org/firefox/)
+- [Frontend Masters](https://frontendmasters.com/learn/)
+- [Web.dev](https://web.dev), από τη Google, εκδότες του [Chrome](https://www.google.com/chrome/)
+- [Microsoft's own developer docs](https://docs.microsoft.com/microsoft-edge/#microsoft-edge-for-developers
---
**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/1-getting-started-lessons/2-github-basics/README.md b/translations/el/1-getting-started-lessons/2-github-basics/README.md
index b4abb8c5..0d1fd78d 100644
--- a/translations/el/1-getting-started-lessons/2-github-basics/README.md
+++ b/translations/el/1-getting-started-lessons/2-github-basics/README.md
@@ -1,8 +1,8 @@
-# Βασικά στοιχεία JavaScript: Τύποι Δεδομένων
+# Βασικά Στοιχεία JavaScript: Τύποι Δεδομένων
-
-> Σημειώσεις από [Tomomi Imura](https://twitter.com/girlie_mac)
+
+> Σκίτσο από την [Tomomi Imura](https://twitter.com/girlie_mac)
-## Ερωτήσεις πριν το μάθημα
-[Ερωτήσεις πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/7)
+## Κουίζ Πριν το Μάθημα
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/)
Αυτό το μάθημα καλύπτει τα βασικά της JavaScript, της γλώσσας που προσφέρει διαδραστικότητα στον ιστό.
@@ -23,22 +23,22 @@ CO_OP_TRANSLATOR_METADATA:
[](https://youtube.com/watch?v=AWfA95eLdq8 "Τύποι Δεδομένων στη JavaScript")
-> 🎥 Κάντε κλικ στις παραπάνω εικόνες για βίντεο σχετικά με τις μεταβλητές και τους τύπους δεδομένων
+> 🎥 Κάντε κλικ στις παραπάνω εικόνες για βίντεο σχετικά με τις μεταβλητές και τους τύπους δεδομένων.
Ας ξεκινήσουμε με τις μεταβλητές και τους τύπους δεδομένων που τις γεμίζουν!
## Μεταβλητές
-Οι μεταβλητές αποθηκεύουν τιμές που μπορούν να χρησιμοποιηθούν και να αλλάξουν καθ' όλη τη διάρκεια του κώδικα σας.
+Οι μεταβλητές αποθηκεύουν τιμές που μπορούν να χρησιμοποιηθούν και να αλλάξουν σε όλο τον κώδικά σας.
-Η δημιουργία και **δήλωση** μιας μεταβλητής έχει την εξής σύνταξη **[λέξη-κλειδί] [όνομα]**. Αποτελείται από δύο μέρη:
+Η δημιουργία και η **δήλωση** μιας μεταβλητής έχει την εξής σύνταξη **[λέξη-κλειδί] [όνομα]**. Αποτελείται από δύο μέρη:
- **Λέξη-κλειδί**. Οι λέξεις-κλειδιά μπορεί να είναι `let` ή `var`.
-✅ Η λέξη-κλειδί `let` εισήχθη στην ES6 και δίνει στη μεταβλητή σας μια λεγόμενη _block scope_. Συνιστάται να χρησιμοποιείτε `let` αντί για `var`. Θα καλύψουμε το block scope πιο αναλυτικά σε επόμενα μέρη.
+✅ Η λέξη-κλειδί `let` εισήχθη στην ES6 και δίνει στη μεταβλητή σας το λεγόμενο _block scope_. Συνιστάται να χρησιμοποιείτε το `let` αντί για το `var`. Θα καλύψουμε τα block scopes πιο αναλυτικά σε επόμενα μέρη.
- **Το όνομα της μεταβλητής**, το οποίο επιλέγετε εσείς.
-### Εργασία - Εργασία με μεταβλητές
+### Εργασία - Εργασία με Μεταβλητές
1. **Δηλώστε μια μεταβλητή**. Ας δηλώσουμε μια μεταβλητή χρησιμοποιώντας τη λέξη-κλειδί `let`:
@@ -46,7 +46,7 @@ CO_OP_TRANSLATOR_METADATA:
let myVariable;
```
- Η `myVariable` έχει τώρα δηλωθεί χρησιμοποιώντας τη λέξη-κλειδί `let`. Προς το παρόν δεν έχει τιμή.
+ Η `myVariable` έχει πλέον δηλωθεί χρησιμοποιώντας τη λέξη-κλειδί `let`. Προς το παρόν δεν έχει τιμή.
1. **Αναθέστε μια τιμή**. Αποθηκεύστε μια τιμή σε μια μεταβλητή με τον τελεστή `=`, ακολουθούμενο από την αναμενόμενη τιμή.
@@ -54,17 +54,17 @@ CO_OP_TRANSLATOR_METADATA:
myVariable = 123;
```
- > Σημείωση: η χρήση του `=` σε αυτό το μάθημα σημαίνει ότι κάνουμε χρήση ενός "τελεστή ανάθεσης", που χρησιμοποιείται για να θέσει μια τιμή σε μια μεταβλητή. Δεν δηλώνει ισότητα.
+ > Σημείωση: η χρήση του `=` σε αυτό το μάθημα σημαίνει ότι χρησιμοποιούμε έναν "τελεστή ανάθεσης", που χρησιμοποιείται για να ορίσει μια τιμή σε μια μεταβλητή. Δεν δηλώνει ισότητα.
- Η `myVariable` έχει τώρα *αρχικοποιηθεί* με την τιμή 123.
+ Η `myVariable` έχει πλέον *αρχικοποιηθεί* με την τιμή 123.
-1. **Αναδιαμορφώστε**. Αντικαταστήστε τον κώδικα σας με την παρακάτω δήλωση.
+1. **Αναδιαμορφώστε**. Αντικαταστήστε τον κώδικά σας με την παρακάτω δήλωση.
```javascript
let myVariable = 123;
```
- Το παραπάνω ονομάζεται _ρητή αρχικοποίηση_ όταν μια μεταβλητή δηλώνεται και της ανατίθεται μια τιμή ταυτόχρονα.
+ Το παραπάνω ονομάζεται _ρητή αρχικοποίηση_, όταν μια μεταβλητή δηλώνεται και της ανατίθεται μια τιμή ταυτόχρονα.
1. **Αλλάξτε την τιμή της μεταβλητής**. Αλλάξτε την τιμή της μεταβλητής με τον εξής τρόπο:
@@ -72,13 +72,13 @@ CO_OP_TRANSLATOR_METADATA:
myVariable = 321;
```
- Μόλις δηλωθεί μια μεταβλητή, μπορείτε να αλλάξετε την τιμή της οποιαδήποτε στιγμή στον κώδικα σας με τον τελεστή `=` και τη νέα τιμή.
+ Μόλις δηλωθεί μια μεταβλητή, μπορείτε να αλλάξετε την τιμή της οποιαδήποτε στιγμή στον κώδικά σας με τον τελεστή `=` και τη νέα τιμή.
- ✅ Δοκιμάστε το! Μπορείτε να γράψετε JavaScript απευθείας στον περιηγητή σας. Ανοίξτε ένα παράθυρο περιηγητή και πλοηγηθείτε στα Εργαλεία Προγραμματιστή. Στην κονσόλα, θα βρείτε μια προτροπή. Πληκτρολογήστε `let myVariable = 123`, πατήστε επιστροφή και στη συνέχεια πληκτρολογήστε `myVariable`. Τι συμβαίνει; Σημειώστε ότι θα μάθετε περισσότερα για αυτές τις έννοιες σε επόμενα μαθήματα.
+ ✅ Δοκιμάστε το! Μπορείτε να γράψετε JavaScript απευθείας στον περιηγητή σας. Ανοίξτε ένα παράθυρο περιηγητή και μεταβείτε στα Εργαλεία Προγραμματιστή. Στην κονσόλα, θα βρείτε μια προτροπή. Πληκτρολογήστε `let myVariable = 123`, πατήστε επιστροφή και στη συνέχεια πληκτρολογήστε `myVariable`. Τι συμβαίνει; Σημειώστε ότι θα μάθετε περισσότερα για αυτές τις έννοιες σε επόμενα μαθήματα.
## Σταθερές
-Η δήλωση και η αρχικοποίηση μιας σταθεράς ακολουθεί τις ίδιες έννοιες με μια μεταβλητή, με την εξαίρεση της λέξης-κλειδί `const`. Οι σταθερές συνήθως δηλώνονται με όλα τα γράμματα κεφαλαία.
+Η δήλωση και η αρχικοποίηση μιας σταθεράς ακολουθεί τις ίδιες έννοιες με μια μεταβλητή, με την εξαίρεση της λέξης-κλειδί `const`. Οι σταθερές δηλώνονται συνήθως με κεφαλαία γράμματα.
```javascript
const MY_VARIABLE = 123;
@@ -86,7 +86,7 @@ const MY_VARIABLE = 123;
Οι σταθερές είναι παρόμοιες με τις μεταβλητές, με δύο εξαιρέσεις:
-- **Πρέπει να έχουν τιμή**. Οι σταθερές πρέπει να αρχικοποιηθούν, αλλιώς θα προκύψει σφάλμα κατά την εκτέλεση του κώδικα.
+- **Πρέπει να έχουν τιμή**. Οι σταθερές πρέπει να αρχικοποιούνται, αλλιώς θα προκύψει σφάλμα κατά την εκτέλεση του κώδικα.
- **Η αναφορά δεν μπορεί να αλλάξει**. Η αναφορά μιας σταθεράς δεν μπορεί να αλλάξει μόλις αρχικοποιηθεί, αλλιώς θα προκύψει σφάλμα κατά την εκτέλεση του κώδικα. Ας δούμε δύο παραδείγματα:
- **Απλή τιμή**. Το παρακάτω ΔΕΝ επιτρέπεται:
@@ -102,7 +102,7 @@ const MY_VARIABLE = 123;
obj = { b: 5 } // not allowed
```
- - **Η τιμή του αντικειμένου δεν προστατεύεται**. Το παρακάτω ΕΠΙΤΡΕΠΕΤΑΙ:
+ - **Η τιμή αντικειμένου δεν προστατεύεται**. Το παρακάτω ΕΠΙΤΡΕΠΕΤΑΙ:
```javascript
const obj = { a: 3 };
@@ -111,51 +111,51 @@ const MY_VARIABLE = 123;
Στο παραπάνω αλλάζετε την τιμή του αντικειμένου αλλά όχι την ίδια την αναφορά, κάτι που το καθιστά επιτρεπτό.
- > Σημείωση, ένα `const` σημαίνει ότι η αναφορά προστατεύεται από επαναπροσδιορισμό. Η τιμή όμως δεν είναι _αμετάβλητη_ και μπορεί να αλλάξει, ειδικά αν είναι μια σύνθετη δομή όπως ένα αντικείμενο.
+ > Σημείωση: μια `const` σημαίνει ότι η αναφορά προστατεύεται από επαναπροσδιορισμό. Ωστόσο, η τιμή δεν είναι _αμετάβλητη_ και μπορεί να αλλάξει, ειδικά αν είναι μια σύνθετη δομή όπως ένα αντικείμενο.
## Τύποι Δεδομένων
-Οι μεταβλητές μπορούν να αποθηκεύουν πολλούς διαφορετικούς τύπους τιμών, όπως αριθμούς και κείμενο. Αυτοί οι διάφοροι τύποι τιμών είναι γνωστοί ως **τύποι δεδομένων**. Οι τύποι δεδομένων είναι ένα σημαντικό μέρος της ανάπτυξης λογισμικού, καθώς βοηθούν τους προγραμματιστές να λαμβάνουν αποφάσεις για το πώς πρέπει να γραφτεί ο κώδικας και πώς πρέπει να λειτουργεί το λογισμικό. Επιπλέον, ορισμένοι τύποι δεδομένων έχουν μοναδικά χαρακτηριστικά που βοηθούν στη μετατροπή ή την εξαγωγή πρόσθετων πληροφοριών από μια τιμή.
+Οι μεταβλητές μπορούν να αποθηκεύουν πολλούς διαφορετικούς τύπους τιμών, όπως αριθμούς και κείμενο. Αυτοί οι διάφοροι τύποι τιμών είναι γνωστοί ως **τύποι δεδομένων**. Οι τύποι δεδομένων είναι ένα σημαντικό μέρος της ανάπτυξης λογισμικού, καθώς βοηθούν τους προγραμματιστές να αποφασίσουν πώς πρέπει να γραφτεί ο κώδικας και πώς πρέπει να λειτουργεί το λογισμικό. Επιπλέον, ορισμένοι τύποι δεδομένων έχουν μοναδικά χαρακτηριστικά που βοηθούν στη μετατροπή ή την εξαγωγή πρόσθετων πληροφοριών από μια τιμή.
-✅ Οι τύποι δεδομένων αναφέρονται επίσης ως πρωτόγονα δεδομένα της JavaScript, καθώς είναι οι χαμηλότερου επιπέδου τύποι δεδομένων που παρέχονται από τη γλώσσα. Υπάρχουν 7 πρωτόγονοι τύποι δεδομένων: string, number, bigint, boolean, undefined, null και symbol. Αφιερώστε ένα λεπτό για να οπτικοποιήσετε τι μπορεί να αντιπροσωπεύει κάθε ένας από αυτούς τους πρωτόγονους τύπους. Τι είναι ένα `zebra`; Τι γίνεται με το `0`; `true`;
+✅ Οι τύποι δεδομένων αναφέρονται επίσης ως πρωτόγονοι τύποι δεδομένων της JavaScript, καθώς είναι οι βασικότεροι τύποι δεδομένων που παρέχονται από τη γλώσσα. Υπάρχουν 7 πρωτόγονοι τύποι δεδομένων: string, number, bigint, boolean, undefined, null και symbol. Αφιερώστε ένα λεπτό για να οπτικοποιήσετε τι μπορεί να αντιπροσωπεύει ο καθένας από αυτούς τους τύπους. Τι είναι ένα `zebra`; Τι γίνεται με το `0`; Το `true`;
### Αριθμοί
-Στην προηγούμενη ενότητα, η τιμή της `myVariable` ήταν ένας τύπος δεδομένων αριθμού.
+Στην προηγούμενη ενότητα, η τιμή της `myVariable` ήταν τύπου δεδομένων αριθμός.
`let myVariable = 123;`
-Οι μεταβλητές μπορούν να αποθηκεύουν όλους τους τύπους αριθμών, συμπεριλαμβανομένων των δεκαδικών ή των αρνητικών αριθμών. Οι αριθμοί μπορούν επίσης να χρησιμοποιηθούν με αριθμητικούς τελεστές, που καλύπτονται στην [επόμενη ενότητα](../../../../2-js-basics/1-data-types).
+Οι μεταβλητές μπορούν να αποθηκεύουν όλους τους τύπους αριθμών, συμπεριλαμβανομένων δεκαδικών ή αρνητικών αριθμών. Οι αριθμοί μπορούν επίσης να χρησιμοποιηθούν με αριθμητικούς τελεστές, που καλύπτονται στην [επόμενη ενότητα](../../../../2-js-basics/1-data-types).
### Αριθμητικοί Τελεστές
-Υπάρχουν διάφοροι τύποι τελεστών για χρήση κατά την εκτέλεση αριθμητικών λειτουργιών, και μερικοί παρατίθενται εδώ:
+Υπάρχουν διάφοροι τύποι τελεστών για τη χρήση αριθμητικών λειτουργιών, και μερικοί από αυτούς παρατίθενται εδώ:
| Σύμβολο | Περιγραφή | Παράδειγμα |
-| ------ | ------------------------------------------------------------------------ | -------------------------------- |
-| `+` | **Πρόσθεση**: Υπολογίζει το άθροισμα δύο αριθμών | `1 + 2 //αναμενόμενη απάντηση είναι 3` |
-| `-` | **Αφαίρεση**: Υπολογίζει τη διαφορά δύο αριθμών | `1 - 2 //αναμενόμενη απάντηση είναι -1` |
-| `*` | **Πολλαπλασιασμός**: Υπολογίζει το γινόμενο δύο αριθμών | `1 * 2 //αναμενόμενη απάντηση είναι 2` |
-| `/` | **Διαίρεση**: Υπολογίζει το πηλίκο δύο αριθμών | `1 / 2 //αναμενόμενη απάντηση είναι 0.5` |
-| `%` | **Υπόλοιπο**: Υπολογίζει το υπόλοιπο από τη διαίρεση δύο αριθμών | `1 % 2 //αναμενόμενη απάντηση είναι 1` |
+| ------ | --------------------------------------------------------------------- | ----------------------------------- |
+| `+` | **Πρόσθεση**: Υπολογίζει το άθροισμα δύο αριθμών | `1 + 2 //αναμενόμενη απάντηση είναι 3` |
+| `-` | **Αφαίρεση**: Υπολογίζει τη διαφορά δύο αριθμών | `1 - 2 //αναμενόμενη απάντηση είναι -1` |
+| `*` | **Πολλαπλασιασμός**: Υπολογίζει το γινόμενο δύο αριθμών | `1 * 2 //αναμενόμενη απάντηση είναι 2` |
+| `/` | **Διαίρεση**: Υπολογίζει το πηλίκο δύο αριθμών | `1 / 2 //αναμενόμενη απάντηση είναι 0.5` |
+| `%` | **Υπόλοιπο**: Υπολογίζει το υπόλοιπο από τη διαίρεση δύο αριθμών | `1 % 2 //αναμενόμενη απάντηση είναι 1` |
✅ Δοκιμάστε το! Δοκιμάστε μια αριθμητική πράξη στην κονσόλα του περιηγητή σας. Σας εκπλήσσουν τα αποτελέσματα;
-### Strings
+### Συμβολοσειρές
-Τα strings είναι σύνολα χαρακτήρων που βρίσκονται ανάμεσα σε μονά ή διπλά εισαγωγικά.
+Οι συμβολοσειρές είναι σύνολα χαρακτήρων που βρίσκονται ανάμεσα σε μονά ή διπλά εισαγωγικά.
-- `'Αυτό είναι ένα string'`
-- `"Αυτό είναι επίσης ένα string"`
-- `let myString = 'Αυτή είναι μια τιμή string αποθηκευμένη σε μια μεταβλητή';`
+- `'Αυτή είναι μια συμβολοσειρά'`
+- `"Αυτή είναι επίσης μια συμβολοσειρά"`
+- `let myString = 'Αυτή είναι μια τιμή συμβολοσειράς αποθηκευμένη σε μια μεταβλητή';`
-Θυμηθείτε να χρησιμοποιείτε εισαγωγικά όταν γράφετε ένα string, αλλιώς η JavaScript θα υποθέσει ότι είναι όνομα μεταβλητής.
+Θυμηθείτε να χρησιμοποιείτε εισαγωγικά όταν γράφετε μια συμβολοσειρά, αλλιώς η JavaScript θα υποθέσει ότι είναι όνομα μεταβλητής.
-### Μορφοποίηση Strings
+### Μορφοποίηση Συμβολοσειρών
-Τα strings είναι κείμενα και θα απαιτήσουν μορφοποίηση κατά καιρούς.
+Οι συμβολοσειρές είναι κειμενικές και θα χρειαστούν μορφοποίηση κατά καιρούς.
-Για να **συνενώσετε** δύο ή περισσότερα strings, ή να τα ενώσετε, χρησιμοποιήστε τον τελεστή `+`.
+Για να **συνενώσετε** δύο ή περισσότερες συμβολοσειρές, ή να τις ενώσετε, χρησιμοποιήστε τον τελεστή `+`.
```javascript
let myString1 = "Hello";
@@ -169,7 +169,7 @@ myString1 + ", " + myString2 + "!"; //Hello, World!
✅ Γιατί το `1 + 1 = 2` στη JavaScript, αλλά το `'1' + '1' = 11`; Σκεφτείτε το. Τι γίνεται με το `'1' + 1`;
-**Template literals** είναι ένας άλλος τρόπος μορφοποίησης strings, εκτός από τα εισαγωγικά, χρησιμοποιείται το backtick. Οτιδήποτε δεν είναι απλό κείμενο πρέπει να τοποθετηθεί μέσα σε placeholders `${ }`. Αυτό περιλαμβάνει οποιεσδήποτε μεταβλητές που μπορεί να είναι strings.
+**Template literals** είναι ένας άλλος τρόπος μορφοποίησης συμβολοσειρών, εκτός από τα εισαγωγικά, χρησιμοποιώντας το backtick. Οτιδήποτε δεν είναι απλό κείμενο πρέπει να τοποθετείται μέσα σε placeholders `${ }`. Αυτό περιλαμβάνει οποιεσδήποτε μεταβλητές που μπορεί να είναι συμβολοσειρές.
```javascript
let myString1 = "Hello";
@@ -179,27 +179,27 @@ let myString2 = "World";
`${myString1}, ${myString2}!` //Hello, World!
```
-Μπορείτε να επιτύχετε τους στόχους μορφοποίησης σας με οποιαδήποτε μέθοδο, αλλά τα template literals θα σεβαστούν τυχόν κενά και αλλαγές γραμμής.
+Μπορείτε να επιτύχετε τους στόχους μορφοποίησής σας με οποιαδήποτε μέθοδο, αλλά τα template literals θα διατηρήσουν τυχόν κενά και αλλαγές γραμμής.
-✅ Πότε θα χρησιμοποιούσατε ένα template literal αντί για ένα απλό string;
+✅ Πότε θα χρησιμοποιούσατε ένα template literal αντί για μια απλή συμβολοσειρά;
### Booleans
-Τα Booleans μπορούν να έχουν μόνο δύο τιμές: `true` ή `false`. Τα Booleans μπορούν να βοηθήσουν στη λήψη αποφάσεων για το ποιες γραμμές κώδικα πρέπει να εκτελεστούν όταν πληρούνται ορισμένες συνθήκες. Σε πολλές περιπτώσεις, οι [τελεστές](../../../../2-js-basics/1-data-types) βοηθούν στον καθορισμό της τιμής ενός Boolean και συχνά θα παρατηρήσετε και θα γράψετε μεταβλητές που αρχικοποιούνται ή οι τιμές τους ενημερώνονται με έναν τελεστή.
+Τα Booleans μπορούν να έχουν μόνο δύο τιμές: `true` ή `false`. Τα Booleans μπορούν να βοηθήσουν στη λήψη αποφάσεων σχετικά με το ποιες γραμμές κώδικα πρέπει να εκτελούνται όταν πληρούνται ορισμένες συνθήκες. Σε πολλές περιπτώσεις, οι [τελεστές](../../../../2-js-basics/1-data-types) βοηθούν στον καθορισμό της τιμής ενός Boolean και συχνά θα παρατηρήσετε και θα γράφετε μεταβλητές που αρχικοποιούνται ή των οποίων οι τιμές ενημερώνονται με έναν τελεστή.
- `let myTrueBool = true`
- `let myFalseBool = false`
-✅ Μια μεταβλητή μπορεί να θεωρηθεί 'truthy' αν αξιολογείται ως boolean `true`. Ενδιαφέρον είναι ότι στη JavaScript, [όλες οι τιμές είναι truthy εκτός αν οριστούν ως falsy](https://developer.mozilla.org/docs/Glossary/Truthy).
+✅ Μια μεταβλητή μπορεί να θεωρηθεί 'truthy' αν αξιολογείται ως boolean `true`. Ενδιαφέρον είναι ότι στη JavaScript, [όλες οι τιμές είναι truthy εκτός αν ορίζονται ως falsy](https://developer.mozilla.org/docs/Glossary/Truthy).
---
## 🚀 Πρόκληση
-Η JavaScript είναι γνωστή για τους εκπληκτικούς τρόπους χειρισμού των τύπων δεδομένων κατά καιρούς. Κάντε λίγη έρευνα για αυτά τα 'παγίδες'. Για παράδειγμα: η ευαισθησία σε πεζά-κεφαλαία μπορεί να σας μπερδέψει! Δοκιμάστε αυτό στην κονσόλα σας: `let age = 1; let Age = 2; age == Age` (αποδίδει `false` -- γιατί;). Τι άλλες παγίδες μπορείτε να βρείτε;
+Η JavaScript είναι γνωστή για τους εκπληκτικούς τρόπους με τους οποίους χειρίζεται τους τύπους δεδομένων κατά καιρούς. Κάντε λίγη έρευνα για αυτά τα 'παγίδες'. Για παράδειγμα: η ευαισθησία πεζών-κεφαλαίων μπορεί να σας μπερδέψει! Δοκιμάστε αυτό στην κονσόλα σας: `let age = 1; let Age = 2; age == Age` (αποδίδει `false` -- γιατί;). Τι άλλες παγίδες μπορείτε να βρείτε;
-## Ερωτήσεις μετά το μάθημα
-[Ερωτήσεις μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/8)
+## Κουίζ Μετά το Μάθημα
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app)
## Ανασκόπηση & Αυτομελέτη
@@ -207,7 +207,7 @@ let myString2 = "World";
## Εργασία
-[Εξάσκηση στους Τύπους Δεδομένων](assignment.md)
+[Άσκηση Τύπων Δεδομένων](assignment.md)
---
diff --git a/translations/el/2-js-basics/2-functions-methods/README.md b/translations/el/2-js-basics/2-functions-methods/README.md
index 83d5d4a7..bb97ba42 100644
--- a/translations/el/2-js-basics/2-functions-methods/README.md
+++ b/translations/el/2-js-basics/2-functions-methods/README.md
@@ -1,23 +1,23 @@
# Βασικά στοιχεία JavaScript: Μέθοδοι και Συναρτήσεις
-
+
> Σημειώσεις από [Tomomi Imura](https://twitter.com/girlie_mac)
## Ερωτηματολόγιο πριν το μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/9)
+[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app)
-Όταν σκεφτόμαστε να γράψουμε κώδικα, θέλουμε πάντα να διασφαλίσουμε ότι είναι ευανάγνωστος. Παρόλο που αυτό μπορεί να ακούγεται αντιφατικό, ο κώδικας διαβάζεται πολύ περισσότερες φορές από όσες γράφεται. Ένα βασικό εργαλείο στο "οπλοστάσιο" ενός προγραμματιστή για να διασφαλίσει ότι ο κώδικας είναι συντηρήσιμος είναι η **συνάρτηση**.
+Όταν σκεφτόμαστε να γράψουμε κώδικα, θέλουμε πάντα να διασφαλίσουμε ότι είναι ευανάγνωστος. Παρόλο που αυτό ακούγεται αντιφατικό, ο κώδικας διαβάζεται πολύ περισσότερες φορές από όσες γράφεται. Ένα βασικό εργαλείο στο οπλοστάσιο ενός προγραμματιστή για να διασφαλίσει ότι ο κώδικας είναι συντηρήσιμος είναι η **συνάρτηση**.
-[](https://youtube.com/watch?v=XgKsD6Zwvlc "Methods and Functions")
+[](https://youtube.com/watch?v=XgKsD6Zwvlc "Μέθοδοι και Συναρτήσεις")
> 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο σχετικά με τις μεθόδους και τις συναρτήσεις.
@@ -27,7 +27,7 @@ CO_OP_TRANSLATOR_METADATA:
Στον πυρήνα της, μια συνάρτηση είναι ένα μπλοκ κώδικα που μπορούμε να εκτελέσουμε κατά παραγγελία. Αυτό είναι ιδανικό για σενάρια όπου χρειάζεται να εκτελέσουμε την ίδια εργασία πολλές φορές. Αντί να αντιγράφουμε τη λογική σε πολλαπλές τοποθεσίες (κάτι που θα δυσκόλευε την ενημέρωση όταν έρθει η ώρα), μπορούμε να την κεντροποιήσουμε σε μία τοποθεσία και να την καλούμε όποτε χρειάζεται να εκτελεστεί η λειτουργία - μπορούμε ακόμη και να καλούμε συναρτήσεις από άλλες συναρτήσεις!
-Εξίσου σημαντική είναι η δυνατότητα να δώσουμε όνομα σε μια συνάρτηση. Παρόλο που αυτό μπορεί να φαίνεται ασήμαντο, το όνομα παρέχει έναν γρήγορο τρόπο τεκμηρίωσης ενός τμήματος κώδικα. Μπορείτε να το σκεφτείτε σαν μια ετικέτα σε ένα κουμπί. Αν κάνω κλικ σε ένα κουμπί που γράφει "Ακύρωση χρονομέτρησης", ξέρω ότι θα σταματήσει να τρέχει το χρονόμετρο.
+Εξίσου σημαντική είναι η δυνατότητα να δώσουμε όνομα σε μια συνάρτηση. Παρόλο που αυτό μπορεί να φαίνεται ασήμαντο, το όνομα παρέχει έναν γρήγορο τρόπο τεκμηρίωσης ενός τμήματος του κώδικα. Μπορείτε να το σκεφτείτε σαν μια ετικέτα σε ένα κουμπί. Αν κάνω κλικ σε ένα κουμπί που γράφει "Ακύρωση χρονομέτρησης", ξέρω ότι θα σταματήσει να τρέχει το χρονόμετρο.
## Δημιουργία και κλήση συνάρτησης
@@ -47,28 +47,28 @@ function displayGreeting() {
}
```
-Όποτε θέλουμε να καλέσουμε (ή να ενεργοποιήσουμε) τη συνάρτηση μας, χρησιμοποιούμε το όνομα της συνάρτησης ακολουθούμενο από `()`. Αξίζει να σημειωθεί ότι η συνάρτηση μας μπορεί να οριστεί πριν ή μετά την απόφαση να την καλέσουμε. Ο μεταγλωττιστής της JavaScript θα την βρει για εσάς.
+Όποτε θέλουμε να καλέσουμε (ή να ενεργοποιήσουμε) τη συνάρτησή μας, χρησιμοποιούμε το όνομα της συνάρτησης ακολουθούμενο από `()`. Αξίζει να σημειωθεί ότι η συνάρτησή μας μπορεί να οριστεί πριν ή μετά την απόφαση να την καλέσουμε. Ο μεταγλωττιστής της JavaScript θα την βρει για εσάς.
```javascript
// calling our function
displayGreeting();
```
-> **NOTE:** Υπάρχει ένας ειδικός τύπος συνάρτησης γνωστός ως **μέθοδος**, τον οποίο ήδη χρησιμοποιείτε! Στην πραγματικότητα, το είδαμε στο παράδειγμα μας παραπάνω όταν χρησιμοποιήσαμε `console.log`. Αυτό που διαφοροποιεί μια μέθοδο από μια συνάρτηση είναι ότι η μέθοδος συνδέεται με ένα αντικείμενο (`console` στο παράδειγμα μας), ενώ η συνάρτηση είναι ανεξάρτητη. Θα ακούσετε πολλούς προγραμματιστές να χρησιμοποιούν αυτούς τους όρους εναλλακτικά.
+> **NOTE:** Υπάρχει ένας ειδικός τύπος συνάρτησης γνωστός ως **μέθοδος**, τον οποίο ήδη χρησιμοποιείτε! Στην πραγματικότητα, το είδαμε στο παράδειγμά μας παραπάνω όταν χρησιμοποιήσαμε `console.log`. Αυτό που διαφοροποιεί μια μέθοδο από μια συνάρτηση είναι ότι η μέθοδος συνδέεται με ένα αντικείμενο (`console` στο παράδειγμά μας), ενώ η συνάρτηση είναι ανεξάρτητη. Θα ακούσετε πολλούς προγραμματιστές να χρησιμοποιούν αυτούς τους όρους εναλλακτικά.
### Καλές πρακτικές για συναρτήσεις
Υπάρχουν μερικές καλές πρακτικές που πρέπει να έχετε υπόψη όταν δημιουργείτε συναρτήσεις:
-- Όπως πάντα, χρησιμοποιήστε περιγραφικά ονόματα ώστε να ξέρετε τι θα κάνει η συνάρτηση.
-- Χρησιμοποιήστε **camelCasing** για να συνδυάσετε λέξεις.
-- Κρατήστε τις συναρτήσεις σας επικεντρωμένες σε μια συγκεκριμένη εργασία.
+- Όπως πάντα, χρησιμοποιήστε περιγραφικά ονόματα ώστε να ξέρετε τι κάνει η συνάρτηση
+- Χρησιμοποιήστε **camelCasing** για να συνδυάσετε λέξεις
+- Κρατήστε τις συναρτήσεις σας επικεντρωμένες σε μια συγκεκριμένη εργασία
## Μεταβίβαση πληροφοριών σε μια συνάρτηση
-Για να κάνετε μια συνάρτηση πιο επαναχρησιμοποιήσιμη, συχνά θέλετε να της μεταβιβάσετε πληροφορίες. Αν σκεφτούμε το παράδειγμα `displayGreeting` παραπάνω, θα εμφανίζει μόνο **Hello, world!**. Δεν είναι η πιο χρήσιμη συνάρτηση που θα μπορούσε να δημιουργηθεί. Αν θέλουμε να την κάνουμε λίγο πιο ευέλικτη, όπως να επιτρέψουμε σε κάποιον να καθορίσει το όνομα του ατόμου που θα χαιρετήσει, μπορούμε να προσθέσουμε μια **παράμετρο**. Μια παράμετρος (που μερικές φορές ονομάζεται και **όρισμα**) είναι πρόσθετες πληροφορίες που στέλνονται σε μια συνάρτηση.
+Για να κάνετε μια συνάρτηση πιο επαναχρησιμοποιήσιμη, συχνά θέλετε να της μεταβιβάσετε πληροφορίες. Αν εξετάσουμε το παράδειγμα `displayGreeting` παραπάνω, θα εμφανίζει μόνο **Hello, world!**. Όχι και η πιο χρήσιμη συνάρτηση που θα μπορούσε να δημιουργηθεί. Αν θέλουμε να την κάνουμε λίγο πιο ευέλικτη, όπως να επιτρέψουμε σε κάποιον να καθορίσει το όνομα του ατόμου που θα χαιρετήσει, μπορούμε να προσθέσουμε μια **παράμετρο**. Μια παράμετρος (που μερικές φορές ονομάζεται και **όρισμα**) είναι πρόσθετες πληροφορίες που στέλνονται σε μια συνάρτηση.
-Οι παράμετροι αναφέρονται στο τμήμα ορισμού μέσα σε παρενθέσεις και χωρίζονται με κόμμα όπως φαίνεται παρακάτω:
+Οι παράμετροι αναφέρονται στο τμήμα ορισμού μέσα σε παρενθέσεις και χωρίζονται με κόμμα, όπως φαίνεται παρακάτω:
```javascript
function name(param, param2, param3) {
@@ -85,7 +85,7 @@ function displayGreeting(name) {
}
```
-Όταν θέλουμε να καλέσουμε τη συνάρτηση μας και να περάσουμε την παράμετρο, την καθορίζουμε μέσα στις παρενθέσεις.
+Όταν θέλουμε να καλέσουμε τη συνάρτηση και να περάσουμε την παράμετρο, την καθορίζουμε μέσα στις παρενθέσεις.
```javascript
displayGreeting('Christopher');
@@ -94,7 +94,7 @@ displayGreeting('Christopher');
## Προεπιλεγμένες τιμές
-Μπορούμε να κάνουμε τη συνάρτηση μας ακόμη πιο ευέλικτη προσθέτοντας περισσότερες παραμέτρους. Αλλά τι γίνεται αν δεν θέλουμε να απαιτείται κάθε τιμή να καθορίζεται; Συνεχίζοντας με το παράδειγμα του χαιρετισμού, θα μπορούσαμε να αφήσουμε το όνομα ως απαραίτητο (χρειαζόμαστε να ξέρουμε ποιον χαιρετάμε), αλλά να επιτρέψουμε ο χαιρετισμός να προσαρμόζεται όπως επιθυμεί κάποιος. Αν κάποιος δεν θέλει να τον προσαρμόσει, παρέχουμε μια προεπιλεγμένη τιμή. Για να παρέχουμε μια προεπιλεγμένη τιμή σε μια παράμετρο, την ορίζουμε με τον ίδιο τρόπο που ορίζουμε μια τιμή για μια μεταβλητή - `parameterName = 'defaultValue'`. Για να δείτε ένα πλήρες παράδειγμα:
+Μπορούμε να κάνουμε τη συνάρτησή μας ακόμη πιο ευέλικτη προσθέτοντας περισσότερες παραμέτρους. Αλλά τι γίνεται αν δεν θέλουμε να απαιτείται κάθε τιμή να καθορίζεται; Συνεχίζοντας με το παράδειγμα του χαιρετισμού, θα μπορούσαμε να αφήσουμε το όνομα ως απαραίτητο (χρειαζόμαστε να ξέρουμε ποιον χαιρετάμε), αλλά να επιτρέψουμε ο χαιρετισμός να προσαρμόζεται όπως επιθυμεί κάποιος. Αν κάποιος δεν θέλει να τον προσαρμόσει, παρέχουμε μια προεπιλεγμένη τιμή. Για να παρέχουμε μια προεπιλεγμένη τιμή σε μια παράμετρο, την ορίζουμε όπως ακριβώς ορίζουμε μια τιμή για μια μεταβλητή - `parameterName = 'defaultValue'`. Για να δείτε ένα πλήρες παράδειγμα:
```javascript
function displayGreeting(name, salutation='Hello') {
@@ -116,15 +116,15 @@ displayGreeting('Christopher', 'Hi');
Μέχρι τώρα, η συνάρτηση που δημιουργήσαμε θα εμφανίζει πάντα αποτελέσματα στην [κονσόλα](https://developer.mozilla.org/docs/Web/API/console). Μερικές φορές αυτό μπορεί να είναι ακριβώς αυτό που ψάχνουμε, ειδικά όταν δημιουργούμε συναρτήσεις που θα καλούν άλλες υπηρεσίες. Αλλά τι γίνεται αν θέλω να δημιουργήσω μια βοηθητική συνάρτηση για να εκτελέσω έναν υπολογισμό και να παρέχω την τιμή πίσω ώστε να μπορώ να τη χρησιμοποιήσω αλλού;
-Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας μια **τιμή επιστροφής**. Μια τιμή επιστροφής επιστρέφεται από τη συνάρτηση και μπορεί να αποθηκευτεί σε μια μεταβλητή με τον ίδιο τρόπο που θα μπορούσαμε να αποθηκεύσουμε μια στατική τιμή όπως μια συμβολοσειρά ή έναν αριθμό.
+Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας μια **τιμή επιστροφής**. Μια τιμή επιστροφής επιστρέφεται από τη συνάρτηση και μπορεί να αποθηκευτεί σε μια μεταβλητή όπως ακριβώς θα μπορούσαμε να αποθηκεύσουμε μια στατική τιμή, όπως μια συμβολοσειρά ή έναν αριθμό.
-Αν μια συνάρτηση επιστρέφει κάτι, τότε χρησιμοποιείται η λέξη-κλειδί `return`. Η λέξη-κλειδί `return` αναμένει μια τιμή ή αναφορά αυτού που επιστρέφεται όπως φαίνεται παρακάτω:
+Αν μια συνάρτηση επιστρέφει κάτι, τότε χρησιμοποιείται η λέξη-κλειδί `return`. Η λέξη-κλειδί `return` αναμένει μια τιμή ή αναφορά αυτού που επιστρέφεται, όπως φαίνεται παρακάτω:
```javascript
return myVariable;
```
-Μπορούμε να δημιουργήσουμε μια συνάρτηση για να δημιουργήσουμε ένα μήνυμα χαιρετισμού και να επιστρέψουμε την τιμή πίσω στον καλούντα.
+Θα μπορούσαμε να δημιουργήσουμε μια συνάρτηση για να δημιουργήσουμε ένα μήνυμα χαιρετισμού και να επιστρέψουμε την τιμή πίσω στον καλούντα.
```javascript
function createGreetingMessage(name) {
@@ -157,7 +157,7 @@ setTimeout(displayDone, 3000);
### Ανώνυμες συναρτήσεις
-Ας ρίξουμε μια άλλη ματιά σε αυτό που έχουμε δημιουργήσει. Δημιουργούμε μια συνάρτηση με ένα όνομα που θα χρησιμοποιηθεί μόνο μία φορά. Καθώς η εφαρμογή μας γίνεται πιο περίπλοκη, μπορούμε να δούμε ότι δημιουργούμε πολλές συναρτήσεις που θα καλούνται μόνο μία φορά. Αυτό δεν είναι ιδανικό. Όπως αποδεικνύεται, δεν χρειάζεται πάντα να δώσουμε ένα όνομα!
+Ας ρίξουμε μια άλλη ματιά σε αυτό που έχουμε δημιουργήσει. Δημιουργούμε μια συνάρτηση με ένα όνομα που θα χρησιμοποιηθεί μία φορά. Καθώς η εφαρμογή μας γίνεται πιο περίπλοκη, μπορούμε να δούμε ότι δημιουργούμε πολλές συναρτήσεις που θα καλούνται μόνο μία φορά. Αυτό δεν είναι ιδανικό. Όπως αποδεικνύεται, δεν χρειάζεται πάντα να παρέχουμε ένα όνομα!
Όταν περνάμε μια συνάρτηση ως παράμετρο, μπορούμε να παρακάμψουμε τη δημιουργία της εκ των προτέρων και να την κατασκευάσουμε ως μέρος της παραμέτρου. Χρησιμοποιούμε την ίδια λέξη-κλειδί `function`, αλλά την κατασκευάζουμε ως παράμετρο.
@@ -173,7 +173,7 @@ setTimeout(function() {
### Συναρτήσεις με βέλη (Fat arrow functions)
-Ένα σύντομο κόλπο που είναι κοινό σε πολλές γλώσσες προγραμματισμού (συμπεριλαμβανομένης της JavaScript) είναι η δυνατότητα χρήσης αυτού που ονομάζεται **arrow** ή **fat arrow** συνάρτηση. Χρησιμοποιεί έναν ειδικό δείκτη `=>`, που μοιάζει με βέλος - εξού και το όνομα! Χρησιμοποιώντας το `=>`, μπορούμε να παραλείψουμε τη λέξη-κλειδί `function`.
+Ένα σύντομο κόλπο που είναι κοινό σε πολλές γλώσσες προγραμματισμού (συμπεριλαμβανομένης της JavaScript) είναι η δυνατότητα χρήσης αυτού που ονομάζεται **arrow** ή **fat arrow** συνάρτηση. Χρησιμοποιεί έναν ειδικό δείκτη `=>`, που μοιάζει με βέλος - εξ ου και το όνομα! Χρησιμοποιώντας το `=>`, μπορούμε να παραλείψουμε τη λέξη-κλειδί `function`.
Ας ξαναγράψουμε τον κώδικα μας μία ακόμη φορά για να χρησιμοποιήσουμε μια συνάρτηση με βέλος:
@@ -185,7 +185,7 @@ setTimeout(() => {
### Πότε να χρησιμοποιείτε κάθε στρατηγική
-Τώρα έχετε δει ότι έχουμε τρεις τρόπους να περάσουμε μια συνάρτηση ως παράμετρο και ίσως αναρωτιέστε πότε να χρησιμοποιήσετε τον καθένα. Αν ξέρετε ότι θα χρησιμοποιείτε τη συνάρτηση περισσότερες από μία φορές, δημιουργήστε την κανονικά. Αν θα τη χρησιμοποιείτε μόνο για μία τοποθεσία, είναι γενικά καλύτερο να χρησιμοποιείτε μια ανώνυμη συνάρτηση. Το αν θα χρησιμοποιήσετε μια συνάρτηση με βέλος ή τη πιο παραδοσιακή σύνταξη `function` εξαρτάται από εσάς, αλλά θα παρατηρήσετε ότι οι περισσότεροι σύγχρονοι προγραμματιστές προτιμούν το `=>`.
+Τώρα έχετε δει ότι έχουμε τρεις τρόπους να περάσουμε μια συνάρτηση ως παράμετρο και ίσως αναρωτιέστε πότε να χρησιμοποιείτε τον καθένα. Αν ξέρετε ότι θα χρησιμοποιείτε τη συνάρτηση περισσότερες από μία φορές, δημιουργήστε την κανονικά. Αν θα τη χρησιμοποιείτε μόνο για μία τοποθεσία, είναι γενικά καλύτερο να χρησιμοποιείτε μια ανώνυμη συνάρτηση. Το αν θα χρησιμοποιήσετε μια συνάρτηση με βέλος ή την πιο παραδοσιακή σύνταξη `function` εξαρτάται από εσάς, αλλά θα παρατηρήσετε ότι οι περισσότεροι σύγχρονοι προγραμματιστές προτιμούν το `=>`.
---
@@ -194,11 +194,11 @@ setTimeout(() => {
Μπορείτε να εξηγήσετε με μία πρόταση τη διαφορά μεταξύ συναρτήσεων και μεθόδων; Δοκιμάστε το!
## Ερωτηματολόγιο μετά το μάθημα
-[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/10)
+[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app)
## Ανασκόπηση & Αυτομελέτη
-Αξίζει να [διαβάσετε λίγο περισσότερο για τις συναρτήσεις με βέλη](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), καθώς χρησιμοποιούνται όλο και περισσότερο σε βάσεις κώδικα. Εξασκηθείτε γράφοντας μια συνάρτηση και στη συνέχεια ξαναγράψτε την με αυτή τη σύνταξη.
+Αξίζει [να διαβάσετε λίγο περισσότερο για τις συναρτήσεις με βέλη](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions), καθώς χρησιμοποιούνται όλο και περισσότερο σε βάσεις κώδικα. Εξασκηθείτε γράφοντας μια συνάρτηση και στη συνέχεια ξαναγράψτε την με αυτή τη σύνταξη.
## Εργασία
@@ -206,5 +206,5 @@ setTimeout(() => {
---
-**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+**Αποποίηση Ευθύνης**:
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/2-js-basics/3-making-decisions/README.md b/translations/el/2-js-basics/3-making-decisions/README.md
index 30062ac7..e0f9413f 100644
--- a/translations/el/2-js-basics/3-making-decisions/README.md
+++ b/translations/el/2-js-basics/3-making-decisions/README.md
@@ -1,59 +1,59 @@
-# Βασικά στοιχεία JavaScript: Λήψη αποφάσεων
+# Βασικά Στοιχεία JavaScript: Λήψη Αποφάσεων
-
+
-> Σημειώσεις από [Tomomi Imura](https://twitter.com/girlie_mac)
+> Σκίτσο από την [Tomomi Imura](https://twitter.com/girlie_mac)
-## Ερωτηματολόγιο πριν το μάθημα
+## Κουίζ Πριν το Μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/11)
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/11)
-Η λήψη αποφάσεων και ο έλεγχος της σειράς εκτέλεσης του κώδικα καθιστούν τον κώδικα επαναχρησιμοποιήσιμο και ανθεκτικό. Αυτή η ενότητα καλύπτει τη σύνταξη για τον έλεγχο της ροής δεδομένων στη JavaScript και τη σημασία της όταν χρησιμοποιείται με τύπους δεδομένων Boolean.
+Η λήψη αποφάσεων και ο έλεγχος της σειράς εκτέλεσης του κώδικά σας καθιστούν τον κώδικα επαναχρησιμοποιήσιμο και ανθεκτικό. Αυτή η ενότητα καλύπτει τη σύνταξη για τον έλεγχο της ροής δεδομένων στη JavaScript και τη σημασία της όταν χρησιμοποιείται με Boolean τύπους δεδομένων.
-[](https://youtube.com/watch?v=SxTp8j-fMMY "Λήψη αποφάσεων")
+[](https://youtube.com/watch?v=SxTp8j-fMMY "Λήψη Αποφάσεων")
-> 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο σχετικά με τη λήψη αποφάσεων.
+> 🎥 Κάντε κλικ στην παραπάνω εικόνα για ένα βίντεο σχετικά με τη λήψη αποφάσεων.
> Μπορείτε να παρακολουθήσετε αυτό το μάθημα στο [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-if-else/?WT.mc_id=academic-77807-sagibbon)!
-## Σύντομη ανακεφαλαίωση για τα Booleans
+## Μια Σύντομη Ανακεφαλαίωση για τα Booleans
-Τα Booleans μπορούν να έχουν μόνο δύο τιμές: `true` ή `false`. Τα Booleans βοηθούν στη λήψη αποφάσεων σχετικά με το ποιες γραμμές κώδικα πρέπει να εκτελεστούν όταν πληρούνται ορισμένες συνθήκες.
+Τα Booleans μπορούν να έχουν μόνο δύο τιμές: `true` ή `false`. Τα Booleans βοηθούν στη λήψη αποφάσεων για το ποιες γραμμές κώδικα θα εκτελεστούν όταν πληρούνται ορισμένες συνθήκες.
-Ορίστε το Boolean σας ως true ή false όπως παρακάτω:
+Ορίστε το boolean σας ως true ή false όπως παρακάτω:
`let myTrueBool = true`
`let myFalseBool = false`
✅ Τα Booleans πήραν το όνομά τους από τον Άγγλο μαθηματικό, φιλόσοφο και λογικό George Boole (1815–1864).
-## Τελεστές σύγκρισης και Booleans
+## Τελεστές Σύγκρισης και Booleans
-Οι τελεστές χρησιμοποιούνται για την αξιολόγηση συνθηκών μέσω συγκρίσεων που δημιουργούν μια Boolean τιμή. Ακολουθεί μια λίστα με τελεστές που χρησιμοποιούνται συχνά.
+Οι τελεστές χρησιμοποιούνται για την αξιολόγηση συνθηκών κάνοντας συγκρίσεις που θα δημιουργήσουν μια Boolean τιμή. Ακολουθεί μια λίστα με τελεστές που χρησιμοποιούνται συχνά.
| Σύμβολο | Περιγραφή | Παράδειγμα |
| ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
-| `<` | **Μικρότερο από**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μικρότερη από την τιμή στα δεξιά | `5 < 6 // true` |
-| `<=` | **Μικρότερο ή ίσο με**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μικρότερη ή ίση με την τιμή στα δεξιά | `5 <= 6 // true` |
-| `>` | **Μεγαλύτερο από**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μεγαλύτερη από την τιμή στα δεξιά | `5 > 6 // false` |
-| `>=` | **Μεγαλύτερο ή ίσο με**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μεγαλύτερη ή ίση με την τιμή στα δεξιά | `5 >= 6 // false` |
-| `===` | **Αυστηρή ισότητα**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν οι τιμές στα δεξιά και αριστερά είναι ίσες ΚΑΙ του ίδιου τύπου δεδομένων | `5 === 6 // false` |
-| `!==` | **Ανισότητα**: Συγκρίνει δύο τιμές και επιστρέφει την αντίθετη Boolean τιμή από αυτή που θα επέστρεφε ο τελεστής αυστηρής ισότητας | `5 !== 6 // true` |
+| `<` | **Μικρότερο από**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μικρότερη από τη δεξιά | `5 < 6 // true` |
+| `<=` | **Μικρότερο ή ίσο με**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μικρότερη ή ίση με τη δεξιά | `5 <= 6 // true` |
+| `>` | **Μεγαλύτερο από**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μεγαλύτερη από τη δεξιά | `5 > 6 // false` |
+| `>=` | **Μεγαλύτερο ή ίσο με**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν η τιμή στα αριστερά είναι μεγαλύτερη ή ίση με τη δεξιά | `5 >= 6 // false` |
+| `===` | **Αυστηρή ισότητα**: Συγκρίνει δύο τιμές και επιστρέφει την Boolean τιμή `true` αν οι τιμές στα δεξιά και αριστερά είναι ίσες ΚΑΙ είναι του ίδιου τύπου δεδομένων | `5 === 6 // false` |
+| `!==` | **Ανισότητα**: Συγκρίνει δύο τιμές και επιστρέφει την αντίθετη Boolean τιμή από αυτή που θα επέστρεφε ο τελεστής αυστηρής ισότητας | `5 !== 6 // true` |
-✅ Ελέγξτε τις γνώσεις σας γράφοντας κάποιες συγκρίσεις στην κονσόλα του προγράμματος περιήγησης. Σας εκπλήσσει κάποιο από τα δεδομένα που επιστρέφονται;
+✅ Ελέγξτε τις γνώσεις σας γράφοντας μερικές συγκρίσεις στην κονσόλα του προγράμματος περιήγησής σας. Σας εκπλήσσει κάποιο από τα δεδομένα που επιστρέφονται;
## Δήλωση If
-Η δήλωση if θα εκτελέσει τον κώδικα που βρίσκεται μέσα στα μπλοκ της αν η συνθήκη είναι αληθής.
+Η δήλωση if θα εκτελέσει τον κώδικα που βρίσκεται ανάμεσα στα μπλοκ της αν η συνθήκη είναι true.
```javascript
if (condition) {
@@ -75,7 +75,7 @@ if (currentMoney >= laptopPrice) {
## Δήλωση If..Else
-Η δήλωση `else` θα εκτελέσει τον κώδικα που βρίσκεται μέσα στα μπλοκ της όταν η συνθήκη είναι ψευδής. Είναι προαιρετική με μια δήλωση `if`.
+Η δήλωση `else` θα εκτελέσει τον κώδικα που βρίσκεται ανάμεσα στα μπλοκ της όταν η συνθήκη είναι false. Είναι προαιρετική με μια δήλωση `if`.
```javascript
let currentMoney;
@@ -90,7 +90,7 @@ if (currentMoney >= laptopPrice) {
}
```
-✅ Ελέγξτε την κατανόησή σας για αυτόν τον κώδικα και τον παρακάτω κώδικα εκτελώντας τον στην κονσόλα του προγράμματος περιήγησης. Αλλάξτε τις τιμές των μεταβλητών currentMoney και laptopPrice για να αλλάξετε το αποτέλεσμα του `console.log()`.
+✅ Δοκιμάστε την κατανόησή σας για αυτόν τον κώδικα και τον παρακάτω κώδικα εκτελώντας τον στην κονσόλα ενός προγράμματος περιήγησης. Αλλάξτε τις τιμές των μεταβλητών currentMoney και laptopPrice για να αλλάξετε το αποτέλεσμα του `console.log()`.
## Δήλωση Switch
@@ -127,19 +127,19 @@ switch (a) {
console.log(`The value is ${a}`);
```
-✅ Ελέγξτε την κατανόησή σας για αυτόν τον κώδικα και τον παρακάτω κώδικα εκτελώντας τον στην κονσόλα του προγράμματος περιήγησης. Αλλάξτε τις τιμές της μεταβλητής a για να αλλάξετε το αποτέλεσμα του `console.log()`.
+✅ Δοκιμάστε την κατανόησή σας για αυτόν τον κώδικα και τον παρακάτω κώδικα εκτελώντας τον στην κονσόλα ενός προγράμματος περιήγησης. Αλλάξτε τις τιμές της μεταβλητής a για να αλλάξετε το αποτέλεσμα του `console.log()`.
-## Λογικοί τελεστές και Booleans
+## Λογικοί Τελεστές και Booleans
-Οι αποφάσεις μπορεί να απαιτούν περισσότερες από μία συγκρίσεις και μπορούν να συνδυαστούν με λογικούς τελεστές για να παράγουν μια Boolean τιμή.
+Οι αποφάσεις μπορεί να απαιτούν περισσότερες από μία συγκρίσεις και μπορούν να συνδυαστούν με λογικούς τελεστές για να παραχθεί μια Boolean τιμή.
| Σύμβολο | Περιγραφή | Παράδειγμα |
| ------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
-| `&&` | **Λογικό AND**: Συγκρίνει δύο Boolean εκφράσεις. Επιστρέφει true **μόνο** αν και οι δύο πλευρές είναι αληθείς | `(5 > 6) && (5 < 6 ) //Μία πλευρά είναι ψευδής, η άλλη αληθής. Επιστρέφει false` |
-| `\|\|` | **Λογικό OR**: Συγκρίνει δύο Boolean εκφράσεις. Επιστρέφει true αν τουλάχιστον μία πλευρά είναι αληθής | `(5 > 6) \|\| (5 < 6) //Μία πλευρά είναι ψευδής, η άλλη αληθής. Επιστρέφει true` |
-| `!` | **Λογικό NOT**: Επιστρέφει την αντίθετη τιμή μιας Boolean έκφρασης | `!(5 > 6) // 5 δεν είναι μεγαλύτερο από 6, αλλά το "!" θα επιστρέψει true` |
+| `&&` | **Λογικό AND**: Συγκρίνει δύο Boolean εκφράσεις. Επιστρέφει true **μόνο** αν και οι δύο πλευρές είναι true | `(5 > 6) && (5 < 6 ) //Μία πλευρά είναι false, η άλλη είναι true. Επιστρέφει false` |
+| `\|\|` | **Λογικό OR**: Συγκρίνει δύο Boolean εκφράσεις. Επιστρέφει true αν τουλάχιστον μία πλευρά είναι true | `(5 > 6) \|\| (5 < 6) //Μία πλευρά είναι false, η άλλη είναι true. Επιστρέφει true` |
+| `!` | **Λογικό NOT**: Επιστρέφει την αντίθετη τιμή μιας Boolean έκφρασης | `!(5 > 6) // 5 δεν είναι μεγαλύτερο από 6, αλλά το "!" θα επιστρέψει true` |
-## Συνθήκες και αποφάσεις με λογικούς τελεστές
+## Συνθήκες και Αποφάσεις με Λογικούς Τελεστές
Οι λογικοί τελεστές μπορούν να χρησιμοποιηθούν για τη δημιουργία συνθηκών σε δηλώσεις if..else.
@@ -157,9 +157,9 @@ if (currentMoney >= laptopPrice || currentMoney >= laptopDiscountPrice) {
}
```
-### Τελεστής άρνησης
+### Τελεστής Άρνησης
-Έχετε δει μέχρι τώρα πώς μπορείτε να χρησιμοποιήσετε μια δήλωση `if...else` για να δημιουργήσετε λογική συνθηκών. Οτιδήποτε μπαίνει σε μια δήλωση `if` πρέπει να αξιολογείται ως true/false. Χρησιμοποιώντας τον τελεστή `!` μπορείτε να _αρνηθείτε_ την έκφραση. Θα μοιάζει κάπως έτσι:
+Μέχρι τώρα έχετε δει πώς μπορείτε να χρησιμοποιήσετε μια δήλωση `if...else` για να δημιουργήσετε λογική συνθηκών. Οτιδήποτε εισάγεται σε μια δήλωση `if` πρέπει να αξιολογείται ως true/false. Χρησιμοποιώντας τον τελεστή `!` μπορείτε να _αντιστρέψετε_ την έκφραση. Θα μοιάζει κάπως έτσι:
```javascript
if (!condition) {
@@ -169,9 +169,9 @@ if (!condition) {
}
```
-### Τριαδικές εκφράσεις
+### Τριαδικές Εκφράσεις
-Η δήλωση `if...else` δεν είναι ο μόνος τρόπος για να εκφράσετε λογική αποφάσεων. Μπορείτε επίσης να χρησιμοποιήσετε κάτι που ονομάζεται τριαδικός τελεστής. Η σύνταξή του μοιάζει με την εξής:
+Η δήλωση `if...else` δεν είναι ο μόνος τρόπος για να εκφράσετε λογική αποφάσεων. Μπορείτε επίσης να χρησιμοποιήσετε κάτι που ονομάζεται τριαδικός τελεστής. Η σύνταξή του μοιάζει κάπως έτσι:
```javascript
let variable = condition ? :
@@ -212,15 +212,15 @@ if (firstNumber > secondNumber) {
---
-## Ερωτηματολόγιο μετά το μάθημα
+## Κουίζ Μετά το Μάθημα
-[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/12)
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/12)
## Ανασκόπηση & Αυτομελέτη
-Διαβάστε περισσότερα για τους πολλούς διαθέσιμους τελεστές [στο MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators).
+Διαβάστε περισσότερα για τους πολλούς τελεστές που είναι διαθέσιμοι στον χρήστη [στο MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators).
-Δείτε το υπέροχο [operator lookup](https://joshwcomeau.com/operator-lookup/) του Josh Comeau!
+Δείτε τον υπέροχο [οδηγό τελεστών](https://joshwcomeau.com/operator-lookup/) του Josh Comeau!
## Εργασία
@@ -228,5 +228,5 @@ if (firstNumber > secondNumber) {
---
-**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+**Αποποίηση Ευθύνης**:
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/2-js-basics/4-arrays-loops/README.md b/translations/el/2-js-basics/4-arrays-loops/README.md
index 4d05474b..0eb95b90 100644
--- a/translations/el/2-js-basics/4-arrays-loops/README.md
+++ b/translations/el/2-js-basics/4-arrays-loops/README.md
@@ -1,8 +1,8 @@
@@ -107,24 +107,24 @@ code .
### Εκκίνηση της εφαρμογής
-Είναι πάντα καλύτερο να αναπτύσσουμε επαναληπτικά για να δούμε πώς φαίνονται τα πράγματα. Ας εκκινήσουμε την εφαρμογή μας. Υπάρχει μια εξαιρετική επέκταση για το Visual Studio Code που ονομάζεται [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon), η οποία θα φιλοξενήσει την εφαρμογή σας τοπικά και θα ανανεώσει τον περιηγητή κάθε φορά που αποθηκεύετε.
+Είναι πάντα καλύτερο να αναπτύσσουμε επαναληπτικά για να βλέπουμε πώς φαίνονται τα πράγματα. Ας εκκινήσουμε την εφαρμογή μας. Υπάρχει μια εξαιρετική επέκταση για το Visual Studio Code που ονομάζεται [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon), η οποία φιλοξενεί την εφαρμογή σας τοπικά και ανανεώνει τον περιηγητή κάθε φορά που αποθηκεύετε.
- Εγκαταστήστε το [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) ακολουθώντας τον σύνδεσμο και κάνοντας κλικ στο **Install**
- - Θα σας ζητηθεί από τον περιηγητή να ανοίξετε το Visual Studio Code και στη συνέχεια από το Visual Studio Code να εκτελέσετε την εγκατάσταση
+ - Ο περιηγητής θα σας ζητήσει να ανοίξετε το Visual Studio Code και στη συνέχεια το Visual Studio Code θα σας ζητήσει να εκτελέσετε την εγκατάσταση
- Επανεκκινήστε το Visual Studio Code αν σας ζητηθεί
-- Μόλις εγκατασταθεί, στο Visual Studio Code, πατήστε Ctrl-Shift-P (ή Cmd-Shift-P) για να ανοίξετε την παλέτα εντολών
+- Μόλις εγκατασταθεί, στο Visual Studio Code, πατήστε Ctrl-Shift-P (ή Cmd-Shift-P) για να ανοίξετε το command palette
- Πληκτρολογήστε **Live Server: Open with Live Server**
- Το Live Server θα ξεκινήσει να φιλοξενεί την εφαρμογή σας
-- Ανοίξτε έναν περιηγητή και πλοηγηθείτε στο **https://localhost:5500**
-- Τώρα θα πρέπει να βλέπετε τη σελίδα που δημιουργήσατε!
+- Ανοίξτε έναν περιηγητή και μεταβείτε στη διεύθυνση **https://localhost:5500**
+- Θα πρέπει τώρα να βλέπετε τη σελίδα που δημιουργήσατε!
-Ας προσθέσουμε κάποια λειτουργικότητα.
+Ας προσθέσουμε λίγη λειτουργικότητα.
-## Προσθήκη CSS
+## Προσθήκη του CSS
-Με τον HTML μας έτοιμο, ας προσθέσουμε το CSS για τον βασικό σχεδιασμό. Χρειαζόμαστε να επισημάνουμε τη λέξη που πρέπει να πληκτρολογήσει ο παίκτης και να χρωματίσουμε το πεδίο κειμένου αν αυτό που έχει πληκτρολογήσει είναι λανθασμένο. Θα το κάνουμε αυτό με δύο κλάσεις.
+Με τον HTML μας έτοιμο, ας προσθέσουμε το CSS για τον βασικό σχεδιασμό. Χρειαζόμαστε να επισημάνουμε τη λέξη που πρέπει να πληκτρολογήσει ο παίκτης και να χρωματίσουμε το πλαίσιο κειμένου αν αυτό που πληκτρολόγησε είναι λανθασμένο. Θα το κάνουμε αυτό με δύο κλάσεις.
-Δημιουργήστε ένα νέο αρχείο με όνομα **style.css** και προσθέστε την ακόλουθη σύνταξη.
+Δημιουργήστε ένα νέο αρχείο με όνομα **style.css** και προσθέστε την παρακάτω σύνταξη.
```css
/* inside style.css */
@@ -138,7 +138,7 @@ code .
}
```
-✅ Όσον αφορά το CSS, μπορείτε να διαμορφώσετε τη σελίδα σας όπως θέλετε. Αφιερώστε λίγο χρόνο για να κάνετε τη σελίδα πιο ελκυστική:
+✅ Όταν πρόκειται για CSS, μπορείτε να διαμορφώσετε τη σελίδα σας όπως θέλετε. Αφιερώστε λίγο χρόνο για να κάνετε τη σελίδα πιο ελκυστική:
- Επιλέξτε διαφορετική γραμματοσειρά
- Χρωματίστε τους τίτλους
@@ -146,7 +146,7 @@ code .
## JavaScript
-Με τη διεπαφή χρήστη έτοιμη, είναι ώρα να επικεντρωθούμε στη JavaScript που θα παρέχει τη λογική. Θα το χωρίσουμε σε μερικά βήματα:
+Με τη διεπαφή χρήστη έτοιμη, ήρθε η ώρα να επικεντρωθούμε στη JavaScript που θα παρέχει τη λογική. Θα το χωρίσουμε σε μερικά βήματα:
- [Δημιουργία των σταθερών](../../../../4-typing-game/typing-game)
- [Ακροατής γεγονότων για την έναρξη του παιχνιδιού](../../../../4-typing-game/typing-game)
@@ -156,17 +156,17 @@ code .
### Δημιουργία των σταθερών
-Θα χρειαστούμε μερικά στοιχεία για να κάνουμε τη ζωή μας λίγο πιο εύκολη στον προγραμματισμό. Και πάλι, όπως μια συνταγή, εδώ είναι τι θα χρειαστούμε:
+Θα χρειαστούμε μερικά στοιχεία για να κάνουμε τη ζωή μας λίγο πιο εύκολη στον προγραμματισμό. Και πάλι, όπως σε μια συνταγή, εδώ είναι τι θα χρειαστούμε:
-- Πίνακας με τη λίστα όλων των φράσεων
-- Κενός πίνακας για την αποθήκευση όλων των λέξεων της τρέχουσας φράσης
-- Χώρος για την αποθήκευση του δείκτη της λέξης που πληκτρολογεί ο παίκτης
-- Ο χρόνος που ο παίκτης έκανε κλικ στο κουμπί έναρξης
+- Έναν πίνακα με τη λίστα όλων των φράσεων
+- Έναν κενό πίνακα για να αποθηκεύσουμε όλες τις λέξεις της τρέχουσας φράσης
+- Χώρο για να αποθηκεύσουμε τον δείκτη της λέξης που πληκτρολογεί ο παίκτης
+- Τον χρόνο που ο παίκτης έκανε κλικ στο κουμπί έναρξης
-Θα θέλουμε επίσης αναφορές στα στοιχεία της διεπαφής χρήστη:
+Θα χρειαστούμε επίσης αναφορές στα στοιχεία της διεπαφής χρήστη:
-- Το πεδίο κειμένου (**typed-value**)
-- Η εμφάνιση της φράσης (**quote**)
+- Το πλαίσιο κειμένου (**typed-value**)
+- Την εμφάνιση της φράσης (**quote**)
- Το μήνυμα (**message**)
```javascript
@@ -194,9 +194,9 @@ const typedValueElement = document.getElementById('typed-value');
✅ Προσθέστε περισσότερες φράσεις στο παιχνίδι σας
-> **NOTE:** Μπορούμε να ανακτήσουμε τα στοιχεία όποτε θέλουμε στον κώδικα χρησιμοποιώντας το `document.getElementById`. Επειδή θα αναφερόμαστε σε αυτά τα στοιχεία τακτικά, θα αποφύγουμε τα τυπογραφικά λάθη με συμβολοσειρές χρησιμοποιώντας σταθερές. Frameworks όπως το [Vue.js](https://vuejs.org/) ή το [React](https://reactjs.org/) μπορούν να σας βοηθήσουν να διαχειριστείτε καλύτερα την κεντρικοποίηση του κώδικα σας.
+> **NOTE:** Μπορούμε να ανακτήσουμε τα στοιχεία όποτε θέλουμε στον κώδικα χρησιμοποιώντας το `document.getElementById`. Επειδή θα αναφερόμαστε συχνά σε αυτά τα στοιχεία, θα αποφύγουμε τα τυπογραφικά λάθη με συμβολοσειρές χρησιμοποιώντας σταθερές. Πλαίσια όπως το [Vue.js](https://vuejs.org/) ή το [React](https://reactjs.org/) μπορούν να σας βοηθήσουν να διαχειριστείτε καλύτερα την κεντρικοποίηση του κώδικά σας.
-Αφιερώστε ένα λεπτό για να παρακολουθήσετε ένα βίντεο σχετικά με τη χρήση των `const`, `let` και `var`
+Αφιερώστε ένα λεπτό για να παρακολουθήσετε ένα βίντεο σχετικά με τη χρήση των `const`, `let` και `var`.
[](https://youtube.com/watch?v=JNIXfGiDWM8 "Τύποι μεταβλητών")
@@ -204,7 +204,7 @@ const typedValueElement = document.getElementById('typed-value');
### Προσθήκη λογικής έναρξης
-Για να ξεκινήσει το παιχνίδι, ο παίκτης θα κάνει κλικ στο κουμπί έναρξης. Φυσικά, δεν γνωρίζουμε πότε θα κάνει κλικ στο κουμπί έναρξης. Εδώ είναι που ένας [ακροατής γεγονότων](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) μπαίνει στο παιχνίδι. Ένας ακροατής γεγονότων θα μας επιτρέψει να "ακούμε" για την εμφάνιση ενός γεγονότος και να εκτελούμε κώδικα ως απάντηση. Στην περίπτωσή μας, θέλουμε να εκτελέσουμε κώδικα όταν ο χρήστης κάνει κλικ στο κουμπί έναρξης.
+Για να ξεκινήσει το παιχνίδι, ο παίκτης θα κάνει κλικ στο κουμπί έναρξης. Φυσικά, δεν γνωρίζουμε πότε θα κάνει κλικ στο κουμπί έναρξης. Εδώ είναι που ένας [ακροατής γεγονότων](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) μπαίνει στο παιχνίδι. Ένας ακροατής γεγονότων θα μας επιτρέψει να "ακούμε" για κάτι που συμβαίνει (ένα γεγονός) και να εκτελούμε κώδικα ως απάντηση. Στην περίπτωσή μας, θέλουμε να εκτελέσουμε κώδικα όταν ο χρήστης κάνει κλικ στο κουμπί έναρξης.
Όταν ο χρήστης κάνει κλικ στο **start**, πρέπει να επιλέξουμε μια φράση, να ρυθμίσουμε τη διεπαφή χρήστη και να ρυθμίσουμε την παρακολούθηση για την τρέχουσα λέξη και τον χρόνο. Παρακάτω είναι η JavaScript που θα χρειαστεί να προσθέσετε. Θα την αναλύσουμε αμέσως μετά το μπλοκ κώδικα.
@@ -246,22 +246,22 @@ document.getElementById('start').addEventListener('click', () => {
- Ρύθμιση παρακολούθησης λέξεων
- Χρησιμοποιώντας το [Math.floor](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) και το [Math.random](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random), επιλέγουμε τυχαία μια φράση από τον πίνακα `quotes`
- Μετατρέπουμε τη `quote` σε έναν πίνακα `words` για να παρακολουθούμε τη λέξη που πληκτρολογεί ο παίκτης
- - Ο `wordIndex` ορίζεται στο 0, καθώς ο παίκτης θα ξεκινήσει από την πρώτη λέξη
+ - Ορίζουμε το `wordIndex` στο 0, καθώς ο παίκτης θα ξεκινήσει από την πρώτη λέξη
- Ρύθμιση διεπαφής χρήστη
- - Δημιουργούμε έναν πίνακα `spanWords`, που περιέχει κάθε λέξη μέσα σε ένα στοιχείο `span`
+ - Δημιουργούμε έναν πίνακα `spanWords`, ο οποίος περιέχει κάθε λέξη μέσα σε ένα στοιχείο `span`
- Αυτό θα μας επιτρέψει να επισημάνουμε τη λέξη στην οθόνη
- - Χρησιμοποιούμε το `join` για να δημιουργήσουμε μια συμβολοσειρά που μπορούμε να χρησιμοποιήσουμε για να ενημερώσουμε το `innerHTML` στο `quoteElement`
+ - Χρησιμοποιούμε το `join` στον πίνακα για να δημιουργήσουμε μια συμβολοσειρά που μπορούμε να χρησιμοποιήσουμε για να ενημερώσουμε το `innerHTML` του `quoteElement`
- Αυτό θα εμφανίσει τη φράση στον παίκτη
- Ορίζουμε το `className` του πρώτου στοιχείου `span` σε `highlight` για να το επισημάνουμε ως κίτρινο
- Καθαρίζουμε το `messageElement` ορίζοντας το `innerText` σε `''`
-- Ρύθμιση πεδίου κειμένου
- - Καθαρίζουμε την τρέχουσα `value` στο `typedValueElement`
+- Ρύθμιση πλαισίου κειμένου
+ - Καθαρίζουμε την τρέχουσα `value` του `typedValueElement`
- Ορίζουμε το `focus` στο `typedValueElement`
- Ξεκινάμε το χρονόμετρο καλώντας το `getTime`
### Προσθήκη λογικής πληκτρολόγησης
-Καθώς ο παίκτης πληκτρολογεί, δημιουργείται ένα γεγονός `input`. Αυτός ο ακροατής γεγονότων θα ελέγξει αν ο παίκτης πληκτρολογεί σωστά τη λέξη και θα χειριστεί την τρέχουσα κατάσταση του παιχνιδιού. Επιστρέφοντας στο **script.js**, προσθέστε τον ακόλουθο κώδικα στο τέλος. Θα τον αναλύσουμε αμέσως μετά.
+Καθώς ο παίκτης πληκτρολογεί, δημιουργείται ένα γεγονός `input`. Αυτός ο ακροατής γεγονότων θα ελέγξει αν ο παίκτης πληκτρολογεί σωστά τη λέξη και θα χειριστεί την τρέχουσα κατάσταση του παιχνιδιού. Επιστρέφοντας στο **script.js**, προσθέστε τον παρακάτω κώδικα στο τέλος. Θα τον αναλύσουμε αμέσως μετά.
```javascript
// at the end of script.js
@@ -300,26 +300,24 @@ typedValueElement.addEventListener('input', () => {
});
```
-Ας αναλύσουμε τον κώδικα! Ξεκινάμε παίρνοντας την τρέχουσα λέξη και την τιμή που έχει πληκτρολογήσει ο παίκτης μέχρι στιγμής. Στη συνέχεια, έχουμε λογική καταρράκτη, όπου ελέγχουμε αν η φράση έχει ολοκληρωθεί, η λέξη έχει ολοκληρωθεί, η λέξη είναι σωστή ή (τελικά) αν υπάρχει σφάλμα.
+Ας αναλύσουμε τον κώδικα! Ξεκινάμε παίρνοντας την τρέχουσα λέξη και την τιμή που έχει πληκτρολογήσει μέχρι στιγμής ο παίκτης. Στη συνέχεια, έχουμε λογική "καταρράκτη", όπου ελέγχουμε αν η φράση έχει ολοκληρωθεί, αν η λέξη έχει ολοκληρωθεί, αν η λέξη είναι σωστή ή (τελικά) αν υπάρχει κάποιο λάθος.
-- Η φράση έχει ολοκληρωθεί, υποδεικνύεται από το `typedValue` να είναι ίσο με το `currentWord` και το `wordIndex` να είναι ίσο με ένα λιγότερο από το `length` του `words`
+- Η φράση έχει ολοκληρωθεί, κάτι που υποδεικνύεται από το `typedValue` να είναι ίσο με το `currentWord` και το `wordIndex` να είναι ίσο με το μήκος του `words` μείον ένα
- Υπολογίζουμε το `elapsedTime` αφαιρώντας το `startTime` από τον τρέχοντα χρόνο
- - Διαιρούμε το `elapsedTime` με 1,000 για να το μετατρέψουμε από χιλιοστά του
-- Αποθηκεύστε υψηλές βαθμολογίες χρησιμοποιώντας το [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)
+ - Διαιρούμε το `elapsedTime` με το 1.000 για να το μετατρέψουμε από χ
+## Κουίζ Μετά τη Διάλεξη
-## Κουίζ μετά το μάθημα
-
-[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/22)
+[Κουίζ μετά τη διάλεξη](https://ff-quizzes.netlify.app/web/quiz/22)
## Ανασκόπηση & Αυτομελέτη
-Διαβάστε για [όλα τα διαθέσιμα γεγονότα](https://developer.mozilla.org/docs/Web/Events) που είναι διαθέσιμα στον προγραμματιστή μέσω του προγράμματος περιήγησης, και σκεφτείτε τα σενάρια στα οποία θα χρησιμοποιούσατε το καθένα.
+Διαβάστε για [όλα τα διαθέσιμα γεγονότα](https://developer.mozilla.org/docs/Web/Events) που παρέχονται στον προγραμματιστή μέσω του προγράμματος περιήγησης και σκεφτείτε τα σενάρια στα οποία θα χρησιμοποιούσατε το καθένα.
## Εργασία
-[Δημιουργήστε ένα νέο παιχνίδι με πληκτρολόγιο](assignment.md)
+[Δημιουργήστε ένα νέο παιχνίδι πληκτρολογίου](assignment.md)
---
-**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+**Αποποίηση Ευθύνης**:
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/5-browser-extension/1-about-browsers/README.md b/translations/el/5-browser-extension/1-about-browsers/README.md
index 24428372..a1d2a4df 100644
--- a/translations/el/5-browser-extension/1-about-browsers/README.md
+++ b/translations/el/5-browser-extension/1-about-browsers/README.md
@@ -1,8 +1,8 @@
# Έργο Επέκτασης Περιηγητή Μέρος 2: Κλήση API, χρήση Τοπικής Αποθήκευσης
-## Ερωτηματολόγιο πριν το μάθημα
+## Κουίζ πριν το μάθημα
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/25)
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/25)
### Εισαγωγή
Σε αυτό το μάθημα, θα καλέσετε ένα API υποβάλλοντας τη φόρμα της επέκτασης του περιηγητή σας και θα εμφανίσετε τα αποτελέσματα στην επέκταση. Επιπλέον, θα μάθετε πώς μπορείτε να αποθηκεύσετε δεδομένα στην τοπική αποθήκευση του περιηγητή σας για μελλοντική αναφορά και χρήση.
-✅ Ακολουθήστε τα αριθμημένα τμήματα στα κατάλληλα αρχεία για να γνωρίζετε πού να τοποθετήσετε τον κώδικα σας.
+✅ Ακολουθήστε τα αριθμημένα τμήματα στα κατάλληλα αρχεία για να ξέρετε πού να τοποθετήσετε τον κώδικά σας.
-### Ρύθμιση των στοιχείων για χειρισμό στην επέκταση:
+### Ρύθμιση στοιχείων για χειρισμό στην επέκταση:
-Μέχρι τώρα έχετε δημιουργήσει το HTML για τη φόρμα και το `
` των αποτελεσμάτων για την επέκταση του περιηγητή σας. Από εδώ και πέρα, θα χρειαστεί να εργαστείτε στο αρχείο `/src/index.js` και να χτίσετε την επέκταση σας βήμα-βήμα. Ανατρέξτε στο [προηγούμενο μάθημα](../1-about-browsers/README.md) για να ρυθμίσετε το έργο σας και να μάθετε για τη διαδικασία δημιουργίας.
+Μέχρι τώρα έχετε δημιουργήσει το HTML για τη φόρμα και το `
` των αποτελεσμάτων για την επέκταση του περιηγητή σας. Από εδώ και στο εξής, θα χρειαστεί να εργαστείτε στο αρχείο `/src/index.js` και να χτίσετε την επέκτασή σας βήμα-βήμα. Ανατρέξτε στο [προηγούμενο μάθημα](../1-about-browsers/README.md) για να ρυθμίσετε το έργο σας και να μάθετε για τη διαδικασία δημιουργίας.
-Εργαζόμενοι στο αρχείο `index.js`, ξεκινήστε δημιουργώντας μερικές μεταβλητές `const` για να κρατήσετε τις τιμές που σχετίζονται με διάφορα πεδία:
+Εργαζόμενοι στο αρχείο `index.js`, ξεκινήστε δημιουργώντας κάποιες μεταβλητές `const` για να κρατήσετε τις τιμές που σχετίζονται με διάφορα πεδία:
```JavaScript
// form fields
@@ -41,11 +41,11 @@ const myregion = document.querySelector('.my-region');
const clearBtn = document.querySelector('.clear-btn');
```
-Όλα αυτά τα πεδία αναφέρονται μέσω της css class τους, όπως τα ρυθμίσατε στο HTML στο προηγούμενο μάθημα.
+Όλα αυτά τα πεδία αναφέρονται από την css κλάση τους, όπως τα ορίσατε στο HTML στο προηγούμενο μάθημα.
-### Προσθήκη ακροατών συμβάντων
+### Προσθήκη ακροατών
-Στη συνέχεια, προσθέστε ακροατές συμβάντων στη φόρμα και στο κουμπί εκκαθάρισης που επαναφέρει τη φόρμα, ώστε αν ένας χρήστης υποβάλει τη φόρμα ή κάνει κλικ στο κουμπί εκκαθάρισης, να συμβεί κάτι, και προσθέστε την κλήση για την αρχικοποίηση της εφαρμογής στο κάτω μέρος του αρχείου:
+Στη συνέχεια, προσθέστε ακροατές συμβάντων στη φόρμα και στο κουμπί εκκαθάρισης που επαναφέρει τη φόρμα, ώστε αν ένας χρήστης υποβάλει τη φόρμα ή κάνει κλικ στο κουμπί εκκαθάρισης, να συμβεί κάτι, και προσθέστε την κλήση για την αρχικοποίηση της εφαρμογής στο τέλος του αρχείου:
```JavaScript
form.addEventListener('submit', (e) => handleSubmit(e));
@@ -53,9 +53,9 @@ clearBtn.addEventListener('click', (e) => reset(e));
init();
```
-✅ Παρατηρήστε τη συντομογραφία που χρησιμοποιείται για την ακρόαση ενός συμβάντος υποβολής ή κλικ και πώς το συμβάν περνάει στις συναρτήσεις handleSubmit ή reset. Μπορείτε να γράψετε το ισοδύναμο αυτής της συντομογραφίας σε μεγαλύτερη μορφή; Ποια προτιμάτε;
+✅ Παρατηρήστε τη συντομογραφία που χρησιμοποιείται για την ακρόαση ενός συμβάντος υποβολής ή κλικ και πώς το συμβάν περνάει στις συναρτήσεις `handleSubmit` ή `reset`. Μπορείτε να γράψετε το ισοδύναμο αυτής της συντομογραφίας σε μεγαλύτερη μορφή; Ποια προτιμάτε;
-### Δημιουργία της συνάρτησης init() και της συνάρτησης reset():
+### Δημιουργία της συνάρτησης init() και reset():
Τώρα θα δημιουργήσετε τη συνάρτηση που αρχικοποιεί την επέκταση, η οποία ονομάζεται init():
@@ -93,34 +93,34 @@ function reset(e) {
```
-Σε αυτή τη συνάρτηση υπάρχει κάποια ενδιαφέρουσα λογική. Διαβάζοντας την, μπορείτε να δείτε τι συμβαίνει;
+Σε αυτή τη συνάρτηση, υπάρχει κάποια ενδιαφέρουσα λογική. Διαβάζοντάς την, μπορείτε να δείτε τι συμβαίνει;
-- Δύο `const` δημιουργούνται για να ελέγξουν αν ο χρήστης έχει αποθηκεύσει ένα APIKey και έναν κωδικό περιοχής στην τοπική αποθήκευση.
-- Αν κάποιο από αυτά είναι null, εμφανίστε τη φόρμα αλλάζοντας το στυλ της ώστε να εμφανίζεται ως 'block'.
-- Κρύψτε την περιοχή αποτελεσμάτων, το μήνυμα φόρτωσης και το clearBtn και ορίστε οποιοδήποτε κείμενο σφάλματος ως κενό.
-- Αν υπάρχει κλειδί και περιοχή, ξεκινήστε μια διαδικασία για:
- - Κλήση του API για λήψη δεδομένων χρήσης άνθρακα.
- - Κρύψτε την περιοχή αποτελεσμάτων.
- - Κρύψτε τη φόρμα.
- - Εμφανίστε το κουμπί επαναφοράς.
+- Δύο `const` ορίζονται για να ελέγξουν αν ο χρήστης έχει αποθηκεύσει ένα APIKey και έναν κωδικό περιοχής στην τοπική αποθήκευση.
+- Αν κάποιο από αυτά είναι null, εμφανίστε τη φόρμα αλλάζοντας το στυλ της σε 'block'.
+- Κρύψτε τα αποτελέσματα, το φόρτωμα και το clearBtn και ορίστε οποιοδήποτε κείμενο σφάλματος σε κενή συμβολοσειρά.
+- Αν υπάρχει κλειδί και περιοχή, ξεκινήστε μια ρουτίνα για:
+ - Κλήση του API για λήψη δεδομένων κατανάλωσης άνθρακα.
+ - Απόκρυψη της περιοχής αποτελεσμάτων.
+ - Απόκρυψη της φόρμας.
+ - Εμφάνιση του κουμπιού επαναφοράς.
-Πριν προχωρήσετε, είναι χρήσιμο να μάθετε για μια πολύ σημαντική έννοια που είναι διαθέσιμη στους περιηγητές: [Τοπική Αποθήκευση](https://developer.mozilla.org/docs/Web/API/Window/localStorage). Η Τοπική Αποθήκευση είναι ένας χρήσιμος τρόπος για να αποθηκεύετε συμβολοσειρές στον περιηγητή ως ζεύγη `key-value`. Αυτός ο τύπος αποθήκευσης ιστού μπορεί να χειριστεί από τη JavaScript για τη διαχείριση δεδομένων στον περιηγητή. Η Τοπική Αποθήκευση δεν λήγει, ενώ η SessionStorage, ένας άλλος τύπος αποθήκευσης ιστού, διαγράφεται όταν κλείνει ο περιηγητής. Οι διάφοροι τύποι αποθήκευσης έχουν πλεονεκτήματα και μειονεκτήματα στη χρήση τους.
+Πριν προχωρήσετε, είναι χρήσιμο να μάθετε για μια πολύ σημαντική έννοια που είναι διαθέσιμη στους περιηγητές: [Τοπική Αποθήκευση](https://developer.mozilla.org/docs/Web/API/Window/localStorage). Η Τοπική Αποθήκευση είναι ένας χρήσιμος τρόπος αποθήκευσης συμβολοσειρών στον περιηγητή ως ζεύγος `κλειδί-τιμή`. Αυτός ο τύπος αποθήκευσης ιστού μπορεί να χειριστεί από τη JavaScript για τη διαχείριση δεδομένων στον περιηγητή. Η Τοπική Αποθήκευση δεν λήγει, ενώ η SessionStorage, ένας άλλος τύπος αποθήκευσης ιστού, διαγράφεται όταν κλείνει ο περιηγητής. Οι διάφοροι τύποι αποθήκευσης έχουν πλεονεκτήματα και μειονεκτήματα στη χρήση τους.
-> Σημείωση - η επέκταση του περιηγητή σας έχει τη δική της τοπική αποθήκευση· το κύριο παράθυρο του περιηγητή είναι μια διαφορετική περίπτωση και λειτουργεί ξεχωριστά.
+> Σημείωση - η επέκταση του περιηγητή σας έχει τη δική της τοπική αποθήκευση· το κύριο παράθυρο του περιηγητή είναι διαφορετική περίπτωση και λειτουργεί ξεχωριστά.
-Ορίστε το APIKey σας να έχει μια τιμή συμβολοσειράς, για παράδειγμα, και μπορείτε να δείτε ότι έχει οριστεί στο Edge κάνοντας "επιθεώρηση" μιας ιστοσελίδας (μπορείτε να κάνετε δεξί κλικ σε έναν περιηγητή για επιθεώρηση) και πηγαίνοντας στην καρτέλα Εφαρμογές για να δείτε την αποθήκευση.
+Ορίστε το APIKey σας να έχει μια τιμή συμβολοσειράς, για παράδειγμα, και μπορείτε να δείτε ότι έχει οριστεί στον Edge "επιθεωρώντας" μια ιστοσελίδα (μπορείτε να κάνετε δεξί κλικ σε έναν περιηγητή για να επιθεωρήσετε) και πηγαίνοντας στην καρτέλα Εφαρμογές για να δείτε την αποθήκευση.

-✅ Σκεφτείτε καταστάσεις όπου ΔΕΝ θα θέλατε να αποθηκεύσετε κάποια δεδομένα στην Τοπική Αποθήκευση. Γενικά, η τοποθέτηση API Keys στην Τοπική Αποθήκευση είναι κακή ιδέα! Μπορείτε να δείτε γιατί; Στην περίπτωσή μας, καθώς η εφαρμογή μας είναι καθαρά για εκμάθηση και δεν θα αναπτυχθεί σε κατάστημα εφαρμογών, θα χρησιμοποιήσουμε αυτή τη μέθοδο.
+✅ Σκεφτείτε καταστάσεις όπου ΔΕΝ θα θέλατε να αποθηκεύσετε κάποια δεδομένα στην Τοπική Αποθήκευση. Γενικά, η τοποθέτηση API Keys στην Τοπική Αποθήκευση είναι κακή ιδέα! Μπορείτε να δείτε γιατί; Στην περίπτωσή μας, δεδομένου ότι η εφαρμογή μας είναι καθαρά για μάθηση και δεν θα αναπτυχθεί σε κατάστημα εφαρμογών, θα χρησιμοποιήσουμε αυτή τη μέθοδο.
-Παρατηρήστε ότι χρησιμοποιείτε το Web API για να χειριστείτε την Τοπική Αποθήκευση, είτε χρησιμοποιώντας `getItem()`, `setItem()`, είτε `removeItem()`. Υποστηρίζεται ευρέως στους περιηγητές.
+Παρατηρήστε ότι χρησιμοποιείτε το Web API για να χειριστείτε την Τοπική Αποθήκευση, είτε χρησιμοποιώντας `getItem()`, `setItem()`, είτε `removeItem()`. Υποστηρίζεται ευρέως σε όλους τους περιηγητές.
Πριν δημιουργήσετε τη συνάρτηση `displayCarbonUsage()` που καλείται στο `init()`, ας δημιουργήσουμε τη λειτουργικότητα για τη διαχείριση της αρχικής υποβολής φόρμας.
-### Διαχείριση της υποβολής φόρμας
+### Διαχείριση υποβολής φόρμας
-Δημιουργήστε μια συνάρτηση που ονομάζεται `handleSubmit` που δέχεται ένα όρισμα συμβάντος `(e)`. Σταματήστε την εξάπλωση του συμβάντος (σε αυτή την περίπτωση, θέλουμε να σταματήσουμε τον περιηγητή από το να ανανεωθεί) και καλέστε μια νέα συνάρτηση, `setUpUser`, περνώντας τα ορίσματα `apiKey.value` και `region.value`. Με αυτόν τον τρόπο, χρησιμοποιείτε τις δύο τιμές που εισάγονται μέσω της αρχικής φόρμας όταν τα κατάλληλα πεδία είναι συμπληρωμένα.
+Δημιουργήστε μια συνάρτηση που ονομάζεται `handleSubmit` που δέχεται ένα όρισμα συμβάντος `(e)`. Σταματήστε τη διάδοση του συμβάντος (σε αυτή την περίπτωση, θέλουμε να σταματήσουμε τον περιηγητή από το να ανανεωθεί) και καλέστε μια νέα συνάρτηση, `setUpUser`, περνώντας τα ορίσματα `apiKey.value` και `region.value`. Με αυτόν τον τρόπο, χρησιμοποιείτε τις δύο τιμές που εισάγονται μέσω της αρχικής φόρμας όταν τα κατάλληλα πεδία είναι συμπληρωμένα.
```JavaScript
function handleSubmit(e) {
@@ -129,11 +129,11 @@ function handleSubmit(e) {
}
```
-✅ Ανανεώστε τη μνήμη σας - το HTML που ρυθμίσατε στο τελευταίο μάθημα έχει δύο πεδία εισόδου των οποίων οι `τιμές` καταγράφονται μέσω των `const` που δημιουργήσατε στην κορυφή του αρχείου, και είναι και τα δύο `απαιτούμενα`, ώστε ο περιηγητής να σταματά τους χρήστες από την εισαγωγή null τιμών.
+✅ Φρεσκάρετε τη μνήμη σας - το HTML που δημιουργήσατε στο τελευταίο μάθημα έχει δύο πεδία εισαγωγής των οποίων οι `τιμές` καταγράφονται μέσω των `const` που ορίσατε στην κορυφή του αρχείου, και είναι και τα δύο `απαιτούμενα`, ώστε ο περιηγητής να εμποδίζει τους χρήστες από το να εισάγουν κενές τιμές.
-### Ρύθμιση του χρήστη
+### Ρύθμιση χρήστη
-Προχωρώντας στη συνάρτηση `setUpUser`, εδώ είναι όπου ορίζετε τις τιμές τοπικής αποθήκευσης για το apiKey και το regionName. Προσθέστε μια νέα συνάρτηση:
+Προχωρώντας στη συνάρτηση `setUpUser`, εδώ είναι που ορίζετε τις τιμές τοπικής αποθήκευσης για το apiKey και το regionName. Προσθέστε μια νέα συνάρτηση:
```JavaScript
function setUpUser(apiKey, regionName) {
@@ -149,15 +149,15 @@ function setUpUser(apiKey, regionName) {
Αυτή η συνάρτηση ορίζει ένα μήνυμα φόρτωσης για εμφάνιση ενώ καλείται το API. Σε αυτό το σημείο, έχετε φτάσει στη δημιουργία της πιο σημαντικής συνάρτησης αυτής της επέκτασης περιηγητή!
-### Εμφάνιση Χρήσης Άνθρακα
+### Εμφάνιση Κατανάλωσης Άνθρακα
-Τέλος, είναι ώρα να κάνετε ερώτημα στο API!
+Τέλος, ήρθε η ώρα να κάνετε ερώτημα στο API!
-Πριν προχωρήσουμε, θα πρέπει να συζητήσουμε για τα APIs. Τα APIs, ή [Διεπαφές Προγραμματισμού Εφαρμογών](https://www.webopedia.com/TERM/A/API.html), είναι ένα κρίσιμο στοιχείο της εργαλειοθήκης ενός προγραμματιστή ιστού. Παρέχουν τυποποιημένους τρόπους για τα προγράμματα να αλληλεπιδρούν και να συνδέονται μεταξύ τους. Για παράδειγμα, αν δημιουργείτε μια ιστοσελίδα που χρειάζεται να κάνει ερώτημα σε μια βάση δεδομένων, κάποιος μπορεί να έχει δημιουργήσει ένα API για να χρησιμοποιήσετε. Ενώ υπάρχουν πολλοί τύποι APIs, ένας από τους πιο δημοφιλείς είναι ένα [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
+Πριν προχωρήσουμε, ας συζητήσουμε για τα APIs. Τα APIs, ή [Διεπαφές Προγραμματισμού Εφαρμογών](https://www.webopedia.com/TERM/A/API.html), είναι ένα κρίσιμο στοιχείο στη φαρέτρα ενός προγραμματιστή ιστού. Παρέχουν τυποποιημένους τρόπους για τα προγράμματα να αλληλεπιδρούν και να διασυνδέονται μεταξύ τους. Για παράδειγμα, αν δημιουργείτε έναν ιστότοπο που χρειάζεται να κάνει ερώτημα σε μια βάση δεδομένων, κάποιος μπορεί να έχει δημιουργήσει ένα API για να χρησιμοποιήσετε. Ενώ υπάρχουν πολλοί τύποι APIs, ένας από τους πιο δημοφιλείς είναι ένα [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
-✅ Ο όρος 'REST' σημαίνει 'Μεταφορά Κατάστασης Αναπαράστασης' και περιλαμβάνει τη χρήση διαμορφωμένων URLs για την ανάκτηση δεδομένων. Κάντε λίγη έρευνα για τους διάφορους τύπους APIs που είναι διαθέσιμοι στους προγραμματιστές. Ποια μορφή σας φαίνεται πιο ελκυστική;
+✅ Ο όρος 'REST' σημαίνει 'Μεταφορά Αναπαραστασιακής Κατάστασης' και περιλαμβάνει τη χρήση διαμορφωμένων URLs για την ανάκτηση δεδομένων. Κάντε λίγη έρευνα για τους διάφορους τύπους APIs που είναι διαθέσιμοι στους προγραμματιστές. Ποια μορφή σας ελκύει;
-Υπάρχουν σημαντικά πράγματα που πρέπει να σημειώσετε για αυτή τη συνάρτηση. Πρώτον, παρατηρήστε τη λέξη-κλειδί [`async`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). Γράφοντας τις συναρτήσεις σας ώστε να λειτουργούν ασύγχρονα σημαίνει ότι περιμένουν μια ενέργεια, όπως η επιστροφή δεδομένων, να ολοκληρωθεί πριν συνεχίσουν.
+Υπάρχουν σημαντικά πράγματα που πρέπει να σημειώσετε για αυτή τη συνάρτηση. Πρώτον, παρατηρήστε τη λέξη-κλειδί [`async`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). Η συγγραφή των συναρτήσεών σας ώστε να εκτελούνται ασύγχρονα σημαίνει ότι περιμένουν μια ενέργεια, όπως η επιστροφή δεδομένων, να ολοκληρωθεί πριν συνεχίσουν.
Δείτε ένα σύντομο βίντεο για το `async`:
@@ -207,14 +207,14 @@ async function displayCarbonUsage(apiKey, region) {
Αυτή είναι μια μεγάλη συνάρτηση. Τι συμβαίνει εδώ;
-- Ακολουθώντας τις βέλτιστες πρακτικές, χρησιμοποιείτε τη λέξη-κλειδί `async` για να κάνετε αυτή τη συνάρτηση να λειτουργεί ασύγχρονα. Η συνάρτηση περιέχει ένα μπλοκ `try/catch`, καθώς θα επιστρέψει μια υπόσχεση όταν το API επιστρέψει δεδομένα. Επειδή δεν έχετε έλεγχο στην ταχύτητα με την οποία το API θα απαντήσει (μπορεί να μην απαντήσει καθόλου!), πρέπει να χειριστείτε αυτή την αβεβαιότητα καλώντας το ασύγχρονα.
-- Κάνετε ερώτημα στο API co2signal για να λάβετε τα δεδομένα της περιοχής σας, χρησιμοποιώντας το API Key σας. Για να χρησιμοποιήσετε αυτό το κλειδί, πρέπει να χρησιμοποιήσετε έναν τύπο αυθεντικοποίησης στις παραμέτρους της κεφαλίδας σας.
-- Μόλις το API απαντήσει, αναθέτετε διάφορα στοιχεία των δεδομένων της απάντησής του στα μέρη της οθόνης σας που ρυθμίσατε για να εμφανίσετε αυτά τα δεδομένα.
+- Ακολουθώντας τις βέλτιστες πρακτικές, χρησιμοποιείτε τη λέξη-κλειδί `async` για να κάνετε αυτή τη συνάρτηση να λειτουργεί ασύγχρονα. Η συνάρτηση περιέχει ένα μπλοκ `try/catch`, καθώς θα επιστρέψει μια υπόσχεση όταν το API επιστρέψει δεδομένα. Επειδή δεν έχετε έλεγχο στην ταχύτητα με την οποία θα απαντήσει το API (μπορεί να μην απαντήσει καθόλου!), πρέπει να χειριστείτε αυτή την αβεβαιότητα καλώντας το ασύγχρονα.
+- Κάνετε ερώτημα στο API co2signal για να λάβετε δεδομένα της περιοχής σας, χρησιμοποιώντας το API Key σας. Για να χρησιμοποιήσετε αυτό το κλειδί, πρέπει να χρησιμοποιήσετε έναν τύπο αυθεντικοποίησης στις παραμέτρους κεφαλίδας.
+- Μόλις το API απαντήσει, αναθέτετε διάφορα στοιχεία των δεδομένων απόκρισης στα μέρη της οθόνης που ορίσατε για να εμφανίσετε αυτά τα δεδομένα.
- Αν υπάρχει σφάλμα ή αν δεν υπάρχει αποτέλεσμα, εμφανίζετε ένα μήνυμα σφάλματος.
-✅ Η χρήση ασύγχρονων προτύπων προγραμματισμού είναι ένα ακόμη πολύ χρήσιμο εργαλείο στην εργαλειοθήκη σας. Διαβάστε [για τους διάφορους τρόπους](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) που μπορείτε να διαμορφώσετε αυτόν τον τύπο κώδικα.
+✅ Η χρήση ασύγχρονων προτύπων προγραμματισμού είναι ένα ακόμη πολύ χρήσιμο εργαλείο στη φαρέτρα σας. Διαβάστε [για τους διάφορους τρόπους](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) που μπορείτε να διαμορφώσετε αυτόν τον τύπο κώδικα.
-Συγχαρητήρια! Αν δημιουργήσετε την επέκτασή σας (`npm run build`) και την ανανεώσετε στον πίνακα επεκτάσεων σας, έχετε μια λειτουργική επέκταση! Το μόνο πράγμα που δεν λειτουργεί είναι το εικονίδιο, και θα το διορθώσετε στο επόμενο μάθημα.
+Συγχαρητήρια! Αν δημιουργήσετε την επέκτασή σας (`npm run build`) και την ανανεώσετε στον πίνακα επεκτάσεων, έχετε μια λειτουργική επέκταση! Το μόνο που δεν λειτουργεί είναι το εικονίδιο, και θα το διορθώσετε στο επόμενο μάθημα.
---
@@ -222,19 +222,19 @@ async function displayCarbonUsage(apiKey, region) {
Έχουμε συζητήσει διάφορους τύπους API μέχρι τώρα σε αυτά τα μαθήματα. Επιλέξτε ένα web API και ερευνήστε σε βάθος τι προσφέρει. Για παράδειγμα, ρίξτε μια ματιά στα APIs που είναι διαθέσιμα στους περιηγητές, όπως το [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API). Τι κάνει ένα API εξαιρετικό κατά τη γνώμη σας;
-## Ερωτηματολόγιο μετά το μάθημα
+## Κουίζ μετά το μάθημα
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/26)
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/26)
## Ανασκόπηση & Αυτομελέτη
-Μάθατε για την Τοπική Αποθήκευση και τα APIs σε αυτό το μάθημα, και τα δύο πολύ χρήσιμα για τον επαγγελματία προγραμματιστή ιστού. Μπορείτε να σκεφτείτε πώς αυτά τα δύο πράγματα συνεργάζονται; Σκεφτείτε πώς θα σχεδιάζατε μια ιστοσελίδα που θα αποθηκεύει αντικείμενα για χρήση από ένα API.
+Μάθατε για την Τοπική Αποθήκευση και τα APIs σε αυτό το μάθημα, και τα δύο πολύ χρήσιμα για τον επαγγελματία προγραμματιστή ιστού. Μπορείτε να σκεφτείτε πώς αυτά τα δύο πράγματα συνεργάζονται; Σκεφτείτε πώς θα σχεδιάζατε έναν ιστότοπο που θα αποθήκευε αντικείμενα για χρήση από ένα API.
## Εργασία
-[Adopt an API](assignment.md)
+[Υιοθετήστε ένα API](assignment.md)
---
**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/5-browser-extension/3-background-tasks-and-performance/README.md b/translations/el/5-browser-extension/3-background-tasks-and-performance/README.md
index 13478c5e..c7f051e7 100644
--- a/translations/el/5-browser-extension/3-background-tasks-and-performance/README.md
+++ b/translations/el/5-browser-extension/3-background-tasks-and-performance/README.md
@@ -1,8 +1,8 @@
# Δημιουργία ενός Παιχνιδιού Διαστήματος Μέρος 3: Προσθήκη Κίνησης
-## Ερωτηματολόγιο πριν το μάθημα
+## Κουίζ πριν το μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/33)
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/33)
-Τα παιχνίδια δεν είναι τόσο διασκεδαστικά μέχρι να δούμε εξωγήινους να κινούνται στην οθόνη! Σε αυτό το παιχνίδι, θα χρησιμοποιήσουμε δύο τύπους κινήσεων:
+Τα παιχνίδια δεν είναι πολύ διασκεδαστικά μέχρι να αρχίσουν να εμφανίζονται εξωγήινοι στην οθόνη! Σε αυτό το παιχνίδι, θα χρησιμοποιήσουμε δύο τύπους κινήσεων:
- **Κίνηση με πληκτρολόγιο/ποντίκι**: όταν ο χρήστης αλληλεπιδρά με το πληκτρολόγιο ή το ποντίκι για να μετακινήσει ένα αντικείμενο στην οθόνη.
- **Κίνηση που προκαλείται από το παιχνίδι**: όταν το παιχνίδι μετακινεί ένα αντικείμενο σε συγκεκριμένα χρονικά διαστήματα.
@@ -22,8 +22,8 @@ CO_OP_TRANSLATOR_METADATA:
Συνήθως χρειάζεστε τα παρακάτω βήματα για να επιτύχετε *κίνηση* στην οθόνη:
-1. **Ορισμός νέας θέσης** για ένα αντικείμενο· αυτό είναι απαραίτητο για να αντιληφθούμε ότι το αντικείμενο έχει μετακινηθεί.
-2. **Καθαρισμός της οθόνης**, η οθόνη πρέπει να καθαρίζεται μεταξύ των σχεδιάσεων. Μπορούμε να την καθαρίσουμε σχεδιάζοντας ένα ορθογώνιο γεμάτο με χρώμα φόντου.
+1. **Ορισμός νέας θέσης** για ένα αντικείμενο· αυτό είναι απαραίτητο για να φαίνεται ότι το αντικείμενο έχει μετακινηθεί.
+2. **Καθαρισμός της οθόνης**, η οθόνη πρέπει να καθαρίζεται μεταξύ των σχεδιάσεων. Μπορούμε να την καθαρίσουμε σχεδιάζοντας ένα ορθογώνιο που γεμίζουμε με ένα χρώμα φόντου.
3. **Ξανασχεδίαση του αντικειμένου** στη νέα θέση. Με αυτόν τον τρόπο επιτυγχάνουμε τελικά τη μετακίνηση του αντικειμένου από μία θέση σε άλλη.
Αυτό μπορεί να μοιάζει κάπως έτσι στον κώδικα:
@@ -92,7 +92,7 @@ window.addEventListener('keydown', onKeyDown);
## Κίνηση που προκαλείται από το παιχνίδι
-Μπορούμε να κάνουμε τα αντικείμενα να κινούνται μόνα τους χρησιμοποιώντας χρονομετρητές όπως οι συναρτήσεις `setTimeout()` ή `setInterval()` που ενημερώνουν τη θέση του αντικειμένου σε κάθε χρονικό διάστημα. Αυτό μπορεί να μοιάζει κάπως έτσι:
+Μπορούμε να κάνουμε αντικείμενα να κινούνται μόνα τους χρησιμοποιώντας χρονομετρητές όπως οι συναρτήσεις `setTimeout()` ή `setInterval()` που ενημερώνουν τη θέση του αντικειμένου σε κάθε χρονικό διάστημα. Αυτό μπορεί να μοιάζει κάπως έτσι:
```javascript
let id = setInterval(() => {
@@ -103,7 +103,7 @@ let id = setInterval(() => {
## Ο βρόχος του παιχνιδιού
-Ο βρόχος του παιχνιδιού είναι μια έννοια που ουσιαστικά είναι μια συνάρτηση που καλείται σε τακτά χρονικά διαστήματα. Ονομάζεται βρόχος παιχνιδιού καθώς όλα όσα πρέπει να είναι ορατά στον χρήστη σχεδιάζονται μέσα στον βρόχο. Ο βρόχος παιχνιδιού χρησιμοποιεί όλα τα αντικείμενα του παιχνιδιού που αποτελούν μέρος του παιχνιδιού, σχεδιάζοντας όλα εκτός αν για κάποιο λόγο δεν πρέπει να αποτελούν πλέον μέρος του παιχνιδιού. Για παράδειγμα, αν ένα αντικείμενο είναι ένας εχθρός που χτυπήθηκε από ένα λέιζερ και εκρήγνυται, δεν αποτελεί πλέον μέρος του τρέχοντος βρόχου παιχνιδιού (θα μάθετε περισσότερα για αυτό σε επόμενα μαθήματα).
+Ο βρόχος του παιχνιδιού είναι μια έννοια που ουσιαστικά είναι μια συνάρτηση που καλείται σε τακτά χρονικά διαστήματα. Ονομάζεται βρόχος παιχνιδιού καθώς όλα όσα πρέπει να είναι ορατά στον χρήστη σχεδιάζονται μέσα στον βρόχο. Ο βρόχος παιχνιδιού χρησιμοποιεί όλα τα αντικείμενα του παιχνιδιού που αποτελούν μέρος του παιχνιδιού, σχεδιάζοντας όλα εκτός αν για κάποιο λόγο δεν πρέπει να αποτελούν πλέον μέρος του παιχνιδιού. Για παράδειγμα, αν ένα αντικείμενο είναι ένας εχθρός που χτυπήθηκε από ένα λέιζερ και ανατινάχθηκε, δεν αποτελεί πλέον μέρος του τρέχοντος βρόχου παιχνιδιού (θα μάθετε περισσότερα για αυτό σε επόμενα μαθήματα).
Αυτός είναι ένας τυπικός βρόχος παιχνιδιού, εκφρασμένος σε κώδικα:
@@ -205,7 +205,7 @@ npm start
}
```
-2. **Προσθέστε χειριστές συμβάντων πληκτρολογίου** για να χειριστείτε την πλοήγηση με πλήκτρα (μετακίνηση του ήρωα πάνω/κάτω, αριστερά/δεξιά).
+2. **Προσθέστε χειριστές συμβάντων πληκτρολογίου** για να χειριστείτε την πλοήγηση με πλήκτρα (μετακίνηση ήρωα πάνω/κάτω, αριστερά/δεξιά).
*ΘΥΜΗΘΕΙΤΕ* ότι είναι ένα καρτεσιανό σύστημα, η πάνω-αριστερή γωνία είναι `0,0`. Επίσης, θυμηθείτε να προσθέσετε κώδικα για να σταματήσετε την *προεπιλεγμένη συμπεριφορά*.
@@ -221,9 +221,9 @@ npm start
window.addEventListener("keydown", onKeyDown);
```
- Ελέγξτε την κονσόλα του περιηγητή σας σε αυτό το σημείο και παρακολουθήστε τα πλήκτρα που καταγράφονται.
+ Ελέγξτε την κονσόλα του περιηγητή σας σε αυτό το σημείο και παρακολουθήστε τα πατήματα πλήκτρων που καταγράφονται.
-3. **Υλοποιήστε** το [Μοτίβο Pub sub](../README.md), αυτό θα κρατήσει τον κώδικά σας καθαρό καθώς ακολουθείτε τα υπόλοιπα μέρη.
+3. **Υλοποιήστε** το [Μοτίβο Pub-Sub](../README.md), αυτό θα κρατήσει τον κώδικά σας καθαρό καθώς ακολουθείτε τα υπόλοιπα μέρη.
Για να κάνετε αυτό το τελευταίο μέρος, μπορείτε:
@@ -313,7 +313,7 @@ npm start
1. **Ρυθμίστε τον βρόχο του παιχνιδιού**
- Αναδιαμορφώστε τη συνάρτηση window.onload για να αρχικοποιήσετε το παιχνίδι και να ρυθμίσετε έναν βρόχο παιχνιδιού σε ένα καλό χρονικό διάστημα. Θα προσθέσετε επίσης μια ακτίνα λέιζερ:
+ Αναμορφώστε τη συνάρτηση window.onload για να αρχικοποιήσετε το παιχνίδι και να ρυθμίσετε έναν βρόχο παιχνιδιού σε ένα καλό χρονικό διάστημα. Θα προσθέσετε επίσης μια ακτίνα λέιζερ:
```javascript
window.onload = async () => {
@@ -336,7 +336,7 @@ npm start
5. **Προσθέστε κώδικα** για να μετακινήσετε τους εχθρούς σε συγκεκριμένα χρονικά διαστήματα.
- Αναδιαμορφώστε τη συνάρτηση `createEnemies()` για να δημιουργήσετε τους εχθρούς και να τους προσθέσετε στη νέα κλάση gameObjects:
+ Αναμορφώστε τη συνάρτηση `createEnemies()` για να δημιουργήσετε τους εχθρούς και να τους προσθέσετε στη νέα κλάση gameObjects:
```javascript
function createEnemies() {
@@ -384,13 +384,13 @@ npm start
Όπως βλέπετε, ο κώδικάς σας μπορεί να μετατραπεί σε 'σπαγγέτι κώδικα' όταν αρχίζετε να προσθέτετε συναρτήσεις, μεταβλητές και κλάσεις. Πώς μπορείτε να οργανώσετε καλύτερα τον κώδικά σας ώστε να είναι πιο ευανάγνωστος; Σχεδιάστε ένα σύστημα για την οργάνωση του κώδικα σας, ακόμα κι αν εξακολουθεί να βρίσκεται σε ένα αρχείο.
-## Ερωτηματολόγιο μετά το μάθημα
+## Κουίζ μετά το μάθημα
-[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/34)
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/34)
## Ανασκόπηση & Αυτομελέτη
-Ενώ γράφουμε το παιχνίδι μας χωρίς τη χρήση frameworks, υπάρχουν πολλά frameworks για ανάπτυξη παιχνιδιών με JavaScript και καμβά. Αφιερώστε χρόνο για να κάνετε [ανάγνωση σχετικά με αυτά](https://github.com/collections/javascript-game-engines).
+Ενώ γράφουμε το παιχνίδι μας χωρίς τη χρήση frameworks, υπάρχουν πολλά frameworks για ανάπτυξη παιχνιδιών με JavaScript που βασίζονται στον καμβά. Αφιερώστε λίγο χρόνο για να κάνετε [ανάγνωση σχετικά με αυτά](https://github.com/collections/javascript-game-engines).
## Εργασία
@@ -399,4 +399,4 @@ npm start
---
**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/6-space-game/4-collision-detection/README.md b/translations/el/6-space-game/4-collision-detection/README.md
index cff11c5d..78e356d8 100644
--- a/translations/el/6-space-game/4-collision-detection/README.md
+++ b/translations/el/6-space-game/4-collision-detection/README.md
@@ -1,15 +1,15 @@
-# Δημιουργία Παιχνιδιού Διαστήματος Μέρος 4: Προσθήκη Λέιζερ και Ανίχνευση Συγκρούσεων
+# Δημιουργία ενός Διαστημικού Παιχνιδιού Μέρος 4: Προσθήκη Λέιζερ και Ανίχνευση Συγκρούσεων
-## Κουίζ Πριν το Μάθημα
+## Κουίζ πριν το μάθημα
[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/35)
@@ -17,22 +17,22 @@ CO_OP_TRANSLATOR_METADATA:
- **Ένα λέιζερ**: αυτό το λέιζερ εκτοξεύεται από το διαστημόπλοιο του ήρωά σας και κινείται κάθετα προς τα πάνω.
- **Ανίχνευση συγκρούσεων**, ως μέρος της υλοποίησης της δυνατότητας να *πυροβολείτε*, θα προσθέσουμε και κάποιους ωραίους κανόνες παιχνιδιού:
- - **Το λέιζερ χτυπάει εχθρό**: Ο εχθρός πεθαίνει αν χτυπηθεί από λέιζερ.
- - **Το λέιζερ χτυπάει την κορυφή της οθόνης**: Το λέιζερ καταστρέφεται αν φτάσει στην κορυφή της οθόνης.
- - **Σύγκρουση εχθρού και ήρωα**: Εχθρός και ήρωας καταστρέφονται αν συγκρουστούν.
- - **Ο εχθρός φτάνει στο κάτω μέρος της οθόνης**: Εχθρός και ήρωας καταστρέφονται αν ο εχθρός φτάσει στο κάτω μέρος της οθόνης.
+ - **Το λέιζερ χτυπά εχθρό**: Ο εχθρός πεθαίνει αν χτυπηθεί από λέιζερ.
+ - **Το λέιζερ χτυπά την κορυφή της οθόνης**: Το λέιζερ καταστρέφεται αν φτάσει στο πάνω μέρος της οθόνης.
+ - **Σύγκρουση εχθρού και ήρωα**: Ένας εχθρός και ο ήρωας καταστρέφονται αν συγκρουστούν.
+ - **Ο εχθρός φτάνει στο κάτω μέρος της οθόνης**: Ένας εχθρός και ο ήρωας καταστρέφονται αν ο εχθρός φτάσει στο κάτω μέρος της οθόνης.
Με λίγα λόγια, εσείς -- *ο ήρωας* -- πρέπει να χτυπήσετε όλους τους εχθρούς με λέιζερ πριν καταφέρουν να φτάσουν στο κάτω μέρος της οθόνης.
-✅ Κάντε μια μικρή έρευνα για το πρώτο παιχνίδι υπολογιστή που δημιουργήθηκε ποτέ. Ποια ήταν η λειτουργικότητά του;
+✅ Κάντε μια μικρή έρευνα για το πρώτο παιχνίδι υπολογιστή που γράφτηκε ποτέ. Ποια ήταν η λειτουργικότητά του;
-Ας γίνουμε ηρωικοί μαζί!
+Ας γίνουμε ήρωες μαζί!
-## Ανίχνευση Συγκρούσεων
+## Ανίχνευση συγκρούσεων
Πώς κάνουμε ανίχνευση συγκρούσεων; Πρέπει να σκεφτούμε τα αντικείμενα του παιχνιδιού μας ως ορθογώνια που κινούνται. Γιατί αυτό, μπορεί να ρωτήσετε; Λοιπόν, η εικόνα που χρησιμοποιείται για να σχεδιάσει ένα αντικείμενο παιχνιδιού είναι ένα ορθογώνιο: έχει `x`, `y`, `πλάτος` και `ύψος`.
-Αν δύο ορθογώνια, δηλαδή ένας ήρωας και ένας εχθρός, *τέμνονται*, έχουμε σύγκρουση. Τι πρέπει να συμβεί τότε εξαρτάται από τους κανόνες του παιχνιδιού. Για να υλοποιήσετε την ανίχνευση συγκρούσεων, χρειάζεστε τα εξής:
+Αν δύο ορθογώνια, δηλαδή ένας ήρωας και ένας εχθρός, *τέμνονται*, έχουμε μια σύγκρουση. Τι πρέπει να συμβεί τότε εξαρτάται από τους κανόνες του παιχνιδιού. Για να υλοποιήσετε την ανίχνευση συγκρούσεων χρειάζεστε τα εξής:
1. Έναν τρόπο να αποκτήσετε μια ορθογώνια αναπαράσταση ενός αντικειμένου παιχνιδιού, κάτι σαν αυτό:
@@ -60,14 +60,14 @@ CO_OP_TRANSLATOR_METADATA:
## Πώς καταστρέφουμε αντικείμενα
-Για να καταστρέψετε αντικείμενα σε ένα παιχνίδι, πρέπει να ενημερώσετε το παιχνίδι ότι δεν πρέπει πλέον να σχεδιάζει αυτό το αντικείμενο στον βρόχο του παιχνιδιού που ενεργοποιείται σε ένα συγκεκριμένο διάστημα. Ένας τρόπος να το κάνετε αυτό είναι να χαρακτηρίσετε ένα αντικείμενο παιχνιδιού ως *νεκρό* όταν συμβεί κάτι, όπως αυτό:
+Για να καταστρέψετε αντικείμενα σε ένα παιχνίδι, πρέπει να ενημερώσετε το παιχνίδι ότι δεν πρέπει πλέον να σχεδιάζει αυτό το αντικείμενο στον βρόχο του παιχνιδιού που ενεργοποιείται σε ένα συγκεκριμένο διάστημα. Ένας τρόπος να το κάνετε αυτό είναι να σημειώσετε ένα αντικείμενο παιχνιδιού ως *νεκρό* όταν συμβεί κάτι, όπως:
```javascript
// collision happened
enemy.dead = true
```
-Στη συνέχεια, μπορείτε να φιλτράρετε τα *νεκρά* αντικείμενα πριν ξανασχεδιάσετε την οθόνη, όπως αυτό:
+Στη συνέχεια, μπορείτε να προχωρήσετε στην αφαίρεση των *νεκρών* αντικειμένων πριν ξανασχεδιάσετε την οθόνη, όπως:
```javascript
gameObjects = gameObject.filter(go => !go.dead);
@@ -75,15 +75,15 @@ gameObjects = gameObject.filter(go => !go.dead);
## Πώς πυροβολούμε ένα λέιζερ
-Το να πυροβολήσετε ένα λέιζερ σημαίνει να ανταποκριθείτε σε ένα γεγονός πλήκτρου και να δημιουργήσετε ένα αντικείμενο που κινείται προς μια συγκεκριμένη κατεύθυνση. Πρέπει λοιπόν να εκτελέσουμε τα εξής βήματα:
+Το να πυροβολήσετε ένα λέιζερ μεταφράζεται σε απόκριση σε ένα γεγονός πλήκτρου και δημιουργία ενός αντικειμένου που κινείται προς μια συγκεκριμένη κατεύθυνση. Πρέπει λοιπόν να εκτελέσουμε τα εξής βήματα:
-1. **Δημιουργία ενός αντικειμένου λέιζερ**: από την κορυφή του διαστημοπλοίου του ήρωά μας, το οποίο μόλις δημιουργηθεί αρχίζει να κινείται προς τα πάνω.
-2. **Σύνδεση κώδικα σε ένα γεγονός πλήκτρου**: πρέπει να επιλέξουμε ένα πλήκτρο στο πληκτρολόγιο που θα αντιπροσωπεύει την ενέργεια του παίκτη να πυροβολήσει το λέιζερ.
+1. **Δημιουργία ενός αντικειμένου λέιζερ**: από την κορυφή του διαστημοπλοίου του ήρωά μας, το οποίο μόλις δημιουργηθεί αρχίζει να κινείται προς τα πάνω προς την κορυφή της οθόνης.
+2. **Σύνδεση κώδικα σε ένα γεγονός πλήκτρου**: πρέπει να επιλέξουμε ένα πλήκτρο στο πληκτρολόγιο που να αντιπροσωπεύει τον παίκτη που πυροβολεί το λέιζερ.
3. **Δημιουργία ενός αντικειμένου παιχνιδιού που μοιάζει με λέιζερ** όταν πατηθεί το πλήκτρο.
-## Χρονικό διάστημα για το λέιζερ
+## Χρονική καθυστέρηση στο λέιζερ
-Το λέιζερ πρέπει να πυροβολείται κάθε φορά που πατάτε ένα πλήκτρο, όπως το *space* για παράδειγμα. Για να αποτρέψουμε το παιχνίδι από το να δημιουργεί πάρα πολλά λέιζερ σε σύντομο χρονικό διάστημα, πρέπει να διορθώσουμε αυτό το πρόβλημα. Η λύση είναι να υλοποιήσουμε ένα λεγόμενο *χρονικό διάστημα*, έναν χρονοδιακόπτη, που διασφαλίζει ότι ένα λέιζερ μπορεί να πυροβοληθεί μόνο κάθε τόσο. Μπορείτε να το υλοποιήσετε με τον εξής τρόπο:
+Το λέιζερ πρέπει να πυροβολεί κάθε φορά που πατάτε ένα πλήκτρο, όπως το *space* για παράδειγμα. Για να αποτρέψουμε το παιχνίδι από το να παράγει πάρα πολλά λέιζερ σε σύντομο χρονικό διάστημα, πρέπει να διορθώσουμε αυτό το πρόβλημα. Η λύση είναι η υλοποίηση μιας λεγόμενης *χρονικής καθυστέρησης*, ενός χρονομέτρου, που διασφαλίζει ότι ένα λέιζερ μπορεί να πυροβοληθεί μόνο σε συγκεκριμένα διαστήματα. Μπορείτε να το υλοποιήσετε με τον εξής τρόπο:
```javascript
class Cooldown {
@@ -109,19 +109,19 @@ class Weapon {
}
```
-✅ Ανατρέξτε στο μάθημα 1 της σειράς παιχνιδιών διαστήματος για να θυμηθείτε τα *χρονικά διαστήματα*.
+✅ Ανατρέξτε στο μάθημα 1 της σειράς διαστημικών παιχνιδιών για να θυμηθείτε τις *χρονικές καθυστερήσεις*.
## Τι να δημιουργήσετε
-Θα πάρετε τον υπάρχοντα κώδικα (τον οποίο θα πρέπει να έχετε καθαρίσει και αναδιαρθρώσει) από το προηγούμενο μάθημα και θα τον επεκτείνετε. Ξεκινήστε είτε με τον κώδικα από το μέρος II είτε χρησιμοποιήστε τον κώδικα από το [Μέρος III - αρχικό](../../../../../../../../../your-work).
+Θα πάρετε τον υπάρχοντα κώδικα (τον οποίο θα έπρεπε να έχετε καθαρίσει και αναδιαρθρώσει) από το προηγούμενο μάθημα και θα τον επεκτείνετε. Ξεκινήστε είτε με τον κώδικα από το μέρος ΙΙ είτε χρησιμοποιήστε τον κώδικα στο [Μέρος ΙΙΙ - αρχικό](../../../../../../../../../your-work).
-> συμβουλή: το λέιζερ με το οποίο θα δουλέψετε βρίσκεται ήδη στον φάκελο των πόρων σας και αναφέρεται στον κώδικά σας.
+> συμβουλή: το λέιζερ με το οποίο θα δουλέψετε βρίσκεται ήδη στον φάκελο των πόρων σας και αναφέρεται στον κώδικά σας
- **Προσθέστε ανίχνευση συγκρούσεων**, όταν ένα λέιζερ συγκρούεται με κάτι, οι παρακάτω κανόνες πρέπει να ισχύουν:
- 1. **Το λέιζερ χτυπάει εχθρό**: ο εχθρός πεθαίνει αν χτυπηθεί από λέιζερ.
- 2. **Το λέιζερ χτυπάει την κορυφή της οθόνης**: Το λέιζερ καταστρέφεται αν φτάσει στην κορυφή της οθόνης.
+ 1. **Το λέιζερ χτυπά εχθρό**: ο εχθρός πεθαίνει αν χτυπηθεί από λέιζερ.
+ 2. **Το λέιζερ χτυπά την κορυφή της οθόνης**: Το λέιζερ καταστρέφεται αν φτάσει στο πάνω μέρος της οθόνης.
3. **Σύγκρουση εχθρού και ήρωα**: ένας εχθρός και ο ήρωας καταστρέφονται αν συγκρουστούν.
- 4. **Ο εχθρός φτάνει στο κάτω μέρος της οθόνης**: ένας εχθρός και ο ήρωας καταστρέφονται αν ο εχθρός φτάσει στο κάτω μέρος της οθόνης.
+ 4. **Ο εχθρός φτάνει στο κάτω μέρος της οθόνης**: Ένας εχθρός και ο ήρωας καταστρέφονται αν ο εχθρός φτάσει στο κάτω μέρος της οθόνης.
## Προτεινόμενα βήματα
@@ -144,11 +144,11 @@ cd your-work
npm start
```
-Το παραπάνω θα ξεκινήσει έναν HTTP Server στη διεύθυνση `http://localhost:5000`. Ανοίξτε έναν περιηγητή και εισάγετε αυτή τη διεύθυνση. Προς το παρόν, θα πρέπει να εμφανίζεται ο ήρωας και όλοι οι εχθροί, αλλά τίποτα δεν κινείται - ακόμα :).
+Το παραπάνω θα ξεκινήσει έναν HTTP Server στη διεύθυνση `http://localhost:5000`. Ανοίξτε έναν περιηγητή και εισάγετε αυτή τη διεύθυνση, αυτή τη στιγμή θα πρέπει να εμφανίζει τον ήρωα και όλους τους εχθρούς, τίποτα δεν κινείται - ακόμα :).
-### Προσθέστε κώδικα
+### Προσθήκη κώδικα
-1. **Ρυθμίστε μια ορθογώνια αναπαράσταση του αντικειμένου παιχνιδιού σας για να χειριστείτε συγκρούσεις**. Ο παρακάτω κώδικας σας επιτρέπει να αποκτήσετε μια ορθογώνια αναπαράσταση ενός `GameObject`. Επεξεργαστείτε την κλάση GameObject για να την επεκτείνετε:
+1. **Ρυθμίστε μια ορθογώνια αναπαράσταση του αντικειμένου παιχνιδιού σας για να χειριστείτε συγκρούσεις** Ο παρακάτω κώδικας σας επιτρέπει να αποκτήσετε μια ορθογώνια αναπαράσταση ενός `GameObject`. Επεξεργαστείτε την κλάση GameObject για να την επεκτείνετε:
```javascript
rectFromGameObject() {
@@ -161,7 +161,7 @@ npm start
}
```
-2. **Προσθέστε κώδικα που ελέγχει συγκρούσεις**. Αυτή θα είναι μια νέα συνάρτηση που ελέγχει αν δύο ορθογώνια τέμνονται:
+2. **Προσθέστε κώδικα που ελέγχει συγκρούσεις** Αυτή θα είναι μια νέα συνάρτηση που ελέγχει αν δύο ορθογώνια τέμνονται:
```javascript
function intersectRect(r1, r2) {
@@ -175,7 +175,7 @@ npm start
```
3. **Προσθέστε δυνατότητα πυροβολισμού λέιζερ**
- 1. **Προσθέστε μήνυμα γεγονότος πλήκτρου**. Το πλήκτρο *space* θα πρέπει να δημιουργεί ένα λέιζερ ακριβώς πάνω από το διαστημόπλοιο του ήρωα. Προσθέστε τρεις σταθερές στο αντικείμενο Messages:
+ 1. **Προσθέστε μήνυμα γεγονότος πλήκτρου**. Το πλήκτρο *space* πρέπει να δημιουργεί ένα λέιζερ ακριβώς πάνω από το διαστημόπλοιο του ήρωα. Προσθέστε τρεις σταθερές στο αντικείμενο Messages:
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
@@ -209,7 +209,7 @@ npm start
})
```
- 1. **Κινήστε το αντικείμενο**, Διασφαλίστε ότι το λέιζερ κινείται σταδιακά προς την κορυφή της οθόνης. Θα δημιουργήσετε μια νέα κλάση Laser που επεκτείνει το `GameObject`, όπως κάνατε πριν:
+ 1. **Μετακινήστε το αντικείμενο**, Διασφαλίστε ότι το λέιζερ κινείται σταδιακά προς την κορυφή της οθόνης. Θα δημιουργήσετε μια νέα κλάση Laser που επεκτείνει το `GameObject`, όπως έχετε κάνει πριν:
```javascript
class Laser extends GameObject {
@@ -230,7 +230,7 @@ npm start
}
```
- 1. **Χειριστείτε συγκρούσεις**, Υλοποιήστε κανόνες συγκρούσεων για το λέιζερ. Προσθέστε μια συνάρτηση `updateGameObjects()` που ελέγχει τα αντικείμενα για συγκρούσεις:
+ 1. **Χειριστείτε συγκρούσεις**, Υλοποιήστε τους κανόνες συγκρούσεων για το λέιζερ. Προσθέστε μια συνάρτηση `updateGameObjects()` που ελέγχει τα αντικείμενα για συγκρούσεις:
```javascript
function updateGameObjects() {
@@ -254,9 +254,9 @@ npm start
Βεβαιωθείτε ότι προσθέσατε τη `updateGameObjects()` στον βρόχο του παιχνιδιού στο `window.onload`.
- 4. **Υλοποιήστε χρονικό διάστημα** για το λέιζερ, ώστε να μπορεί να πυροβολείται μόνο κάθε τόσο.
+ 4. **Υλοποιήστε χρονική καθυστέρηση** στο λέιζερ, ώστε να μπορεί να πυροβολείται μόνο σε συγκεκριμένα διαστήματα.
- Τέλος, επεξεργαστείτε την κλάση Hero ώστε να μπορεί να έχει χρονικό διάστημα:
+ Τέλος, επεξεργαστείτε την κλάση Hero ώστε να υποστηρίζει χρονική καθυστέρηση:
```javascript
class Hero extends GameObject {
@@ -285,21 +285,21 @@ npm start
}
```
-Σε αυτό το σημείο, το παιχνίδι σας έχει κάποια λειτουργικότητα! Μπορείτε να πλοηγηθείτε με τα πλήκτρα βελών, να πυροβολήσετε λέιζερ με το πλήκτρο space και οι εχθροί εξαφανίζονται όταν τους χτυπάτε. Μπράβο!
+Σε αυτό το σημείο, το παιχνίδι σας έχει κάποια λειτουργικότητα! Μπορείτε να μετακινείστε με τα βελάκια, να πυροβολείτε λέιζερ με το πλήκτρο space και οι εχθροί εξαφανίζονται όταν τους χτυπάτε. Μπράβο!
---
## 🚀 Πρόκληση
-Προσθέστε μια έκρηξη! Ρίξτε μια ματιά στα γραφικά του παιχνιδιού στον [φάκελο Space Art](../../../../6-space-game/solution/spaceArt/readme.txt) και προσπαθήστε να προσθέσετε μια έκρηξη όταν το λέιζερ χτυπάει έναν εξωγήινο.
+Προσθέστε μια έκρηξη! Ρίξτε μια ματιά στα αρχεία πόρων του παιχνιδιού στο [Space Art repo](../../../../6-space-game/solution/spaceArt/readme.txt) και προσπαθήστε να προσθέσετε μια έκρηξη όταν το λέιζερ χτυπά έναν εξωγήινο.
-## Κουίζ Μετά το Μάθημα
+## Κουίζ μετά το μάθημα
[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/36)
## Ανασκόπηση & Αυτομελέτη
-Πειραματιστείτε με τα διαστήματα στο παιχνίδι σας μέχρι τώρα. Τι συμβαίνει όταν τα αλλάζετε; Διαβάστε περισσότερα για τα [χρονικά γεγονότα της JavaScript](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
+Πειραματιστείτε με τα διαστήματα στο παιχνίδι σας μέχρι τώρα. Τι συμβαίνει όταν τα αλλάζετε; Διαβάστε περισσότερα για τα [γεγονότα χρονισμού της JavaScript](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/).
## Εργασία
@@ -307,5 +307,5 @@ npm start
---
-**Αποποίηση Ευθύνης**:
+**Αποποίηση ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/6-space-game/5-keeping-score/README.md b/translations/el/6-space-game/5-keeping-score/README.md
index 6f7569a5..efbb1d8c 100644
--- a/translations/el/6-space-game/5-keeping-score/README.md
+++ b/translations/el/6-space-game/5-keeping-score/README.md
@@ -1,23 +1,23 @@
-# Δημιουργία Παιχνιδιού Διαστήματος Μέρος 5: Βαθμολογία και Ζωές
+# Δημιουργία ενός Παιχνιδιού Διαστήματος Μέρος 5: Βαθμολογία και Ζωές
-## Ερωτηματολόγιο Πριν το Μάθημα
+## Κουίζ πριν το μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/37)
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/37)
Σε αυτό το μάθημα, θα μάθετε πώς να προσθέσετε βαθμολογία σε ένα παιχνίδι και να υπολογίσετε ζωές.
## Σχεδίαση κειμένου στην οθόνη
-Για να εμφανίσετε τη βαθμολογία του παιχνιδιού στην οθόνη, θα χρειαστεί να γνωρίζετε πώς να τοποθετήσετε κείμενο στην οθόνη. Η απάντηση είναι η χρήση της μεθόδου `fillText()` στο αντικείμενο canvas. Μπορείτε επίσης να ελέγξετε άλλες πτυχές, όπως τη γραμματοσειρά που θα χρησιμοποιήσετε, το χρώμα του κειμένου και ακόμη και την ευθυγράμμιση (αριστερά, δεξιά, κέντρο). Παρακάτω υπάρχει κώδικας που σχεδιάζει κείμενο στην οθόνη.
+Για να μπορέσετε να εμφανίσετε τη βαθμολογία του παιχνιδιού στην οθόνη, θα χρειαστεί να ξέρετε πώς να τοποθετήσετε κείμενο στην οθόνη. Η απάντηση είναι η χρήση της μεθόδου `fillText()` στο αντικείμενο canvas. Μπορείτε επίσης να ελέγξετε άλλες παραμέτρους, όπως τη γραμματοσειρά που θα χρησιμοποιηθεί, το χρώμα του κειμένου και ακόμη και την ευθυγράμμισή του (αριστερά, δεξιά, κέντρο). Παρακάτω υπάρχει κώδικας που σχεδιάζει κείμενο στην οθόνη.
```javascript
ctx.font = "30px Arial";
@@ -26,18 +26,18 @@ ctx.textAlign = "right";
ctx.fillText("show this on the screen", 0, 0);
```
-✅ Διαβάστε περισσότερα για [πώς να προσθέσετε κείμενο σε ένα canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text) και μη διστάσετε να κάνετε το δικό σας πιο εντυπωσιακό!
+✅ Διαβάστε περισσότερα για [το πώς να προσθέσετε κείμενο σε ένα canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text) και μη διστάσετε να κάνετε το δικό σας πιο εντυπωσιακό!
-## Ζωή, ως έννοια παιχνιδιού
+## Η ζωή ως έννοια στο παιχνίδι
-Η έννοια της ζωής σε ένα παιχνίδι είναι απλώς ένας αριθμός. Στο πλαίσιο ενός παιχνιδιού διαστήματος, είναι συνηθισμένο να αποδίδονται συγκεκριμένες ζωές που μειώνονται μία προς μία όταν το σκάφος σας δέχεται ζημιά. Είναι ωραίο αν μπορείτε να δείξετε μια γραφική αναπαράσταση αυτού, όπως μικροσκάφη ή καρδιές αντί για έναν αριθμό.
+Η έννοια της ζωής σε ένα παιχνίδι είναι απλώς ένας αριθμός. Στο πλαίσιο ενός παιχνιδιού διαστήματος, είναι συνηθισμένο να αποδίδονται συγκεκριμένες ζωές που μειώνονται μία-μία όταν το διαστημόπλοιό σας δέχεται ζημιά. Είναι ωραίο αν μπορείτε να δείξετε μια γραφική αναπαράσταση αυτού, όπως μικρά διαστημόπλοια ή καρδιές, αντί για έναν αριθμό.
## Τι θα δημιουργήσετε
Ας προσθέσουμε τα εξής στο παιχνίδι σας:
-- **Βαθμολογία παιχνιδιού**: Για κάθε εχθρικό σκάφος που καταστρέφεται, ο ήρωας θα πρέπει να κερδίζει πόντους. Προτείνουμε 100 πόντους ανά σκάφος. Η βαθμολογία του παιχνιδιού θα πρέπει να εμφανίζεται κάτω αριστερά.
-- **Ζωή**: Το σκάφος σας έχει τρεις ζωές. Χάνετε μία ζωή κάθε φορά που ένα εχθρικό σκάφος συγκρούεται με εσάς. Η βαθμολογία ζωής θα πρέπει να εμφανίζεται κάτω δεξιά και να αποτελείται από το εξής γραφικό .
+- **Βαθμολογία παιχνιδιού**: Για κάθε εχθρικό διαστημόπλοιο που καταστρέφεται, ο ήρωας θα πρέπει να κερδίζει πόντους. Προτείνουμε 100 πόντους ανά διαστημόπλοιο. Η βαθμολογία του παιχνιδιού θα πρέπει να εμφανίζεται κάτω αριστερά.
+- **Ζωές**: Το διαστημόπλοιό σας έχει τρεις ζωές. Χάνετε μία ζωή κάθε φορά που ένα εχθρικό διαστημόπλοιο συγκρούεται μαζί σας. Η βαθμολογία ζωής θα πρέπει να εμφανίζεται κάτω δεξιά και να αποτελείται από το εξής γραφικό: .
## Προτεινόμενα βήματα
@@ -60,11 +60,11 @@ cd your-work
npm start
```
-Το παραπάνω θα ξεκινήσει έναν HTTP Server στη διεύθυνση `http://localhost:5000`. Ανοίξτε έναν browser και εισάγετε αυτή τη διεύθυνση. Αυτή τη στιγμή θα πρέπει να εμφανίζεται ο ήρωας και όλοι οι εχθροί, και καθώς πατάτε τα αριστερά και δεξιά βέλη, ο ήρωας κινείται και μπορεί να καταρρίψει εχθρούς.
+Το παραπάνω θα ξεκινήσει έναν HTTP Server στη διεύθυνση `http://localhost:5000`. Ανοίξτε έναν περιηγητή και εισάγετε αυτή τη διεύθυνση. Αυτή τη στιγμή θα πρέπει να εμφανίζεται ο ήρωας και όλοι οι εχθροί, και καθώς πατάτε τα βελάκια αριστερά και δεξιά, ο ήρωας θα κινείται και θα μπορεί να καταρρίπτει εχθρούς.
### Προσθήκη κώδικα
-1. **Αντιγράψτε τα απαραίτητα assets** από τον φάκελο `solution/assets/` στον φάκελο `your-work`. Θα προσθέσετε το asset `life.png`. Προσθέστε το lifeImg στη συνάρτηση window.onload:
+1. **Αντιγράψτε τα απαραίτητα αρχεία** από τον φάκελο `solution/assets/` στον φάκελο `your-work`. Θα προσθέσετε το αρχείο `life.png`. Προσθέστε το lifeImg στη συνάρτηση window.onload:
```javascript
lifeImg = await loadTexture("assets/life.png");
@@ -80,9 +80,9 @@ npm start
eventEmitter = new EventEmitter();
```
-2. **Προσθέστε μεταβλητές**. Προσθέστε κώδικα που αντιπροσωπεύει τη συνολική βαθμολογία (0) και τις ζωές που απομένουν (3), και εμφανίστε αυτές τις βαθμολογίες στην οθόνη.
+2. **Προσθέστε μεταβλητές**. Προσθέστε κώδικα που αντιπροσωπεύει τη συνολική σας βαθμολογία (0) και τις ζωές που απομένουν (3), και εμφανίστε αυτές τις τιμές στην οθόνη.
-3. **Επεκτείνετε τη συνάρτηση `updateGameObjects()`**. Επεκτείνετε τη συνάρτηση `updateGameObjects()` για να χειριστείτε τις συγκρούσεις με εχθρούς:
+3. **Επεκτείνετε τη συνάρτηση `updateGameObjects()`**. Επεκτείνετε τη συνάρτηση `updateGameObjects()` για να χειρίζεται συγκρούσεις με εχθρούς:
```javascript
enemies.forEach(enemy => {
@@ -93,15 +93,15 @@ npm start
})
```
-4. **Προσθέστε `life` και `points`**.
- 1. **Αρχικοποιήστε μεταβλητές**. Κάτω από το `this.cooldown = 0` στην κλάση `Hero`, ορίστε τις μεταβλητές life και points:
+4. **Προσθέστε "ζωές" και "πόντους"**.
+ 1. **Αρχικοποιήστε μεταβλητές**. Κάτω από το `this.cooldown = 0` στην κλάση `Hero`, ορίστε τις ζωές και τους πόντους:
```javascript
this.life = 3;
this.points = 0;
```
- 1. **Σχεδιάστε τις μεταβλητές στην οθόνη**. Σχεδιάστε αυτές τις τιμές στην οθόνη:
+ 1. **Σχεδιάστε τις μεταβλητές στην οθόνη**. Εμφανίστε αυτές τις τιμές στην οθόνη:
```javascript
function drawLife() {
@@ -135,7 +135,7 @@ npm start
drawLife();
```
-1. **Υλοποιήστε κανόνες παιχνιδιού**. Υλοποιήστε τους εξής κανόνες παιχνιδιού:
+1. **Υλοποιήστε τους κανόνες του παιχνιδιού**. Υλοποιήστε τους εξής κανόνες:
1. **Για κάθε σύγκρουση ήρωα και εχθρού**, αφαιρέστε μία ζωή.
@@ -152,7 +152,7 @@ npm start
2. **Για κάθε λέιζερ που χτυπά έναν εχθρό**, αυξήστε τη βαθμολογία του παιχνιδιού κατά 100 πόντους.
- Επεκτείνετε την κλάση Hero για να κάνετε αυτή την αύξηση:
+ Επεκτείνετε την κλάση `Hero` για να κάνετε αυτή την αύξηση:
```javascript
incrementPoints() {
@@ -160,7 +160,7 @@ npm start
}
```
- Προσθέστε αυτές τις συναρτήσεις στους Collision Event Emitters:
+ Προσθέστε αυτές τις συναρτήσεις στους Εκπομπούς Συμβάντων Συγκρούσεων:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@@ -175,29 +175,29 @@ npm start
});
```
-✅ Κάντε λίγη έρευνα για να ανακαλύψετε άλλα παιχνίδια που έχουν δημιουργηθεί χρησιμοποιώντας JavaScript/Canvas. Ποια είναι τα κοινά χαρακτηριστικά τους;
+✅ Κάντε λίγη έρευνα για να ανακαλύψετε άλλα παιχνίδια που έχουν δημιουργηθεί χρησιμοποιώντας JavaScript/Canvas. Ποια είναι τα κοινά τους χαρακτηριστικά;
-Μέχρι το τέλος αυτής της εργασίας, θα πρέπει να βλέπετε τα μικρά σκάφη ζωής κάτω δεξιά, τους πόντους κάτω αριστερά, και θα πρέπει να βλέπετε τον αριθμό ζωών να μειώνεται καθώς συγκρούεστε με εχθρούς και τους πόντους να αυξάνονται όταν καταρρίπτετε εχθρούς. Μπράβο! Το παιχνίδι σας είναι σχεδόν ολοκληρωμένο.
+Μέχρι το τέλος αυτής της εργασίας, θα πρέπει να βλέπετε τα μικρά διαστημόπλοια "ζωής" κάτω δεξιά, τους πόντους κάτω αριστερά, και να βλέπετε τον αριθμό των ζωών σας να μειώνεται όταν συγκρούεστε με εχθρούς και τους πόντους σας να αυξάνονται όταν καταρρίπτετε εχθρούς. Μπράβο! Το παιχνίδι σας είναι σχεδόν έτοιμο.
---
## 🚀 Πρόκληση
-Ο κώδικάς σας είναι σχεδόν ολοκληρωμένος. Μπορείτε να φανταστείτε τα επόμενα βήματα;
+Ο κώδικάς σας είναι σχεδόν έτοιμος. Μπορείτε να φανταστείτε τα επόμενα βήματα;
-## Ερωτηματολόγιο Μετά το Μάθημα
+## Κουίζ μετά το μάθημα
-[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/38)
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/38)
## Ανασκόπηση & Αυτομελέτη
-Ερευνήστε μερικούς τρόπους με τους οποίους μπορείτε να αυξάνετε και να μειώνετε τις βαθμολογίες και τις ζωές στο παιχνίδι. Υπάρχουν ενδιαφέρουσες μηχανές παιχνιδιών όπως το [PlayFab](https://playfab.com). Πώς θα μπορούσε η χρήση μιας τέτοιας μηχανής να βελτιώσει το παιχνίδι σας;
+Ερευνήστε τρόπους με τους οποίους μπορείτε να αυξομειώνετε τη βαθμολογία και τις ζωές σε ένα παιχνίδι. Υπάρχουν ενδιαφέρουσες μηχανές παιχνιδιών όπως το [PlayFab](https://playfab.com). Πώς θα μπορούσε η χρήση μιας τέτοιας μηχανής να βελτιώσει το παιχνίδι σας;
## Εργασία
-[Δημιουργία Παιχνιδιού Βαθμολογίας](assignment.md)
+[Δημιουργήστε ένα Παιχνίδι με Βαθμολογία](assignment.md)
---
-**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+**Αποποίηση Ευθύνης**:
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/6-space-game/6-end-condition/README.md b/translations/el/6-space-game/6-end-condition/README.md
index 137bbda6..83a4f0e6 100644
--- a/translations/el/6-space-game/6-end-condition/README.md
+++ b/translations/el/6-space-game/6-end-condition/README.md
@@ -1,8 +1,8 @@
-# Δημιουργία Εφαρμογής Τραπεζικής Μέσω Διαδικτύου Μέρος 1: Πρότυπα HTML και Διαδρομές σε Μια Εφαρμογή Ιστού
+# Δημιουργία Εφαρμογής Τραπεζικής Μέρος 1: HTML Πρότυπα και Διαδρομές σε Μια Εφαρμογή Ιστού
-## Ερωτηματολόγιο Πριν το Μάθημα
+## Κουίζ Πριν το Μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/41)
+[Κουίζ πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/41)
### Εισαγωγή
-Από την εμφάνιση της JavaScript στους περιηγητές, οι ιστοσελίδες γίνονται πιο διαδραστικές και πολύπλοκες από ποτέ. Οι τεχνολογίες ιστού χρησιμοποιούνται πλέον ευρέως για τη δημιουργία πλήρως λειτουργικών εφαρμογών που εκτελούνται απευθείας σε έναν περιηγητή, τις οποίες ονομάζουμε [εφαρμογές ιστού](https://en.wikipedia.org/wiki/Web_application). Καθώς οι εφαρμογές ιστού είναι ιδιαίτερα διαδραστικές, οι χρήστες δεν θέλουν να περιμένουν την ανανέωση ολόκληρης της σελίδας κάθε φορά που εκτελείται μια ενέργεια. Γι' αυτό η JavaScript χρησιμοποιείται για την ενημέρωση του HTML απευθείας μέσω του DOM, προσφέροντας μια πιο ομαλή εμπειρία χρήστη.
+Από την εμφάνιση της JavaScript στους περιηγητές, οι ιστοσελίδες γίνονται πιο διαδραστικές και πολύπλοκες από ποτέ. Οι τεχνολογίες ιστού χρησιμοποιούνται πλέον ευρέως για τη δημιουργία πλήρως λειτουργικών εφαρμογών που εκτελούνται απευθείας σε έναν περιηγητή, τις οποίες αποκαλούμε [εφαρμογές ιστού](https://en.wikipedia.org/wiki/Web_application). Καθώς οι εφαρμογές ιστού είναι ιδιαίτερα διαδραστικές, οι χρήστες δεν θέλουν να περιμένουν την πλήρη ανανέωση της σελίδας κάθε φορά που εκτελείται μια ενέργεια. Γι' αυτό η JavaScript χρησιμοποιείται για την άμεση ενημέρωση του HTML μέσω του DOM, προσφέροντας μια πιο ομαλή εμπειρία χρήστη.
-Σε αυτό το μάθημα, θα θέσουμε τα θεμέλια για τη δημιουργία μιας τραπεζικής εφαρμογής ιστού, χρησιμοποιώντας πρότυπα HTML για τη δημιουργία πολλαπλών οθονών που μπορούν να εμφανίζονται και να ενημερώνονται χωρίς να χρειάζεται να ανανεωθεί ολόκληρη η σελίδα HTML.
+Σε αυτό το μάθημα, θα θέσουμε τα θεμέλια για τη δημιουργία μιας τραπεζικής εφαρμογής ιστού, χρησιμοποιώντας HTML πρότυπα για τη δημιουργία πολλαπλών οθονών που μπορούν να εμφανίζονται και να ενημερώνονται χωρίς να χρειάζεται να ανανεωθεί ολόκληρη η HTML σελίδα.
### Προαπαιτούμενα
@@ -25,7 +25,7 @@ CO_OP_TRANSLATOR_METADATA:
### Προετοιμασία
-Στον υπολογιστή σας, δημιουργήστε έναν φάκελο με όνομα `bank` και ένα αρχείο με όνομα `index.html` μέσα σε αυτόν. Θα ξεκινήσουμε από αυτό το [βασικό πρότυπο](https://en.wikipedia.org/wiki/Boilerplate_code) HTML:
+Στον υπολογιστή σας, δημιουργήστε έναν φάκελο με όνομα `bank` και ένα αρχείο με όνομα `index.html` μέσα σε αυτόν. Θα ξεκινήσουμε από αυτό το [βασικό HTML πρότυπο](https://en.wikipedia.org/wiki/Boilerplate_code):
```html
@@ -43,28 +43,28 @@ CO_OP_TRANSLATOR_METADATA:
---
-## Πρότυπα HTML
+## HTML Πρότυπα
-Αν θέλετε να δημιουργήσετε πολλαπλές οθόνες για μια ιστοσελίδα, μια λύση θα ήταν να δημιουργήσετε ένα αρχείο HTML για κάθε οθόνη που θέλετε να εμφανίσετε. Ωστόσο, αυτή η λύση έχει κάποια μειονεκτήματα:
+Αν θέλετε να δημιουργήσετε πολλαπλές οθόνες για μια ιστοσελίδα, μια λύση θα ήταν να δημιουργήσετε ένα αρχείο HTML για κάθε οθόνη που θέλετε να εμφανίσετε. Ωστόσο, αυτή η λύση έχει κάποιες δυσκολίες:
-- Πρέπει να ανανεώνετε ολόκληρο το HTML όταν αλλάζετε οθόνη, κάτι που μπορεί να είναι αργό.
-- Είναι δύσκολο να μοιραστείτε δεδομένα μεταξύ των διαφορετικών οθονών.
+- Πρέπει να ανανεώνετε ολόκληρη την HTML όταν αλλάζετε οθόνη, κάτι που μπορεί να είναι αργό.
+- Είναι δύσκολο να μοιράζεστε δεδομένα μεταξύ των διαφορετικών οθονών.
-Μια άλλη προσέγγιση είναι να έχετε μόνο ένα αρχείο HTML και να ορίσετε πολλαπλά [πρότυπα HTML](https://developer.mozilla.org/docs/Web/HTML/Element/template) χρησιμοποιώντας το στοιχείο ``. Ένα πρότυπο είναι ένα επαναχρησιμοποιήσιμο μπλοκ HTML που δεν εμφανίζεται από τον περιηγητή και πρέπει να ενεργοποιηθεί κατά την εκτέλεση μέσω JavaScript.
+Μια άλλη προσέγγιση είναι να έχετε μόνο ένα αρχείο HTML και να ορίσετε πολλαπλά [HTML πρότυπα](https://developer.mozilla.org/docs/Web/HTML/Element/template) χρησιμοποιώντας το στοιχείο ``. Ένα πρότυπο είναι ένα επαναχρησιμοποιήσιμο μπλοκ HTML που δεν εμφανίζεται από τον περιηγητή και πρέπει να δημιουργηθεί κατά την εκτέλεση μέσω JavaScript.
### Εργασία
-Θα δημιουργήσουμε μια τραπεζική εφαρμογή με δύο οθόνες: τη σελίδα σύνδεσης και τον πίνακα ελέγχου. Αρχικά, ας προσθέσουμε στο σώμα του HTML ένα στοιχείο κράτησης θέσης που θα χρησιμοποιήσουμε για να ενεργοποιήσουμε τις διαφορετικές οθόνες της εφαρμογής μας:
+Θα δημιουργήσουμε μια τραπεζική εφαρμογή με δύο οθόνες: τη σελίδα σύνδεσης και τον πίνακα ελέγχου. Αρχικά, ας προσθέσουμε στο σώμα του HTML ένα στοιχείο κράτησης θέσης που θα χρησιμοποιήσουμε για να δημιουργήσουμε τις διαφορετικές οθόνες της εφαρμογής μας:
```html
Loading...
```
-Δίνουμε σε αυτό ένα `id` για να είναι πιο εύκολο να το εντοπίσουμε με τη JavaScript αργότερα.
+Δίνουμε ένα `id` για να είναι πιο εύκολο να το εντοπίσουμε με τη JavaScript αργότερα.
-> Συμβουλή: Επειδή το περιεχόμενο αυτού του στοιχείου θα αντικατασταθεί, μπορούμε να βάλουμε ένα μήνυμα ή έναν δείκτη φόρτωσης που θα εμφανίζεται ενώ η εφαρμογή φορτώνει.
+> Συμβουλή: Επειδή το περιεχόμενο αυτού του στοιχείου θα αντικατασταθεί, μπορούμε να βάλουμε ένα μήνυμα ή δείκτη φόρτωσης που θα εμφανίζεται όσο η εφαρμογή φορτώνει.
-Στη συνέχεια, ας προσθέσουμε κάτω από αυτό το πρότυπο HTML για τη σελίδα σύνδεσης. Προς το παρόν, θα βάλουμε μόνο έναν τίτλο και μια ενότητα που περιέχει έναν σύνδεσμο που θα χρησιμοποιήσουμε για την πλοήγηση.
+Στη συνέχεια, ας προσθέσουμε κάτω από αυτό το HTML πρότυπο για τη σελίδα σύνδεσης. Προς το παρόν, θα βάλουμε μόνο έναν τίτλο και μια ενότητα που περιέχει έναν σύνδεσμο που θα χρησιμοποιήσουμε για την πλοήγηση.
```html
@@ -75,7 +75,7 @@ CO_OP_TRANSLATOR_METADATA:
```
-Έπειτα, θα προσθέσουμε ένα άλλο πρότυπο HTML για τη σελίδα του πίνακα ελέγχου. Αυτή η σελίδα θα περιέχει διαφορετικές ενότητες:
+Έπειτα, θα προσθέσουμε ένα άλλο HTML πρότυπο για τη σελίδα του πίνακα ελέγχου. Αυτή η σελίδα θα περιέχει διαφορετικές ενότητες:
- Μια κεφαλίδα με έναν τίτλο και έναν σύνδεσμο αποσύνδεσης
- Το τρέχον υπόλοιπο του τραπεζικού λογαριασμού
@@ -106,15 +106,15 @@ CO_OP_TRANSLATOR_METADATA:
```
-> Συμβουλή: Όταν δημιουργείτε πρότυπα HTML, αν θέλετε να δείτε πώς θα φαίνονται, μπορείτε να σχολιάσετε τις γραμμές `` και `` περικλείοντάς τις με ``.
+> Συμβουλή: Όταν δημιουργείτε HTML πρότυπα, αν θέλετε να δείτε πώς θα φαίνονται, μπορείτε να σχολιάσετε τις γραμμές `` και `` περικλείοντάς τις με ``.
-✅ Γιατί πιστεύετε ότι χρησιμοποιούμε χαρακτηριστικά `id` στα πρότυπα; Θα μπορούσαμε να χρησιμοποιήσουμε κάτι άλλο, όπως κλάσεις;
+✅ Γιατί πιστεύετε ότι χρησιμοποιούμε `id` χαρακτηριστικά στα πρότυπα; Θα μπορούσαμε να χρησιμοποιήσουμε κάτι άλλο, όπως κλάσεις;
-## Εμφάνιση προτύπων με JavaScript
+## Εμφάνιση Προτύπων με JavaScript
-Αν δοκιμάσετε το τρέχον αρχείο HTML σε έναν περιηγητή, θα δείτε ότι μένει κολλημένο στο μήνυμα `Loading...`. Αυτό συμβαίνει επειδή πρέπει να προσθέσουμε κάποιον κώδικα JavaScript για να ενεργοποιήσουμε και να εμφανίσουμε τα πρότυπα HTML.
+Αν δοκιμάσετε το τρέχον αρχείο HTML σε έναν περιηγητή, θα δείτε ότι μένει κολλημένο στο μήνυμα `Loading...`. Αυτό συμβαίνει επειδή πρέπει να προσθέσουμε κάποιον κώδικα JavaScript για να δημιουργήσουμε και να εμφανίσουμε τα HTML πρότυπα.
-Η ενεργοποίηση ενός προτύπου γίνεται συνήθως σε 3 βήματα:
+Η δημιουργία ενός προτύπου γίνεται συνήθως σε 3 βήματα:
1. Εντοπισμός του στοιχείου προτύπου στο DOM, για παράδειγμα χρησιμοποιώντας [`document.getElementById`](https://developer.mozilla.org/docs/Web/API/Document/getElementById).
2. Κλωνοποίηση του στοιχείου προτύπου, χρησιμοποιώντας [`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode).
@@ -142,7 +142,7 @@ function updateRoute(templateId) {
}
```
-Αυτό που κάνουμε εδώ είναι ακριβώς τα 3 βήματα που περιγράφηκαν παραπάνω. Ενεργοποιούμε το πρότυπο με το `id` `templateId` και τοποθετούμε το κλωνοποιημένο περιεχόμενό του μέσα στο στοιχείο κράτησης θέσης της εφαρμογής μας. Σημειώστε ότι πρέπει να χρησιμοποιήσουμε `cloneNode(true)` για να αντιγράψουμε ολόκληρο το υποδέντρο του προτύπου.
+Αυτό που κάνουμε εδώ είναι ακριβώς τα 3 βήματα που περιγράφηκαν παραπάνω. Δημιουργούμε το πρότυπο με το `id` `templateId` και τοποθετούμε το κλωνοποιημένο περιεχόμενό του μέσα στο στοιχείο κράτησης θέσης της εφαρμογής μας. Σημειώστε ότι πρέπει να χρησιμοποιήσουμε `cloneNode(true)` για να αντιγράψουμε ολόκληρο το υποδέντρο του προτύπου.
Τώρα καλέστε αυτή τη συνάρτηση με ένα από τα πρότυπα και δείτε το αποτέλεσμα.
@@ -150,11 +150,11 @@ function updateRoute(templateId) {
updateRoute('login');
```
-✅ Ποιος είναι ο σκοπός αυτού του κώδικα `app.innerHTML = '';`; Τι συμβαίνει χωρίς αυτόν;
+✅ Ποιος είναι ο σκοπός αυτού του κώδικα `app.innerHTML = '';`; Τι συμβαίνει χωρίς αυτό;
-## Δημιουργία διαδρομών
+## Δημιουργία Διαδρομών
-Όταν μιλάμε για μια εφαρμογή ιστού, ονομάζουμε *Δρομολόγηση* την πρόθεση να αντιστοιχίσουμε **URLs** σε συγκεκριμένες οθόνες που πρέπει να εμφανίζονται. Σε μια ιστοσελίδα με πολλαπλά αρχεία HTML, αυτό γίνεται αυτόματα καθώς οι διαδρομές των αρχείων αντικατοπτρίζονται στο URL. Για παράδειγμα, με αυτά τα αρχεία στον φάκελο του έργου σας:
+Όταν μιλάμε για μια εφαρμογή ιστού, ονομάζουμε *Δρομολόγηση* την πρόθεση να αντιστοιχίσουμε **URLs** σε συγκεκριμένες οθόνες που πρέπει να εμφανιστούν. Σε έναν ιστότοπο με πολλαπλά αρχεία HTML, αυτό γίνεται αυτόματα καθώς τα μονοπάτια των αρχείων αντικατοπτρίζονται στο URL. Για παράδειγμα, με αυτά τα αρχεία στον φάκελο του έργου σας:
```
mywebsite/index.html
@@ -162,7 +162,7 @@ mywebsite/login.html
mywebsite/admin/index.html
```
-Αν δημιουργήσετε έναν διακομιστή ιστού με ρίζα το `mywebsite`, η αντιστοίχηση URL θα είναι:
+Αν δημιουργήσετε έναν διακομιστή ιστού με ρίζα το `mywebsite`, η αντιστοίχιση URL θα είναι:
```
https://site.com --> mywebsite/index.html
@@ -174,7 +174,7 @@ https://site.com/admin/ --> mywebsite/admin/index.html
### Εργασία
-Θα χρησιμοποιήσουμε ένα απλό αντικείμενο για να υλοποιήσουμε έναν [χάρτη](https://en.wikipedia.org/wiki/Associative_array) μεταξύ διαδρομών URL και των προτύπων μας. Προσθέστε αυτό το αντικείμενο στην κορυφή του αρχείου `app.js`.
+Θα χρησιμοποιήσουμε ένα απλό αντικείμενο για να υλοποιήσουμε έναν [χάρτη](https://en.wikipedia.org/wiki/Associative_array) μεταξύ μονοπατιών URL και των προτύπων μας. Προσθέστε αυτό το αντικείμενο στην κορυφή του αρχείου `app.js` σας.
```js
const routes = {
@@ -202,7 +202,7 @@ function updateRoute() {
✅ Τι συμβαίνει αν εισάγετε μια άγνωστη διαδρομή στο URL; Πώς θα μπορούσαμε να λύσουμε αυτό το πρόβλημα;
-## Προσθήκη πλοήγησης
+## Προσθήκη Πλοήγησης
Το επόμενο βήμα για την εφαρμογή μας είναι να προσθέσουμε τη δυνατότητα πλοήγησης μεταξύ των σελίδων χωρίς να χρειάζεται να αλλάζουμε το URL χειροκίνητα. Αυτό συνεπάγεται δύο πράγματα:
@@ -228,7 +228,7 @@ function navigate(path) {
Αυτή η μέθοδος πρώτα ενημερώνει το τρέχον URL με βάση τη δοθείσα διαδρομή και στη συνέχεια ενημερώνει το πρότυπο. Η ιδιότητα `window.location.origin` επιστρέφει τη ρίζα του URL, επιτρέποντάς μας να ανακατασκευάσουμε ένα πλήρες URL από μια δοθείσα διαδρομή.
-Τώρα που έχουμε αυτή τη συνάρτηση, μπορούμε να φροντίσουμε το πρόβλημα που έχουμε αν μια διαδρομή δεν αντιστοιχεί σε καμία καθορισμένη διαδρομή. Θα τροποποιήσουμε τη συνάρτηση `updateRoute` προσθέτοντας μια εναλλακτική σε μία από τις υπάρχουσες διαδρομές αν δεν μπορούμε να βρούμε αντιστοιχία.
+Τώρα που έχουμε αυτή τη συνάρτηση, μπορούμε να αντιμετωπίσουμε το πρόβλημα που έχουμε αν μια διαδρομή δεν αντιστοιχεί σε καμία καθορισμένη διαδρομή. Θα τροποποιήσουμε τη συνάρτηση `updateRoute` προσθέτοντας μια εναλλακτική λύση σε μία από τις υπάρχουσες διαδρομές αν δεν μπορούμε να βρούμε αντιστοιχία.
```js
function updateRoute() {
@@ -244,7 +244,7 @@ function updateRoute() {
Αν δεν μπορεί να βρεθεί διαδρομή, τώρα θα ανακατευθυνθούμε στη σελίδα `login`.
-Τώρα ας δημιουργήσουμε μια συνάρτηση για να πάρουμε το URL όταν γίνεται κλικ σε έναν σύνδεσμο και να αποτρέψουμε την προεπιλεγμένη συμπεριφορά του περιηγητή για τους συνδέσμους:
+Ας δημιουργήσουμε μια συνάρτηση για να πάρουμε το URL όταν γίνεται κλικ σε έναν σύνδεσμο και να αποτρέψουμε την προεπιλεγμένη συμπεριφορά του περιηγητή για τους συνδέσμους:
```js
function onLinkClick(event) {
@@ -253,7 +253,7 @@ function onLinkClick(event) {
}
```
-Ας ολοκληρώσουμε το σύστημα πλοήγησης προσθέτοντας συνδέσεις στις *Login* και *Logout* συνδέσεις στο HTML.
+Ας ολοκληρώσουμε το σύστημα πλοήγησης προσθέτοντας συνδέσεις στις συνδέσεις *Login* και *Logout* στο HTML.
```html
Login
@@ -269,9 +269,9 @@ function onLinkClick(event) {
✅ Η μέθοδος `history.pushState` είναι μέρος του προτύπου HTML5 και υλοποιείται σε [όλους τους σύγχρονους περιηγητές](https://caniuse.com/?search=pushState). Αν δημιουργείτε μια εφαρμογή ιστού για παλαιότερους περιηγητές, υπάρχει ένα τέχνασμα που μπορείτε να χρησιμοποιήσετε αντί αυτής της API: χρησιμοποιώντας ένα [hash (`#`)](https://en.wikipedia.org/wiki/URI_fragment) πριν από τη διαδρομή, μπορείτε να υλοποιήσετε δρομολόγηση που λειτουργεί με κανονική πλοήγηση αγκύρωσης και δεν ανανεώνει τη σελίδα, καθώς ο σκοπός του ήταν να δημιουργήσει εσωτερικούς συνδέσμους μέσα σε μια σελίδα.
-## Χειρισμός των κουμπιών "Πίσω" και "Εμπρός" του περιηγητή
+## Χειρισμός των Κουμπιών Πίσω και Εμπρός του Περιηγητή
-Η χρήση του `history.pushState` δημιουργεί νέες καταχωρήσεις στο ιστορικό περιήγησης του περιηγητή. Μπορείτε να το ελέγξετε κρατώντας πατημένο το κουμπί *πίσω* του περιηγητή σας, θα πρέπει να εμφανίζει κάτι σαν αυτό:
+Η χρήση του `history.pushState` δημιουργεί νέες καταχωρήσεις στο ιστορικό περιήγησης του περιηγητή. Μπορείτε να το ελέγξετε κρατώντας πατημένο το *κουμπί πίσω* του περιηγητή σας, θα πρέπει να εμφανίζει κάτι σαν αυτό:

@@ -294,7 +294,7 @@ updateRoute();
[](https://youtube.com/watch?v=OP6eEbOj2sc "Συναρτήσεις Βέλους")
-> 🎥 Κάντε κλικ στην παραπάνω εικόνα για ένα βίντεο σχετικά με τις συναρτήσεις βέλους.
+> 🎥 Κάντε κλικ στην εικόνα παραπάνω για ένα βίντεο σχετικά με τις συναρτήσεις βέλους.
Τώρα δοκιμάστε να χρησιμοποιήσετε τα κουμπιά πίσω και εμπρός του περιηγητή σας και ελέγξτε ότι η εμφανιζόμενη διαδρομή ενημερώνεται σωστά αυτή τη φορά.
@@ -302,15 +302,17 @@ updateRoute();
## 🚀 Πρόκληση
-Προσθέστε ένα νέο πρότυπο και μια διαδρομή για μια τρίτη σελίδα που εμφανίζει τα credits αυτής της εφαρμογής.
+Προσθέστε ένα νέο πρότυπο και διαδρομή για μια τρίτη σελίδα που εμφανίζει τα credits αυτής της εφαρμογής.
-## Ερωτηματολόγιο Μετά το Μάθημα
+## Κουίζ Μετά το Μάθημα
-[Ερωτηματολόγιο μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/42)
+[Κουίζ μετά το μάθημα](https://ff-quizzes.netlify.app/web/quiz/42)
-##
+## Ανασκόπηση & Αυτομελέτη
+
+Η δρομολόγηση είναι ένα από τα εκπληκτικά δύσκολα μέρη της ανάπτυξης ιστού, ειδικά καθώς ο ιστός μετακινείται από συμπερι
---
-**Αποποίηση ευθύνης**:
-Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
+**Αποποίηση Ευθύνης**:
+Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.
\ No newline at end of file
diff --git a/translations/el/7-bank-project/2-forms/README.md b/translations/el/7-bank-project/2-forms/README.md
index 98613f5d..dbfbd193 100644
--- a/translations/el/7-bank-project/2-forms/README.md
+++ b/translations/el/7-bank-project/2-forms/README.md
@@ -1,8 +1,8 @@
-# Δημιουργία Εφαρμογής Τραπεζικής Διαχείρισης Μέρος 3: Μέθοδοι Ανάκτησης και Χρήσης Δεδομένων
+# Δημιουργία Εφαρμογής Τραπεζικής Μέρος 3: Μέθοδοι Ανάκτησης και Χρήσης Δεδομένων
## Ερωτηματολόγιο Πριν το Μάθημα
-[Ερωτηματολόγιο πριν το μάθημα](https://ff-quizzes.netlify.app/web/quiz/45)
+[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/45)
### Εισαγωγή
-Στον πυρήνα κάθε διαδικτυακής εφαρμογής βρίσκονται τα *δεδομένα*. Τα δεδομένα μπορούν να έχουν πολλές μορφές, αλλά ο κύριος σκοπός τους είναι πάντα να εμφανίζουν πληροφορίες στον χρήστη. Με τις διαδικτυακές εφαρμογές να γίνονται όλο και πιο διαδραστικές και πολύπλοκες, το πώς ο χρήστης αποκτά πρόσβαση και αλληλεπιδρά με τις πληροφορίες αποτελεί πλέον βασικό μέρος της ανάπτυξης ιστοσελίδων.
+Στον πυρήνα κάθε διαδικτυακής εφαρμογής βρίσκονται τα *δεδομένα*. Τα δεδομένα μπορούν να έχουν πολλές μορφές, αλλά ο κύριος σκοπός τους είναι πάντα να εμφανίζουν πληροφορίες στον χρήστη. Με τις διαδικτυακές εφαρμογές να γίνονται όλο και πιο διαδραστικές και πολύπλοκες, ο τρόπος με τον οποίο ο χρήστης αποκτά πρόσβαση και αλληλεπιδρά με τις πληροφορίες αποτελεί πλέον βασικό μέρος της ανάπτυξης ιστοσελίδων.
-Σε αυτό το μάθημα, θα δούμε πώς να ανακτούμε δεδομένα από έναν διακομιστή ασύγχρονα και να χρησιμοποιούμε αυτά τα δεδομένα για να εμφανίζουμε πληροφορίες σε μια ιστοσελίδα χωρίς να χρειάζεται να ανανεώνουμε το HTML.
+Σε αυτό το μάθημα, θα δούμε πώς να ανακτούμε δεδομένα από έναν διακομιστή ασύγχρονα και να χρησιμοποιούμε αυτά τα δεδομένα για να εμφανίζουμε πληροφορίες σε μια ιστοσελίδα χωρίς να χρειάζεται να φορτώσουμε ξανά το HTML.
### Προαπαιτούμενα
-Πρέπει να έχετε δημιουργήσει το [Φόρμα Εισόδου και Εγγραφής](../2-forms/README.md) μέρος της διαδικτυακής εφαρμογής για αυτό το μάθημα. Επίσης, πρέπει να έχετε εγκαταστήσει το [Node.js](https://nodejs.org) και να [εκτελέσετε το API του διακομιστή](../api/README.md) τοπικά ώστε να αποκτήσετε δεδομένα λογαριασμού.
+Πρέπει να έχετε δημιουργήσει τη [Φόρμα Εισόδου και Εγγραφής](../2-forms/README.md) της διαδικτυακής εφαρμογής για αυτό το μάθημα. Επίσης, πρέπει να εγκαταστήσετε το [Node.js](https://nodejs.org) και να [εκτελέσετε το API του διακομιστή](../api/README.md) τοπικά ώστε να αποκτήσετε δεδομένα λογαριασμού.
-Μπορείτε να ελέγξετε αν ο διακομιστής λειτουργεί σωστά εκτελώντας αυτήν την εντολή σε ένα τερματικό:
+Μπορείτε να δοκιμάσετε ότι ο διακομιστής λειτουργεί σωστά εκτελώντας αυτήν την εντολή σε ένα τερματικό:
```sh
curl http://localhost:5000/api
@@ -34,17 +34,17 @@ curl http://localhost:5000/api
## AJAX και ανάκτηση δεδομένων
-Οι παραδοσιακές ιστοσελίδες ενημερώνουν το περιεχόμενο που εμφανίζεται όταν ο χρήστης επιλέγει έναν σύνδεσμο ή υποβάλλει δεδομένα μέσω μιας φόρμας, ανανεώνοντας ολόκληρη τη σελίδα HTML. Κάθε φορά που χρειάζονται νέα δεδομένα, ο διακομιστής επιστρέφει μια ολοκαίνουργια σελίδα HTML που πρέπει να επεξεργαστεί ο περιηγητής, διακόπτοντας τη δράση του χρήστη και περιορίζοντας τις αλληλεπιδράσεις κατά τη διάρκεια της ανανέωσης. Αυτή η ροή εργασίας ονομάζεται επίσης *Εφαρμογή Πολλαπλών Σελίδων* ή *MPA*.
+Οι παραδοσιακές ιστοσελίδες ενημερώνουν το περιεχόμενο που εμφανίζεται όταν ο χρήστης επιλέγει έναν σύνδεσμο ή υποβάλλει δεδομένα μέσω μιας φόρμας, φορτώνοντας ξανά ολόκληρη τη σελίδα HTML. Κάθε φορά που χρειάζονται νέα δεδομένα, ο διακομιστής επιστρέφει μια ολοκαίνουργια σελίδα HTML που πρέπει να επεξεργαστεί ο περιηγητής, διακόπτοντας την τρέχουσα ενέργεια του χρήστη και περιορίζοντας τις αλληλεπιδράσεις κατά τη διάρκεια της φόρτωσης. Αυτή η ροή εργασίας ονομάζεται επίσης *Εφαρμογή Πολλαπλών Σελίδων* ή *MPA*.

-Όταν οι διαδικτυακές εφαρμογές άρχισαν να γίνονται πιο πολύπλοκες και διαδραστικές, εμφανίστηκε μια νέα τεχνική που ονομάζεται [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)). Αυτή η τεχνική επιτρέπει στις διαδικτυακές εφαρμογές να στέλνουν και να ανακτούν δεδομένα από έναν διακομιστή ασύγχρονα χρησιμοποιώντας JavaScript, χωρίς να χρειάζεται να ανανεώνεται η σελίδα HTML, με αποτέλεσμα ταχύτερες ενημερώσεις και ομαλότερες αλληλεπιδράσεις χρήστη. Όταν λαμβάνονται νέα δεδομένα από τον διακομιστή, η τρέχουσα σελίδα HTML μπορεί επίσης να ενημερωθεί με JavaScript χρησιμοποιώντας το [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API. Με την πάροδο του χρόνου, αυτή η προσέγγιση εξελίχθηκε σε αυτό που τώρα ονομάζεται [*Εφαρμογή Μίας Σελίδας* ή *SPA*](https://en.wikipedia.org/wiki/Single-page_application).
+Όταν οι διαδικτυακές εφαρμογές άρχισαν να γίνονται πιο πολύπλοκες και διαδραστικές, εμφανίστηκε μια νέα τεχνική που ονομάζεται [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)). Αυτή η τεχνική επιτρέπει στις διαδικτυακές εφαρμογές να στέλνουν και να ανακτούν δεδομένα από έναν διακομιστή ασύγχρονα χρησιμοποιώντας JavaScript, χωρίς να χρειάζεται να φορτώσουν ξανά τη σελίδα HTML, με αποτέλεσμα ταχύτερες ενημερώσεις και πιο ομαλές αλληλεπιδράσεις χρήστη. Όταν λαμβάνονται νέα δεδομένα από τον διακομιστή, η τρέχουσα σελίδα HTML μπορεί επίσης να ενημερωθεί με JavaScript χρησιμοποιώντας το [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API. Με την πάροδο του χρόνου, αυτή η προσέγγιση εξελίχθηκε σε αυτό που τώρα ονομάζεται [*Εφαρμογή Μίας Σελίδας* ή *SPA*](https://en.wikipedia.org/wiki/Single-page_application).

-Όταν το AJAX εισήχθη για πρώτη φορά, η μόνη διαθέσιμη API για ασύγχρονη ανάκτηση δεδομένων ήταν το [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Ωστόσο, οι σύγχρονοι περιηγητές υλοποιούν πλέον και την πιο βολική και ισχυρή [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), η οποία χρησιμοποιεί promises και είναι καλύτερα προσαρμοσμένη για τη διαχείριση δεδομένων JSON.
+Όταν το AJAX πρωτοεμφανίστηκε, η μόνη διαθέσιμη API για ασύγχρονη ανάκτηση δεδομένων ήταν το [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Ωστόσο, οι σύγχρονοι περιηγητές πλέον υλοποιούν επίσης την πιο βολική και ισχυρή [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), η οποία χρησιμοποιεί υποσχέσεις (promises) και είναι καλύτερα προσαρμοσμένη για χειρισμό δεδομένων JSON.
-> Παρόλο που όλοι οι σύγχρονοι περιηγητές υποστηρίζουν το `Fetch API`, αν θέλετε η διαδικτυακή σας εφαρμογή να λειτουργεί σε παλαιότερους περιηγητές, είναι πάντα καλή ιδέα να ελέγχετε πρώτα τον [πίνακα συμβατότητας στο caniuse.com](https://caniuse.com/fetch).
+> Παρόλο που όλοι οι σύγχρονοι περιηγητές υποστηρίζουν το `Fetch API`, αν θέλετε η διαδικτυακή σας εφαρμογή να λειτουργεί σε παλαιότερους περιηγητές, είναι πάντα καλή ιδέα να ελέγξετε πρώτα τον [πίνακα συμβατότητας στο caniuse.com](https://caniuse.com/fetch).
### Εργασία
@@ -57,9 +57,9 @@ async function login() {
}
```
-Ξεκινάμε ανακτώντας το στοιχείο της φόρμας με τη μέθοδο `getElementById()`, και στη συνέχεια παίρνουμε το όνομα χρήστη από την είσοδο με `loginForm.user.value`. Κάθε στοιχείο φόρμας μπορεί να προσπελαστεί μέσω του ονόματός του (που ορίζεται στο HTML με το χαρακτηριστικό `name`) ως ιδιότητα της φόρμας.
+Ξεκινάμε ανακτώντας το στοιχείο της φόρμας με το `getElementById()`, και στη συνέχεια παίρνουμε το όνομα χρήστη από την είσοδο με το `loginForm.user.value`. Κάθε στοιχείο φόρμας μπορεί να προσπελαστεί μέσω του ονόματός του (που ορίζεται στο HTML χρησιμοποιώντας το χαρακτηριστικό `name`) ως ιδιότητα της φόρμας.
-Με παρόμοιο τρόπο με αυτόν που χρησιμοποιήσαμε για την εγγραφή, θα δημιουργήσουμε μια άλλη συνάρτηση για να εκτελέσουμε ένα αίτημα στον διακομιστή, αλλά αυτή τη φορά για την ανάκτηση των δεδομένων του λογαριασμού:
+Με παρόμοιο τρόπο όπως κάναμε για την εγγραφή, θα δημιουργήσουμε μια άλλη συνάρτηση για την εκτέλεση αιτήματος στον διακομιστή, αλλά αυτή τη φορά για την ανάκτηση των δεδομένων του λογαριασμού:
```js
async function getAccount(user) {
@@ -72,11 +72,11 @@ async function getAccount(user) {
}
```
-Χρησιμοποιούμε το `fetch` API για να ζητήσουμε δεδομένα ασύγχρονα από τον διακομιστή, αλλά αυτή τη φορά δεν χρειαζόμαστε επιπλέον παραμέτρους πέρα από το URL που θα καλέσουμε, καθώς απλώς ζητάμε δεδομένα. Από προεπιλογή, το `fetch` δημιουργεί ένα HTTP αίτημα [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET), το οποίο είναι αυτό που χρειαζόμαστε εδώ.
+Χρησιμοποιούμε το `fetch` API για να ζητήσουμε δεδομένα ασύγχρονα από τον διακομιστή, αλλά αυτή τη φορά δεν χρειαζόμαστε επιπλέον παραμέτρους εκτός από το URL που θα καλέσουμε, καθώς απλώς ζητάμε δεδομένα. Από προεπιλογή, το `fetch` δημιουργεί ένα HTTP αίτημα [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET), το οποίο είναι αυτό που χρειαζόμαστε εδώ.
-✅ Η `encodeURIComponent()` είναι μια συνάρτηση που διαφεύγει ειδικούς χαρακτήρες για URL. Τι προβλήματα θα μπορούσαμε να έχουμε αν δεν καλέσουμε αυτή τη συνάρτηση και χρησιμοποιήσουμε απευθείας την τιμή `user` στο URL;
+✅ Το `encodeURIComponent()` είναι μια συνάρτηση που διαφεύγει ειδικούς χαρακτήρες για το URL. Τι προβλήματα θα μπορούσαμε να έχουμε αν δεν καλέσουμε αυτή τη συνάρτηση και χρησιμοποιήσουμε απευθείας την τιμή `user` στο URL;
-Ας ενημερώσουμε τώρα τη συνάρτηση `login` για να χρησιμοποιεί τη `getAccount`:
+Ας ενημερώσουμε τώρα τη συνάρτηση `login` για να χρησιμοποιεί το `getAccount`:
```js
async function login() {
@@ -93,7 +93,7 @@ async function login() {
}
```
-Αρχικά, επειδή η `getAccount` είναι μια ασύγχρονη συνάρτηση, πρέπει να τη συνδυάσουμε με τη λέξη-κλειδί `await` για να περιμένουμε το αποτέλεσμα του διακομιστή. Όπως με κάθε αίτημα στον διακομιστή, πρέπει επίσης να διαχειριστούμε περιπτώσεις σφαλμάτων. Προς το παρόν, θα προσθέσουμε μόνο ένα μήνυμα καταγραφής για να εμφανίσουμε το σφάλμα και θα επιστρέψουμε σε αυτό αργότερα.
+Πρώτα, καθώς το `getAccount` είναι μια ασύγχρονη συνάρτηση, πρέπει να το ταιριάξουμε με τη λέξη-κλειδί `await` για να περιμένουμε το αποτέλεσμα του διακομιστή. Όπως με κάθε αίτημα στον διακομιστή, πρέπει επίσης να χειριστούμε περιπτώσεις σφαλμάτων. Προς το παρόν, θα προσθέσουμε μόνο ένα μήνυμα καταγραφής για να εμφανίσουμε το σφάλμα και θα επιστρέψουμε σε αυτό αργότερα.
Στη συνέχεια, πρέπει να αποθηκεύσουμε τα δεδομένα κάπου ώστε να μπορούμε να τα χρησιμοποιήσουμε αργότερα για να εμφανίσουμε τις πληροφορίες του πίνακα ελέγχου. Επειδή η μεταβλητή `account` δεν υπάρχει ακόμα, θα δημιουργήσουμε μια καθολική μεταβλητή στην κορυφή του αρχείου μας:
@@ -118,25 +118,25 @@ account = result;
navigate('/dashboard');
```
-✅ Γνωρίζατε ότι από προεπιλογή, μπορείτε να καλέσετε APIs διακομιστή μόνο από τον *ίδιο τομέα και θύρα* με τη σελίδα που βλέπετε; Αυτός είναι ένας μηχανισμός ασφαλείας που επιβάλλεται από τους περιηγητές. Αλλά περιμένετε, η διαδικτυακή μας εφαρμογή εκτελείται στο `localhost:3000` ενώ το API του διακομιστή εκτελείται στο `localhost:5000`, γιατί λειτουργεί; Χρησιμοποιώντας μια τεχνική που ονομάζεται [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS), είναι δυνατό να εκτελούνται αιτήματα HTTP μεταξύ διαφορετικών προελεύσεων αν ο διακομιστής προσθέσει ειδικές κεφαλίδες στην απάντηση, επιτρέποντας εξαιρέσεις για συγκεκριμένους τομείς.
+✅ Γνωρίζατε ότι από προεπιλογή, μπορείτε να καλείτε APIs διακομιστή μόνο από τον *ίδιο τομέα και θύρα* με τη σελίδα που βλέπετε; Αυτός είναι ένας μηχανισμός ασφαλείας που επιβάλλεται από τους περιηγητές. Αλλά περιμένετε, η διαδικτυακή μας εφαρμογή εκτελείται στο `localhost:3000` ενώ το API του διακομιστή εκτελείται στο `localhost:5000`, γιατί λειτουργεί; Χρησιμοποιώντας μια τεχνική που ονομάζεται [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS), είναι δυνατόν να εκτελούνται αιτήματα HTTP μεταξύ διαφορετικών προελεύσεων αν ο διακομιστής προσθέσει ειδικές κεφαλίδες στην απάντηση, επιτρέποντας εξαιρέσεις για συγκεκριμένους τομείς.
> Μάθετε περισσότερα για τα APIs παρακολουθώντας αυτό το [μάθημα](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon)
## Ενημέρωση HTML για εμφάνιση δεδομένων
-Τώρα που έχουμε τα δεδομένα του χρήστη, πρέπει να ενημερώσουμε το υπάρχον HTML για να τα εμφανίσουμε. Ήδη γνωρίζουμε πώς να ανακτούμε ένα στοιχείο από το DOM χρησιμοποιώντας, για παράδειγμα, το `document.getElementById()`. Αφού έχετε ένα βασικό στοιχείο, εδώ είναι μερικά APIs που μπορείτε να χρησιμοποιήσετε για να το τροποποιήσετε ή να προσθέσετε παιδιά σε αυτό:
+Τώρα που έχουμε τα δεδομένα του χρήστη, πρέπει να ενημερώσουμε το υπάρχον HTML για να τα εμφανίσουμε. Ήδη γνωρίζουμε πώς να ανακτούμε ένα στοιχείο από το DOM χρησιμοποιώντας για παράδειγμα το `document.getElementById()`. Αφού έχετε ένα βασικό στοιχείο, εδώ είναι μερικά APIs που μπορείτε να χρησιμοποιήσετε για να το τροποποιήσετε ή να προσθέσετε παιδικά στοιχεία σε αυτό:
-- Χρησιμοποιώντας την ιδιότητα [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) μπορείτε να αλλάξετε το κείμενο ενός στοιχείου. Σημειώστε ότι η αλλαγή αυτής της τιμής αφαιρεί όλα τα παιδιά του στοιχείου (αν υπάρχουν) και τα αντικαθιστά με το παρεχόμενο κείμενο. Ως εκ τούτου, είναι επίσης μια αποδοτική μέθοδος για να αφαιρέσετε όλα τα παιδιά ενός δεδομένου στοιχείου αναθέτοντας μια κενή συμβολοσειρά `''` σε αυτό.
+- Χρησιμοποιώντας την ιδιότητα [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) μπορείτε να αλλάξετε το κείμενο ενός στοιχείου. Σημειώστε ότι η αλλαγή αυτής της τιμής αφαιρεί όλα τα παιδιά του στοιχείου (αν υπάρχουν) και τα αντικαθιστά με το παρεχόμενο κείμενο. Ως εκ τούτου, είναι επίσης μια αποτελεσματική μέθοδος για την αφαίρεση όλων των παιδιών ενός δεδομένου στοιχείου αναθέτοντας μια κενή συμβολοσειρά `''` σε αυτό.
-- Χρησιμοποιώντας το [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) μαζί με τη μέθοδο [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) μπορείτε να δημιουργήσετε και να επισυνάψετε ένα ή περισσότερα νέα παιδιά.
+- Χρησιμοποιώντας το [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) μαζί με τη μέθοδο [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) μπορείτε να δημιουργήσετε και να επισυνάψετε ένα ή περισσότερα νέα παιδικά στοιχεία.
-✅ Χρησιμοποιώντας την ιδιότητα [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) ενός στοιχείου είναι επίσης δυνατό να αλλάξετε τα HTML περιεχόμενά του, αλλά αυτή η μέθοδος πρέπει να αποφεύγεται καθώς είναι ευάλωτη σε επιθέσεις [cross-site scripting (XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting).
+✅ Χρησιμοποιώντας την ιδιότητα [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) ενός στοιχείου είναι επίσης δυνατό να αλλάξετε τα HTML περιεχόμενά του, αλλά αυτή πρέπει να αποφεύγεται καθώς είναι ευάλωτη σε επιθέσεις [cross-site scripting (XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting).
### Εργασία
-Πριν προχωρήσουμε στην οθόνη του πίνακα ελέγχου, υπάρχει κάτι ακόμα που πρέπει να κάνουμε στη σελίδα *login*. Προς το παρόν, αν προσπαθήσετε να συνδεθείτε με ένα όνομα χρήστη που δεν υπάρχει, εμφανίζεται ένα μήνυμα στην κονσόλα, αλλά για έναν κανονικό χρήστη δεν αλλάζει τίποτα και δεν ξέρετε τι συμβαίνει.
+Πριν προχωρήσουμε στην οθόνη του πίνακα ελέγχου, υπάρχει κάτι ακόμα που πρέπει να κάνουμε στη σελίδα *login*. Προς το παρόν, αν προσπαθήσετε να συνδεθείτε με ένα όνομα χρήστη που δεν υπάρχει, εμφανίζεται ένα μήνυμα στην κονσόλα αλλά για έναν κανονικό χρήστη τίποτα δεν αλλάζει και δεν ξέρετε τι συμβαίνει.
-Ας προσθέσουμε ένα στοιχείο κράτησης θέσης στη φόρμα εισόδου όπου μπορούμε να εμφανίσουμε ένα μήνυμα σφάλματος αν χρειαστεί. Ένα καλό σημείο θα ήταν ακριβώς πριν από το κουμπί `