diff --git a/po/de.po b/po/de.po
index ed3dd854..48f21a6a 100644
--- a/po/de.po
+++ b/po/de.po
@@ -425,81 +425,82 @@ msgid "Day 3: Morning"
 msgstr "Tag 3: Morgens"
 
 #: src/SUMMARY.md:130
+msgid "Generics"
+msgstr "Generische Datentypen und Methoden"
+
+#: src/SUMMARY.md:131
+msgid "Generic Data Types"
+msgstr "Generische Datentypen"
+
+#: src/SUMMARY.md:132
+msgid "Generic Methods"
+msgstr "Generische Methoden"
+
+#: src/SUMMARY.md:133
+msgid "Monomorphization"
+msgstr "Monomorphisierung"
+
+#: src/SUMMARY.md:134
 msgid "Traits"
 msgstr "Merkmale"
 
-#: src/SUMMARY.md:131
+#: src/SUMMARY.md:135
+msgid "Trait Objects"
+msgstr "Merkmalsobjekte"
+
+#: src/SUMMARY.md:136
 msgid "Deriving Traits"
 msgstr "Ableitung von Merkmalen"
 
-#: src/SUMMARY.md:132
+#: src/SUMMARY.md:137
 msgid "Default Methods"
 msgstr "Standardmethoden"
 
-#: src/SUMMARY.md:133
+#: src/SUMMARY.md:138
+msgid "Trait Bounds"
+msgstr "Merkmalsgrenzen"
+
+#: src/SUMMARY.md:139
+msgid "impl Trait"
+msgstr "impl Merkmal"
+
+#: src/SUMMARY.md:140
 msgid "Important Traits"
 msgstr "Wichtige Merkmale"
 
-#: src/SUMMARY.md:134
+#: src/SUMMARY.md:141
 msgid "Iterator"
 msgstr "Iterator"
 
-#: src/SUMMARY.md:135
+#: src/SUMMARY.md:142
 msgid "FromIterator"
 msgstr "FromIterator"
 
-#: src/SUMMARY.md:136
+#: src/SUMMARY.md:143
 msgid "From and Into"
 msgstr "From und Into"
 
-#: src/SUMMARY.md:137
+#: src/SUMMARY.md:144
 msgid "Read and Write"
 msgstr "Read und Write"
 
-#: src/SUMMARY.md:138
-msgid "Add, Mul, ..."
-msgstr "Add, Mul, ..."
-
-#: src/SUMMARY.md:139
+#: src/SUMMARY.md:145
 msgid "Drop"
 msgstr "Drop"
 
-#: src/SUMMARY.md:140
+#: src/SUMMARY.md:146
 #, fuzzy
 msgid "Default"
 msgstr "Standardmethoden"
 
-#: src/SUMMARY.md:141
-msgid "Generics"
-msgstr "Generische Datentypen und Methoden"
-
-#: src/SUMMARY.md:142
-msgid "Generic Data Types"
-msgstr "Generische Datentypen"
-
-#: src/SUMMARY.md:143
-msgid "Generic Methods"
-msgstr "Generische Methoden"
-
-#: src/SUMMARY.md:144
-msgid "Trait Bounds"
-msgstr "Merkmalsgrenzen"
-
-#: src/SUMMARY.md:145
-msgid "impl Trait"
-msgstr "impl Merkmal"
-
-#: src/SUMMARY.md:146
-msgid "Closures"
-msgstr "Funktionsabschlüsse"
-
 #: src/SUMMARY.md:147
-msgid "Monomorphization"
-msgstr "Monomorphisierung"
+#, fuzzy
+msgid "Operators: Add, Mul, ..."
+msgstr "Add, Mul, ..."
 
 #: src/SUMMARY.md:148
-msgid "Trait Objects"
-msgstr "Merkmalsobjekte"
+msgid "Closures"
+msgstr "Funktionsabschlüsse"
 
 #: src/SUMMARY.md:150
 msgid "A Simple GUI Library"
@@ -1158,11 +1159,12 @@ msgstr ""
 #: src/std/hashmap.md:36 src/std/box.md:32 src/std/box-recursive.md:31
 #: src/std/rc.md:29 src/modules.md:26 src/modules/visibility.md:37
 #: src/modules/filesystem.md:38 src/exercises/day-2/afternoon.md:5
-#: src/traits.md:41 src/traits/iterator.md:30 src/traits/from-iterator.md:15
-#: src/traits/from-into.md:27 src/traits/operators.md:24 src/traits/drop.md:32
-#: src/traits/default.md:38 src/generics/methods.md:23
-#: src/generics/trait-bounds.md:33 src/generics/impl-trait.md:21
-#: src/generics/closures.md:23 src/generics/trait-objects.md:88
+#: src/generics/data-types.md:19 src/generics/methods.md:23
+#: src/traits/trait-objects.md:70 src/traits/default-methods.md:30
+#: src/traits/trait-bounds.md:33 src/traits/impl-trait.md:21
+#: src/traits/iterator.md:30 src/traits/from-iterator.md:15
+#: src/traits/from-into.md:27 src/traits/drop.md:32 src/traits/default.md:38
+#: src/traits/operators.md:24 src/traits/closures.md:23
 #: src/exercises/day-3/morning.md:5 src/error-handling/result.md:25
 #: src/error-handling/try-operator.md:48
 #: src/error-handling/converting-error-types-example.md:48
@@ -1260,11 +1262,12 @@ msgstr ""
 #: src/std/hashmap.md:66 src/std/box.md:39 src/std/box-recursive.md:41
 #: src/std/rc.md:69 src/modules.md:32 src/modules/visibility.md:48
 #: src/modules/filesystem.md:67 src/exercises/day-2/afternoon.md:11
-#: src/traits.md:47 src/traits/iterator.md:42 src/traits/from-iterator.md:26
-#: src/traits/from-into.md:33 src/traits/operators.md:38 src/traits/drop.md:42
-#: src/traits/default.md:47 src/generics/methods.md:31
-#: src/generics/trait-bounds.md:50 src/generics/impl-trait.md:44
-#: src/generics/closures.md:38 src/generics/trait-objects.md:102
+#: src/generics/data-types.md:25 src/generics/methods.md:31
+#: src/traits/trait-objects.md:83 src/traits/default-methods.md:41
+#: src/traits/trait-bounds.md:50 src/traits/impl-trait.md:44
+#: src/traits/iterator.md:42 src/traits/from-iterator.md:26
+#: src/traits/from-into.md:33 src/traits/drop.md:42 src/traits/default.md:47
+#: src/traits/operators.md:38 src/traits/closures.md:38
 #: src/exercises/day-3/morning.md:11 src/error-handling/result.md:33
 #: src/error-handling/try-operator.md:55
 #: src/error-handling/converting-error-types-example.md:60
@@ -8565,6 +8568,167 @@ msgid ""
 "  functions."
 msgstr ""
 
+#: src/generics.md:1
+#, fuzzy
+msgid "# Generics"
+msgstr "# Generika"
+
+#: src/generics.md:3
+#, fuzzy
+msgid ""
+"Rust support generics, which lets you abstract an algorithm (such as "
+"sorting)\n"
+"over the types used in the algorithm."
+msgstr ""
+"Rust unterstützt Generika, mit denen Sie einen Algorithmus abstrahieren "
+"können (z. B. Sortieren)\n"
+"über die im Algorithmus verwendeten Typen."
+
+#: src/generics/data-types.md:1
+#, fuzzy
+msgid "# Generic Data Types"
+msgstr "# Generische Datentypen"
+
+#: src/generics/data-types.md:3
+#, fuzzy
+msgid "You can use generics to abstract over the concrete field type:"
+msgstr "Mit Generika können Sie über den konkreten Feldtyp abstrahieren:"
+
+#: src/generics/data-types.md:5
+msgid ""
+"```rust,editable\n"
+"#[derive(Debug)]\n"
+"struct Point<T> {\n"
+"    x: T,\n"
+"    y: T,\n"
+"}\n"
+"\n"
+"fn main() {\n"
+"    let integer = Point { x: 5, y: 10 };\n"
+"    let float = Point { x: 1.0, y: 4.0 };\n"
+"    println!(\"{integer:?} and {float:?}\");\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/generics/data-types.md:21
+msgid ""
+"* Try declaring a new variable `let p = Point { x: 5, y: 10.0 };`.\n"
+"\n"
+"* Fix the code to allow points that have elements of different types."
+msgstr ""
+
+#: src/generics/methods.md:1
+#, fuzzy
+msgid "# Generic Methods"
+msgstr "# Generische Methoden"
+
+#: src/generics/methods.md:3
+#, fuzzy
+msgid "You can declare a generic type on your `impl` block:"
+msgstr "Sie können einen generischen Typ in Ihrem `impl`-Block deklarieren:"
+
+#: src/generics/methods.md:5
+msgid ""
+"```rust,editable\n"
+"#[derive(Debug)]\n"
+"struct Point<T>(T, T);\n"
+"\n"
+"impl<T> Point<T> {\n"
+"    fn x(&self) -> &T {\n"
+"        &self.0  // + 10\n"
+"    }\n"
+"\n"
+"    // fn set_x(&mut self, x: T)\n"
+"}\n"
+"\n"
+"fn main() {\n"
+"    let p = Point(5, 10);\n"
+"    println!(\"p.x = {}\", p.x());\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/generics/methods.md:25
+#, fuzzy
+msgid ""
+"* *Q:* Why `T` is specified twice in `impl<T> Point<T> {}`? Isn't that "
+"redundant?\n"
+"    * This is because it is a generic implementation section for generic "
+"type. They are independently generic.\n"
+"    * It means these methods are defined for any `T`.\n"
+"    * It is possible to write `impl Point<u32> { .. }`. \n"
+"      * `Point` is still generic and you can use `Point<f64>`, but methods "
+"in this block will only be available for `Point<u32>`."
+msgstr ""
+"* *F:* Warum wird `T` zweimal in `impl<T> Point<T> {}` angegeben? Ist das "
+"nicht überflüssig?\n"
+"    * Dies liegt daran, dass es sich um einen generischen "
+"Implementierungsabschnitt für einen generischen Typ handelt. Sie sind "
+"unabhängig generisch.\n"
+"    * Dies bedeutet, dass diese Methoden für jedes `T` definiert sind.\n"
+"    * Es ist möglich `impl Point<u32> { .. }` zu schreiben.\n"
+"      * „Point“ ist immer noch generisch und Sie können „Point<f64>“ "
+"verwenden, aber Methoden in diesem Block sind nur für „Point<u32>“ verfügbar."
+
+#: src/generics/monomorphization.md:1
+#, fuzzy
+msgid "# Monomorphization"
+msgstr "# Monomorphisierung"
+
+#: src/generics/monomorphization.md:3
+#, fuzzy
+msgid "Generic code is turned into non-generic code based on the call sites:"
+msgstr ""
+"Basierend auf den Aufrufseiten wird generischer Code in nicht generischen "
+"Code umgewandelt:"
+
+#: src/generics/monomorphization.md:5
+msgid ""
+"```rust,editable\n"
+"fn main() {\n"
+"    let integer = Some(5);\n"
+"    let float = Some(5.0);\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/generics/monomorphization.md:12
+#, fuzzy
+msgid "behaves as if you wrote"
+msgstr "verhält sich so, als hättest du geschrieben"
+
+#: src/generics/monomorphization.md:14
+msgid ""
+"```rust,editable\n"
+"enum Option_i32 {\n"
+"    Some(i32),\n"
+"    None,\n"
+"}\n"
+"\n"
+"enum Option_f64 {\n"
+"    Some(f64),\n"
+"    None,\n"
+"}\n"
+"\n"
+"fn main() {\n"
+"    let integer = Option_i32::Some(5);\n"
+"    let float = Option_f64::Some(5.0);\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/generics/monomorphization.md:31
+#, fuzzy
+msgid ""
+"This is a zero-cost abstraction: you get exactly the same result as if you "
+"had\n"
+"hand-coded the data structures without the abstraction."
+msgstr ""
+"Dies ist eine Null-Kosten-Abstraktion: Sie erhalten genau das gleiche "
+"Ergebnis, als ob Sie es hätten\n"
+"die Datenstrukturen ohne die Abstraktion von Hand codiert."
+
 #: src/traits.md:1
 #, fuzzy
 msgid "# Traits"
@@ -8604,7 +8768,7 @@ msgid ""
 "    }\n"
 "}\n"
 "\n"
-"fn greet(pet: &impl Pet) {\n"
+"fn greet<P: Pet>(pet: &P) {\n"
 "    println!(\"Who's a cutie? {} is!\", pet.name());\n"
 "}\n"
 "\n"
@@ -8618,15 +8782,146 @@ msgid ""
 "```"
 msgstr ""
 
-#: src/traits.md:43
+#: src/traits/trait-objects.md:1
+#, fuzzy
+msgid "# Trait Objects"
+msgstr "# Eigenschaftsobjekte"
+
+#: src/traits/trait-objects.md:3
 msgid ""
-"* Later sections will get into more detail on generic functions like "
-"`greet`.\n"
-"  For now, students only need to know that `greet` will operate on a "
-"reference\n"
-"  to anything that implements `Pet`."
+"Trait objects allow for values of different types, for instance in a "
+"collection:"
 msgstr ""
 
+#: src/traits/trait-objects.md:5
+msgid ""
+"```rust\n"
+"trait Pet {\n"
+"    fn name(&self) -> String;\n"
+"}\n"
+"\n"
+"struct Dog {\n"
+"    name: String,\n"
+"}\n"
+"\n"
+"struct Cat;\n"
+"\n"
+"impl Pet for Dog {\n"
+"    fn name(&self) -> String {\n"
+"        self.name.clone()\n"
+"    }\n"
+"}\n"
+"\n"
+"impl Pet for Cat {\n"
+"    fn name(&self) -> String {\n"
+"        String::from(\"The cat\") // No name, cats won't respond to it "
+"anyway.\n"
+"    }\n"
+"}\n"
+"\n"
+"fn main() {\n"
+"    let pets: Vec<Box<dyn Pet>> = vec![\n"
+"        Box::new(Dog { name: String::from(\"Fido\") }),\n"
+"        Box::new(Cat),\n"
+"    ];\n"
+"    for pet in pets {\n"
+"        println!(\"Hello {}!\", pet.name());\n"
+"    }\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/traits/trait-objects.md:40
+#, fuzzy
+msgid "Memory layout after allocating `pets`:"
+msgstr "Speicherlayout nach Zuweisung von `xs`:"
+
+#: src/traits/trait-objects.md:42
+msgid ""
+"```bob\n"
+" Stack                             Heap\n"
+".- - - - - - - - - - - - - -.     .- - - - - - - - - - - - - - - - - - - - - "
+"- -.\n"
+":                           :     :                                             :\n"
+":    "
+"pets                   :     :                                             :\n"
+":   +-----------+-------+   :     :   +-----+-----"
+"+                             :\n"
+":   | ptr       |   o---+---+-----+-->| o o | o o "
+"|                             :\n"
+":   | len       |     2 |   :     :   +-|-|-+-|-|-"
+"+                             :\n"
+":   | capacity  |     2 |   :     :     | |   | |   +---------------"
+"+           :\n"
+":   +-----------+-------+   :     :     | |   | '-->| name: \"Fido\"  "
+"|           :\n"
+":                           :     :     | |   |     +---------------"
+"+           :\n"
+"`- - - - - - - - - - - - - -'     :     | |   "
+"|                                 :\n"
+"                                  :     | |   |     +----------------------"
+"+    :   \n"
+"                                  :     | |   '---->| \"<Dog as Pet>::name\" "
+"|    :\n"
+"                                  :     | |         +----------------------"
+"+    : \n"
+"                                  :     | "
+"|                                     : \n"
+"                                  :     | |   +-"
+"+                               :   \n"
+"                                  :     | '-->|"
+"\\|                               :     \n"
+"                                  :     |     +-"
+"+                               :    \n"
+"                                  :     "
+"|                                       : \n"
+"                                  :     |     +----------------------"
+"+          : \n"
+"                                  :     '---->| \"<Cat as Pet>::name\" "
+"|          : \n"
+"                                  :           +----------------------"
+"+          :\n"
+"                                  :                                             :\n"
+"                                  '- - - - - - - - - - - - - - - - - - - - - "
+"- -'\n"
+"\n"
+"```"
+msgstr ""
+
+#: src/traits/trait-objects.md:72
+#, fuzzy
+msgid ""
+"* Types that implement a given trait may be of different sizes. This makes "
+"it impossible to have things like `Vec<Pet>` in the example above.\n"
+"* `dyn Pet` is a way to tell the compiler about a dynamically sized type "
+"that implements `Pet`.\n"
+"* In the example, `pets` holds *fat pointers* to objects that implement "
+"`Pet`. The fat pointer consists of two components, a pointer to the actual "
+"object and a pointer to the virtual method table for the `Pet` "
+"implementation of that particular object.\n"
+"* Compare these outputs in the above example:\n"
+"     ```rust,ignore\n"
+"         println!(\"{} {}\", std::mem::size_of::<Dog>(), std::mem::size_of::"
+"<Cat>());\n"
+"         println!(\"{} {}\", std::mem::size_of::<&Dog>(), std::mem::size_of::"
+"<&Cat>());\n"
+"         println!(\"{}\", std::mem::size_of::<&dyn Pet>());\n"
+"         println!(\"{}\", std::mem::size_of::<Box<dyn Pet>>());\n"
+"     ```"
+msgstr ""
+"* Merkmale können vorimplementierte (Standard-)Methoden und Methoden "
+"spezifizieren, die Benutzer selbst implementieren müssen. Methoden mit "
+"Standardimplementierungen können sich auf erforderliche Methoden stützen.\n"
+"* Typen, die ein bestimmtes Merkmal implementieren, können unterschiedlich "
+"groß sein. Das macht es unmöglich Dinge wie `Vec<Greet>` im obigen Beispiel "
+"zu haben.\n"
+"* „dyn Greet“ ist eine Möglichkeit, dem Compiler einen Typ mit dynamischer "
+"Größe mitzuteilen, der „Greet“ implementiert.\n"
+"* Im Beispiel enthält `pets` Fat Pointer auf Objekte, die `Greet` "
+"implementieren. Der Fat Pointer besteht aus zwei Komponenten, einem Zeiger "
+"auf das tatsächliche Objekt und einem Zeiger auf die virtuelle "
+"Methodentabelle für die \"Greet\"-Implementierung dieses bestimmten Objekts."
+
 #: src/traits/deriving-traits.md:1
 #, fuzzy
 msgid "# Deriving Traits"
@@ -8695,6 +8990,207 @@ msgid ""
 "```"
 msgstr ""
 
+#: src/traits/default-methods.md:32
+msgid ""
+"* Traits may specify pre-implemented (default) methods and methods that "
+"users are required to\n"
+"  implement themselves. Methods with default implementations can rely on "
+"required methods.\n"
+"\n"
+"* Move method `not_equal` to a new trait `NotEqual`.\n"
+"\n"
+"* Make `NotEqual` a super trait for `Equal`.\n"
+"\n"
+"* Provide a blanket implementation of `NotEqual` for `Equal`.\n"
+"  * With the blanket implementation, you no longer need `NotEqual` as a "
+"super trait for `Equal`."
+msgstr ""
+
+#: src/traits/trait-bounds.md:1
+#, fuzzy
+msgid "# Trait Bounds"
+msgstr "# Eigenschaftsgrenzen"
+
+#: src/traits/trait-bounds.md:3
+#, fuzzy
+msgid ""
+"When working with generics, you often want to require the types to "
+"implement\n"
+"some trait, so that you can call this trait's methods."
+msgstr ""
+"Wenn Sie mit Generika arbeiten, möchten Sie häufig die Typen einschränken. "
+"Du kannst das\n"
+"mit `T:Trait` oder `impl Trait`:"
+
+#: src/traits/trait-bounds.md:6
+msgid "You can do this with `T: Trait` or `impl Trait`:"
+msgstr ""
+
+#: src/traits/trait-bounds.md:8
+msgid ""
+"```rust,editable\n"
+"fn duplicate<T: Clone>(a: T) -> (T, T) {\n"
+"    (a.clone(), a.clone())\n"
+"}\n"
+"\n"
+"// Syntactic sugar for:\n"
+"//   fn add_42_millions<T: Into<i32>>(x: T) -> i32 {\n"
+"fn add_42_millions(x: impl Into<i32>) -> i32 {\n"
+"    x.into() + 42_000_000\n"
+"}\n"
+"\n"
+"// struct NotClonable;\n"
+"\n"
+"fn main() {\n"
+"    let foo = String::from(\"foo\");\n"
+"    let pair = duplicate(foo);\n"
+"    println!(\"{pair:?}\");\n"
+"\n"
+"    let many = add_42_millions(42_i8);\n"
+"    println!(\"{many}\");\n"
+"    let many_more = add_42_millions(10_000_000);\n"
+"    println!(\"{many_more}\");\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/traits/trait-bounds.md:35
+msgid "Show a `where` clause, students will encounter it when reading code."
+msgstr ""
+
+#: src/traits/trait-bounds.md:37
+msgid ""
+"```rust,ignore\n"
+"fn duplicate<T>(a: T) -> (T, T)\n"
+"where\n"
+"    T: Clone,\n"
+"{\n"
+"    (a.clone(), a.clone())\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/traits/trait-bounds.md:46
+#, fuzzy
+msgid ""
+"* It declutters the function signature if you have many parameters.\n"
+"* It has additional features making it more powerful.\n"
+"    * If someone asks, the extra feature is that the type on the left of \":"
+"\" can be arbitrary, like `Option<T>`.\n"
+"    "
+msgstr ""
+"* Es entrümpelt die Funktionssignatur, wenn Sie viele Parameter haben.\n"
+"* Es hat zusätzliche Funktionen, die es leistungsfähiger machen.\n"
+"    * Wenn jemand fragt, das zusätzliche Feature ist, dass der Typ links von "
+"\":\" beliebig sein kann, wie `Option<T>`.\n"
+"    \n"
+"</Details>"
+
+#: src/traits/impl-trait.md:1
+#, fuzzy
+msgid "# `impl Trait`"
+msgstr "# `imple Merkmal`"
+
+#: src/traits/impl-trait.md:3
+#, fuzzy
+msgid ""
+"Similar to trait bounds, an `impl Trait` syntax can be used in function\n"
+"arguments and return values:"
+msgstr ""
+"Ähnlich wie Merkmalsgrenzen kann eine \"impl Trait\"-Syntax in Funktion "
+"verwendet werden\n"
+"Argumente und Rückgabewerte:"
+
+#: src/traits/impl-trait.md:6
+msgid ""
+"```rust,editable\n"
+"use std::fmt::Display;\n"
+"\n"
+"fn get_x(name: impl Display) -> impl Display {\n"
+"    format!(\"Hello {name}\")\n"
+"}\n"
+"\n"
+"fn main() {\n"
+"    let x = get_x(\"foo\");\n"
+"    println!(\"{x}\");\n"
+"}\n"
+"```"
+msgstr ""
+
+#: src/traits/impl-trait.md:19
+#, fuzzy
+msgid "* `impl Trait` allows you to work with types which you cannot name."
+msgstr ""
+"* `impl Trait` kann nicht mit der `::<>` Turbofish-Syntax verwendet werden.\n"
+"* `impl Trait` ermöglicht es Ihnen, mit Typen zu arbeiten, die Sie nicht "
+"benennen können."
+
+#: src/traits/impl-trait.md:23
+#, fuzzy
+msgid ""
+"The meaning of `impl Trait` is a bit different in the different positions."
+msgstr ""
+"Die Bedeutung von „impl Trait“ ist in den verschiedenen Positionen etwas "
+"unterschiedlich."
+
+#: src/traits/impl-trait.md:25
+#, fuzzy
+msgid ""
+"* For a parameter, `impl Trait` is like an anonymous generic parameter with "
+"a trait bound.\n"
+"\n"
+"* For a return type, it means that the return type is some concrete type "
+"that implements the trait,\n"
+"  without naming the type. This can be useful when you don't want to expose "
+"the concrete type in a\n"
+"  public API.\n"
+"\n"
+"  Inference is hard in return position. A function returning `impl Foo` "
+"picks\n"
+"  the concrete type it returns, without writing it out in the source. A "
+"function\n"
+"  returning a generic type like `collect<B>() -> B` can return any type\n"
+"  satisfying `B`, and the caller may need to choose one, such as with `let "
+"x:\n"
+"  Vec<_> = foo.collect()` or with the turbofish, `foo.collect::<Vec<_>>()`."
+msgstr ""
+"* Für einen Parameter ist `impl Trait` wie ein anonymer generischer "
+"Parameter mit einer Eigenschaftsbindung.\n"
+"* Für einen Rückgabetyp bedeutet dies, dass der Rückgabetyp ein konkreter "
+"Typ ist, der die Eigenschaft implementiert,\n"
+"  ohne den Typ zu nennen. Dies kann nützlich sein, wenn Sie den konkreten "
+"Typ in a nicht verfügbar machen möchten\n"
+"  öffentliche API."
+
+#: src/traits/impl-trait.md:37
+#, fuzzy
+msgid ""
+"This example is great, because it uses `impl Display` twice. It helps to "
+"explain that\n"
+"nothing here enforces that it is _the same_ `impl Display` type. If we used "
+"a single \n"
+"`T: Display`, it would enforce the constraint that input `T` and return `T` "
+"type are the same type.\n"
+"It would not work for this particular function, as the type we expect as "
+"input is likely not\n"
+"what `format!` returns. If we wanted to do the same via `: Display` syntax, "
+"we'd need two\n"
+"independent generic parameters."
+msgstr ""
+"Dieses Beispiel ist großartig, weil es `impl Display` zweimal verwendet. Es "
+"hilft, das zu erklären\n"
+"nichts hier erzwingt, dass es _derselbe_ `impl Display`-Typ ist. Wenn wir "
+"eine Single benutzten\n"
+"`T: Display`, es würde die Einschränkung erzwingen, dass der Eingabe-`T`- "
+"und der Rückgabe-`T-Typ derselbe Typ sind.\n"
+"Es würde für diese spezielle Funktion nicht funktionieren, da der Typ, den "
+"wir als Eingabe erwarten, wahrscheinlich nicht der Fall ist\n"
+"welches `format!` zurückgibt. Wenn wir dasselbe über die `: Display`-Syntax "
+"machen wollten, bräuchten wir zwei\n"
+"unabhängige generische Parameter.\n"
+"    \n"
+"</details>"
+
 #: src/traits/important-traits.md:1
 #, fuzzy
 msgid "# Important Traits"
@@ -8954,76 +9450,6 @@ msgid ""
 "```"
 msgstr ""
 
-#: src/traits/operators.md:1
-#, fuzzy
-msgid "# `Add`, `Mul`, ..."
-msgstr "# `Hinzufügen`, `Mul`, ..."
-
-#: src/traits/operators.md:3
-#, fuzzy
-msgid "Operator overloading is implemented via traits in [`std::ops`][1]:"
-msgstr ""
-"Das Überladen von Operatoren wird über Traits in `std::ops` implementiert:"
-
-#: src/traits/operators.md:5
-msgid ""
-"```rust,editable\n"
-"#[derive(Debug, Copy, Clone)]\n"
-"struct Point { x: i32, y: i32 }\n"
-"\n"
-"impl std::ops::Add for Point {\n"
-"    type Output = Self;\n"
-"\n"
-"    fn add(self, other: Self) -> Self {\n"
-"        Self {x: self.x + other.x, y: self.y + other.y}\n"
-"    }\n"
-"}\n"
-"\n"
-"fn main() {\n"
-"    let p1 = Point { x: 10, y: 20 };\n"
-"    let p2 = Point { x: 100, y: 200 };\n"
-"    println!(\"{:?} + {:?} = {:?}\", p1, p2, p1 + p2);\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/traits/operators.md:26 src/traits/drop.md:34
-#, fuzzy
-msgid "Discussion points:"
-msgstr "Diskussionspunkte:"
-
-#: src/traits/operators.md:28
-#, fuzzy
-msgid ""
-"* You could implement `Add` for `&Point`. In which situations is that "
-"useful? \n"
-"    * Answer: `Add:add` consumes `self`. If type `T` for which you are\n"
-"        overloading the operator is not `Copy`, you should consider "
-"overloading\n"
-"        the operator for `&T` as well. This avoids unnecessary cloning on "
-"the\n"
-"        call site.\n"
-"* Why is `Output` an associated type? Could it be made a type parameter?\n"
-"    * Short answer: Type parameters are controlled by the caller, but\n"
-"        associated types (like `Output`) are controlled by the implementor "
-"of a\n"
-"        trait."
-msgstr ""
-"* Sie könnten `Add` für `&Point` implementieren. In welchen Situationen ist "
-"das sinnvoll?\n"
-"    * Antwort: `Add:add` verbraucht `self`. Geben Sie \"T\" ein, für das Sie "
-"sind\n"
-"        Das Überladen des Operators ist nicht \"Kopieren\", Sie sollten das "
-"Überladen in Betracht ziehen\n"
-"        auch der Operator für `&T`. Dies vermeidet unnötiges Klonen auf der\n"
-"        Website aufrufen.\n"
-"* Warum ist `Output` ein assoziierter Typ? Könnte es ein Typparameter "
-"gemacht werden?\n"
-"    * Kurze Antwort: Typparameter werden vom Aufrufer gesteuert, aber\n"
-"        Zugehörige Typen (wie `Output`) werden vom Implementierer von a "
-"gesteuert\n"
-"        Merkmal."
-
 #: src/traits/drop.md:1
 #, fuzzy
 msgid "# The `Drop` Trait"
@@ -9068,6 +9494,11 @@ msgid ""
 "```"
 msgstr ""
 
+#: src/traits/drop.md:34 src/traits/operators.md:26
+#, fuzzy
+msgid "Discussion points:"
+msgstr "Diskussionspunkte:"
+
 #: src/traits/drop.md:36
 #, fuzzy
 msgid ""
@@ -9145,293 +9576,77 @@ msgid ""
 "provides convenience methods that use it."
 msgstr ""
 
-#: src/generics.md:1
+#: src/traits/operators.md:1
 #, fuzzy
-msgid "# Generics"
-msgstr "# Generika"
+msgid "# `Add`, `Mul`, ..."
+msgstr "# `Hinzufügen`, `Mul`, ..."
 
-#: src/generics.md:3
+#: src/traits/operators.md:3
 #, fuzzy
-msgid ""
-"Rust support generics, which lets you abstract an algorithm (such as "
-"sorting)\n"
-"over the types used in the algorithm."
+msgid "Operator overloading is implemented via traits in [`std::ops`][1]:"
 msgstr ""
-"Rust unterstützt Generika, mit denen Sie einen Algorithmus abstrahieren "
-"können (z. B. Sortieren)\n"
-"über die im Algorithmus verwendeten Typen."
+"Das Überladen von Operatoren wird über Traits in `std::ops` implementiert:"
 
-#: src/generics/data-types.md:1
-#, fuzzy
-msgid "# Generic Data Types"
-msgstr "# Generische Datentypen"
-
-#: src/generics/data-types.md:3
-#, fuzzy
-msgid "You can use generics to abstract over the concrete field type:"
-msgstr "Mit Generika können Sie über den konkreten Feldtyp abstrahieren:"
-
-#: src/generics/data-types.md:5
+#: src/traits/operators.md:5
 msgid ""
 "```rust,editable\n"
-"#[derive(Debug)]\n"
-"struct Point<T> {\n"
-"    x: T,\n"
-"    y: T,\n"
-"}\n"
+"#[derive(Debug, Copy, Clone)]\n"
+"struct Point { x: i32, y: i32 }\n"
 "\n"
-"fn main() {\n"
-"    let integer = Point { x: 5, y: 10 };\n"
-"    let float = Point { x: 1.0, y: 4.0 };\n"
-"    println!(\"{integer:?} and {float:?}\");\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/methods.md:1
-#, fuzzy
-msgid "# Generic Methods"
-msgstr "# Generische Methoden"
-
-#: src/generics/methods.md:3
-#, fuzzy
-msgid "You can declare a generic type on your `impl` block:"
-msgstr "Sie können einen generischen Typ in Ihrem `impl`-Block deklarieren:"
-
-#: src/generics/methods.md:5
-msgid ""
-"```rust,editable\n"
-"#[derive(Debug)]\n"
-"struct Point<T>(T, T);\n"
+"impl std::ops::Add for Point {\n"
+"    type Output = Self;\n"
 "\n"
-"impl<T> Point<T> {\n"
-"    fn x(&self) -> &T {\n"
-"        &self.0  // + 10\n"
+"    fn add(self, other: Self) -> Self {\n"
+"        Self {x: self.x + other.x, y: self.y + other.y}\n"
 "    }\n"
-"\n"
-"    // fn set_x(&mut self, x: T)\n"
 "}\n"
 "\n"
 "fn main() {\n"
-"    let p = Point(5, 10);\n"
-"    println!(\"p.x = {}\", p.x());\n"
+"    let p1 = Point { x: 10, y: 20 };\n"
+"    let p2 = Point { x: 100, y: 200 };\n"
+"    println!(\"{:?} + {:?} = {:?}\", p1, p2, p1 + p2);\n"
 "}\n"
 "```"
 msgstr ""
 
-#: src/generics/methods.md:25
+#: src/traits/operators.md:28
 #, fuzzy
 msgid ""
-"* *Q:* Why `T` is specified twice in `impl<T> Point<T> {}`? Isn't that "
-"redundant?\n"
-"    * This is because it is a generic implementation section for generic "
-"type. They are independently generic.\n"
-"    * It means these methods are defined for any `T`.\n"
-"    * It is possible to write `impl Point<u32> { .. }`. \n"
-"      * `Point` is still generic and you can use `Point<f64>`, but methods "
-"in this block will only be available for `Point<u32>`."
+"* You could implement `Add` for `&Point`. In which situations is that "
+"useful? \n"
+"    * Answer: `Add:add` consumes `self`. If type `T` for which you are\n"
+"        overloading the operator is not `Copy`, you should consider "
+"overloading\n"
+"        the operator for `&T` as well. This avoids unnecessary cloning on "
+"the\n"
+"        call site.\n"
+"* Why is `Output` an associated type? Could it be made a type parameter?\n"
+"    * Short answer: Type parameters are controlled by the caller, but\n"
+"        associated types (like `Output`) are controlled by the implementor "
+"of a\n"
+"        trait."
 msgstr ""
-"* *F:* Warum wird `T` zweimal in `impl<T> Point<T> {}` angegeben? Ist das "
-"nicht überflüssig?\n"
-"    * Dies liegt daran, dass es sich um einen generischen "
-"Implementierungsabschnitt für einen generischen Typ handelt. Sie sind "
-"unabhängig generisch.\n"
-"    * Dies bedeutet, dass diese Methoden für jedes `T` definiert sind.\n"
-"    * Es ist möglich `impl Point<u32> { .. }` zu schreiben.\n"
-"      * „Point“ ist immer noch generisch und Sie können „Point<f64>“ "
-"verwenden, aber Methoden in diesem Block sind nur für „Point<u32>“ verfügbar."
+"* Sie könnten `Add` für `&Point` implementieren. In welchen Situationen ist "
+"das sinnvoll?\n"
+"    * Antwort: `Add:add` verbraucht `self`. Geben Sie \"T\" ein, für das Sie "
+"sind\n"
+"        Das Überladen des Operators ist nicht \"Kopieren\", Sie sollten das "
+"Überladen in Betracht ziehen\n"
+"        auch der Operator für `&T`. Dies vermeidet unnötiges Klonen auf der\n"
+"        Website aufrufen.\n"
+"* Warum ist `Output` ein assoziierter Typ? Könnte es ein Typparameter "
+"gemacht werden?\n"
+"    * Kurze Antwort: Typparameter werden vom Aufrufer gesteuert, aber\n"
+"        Zugehörige Typen (wie `Output`) werden vom Implementierer von a "
+"gesteuert\n"
+"        Merkmal."
 
-#: src/generics/trait-bounds.md:1
-#, fuzzy
-msgid "# Trait Bounds"
-msgstr "# Eigenschaftsgrenzen"
-
-#: src/generics/trait-bounds.md:3
-#, fuzzy
-msgid ""
-"When working with generics, you often want to require the types to "
-"implement\n"
-"some trait, so that you can call this trait's methods."
-msgstr ""
-"Wenn Sie mit Generika arbeiten, möchten Sie häufig die Typen einschränken. "
-"Du kannst das\n"
-"mit `T:Trait` oder `impl Trait`:"
-
-#: src/generics/trait-bounds.md:6
-msgid "You can do this with `T: Trait` or `impl Trait`:"
-msgstr ""
-
-#: src/generics/trait-bounds.md:8
-msgid ""
-"```rust,editable\n"
-"fn duplicate<T: Clone>(a: T) -> (T, T) {\n"
-"    (a.clone(), a.clone())\n"
-"}\n"
-"\n"
-"// Syntactic sugar for:\n"
-"//   fn add_42_millions<T: Into<i32>>(x: T) -> i32 {\n"
-"fn add_42_millions(x: impl Into<i32>) -> i32 {\n"
-"    x.into() + 42_000_000\n"
-"}\n"
-"\n"
-"// struct NotClonable;\n"
-"\n"
-"fn main() {\n"
-"    let foo = String::from(\"foo\");\n"
-"    let pair = duplicate(foo);\n"
-"    println!(\"{pair:?}\");\n"
-"\n"
-"    let many = add_42_millions(42_i8);\n"
-"    println!(\"{many}\");\n"
-"    let many_more = add_42_millions(10_000_000);\n"
-"    println!(\"{many_more}\");\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-bounds.md:35
-msgid "Show a `where` clause, students will encounter it when reading code."
-msgstr ""
-
-#: src/generics/trait-bounds.md:37
-msgid ""
-"```rust,ignore\n"
-"fn duplicate<T>(a: T) -> (T, T)\n"
-"where\n"
-"    T: Clone,\n"
-"{\n"
-"    (a.clone(), a.clone())\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-bounds.md:46
-#, fuzzy
-msgid ""
-"* It declutters the function signature if you have many parameters.\n"
-"* It has additional features making it more powerful.\n"
-"    * If someone asks, the extra feature is that the type on the left of \":"
-"\" can be arbitrary, like `Option<T>`.\n"
-"    "
-msgstr ""
-"* Es entrümpelt die Funktionssignatur, wenn Sie viele Parameter haben.\n"
-"* Es hat zusätzliche Funktionen, die es leistungsfähiger machen.\n"
-"    * Wenn jemand fragt, das zusätzliche Feature ist, dass der Typ links von "
-"\":\" beliebig sein kann, wie `Option<T>`.\n"
-"    \n"
-"</Details>"
-
-#: src/generics/impl-trait.md:1
-#, fuzzy
-msgid "# `impl Trait`"
-msgstr "# `imple Merkmal`"
-
-#: src/generics/impl-trait.md:3
-#, fuzzy
-msgid ""
-"Similar to trait bounds, an `impl Trait` syntax can be used in function\n"
-"arguments and return values:"
-msgstr ""
-"Ähnlich wie Merkmalsgrenzen kann eine \"impl Trait\"-Syntax in Funktion "
-"verwendet werden\n"
-"Argumente und Rückgabewerte:"
-
-#: src/generics/impl-trait.md:6
-msgid ""
-"```rust,editable\n"
-"use std::fmt::Display;\n"
-"\n"
-"fn get_x(name: impl Display) -> impl Display {\n"
-"    format!(\"Hello {name}\")\n"
-"}\n"
-"\n"
-"fn main() {\n"
-"    let x = get_x(\"foo\");\n"
-"    println!(\"{x}\");\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/impl-trait.md:19
-#, fuzzy
-msgid "* `impl Trait` allows you to work with types which you cannot name."
-msgstr ""
-"* `impl Trait` kann nicht mit der `::<>` Turbofish-Syntax verwendet werden.\n"
-"* `impl Trait` ermöglicht es Ihnen, mit Typen zu arbeiten, die Sie nicht "
-"benennen können."
-
-#: src/generics/impl-trait.md:23
-#, fuzzy
-msgid ""
-"The meaning of `impl Trait` is a bit different in the different positions."
-msgstr ""
-"Die Bedeutung von „impl Trait“ ist in den verschiedenen Positionen etwas "
-"unterschiedlich."
-
-#: src/generics/impl-trait.md:25
-#, fuzzy
-msgid ""
-"* For a parameter, `impl Trait` is like an anonymous generic parameter with "
-"a trait bound.\n"
-"\n"
-"* For a return type, it means that the return type is some concrete type "
-"that implements the trait,\n"
-"  without naming the type. This can be useful when you don't want to expose "
-"the concrete type in a\n"
-"  public API.\n"
-"\n"
-"  Inference is hard in return position. A function returning `impl Foo` "
-"picks\n"
-"  the concrete type it returns, without writing it out in the source. A "
-"function\n"
-"  returning a generic type like `collect<B>() -> B` can return any type\n"
-"  satisfying `B`, and the caller may need to choose one, such as with `let "
-"x:\n"
-"  Vec<_> = foo.collect()` or with the turbofish, `foo.collect::<Vec<_>>()`."
-msgstr ""
-"* Für einen Parameter ist `impl Trait` wie ein anonymer generischer "
-"Parameter mit einer Eigenschaftsbindung.\n"
-"* Für einen Rückgabetyp bedeutet dies, dass der Rückgabetyp ein konkreter "
-"Typ ist, der die Eigenschaft implementiert,\n"
-"  ohne den Typ zu nennen. Dies kann nützlich sein, wenn Sie den konkreten "
-"Typ in a nicht verfügbar machen möchten\n"
-"  öffentliche API."
-
-#: src/generics/impl-trait.md:37
-#, fuzzy
-msgid ""
-"This example is great, because it uses `impl Display` twice. It helps to "
-"explain that\n"
-"nothing here enforces that it is _the same_ `impl Display` type. If we used "
-"a single \n"
-"`T: Display`, it would enforce the constraint that input `T` and return `T` "
-"type are the same type.\n"
-"It would not work for this particular function, as the type we expect as "
-"input is likely not\n"
-"what `format!` returns. If we wanted to do the same via `: Display` syntax, "
-"we'd need two\n"
-"independent generic parameters."
-msgstr ""
-"Dieses Beispiel ist großartig, weil es `impl Display` zweimal verwendet. Es "
-"hilft, das zu erklären\n"
-"nichts hier erzwingt, dass es _derselbe_ `impl Display`-Typ ist. Wenn wir "
-"eine Single benutzten\n"
-"`T: Display`, es würde die Einschränkung erzwingen, dass der Eingabe-`T`- "
-"und der Rückgabe-`T-Typ derselbe Typ sind.\n"
-"Es würde für diese spezielle Funktion nicht funktionieren, da der Typ, den "
-"wir als Eingabe erwarten, wahrscheinlich nicht der Fall ist\n"
-"welches `format!` zurückgibt. Wenn wir dasselbe über die `: Display`-Syntax "
-"machen wollten, bräuchten wir zwei\n"
-"unabhängige generische Parameter.\n"
-"    \n"
-"</details>"
-
-#: src/generics/closures.md:1
+#: src/traits/closures.md:1
 #, fuzzy
 msgid "# Closures"
 msgstr "# Schließungen"
 
-#: src/generics/closures.md:3
+#: src/traits/closures.md:3
 #, fuzzy
 msgid ""
 "Closures or lambda expressions have types which cannot be named. However, "
@@ -9448,7 +9663,7 @@ msgstr ""
 "[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) "
 "Eigenschaften:"
 
-#: src/generics/closures.md:8
+#: src/traits/closures.md:8
 msgid ""
 "```rust,editable\n"
 "fn apply_with_log(func: impl FnOnce(i32) -> i32, input: i32) -> i32 {\n"
@@ -9466,7 +9681,7 @@ msgid ""
 "```"
 msgstr ""
 
-#: src/generics/closures.md:25
+#: src/traits/closures.md:25
 #, fuzzy
 msgid ""
 "If you have an `FnOnce`, you may only call it once. It might consume "
@@ -9475,7 +9690,7 @@ msgstr ""
 "Wenn Sie ein `FnOnce` haben, können Sie es nur einmal aufrufen. Es kann "
 "erfasste Werte verbrauchen."
 
-#: src/generics/closures.md:27
+#: src/traits/closures.md:27
 #, fuzzy
 msgid ""
 "An `FnMut` might mutate captured values, so you can call it multiple times "
@@ -9484,7 +9699,7 @@ msgstr ""
 "Ein `FnMut` kann erfasste Werte mutieren, sodass Sie es mehrmals, aber nicht "
 "gleichzeitig aufrufen können."
 
-#: src/generics/closures.md:29
+#: src/traits/closures.md:29
 #, fuzzy
 msgid ""
 "An `Fn` neither consumes nor mutates captured values, or perhaps captures "
@@ -9495,7 +9710,7 @@ msgstr ""
 "vielleicht gar nichts, also kann es das\n"
 "mehrmals gleichzeitig aufgerufen werden."
 
-#: src/generics/closures.md:32
+#: src/traits/closures.md:32
 #, fuzzy
 msgid ""
 "`FnMut` is a subtype of `FnOnce`. `Fn` is a subtype of `FnMut` and `FnOnce`. "
@@ -9510,254 +9725,11 @@ msgstr ""
 "überall dort verwenden, wo ein „FnMut“ oder „FnOnce“ steht\n"
 "ist angesagt."
 
-#: src/generics/closures.md:36
+#: src/traits/closures.md:36
 #, fuzzy
 msgid "`move` closures only implement `FnOnce`."
 msgstr "`move`-Closures implementieren nur `FnOnce`."
 
-#: src/generics/monomorphization.md:1
-#, fuzzy
-msgid "# Monomorphization"
-msgstr "# Monomorphisierung"
-
-#: src/generics/monomorphization.md:3
-#, fuzzy
-msgid "Generic code is turned into non-generic code based on the call sites:"
-msgstr ""
-"Basierend auf den Aufrufseiten wird generischer Code in nicht generischen "
-"Code umgewandelt:"
-
-#: src/generics/monomorphization.md:5
-msgid ""
-"```rust,editable\n"
-"fn main() {\n"
-"    let integer = Some(5);\n"
-"    let float = Some(5.0);\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/monomorphization.md:12
-#, fuzzy
-msgid "behaves as if you wrote"
-msgstr "verhält sich so, als hättest du geschrieben"
-
-#: src/generics/monomorphization.md:14
-msgid ""
-"```rust,editable\n"
-"enum Option_i32 {\n"
-"    Some(i32),\n"
-"    None,\n"
-"}\n"
-"\n"
-"enum Option_f64 {\n"
-"    Some(f64),\n"
-"    None,\n"
-"}\n"
-"\n"
-"fn main() {\n"
-"    let integer = Option_i32::Some(5);\n"
-"    let float = Option_f64::Some(5.0);\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/monomorphization.md:31
-#, fuzzy
-msgid ""
-"This is a zero-cost abstraction: you get exactly the same result as if you "
-"had\n"
-"hand-coded the data structures without the abstraction."
-msgstr ""
-"Dies ist eine Null-Kosten-Abstraktion: Sie erhalten genau das gleiche "
-"Ergebnis, als ob Sie es hätten\n"
-"die Datenstrukturen ohne die Abstraktion von Hand codiert."
-
-#: src/generics/trait-objects.md:1
-#, fuzzy
-msgid "# Trait Objects"
-msgstr "# Eigenschaftsobjekte"
-
-#: src/generics/trait-objects.md:3
-#, fuzzy
-msgid "We've seen how a function can take arguments which implement a trait:"
-msgstr ""
-"Wir haben gesehen, wie eine Funktion Argumente annehmen kann, die ein "
-"Merkmal implementieren:"
-
-#: src/generics/trait-objects.md:5
-msgid ""
-"```rust,editable\n"
-"use std::fmt::Display;\n"
-"\n"
-"fn print<T: Display>(x: T) {\n"
-"    println!(\"Your value: {x}\");\n"
-"}\n"
-"\n"
-"fn main() {\n"
-"    print(123);\n"
-"    print(\"Hello\");\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-objects.md:18
-#, fuzzy
-msgid ""
-"However, how can we store a collection of mixed types which implement "
-"`Display`?"
-msgstr ""
-"Wie können wir jedoch eine Sammlung gemischter Typen speichern, die "
-"\"Display\" implementieren?"
-
-#: src/generics/trait-objects.md:20
-msgid ""
-"```rust,editable,compile_fail\n"
-"fn main() {\n"
-"    let displayables = vec![123, \"Hello\"];\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-objects.md:26
-#, fuzzy
-msgid "For this, we need _trait objects_:"
-msgstr "Dafür brauchen wir _trait objects_:"
-
-#: src/generics/trait-objects.md:28
-msgid ""
-"```rust,editable\n"
-"use std::fmt::Display;\n"
-"\n"
-"fn main() {\n"
-"    let displayables: Vec<Box<dyn Display>> = vec![Box::new(123), Box::"
-"new(\"Hello\")];\n"
-"    for x in displayables {\n"
-"        println!(\"x: {x}\");\n"
-"    }\n"
-"}\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-objects.md:39
-#, fuzzy
-msgid "Memory layout after allocating `displayables`:"
-msgstr "Speicherlayout nach Zuweisung von `xs`:"
-
-#: src/generics/trait-objects.md:41
-msgid ""
-"```bob\n"
-" Stack                             Heap\n"
-".- - - - - - - - - - - - - -.     .- - - - - - - - - - - - - - - - - - - - - "
-"- - -.\n"
-":                           :     :                                               :\n"
-":    "
-"displayables           :     :                                               :\n"
-":   +-----------+-------+   :     :   +-----+-----"
-"+                               :\n"
-":   | ptr       |   o---+---+-----+-->| o o | o o "
-"|                               :\n"
-":   | len       |     2 |   :     :   +-|-|-+-|-|-"
-"+                               :\n"
-":   | capacity  |     2 |   :     :     | |   | |   +----+----+----+----+----"
-"+    :\n"
-":   +-----------+-------+   :     :     | |   | '-->| H  | e  | l  | l  | o  "
-"|    :\n"
-":                           :     :     | |   |     +----+----+----+----+----"
-"+    :\n"
-"`- - - - - - - - - - - - - -'     :     | |   "
-"|                                   :\n"
-"                                  :     | |   |     "
-"+-------------------------+   :\n"
-"                                  :     | |   '---->| \"<str as Display>::"
-"fmt\" |   :\n"
-"                                  :     | |         "
-"+-------------------------+   :\n"
-"                                  :     | "
-"|                                       :\n"
-"                                  :     | |   +----+----+----+----"
-"+               :\n"
-"                                  :     | '-->| 7b | 00 | 00 | 00 "
-"|               :\n"
-"                                  :     |     +----+----+----+----"
-"+               :\n"
-"                                  :     "
-"|                                         :\n"
-"                                  :     |     +-------------------------"
-"+         :\n"
-"                                  :     '---->| \"<i32 as Display>::fmt\" "
-"|         :\n"
-"                                  :           +-------------------------"
-"+         :\n"
-"                                  :                                               :\n"
-"                                  :                                               :\n"
-"                                  '- - - - - - - - - - - - - - - - - - - - - "
-"- - -'\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-objects.md:69
-#, fuzzy
-msgid ""
-"Similarly, you need a trait object if you want to return different types\n"
-"implementing a trait:"
-msgstr ""
-"Ebenso benötigen Sie ein Trait-Objekt, wenn Sie andere Werte zurückgeben "
-"möchten\n"
-"Implementieren eines Merkmals:"
-
-#: src/generics/trait-objects.md:72
-msgid ""
-"```rust,editable\n"
-"fn numbers(n: i32) -> Box<dyn Iterator<Item=i32>> {\n"
-"    if n > 0 {\n"
-"        Box::new(0..n)\n"
-"    } else {\n"
-"        Box::new((n..0).rev())\n"
-"    }\n"
-"}\n"
-"\n"
-"fn main() {\n"
-"    println!(\"{:?}\", numbers(-5).collect::<Vec<_>>());\n"
-"    println!(\"{:?}\", numbers(5).collect::<Vec<_>>());\n"
-"}\n"
-"\n"
-"```"
-msgstr ""
-
-#: src/generics/trait-objects.md:90
-#, fuzzy
-msgid ""
-"* Types that implement a given trait may be of different sizes. This makes "
-"it impossible to have things like `Vec<Display>` in the example above.\n"
-"* `dyn Display` is a way to tell the compiler about a dynamically sized type "
-"that implements `Display`.\n"
-"* In the example, `displayables` holds *fat pointers* to objects that "
-"implement `Display`. The fat pointer consists of two components, a pointer "
-"to the actual object and a pointer to the virtual method table for the "
-"`Display` implementation of that particular object.\n"
-"* Compare these outputs in the above example:\n"
-"     ```rust,ignore\n"
-"\t\t use std::fmt::Display;\n"
-"         println!(\"{}\", std::mem::size_of::<u32>());\n"
-"         println!(\"{}\", std::mem::size_of::<&u32>());\n"
-"         println!(\"{}\", std::mem::size_of::<&dyn Display>());\n"
-"         println!(\"{}\", std::mem::size_of::<Box<dyn Display>>());\n"
-"     ```"
-msgstr ""
-"* Merkmale können vorimplementierte (Standard-)Methoden und Methoden "
-"spezifizieren, die Benutzer selbst implementieren müssen. Methoden mit "
-"Standardimplementierungen können sich auf erforderliche Methoden stützen.\n"
-"* Typen, die ein bestimmtes Merkmal implementieren, können unterschiedlich "
-"groß sein. Das macht es unmöglich Dinge wie `Vec<Greet>` im obigen Beispiel "
-"zu haben.\n"
-"* „dyn Greet“ ist eine Möglichkeit, dem Compiler einen Typ mit dynamischer "
-"Größe mitzuteilen, der „Greet“ implementiert.\n"
-"* Im Beispiel enthält `pets` Fat Pointer auf Objekte, die `Greet` "
-"implementieren. Der Fat Pointer besteht aus zwei Komponenten, einem Zeiger "
-"auf das tatsächliche Objekt und einem Zeiger auf die virtuelle "
-"Methodentabelle für die \"Greet\"-Implementierung dieses bestimmten Objekts."
-
 #: src/exercises/day-3/morning.md:1
 #, fuzzy
 msgid "# Day 3: Morning Exercises"
@@ -19020,6 +18992,34 @@ msgid ""
 "```"
 msgstr ""
 
+#, fuzzy
+#~ msgid ""
+#~ "We've seen how a function can take arguments which implement a trait:"
+#~ msgstr ""
+#~ "Wir haben gesehen, wie eine Funktion Argumente annehmen kann, die ein "
+#~ "Merkmal implementieren:"
+
+#, fuzzy
+#~ msgid ""
+#~ "However, how can we store a collection of mixed types which implement "
+#~ "`Display`?"
+#~ msgstr ""
+#~ "Wie können wir jedoch eine Sammlung gemischter Typen speichern, die "
+#~ "\"Display\" implementieren?"
+
+#, fuzzy
+#~ msgid "For this, we need _trait objects_:"
+#~ msgstr "Dafür brauchen wir _trait objects_:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Similarly, you need a trait object if you want to return different types\n"
+#~ "implementing a trait:"
+#~ msgstr ""
+#~ "Ebenso benötigen Sie ein Trait-Objekt, wenn Sie andere Werte zurückgeben "
+#~ "möchten\n"
+#~ "Implementieren eines Merkmals:"
+
 #~ msgid ""
 #~ "1. Make yourself familiar with the course material. We've included "
 #~ "speaker notes\n"