This repository has been archived by the owner on Oct 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
translations.json
2318 lines (2318 loc) · 707 KB
/
translations.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"german": {
"Introduction": "Einführung",
"TypeScript is JavaScript that scales. A language designed to implement complex use cases. It allows JavaScript to be written with types that are checked and removed at compile time. This resulting type safety allows for easier writing and maintenance of complex applications. This, among other things, is what has made TypeScript so popular: It allows finding bugs in code, especially on a large scale, much faster and easier than would be possible with pure JavaScript - and it works with JavaScript, not against it.": "TypeScript ist JavaScript, das skalierbar ist. Eine Sprache, die für die Implementierung komplexer Anwendungsfälle entwickelt wurde. Sie ermöglicht es, JavaScript mit Typen zu schreiben, die zur Kompilierzeit geprüft und entfernt werden. Die daraus resultierende Typsicherheit erleichtert das Schreiben und die Wartung komplexer Anwendungen. Dies ist es auch, was TypeScript so populär gemacht hat: Es ermöglicht das Auffinden von Fehlern im Code, insbesondere in großem Umfang, viel schneller und einfacher, als es mit reinem JavaScript möglich wäre - und es arbeitet mit JavaScript, nicht dagegen.",
"Deepkit is TypeScript that scales. A framework written in TypeScript for TypeScript, designed to develop very complex software in TypeScript. It brings many design patterns known from the Enterprise to TypeScript and introduces completely new features that are only possible with TypeScript’s new type system to increase development speed especially in teams. Small applications can also benefit from this new approach, as Deepkit comes with many libraries for very common use cases that can be used individually or in combination. The framework itself is designed to be as agile as possible and as complex as necessary, not only to get initial results quickly, but also to maintain development speed in the long term.": "Deepkit ist TypeScript, das skaliert. Ein Framework, das in TypeScript für TypeScript geschrieben wurde, um sehr komplexe Software in TypeScript zu entwickeln. Es bringt viele aus dem Enterprise-Bereich bekannte Entwurfsmuster nach TypeScript und führt völlig neue Funktionen ein, die nur mit dem neuen TypeScript-Typsystem möglich sind, um die Entwicklungsgeschwindigkeit vor allem in Teams zu erhöhen. Auch kleine Anwendungen können von diesem neuen Ansatz profitieren, da Deepkit viele Bibliotheken für sehr häufige Anwendungsfälle enthält, die einzeln oder in Kombination verwendet werden können. Das Framework selbst ist darauf ausgelegt, so agil wie möglich und so komplex wie nötig zu sein, nicht nur um schnell erste Ergebnisse zu erzielen, sondern auch um die Entwicklungsgeschwindigkeit langfristig zu erhalten.",
"JavaScript is now the largest developer community in the world and provides the developer with a correspondingly large selection of many libraries and tools to cover the needs of a project. However, it is not always easy to find the right library. Often the philosophies, API and code qualities of these differ so much that a lot of sticky code and additional abstractions have to be introduced by the developer in order for these libraries to work properly with each other at all. The provision of core functions, which are needed by virtually every project, in nicely abstracted libraries brought together in a framework by a manufacturer or a community has proven itself again and again in the last decades: Java Spring, PHP Symfony/Laravel, and C++ QT are just a few very well-known and successful examples. These frameworks offer to the developer often far common and decades proven concepts, which are converted into libraries or components, in order to be able to be used so comfortably among themselves harmonizing demand-fairly. The offered functionalities and design patterns are thereby not cubed, but based on sometimes over decades old concepts, which worked satisfactorily by the fight in the competition with alternative ideas.": "JavaScript ist heute die größte Entwicklergemeinschaft der Welt und bietet dem Entwickler eine entsprechend große Auswahl an vielen Bibliotheken und Werkzeugen, um die Bedürfnisse eines Projekts abzudecken. Allerdings ist es nicht immer einfach, die richtige Bibliothek zu finden. Oft unterscheiden sich deren Philosophien, API und Code-Qualitäten so sehr, dass der Entwickler eine Menge klebrigen Code und zusätzliche Abstraktionen einführen muss, damit diese Bibliotheken überhaupt richtig miteinander arbeiten. Die Bereitstellung von Kernfunktionen, die praktisch jedes Projekt benötigt, in schön abstrahierten Bibliotheken, die von einem Hersteller oder einer Community in einem Framework zusammengeführt werden, hat sich in den letzten Jahrzehnten immer wieder bewährt: Java Spring, PHP Symfony/Laravel und C++ QT sind nur einige sehr bekannte und erfolgreiche Beispiele. Diese Frameworks bieten dem Entwickler oft weit verbreitete und jahrzehntelang bewährte Konzepte, die in Bibliotheken oder Komponenten umgesetzt werden, um so bequem untereinander bedarfsgerecht eingesetzt werden zu können. Die angebotenen Funktionalitäten und Entwurfsmuster sind dabei nicht gewürfelt, sondern basieren auf teilweise über Jahrzehnte alten Konzepten, die sich im Kampf mit alternativen Ideen bewährt haben.",
"JavaScript has seen massive progress over the years, so that more and more design patterns from the enterprise environment can now be applied. Design patterns that can be found in more and more libraries, frameworks, and tools. However, JavaScript and also TypeScript have the problem that in order to efficiently apply many proven enterprise patterns, decisive functions are missing in the language itself. This does not mean that these design patterns cannot be applied in general, but that they are less efficient than in other current languages.": "JavaScript hat in den letzten Jahren enorme Fortschritte gemacht, so dass immer mehr Design Patterns aus dem Unternehmensumfeld angewendet werden können. Entwurfsmuster, die in immer mehr Bibliotheken, Frameworks und Tools zu finden sind. Allerdings haben JavaScript und auch TypeScript das Problem, dass für die effiziente Anwendung vieler bewährter Enterprise Patterns entscheidende Funktionen in der Sprache selbst fehlen. Das bedeutet nicht, dass diese Entwurfsmuster nicht generell angewendet werden können, sondern dass sie weniger effizient sind als in anderen gängigen Sprachen.",
"TypeScript completely removes its type information at compile time, once TypeScript is converted to JavaScript, so no information about it exists in the generated JavaScript or at runtime. It is undeniable that types are very valuable during development and when checking the correctness of the program. However, types also have tremendous value at runtime. This value is reflected where at runtime data is transformed (converted/serialized), data is validated, meta-information is added to objects, or interface information is required. In these and many other use cases, type information can be very useful at runtime because it provides libraries with the information needed to efficiently provide functionality. Currently, many of these use cases instead use alternatives that incompletely mimic TypeScript’s type system, forcing the developer to write types in a new way that has nothing to do with TypeScript’s syntax. The result is that TypeScript’s powerful type system can no longer show its strength here, and less ergonomic and less efficient ways of working must be used instead.": "TypeScript entfernt seine Typinformationen bei der Kompilierung vollständig, sobald TypeScript in JavaScript konvertiert ist, so dass im generierten JavaScript oder zur Laufzeit keine Informationen darüber vorhanden sind. Es ist unbestreitbar, dass Typen während der Entwicklung und bei der Überprüfung der Korrektheit des Programms sehr wertvoll sind. Aber auch zur Laufzeit haben Typen einen enormen Wert. Dieser Wert zeigt sich dort, wo zur Laufzeit Daten transformiert (konvertiert/serialisiert), Daten validiert, Meta-Informationen zu Objekten hinzugefügt oder Schnittstelleninformationen benötigt werden. In diesen und vielen anderen Anwendungsfällen können Typinformationen zur Laufzeit sehr nützlich sein, da sie Bibliotheken mit den Informationen versorgen, die sie zur effizienten Bereitstellung von Funktionen benötigen. Derzeit verwenden viele dieser Anwendungsfälle stattdessen Alternativen, die das TypeScript-Typsystem unvollständig nachahmen und den Entwickler dazu zwingen, Typen auf eine neue Art und Weise zu schreiben, die nichts mit der Syntax von TypeScript zu tun hat. Das Ergebnis ist, dass TypeScripts mächtiges Typsystem hier nicht mehr seine Stärke ausspielen kann und stattdessen weniger ergonomische und weniger effiziente Arbeitsweisen verwendet werden müssen.",
"Deepkit Framework": "Deepkit-Rahmenwerk",
"Deepkit has developed a type compiler that leaves type information in place, allowing dynamic types to be computed at runtime and existing type information to be read at runtime. With this paradigm shift, completely new ways of working are possible, providing the required information for the aforementioned use cases, radically simplifying the development of complex software, and giving the code more expressiveness. It is thus possible for the first time to use the full power and expressiveness of TypeScript at runtime as well.": "Deepkit hat einen Typ-Compiler entwickelt, der Typinformationen an Ort und Stelle belässt, so dass dynamische Typen zur Laufzeit berechnet und vorhandene Typinformationen zur Laufzeit gelesen werden können. Mit diesem Paradigmenwechsel werden völlig neue Arbeitsweisen möglich, die die benötigten Informationen für die oben genannten Anwendungsfälle bereitstellen, die Entwicklung komplexer Software radikal vereinfachen und dem Code mehr Ausdruckskraft verleihen. Damit ist es erstmals möglich, die volle Leistungsfähigkeit und Ausdruckskraft von TypeScript auch zur Laufzeit zu nutzen.",
"Based on this paradigm shift, Deepkit has developed a whole set of libraries for use cases that can be found in just about any program: Validation, Serialization, Database Abstraction, CLI parser, HTTP Router, RPC Framework, Logger, Template System, Event System and many more. The fundamental difference from other libraries is that type information is at the core of the functionality and as much TypeScript as possible should be reused at runtime, so less boilerplate needs to be written by the developer and even complex programs can be seen at a glance what they are doing. Finally, one of the key features of TypeScript is to give expression to even complex code, and Deepkit brings these expressiveness benefits to the runtime in the form of a powerful framework to now better scale application architecture with appropriate enterprise patterns.": "Basierend auf diesem Paradigmenwechsel hat Deepkit eine ganze Reihe von Bibliotheken für Anwendungsfälle entwickelt, die in nahezu jedem Programm zu finden sind: Validierung, Serialisierung, Datenbankabstraktion, CLI-Parser, HTTP-Router, RPC-Framework, Logger, Template-System, Event-System und viele mehr. Der grundlegende Unterschied zu anderen Bibliotheken besteht darin, dass Typinformationen den Kern der Funktionalität ausmachen und so viel TypeScript wie möglich zur Laufzeit wiederverwendet werden sollte, so dass der Entwickler weniger Boilerplate schreiben muss und selbst komplexe Programme auf einen Blick erkennen können, was sie gerade tun. Schließlich besteht eine der wichtigsten Eigenschaften von TypeScript darin, selbst komplexem Code Ausdruckskraft zu verleihen, und Deepkit bringt diese Vorteile der Ausdruckskraft zur Laufzeit in Form eines leistungsstarken Frameworks, um die Anwendungsarchitektur mit geeigneten Unternehmensmustern besser skalieren zu können.",
"Deepkit consists of two large areas: One is the Deepkit Libraries and the Deepkit Framework. The Deepkit Libraries are a whole family of standalone TypeScript libraries (NPM packages) that are good at one topic and are optimized, well tested, and designed to complement each other optimally. A project can use individual Deepkit libraries, or the entire Deepkit framework, which brings together all the capabilities of the libraries and complements them with additional tools such as the debugger. All together, it allows the developer to create complex, fast, and production-ready applications. Deepkit supports a wide range of use cases. From simple command-line tools (CLI programs) to web applications and micro-services to desktop or mobile applications. The code is designed to run in any known JavaScript engine (browser as well as NodeJS) and integrates beautifully with other frameworks such as Angular, React, and Vue. The claim behind Deepkit Framework is to apply clean code, SOLID principles, and enterprise design patterns to not only offer correspondingly high code quality, but to allow the user to apply them as well. Deepkit also tries to promote these same principles in its documentation and examples, but does not force the developer to follow them themselves.": "Deepkit besteht aus zwei großen Bereichen: Zum einen aus den Deepkit Libraries und dem Deepkit Framework. Bei den Deepkit-Bibliotheken handelt es sich um eine ganze Familie eigenständiger TypeScript-Bibliotheken (NPM-Pakete), die ein Thema gut beherrschen und die optimiert, gut getestet und so konzipiert sind, dass sie sich gegenseitig optimal ergänzen. Ein Projekt kann einzelne Deepkit-Bibliotheken oder das gesamte Deepkit-Framework verwenden, das alle Fähigkeiten der Bibliotheken zusammenfasst und durch zusätzliche Tools wie den Debugger ergänzt. Alles zusammen ermöglicht es dem Entwickler, komplexe, schnelle und produktionsreife Anwendungen zu erstellen. Deepkit unterstützt eine breite Palette von Anwendungsfällen. Von einfachen Befehlszeilentools (CLI-Programmen) über Webanwendungen und Microservices bis hin zu Desktop- oder mobilen Anwendungen. Der Code ist so konzipiert, dass er in jeder bekannten JavaScript-Engine (sowohl im Browser als auch in NodeJS) läuft und sich hervorragend in andere Frameworks wie Angular, React und Vue integrieren lässt. Der Anspruch hinter Deepkit Framework ist es, sauberen Code, SOLID-Prinzipien und Enterprise Design Patterns anzuwenden, um nicht nur eine entsprechend hohe Code-Qualität zu bieten, sondern auch dem Nutzer die Möglichkeit zu geben, diese anzuwenden. Deepkit versucht, diese Prinzipien auch in der Dokumentation und in den Beispielen zu fördern, zwingt den Entwickler aber nicht, sie selbst zu befolgen.",
"High-Performance": "Leistungsstarke",
"One of the most difficult problems in software development is to maintain a high development speed even after months or years, especially when the code and the team grow. There are many frameworks that promise to get you started quickly and allow you to cobble together more complex applications on your own in a very short time. However, these usually have the common problem that the development speed decreases drastically the older the project or the larger the team becomes. It is not uncommon that even after a few months and only a handful of developers, the development speed collapses to such an extent that it drops to 1% of the original speed. To counteract this phenomenon, it is necessary to apply established design patterns and use the right framework and libraries in advance. Enterprise design patterns have established themselves for the reason that they scale excellently even with larger applications and large teams. Correctly applied, they develop their capabilities especially when a project is to be developed over a longer period of time (several months to years).": "Eines der schwierigsten Probleme bei der Softwareentwicklung ist es, auch nach Monaten oder Jahren ein hohes Entwicklungstempo beizubehalten, insbesondere wenn der Code und das Team wachsen. Es gibt viele Frameworks, die einen schnellen Einstieg versprechen und es ermöglichen, komplexere Anwendungen in kürzester Zeit selbst zusammenzuschustern. Diese haben jedoch meist das Problem, dass die Entwicklungsgeschwindigkeit drastisch abnimmt, je älter das Projekt oder je größer das Team wird. Nicht selten bricht die Entwicklungsgeschwindigkeit schon nach wenigen Monaten und nur einer Handvoll Entwickler so stark ein, dass sie auf 1 % der ursprünglichen Geschwindigkeit sinkt. Um diesem Phänomen entgegenzuwirken, ist es notwendig, bereits im Vorfeld etablierte Entwurfsmuster anzuwenden und die richtigen Frameworks und Bibliotheken zu verwenden. Enterprise Design Patterns haben sich aus dem Grund etabliert, dass sie auch bei größeren Anwendungen und großen Teams hervorragend skalieren. Richtig angewandt, entfalten sie ihre Fähigkeiten vor allem dann, wenn ein Projekt über einen längeren Zeitraum (mehrere Monate bis Jahre) entwickelt werden soll.",
"Design patterns have their advantages in theory, but in practice almost every pattern also has its disadvantages. These disadvantages vary depending on the language and framework, since the language and framework themselves determine how ergonomically a pattern can be applied. Just because a certain pattern can be used in a language, it does not mean that it automatically makes development better and faster. Some languages are better suited than others for applying certain patterns. With JavaScript or even TypeScript itself, various design patterns are often usable in the core, but there are limitations here that massively affect the user experience and thus speed. For example, Typescript decorators with all their idiosyncrasies may become necessary if a dependency injection framework specifies and is based on them. Deepkit’s runtime type system ensures that these design patterns can be applied in the most ergonomic way and with as little boilerplate as possible, unlocking their power to maintain high development speed not only initially, but also over the long term.": "Entwurfsmuster haben in der Theorie ihre Vorteile, aber in der Praxis hat fast jedes Muster auch seine Nachteile. Diese Nachteile variieren je nach Sprache und Framework, da die Sprache und das Framework selbst bestimmen, wie ergonomisch ein Muster angewendet werden kann. Nur weil ein bestimmtes Muster in einer Sprache verwendet werden kann, heißt das nicht, dass es automatisch die Entwicklung besser und schneller macht. Einige Sprachen sind für die Anwendung bestimmter Muster besser geeignet als andere. Bei JavaScript oder auch TypeScript selbst sind verschiedene Design Patterns oft im Kern verwendbar, aber es gibt hier Einschränkungen, die das Benutzererlebnis und damit die Geschwindigkeit massiv beeinträchtigen. So können z.B. Typescript-Dekoratoren mit all ihren Eigenheiten notwendig werden, wenn ein Dependency-Injection-Framework diese vorgibt und darauf aufbaut. Das Laufzeit-Typsystem von Deepkit stellt sicher, dass diese Entwurfsmuster auf die ergonomischste Art und Weise und mit so wenig Boilerplate wie möglich angewandt werden können, um nicht nur anfangs, sondern auch langfristig eine hohe Entwicklungsgeschwindigkeit zu gewährleisten.",
"Isomorphic TypeScript": "Isomorphes TypeScript",
"One of the biggest advantages of TypeScript is that complex code can be written better in many use cases. This includes frontend, backend, CLI tools, mobile and desktop apps, and much more. When a project spans these use cases and relies almost exclusively on TypeScript, it is called Isomorphic TypeScript. Using TypeScript in as much code as possible can massively increase development speed. So the following advantages are then suddenly available:": "Einer der größten Vorteile von TypeScript ist, dass komplexer Code in vielen Anwendungsfällen besser geschrieben werden kann. Dazu gehören Frontend, Backend, CLI-Tools, mobile und Desktop-Anwendungen und vieles mehr. Wenn ein Projekt diese Anwendungsfälle überspannt und fast ausschließlich auf TypeScript basiert, wird es als Isomorphic TypeScript bezeichnet. Die Verwendung von TypeScript in so viel Code wie möglich kann die Entwicklungsgeschwindigkeit massiv erhöhen. Die folgenden Vorteile sind dann plötzlich verfügbar:",
"Code can be shared between departments (frontend, backend, microservice, etc).": "Der Code kann von verschiedenen Abteilungen gemeinsam genutzt werden (Frontend, Backend, Microservice usw.).",
"Models, types and interfaces": "Modelle, Typen und Schnittstellen",
"Validation": "Validierung",
"Business logic": "Geschäftslogik",
"A unified audit system of a single package manager.": "Ein einheitliches Auditsystem für einen einzigen Paketmanager.",
"Reuse of known third-party libraries in all departments.": "Wiederverwendung bekannter Bibliotheken von Drittanbietern in allen Abteilungen.",
"Knowledge sharing within teams.": "Wissensaustausch innerhalb von Teams.",
"Recruitment is simplified to one group (and the biggest one: JavaScript developers).": "Die Rekrutierung wird auf eine Gruppe (und zwar die größte: JavaScript-Entwickler) vereinfacht.",
"Deepkit framework and its runtime type system are designed to exploit these and more advantages of Isomorphic TypeScript to the utmost, so that its maximum powers are revealed.": "Das Deepkit-Framework und sein Laufzeit-Typsystem sind so konzipiert, dass sie diese und weitere Vorteile von Isomorphic TypeScript optimal ausnutzen, so dass ihre maximale Leistungsfähigkeit zum Vorschein kommt.",
"Old approaches such as the dual stack (frontend and backend in different languages) can no longer keep up by far, since the context switch between the languages alone already costs an enormous amount of energy and time. All the other advantages that have already been explained even make it an unfair comparison. An isomorphic tech stack like TypeScript, properly applied, is many times faster in development time on a fundamental level than any combination of a dual stack for backend/frontend like Java/JavaScript, PHP/JavaScript, or even JavaScript/JavaScript. Since faster development speed also means less time needed for the same features, it also means that Isomorphic TypeScript saves cash. Besides all the advantages already presented, this is the killer argument to use Isomorphic TypeScript in all the next especially commercial projects.": "Alte Ansätze wie der Dual Stack (Frontend und Backend in verschiedenen Sprachen) können da bei weitem nicht mehr mithalten, da allein der Kontextwechsel zwischen den Sprachen schon enorm viel Energie und Zeit kostet. All die anderen Vorteile, die bereits erläutert wurden, machen den Vergleich sogar unfair. Ein isomorpher Tech-Stack wie TypeScript ist, richtig angewandt, auf fundamentaler Ebene um ein Vielfaches schneller in der Entwicklungszeit als jede Kombination aus einem dualen Stack für Backend/Frontend wie Java/JavaScript, PHP/JavaScript oder gar JavaScript/JavaScript. Da eine schnellere Entwicklungsgeschwindigkeit auch bedeutet, dass weniger Zeit für dieselben Funktionen benötigt wird, bedeutet dies auch, dass Isomorphic TypeScript bares Geld spart. Neben all den bereits vorgestellten Vorteilen ist dies das Hauptargument für den Einsatz von Isomorphic TypeScript in allen nächsten, insbesondere kommerziellen Projekten.",
"Runtime Types": "Laufzeittypen",
"Runtime type information in TypeScript unlocks new workflows and features that were previously unavailable or required workarounds. Modern development processes rely heavily on declaring types and schemas for tools like GraphQL, validators, ORMs, and encoders such as ProtoBuf. These tools may require developers to learn new languages specific to their use case, like ProtoBuf and GraphQL having their own declaration language, or validators using their own schema APIs or JSON-Schema.": "Laufzeit-Typinformationen in TypeScript erschließen neue Workflows und Funktionen, die bisher nicht verfügbar waren oder Umgehungen erforderten. Moderne Entwicklungsprozesse sind stark auf die Deklaration von Typen und Schemata für Tools wie GraphQL, Validatoren, ORMs und Encoder wie ProtoBuf angewiesen. Diese Tools können es erforderlich machen, dass Entwickler neue, für ihren Anwendungsfall spezifische Sprachen erlernen, wie z. B. ProtoBuf und GraphQL mit ihrer eigenen Deklarationssprache oder Validatoren, die ihre eigenen Schema-APIs oder JSON-Schema verwenden.",
"TypeScript has become powerful enough to describe complex structures and even replace declaration formats like GraphQL, ProtoBuf, and JSON-Schema entirely. With a runtime type system, it's possible to cover the use cases of these tools without any code generators. The Deepkit library aims to provide runtime type information and make it easier to develop efficient and compatible solutions.": "TypeScript ist mittlerweile leistungsfähig genug, um komplexe Strukturen zu beschreiben und sogar Deklarationsformate wie GraphQL, ProtoBuf und JSON-Schema vollständig zu ersetzen. Mit einem Laufzeit-Typsystem ist es möglich, die Anwendungsfälle dieser Tools ohne Codegeneratoren abzudecken. Die Deepkit-Bibliothek zielt darauf ab, Laufzeittypinformationen bereitzustellen und die Entwicklung effizienter und kompatibler Lösungen zu erleichtern.",
"Deepkit is built upon the ability to read type information at runtime, using as much TypeScript type information as possible for efficiency. The runtime type system allows reading and computing dynamic types, such as class properties, function parameters, and return types. Deepkit hooks into TypeScript's compilation process to ensure that all type information is embedded into the generated JavaScript, enabling developers to access type information programmatically.": "Deepkit basiert auf der Fähigkeit, Typinformationen zur Laufzeit zu lesen, wobei so viele TypeScript-Typinformationen wie möglich für die Effizienz verwendet werden. Das Laufzeit-Typsystem ermöglicht das Lesen und Berechnen dynamischer Typen, wie Klasseneigenschaften, Funktionsparameter und Rückgabetypen. Deepkit klinkt sich in den Kompilierungsprozess von TypeScript ein, um sicherzustellen, dass alle Typinformationen in das generierte JavaScript eingebettet werden, so dass Entwickler programmatisch auf Typinformationen zugreifen können.",
"With Deepkit, developers can use their existing TypeScript types for various application possibilities, simplifying their development process and making their work more efficient.": "Mit Deepkit können Entwickler ihre vorhandenen TypeScript-Typen für verschiedene Anwendungsmöglichkeiten nutzen, was ihren Entwicklungsprozess vereinfacht und ihre Arbeit effizienter macht.",
"Installation": "Installation",
"To install Deepkit's runtime type system two packages are needed. The type compiler in `@deepkit/type-compiler` and the runtime in `@deepkit/type`. The type compiler can be installed in `package.json` _devDependencies_, because it is only needed at build time.": "Um das Laufzeitsystem von Deepkit zu installieren, werden zwei Pakete benötigt. Der Typ-Compiler in `@deepkit/type-compiler` und die Laufzeit in `@deepkit/type`. Der Type-Compiler kann in `package.json` _devDependencies_ installiert werden, da er nur zur Build-Zeit benötigt wird.",
"Runtime type information is not generated by default. It must be set `\"reflection\": true` in the `tsconfig.json` file to enable it in all files in the same folder of this file or in all subfolders. If decorators are to be used, `\"experimentalDecorators\": true` must be enabled in `tsconfig.json`. This is not strictly necessary to work with `@deepkit/type`, but necessary for certain functions of other deepkit libraries and in `@deepkit/framework`.": "Laufzeittypinformationen werden standardmäßig nicht erzeugt. Es muss `\"reflection\": true` in der `tsconfig.json` Datei gesetzt werden, um es in allen Dateien im gleichen Ordner dieser Datei oder in allen Unterordnern zu aktivieren. Wenn Dekoratoren verwendet werden sollen, muss `\"experimentalDecorators\": true` in `tsconfig.json` aktiviert werden. Dies ist nicht unbedingt notwendig, um mit `@deepkit/type` zu arbeiten, aber notwendig für bestimmte Funktionen anderer Deepkit-Bibliotheken und in `@deepkit/framework`.",
"_File: tsconfig.json_": "_Datei: tsconfig.json_",
"Type compiler": "Typ-Compiler",
"TypeScript itself does not allow to configure the type compiler via a `tsconfig.json`. It is necessary to either use the TypeScript compiler API directly or a build system like Webpack with _ts-loader_. To save this inconvenient way for Deepkit users, the Deepkit type compiler automatically installs itself in `node_modulestypescript` once `@deepkit/type-compiler` is installed (this is done via NPM install hooks).": "TypeScript selbst erlaubt es nicht, den Type-Compiler über eine `tsconfig.json` zu konfigurieren. Es ist notwendig, entweder die TypeScript-Compiler-API direkt oder ein Build-System wie Webpack mit _ts-loader_ zu verwenden. Um Deepkit-Nutzern diesen umständlichen Weg zu ersparen, installiert sich der Deepkit-Type-Compiler automatisch in `node_modulestypescript`, sobald `@deepkit/type-compiler` installiert ist (dies geschieht über NPM-Installationshaken).",
"This makes it possible for all build tools that access the locally installed TypeScript (the one in `node_modulestypescript`) to automatically have the type compiler enabled. This makes _tsc_, Angular, webpack, _ts-node_, and some other tools automatically work with the deepkit type compiler.": "Dies macht es möglich, dass alle Build-Tools, die auf das lokal installierte TypeScript (das in `node_modulestypescript`) zugreifen, automatisch den Type-Compiler aktiviert haben. Dadurch arbeiten _tsc_, Angular, webpack, _ts-node_ und einige andere Tools automatisch mit dem Deepkit-Type-Compiler.",
"If the type compiler could not be successfully installed automatically (for example because NPM install hooks are disabled), this can be done manually with the following command:": "Wenn der Type Compiler nicht automatisch installiert werden konnte (z. B. weil die NPM-Installationshaken deaktiviert sind), kann dies mit dem folgenden Befehl manuell durchgeführt werden:",
"Note that `deepkit-type-install` must be run if the local typescript version has been updated (for example, if the typescript version in package.json has changed and `npm install` is run).": "Beachten Sie, dass `deepkit-type-install` ausgeführt werden muss, wenn die lokale Typescript-Version aktualisiert wurde (z.B. wenn die Typescript-Version in package.json geändert wurde und `npm install` ausgeführt wird).",
"Webpack": "Webpack",
"If you want to use the type compiler in a webpack build, you can do so with the `ts-loader` package (or any other typescript loader that supports transformer registration).": "Wenn Sie den Type Compiler in einem Webpack-Build verwenden möchten, können Sie dies mit dem Paket `ts-loader` tun (oder mit jedem anderen Typescript-Loader, der die Registrierung von Transformern unterstützt).",
"_File: webpack.config.js_": "_Datei: webpack.config.js_",
"Typen-Decorators": "Typen-Dekoratoren",
"Type decorators are normal TypeScript types that contain meta-information to change the behavior of various functions at runtime. Deepkit already provides some type decorators that cover some use cases. For example, a class property can be marked as primary key, reference, or index. The database library can use this information at runtime to create the correct SQL queries without prior code generation.": "Typdekoratoren sind normale TypeScript-Typen, die Meta-Informationen enthalten, um das Verhalten verschiedener Funktionen zur Laufzeit zu ändern. Deepkit bietet bereits einige Typdekoratoren, die einige Anwendungsfälle abdecken. Zum Beispiel kann eine Klasseneigenschaft als Primärschlüssel, Referenz oder Index markiert werden. Die Datenbankbibliothek kann diese Informationen zur Laufzeit verwenden, um die richtigen SQL-Abfragen ohne vorherige Codegenerierung zu erstellen.",
"Validator constraints such as `MaxLength`, `Maximum`, or `Positive` can also be added to any type. It is also possible to tell the serializer how to serialize or deserialize a particular value. In addition, it is possible to create completely custom type decorators and read them at runtime, in order to use the type system at runtime in a very individual way.": "Validator-Bedingungen wie \"MaxLength\", \"Maximum\" oder \"Positiv\" können ebenfalls zu jedem Typ hinzugefügt werden. Es ist auch möglich, dem Serialisierer mitzuteilen, wie er einen bestimmten Wert serialisieren oder deserialisieren soll. Darüber hinaus ist es möglich, vollständig benutzerdefinierte Typdekoratoren zu erstellen und diese zur Laufzeit auszulesen, um das Typsystem zur Laufzeit auf sehr individuelle Weise zu nutzen.",
"Deepkit comes with a whole set of type decorators, all of which can be used directly from `@deepkit/type`. They are designed not to come from multiple libraries, so as not to tie code directly to a particular library such as Deepkit RPC or Deepkit Database. This allows easier reuse of types, even in the frontend, although database type decorators are used for example.": "Deepkit verfügt über eine ganze Reihe von Typdekoratoren, die alle direkt aus `@deepkit/type` verwendet werden können. Sie sind so konzipiert, dass sie nicht aus mehreren Bibliotheken stammen, um den Code nicht direkt an eine bestimmte Bibliothek wie Deepkit RPC oder Deepkit Database zu binden. Dies ermöglicht eine einfachere Wiederverwendung von Typen, auch im Frontend, obwohl zum Beispiel Datenbanktypdekoratoren verwendet werden.",
"Following is a list of existing type decorators. The validator and serializer of `@deepkit/type` and `@deepkit/bson` and Deepkit Database of `@deepkit/orm` used this information differently. See the corresponding chapters to learn more about this.": "Es folgt eine Liste der vorhandenen Typdekoratoren. Der Validator und Serialisierer von `@deepkit/type` und `@deepkit/bson` sowie die Deepkit-Datenbank von `@deepkit/orm` verwenden diese Informationen anders. Siehe die entsprechenden Kapitel, um mehr darüber zu erfahren.",
"Integer/Float": "Ganzzahl/Fließkomma",
"Integer and floats are defined as a base as `number` and has several sub-variants:": "Integer und Floats sind als Basis als `Number` definiert und haben mehrere Untervarianten:",
"Here the `id` of the user is a number at runtime, but is interpreted as an integer in the validation and serialization.": "Hier ist die \"ID\" des Benutzers zur Laufzeit eine Zahl, wird aber bei der Validierung und Serialisierung als Ganzzahl interpretiert.",
"This means that here, for example, no floats may be used in validation and the serializer automatically converts floats into integers.": "Das bedeutet, dass hier z.B. keine Fließkommazahlen in der Validierung verwendet werden dürfen und der Serialisierer automatisch Fließkommazahlen in Ganzzahlen umwandelt.",
"The subtypes can be used in the same way and are useful if a specific range of numbers is to be allowed.": "Die Subtypen können auf die gleiche Weise verwendet werden und sind nützlich, wenn ein bestimmter Zahlenbereich zugelassen werden soll.",
"Float": "Schwimmer",
"UUID": "UUID",
"UUID v4 is usually stored as a binary in the database and as a string in JSON.": "UUID v4 wird in der Regel als Binärwert in der Datenbank und als String in JSON gespeichert.",
"MongoID": "MongoID",
"Marks this field as ObjectId for MongoDB. Resolves as a string. Is stored in the MongoDB as binary.": "Markiert dieses Feld als ObjectId für MongoDB. Wird als String aufgelöst. Wird in der MongoDB als Binärdatei gespeichert.",
"Bigint": "Bigint",
"Per default the normal bigint type serializes as number in JSON (and long in BSON). This has however limitation in what is possible to save since bigint in JavaScript has an unlimited potential size, where numbers in JavaScript and long in BSON are limited. To bypass this limitation the types `BinaryBigInt` and `SignedBinaryBigInt` are available.": "Standardmäßig wird der normale bigint-Typ als Zahl in JSON (und long in BSON) serialisiert. Dies schränkt jedoch die Speichermöglichkeiten ein, da bigint in JavaScript eine unbegrenzte potenzielle Größe hat, während numbers in JavaScript und long in BSON begrenzt sind. Um diese Einschränkung zu umgehen, gibt es die Typen `BinaryBigInt` und `SignedBinaryBigInt`.",
"`BinaryBigInt` is the same as bigint but serializes to unsigned binary with unlimited size (instead of 8 bytes in most databases) in databases and string in JSON. Negative values will be converted to positive (`abs(x)`).": "BinaryBigInt\" ist dasselbe wie \"bigint\", wird aber in Datenbanken zu einem vorzeichenlosen Binärwert mit unbegrenzter Größe (anstelle von 8 Byte in den meisten Datenbanken) und in JSON zu einem String serialisiert. Negative Werte werden in positive umgewandelt (`abs(x)`).",
"Deepkit ORM stores BinaryBigInt as a binary field.": "Deepkit ORM speichert BinaryBigInt als binäres Feld.",
"`SignedBinaryBigInt` is the same as `BinaryBigInt` but is able to store negative values as well. Deepkit ORM stores `SignedBinaryBigInt` as binary. The binary has an additional leading sign byte and is represented as an uint: 255 for negative, 0 for zero, or 1 for positive.": "`SignedBinaryBigInt` ist dasselbe wie `BinaryBigInt`, kann aber auch negative Werte speichern. Deepkit ORM speichert `SignedBinaryBigInt` als Binärwert. Der Binärwert hat ein zusätzliches vorangestelltes Vorzeichenbyte und wird als uint dargestellt: 255 für negativ, 0 für Null oder 1 für positiv.",
"MapName": "Kartenname",
"To change the name of a property in the serialization.": "So ändern Sie den Namen einer Eigenschaft in der Serialisierung.",
"Group": "Gruppe",
"Properties can be grouped together. For serialization you can for example exclude a group from serialization. See the chapter Serialization for more information.": "Eigenschaften können in Gruppen zusammengefasst werden. Bei der Serialisierung können Sie z.B. eine Gruppe von der Serialisierung ausschließen. Weitere Informationen finden Sie im Kapitel Serialisierung.",
"Data": "Daten",
"Each property can add additional meta-data that can be read via the Reflection API. See xref:runtime-types.adoc#runtime-types-reflection[Runtime Types Reflection] for more information.": "Jede Eigenschaft kann zusätzliche Metadaten hinzufügen, die über die Reflection-API gelesen werden können. Weitere Informationen finden Sie unter xref:runtime-types.adoc#runtime-types-reflection[Runtime Types Reflection].",
"Excluded": "Ausgeschlossen",
"Each property can be excluded from the serialization process for a specific target.": "Jede Eigenschaft kann für ein bestimmtes Ziel vom Serialisierungsprozess ausgeschlossen werden.",
"Embedded": "Eingebettet",
"Marks the field as an embedded type.": "Markiert das Feld als eingebetteten Typ.",
"It's possible to change the prefix (which is per default the property name).": "Es ist möglich, das Präfix zu ändern (das standardmäßig der Eigenschaftsname ist).",
"Entity": "Entität",
"To annotate interfaces with entity information. Only used in the database context.": "Zum Annotieren von Schnittstellen mit Entitätsinformationen. Wird nur im Datenbankkontext verwendet.",
"InlineRuntimeType": "InlineRuntimeType",
"TODO": "TODO",
"ResetDecorator": "ResetDecorator",
"Database": "Datenbank",
"TODO: PrimaryKey, AutoIncrement, Reference, BackReference, Index, Unique, DatabaseField.": "TODO: PrimaryKey, AutoIncrement, Referenz, BackReference, Index, Unique, DatabaseField.",
"See xref:validation.adoc#validation-constraint-types[Validation Constraint Types].": "Siehe xref:validation.adoc#validation-constraint-types[Validation Constraint Types].",
"Custom Type Decorators": "Benutzerdefinierte Typendekorateure",
"aTypeDecoratorCanBeDefinedAsFollows": "aTypeDecoratorCanBeDefinedAsFollows",
"By convention, a type decorator is defined to be an object literal with a single optional property `__meta` that has a tuple as its type. The first entry in this tuple is its unique name and all subsequent tuple entries are arbitrary options. This allows a type decorator to be equipped with additional options.": "Konventionell ist ein Typdekorator als ein Objektliteral mit einer einzigen optionalen Eigenschaft `__meta` definiert, die ein Tupel als Typ hat. Der erste Eintrag in diesem Tupel ist sein eindeutiger Name und alle folgenden Tupel-Einträge sind beliebige Optionen. Damit kann ein Typdekorator mit zusätzlichen Optionen ausgestattet werden.",
"The type decorator is used with the intersection operator `&`. Any number of type decorators can be used on one type.": "Der Typdekorator wird mit dem Schnittpunktsoperator `&` verwendet. Eine beliebige Anzahl von Typdekoratoren kann für einen Typ verwendet werden.",
"The type decorators can be read out via the type objects of `typeOf<T>()` and `metaAnnotation`:": "Die Typdekoratoren können über die Typobjekte von `typeOf<T>()` und `metaAnnotation` ausgelesen werden:",
"The result in `annotation` is either an array with options if the type decorator `myAnnotation` was used or `undefined` if not. If the type decorator has additional options as seen in `AnnotationOption`, the passed values can be found in the array.": "Das Ergebnis in `Annotation` ist entweder ein Array mit Optionen, wenn der Typdekorator `myAnnotation` verwendet wurde oder `undefined` wenn nicht. Wenn der Typdekorator zusätzliche Optionen hat, wie in `AnnotationOption` zu sehen, können die übergebenen Werte in dem Array gefunden werden.",
"Already supplied type decorators like `MapName`, `Group`, `Data`, etc have their own annotation object:": "Bereits mitgelieferte Typdekoratoren wie `MapName`, `Group`, `Data`, usw. haben ihr eigenes Anmerkungsobjekt:",
"See xref:runtime-types.adoc#runtime-types-reflection[Runtime Types Reflection] to learn more.": "Siehe xref:runtime-types.adoc#runtime-types-reflection[Runtime Types Reflection] für weitere Informationen.",
"External Classes": "Externe Klassen",
"Since TypeScript does not include type information per default, imported types/classes from other packages (that did not use @deepkit/type-compiler) will not have type information available.": "Da TypeScript standardmäßig keine Typinformationen enthält, haben importierte Typen/Klassen aus anderen Paketen (die nicht @deepkit/type-compiler verwendet haben) keine Typinformationen zur Verfügung.",
"To annotate types for an external class, use `annotateClass` and make sure this function is executed in the bootstrap phase of your application before the imported class is used somewhere else.": "Um Typen für eine externe Klasse zu annotieren, verwenden Sie `annotateClass` und stellen Sie sicher, dass diese Funktion in der Bootstrap-Phase Ihrer Anwendung ausgeführt wird, bevor die importierte Klasse irgendwo anders verwendet wird.",
"`MyExternalClass` can now be used in serialization functions and in the reflection API.": "MyExternalClass\" kann jetzt in Serialisierungsfunktionen und in der Reflection-API verwendet werden.",
"To following shows how to annotate generic classes:": "Im Folgenden wird gezeigt, wie man generische Klassen annotiert:",
"Reflection": "Reflexion",
"To work directly with the type information itself, there are two basic variants: Type objects and Reflection classes. Reflection classes are discussed below. The function `typeOf` returns type objects, which are very simple object literals. It always contains a `kind` which is a number and gets its meaning from the enum `ReflectionKind`. `ReflectionKind` is defined in the `@deepkit/type` package as follows:": "Um direkt mit den Typinformationen selbst zu arbeiten, gibt es zwei grundlegende Varianten: Typobjekte und Reflektionsklassen. Reflection-Klassen werden weiter unten behandelt. Die Funktion `typeOf` gibt Typobjekte zurück, die sehr einfache Objektliterale sind. Sie enthält immer ein `kind`, das eine Zahl ist und seine Bedeutung aus dem enum `ReflectionKind` erhält. ReflectionKind\" ist im Paket \"@deepkit/type\" wie folgt definiert:",
"There are a number of possible type objects that can be returned. The simplest ones are `never`, `any`, `unknown`, `void, null,` and `undefined`, which are represented as follows:": "Es gibt eine Reihe von Objekten des Typs, die zurückgegeben werden können. Die einfachsten sind `nie`, `irgendwie`, `unbekannt`, `void, null` und `undefined`, die wie folgt dargestellt werden:",
"For example, number 0 is the first entry of the `ReflectionKind` enum, in this case `never`, number 1 is the second entry, here `any`, and so on. Accordingly, primitive types like `string`, `number`, `boolean` are represented as follows:": "Zum Beispiel ist die Nummer 0 der erste Eintrag der Aufzählung `ReflectionKind`, in diesem Fall `never`, Nummer 1 ist der zweite Eintrag, hier `any`, und so weiter. Dementsprechend werden primitive Typen wie `string`, `number`, `boolean` wie folgt dargestellt:",
"These rather simple types have no further information at the type object, because they were passed directly as type argument to `typeOf`. However, if types are passed via type aliases, additional information can be found at the type object.": "Diese eher einfachen Typen haben keine weiteren Informationen am Typobjekt, da sie direkt als Typargument an `typeOf` übergeben wurden. Wenn Typen jedoch über Typ-Aliase übergeben werden, können zusätzliche Informationen am Typ-Objekt gefunden werden.",
"In this case, the name of the type alias 'Title' is also available. If a type alias is a generic, the types passed will also be available at the type object.": "In diesem Fall ist auch der Name des Typ-Alias \"Titel\" verfügbar. Handelt es sich bei einem Typ-Alias um einen generischen Typ, so sind die übergebenen Typen auch am Typobjekt verfügbar.",
"If the type passed is the result of an index access operator, the container and the index type are present:": "Wenn der übergebene Typ das Ergebnis eines Indexzugriffsoperators ist, sind der Container und der Indextyp vorhanden:",
"Interfaces and object literals are both output as Reflection.objectLiteral and contain the properties and methods in the `types` array.": "Schnittstellen und Objektliterale werden beide als Reflection.objectLiteral ausgegeben und enthalten die Eigenschaften und Methoden im Array `types`.",
"Index signatures are also in the `types` array.": "Indexsignaturen befinden sich auch im Array `types`.",
"Classes are similar to object literals and also have their properties and methods under a `types` array in addition to `classType` which is a reference to the class itself.": "Klassen sind ähnlich wie Objektliterale und haben auch ihre Eigenschaften und Methoden unter einem `types`-Array, zusätzlich zu `classType`, das ein Verweis auf die Klasse selbst ist.",
"Note that the type of Reflection.propertySignature has changed to Reflection.property and Reflection.methodSignature has changed to Reflection.method. Since properties and methods on classes have additional attributes, this information can also be retrieved. The latter additionally include `visibility`, `abstract`, and `default`.": "Beachten Sie, dass sich der Typ von Reflection.propertySignature in Reflection.property und Reflection.methodSignature in Reflection.method geändert hat. Da Eigenschaften und Methoden von Klassen zusätzliche Attribute haben, können diese Informationen ebenfalls abgerufen werden. Zu den letzteren gehören zusätzlich \"Sichtbarkeit\", \"abstrakt\" und \"Standard\".",
"Type objects of classes contain only the properties and methods of the class itself and not of super-classes. This is contrary to type objects of interfacesobject-literals, which have all property signatures and method signatures of all parents resolved into `types`. To resolve the property and methods of the super-classes, either ReflectionClass and its `ReflectionClass.getProperties()` (see following sections) or `resolveTypeMembers()` of `@deepkit/type` can be used.": "Typobjekte von Klassen enthalten nur die Eigenschaften und Methoden der Klasse selbst und nicht die von Oberklassen. Dies steht im Gegensatz zu Typobjekten von Interface-Objekt-Literalen, die alle Eigenschaftssignaturen und Methodensignaturen aller Eltern in `Typen` aufgelöst haben. Um die Eigenschaften und Methoden der Superklassen aufzulösen, können entweder ReflectionClass und dessen `ReflectionClass.getProperties()` (siehe folgende Abschnitte) oder `resolveTypeMembers()` von `@deepkit/type` verwendet werden.",
"There is a whole plethora of type objects. For example for literal, template literals, promise, enum, union, array, tuple, and many more. To find out which ones all exist and what information is available, it is recommended to import `Type` from `@deepkit/type`. It is a `union` with all possible subtypes like TypeAny, TypeUnknonwn, TypeVoid, TypeString, TypeNumber, TypeObjectLiteral, TypeArray, TypeClass, and many more. There you can find the exact structure.": "Es gibt eine ganze Fülle von Typobjekten. Zum Beispiel für Literal, Template-Literale, Promise, Enum, Union, Array, Tupel und viele mehr. Um herauszufinden, welche Typen es gibt und welche Informationen verfügbar sind, empfiehlt es sich, `Type` aus `@deepkit/type` zu importieren. Es ist eine `Union` mit allen möglichen Untertypen wie TypeAny, TypeUnknonwn, TypeVoid, TypeString, TypeNumber, TypeObjectLiteral, TypeArray, TypeClass, und vielen mehr. Dort können Sie die genaue Struktur finden.",
"Type Cache": "Typ Cache",
"Type objects are cached for type aliases, functions, and classes as soon as no generic argument is passed. This means that a call to `typeOf<MyClass>()` always returns the same object.": "Typobjekte werden für Typ-Aliase, Funktionen und Klassen zwischengespeichert, sobald kein generisches Argument übergeben wird. Das bedeutet, dass ein Aufruf von `typeOf<MyClass>()` immer das gleiche Objekt zurückgibt.",
"However, as soon as a generic type is used, new objects are always created, even if the type passed is always the same. This is because an infinite number of combinations are theoretically possible and such a cache would effectively be a memory leak.": "Sobald jedoch ein generischer Typ verwendet wird, werden immer neue Objekte erstellt, auch wenn der übergebene Typ immer derselbe ist. Dies liegt daran, dass theoretisch unendlich viele Kombinationen möglich sind und ein solcher Cache praktisch ein Speicherleck wäre.",
"However, as soon as a type is instantiated multiple times in a recursive type, it is cached. However, the duration of the cache is limited only to the moment the type is computed and does not exist thereafter. Also, although the Type object is cached, a new reference is returned and is not the exact same object.": "Sobald ein Typ jedoch mehrfach in einem rekursiven Typ instanziiert wird, wird er zwischengespeichert. Die Dauer des Zwischenspeichers ist jedoch nur auf den Moment der Berechnung des Typs beschränkt und existiert danach nicht mehr. Auch wenn das Type-Objekt zwischengespeichert wird, wird eine neue Referenz zurückgegeben, die nicht genau dasselbe Objekt ist.",
"`MyType<string>` is cached as long as `Object` is computed. The PropertySignature of `a` and `b` thus have the same `type` from the cache, but are not the same Type object.": "MyType<string>\" wird zwischengespeichert, solange \"Object\" berechnet wird. Die PropertySignature von `a` und `b` haben also denselben `Type` aus dem Cache, sind aber nicht dasselbe Type-Objekt.",
"All non-root Type objects have a parent property, which usually points to the enclosing parent. This is valuable, for example, to find out whether a Type is part of a union or not.": "Alle Nicht-Wurzel-Type-Objekte haben eine Parent-Eigenschaft, die in der Regel auf den umschließenden Parent verweist. Dies ist z. B. nützlich, um herauszufinden, ob ein Typ Teil einer Vereinigung ist oder nicht.",
"'Ref 1' points to the actual union type object.": "Ref 1' verweist auf das eigentliche Objekt vom Typ Union.",
"For cached Type objects as exemplified above, the `parent` properties are not always the real parents. For example, for a class that is used multiple times, although immediate types in `types` (TypePropertySignature and TypeMethodSignature) point to the correct TypeClass, the `type` of these signature types point to the signature types of the TypeClass of the cached entry. This is important to know so as not to infinitely read the parent structure, but only the immediate parent. The fact that the parent does not have infinite precision is due to performance reasons.": "Bei zwischengespeicherten Type-Objekten, wie oben beschrieben, sind die \"Parent\"-Eigenschaften nicht immer die wirklichen Eltern. Zum Beispiel verweisen bei einer Klasse, die mehrfach verwendet wird, die unmittelbaren Typen in `types` (TypePropertySignature und TypeMethodSignature) zwar auf die richtige TypeClass, aber der `type` dieser Signaturtypen verweist auf die Signaturtypen der TypeClass des gecachten Eintrags. Dies ist wichtig zu wissen, um nicht endlos die übergeordnete Struktur zu lesen, sondern nur die unmittelbar übergeordnete. Die Tatsache, dass die übergeordnete Struktur nicht unendlich genau ist, hat mit der Leistung zu tun.",
"JIT Cache": "JIT-Cache",
"In the further course some functions and features are described, which are often based on the type objects. To implement some of them in a performant way, a JIT (just in time) cache per type object is needed. This can be provided via `getJitContainer(type)`. This function returns a simple object on which arbitrary data can be stored. As long as no reference to the object is held, it will be deleted automatically by the GC as soon as the Type object itself is also no longer referenced.": "Im weiteren Verlauf werden einige Funktionen und Features beschrieben, die oft auf den Typobjekten basieren. Um einige von ihnen performant zu implementieren, wird ein JIT (just in time) Cache pro Typobjekt benötigt. Dieser kann über `getJitContainer(type)` bereitgestellt werden. Diese Funktion gibt ein einfaches Objekt zurück, in dem beliebige Daten gespeichert werden können. Solange kein Verweis auf das Objekt gehalten wird, wird es automatisch von der GC gelöscht, sobald auch das Type-Objekt selbst nicht mehr referenziert wird.",
"Reflection-Klassen": "Reflexions-Klassen",
"In addition to the `typeOf<>()` function, there are various reflection classes that provide an OOP alternative to the Type objects. The reflection classes are only available for classes, InterfaceObject literals and functions and their direct sub-types (Properties, Methods, Parameters). All deeper types must be read again with the Type objects.": "Zusätzlich zur Funktion `typeOf<>()` gibt es verschiedene Reflection-Klassen, die eine OOP-Alternative zu den Type-Objekten darstellen. Die Reflection-Klassen sind nur für Klassen, InterfaceObject-Literale und Funktionen und deren direkte Untertypen (Properties, Methods, Parameters) verfügbar. Alle tieferen Typen müssen mit den Type-Objekten neu eingelesen werden.",
"Receive type information": "Informationen zur Art des Empfangs",
"In order to provide functions that operate on types, it can be useful to offer the user to pass a type manually. For example, in a validation function, it might be useful to provide the type to be requested as the first type argument and the data to be validated as the first function argument.": "Um Funktionen bereitzustellen, die mit Typen arbeiten, kann es sinnvoll sein, dem Benutzer die Möglichkeit zu geben, einen Typ manuell zu übergeben. In einer Validierungsfunktion könnte es beispielsweise sinnvoll sein, den anzufordernden Typ als erstes Typargument und die zu validierenden Daten als erstes Funktionsargument anzugeben.",
"In order for this function to get the type `string`, it must tell this to the type compiler.": "Damit diese Funktion den Typ `String` erhält, muss sie dies dem Typ-Compiler mitteilen.",
"`ReceiveType` with the reference to the first type arguments `T` signals the type compiler that each call to `validate` should put the type in second place (since `type` is declared in second place). To then read out the information at runtime, the `resolveReceiveType` function is used.": "`ReceiveType` mit dem Verweis auf das erste Typ-Argument `T` signalisiert dem Typ-Compiler, dass jeder Aufruf von `validate` den Typ an zweiter Stelle setzen soll (da `type` an zweiter Stelle deklariert ist). Um die Information dann zur Laufzeit auszulesen, wird die Funktion `resolveReceiveType` verwendet.",
"It is useful to assign the result to the same variable to avoid creating a new one unnecessarily. In `type` now either a type object is stored or an error is thrown, if for example no type argument was passed, Deepkit's type compiler was not installed correctly, or the emitting of type information is not activated (see the section Installation above).": "Es ist sinnvoll, das Ergebnis der gleichen Variable zuzuweisen, um nicht unnötig eine neue Variable zu erzeugen. In `type` wird nun entweder ein Typobjekt gespeichert oder es wird ein Fehler ausgelöst, wenn z.B. kein Typargument übergeben wurde, der Typcompiler von Deepkit nicht korrekt installiert wurde oder die Ausgabe von Typinformationen nicht aktiviert ist (siehe den Abschnitt Installation oben).",
"Bytecode": "Bytecode",
"To learn in detail how Deepkit encodes and reads the type information in JavaScript, this chapter is intended. It explains how the types are actually converted into bytecode, emitted in JavaScript, and then interpreted at runtime.": "Um im Detail zu erfahren, wie Deepkit die Typinformationen in JavaScript kodiert und liest, ist dieses Kapitel gedacht. Es erklärt, wie die Typen tatsächlich in Bytecode umgewandelt, in JavaScript ausgegeben und dann zur Laufzeit interpretiert werden.",
"Typen-Compiler": "Typen-Compiler",
"The type compiler (in @deepkit/type-compiler) is responsible for reading the defined types in the TypeScript files and compiling them into a bytecode. This bytecode has everything needed to execute the types in runtime.": "Der Type-Compiler (in @deepkit/type-compiler) ist dafür verantwortlich, die definierten Typen in den TypeScript-Dateien zu lesen und sie in einen Bytecode zu kompilieren. Dieser Bytecode enthält alles, was zur Ausführung der Typen zur Laufzeit benötigt wird.",
"At the time of this writing, the type compiler is a so-called TypeScript transformer. This transformer is a plugin for the TypeScript compiler itself and converts a TypeScript AST (Abstract Syntax Tree) into another TypeScript AST. Deepkit's type compiler reads the AST in this process, produces the corresponding bytecode, and inserts it into the AST.": "Zum Zeitpunkt der Erstellung dieses Artikels ist der Type-Compiler ein sogenannter TypeScript-Transformer. Dieser Transformator ist ein Plugin für den TypeScript-Compiler selbst und konvertiert einen TypeScript AST (Abstract Syntax Tree) in einen anderen TypeScript AST. Der Type-Compiler von Deepkit liest dabei den AST ein, erzeugt den entsprechenden Bytecode und fügt ihn in den AST ein.",
"TypeScript itself does not allow you to configure this plugin aka transformer via a tsconfig.json. It is either necessary to use the TypeScript compiler API directly, or a build system like Webpack with `ts-loader`. To save this inconvenient way for Deepkit users, the Deepkit type compiler automatically installs itself in `node_modulestypescript` whenever `@deepkit/type-compiler` is installed. This makes it possible for all build tools that access the locally installed TypeScript (the one in `node_modulestypescript`) to automatically have the type compiler enabled. This makes tsc, Angular, webpack, ts-node, and some other tools work automatically with Deepkit's type compiler.": "TypeScript selbst erlaubt es nicht, dieses Plugin aka Transformer über eine tsconfig.json zu konfigurieren. Es ist entweder notwendig, die TypeScript-Compiler-API direkt zu verwenden, oder ein Build-System wie Webpack mit `ts-loader`. Um Deepkit-Nutzern diesen umständlichen Weg zu ersparen, installiert sich der Deepkit-Type-Compiler automatisch in `node_modulestypescript`, wenn `@deepkit/type-compiler` installiert wird. Dies ermöglicht es allen Build-Tools, die auf das lokal installierte TypeScript (das in `node_modulestypescript`) zugreifen, den Type-Compiler automatisch zu aktivieren. Dadurch arbeiten tsc, Angular, webpack, ts-node und einige andere Tools automatisch mit dem Type-Compiler von Deepkit.",
"If automatic running of NPM install scripts is not enabled and thus the locally installed typescript is not modified, this process must be run manually if you want to. Alternatively, the types compiler can be used manually in a build tool such as webpack. See the Installation section above.": "Wenn die automatische Ausführung von NPM-Installationsskripten nicht aktiviert ist und somit das lokal installierte Typescript nicht geändert wird, muss dieser Prozess manuell ausgeführt werden, wenn Sie dies wünschen. Alternativ kann der Types-Compiler auch manuell in einem Build-Tool wie Webpack verwendet werden. Siehe den Abschnitt Installation oben.",
"Bytecode Encoding": "Bytecode-Kodierung",
"The bytecode is a sequence of commands for a virtual machine and is encoded in the JavaScript itself as an array of references and string (the actual bytecode).": "Der Bytecode ist eine Folge von Befehlen für eine virtuelle Maschine und wird im JavaScript selbst als Array von Referenzen und String (dem eigentlichen Bytecode) kodiert.",
"The existing commands themselves are each one byte in size and can be found in `@deepkit/type-spec` as `ReflectionOp` enums. At the time of this writing, the command set is over 81 commands in size.": "Die vorhandenen Befehle selbst sind jeweils ein Byte groß und können in `@deepkit/type-spec` als `ReflectionOp`-Enums gefunden werden. Zum Zeitpunkt der Erstellung dieses Artikels umfasst der Befehlssatz über 81 Befehle.",
"A sequence of commands is encoded as a string to save memory. So a type `string[]` is conceptualized as a bytecode program `[string, array]` which has the bytes `[5, 37]` and encoded with the following algorithm:": "Eine Folge von Befehlen wird als String kodiert, um Speicherplatz zu sparen. So wird ein Typ \"String[]\" als ein Bytecode-Programm \"String, Array\" konzipiert, das die Bytes \"5, 37\" hat und mit dem folgenden Algorithmus kodiert wird:",
"Accordingly, a 5 becomes an `&` character and a 37 becomes an `F` character. Together they become `&F` and are emitted in Javascript as `['&F']`.": "Dementsprechend wird eine 5 zu einem \"&\"-Zeichen und eine 37 zu einem \"F\"-Zeichen. Zusammen werden sie zu `&F` und werden in Javascript als `['&F']` ausgegeben.",
"To prevent naming conflicts, each type is given a \"_Ω\" prefix. For each explicitly defined type that is exported or used by an exported type, a bytecode is emitted the JavaScript. Classes and functions also receive a bytecode directly as a property.": "Um Namenskonflikte zu vermeiden, wird jeder Typ mit einem \"_Ω\"-Präfix versehen. Für jeden explizit definierten Typ, der exportiert oder von einem exportierten Typ verwendet wird, wird ein Bytecode in JavaScript ausgegeben. Auch Klassen und Funktionen erhalten einen Bytecode direkt als Eigenschaft.",
"Virtual Machine": "Virtuelle Maschine",
"A virtual machine (in `@deepkit/type` the class Processor) at runtime is responsible for decoding and executing the encoded bytecode. It always returns a type object, see the Reflection section above.": "Eine virtuelle Maschine (in `@deepkit/type` die Klasse Processor) ist zur Laufzeit für die Dekodierung und Ausführung des kodierten Bytecodes verantwortlich. Sie gibt immer ein Typobjekt zurück, siehe den Abschnitt \"Reflexion\" weiter oben.",
"Validation is the process of checking data for correctness. Correctness is given if the type is the correct one and additional defined constraints are fulfilled. Deepkit generally distinguishes between type validation and the validation of additional constraints.": "Bei der Validierung werden die Daten auf ihre Korrektheit geprüft. Die Korrektheit ist gegeben, wenn der Typ der richtige ist und zusätzlich definierte Constraints erfüllt sind. Deepkit unterscheidet generell zwischen der Typvalidierung und der Validierung von zusätzlichen Constraints.",
"Validation is used whenever data comes from a source that is considered uncertain. Uncertain means that no guaranteed assumptions can be made about the types or contents of the data, and thus the data could have literally any value at runtime.": "Die Validierung wird immer dann eingesetzt, wenn die Daten aus einer Quelle stammen, die als unsicher gilt. Ungewiss bedeutet, dass keine garantierten Annahmen über die Typen oder den Inhalt der Daten gemacht werden können und die Daten daher zur Laufzeit buchstäblich jeden Wert haben können.",
"For example, data from user input is generally not considered secure. Data from an HTTP request (query parameter, body), CLI arguments, or a read-in file must be validated. If a variable is declared as a number, there must also be a number in it, otherwise the program may crash or a security hole may occur.": "So werden beispielsweise Daten aus Benutzereingaben im Allgemeinen nicht als sicher angesehen. Daten aus einer HTTP-Anfrage (Abfrageparameter, Body), CLI-Argumente oder eine eingelesene Datei müssen validiert werden. Wenn eine Variable als Zahl deklariert ist, muss sie auch eine Zahl enthalten, sonst kann das Programm abstürzen oder eine Sicherheitslücke entstehen.",
"In a controller of an HTTP route, for example, the top priority is to check every user input (query parameter, body). Especially in the TypeScript environment, it is important not to use type casts, as they are fundamentally insecure.": "In einem Controller einer HTTP-Route ist es zum Beispiel oberste Priorität, jede Benutzereingabe (Query-Parameter, Body) zu prüfen. Gerade im TypeScript-Umfeld ist es wichtig, keine Typecasts zu verwenden, da diese grundsätzlich unsicher sind.",
"This often seen code is a bug that can lead to a program crash or a security vulnerability because a type cast `as number` was used that does not provide any security at runtime. The user can simply pass a string as `limit` and the program would then work with a string in `limit`, although the code is based on the fact that it must be a number. To maintain this security at runtime there are validators and type guards. Also, a serializer could be used to convert `limit` to a number. More information about this can be found in xref:serialization.adoc[Serialization].": "Dieser häufig anzutreffende Code ist ein Fehler, der zu einem Programmabsturz oder einer Sicherheitslücke führen kann, weil ein Typ-Cast `als Zahl` verwendet wurde, der zur Laufzeit keine Sicherheit bietet. Der Benutzer kann einfach eine Zeichenkette als `Limit` übergeben und das Programm würde dann mit einer Zeichenkette in `Limit` arbeiten, obwohl der Code auf der Tatsache basiert, dass es eine Zahl sein muss. Um diese Sicherheit zur Laufzeit aufrechtzuerhalten, gibt es Validatoren und Type Guards. Außerdem könnte ein Serialisierer verwendet werden, um `limit` in eine Zahl zu konvertieren. Weitere Informationen hierzu finden Sie in xref:serialization.adoc[Serialization].",
"Validation is an essential part of any application and it is better to use it once too often than once too little. Deepkit provides many validation options and has a high-performance implementation, so in most cases there is no need to worry about execution time. Use as much validation as possible, in case of doubt once more, to be on the safe side.": "Validierung ist ein wesentlicher Bestandteil jeder Anwendung und es ist besser, sie einmal zu oft als einmal zu wenig zu verwenden. Deepkit bietet viele Validierungsoptionen und hat eine leistungsstarke Implementierung, so dass man sich in den meisten Fällen keine Sorgen um die Ausführungszeit machen muss. Verwenden Sie so viel Validierung wie möglich, um im Zweifelsfall auf der sicheren Seite zu sein.",
"In doing so, many components of Deepkit such as the HTTP router, the RPC abstraction, but also the database abstraction itself have validation built in and is performed automatically, so in many cases it is not necessary to do this manually.": "Dabei haben viele Komponenten von Deepkit wie der HTTP-Router, die RPC-Abstraktion, aber auch die Datenbankabstraktion selbst eine Validierung eingebaut, die automatisch durchgeführt wird, so dass es in vielen Fällen nicht notwendig ist, dies manuell zu tun.",
"In the corresponding chapters (xref:cli.adoc[CLI], xref:http.adoc[HTTP], xref:rpc.adoc[RPC], xref:database.adoc[Database]) it is explained in detail when a validation happens automatically. Make sure that you know where restrictions or types have to be defined and don't use `any` to make these validations work well and safely automatically. This can save you a lot of manual work to keep the code clean and safe.": "In den entsprechenden Kapiteln (xref:cli.adoc[CLI], xref:http.adoc[HTTP], xref:rpc.adoc[RPC], xref:database.adoc[Database]) wird ausführlich erklärt, wann eine Validierung automatisch erfolgt. Stellen Sie sicher, dass Sie wissen, wo Einschränkungen oder Typen definiert werden müssen und verwenden Sie nicht `any`, damit diese Validierungen gut und sicher automatisch funktionieren. Dies kann Ihnen eine Menge manueller Arbeit ersparen, um den Code sauber und sicher zu halten.",
"Use": "Verwenden Sie",
"The basic function of the validator is to check a value for its type. For example, whether a value is a string. This is not about what the string contains, but only about its type. There are many types in Typescript: string, number, boolean, bigint, objects, classes, interface, generics, mapped types, and many more. Due to Typescript’s powerful type system, a large variety of different types are available.": "Die Grundfunktion des Validators besteht darin, einen Wert auf seinen Typ zu prüfen. Zum Beispiel, ob ein Wert eine Zeichenkette ist. Dabei geht es nicht darum, was der String enthält, sondern nur um seinen Typ. In Typescript gibt es viele Typen: String, Number, Boolean, Bigint, Objekte, Klassen, Schnittstellen, Generics, Mapped Types und viele mehr. Dank des leistungsfähigen Typensystems von Typescript steht eine große Anzahl verschiedener Typen zur Verfügung.",
"In JavaScript itself, primitive types can be parsed with the `typeof` operator. For more complex types like interfaces, mapped types, or generic set/map this is not so easy anymore and a validator library like `@deepkit/type` becomes necessary. Deepkit is the only solution that allows to validate all TypesScript types directly without any detours.": "In JavaScript selbst können primitive Typen mit dem Operator `typeof` geparst werden. Für komplexere Typen wie Schnittstellen, gemappte Typen oder generische Sets/Maps ist dies nicht mehr so einfach und eine Validierungsbibliothek wie `@deepkit/type` wird notwendig. Deepkit ist die einzige Lösung, die es erlaubt, alle TypesScript-Typen direkt und ohne Umwege zu validieren.",
"In Deepkit, type validation can be done using either the `validate`, `is`, or `assert` function.": "In Deepkit kann die Typprüfung entweder mit der Funktion `validate`, `is` oder `assert` durchgeführt werden.",
"The function `is` is a so-called type guard and `assert` is a type assertion. Both will be explained in the next section.": "Die Funktion `ist` ist ein so genannter Type Guard und `assert` ist eine Type Assertion. Beide werden im nächsten Abschnitt erklärt.",
"The function `validate` returns an array of found errors and on success an empty array. Each entry in this array describes the exact error code and the error message as well as the path when more complex types like objects or arrays are validated.": "Die Funktion `validate` gibt ein Array der gefundenen Fehler und bei Erfolg ein leeres Array zurück. Jeder Eintrag in diesem Array beschreibt den genauen Fehlercode und die Fehlermeldung sowie den Pfad, wenn komplexere Typen wie Objekte oder Arrays validiert werden.",
"All three functions are used in roughly the same way. The type is specified or referenced as the first type argument and the data is passed as the first function argument.": "Alle drei Funktionen werden in etwa auf die gleiche Weise verwendet. Der Typ wird als erstes Typargument angegeben oder referenziert und die Daten werden als erstes Funktionsargument übergeben.",
"If you work with more complex types like classes or interfaces, the array can also contain several entries.": "Wenn Sie mit komplexeren Typen wie Klassen oder Schnittstellen arbeiten, kann das Array auch mehrere Einträge enthalten.",
"The validator also supports deep recursive types. Paths are then separated with a dot.": "Der Validator unterstützt auch tief rekursive Typen. Pfade werden dann mit einem Punkt getrennt.",
"Take advantage of the benefits that TypeScript offers you. For example, more complex types like a `user` can be reused in multiple places without having to declare it again and again. For example, if a `user` is to be validated without its `id`, TypeScript utitilies can be used to quickly and efficiently create derived subtypes. Very much in the spirit of DRY (Don't Repeat Yourself).": "Nutzen Sie die Vorteile, die TypeScript Ihnen bietet. Zum Beispiel können komplexere Typen wie ein \"user\" an mehreren Stellen wiederverwendet werden, ohne ihn immer wieder deklarieren zu müssen. Wenn beispielsweise ein \"Benutzer\" ohne seine \"ID\" validiert werden soll, können TypeScript-Utilities verwendet werden, um schnell und effizient abgeleitete Subtypen zu erstellen. Ganz im Sinne von DRY (Don't Repeat Yourself).",
"Deepkit is the only major framework that has the ability to access TypeScripts types in this way at runtime. If you want to use types in frontend and backend, types can be swapped out to a separate file and thus imported anywhere. Use this option to your advantage to keep the code efficient and clean.": "Deepkit ist das einzige große Framework, das auf diese Weise zur Laufzeit auf TypeScripts-Typen zugreifen kann. Wenn Sie Typen im Frontend und Backend verwenden wollen, können Typen in eine separate Datei ausgelagert und somit überall importiert werden. Nutzen Sie diese Möglichkeit zu Ihrem Vorteil, um den Code effizient und sauber zu halten.",
"A type cast (contrary to type guard) in TypeScript is not a construct at runtime, but is only handled in the type system itself. It is not a safe way to assign a type to unknown data.": "Ein type cast (im Gegensatz zu type guard) ist in TypeScript kein Konstrukt zur Laufzeit, sondern wird nur im Typsystem selbst behandelt. Es ist kein sicherer Weg, unbekannten Daten einen Typ zuzuweisen.",
"The `as string` code is not safe. The variable `data` could have literally any value, for example `{username: 123}`, or even `{}`, and would have the consequence that `username` is not a string, but something completely different and therefore the code `username.startsWith('@')` will lead to an error, so that in the worst case the program crashes. To guarantee at runtime that `data` here has a property `username` with the type string, type-guards must be used.": "Der \"as string\"-Code ist nicht sicher. Die Variable `data` könnte buchstäblich jeden Wert haben, z.B. `{Benutzername: 123}`, oder sogar `{}`, und hätte zur Folge, dass `Benutzername` kein String ist, sondern etwas völlig anderes und daher der Code `username.startsWith('@')` zu einem Fehler führt, so dass im schlimmsten Fall das Programm abstürzt. Um zur Laufzeit zu garantieren, dass `data` hier eine Eigenschaft `username` mit dem Typ string hat, müssen type-guards verwendet werden.",
"Type guards are functions that give TypeScript a hint about what type the passed data is guaranteed to have at runtime. Armed with this knowledge, TypeScript then \"narrows\" the type as the code progresses. For example, `any` can be made into a string, or any other type in a safe way. So if there is data of which the type is not known (`any` or `unknown`), a type guard helps to narrow it down more precisely based on the data itself. However, the type guard is only as safe as its implementation. If you make a mistake, this can have severe consequences, because fundamental assumptions suddenly turn out to be untrue.": "Type Guards sind Funktionen, die TypeScript einen Hinweis darauf geben, welchen Typ die übergebenen Daten zur Laufzeit garantiert haben werden. Mit diesem Wissen ausgestattet, grenzt TypeScript dann den Typ im weiteren Verlauf des Codes ein. Zum Beispiel kann \"any\" in einen String oder einen anderen Typ auf sichere Weise umgewandelt werden. Wenn es also Daten gibt, deren Typ nicht bekannt ist (`any` oder `unknown`), hilft ein Type Guard bei der genaueren Eingrenzung auf Basis der Daten selbst. Der Type Guard ist jedoch nur so sicher wie seine Implementierung. Wenn Sie einen Fehler machen, kann dies schwerwiegende Folgen haben, weil sich grundlegende Annahmen plötzlich als unwahr erweisen.",
"Type-Guard": "Typ-Guard",
"A type guard on the above used type `User` could look in simplest form as follows. Note that the above explained special features with NaN are not part here and thus this type guard is not quite correct.": "Ein Type Guard für den oben verwendeten Typ `User` könnte in einfachster Form wie folgt aussehen. Beachten Sie, dass die oben erläuterten Besonderheiten bei NaN hier nicht zum Tragen kommen und somit dieser Type Guard nicht ganz korrekt ist.",
"A type guard always returns a Boolean and is usually used directly in an If operation.": "Ein Type Guard gibt immer einen Booleschen Wert zurück und wird normalerweise direkt in einer If-Operation verwendet.",
"Writing a separate function for each type guard, especially for more complex types, and then adapting it every time a type changes is extremely tedious, error-prone, and not efficient. Therefore, Deepkit provides the function `is`, which automatically provides a Type-Guard for any TypeScript type. This then also automatically takes into account special features such as the above-mentioned problem with NaN. The function `is` does the same as `validate`, but instead of an array of errors it simply returns a boolean.": "Für jeden Type-Guard eine eigene Funktion zu schreiben, insbesondere für komplexere Typen, und diese dann bei jeder Typänderung anzupassen, ist extrem mühsam, fehleranfällig und nicht effizient. Deshalb bietet Deepkit die Funktion `is`, die automatisch einen Type-Guard für jeden TypeScript-Typ bereitstellt. Dieser berücksichtigt dann auch automatisch Besonderheiten wie das oben erwähnte Problem mit NaN. Die Funktion `is` macht das Gleiche wie `validate`, aber statt eines Arrays von Fehlern gibt sie einfach einen Boolean zurück.",
"A pattern that can be found more often is to return an error directly in case of incorrect validation, so that subsequent code is not executed. This can be used in various places without changing the complete flow of the code.": "Ein häufiger anzutreffendes Muster besteht darin, bei einer fehlerhaften Validierung direkt einen Fehler zurückzugeben, so dass der nachfolgende Code nicht ausgeführt wird. Dies kann an verschiedenen Stellen eingesetzt werden, ohne den gesamten Codefluss zu verändern.",
"Alternatively, a TypeScript type assertion can be used. The `assert` function automatically throws an error if the given data does not validate correctly to a type. The special signature of the function, which distinguishes TypeScript type assertions, helps TypeScript to automatically narrow the passed variable.": "Alternativ kann auch eine TypeScript-Typ-Assertion verwendet werden. Die Funktion `assert` löst automatisch einen Fehler aus, wenn die übergebenen Daten nicht korrekt auf einen Typ validiert werden können. Die spezielle Signatur der Funktion, die TypeScript Type Assertions auszeichnet, hilft TypeScript, die übergebene Variable automatisch einzugrenzen.",
"Here, too, take advantage of the benefits that TypeScript offers you. Types can be reused or customized using various TypeScript functions.": "Nutzen Sie auch hier die Vorteile, die Ihnen TypeScript bietet. Typen können mit verschiedenen TypeScript-Funktionen wiederverwendet oder angepasst werden.",
"Error Reporting": "Fehlerberichterstattung",
"The functions `is`, `assert` and `validates` return a boolean as result. To get exact information about failed validation rules, the `validate` function can be used. It returns an empty array if everything was validated successfully. In case of errors the array will contain one or more entries with the following structure:": "Die Funktionen `is`, `assert` und `validates` geben als Ergebnis einen boolschen Wert zurück. Um genaue Informationen über fehlgeschlagene Überprüfungsregeln zu erhalten, kann die Funktion `validate` verwendet werden. Sie gibt ein leeres Array zurück, wenn alles erfolgreich validiert wurde. Im Falle von Fehlern enthält das Array einen oder mehrere Einträge mit der folgenden Struktur:",
"The function receives as first type argument any TypeScript type and as first argument the data to validate.": "Die Funktion erhält als erstes Typ-Argument einen beliebigen TypeScript-Typ und als erstes Argument die zu validierenden Daten.",
"Complex types such as interfaces, classes, or generics can also be used.": "Komplexe Typen wie Schnittstellen, Klassen oder Generika können ebenfalls verwendet werden.",
"Constraints": "Zwänge",
"In addition to checking the types, other arbitrary constraints can be added to a type. The validation of these additional content constraints is done automatically after the types themselves have been validated. This is done in all validation functions like `validate`, `is`, and `assert`.": "Zusätzlich zur Überprüfung der Typen können weitere beliebige Einschränkungen zu einem Typ hinzugefügt werden. Die Validierung dieser zusätzlichen inhaltlichen Einschränkungen erfolgt automatisch, nachdem die Typen selbst validiert wurden. Dies geschieht in allen Validierungsfunktionen wie `validate`, `is` und `assert`.",
"A restriction can be, for example, that a string must have a certain minimum or maximum length. These restrictions are added to the actual types via the type decorators. There is a whole variety of decorators that can be used. Own decorators can be defined and used at will in case of extended needs.": "Eine Einschränkung kann z. B. sein, dass eine Zeichenkette eine bestimmte Mindest- oder Höchstlänge haben muss. Diese Einschränkungen werden den eigentlichen Typen über die Typdekoratoren hinzugefügt. Es gibt eine ganze Reihe von Dekoratoren, die verwendet werden können. Eigene Dekoratoren können definiert und nach Belieben verwendet werden, wenn ein erweiterter Bedarf besteht.",
"With `&` any number of type decorators can be added to the actual type. The result, here `username`, can then be used in all validation functions but also in other types.": "Mit `&` kann eine beliebige Anzahl von Typdekoratoren zum eigentlichen Typ hinzugefügt werden. Das Ergebnis, hier `username`, kann dann in allen Validierungsfunktionen, aber auch in anderen Typen verwendet werden.",
"The function `validate` gives useful error messages coming from the constraints.": "Die Funktion `validate` liefert nützliche Fehlermeldungen aus den Constraints.",
"This information can be represented for example wonderfully also at a form automatically and be translated by means of the `code`. Through the existing path for objects and arrays, fields in a form can filter out and display the appropriate error.": "Diese Informationen können z.B. wunderbar auch in einem Formular automatisch dargestellt und mittels des `Codes` übersetzt werden. Durch den vorhandenen Pfad für Objekte und Arrays können Felder in einem Formular herausgefiltert und der entsprechende Fehler angezeigt werden.",
"An often useful use case is also to define an email with a RegExp constraint. Once the type is defined, it can be used anywhere.": "Ein oft nützlicher Anwendungsfall ist auch die Definition einer E-Mail mit einer RegExp-Beschränkung. Sobald der Typ definiert ist, kann er überall verwendet werden.",
"Any number of constraints can be added.": "Es kann eine beliebige Anzahl von Beschränkungen hinzugefügt werden.",
"Constraint Types": "Einschränkungstypen",
"Validate<typeof myValidator>": "Validate<typeof myValidator>",
"Validation using a custom validator function. See next section Custom Validator for more information.": "Validierung mit einer benutzerdefinierten Validator-Funktion. Weitere Informationen finden Sie im nächsten Abschnitt Benutzerdefinierter Validator.",
"Pattern<typeof myRegexp>": "Pattern<typeof myRegexp>",
"Defines a regular expression as validation pattern. Usually used for E-Mail validation or more complex content validation.": "Definiert einen regulären Ausdruck als Überprüfungsmuster. Wird in der Regel für die E-Mail-Validierung oder eine komplexere Inhaltsvalidierung verwendet.",
"Alpha": "Alpha",
"Validation for alpha characters (a-Z).": "Validierung für Alpha-Zeichen (a-Z).",
"Alphanumeric": "Alphanumerisch",
"Validation for alpha and numeric characters.": "Validierung für Alpha- und numerische Zeichen.",
"Ascii": "Ascii",
"Validation for ASCII characters.": "Validierung für ASCII-Zeichen.",
"Decimal<number, number>": "Dezimal<zahl, zahl>",
"Validation for string represents a decimal number, such as 0.1, .3, 1.1, 1.00003, 4.0, etc.": "Die Validierung für die Zeichenkette stellt eine Dezimalzahl dar, z. B. 0,1, .3, 1,1, 1,00003, 4,0 usw.",
"MultipleOf<number>": "MultipleOf<number>",
"Validation of numbers that are a multiple of given number.": "Validierung von Zahlen, die ein Vielfaches einer bestimmten Zahl sind.",
"MinLength<number>, MaxLength<number>": "MinLength<number>, MaxLength<number>",
"Validation for min/max length for arrays or strings.": "Validierung der minimalen/maximalen Länge für Arrays oder Strings.",
"Includes<'any'> Excludes<'any'>": "Beinhaltet<'jede'> Schließt<'jede'> aus;",
"Validation for an array item or sub string being included/excluded": "Validierung für ein Array-Element oder eine Teilzeichenkette, die eingeschlossen/ausgeschlossen wird",
"Minimum<number>, Maximum<number>": "Minimum<Zahl>, Maximum<Zahl>",
"Validation for a value being minimum or maximum given number. Same as `>=` and `<=`.": "Überprüfung, ob ein Wert das Minimum oder Maximum einer bestimmten Zahl ist. Dasselbe wie `>=` und `<=`.",
"ExclusiveMinimum<number>, ExclusiveMaximum<number>": "ExclusiveMinimum<number>, ExclusiveMaximum<number>",
"Same as minimum/maximum but excludes the value itself. Same as `>` and `<`.": "Dasselbe wie Minimum/Maximum, aber ohne den Wert selbst. Dasselbe wie `>` und `<`.",
"Positive, Negative, PositiveNoZero, NegativeNoZero": "Positiv, Negativ, PositivNichtNull, NegativNichtNull",
"Validation for a value being positive or negative.": "Überprüfung, ob ein Wert positiv oder negativ ist.",
"BeforeNow, AfterNow": "VorherJetzt, NachherJetzt",
"Validation for a date value compared to now (new Date)..": "Validierung für einen Datumswert im Vergleich zu jetzt (neues Datum)..",
"Email": "E-Mail",
"Simple regexp validation of emails via `/^\\S+@\\S+$/`. Is automatically a `string`, so no need to do `string & Email`.": "Einfache Regexp-Validierung von Emails über `/^\\S+@\\S+$/`. Ist automatisch ein `String`, also keine Notwendigkeit, `String & Email` zu machen.",
"integer": "Ganzzahl",
"Ensures that the number is a integer in the correct range. Is automatically a `number`, so no need to do `number & integer`.": "Stellt sicher, dass die Zahl eine Ganzzahl im richtigen Bereich ist. Ist automatisch eine \"Zahl\", so dass keine Notwendigkeit besteht, \"Zahl & Ganzzahl\" zu verwenden.",
"See Special types: integer/floats for more information": "Siehe Spezielle Typen: Integer/Floats für weitere Informationen",
"Custom validator": "Benutzerdefinierter Validierer",
"If the built-in validators are not sufficient, custom validation functions can be created and used via the `Validate` decorator.": "Wenn die eingebauten Validatoren nicht ausreichen, können benutzerdefinierte Validierungsfunktionen erstellt und über den Dekorator `Validate` verwendet werden.",
"Note that your custom validation function is executed after all built-in type validators have been called. If a validator fails, all subsequent validators for the current type are skipped. Only one failure is possible per type.": "Beachten Sie, dass Ihre benutzerdefinierte Validierungsfunktion ausgeführt wird, nachdem alle eingebauten Typvalidierer aufgerufen wurden. Wenn ein Validator fehlschlägt, werden alle nachfolgenden Validatoren für den aktuellen Typ übersprungen. Pro Typ ist nur ein Fehlschlag möglich.",
"Generic Validator": "Generischer Validator",
"In the Validator function the type object is available which can be used to get more information about the type using the validator. There is also a possibility to define an arbitrary validator option that must be passed to the validate type and makes the validator configurable. With this information and its parent references, powerful generic validators can be created.": "In der Validator-Funktion steht das Typ-Objekt zur Verfügung, das verwendet werden kann, um weitere Informationen über den Typ zu erhalten, der den Validator verwendet. Es besteht auch die Möglichkeit, eine beliebige Validator-Option zu definieren, die an den Validator-Typ übergeben werden muss und den Validator konfigurierbar macht. Mit diesen Informationen und ihren übergeordneten Referenzen können leistungsfähige generische Validatoren erstellt werden.",
"Serialisation": "Serialisierung",
"Serialization is the process of converting data types into a format suitable for transport or storage, for example. Deserialization is the process of undoing this. This is done loss-lessly, meaning that data can be converted to and from a serialization target without losing data type information or the data itself.": "Unter Serialisierung versteht man die Umwandlung von Datentypen in ein Format, das z. B. für den Transport oder die Speicherung geeignet ist. Die Deserialisierung ist der Prozess, der dies wieder rückgängig macht. Dies geschieht verlustfrei, d. h. Daten können in ein Serialisierungsziel und aus diesem heraus konvertiert werden, ohne dass Datentypinformationen oder die Daten selbst verloren gehen.",
"In JavaScript, serialization is usually between JavaScript objects and JSON. JSON supports only String, Number, Boolean, Objects, and Arrays. JavaScript, on the other hand, supports many other types such as BigInt, ArrayBuffer, typed arrays, Date, custom class instances, and many more. Now, to transmit JavaScript data to a server using JSON, you need a serialization process (on the client) and a deserialization process (on the server), or vice versa if the server sends data to the client as JSON. Using `JSON.parse` and `JSON.stringify` is often not sufficient for this, as it is not lossless.": "In JavaScript erfolgt die Serialisierung normalerweise zwischen JavaScript-Objekten und JSON. JSON unterstützt nur String, Number, Boolean, Objects und Arrays. JavaScript hingegen unterstützt viele andere Typen wie BigInt, ArrayBuffer, typisierte Arrays, Date, benutzerdefinierte Klasseninstanzen und viele mehr. Um nun JavaScript-Daten mit JSON an einen Server zu übertragen, benötigen Sie einen Serialisierungsprozess (auf dem Client) und einen Deserialisierungsprozess (auf dem Server), oder umgekehrt, wenn der Server Daten als JSON an den Client sendet. Die Verwendung von `JSON.parse` und `JSON.stringify` ist dafür oft nicht ausreichend, da sie nicht verlustfrei ist.",
"This serialization process is absolutely necessary for non-trivial data, since JSON loses its information even for basic types like a date. A new Date is finally serialized as a string in JSON:": "Dieser Serialisierungsprozess ist für nicht-triviale Daten absolut notwendig, da JSON selbst bei einfachen Typen wie einem Datum seine Informationen verliert. Ein neues Datum wird schließlich als String in JSON serialisiert:",
"As you can see, the result of JSON.stringify is a JSON string. If you deserialize it again with JSON.parse, you will not get a date object, but a string.": "Wie Sie sehen können, ist das Ergebnis von JSON.stringify ein JSON-String. Wenn Sie es mit JSON.parse wieder deserialisieren, erhalten Sie kein Datumsobjekt, sondern einen String.",
"Although there are various workarounds to teach JSON.parse to deserialize Date objects, they are error-prone and poorly performing. To enable type-safe serialization and deserialization for this case and many other types, a serialization process is necessary.": "Zwar gibt es verschiedene Workarounds, um JSON.parse die Deserialisierung von Datumsobjekten beizubringen, doch sind diese fehleranfällig und wenig leistungsfähig. Um eine typsichere Serialisierung und Deserialisierung für diesen Fall und viele andere Typen zu ermöglichen, ist ein Serialisierungsprozess erforderlich.",
"There are four main functions available: `serialize`, `cast`, `deserialize` and `validatedDeserialize`. Under the hood of these functions, the globally available JSON serializer from `@deepkit/type` is used by default, but a custom serialization target can also be used.": "Es sind vier Hauptfunktionen verfügbar: `serialize`, `cast`, `deserialize` und `validatedDeserialize`. Unter der Haube dieser Funktionen wird standardmäßig der global verfügbare JSON-Serialisierer von `@deepkit/type` verwendet, es kann aber auch ein benutzerdefiniertes Serialisierungsziel verwendet werden.",
"Deepkit Type supports user-defined serialization targets, but already comes with a powerful JSON serialization target that serializes data as JSON objects and then can be correctly and safely converted as JSON using JSON.stringify. With `@deepkit/bson`, BSON can also be used as a serialization target. How to create a custom serialization target (for example for a database driver) can be learned in the Custom Serializer section.": "Deepkit Type unterstützt benutzerdefinierte Serialisierungsziele, verfügt aber bereits über ein leistungsfähiges JSON-Serialisierungsziel, das Daten als JSON-Objekte serialisiert und dann mit JSON.stringify korrekt und sicher in JSON umgewandelt werden kann. Mit `@deepkit/bson` kann auch BSON als Serialisierungsziel verwendet werden. Wie man ein benutzerdefiniertes Serialisierungsziel (z.B. für einen Datenbanktreiber) erstellt, erfahren Sie im Abschnitt Benutzerdefinierter Serialisierer.",
"Note that although serializers also validate data for compatibility, these validations are different from the validation in xref:validation.adoc[Validation]. Only the `cast` function also calls the full validation process from the xref:validation.adoc[Validation] chapter after successful deserialization, and throws an error if the data is not valid.": "Beachten Sie, dass die Serialisierer aus Kompatibilitätsgründen zwar auch Daten validieren, diese Validierungen sich aber von der Validierung in xref:validation.adoc[Validation] unterscheiden. Nur die Funktion `cast` ruft nach erfolgreicher Deserialisierung auch den vollständigen Validierungsprozess aus dem Kapitel xref:validation.adoc[Validation] auf und gibt einen Fehler aus, wenn die Daten nicht gültig sind.",
"Alternatively, `validatedDeserialize` can be used to validate after deserialization. Another alternative is to manually call the `validate` or `validates` functions on deserialized data from the `deserialize` function, see xref:validation.adoc[Validation].": "Alternativ kann `validatedDeserialize` verwendet werden, um nach der Deserialisierung zu validieren. Eine weitere Alternative ist der manuelle Aufruf der Funktionen `validate` oder `validates` für deserialisierte Daten aus der Funktion `deserialize`, siehe xref:validation.adoc[Validation].",
"All functions from serialization and validation throw a `ValidationError` from `@deepkit/type` on errors.": "Alle Funktionen aus Serialisierung und Validierung werfen bei Fehlern einen `ValidationError` aus `@deepkit/type`.",
"Cast": "Cast",
"Todo": "Todo",
"Serialisierung": "Serialisierung",
"The function `serialize` converts the passed data by default with the JSON serializer into a JSON object, that is: String, Number, Boolean, Object, or Array. The result of this can then be safely converted to a JSON using `JSON.stringify`.": "Die Funktion `serialize` konvertiert die übergebenen Daten standardmäßig mit dem JSON-Serializer in ein JSON-Objekt, d.h.: String, Number, Boolean, Object, oder Array. Das Ergebnis kann dann mit `JSON.stringify` sicher in ein JSON konvertiert werden.",
"Deserialisierung": "Deserialisierung",
"The function `deserialize` converts the passed data per default with the JSON serializer into the corresponding specified types. The JSON serializer expects a JSON object, i.e.: string, number, boolean, object, or array. This is usually obtained from a `JSON.parse` call.": "Die Funktion `deserialize` konvertiert die übergebenen Daten standardmäßig mit dem JSON-Serializer in die entsprechenden angegebenen Typen. Der JSON-Serializer erwartet ein JSON-Objekt, d.h.: String, Zahl, Boolean, Objekt oder Array. Dieses wird in der Regel durch einen `JSON.parse`-Aufruf gewonnen.",
"If the correct data type is already passed (for example, a Date object in the case of `created`), then this is taken as it is.": "Wenn bereits der richtige Datentyp übergeben wird (z.B. ein Datumsobjekt im Fall von `created`), dann wird dieser so übernommen, wie er ist.",
"Not only a class, but any TypeScript type can be specified as the first type argument. So even primitives or very complex types can be passed:": "Nicht nur eine Klasse, sondern jeder TypeScript-Typ kann als erstes Typ-Argument angegeben werden. Es können also auch Primitive oder sehr komplexe Typen übergeben werden:",
"Soft Type Conversion": "Soft Type Konvertierung",
"In the deserialization process a soft type conversion is implemented. This means that String and Number for String types or a Number for a String type can be accepted and converted automatically. This is useful, for example, when data is accepted via a URL and passed to the deserializer. Since the URL is always a string, Deepkit Type still tries to resolve the types for Number and Boolean.": "Bei der Deserialisierung wird eine weiche Typkonvertierung durchgeführt. Das bedeutet, dass String und Number für String-Typen oder eine Number für einen String-Typ akzeptiert und automatisch konvertiert werden können. Dies ist z.B. dann sinnvoll, wenn Daten über eine URL angenommen und an den Deserialisierer übergeben werden. Da es sich bei der URL immer um einen String handelt, versucht Deepkit Type weiterhin, die Typen Number und Boolean aufzulösen.",
"The following soft type conversions are built into the JSON serializer:": "Die folgenden weichen Typkonvertierungen sind in den JSON-Serialisierer integriert:",
"*number|bigint*: Number or Bigint accept String, Number, and BigInt. `parseFloat` or `BigInt(x)` are used in case of a necessary conversion.": "*Zahl|Bigint*: Number oder Bigint akzeptieren String, Number und BigInt. `parseFloat` oder `BigInt(x)` werden im Falle einer notwendigen Umwandlung verwendet.",
"*boolean*: Boolean accepts Number and String. 0, '0', 'false' is interpreted as `false`. 1, '1', 'true' is interpreted as `true`.": "*Boolesch*: Boolean akzeptiert Zahl und String. 0, '0', 'false' wird als `false` interpretiert. 1, '1', 'wahr' wird als 'wahr' interpretiert.",
"*string*: String accepts Number, String, Boolean, and many more. All non-string values are automatically converted with `String(x)`.": "*Zeichenfolge*: String akzeptiert Number, String, Boolean und viele mehr. Alle Nicht-String-Werte werden automatisch mit `String(x)` konvertiert.",
"The soft conversion can also be deactivated:": "Die weiche Umwandlung kann auch deaktiviert werden:",
"In the case of invalid data, no attempt is made to convert it and instead an error message is thrown.": "Bei ungültigen Daten wird nicht versucht, sie zu konvertieren, sondern es wird eine Fehlermeldung ausgegeben.",
"Type-Decorators": "Typ-Dekoratoren",
"Integer": "Integer",
"Mapped": "Karte",
"Naming Strategy": "Strategie der Namensgebung",
"Benutzerdefinierter Serializer": "Benutzerdefinierter Serialisierer",
"By default, `@deepkit/type` comes with a JSON serializer and type validation for TypeScript types. You can extend this and add or remove the serialization functionality or change the way validation is done, as validation is also linked to the serializer.": "Standardmäßig wird `@deepkit/type` mit einem JSON-Serialisierer und einer Typ-Validierung für TypeScript-Typen geliefert. Sie können dies erweitern und die Serialisierungsfunktionalität hinzufügen oder entfernen oder die Art der Validierung ändern, da die Validierung auch mit dem Serialisierer verknüpft ist.",
"New Serializer": "Neuer Serialisierer",
"A serializer is simply an instance of the `Serializer` class with registered serializer templates. Serializer templates are small functions that create JavaScript code for the JIT serializer process. For each type (String, Number, Boolean, etc.) there is a separate Serializer template that is responsible for returning code for data conversion or validation. This code must be compatible with the JavaScript engine that the user is using.": "Ein Serializer ist einfach eine Instanz der Klasse `Serializer` mit registrierten Serializer-Vorlagen. Serializer-Vorlagen sind kleine Funktionen, die JavaScript-Code für den JIT-Serializer-Prozess erzeugen. Für jeden Typ (String, Number, Boolean usw.) gibt es eine eigene Serializer-Vorlage, die für die Rückgabe von Code zur Datenkonvertierung oder -validierung zuständig ist. Dieser Code muss mit der JavaScript-Engine kompatibel sein, die der Benutzer verwendet.",
"Only during the execution of the compiler template function do you (or should you) have full access to the full type. The idea is that you should embed all the information needed to convert a type directly into the JavaScript code, resulting in highly optimized code (also called JIT-optimized code).": "Nur während der Ausführung der Compiler-Vorlagenfunktion haben Sie (oder sollten Sie) vollen Zugriff auf den vollständigen Typ. Die Idee ist, dass Sie alle Informationen, die für die Umwandlung eines Typs erforderlich sind, direkt in den JavaScript-Code einbetten sollten, was zu hoch optimiertem Code führt (auch JIT-optimierter Code genannt).",
"The following example creates an empty serializer.": "Im folgenden Beispiel wird ein leerer Serialisierer erstellt.",
"As you can see, nothing has been converted (`created` is still a number, but we have defined it as `date`). To change this, we add a serializer template for deserialization of type Date.": "Wie Sie sehen können, wurde nichts umgewandelt (`created` ist immer noch eine Zahl, aber wir haben sie als `date` definiert). Um dies zu ändern, fügen wir eine Serializer-Vorlage für die Deserialisierung des Typs Date hinzu.",
"Now our serializer converts the value into a Date object.": "Jetzt wandelt unser Serializer den Wert in ein Date-Objekt um.",
"To do the same for serialization, we register another serialization template.": "Um das Gleiche für die Serialisierung zu tun, registrieren wir eine weitere Serialisierungsvorlage.",
"Our new serializer now correctly converts the date from the Date object to a string in the serialization process.": "Unser neuer Serialisierer konvertiert nun das Datum aus dem Date-Objekt korrekt in eine Zeichenkette während des Serialisierungsprozesses.",
"Examples": "Beispiele",
"To see many more examples, you can take a look at the code of the link:https://github.com/deepkit/deepkit-framework/blob/master/packages/type/src/serializer.ts#L1688[JSON-Serializers] included in Deepkit Type.": "Um viele weitere Beispiele zu sehen, können Sie einen Blick auf den Code des Links:https://github.com/deepkit/deepkit-framework/blob/master/packages/type/src/serializer.ts#L1688[JSON-Serializer] werfen, der in Deepkit Type enthalten ist.",
"Expanding A Serializer": "Einen Serialisierer erweitern",
"If you want to extend an existing serializer, you can do so using class inheritance. This works because serializers should be written to register their templates in the constructor.": "Wenn Sie einen vorhandenen Serialisierer erweitern möchten, können Sie dies über Klassenvererbung tun. Dies funktioniert, weil Serialisierer so geschrieben werden sollten, dass sie ihre Vorlagen im Konstruktor registrieren.",
"Dependency Injection": "Injektion von Abhängigkeiten",
"Dependency Injection (DI) is a design pattern in which classes and functions _receive_ their dependencies. It follows the principle of Inversion of Control (IoC) and helps to better separate complex code in order to significantly improve testability, modularity and clarity. Although there are other design patterns, such as the service locator pattern, for applying the principle of IoC, DI has established itself as the dominant pattern, especially in enterprise software.": "Dependency Injection (DI) ist ein Entwurfsmuster, bei dem Klassen und Funktionen ihre Abhängigkeiten _empfangen_. Es folgt dem Prinzip der Inversion of Control (IoC) und hilft, komplexen Code besser zu trennen, um Testbarkeit, Modularität und Übersichtlichkeit deutlich zu verbessern. Obwohl es auch andere Entwurfsmuster, wie z. B. das Service-Locator-Muster, für die Anwendung des IoC-Prinzips gibt, hat sich DI vor allem in der Unternehmenssoftware als das dominierende Muster etabliert.",
"To illustrate the principle of IoC, here is an example:": "Um das Prinzip von IoC zu veranschaulichen, hier ein Beispiel:",
"The UserRepository class has an HttpClient as a dependency. This dependency in itself is nothing remarkable, but it is problematic that `UserRepository` creates the HttpClient itself.": "Die UserRepository-Klasse hat einen HttpClient als Abhängigkeit. Diese Abhängigkeit ist an sich nichts Bemerkenswertes, aber es ist problematisch, dass \"UserRepository\" den HttpClient selbst erstellt.",
"It seems to be a good idea to encapsulate the creation of the HttpClient in the UserRepository, but this is not the case. What if we want to replace the HttpClient? What if we want to test UserRepository in a unit test without allowing real HTTP requests to go out? How do we know that the class even uses an HttpClient?": "Es scheint eine gute Idee zu sein, die Erstellung des HttpClient im UserRepository zu kapseln, aber das ist nicht der Fall. Was, wenn wir den HttpClient ersetzen wollen? Was ist, wenn wir UserRepository in einem Unit-Test testen wollen, ohne dass echte HTTP-Anfragen rausgehen? Woher wissen wir, dass die Klasse überhaupt einen HttpClient verwendet?",
"Inversion of Control": "Umkehrung der Kontrolle",
"In the thought of Inversion of Control (IoC) is the following alternative variant that sets the HttpClient as an explicit dependency in the constructor (also known as constructor injection).": "Im Gedanken der Inversion of Control (IoC) ist die folgende alternative Variante, die den HttpClient als explizite Abhängigkeit im Konstruktor setzt (auch bekannt als Konstruktorinjektion).",
"Now UserRepository is no longer responsible for creating the HttpClient, but the user of UserRepository. This is Inversion of Control (IoC). The control has been reversed or inverted. Specifically, this code applies dependency injection, because dependencies are received (injected) and no longer created or requested. Dependency Injection is only one variant of IoC.": "Nun ist nicht mehr UserRepository für die Erstellung des HttpClient verantwortlich, sondern der Benutzer von UserRepository. Dies ist eine Umkehrung der Kontrolle (IoC). Die Kontrolle wurde umgedreht oder invertiert. Insbesondere wendet dieser Code Dependency Injection an, da Abhängigkeiten empfangen (injiziert) und nicht mehr erstellt oder angefordert werden. Dependency Injection ist nur eine Variante von IoC.",
"Service Locator": "Service-Suchmaschine",
"Besides DI, Service Locator (SL) is also a way to apply the IoC principle. This is commonly considered the counterpart to Dependency Injection, as it requests dependencies rather than receiving them. If HttpClient were requested in the above code as follows, it would be called a Service Locator pattern.": "Neben DI ist auch der Service Locator (SL) eine Möglichkeit, das IoC-Prinzip anzuwenden. Es wird gemeinhin als Gegenstück zur Dependency Injection betrachtet, da es Abhängigkeiten anfordert, anstatt sie zu empfangen. Wenn der HttpClient im obigen Code wie folgt angefordert würde, würde dies als Service-Locator-Muster bezeichnet werden.",
"The function `locator.getHttpClient` can have any name. Alternatives would be function calls like `useContext(HttpClient)`, `getHttpClient()`, `await import(\"client\"),` or a container call like `container.get(HttpClient)`. An import of a global is a slightly different variant of a service locator, using the module system itself as the locator:": "Die Funktion `locator.getHttpClient` kann einen beliebigen Namen haben. Alternativen wären Funktionsaufrufe wie `useContext(HttpClient)`, `getHttpClient()`, `await import(\"client\"),` oder ein Container-Aufruf wie `container.get(HttpClient)`. Der Import eines Globals ist eine etwas andere Variante eines Service-Locators, der das Modulsystem selbst als Locator verwendet:",
"All these variants have in common that they explicitly request the HttpClient dependency. This request can happen not only to properties as a default value, but also somewhere in the middle of the code. Since in the middle of the code means that it is not part of a type interface, the use of the HttpClient is hidden. Depending on the variant of how the HttpClient is requested, it can sometimes be very difficult or completely impossible to replace it with another implementation. Especially in the area of unit tests and for the sake of clarity, difficulties can arise here, so that the service locator is now classified as an anti-pattern in certain situations.": "Alle diese Varianten haben gemeinsam, dass sie die HttpClient-Abhängigkeit explizit anfordern. Diese Anforderung kann nicht nur an Eigenschaften als Standardwert erfolgen, sondern auch irgendwo mitten im Code. Da mitten im Code bedeutet, dass er nicht Teil einer Typschnittstelle ist, ist die Verwendung des HttpClient versteckt. Je nach Variante, wie der HttpClient angefordert wird, kann es manchmal sehr schwierig oder gar unmöglich sein, ihn durch eine andere Implementierung zu ersetzen. Gerade im Bereich der Unit-Tests und aus Gründen der Übersichtlichkeit können hier Schwierigkeiten auftreten, so dass der Service-Locator nun in bestimmten Situationen als Anti-Pattern eingestuft wird.",
"With Dependency Injection, nothing is requested, but it is explicitly provided by the user or received by the code. As can be seen in the example of Inversion of Control, the dependency injection pattern has already been applied there. Specifically, constructor injection can be seen there, since the dependency is declared in the constructor. So UserRepository must now be used as follows.": "Bei Dependency Injection wird nichts angefordert, sondern explizit vom Benutzer bereitgestellt oder vom Code entgegengenommen. Wie im Beispiel der Inversion of Control zu sehen ist, wurde das Dependency Injection Pattern dort bereits angewendet. Konkret ist dort die Konstruktorinjektion zu sehen, da die Abhängigkeit im Konstruktor deklariert wird. Das UserRepository muss nun also wie folgt verwendet werden.",
"The code that wants to use UserRepository must also provide (inject) all its dependencies. Whether HttpClient should be created each time or the same one should be used each time is now decided by the user of the class and no longer by the class itself. It is no longer requested (from the class's point of view) as in the case of the service locator, or created entirely by itself in the initial example. This inversion of the flow has various advantages:": "Der Code, der UserRepository verwenden will, muss auch alle seine Abhängigkeiten bereitstellen (injizieren). Ob der HttpClient jedes Mal neu erstellt oder derselbe verwendet werden soll, wird nun vom Benutzer der Klasse und nicht mehr von der Klasse selbst entschieden. Er wird nicht mehr (aus Sicht der Klasse) angefordert, wie im Fall des Service Locators, oder wie im Ausgangsbeispiel ganz von selbst erstellt. Diese Umkehrung des Ablaufs hat verschiedene Vorteile:",
"The code is easier to understand because all dependencies are explicitly visible.": "Der Code ist einfacher zu verstehen, da alle Abhängigkeiten explizit sichtbar sind.",
"The code is easier to test because all dependencies are unique and can be easily modified if needed.": "Der Code ist einfacher zu testen, da alle Abhängigkeiten eindeutig sind und bei Bedarf leicht geändert werden können.",
"The code is more modular, as dependencies can be easily exchanged.": "Der Code ist modularer, da Abhängigkeiten leicht ausgetauscht werden können.",
"It promotes the Separation of Concern principle, as UserRepository is no longer responsible for creating very complex dependencies itself when in doubt.": "Es fördert den Grundsatz der Trennung der Verantwortlichkeiten, da UserRepository im Zweifelsfall nicht mehr selbst für die Erstellung sehr komplexer Abhängigkeiten verantwortlich ist.",
"But an obvious disadvantage can also be recognized directly: Do I really need to create or manage all dependencies like the HttpClient myself? Yes and No. Yes, there are many cases where it is perfectly legitimate to manage the dependencies yourself. The hallmark of a good API is that dependencies don't get out of hand, and that even then they are pleasant to use. For many applications or complex libraries, this may well be the case. To provide a very complex low-level API with many dependencies in a simplified way to the user, facades are wonderfully suitable.": "Ein offensichtlicher Nachteil ist aber auch direkt zu erkennen: Muss ich wirklich alle Abhängigkeiten wie den HttpClient selbst erstellen oder verwalten? Ja und Nein. Ja, es gibt viele Fälle, in denen es völlig legitim ist, die Abhängigkeiten selbst zu verwalten. Eine gute API zeichnet sich dadurch aus, dass die Abhängigkeiten nicht aus dem Ruder laufen, und dass sie selbst dann noch angenehm zu verwenden sind. Bei vielen Anwendungen oder komplexen Bibliotheken kann dies durchaus der Fall sein. Um eine sehr komplexe Low-Level-API mit vielen Abhängigkeiten dem Benutzer auf vereinfachte Weise zur Verfügung zu stellen, sind Fassaden wunderbar geeignet.",
"Dependency Injection Container": "Dependency Injection Container",
"For more complex applications, however, it is not necessary to manage all dependencies yourself, because that is exactly what a so-called dependency injection container is for. This not only creates all objects automatically, but also \"injects\" the dependencies automatically, so that a manual \"new\" call is no longer necessary. There are various types of injection, such as constructor injection, method injection, or property injection. This makes it easy to manage even complicated constructions with many dependencies.": "Für komplexere Anwendungen ist es jedoch nicht notwendig, alle Abhängigkeiten selbst zu verwalten, denn genau dafür gibt es den sogenannten Dependency Injection Container. Dieser legt nicht nur alle Objekte automatisch an, sondern \"injiziert\" auch die Abhängigkeiten automatisch, so dass ein manueller \"new\"-Aufruf nicht mehr notwendig ist. Es gibt verschiedene Arten der Injektion, wie z.B. Konstruktorinjektion, Methodeninjektion oder Eigenschaftsinjektion. So lassen sich auch komplizierte Konstruktionen mit vielen Abhängigkeiten einfach verwalten.",
"A dependency injection container (also called DI container or IoC container) brings Deepkit in `@deepkit/injector` or already ready integrated via App modules in the Deepkit Framework. The above code would look like this using a low-level API from the `@deepkit/injector` package.": "Ein Dependency Injection Container (auch DI-Container oder IoC-Container genannt) bringt Deepkit in `@deepkit/injector` oder bereits fertig integriert über App-Module in das Deepkit Framework. Der obige Code würde unter Verwendung einer Low-Level-API aus dem Paket \"@deepkit/injector\" wie folgt aussehen.",
"The `injector` object in this case is the dependency injection container. Instead of using \"new UserRepository\", the container returns an instance of UserRepository using `get(UserRepository)`. To statically initialize the container, a list of providers is passed to the `InjectorContext.forProviders` function (in this case, simply the classes).": "Das \"Injector\"-Objekt ist in diesem Fall der Dependency Injection Container. Anstatt \"new UserRepository\" zu verwenden, gibt der Container mit \"get(UserRepository)\" eine Instanz von UserRepository zurück. Um den Container statisch zu initialisieren, wird eine Liste von Providern an die Funktion \"InjectorContext.forProviders\" übergeben (in diesem Fall einfach die Klassen).",
"Since DI is all about providing dependencies, the container is provided with the dependencies, hence the technical term \"provider\". There are several types of providers: ClassProvider, ValueProvider, ExistingProvider, FactoryProvider. All together, they allow very flexible architectures to be mapped with a DI container.": "Da es bei DI um die Bereitstellung von Abhängigkeiten geht, wird der Container mit den Abhängigkeiten versehen, daher der technische Begriff \"Provider\". Es gibt verschiedene Arten von Providern: ClassProvider, ValueProvider, ExistingProvider, FactoryProvider. Alle zusammen erlauben es, sehr flexible Architekturen mit einem DI-Container abzubilden.",
"All dependencies between providers are automatically resolved and as soon as an `injector.get()` call occurs, the objects and dependencies are created, cached, and correctly passed either as a constructor argument (which is known as constructor injection), set as a property (which is known as property injection), or passed to a method call (which is known as method injection).": "Alle Abhängigkeiten zwischen Anbietern werden automatisch aufgelöst, und sobald ein `injector.get()`-Aufruf erfolgt, werden die Objekte und Abhängigkeiten erstellt, zwischengespeichert und korrekt übergeben, entweder als Konstruktorargument (bekannt als Konstruktorinjektion), als Eigenschaft (bekannt als Eigenschaftsinjektion) oder an einen Methodenaufruf (bekannt als Methodeninjektion).",
"Now to exchange the HttpClient with another one, another provider (here the ValueProvider) can be defined for HttpClient:": "Um nun den HttpClient mit einem anderen auszutauschen, kann ein weiterer Provider (hier der ValueProvider) für den HttpClient definiert werden:",
"As soon as UserRepository is requested via `injector.get(UserRepository)`, it receives the AnotherHttpClient object. Alternatively, a ClassProvider can be used here very well, so that all dependencies of AnotherHttpClient are also managed by the DI container.": "Sobald das UserRepository über `injector.get(UserRepository)` angefordert wird, erhält es das AnotherHttpClient-Objekt. Alternativ kann hier auch sehr gut ein ClassProvider verwendet werden, so dass alle Abhängigkeiten des AnotherHttpClient ebenfalls vom DI-Container verwaltet werden.",
"All types of providers are listed and explained in the xref:dependency-injection.adoc#di-providers[Dependency Injection Providers] section.": "Alle Arten von Providern sind im Abschnitt xref:dependency-injection.adoc#di-providers[Dependency Injection Providers] aufgeführt und erläutert.",
"It should be mentioned here that Deepkit's DI container only works with Deepkit's runtime types. This means that any code that contains classes, types, interfaces, and functions must be compiled by the Deepkit Type Compiler in order to have the type information available at runtime. See the chapter xref:runtime-types.adoc[Runtime Types].": "An dieser Stelle sollte erwähnt werden, dass der DI-Container von Deepkit nur mit den Laufzeittypen von Deepkit funktioniert. Das bedeutet, dass jeder Code, der Klassen, Typen, Schnittstellen und Funktionen enthält, vom Deepkit Type Compiler kompiliert werden muss, damit die Typinformationen zur Laufzeit verfügbar sind. Siehe das Kapitel xref:runtime-types.adoc[Runtime Types].",
"Dependency Inversion": "Inversion von Abhängigkeiten",
"The example of UserRepository under Inversion of Control shows that UserRepository depends on a lower level HTTP library. In addition, a concrete implementation (class) is declared as a dependency instead of an abstraction (interface). At first glance, this may seem to be in line with the object-oriented paradigms, but it can lead to problems, especially in complex and large architectures.": "Das Beispiel von UserRepository unter Inversion of Control zeigt, dass UserRepository von einer untergeordneten HTTP-Bibliothek abhängt. Außerdem wird eine konkrete Implementierung (Klasse) als Abhängigkeit deklariert und nicht eine Abstraktion (Schnittstelle). Auf den ersten Blick scheint dies den objektorientierten Paradigmen zu entsprechen, kann aber insbesondere in komplexen und großen Architekturen zu Problemen führen.",
"An alternative variant would be to convert the HttpClient dependency into an abstraction (interface) and thus not import code from an HTTP library into UserRepository.": "Eine alternative Variante wäre, die HttpClient-Abhängigkeit in eine Abstraktion (Schnittstelle) umzuwandeln und somit keinen Code aus einer HTTP-Bibliothek in UserRepository zu importieren.",
"This is called the dependency inversion principle. UserRepository no longer has a dependency directly on an HTTP library and is instead based on an abstraction (interface). It thus solves two fundamental goals in this principle:": "Dies wird als Prinzip der Abhängigkeitsumkehr bezeichnet. UserRepository ist nicht mehr direkt von einer HTTP-Bibliothek abhängig und basiert stattdessen auf einer Abstraktion (Schnittstelle). Damit löst es zwei grundlegende Ziele dieses Prinzips:",
"High-level modules should not import anything from low-level modules.": "High-Level-Module sollten keine Inhalte von Low-Level-Modulen importieren.",
"Implementations should be based on abstractions (interfaces).": "Die Implementierungen sollten auf Abstraktionen (Schnittstellen) beruhen.",
"Merging the two implementations (UserRepository with an HTTP library) can now be done via the DI container.": "Die Zusammenführung der beiden Implementierungen (UserRepository mit einer HTTP-Bibliothek) kann nun über den DI-Container erfolgen.",
"Since Deepkit's DI container is capable of resolving abstract dependencies (interfaces) such as this one of HttpClientInterface, UserRepository automatically gets the implementation of HttpClient since HttpClient implemented the interface HttpClientInterface. This is done either by HttpClient specifically implementing HttpClientInterface (`class HttpClient implements HttpClientInterface`), or by HttpClient's API simply being compatible with HttpClientInterface.": "Da der DI-Container von Deepkit in der Lage ist, abstrakte Abhängigkeiten (Schnittstellen) wie die von HttpClientInterface aufzulösen, erhält UserRepository automatisch die Implementierung von HttpClient, da HttpClient die Schnittstelle HttpClientInterface implementiert. Dies geschieht entweder durch HttpClient speziell implementiert HttpClientInterface (`class HttpClient implementiert HttpClientInterface`), oder durch HttpClient's API einfach kompatibel mit HttpClientInterface ist.",
"As soon as HttpClient modifies its API (for example, removes the `get` method) and is thus no longer compatible with HttpClientInterface, the DI container throws an error (\"the HttpClientInterface dependency was not provided\").": "Sobald HttpClient seine API ändert (z. B. die Methode `get` entfernt) und damit nicht mehr mit HttpClientInterface kompatibel ist, wirft der DI-Container einen Fehler (\"die HttpClientInterface-Abhängigkeit wurde nicht bereitgestellt\").",
"Here the user, who wants to bring both implementations together, is in the obligation to find a solution. As an example, an adapter class could be registered here that implements HttpClientInterface and correctly forwards the method calls to HttpClient.": "Hier ist der Anwender, der beide Implementierungen zusammenbringen will, in der Pflicht, eine Lösung zu finden. Als Beispiel könnte hier eine Adapterklasse registriert werden, die das HttpClientInterface implementiert und die Methodenaufrufe korrekt an den HttpClient weiterleitet.",
"It should be noted here that although in theory the dependency inversion principle has its advantages, in practice it also has significant disadvantages. It not only leads to more code (since more interfaces have to be written), but also to more complexity (since each implementation now has an interface for each dependency). This price to pay is only worth it when the application reaches a certain size and this flexibility is needed. Like any design pattern and principle, this one has its cost-use factor, which should be thought through before it is applied.": "An dieser Stelle sei angemerkt, dass das Prinzip der Abhängigkeitsinversion zwar in der Theorie seine Vorteile hat, in der Praxis aber auch erhebliche Nachteile mit sich bringt. Es führt nicht nur zu mehr Code (da mehr Schnittstellen geschrieben werden müssen), sondern auch zu mehr Komplexität (da jede Implementierung nun eine Schnittstelle für jede Abhängigkeit hat). Dieser Preis lohnt sich erst, wenn die Anwendung eine gewisse Größe erreicht und diese Flexibilität benötigt wird. Wie jedes Entwurfsmuster und Prinzip hat auch dieses seinen Kosten-Nutzen-Faktor, der vor seiner Anwendung durchdacht werden sollte.",
"Design patterns should not be used blindly and across the board for even the simplest code. However, if the prerequisites such as a complex architecture, large applications, or a scaling team are given, dependency inversion and other design patterns only unfold their true strength.": "Entwurfsmuster sollten auch bei einfachstem Code nicht blind und pauschal eingesetzt werden. Wenn jedoch die Voraussetzungen wie eine komplexe Architektur, große Anwendungen oder ein skalierendes Team gegeben sind, entfalten Abhängigkeitsinversion und andere Entwurfsmuster erst ihre wahre Stärke.",
"Since Dependency Injection in Deepkit is based on Runtime Types, it is necessary to have `@deepkit/type` already installed correctly. See xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Da Dependency Injection in Deepkit auf Runtime Types basiert, ist es notwendig, dass `@deepkit/type` bereits korrekt installiert ist. Siehe xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"If this is done successfully, `@deepkit/injector` can be installed by itself or the Deepkit framework which already uses the library under the hood.": "Wenn dies erfolgreich durchgeführt wurde, kann `@deepkit/injector` selbst oder das Deepkit-Framework, das die Bibliothek bereits unter der Haube verwendet, installiert werden.",
"Once the library is installed, the API of it can be used directly.": "Sobald die Bibliothek installiert ist, kann ihre API direkt verwendet werden.",
"To use Dependency Injection now, there are three ways.": "Um Dependency Injection jetzt zu verwenden, gibt es drei Möglichkeiten.",
"Injector API (Low Level)": "Injektor-API (niedrige Stufe)",
"Module API": "Modul-API",
"App API (Deepkit Framework)": "Anwendungs-API (Deepkit-Framework)",
"If `@deepkit/injector` is to be used without the deepkit framework, the first two variants are recommended.": "Wenn `@deepkit/injector` ohne das deepkit-Framework verwendet werden soll, werden die ersten beiden Varianten empfohlen.",
"Injector API": "Injektor-API",
"The Injector API has already been introduced in the introduction to Dependency Injection. It is characterized by a very simple usage by means of a single class `InjectorContext` that creates a single DI container and is particularly suitable for simpler applications without modules.": "Die Injector API wurde bereits in der Einführung zur Dependency Injection vorgestellt. Sie zeichnet sich durch eine sehr einfache Verwendung mittels einer einzigen Klasse `InjectorContext` aus, die einen einzigen DI-Container erzeugt und sich besonders für einfachere Anwendungen ohne Module eignet.",
"The `injector` object in this case is the dependency injection container. The function `InjectorContext.forProviders` takes an array of providers. See the section xref:dependency-injection.adoc#di-providers[Dependency Injection Providers] to learn which values can be passed.": "Das Objekt \"Injector\" ist in diesem Fall der Container für die Injektion von Abhängigkeiten. Die Funktion `InjectorContext.forProviders` nimmt ein Array von Providern entgegen. Welche Werte übergeben werden können, erfahren Sie im Abschnitt xref:dependency-injection.adoc#di-providers[Dependency Injection Providers].",
"A more complex API is the `InjectorModule` class, which allows to store the providers in different modules to create multiple encapsulated DI containers per module. Also this allows using configuration classes per module, which makes it easier to provide configuration values automatically validated to the providers. Modules can import themselves among themselves, providers export, in order to build up so a hierarchy and nicely separated architecture.": "Eine komplexere API ist die Klasse \"InjectorModule\", die es ermöglicht, die Provider in verschiedenen Modulen zu speichern, um mehrere gekapselte DI-Container pro Modul zu erstellen. Dies erlaubt auch die Verwendung von Konfigurationsklassen pro Modul, was es einfacher macht, den Providern automatisch validierte Konfigurationswerte zur Verfügung zu stellen. Module können sich untereinander importieren, Provider exportieren, um so eine hierarchische und sauber getrennte Architektur aufzubauen.",
"This API should be used if the application is more complex and the Deepkit framework is not used.": "Diese API sollte verwendet werden, wenn die Anwendung komplexer ist und das Deepkit-Framework nicht verwendet wird.",
"The `injector` object in this case is the dependency injection container. Providers can be split into different modules and then imported again in different places using module imports. This creates a natural hierarchy that reflects the hierarchy of the application or architecture.": "Das Objekt \"Injector\" ist in diesem Fall der Container für die Injektion von Abhängigkeiten. Anbieter können in verschiedene Module aufgeteilt und dann an verschiedenen Stellen durch Modulimporte wieder importiert werden. So entsteht eine natürliche Hierarchie, die die Hierarchie der Anwendung oder Architektur widerspiegelt.",
"The InjectorContext should always be given the top module in the hierarchy, also called root module or app module. The InjectorContext then only has an intermediary role: calls to `injector.get()` are simply forwarded to the root module. However, it is also possible to get providers from non-root modules by passing the module as a second argument.": "Der InjectorContext sollte immer dem obersten Modul in der Hierarchie, auch Root-Modul oder App-Modul genannt, zugeordnet werden. Der InjectorContext hat dann nur eine vermittelnde Rolle: Aufrufe von `injector.get()` werden einfach an das Wurzelmodul weitergeleitet. Es ist jedoch auch möglich, Provider von Nicht-Wurzelmodulen zu erhalten, indem das Modul als zweites Argument übergeben wird.",
"All non-root modules are encapsulated by default, so that all providers in this module are only available to itself. If a provider is to be available to other modules, this provider must be exported. By exporting, the provider moves to the parent module of the hierarchy and can be used that way.": "Alle Nicht-Wurzelmodule sind standardmäßig gekapselt, so dass alle Anbieter in diesem Modul nur für sich selbst verfügbar sind. Wenn ein Anbieter für andere Module verfügbar sein soll, muss er exportiert werden. Durch den Export wandert der Anbieter in das übergeordnete Modul der Hierarchie und kann auf diese Weise verwendet werden.",
"To export all providers by default to the top level, the root module, the option `forRoot` can be used. This allows all providers to be used by all other modules.": "Um alle Anbieter standardmäßig auf die oberste Ebene, das Root-Modul, zu exportieren, kann die Option `forRoot` verwendet werden. Dadurch können alle Anbieter von allen anderen Modulen verwendet werden.",
"App API": "App-API",
"Once the Deepkit framework is used, modules are defined with the `@deepkit/app` API. This is based on the Module API, so the capabilities from there are also available. In addition, it is possible to work with powerful hooks and define configuration loaders to map even more dynamic architectures.": "Sobald das Deepkit-Framework verwendet wird, werden Module mit der API \"@deepkit/app\" definiert. Diese basiert auf der Modul-API, so dass die dortigen Möglichkeiten ebenfalls zur Verfügung stehen. Darüber hinaus ist es möglich, mit leistungsfähigen Hooks zu arbeiten und Konfigurationslader zu definieren, um noch dynamischere Architekturen abzubilden.",
"The xref:framework.adoc#framework-modules[Framework Modules] chapter describes this in more detail.": "Das Kapitel xref:framework.adoc#framework-modules[Framework-Module] beschreibt dies ausführlicher.",
"Providers": "Anbieter",
"There are several ways to provide dependencies in the Dependency Injection container. The simplest variant is simply the specification of a class. This is also known as short ClassProvider.": "Es gibt mehrere Möglichkeiten, Abhängigkeiten im Dependency Injection Container bereitzustellen. Die einfachste Variante ist einfach die Angabe einer Klasse. Dies ist auch als kurzer ClassProvider bekannt.",
"This represents a special provider, since only the class is specified. All other providers must be specified as object literals.": "Dies ist ein besonderer Anbieter, da nur die Klasse angegeben wird. Alle anderen Anbieter müssen als Objektliterale angegeben werden.",
"By default, all providers are marked as singletons, so only one instance exists at any given time. To create a new instance each time a provider is deployed, the `transient` option can be used. This will cause classes to be recreated each time or factories to be executed each time.": "Standardmäßig sind alle Anbieter als Singletons gekennzeichnet, so dass immer nur eine Instanz existiert. Um jedes Mal, wenn ein Anbieter bereitgestellt wird, eine neue Instanz zu erstellen, kann die Option \"transient\" verwendet werden. Dies führt dazu, dass die Klassen jedes Mal neu erstellt oder die Fabriken jedes Mal ausgeführt werden.",
"ClassProvider": "ClassProvider",
"Besides the short ClassProvider there is also the regular ClassProvider, which is an object literal instead of a class.": "Neben dem kurzen ClassProvider gibt es auch den regulären ClassProvider, der ein Objektliteral anstelle einer Klasse ist.",
"This is equivalent to these two:": "Dies ist gleichbedeutend mit diesen beiden:",
"It can be used to exchange a provider with another class.": "Sie kann verwendet werden, um einen Anbieter mit einer anderen Klasse auszutauschen.",
"In this example, the `OtherUserRepository` class is now also managed in the DI container and all its dependencies are resolved automatically.": "In diesem Beispiel wird die Klasse \"OtherUserRepository\" nun auch im DI-Container verwaltet und alle ihre Abhängigkeiten werden automatisch aufgelöst.",
"ValueProvider": "ValueProvider",
"Static values can be provided with this provider.": "Mit diesem Anbieter können statische Werte bereitgestellt werden.",
"Since not only class instances can be provided as dependencies, any value can be specified as `useValue`. A symbol or a primitive (string, number, boolean) could also be used as a provider token.": "Da nicht nur Klasseninstanzen als Abhängigkeiten bereitgestellt werden können, kann jeder beliebige Wert als \"useValue\" angegeben werden. Ein Symbol oder ein Primitivum (String, Zahl, Boolean) kann ebenfalls als Provider-Token verwendet werden.",
"Primitive provider tokens must be declared with the Inject type as a dependency.": "Primitive Anbieter-Token müssen mit dem Inject-Typ als Abhängigkeit deklariert werden.",
"The combination of an inject alias and primitive provider tokens can also be used to provide dependencies from packages that do not contain runtime type information.": "Die Kombination aus einem Inject-Alias und primitiven Provider-Tokens kann auch verwendet werden, um Abhängigkeiten von Paketen bereitzustellen, die keine Laufzeittypinformationen enthalten.",
"And then declared on the user side as follows:": "Und dann auf der Benutzerseite wie folgt deklariert:",
"ExistingProvider": "ExistingProvider",
"A forwarding to an already defined provider can be defined.": "Es kann eine Weiterleitung zu einem bereits definierten Provider definiert werden.",
"FactoryProvider": "FactoryProvider",
"A function can be used to provide a value for the provider. This function can also contain parameters, which in turn are provided by the DI container. Thus, other dependencies or configuration options are accessible.": "Eine Funktion kann verwendet werden, um einen Wert für den Anbieter bereitzustellen. Diese Funktion kann auch Parameter enthalten, die ihrerseits vom DI-Container bereitgestellt werden. So sind weitere Abhängigkeiten oder Konfigurationsoptionen zugänglich.",
"InterfaceProvider": "InterfaceProvider",
"In addition to classes and primitives, abstractions (interfaces) can also be provided. This is done via the function `provide` and is particularly useful if the value to be provided does not contain any type information.": "Zusätzlich zu Klassen und Primitiven können auch Abstraktionen (Schnittstellen) bereitgestellt werden. Dies geschieht über die Funktion `provide` und ist besonders nützlich, wenn der zu liefernde Wert keine Typinformationen enthält.",
"If multiple providers have implemented the Connection interface, the last provider is used.": "Wenn mehrere Anbieter die Verbindungsschnittstelle implementiert haben, wird der letzte Anbieter verwendet.",
"As argument for provide() all other providers are possible.": "Als Argument für provide() sind alle anderen Anbieter möglich.",
"Asynchronous Providers": "Asynchrone Anbieter",
"The design of `@deepkit/injector` precludes the use of asynchronous providers with an asynchronous Dependency Injection container. This is because requesting providers would also need to be asynchronous, necessitating the entire application to operate at the highest level asynchronously.": "Das Design von `@deepkit/injector` schließt die Verwendung von asynchronen Providern mit einem asynchronen Dependency Injection Container aus. Der Grund dafür ist, dass die anfordernden Anbieter ebenfalls asynchron sein müssten, wodurch die gesamte Anwendung auf höchster Ebene asynchron arbeiten müsste.",
"To initialize something asynchronously, this initialization should be moved to the application server bootstrap, because there the events can be asynchronous. Alternatively, an initialization can be triggered manually.": "Um etwas asynchron zu initialisieren, sollte diese Initialisierung in den Bootstrap des Anwendungsservers verlegt werden, da dort die Ereignisse asynchron sein können. Alternativ kann eine Initialisierung auch manuell ausgelöst werden.",
"Constructor/Property Injection": "Konstruktor/Eigenschaftsinjektion",
"In most cases, constructor injection is used. All dependencies are specified as constructor arguments and are automatically injected by the DI container.": "In den meisten Fällen wird die Konstruktorinjektion verwendet. Alle Abhängigkeiten werden als Konstruktorargumente angegeben und automatisch durch den DI-Container injiziert.",
"Optional dependencies should be marked as such, otherwise an error could be triggered if no provider can be found.": "Optionale Abhängigkeiten sollten als solche gekennzeichnet werden, da sonst ein Fehler ausgelöst werden könnte, wenn kein Anbieter gefunden werden kann.",
"An alternative to constructor injection is property injection. This is usually used when the dependency is optional or the constructor is otherwise too full. The properties are automatically assigned once the instance is created (and thus the constructor is executed).": "Eine Alternative zur Konstruktorinjektion ist die Eigenschaftsinjektion. Diese wird in der Regel verwendet, wenn die Abhängigkeit optional ist oder der Konstruktor ansonsten zu umfangreich ist. Die Eigenschaften werden automatisch zugewiesen, sobald die Instanz erstellt (und somit der Konstruktor ausgeführt) wurde.",
"Configuration": "Konfiguration",
"The dependency injection container also allows configuration options to be injected. This configuration injection can be received via constructor injection or property injection.": "Der Dependency Injection Container erlaubt auch die Injektion von Konfigurationsoptionen. Diese Konfigurationsinjektion kann über Konstruktorinjektion oder Eigenschaftsinjektion erfolgen.",
"The Module API supports the definition of a configuration definition, which is a regular class. By providing such a class with properties, each property acts as a configuration option. Because of the way classes can be defined in TypeScript, this allows defining a type and default values per property.": "Die Modul-API unterstützt die Definition einer Konfigurationsdefinition, die eine reguläre Klasse ist. Wenn eine solche Klasse mit Eigenschaften versehen wird, fungiert jede Eigenschaft als eine Konfigurationsoption. Aufgrund der Art und Weise, wie Klassen in TypeScript definiert werden können, ermöglicht dies die Definition eines Typs und von Standardwerten pro Eigenschaft.",
"The configuration options `domain` and `debug` can now be used quite conveniently type-safe in providers.": "Die Konfigurationsoptionen `domain` und `debug` können nun ganz bequem typsicher in Providern verwendet werden.",
"The values of the options themselves can be set via `configure()`.": "Die Werte der Optionen selbst können über `configure()` gesetzt werden.",
"Options that do not have a default value but are still necessary can be provided with a `!`. This forces the user of the module to provide the value, otherwise an error will occur.": "Optionen, die keinen Standardwert haben, aber dennoch notwendig sind, können mit einem `!` versehen werden. Dies zwingt den Benutzer des Moduls, den Wert anzugeben, andernfalls tritt ein Fehler auf.",
"Also, all serialization and validation types from the previous chapters xref:validation.adoc[Validation] and xref:serialization.adoc[Serialization] can be used to specify in great detail what type and content restrictions an option must have.": "Außerdem können alle Serialisierungs- und Validierungstypen aus den vorangegangenen Kapiteln xref:validation.adoc[Validierung] und xref:serialization.adoc[Serialisierung] verwendet werden, um sehr detailliert anzugeben, welche Typ- und Inhaltsbeschränkungen eine Option haben muss.",
"Injection": "Einspritzung",
"Configuration options, like other dependencies, can be safely and easily injected through the DI container as shown earlier. The simplest method is to reference a single option using the index access operator:": "Konfigurationsoptionen können wie andere Abhängigkeiten sicher und einfach durch den DI-Container injiziert werden, wie zuvor gezeigt. Die einfachste Methode ist der Verweis auf eine einzelne Option mit Hilfe des Indexzugriffsoperators:",
"Configuration options can be referenced not only individually, but also as a group. The TypeScript utility type `Partial` is used for this purpose:": "Konfigurationsoptionen können nicht nur einzeln, sondern auch als Gruppe referenziert werden. Zu diesem Zweck wird der TypeScript-Dienstprogrammtyp `Partial` verwendet:",
"To get all configuration options, the configuration class can also be referenced directly:": "Um alle Konfigurationsoptionen zu erhalten, kann die Konfigurationsklasse auch direkt referenziert werden:",
"However, it is recommended to reference only the configuration options that are actually used. This not only simplifies unit tests, but also makes it easier to see what is actually needed from the code.": "Es wird jedoch empfohlen, nur auf die Konfigurationsoptionen zu verweisen, die tatsächlich verwendet werden. Dies vereinfacht nicht nur die Unit-Tests, sondern macht es auch einfacher zu erkennen, was im Code tatsächlich benötigt wird.",
"Scopes": "Geltungsbereiche",
"By default, all providers of the DI container are singletons and are therefore instantiated only once. This means that in the example of UserRepository there is always only one instance of UserRepository during the entire runtime. At no time is a second instance created, unless the user does this manually with the \"new\" keyword.": "Standardmäßig sind alle Provider des DI-Containers Singletons und werden daher nur einmal instanziiert. Das bedeutet, dass es im Beispiel des UserRepository während der gesamten Laufzeit immer nur eine Instanz des UserRepository gibt. Zu keinem Zeitpunkt wird eine zweite Instanz erzeugt, es sei denn, der Benutzer tut dies manuell mit dem Schlüsselwort \"new\".",
"However, there are various use cases where a provider should only be instantiated for a short time or only during a certain event. Such an event could be, for example, an HTTP request or an RPC call. This would mean that a new instance is created for each event and after this instance is no longer used it is automatically removed (by the garbage collector).": "Es gibt jedoch verschiedene Anwendungsfälle, in denen ein Anbieter nur für kurze Zeit oder nur während eines bestimmten Ereignisses instanziiert werden soll. Ein solches Ereignis könnte z. B. eine HTTP-Anfrage oder ein RPC-Aufruf sein. Dies würde bedeuten, dass für jedes Ereignis eine neue Instanz erstellt wird und diese Instanz, nachdem sie nicht mehr verwendet wird, automatisch (durch den Garbage Collector) entfernt wird.",
"An HTTP request is a classic example of a scope. For example, providers such as a session, a user object, or other request-related providers can be registered to this scope. To create a scope, simply choose an arbitrary scope name and then specify it with the providers.": "Eine HTTP-Anfrage ist ein klassisches Beispiel für einen Bereich. In diesem Bereich können z. B. Anbieter wie eine Sitzung, ein Benutzerobjekt oder andere anfragebezogene Anbieter registriert werden. Um einen Bereich zu erstellen, wählen Sie einfach einen beliebigen Bereichsnamen und geben ihn dann mit den Anbietern an.",
"Once a scope is specified, this provider cannot be obtained directly from the DI container, so the following call will fail:": "Sobald ein Bereich angegeben ist, kann dieser Anbieter nicht direkt vom DI-Container bezogen werden, so dass der folgende Aufruf fehlschlägt:",
"Instead, a scoped DI container must be created. This would happen every time an HTTP request comes in:": "Stattdessen muss ein scoped DI-Container erstellt werden. Dies würde jedes Mal geschehen, wenn eine HTTP-Anforderung eingeht:",
"Providers that are also registered in this scope can now be requested on this scoped DI container, as well as all providers that have not defined a scope.": "Anbieter, die ebenfalls in diesem Geltungsbereich registriert sind, können nun auf diesem DI-Container mit Geltungsbereich angefragt werden, ebenso wie alle Anbieter, die keinen Geltungsbereich definiert haben.",
"Since all providers are singleton by default, each call to `get(UserSession)` will always return the same instance per scoped container. If you create multiple scoped containers, multiple UserSessions will be created.": "Da alle Anbieter standardmäßig Singletons sind, gibt jeder Aufruf von \"get(UserSession)\" immer dieselbe Instanz pro Container zurück. Wenn Sie mehrere \"scoped\" Container erstellen, werden auch mehrere UserSessions erstellt.",
"Scoped DI containers have the ability to set values dynamically from the outside. For example, in an HTTP scope, it is easy to set the HttpRequest and HttpResponse objects.": "Scoped-DI-Container haben die Möglichkeit, Werte dynamisch von außen zu setzen. In einem HTTP-Bereich ist es beispielsweise einfach, die Objekte HttpRequest und HttpResponse zu setzen.",
"Applications using the Deepkit framework have by default an `http`, an `rpc`, and a `cli` scope. See respectively the chapter xref:cli.adoc[CLI], xref:http.adoc[HTTP], or xref:rpc.adoc[RPC].": "Anwendungen, die das Deepkit-Framework verwenden, haben standardmäßig einen `http`, einen `rpc` und einen `cli`-Bereich. Siehe jeweils das Kapitel xref:cli.adoc[CLI], xref:http.adoc[HTTP] oder xref:rpc.adoc[RPC].",
"Setup Calls": "Anrufe einrichten",
"Setup calls allow to manipulate the result of a provider. This is useful for example to use another dependency injection variant, the method injection.": "Setup-Aufrufe ermöglichen es, das Ergebnis eines Anbieters zu manipulieren. Dies ist zum Beispiel nützlich, um eine andere Variante der Dependency Injection, die Methodeninjektion, zu verwenden.",
"Setup calls can only be used with the module API or the app API and are registered above the module.": "Setup-Aufrufe können nur mit der Modul-API oder der App-API verwendet werden und werden oberhalb des Moduls registriert.",
"The `setupProvider` method thereby returns a proxy object of UserRepository on which its methods can be called. It should be noted that these method calls are merely placed in a queue and are not executed at this time. Accordingly, no return value is returned.": "Die Methode `setupProvider` gibt dabei ein Proxy-Objekt von UserRepository zurück, auf dem dessen Methoden aufgerufen werden können. Es ist zu beachten, dass diese Methodenaufrufe lediglich in eine Warteschlange gestellt werden und zu diesem Zeitpunkt nicht ausgeführt werden. Dementsprechend wird auch kein Rückgabewert zurückgegeben.",
"In addition to method calls, properties can also be set.": "Zusätzlich zu den Methodenaufrufen können auch Eigenschaften festgelegt werden.",
"This assignment is also simply placed in a queue.": "Auch dieser Auftrag wird einfach in eine Warteschlange gestellt.",
"The calls or the assignments in the queue are then executed on the actual result of the provider as soon as this is created. That is with a ClassProvider these are applied to the class instance, as soon as the instance is created, with a FactoryProvider on the result of the Factory, and with a ValueProvider on the Provider.": "Die Aufrufe bzw. die Zuweisungen in der Warteschlange werden dann auf das eigentliche Ergebnis des Providers ausgeführt, sobald dieses erstellt ist. D.h. bei einem ClassProvider werden diese auf die Klasseninstanz angewendet, sobald die Instanz erstellt ist, bei einem FactoryProvider auf das Ergebnis der Factory und bei einem ValueProvider auf den Provider.",
"To reference not only static values, but also other providers, the function `injectorReference` can be used. This function returns a reference to a provider, which is also requested by the DI container when the setup calls are executed.": "Um nicht nur statische Werte, sondern auch andere Provider zu referenzieren, kann die Funktion `injectorReference` verwendet werden. Diese Funktion gibt einen Verweis auf einen Provider zurück, der auch vom DI-Container angefordert wird, wenn die Setup-Aufrufe ausgeführt werden.",
"*Abstractions/Interfaces*": "*Abstraktionen/Schnittstellen*",
"Setup calls can also be assigned to an interface.": "Einrichtungsanrufe können auch einer Schnittstelle zugewiesen werden.",
"Event System": "Event System",
"Ein Event-System ermöglicht es Anwendungskomponenten im selben Prozess miteinander zu kommunizieren, indem sie Ereignisse versenden und auf sie hören. Es hilft bei der Modularisierung des Codes, indem Nachrichten zwischen Funktionen gesendet werden, die nicht direkt voneinander wissen.": "Ein Event-System ermöglicht es Anwendungskomponenten im selben Prozess miteinander zu kommunizieren, indem sie Ereignisse versenden und auf sie hören. Es hilft bei der Modularisierung des Codes, indem Nachrichten zwischen Funktionen gesendet werden, die nicht direkt voneinander wissen.",
"Die Anwendung oder Library eröffnet dabei die Möglichkeit an einem bestimmten Zeitpunkt der Ausführung zusätzliche Funktionen auszuführen. Diese zusätzlichen Funktionen registrieren sich dabei selbst als sogenannte Event-Listener.": "Die Anwendung oder Bibliothek eröffnet dabei die Möglichkeit, an einem bestimmten Zeitpunkt der Ausführung zusätzliche Funktionen auszuführen. Diese zusätzlichen Funktionen registrieren sich dabei selbst als sogenannte Event-Listener.",
"Ein Event kann dabei vielfältig sein:": "Ein Event kann dabei vielfältig sein:",
"Die Anwendung fährt hoch oder runter.": "Die Anwendung fährt hoch oder runter.",
"Ein neuer User wurde erstellt oder gelöscht.": "Ein neuer Benutzer wurde erstellt oder gelöscht.",
"Eine Error wurde geworfen.": "Ein Fehler wurde geworfen.",
"Ein neuer HTTP-Request ist hereingekommen.": "Ein neuer HTTP-Request ist eingetroffen.",
"Deepkit Framework und seine Libraries bieten bereits diverse Events an, auf die der Benutzer hören und reagieren kann. Es können jedoch auch beliebig viele eigene Events angelegt werden, um so die Anwendung modular erweiterbar zu machen.": "Deepkit Framework und seine Libraries bieten bereits diverse Events an, auf die der Benutzer hören und reagieren kann. Es können jedoch auch beliebig viele eigene Events angelegt werden, um so die Anwendung modular erweiterbar zu machen.",
"Nachfolgend ein Beispiel der Low-Level API von `@deepkit/event`. Wenn Deepkit Framework genutzt wird, geschieht die Registrierung von Event-Listener nicht über `EventDispatcher` direkt sondern über Module.": "Nachfolgend ein Beispiel der Low-Level API von `@deepkit/event`. Wenn Deepkit Framework genutzt wird, geschieht die Registrierung von Event-Listener nicht über `EventDispatcher` direkt sondern über Module.",
"Da das Event-System von Deepkit basiert auf den Runtime Types basiert, ist es notwendig `@deepkit/type` bereits korrekt installiert zu haben. Siehe dazu xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Da das Event-System von Deepkit auf den Runtime Types basiert, ist es notwendig `@deepkit/type` bereits korrekt installiert zu haben. Siehe dazu xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"Falls dies erfolgreich geschehen ist, kann `@deepkit/event` installiert werden oder das Deepkit Framework welches die Library bereits unter der Haube benutzt.": "Falls dies erfolgreich geschehen ist, kann `@deepkit/event` installiert werden oder das Deepkit Framework welches die Library bereits unter der Haube benutzt.",
"Zu beachten ist, dass `@deepkit/event` für die Controller API auf TypeScript-Decorators basiert und dieses Feature entsprechend mit `experimentalDecorators` aktiviert werden muss, sobald die Controller API verwendet wird.": "Zu beachten ist, dass `@deepkit/event` für die Controller API auf TypeScript-Decorators basiert und dieses Feature entsprechend mit `experimentalDecorators` aktiviert werden muss, sobald die Controller API verwendet wird.",
"Sobald die Library installiert ist, kann die API davon direkt benutzt werden.": "Sobald die Bibliothek installiert ist, kann die API davon direkt benutzt werden.",
"Event Token": "Ereignis-Token",
"Im Mittelpunkt vom Event-System stehen die Event-Tokens. Sie sind Objekte, die die eindeutige Event-ID und den Event-Typen definieren. Über ein Event-Token kann ein Event ausgelöst und auf ein Event gehört werden. Dabei ist konzeptionell derjenige, der den Event eines Event-Tokens auslöst, auch der Besitzer dieses Event-Tokens. Das Event-Token entscheidet entsprechend darüber, welche Daten an dem Event verfügbar sind und ob asynchrone Event-Listener erlaubt werden.": "Im Mittelpunkt vom Event-System stehen die Event-Tokens. Sie sind Objekte, die die eindeutige Event-ID und den Event-Typen definieren. Über einen Event-Token kann ein Event ausgelöst und auf ein Event gehört werden. Dabei ist konzeptionell derjenige, der den Event eines Event-Tokens auslöst, auch der Besitzer dieses Event-Tokens. Das Event-Token entscheidet entsprechend darüber, welche Daten an dem Event verfügbar sind und ob asynchrone Event-Listener erlaubt werden.",
"TODO asynchrone": "TODO asynchrone",
"Event Types": "Ereignis-Typen",
"Propagation": "Ausbreitung",
"TODO. event.stop()": "TODO. event.stop()",
"CLI": "CLI",
"Command-line Interface (CLI) Programme sind Programme, die über das Terminal in Form von Text-Eingabe und Text-Ausgabe interagieren. Der Vorteil in dieser Variante mit der Anwendung zu interagieren, ist, dass lediglich ein Terminal entweder lokal oder über eine SSH-Verbindung bestehen muss.": "Command-line Interface (CLI) Programme sind Programme, die über das Terminal in Form von Text-Eingabe und Text-Ausgabe interagieren. Der Vorteil in dieser Variante mit der Anwendung zu interagieren, ist, dass lediglich ein Terminal entweder lokal oder über eine SSH-Verbindung bestehen muss.",
"Eine CLI-Anwendung in Deepkit hat den vollen Zugriff auf den DI-Container und kann so auf alle Provider und Konfigurationsoptionen zugreifen.": "Eine CLI-Anwendung in Deepkit hat den vollen Zugriff auf den DI-Container und kann so auf alle Provider und Konfigurationsoptionen zugreifen.",
"Die Argumente und Optionen der CLI-Anwendung werden über Methoden-Parameter via TypeScript Typen gesteuert und werden automatisch serialisiert und validiert.": "Die Argumente und Optionen der CLI-Anwendung werden über Methoden-Parameter via TypeScript Typen gesteuert und werden automatisch serialisiert und validiert.",
"CLI ist einer von drei Einstiegspunkten zu einer Deepkit Framework Anwendung. Im Deepkit Framework wird die Anwendung immer über ein CLI-Program gestartet, das selbst vom User in TypeScript geschrieben ist. Es gibt daher keine Deepkit spezifisches globales CLI tool, um eine Deepkit Anwendung zu starten. Auf diese Weise starten Sie den HTTP/RPC-Server, führen Migrationen aus oder führen eigene Befehle aus. Das alles geschieht über denselben Einstiegspunkt, dieselbe Datei. Sobald das Deepkit Framework durch den Import von `FrameworkModule` aus `@deepkit/framework` benutzt wird, erhält die Anwendung zusätzliche Commands für den Application Server, Migrations, und mehr.": "CLI ist einer von drei Einstiegspunkten zu einer Deepkit Framework Anwendung. Im Deepkit Framework wird die Anwendung immer über ein CLI-Programm gestartet, das selbst vom Anwender in TypeScript geschrieben ist. Es gibt daher kein Deepkit-spezifisches globales CLI-Tool, um eine Deepkit-Anwendung zu starten. Auf diese Weise starten Sie den HTTP/RPC-Server, führen Migrationen aus oder führen eigene Befehle aus. Das alles geschieht über denselben Einstiegspunkt, dieselbe Datei. Sobald das Deepkit Framework durch den Import von `FrameworkModule` aus `@deepkit/framework` benutzt wird, erhält die Anwendung zusätzliche Befehle für den Application Server, Migrationen, und mehr.",
"Das CLI-Framework erlaubt es auf einfache Art eigene Commands zu registrieren und basiert dabei auf einfachen Klassen. Tatsächlich basiert es auf `@deepkit/app`, einem kleinen Paket, das nur für diesen Zweck gedacht ist und auch eigenständig ohne das Deepkit Framework verwendet werden kann. In diesem Paket finden sich Decorators, die benötigt werden, um die CLI-Controller-Klasse zu dekorieren.": "Das CLI-Framework erlaubt es auf einfache Art eigene Commands zu registrieren und basiert dabei auf einfachen Klassen. Tatsächlich basiert es auf `@deepkit/app`, einem kleinen Paket, das nur für diesen Zweck gedacht ist und auch eigenständig ohne das Deepkit Framework verwendet werden kann. In diesem Paket finden sich Decorators, die benötigt werden, um die CLI-Controller-Klasse zu dekorieren.",
"Controller werden vom Dependency Injection Container verwaltet beziehungsweise instanziiert und können daher andere Provider verwenden. Siehe das Kapitel xref:dependency-injection.adoc[Dependency Injection] für weitere Details.": "Controller werden vom Dependency Injection Container verwaltet beziehungsweise instanziiert und können daher andere Provider verwenden. Siehe das Kapitel xref:dependency-injection.adoc[Dependency Injection] für weitere Details.",
"Da CLI-Programme in Deepkit auf den Runtime Types basieren, ist es notwendig @deepkit/type bereits korrekt installiert zu haben. Siehe dazu xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Da CLI-Programme in Deepkit auf den Runtime Types basieren, ist es notwendig @deepkit/type bereits korrekt installiert zu haben. Siehe dazu xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"Falls dies erfolgreich geschehen ist, kann @deepkit/app installiert werden oder das Deepkit Framework welches die Library bereits unter der Haube benutzt.": "Falls dies erfolgreich geschehen ist, kann @deepkit/app installiert werden oder das Deepkit Framework welches die Library bereits unter der Haube benutzt.",
"Zu beachten ist, dass `@deepkit/app` auf TypeScript-Decorators basiert und dieses Feature entsprechend mit `experimentalDecorators` aktiviert werden muss.": "Zu beachten ist, dass `@deepkit/app` auf TypeScript-Decorators basiert und dieses Feature entsprechend mit `experimentalDecorators` aktiviert werden muss.",
"Benutzung": "Benutzung",
"Um einen Befehl für Ihre Anwendung zu erstellen, müssen Sie einen CLI-Controller erstellen. Dabei handelt es sich um eine einfache Klasse, die eine Methode `exeecute` hat und mit Informationen über den Befehl ausgestattet ist.": "Um einen Befehl für Ihre Anwendung zu erstellen, müssen Sie einen CLI-Controller erstellen. Dabei handelt es sich um eine einfache Klasse, die eine Methode `execute` hat und mit Informationen über den Befehl ausgestattet ist.",
"_File: app.ts_": "_Datei: app.ts_",
"In dem Decorator `@cli.controller` wird als erstes Argument der eindeutige Name der CLI-Anwendung definiert. Weitere Optionen wie eine Beschreibung können im Objekt an der zweiten Stelle optional hinzufügt werden.": "In dem Decorator `@cli.controller` wird als erstes Argument der eindeutige Name der CLI-Anwendung definiert. Weitere Optionen wie eine Beschreibung können im Objekt an der zweiten Stelle optional hinzufügt werden.",
"Dieser Code ist bereits eine komplette CLI-Anwendung und kann so gestartet werden:": "Dieser Code ist bereits eine komplette CLI-Anwendung und kann so gestartet werden:",
"Zu sehen ist, dass ein \"test\" Command verfügbar ist. Um dieses auszuführen, muss der Name als Argument übergeben werden:": "Zu sehen ist, dass ein \"test\"-Befehl verfügbar ist. Um dies auszuführen, muss der Name als Argument übergeben werden:",
"Es ist auch möglich, die Datei mittels `chmod +x app.ts` ausführbar zu machen, sodass der Command `./app.ts` bereits ausreicht, um es zu starten. Zu beachten ist, dass dann ein sogenannter": "Es ist auch möglich, die Datei mittels `chmod +x app.ts` ausführbar zu machen, sodass der Befehl `./app.ts` bereits ausreicht, um es zu starten. Zu beachten ist, dass dann ein sogenannter",
"Shebang notwendig ist. Shebang bezeichnet die Zeichenkombination `#!` am Anfang eines Skriptprogramms. In dem Beispiel oben ist dies bereits vorhanden: `#!/usr/bin/env ts-node-script` und nutzt den Skript-Modus von `ts-node`.": "Shebang ist notwendig. Shebang bezeichnet die Zeichenkombination `#!` am Anfang eines Skriptprogramms. In dem Beispiel oben ist dies bereits vorhanden: `#!/usr/bin/env ts-node-script` und nutzt den Skript-Modus von `ts-node`.",
"Auf diese Weise können beliebig viele Commands erstellt und registriert werden. Der in `@cli.controller` angegeben eindeutige Name sollte gut gewählt werden und erlaubt das Gruppieren von Commands mit dem `:` Zeichen (z.B. `user:create`, `user:remove`, etc).": "Auf diese Weise können beliebig viele Commands erstellt und registriert werden. Der in `@cli.controller` angegebene eindeutige Name sollte gut gewählt werden und erlaubt das Gruppieren von Commands mit dem `:` Zeichen (z.B. `user:create`, `user:remove`, etc).",
"Argumente": "Argumente",
"Um Argumente hinzuzufügen, werden neue Parameter auf die Methode `execute` hinzugefügt und mit dem Decorator `@arg` dekoriert.": "Um Argumente hinzuzufügen, werden neue Parameter auf die Methode `execute` hinzugefügt und mit dem Decorator `@arg` dekoriert.",
"Wenn Sie diesen Befehl jetzt ausführen, ohne einen Namen anzugeben, wird ein Fehler ausgegeben:": "Wenn Sie diesen Befehl jetzt ausführen, ohne einen Namen anzugeben, wird ein Fehler ausgegeben:",
"Durch die Verwendung von `--help` erhalten Sie weitere Informationen über die erforderlichen Argumente:": "Durch die Verwendung von `--help` erhalten Sie weitere Informationen über die erforderlichen Argumente:",
"Sobald der Name als Argument übergeben wird, wird die Methode `execute` in TestCommand ausgeführt und der Name korrekt übergeben.": "Sobald der Name als Argument übergeben wird, wird die Methode `execute` in TestCommand ausgeführt und der Name korrekt übergeben.",
"Flags": "Flaggen",
"Flags sind eine weitere Möglichkeit, Ihrem Befehl Werte zu übergeben. Meist sind diese Optional, doch müssen es nicht sein. Parameter, die mit `@flag name` dekoriert sind, können via `--name value` oder `--name=value` übergeben werden.": "Flaggen sind eine weitere Möglichkeit, Ihrem Befehl Werte zu übergeben. Meist sind diese Optional, doch müssen es nicht sein. Parameter, die mit `@flag name` dekoriert sind, können über `--name value` oder `--name=value` übergeben werden.",
"In der Hilfe-Ansicht ist in den \"OPTIONS\" nun zu sehen, dass ein `--id` Flag notwendig ist. Gibt man dieses Korrekt an, erhält der Command diesen Wert.": "In der Hilfe-Ansicht ist in den \"OPTIONS\" nun zu sehen, dass ein `--id` Flag notwendig ist. Gibt man diesen Korrekt an, erhält der Befehl diesen Wert.",
"Boolean Flags": "Boolesche Flaggen",
"Flags haben den Vorteil, dass sie auch als wertlosen Flag verwendet werden können, um so zum Beispiel ein bestimmtes Verhalten zu aktivieren. Sobald ein Parameter als optionaler Boolean markiert ist, wird dieses Verhalten aktiviert.": "Flaggen haben den Vorteil, dass sie auch als wertlose Flagge verwendet werden können, um so zum Beispiel ein bestimmtes Verhalten zu aktivieren. Sobald ein Parameter als optionaler Boolean markiert ist, wird dieses Verhalten aktiviert.",
"Multiple Flags": "Mehrere Flaggen",
"Um mehrere Werte demselben Flag zu übergeben, kann ein Flag als Array markiert werden.": "Um mehrere Werte demselben Flag zu übergeben, kann ein Flag als Array markiert werden.",
"Single Character Flags": "Einzelzeichen-Flags",
"Um einem Flag zu erlauben, auch als ein einzelner Charakter übergeben zu werden, kann `@flag.char('x')` genutzt werden.": "Um einem Flag zu erlauben, auch als ein einzelner Charakter übergeben zu werden, kann `@flag.char('x')` verwendet werden.",
"Optional / Default": "Optional / Standard",
"Die Signatur der Methode `execute` definiert, welche Argument oder Flags optional sind. Ist der Parameter als Optional markiert, so muss er nicht angegeben werden.": "Die Signatur der Methode `execute` definiert, welche Argumente oder Flags optional sind. Ist der Parameter als Optional markiert, so muss er nicht angegeben werden.",
"Dasselbe für Parameter mit einem Default-Wert:": "Dasselbe gilt für Parameter mit einem Standardwert:",
"Dies gilt auch für Flags in derselben Art und Weise.": "Dies gilt auch für Flaggen in derselben Art und Weise.",
"Serialization / Validation": "Serialisierung / Validierung",
"Alle Argumente und Flags werden automatisch basierend auf dessen Typen deserialisiert, validiert und können mit zusätzlichen Einschränkungen versehen werden.": "Alle Argumente und Flaggen werden automatisch basierend auf dessen Typen deserialisiert, validiert und können mit zusätzlichen Einschränkungen versehen werden.",
"So sind Argument, die als Number definiert sind, in dem Controller auch garantiert immer eine echte Nummer, obwohl das Command-Line Interface auf Text und somit Strings basiert. Die Umwandlung passiert dabei automatisch mit dem Feature xref:serialization.adoc#serialisation-loosely-convertion[Weiche Typenkonvertierung].": "So sind Argumente, die als Nummer definiert sind, in dem Controller auch garantiert immer eine echte Nummer, obwohl das Command-Line Interface auf Text und somit Strings basiert. Die Umwandlung geschieht dabei automatisch mit dem Feature xref:serialization.adoc#serialisation-loosely-convertion[Weiche Typenkonvertierung].",
"Zusätzliche Einschränkungen können mit den Typen-Decorators aus `@deepkit/type` definiert werden.": "Zusätzliche Einschränkungen können mit den Typen-Decoratoren aus `@deepkit/type` definiert werden.",
"Der Typ `Postive` bei `id` gibt an, dass nur positive Nummern gewollt sind. Übergibt der User nun eine negative Zahl, so wird der Code in `execute` gar nicht erst ausgeführt und es wird eine Fehlermeldung präsentiert.": "Der Typ `Postive` bei `id` gibt an, dass nur positive Nummern gewollt sind. Übergibt der User nun eine negative Zahl, so wird der Code in `execute` gar nicht erst ausgeführt und es wird eine Fehlermeldung präsentiert.",
"Bei einer positiven Nummer funktioniert dies dann wieder wie zuvor. Durch diese zusätzliche sehr einfach zu bewerkstelligende Validierung, wird der Command deutlich robuster gegen Falscheingaben geschützt. Sieh dazu das Kapitel xref:validation.adoc[Validation] für mehr Informationen.": "Bei einer positiven Nummer funktioniert dies dann wieder wie zuvor. Durch diese zusätzliche sehr einfach zu bewerkstelligende Validierung, wird der Command deutlich robuster gegen Falscheingaben geschützt. Sieh dazu das Kapitel xref:validation.adoc[Validation] für mehr Informationen.",
"Description": "Beschreibung",
"Um einen Flag oder Argument zu beschreiben, kann `@flag.description` beziehungsweise `@arg.description` genutzt werden.": "Um ein Flag oder Argument zu beschreiben, kann `@flag.description` beziehungsweise `@arg.description` genutzt werden.",
"In der Hilfe-Ansicht erscheint diese Beschreibung hinter dem Flag beziehungsweise Argument:": "In der Hilfe-Ansicht erscheint diese Beschreibung hinter dem Flag beziehungsweise Argument:",
"Exit code": "Exit-Code",
"Der Exit-Code ist standardmäßig 0, was bedeutet, dass der Befehl erfolgreich ausgeführt wurde. Um den Exit-Code zu ändern, sollten in der `exucute`-Methode eine Zahl ungleich 0 zurückgeben werden.": "Der Exit-Code ist standardmäßig 0, was bedeutet, dass der Befehl erfolgreich ausgeführt wurde. Um den Exit-Code zu ändern, sollte in der `exucute`-Methode eine Zahl ungleich 0 zurückgegeben werden.",
"Die Klasse des Commands wird vom DI Container verwaltet, sodass Abhängigkeiten definiert werden können, die über den DI Container aufgelöst werden.": "Die Klasse des Commands wird vom DI Container verwaltet, sodass Abhängigkeiten definiert werden können, die über den DI Container aufgelöst werden.",
"HTTP": "HTTP",
"Processing HTTP requests is one of the most well-known tasks for a server. It converts an input (HTTP request) into an output (HTTP response) and performs a specific task. A client can send data to the server via an HTTP request in a variety of ways, which must be read and handled correctly. In addition to the HTTP body, HTTP query or HTTP header values are also possible. How data is actually processed depends on the server. It is the server that defines where and how the values are to be sent by the client.": "Die Verarbeitung von HTTP-Anfragen ist eine der bekanntesten Aufgaben eines Servers. Er wandelt eine Eingabe (HTTP-Anfrage) in eine Ausgabe (HTTP-Antwort) um und führt eine bestimmte Aufgabe aus. Ein Client kann über eine HTTP-Anfrage auf unterschiedliche Weise Daten an den Server senden, die gelesen und korrekt verarbeitet werden müssen. Neben dem HTTP-Body sind auch HTTP-Query- oder HTTP-Header-Werte möglich. Wie die Daten tatsächlich verarbeitet werden, hängt vom Server ab. Der Server legt fest, wohin und wie die Werte vom Client gesendet werden sollen.",
"The top priority here is not only to correctly execute what the user expects, but to correctly convert (deserialize) and validate any input from the HTTP request.": "Oberste Priorität hat dabei nicht nur die korrekte Ausführung dessen, was der Benutzer erwartet, sondern auch die korrekte Konvertierung (Deserialisierung) und Validierung aller Eingaben aus der HTTP-Anfrage.",
"The pipeline through which an HTTP request passes on the server can be varied and complex. Many simple HTTP libraries pass only the HTTP request and the HTTP response for a given route, and expect the developer to process the HTTP response directly. A middleware API allows the pipeline to be extended as needed.": "Die Pipeline, die eine HTTP-Anfrage auf dem Server durchläuft, kann vielfältig und komplex sein. Viele einfache HTTP-Bibliotheken übergeben nur die HTTP-Anfrage und die HTTP-Antwort für eine bestimmte Route und erwarten, dass der Entwickler die HTTP-Antwort direkt verarbeitet. Mit einer Middleware-API kann die Pipeline nach Bedarf erweitert werden.",
"_Express Beispiel_": "_Express Beispiel_",
"This is very well tailored for simple use cases, but quickly becomes confusing as the application grows, since all inputs and outputs must be manually serialized or deserialized and validated. Also, consideration must be given to how objects and services such as a database abstraction can be obtained from the application itself. It forces the developer to put an architecture on top of it that maps these mandatory functionalities.": "Dies ist für einfache Anwendungsfälle sehr gut geeignet, wird aber schnell unübersichtlich, wenn die Anwendung wächst, da alle Ein- und Ausgaben manuell serialisiert oder deserialisiert und validiert werden müssen. Außerdem muss überlegt werden, wie Objekte und Dienste, z. B. eine Datenbankabstraktion, von der Anwendung selbst bezogen werden können. Dies zwingt den Entwickler dazu, eine Architektur aufzusetzen, die diese obligatorischen Funktionalitäten abbildet.",
"Deepkit's HTTP Library leverages the power of TypeScript and Dependency Injection. SerializationDeserialization and validation of any values happen automatically based on the defined types. It also allows defining routes either via a functional API as in the example above or via controller classes to cover the different needs of an architecture.": "Die HTTP-Bibliothek von Deepkit nutzt die Leistungsfähigkeit von TypeScript und Dependency Injection. SerialisierungDesialisierung und Validierung von Werten erfolgen automatisch auf der Grundlage der definierten Typen. Außerdem können Routen entweder über eine funktionale API wie im obigen Beispiel oder über Controller-Klassen definiert werden, um die verschiedenen Anforderungen einer Architektur abzudecken.",
"It can be used either with an existing HTTP server like Node's `http` module or with the Deepkit framework. Both API variants have access to the dependency injection container and can thus conveniently retrieve objects such as a database abstraction and configurations from the application.": "Sie kann entweder mit einem vorhandenen HTTP-Server wie dem `http`-Modul von Node oder mit dem Deepkit-Framework verwendet werden. Beide API-Varianten haben Zugriff auf den Dependency Injection Container und können so bequem Objekte wie eine Datenbankabstraktion und Konfigurationen aus der Anwendung abrufen.",
"_Deepkit Example_": "_Deepkit Beispiel_",
"Since CLI programs in Deepkit are based on runtime types, it is necessary to have `@deepkit/type` already installed correctly. See for this xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Da CLI-Programme in Deepkit auf Laufzeittypen basieren, ist es notwendig, dass `@deepkit/type` bereits korrekt installiert ist. Siehe hierzu xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"If this is done successfully, `@deepkit/app` can be installed or the Deepkit framework which already uses the library under the hood.": "Wenn dies erfolgreich durchgeführt wurde, kann `@deepkit/app` oder das Deepkit-Framework, das die Bibliothek bereits unter der Haube verwendet, installiert werden.",
"Note that `@deepkit/http` for the controller API is based on TypeScript decorators and this feature must be enabled accordingly with `experimentalDecorators` once the controller API is used.": "Beachten Sie, dass `@deepkit/http` für die Controller-API auf TypeScript-Dekoratoren basiert und diese Funktion entsprechend mit `experimentalDecorators` aktiviert werden muss, sobald die Controller-API verwendet wird.",
"Functional API": "Funktionale API",
"The functional API is based on functions and can be registered via the router registry, which can be obtained via the DI container of the app.": "Die funktionale API basiert auf Funktionen und kann über die Router-Registrierung registriert werden, die über den DI-Container der App abgerufen werden kann.",
"The router registry can also be obtained in Event Listener or in the bootstrap, so that based on modules, configurations and other providers various routes are registered.": "Die Router-Registrierung kann auch im Event Listener oder im Bootstrap erfolgen, so dass auf der Grundlage von Modulen, Konfigurationen und anderen Anbietern verschiedene Routen registriert werden.",
"Once modules are used, functional routes can also be provided dynamically by modules.": "Sobald Module verwendet werden, können funktionale Routen auch dynamisch durch Module bereitgestellt werden.",
"See xref:framework.adoc#framework-modules[Framework Modules], to learn more about App Modules.": "Siehe xref:framework.adoc#framework-modules[Framework-Module], um mehr über App-Module zu erfahren.",
"Controller API": "Controller-API",
"The controller API is based on classes and can be registered via the App-API under the option `controllers`.": "Die Controller-API basiert auf Klassen und kann über die App-API unter der Option `controllers` registriert werden.",
"Once modules are used, controllers can also be provided by modules.": "Sobald Module verwendet werden, können auch Steuerungen durch Module bereitgestellt werden.",
"To provide controllers dynamically (depending on the configuration option, for example), the `process` hook can be used.": "Um Controller dynamisch bereitzustellen (z.B. abhängig von der Konfigurationsoption), kann der `process`-Hook verwendet werden.",
"HTTP Server": "HTTP-Server",
"If Deepkit Framework is used, an HTTP server is already built in. However, the HTTP library can also be used with its own HTTP server without using the Deepkit framework.": "Wenn das Deepkit-Framework verwendet wird, ist ein HTTP-Server bereits integriert. Die HTTP-Bibliothek kann jedoch auch mit einem eigenen HTTP-Server verwendet werden, ohne dass das Deepkit-Framework zum Einsatz kommt.",
"HTTP Client": "HTTP-Client",
"todo: fetch API, validation, und cast.": "todo: fetch API, Validierung, und cast.",
"Route Names": "Routen-Namen",
"Routes can be given a unique name that can be referenced when forwarding. Depending on the API, the way a name is defined differs.": "Routen können mit einem eindeutigen Namen versehen werden, auf den bei der Weiterleitung Bezug genommen werden kann. Je nach API ist die Art und Weise, wie ein Name definiert wird, unterschiedlich.",
"From all routes with a name the URL can be requested by `Router.resolveUrl()`.": "Von allen Routen mit einem Namen kann die URL durch `Router.resolveUrl()` angefordert werden.",
"The router functions as well as the controller classes and controller methods can define arbitrary dependencies, which are resolved by the dependency injection container. For example, it is possible to conveniently get to a database abstraction or logger.": "Sowohl die Router-Funktionen als auch die Controller-Klassen und Controller-Methoden können beliebige Abhängigkeiten definieren, die durch den Dependency Injection Container aufgelöst werden. So ist es zum Beispiel möglich, bequem zu einer Datenbankabstraktion oder einem Logger zu gelangen.",
"For example, if a database has been provided as a provider, it can be injected:": "Wenn zum Beispiel eine Datenbank als Provider bereitgestellt wurde, kann sie injiziert werden:",
"_Functional API:_": "_Funktions-API:_",
"_Controller API:_": "_Controller API:_",
"See xref:dependency-injection.adoc[Dependency Injection] to learn more.": "Siehe xref:dependency-injection.adoc[Dependency Injection] um mehr zu erfahren.",
"Input": "Eingabe",
"All of the following input variations function in the same way for both the functional and the controller API. They allow data to be read from an HTTP request in a type-safe and decoupled manner. This not only leads to significantly increased security, but also simplifies unit testing, since strictly speaking, not even an HTTP request object needs to exist to test the route.": "Alle folgenden Eingabevarianten funktionieren sowohl für die funktionale als auch für die Controller-API auf dieselbe Weise. Sie ermöglichen das typsichere und entkoppelte Lesen von Daten aus einer HTTP-Anfrage. Dies führt nicht nur zu einer deutlich erhöhten Sicherheit, sondern vereinfacht auch das Unit-Testing, da streng genommen nicht einmal ein HTTP-Request-Objekt existieren muss, um die Route zu testen.",
"All parameters are automatically converted (deserialized) to the defined TypeScript type and validated. This is done via the `@deepkit/type` package and its xref:serialization.adoc[Serialization] and xref:validation.adoc[Validation] features.": "Alle Parameter werden automatisch in den definierten TypeScript-Typ konvertiert (deserialisiert) und validiert. Dies geschieht über das Paket `@deepkit/type` und seine Funktionen xref:serialization.adoc[Serialisierung] und xref:validation.adoc[Validierung].",
"For simplicity, all examples with the functional API are shown below.": "Der Einfachheit halber werden im Folgenden alle Beispiele mit der funktionalen API gezeigt.",
"Path Parameters": "Pfad-Parameter",
"Path parameters are values extracted from the URL of the route. The type of the value depends on the type at the associated parameter of the function or method. The conversion is done automatically with the feature xref:serialization.adoc#serialisation-loosely-convertion[Soft Type Conversion].": "Pfadparameter sind Werte, die aus der URL der Route extrahiert werden. Der Typ des Wertes hängt von dem Typ des zugehörigen Parameters der Funktion oder Methode ab. Die Konvertierung erfolgt automatisch mit der Funktion xref:serialization.adoc#serialisation-loosely-convertion[Soft Type Conversion].",
"If a Path parameter is defined as a type other than string, it will be converted correctly.": "Wenn ein Pfadparameter als ein anderer Typ als String definiert ist, wird er korrekt konvertiert.",
"Additional validation constraints can also be applied to the types.": "Auf die Typen können auch zusätzliche Validierungsbeschränkungen angewendet werden.",
"All validation types from `@deepkit/type` can be applied. For more on this, see xref:http.adoc#http-validation[HTTP Validation]].": "Alle Validierungstypen aus `@deepkit/type` können angewendet werden. Mehr dazu finden Sie unter xref:http.adoc#http-validation[HTTP-Validierung]].",
"The Path parameters have `[^]+` set as a regular expression by default in the URL matching. The RegExp for this can be customized as follows:": "Für die Path-Parameter ist standardmäßig `[^]+` als regulärer Ausdruck für den URL-Abgleich festgelegt. Der RegExp dafür kann wie folgt angepasst werden:",
"This is only necessary in exceptional cases, because often the types in combination with validation types themselves already correctly restrict possible values.": "Dies ist nur in Ausnahmefällen notwendig, denn oft schränken die Typen in Kombination mit den Validierungstypen selbst die möglichen Werte bereits korrekt ein.",
"Query Parameters": "Abfrage-Parameter",
"Query parameters are values from the URL after the `?` character and can be read with the `HttpQuery<T>` type. The name of the parameter corresponds to the name of the query parameter.": "Abfrageparameter sind Werte aus der URL nach dem `?` Zeichen und können mit dem Typ `HttpQuery<T>` gelesen werden. Der Name des Parameters entspricht dem Namen des Abfrageparameters.",
"Query parameters are also automatically deserialized and validated.": "Auch die Abfrageparameter werden automatisch deserialisiert und validiert.",
"All validation types from `@deepkit/type` can be applied. For more on this, see xref:http.adoc#http-validation[HTTP Validation].": "Alle Validierungstypen aus `@deepkit/type` können angewendet werden. Mehr dazu finden Sie unter xref:http.adoc#http-validation[HTTP-Validierung].",
"Warning: Parameter values are not escaped/sanitized. Their direct return in a string in a route as HTML opens a security hole (XSS). Make sure that external input is never trusted and filtere/sanitize/convert data where necessary.": "Warnung: Parameterwerte werden nicht escaped/sanitized. Ihre direkte Rückgabe in einem String in einer Route als HTML öffnet eine Sicherheitslücke (XSS). Stellen Sie sicher, dass externen Eingaben niemals vertraut wird und filtern/sanieren/konvertieren Sie Daten, wo nötig.",
"Query Model": "Abfrage-Modell",
"With a large number of query parameters, it can quickly become confusing. To bring order back in here, a model (class or interface) can be used, which summarizes all possible query parameters.": "Bei einer großen Anzahl von Abfrageparametern kann es schnell unübersichtlich werden. Um hier wieder Ordnung hineinzubringen, kann ein Modell (Klasse oder Schnittstelle) verwendet werden, das alle möglichen Abfrageparameter zusammenfasst.",
"The properties in the specified model can contain all TypeScript types and validation types that `@deepkit/type` supports. See the chapter xref:serialization.adoc[Serialization] and xref:validation.adoc[Validation].": "Die Eigenschaften im angegebenen Modell können alle TypeScript-Typen und Validierungstypen enthalten, die `@deepkit/type` unterstützt. Siehe das Kapitel xref:serialization.adoc[Serialisierung] und xref:validation.adoc[Validierung].",
"Body": "Körper",
"For HTTP methods that allow an HTTP body, a body model can also be specified. The body content type of the HTTP request must be either `application/x-www-form-urlencoded`, `multipart/form-data` or `application/json` so that Deepkit can automatically convert this to JavaScript objects.": "Für HTTP-Methoden, die einen HTTP-Body zulassen, kann auch ein Body-Modell angegeben werden. Der Body-Inhaltstyp der HTTP-Anforderung muss entweder \"application/x-www-form-urlencoded\", \"multipart/form-data\" oder \"application/json\" sein, damit Deepkit diesen automatisch in JavaScript-Objekte umwandeln kann.",
"Header": "Kopfzeile",
"Stream": "Stream",
"Manual Validation Handling": "Manuelle Handhabung der Validierung",
"To manually take over the validation of the body model, a special type `HttpBodyValidation<T>` can be used. It allows to receive also invalid body data and to react very specifically to error messages.": "Um die Validierung des Body-Modells manuell zu übernehmen, kann ein spezieller Typ `HttpBodyValidation<T>` verwendet werden. Er erlaubt es, auch ungültige Body-Daten zu empfangen und sehr gezielt auf Fehlermeldungen zu reagieren.",
"As soon as `valid()` returns `false`, the values in the specified model may be in a faulty state. This means that the validation has failed. If `HttpBodyValidation` is not used and an incorrect HTTP request is received, the request would be directly aborted and the code in the function would never be executed. Use `HttpBodyValidation` only if, for example, error messages regarding the body should be manually processed in the same route.": "Sobald `valid()` den Wert `false` zurückgibt, können sich die Werte im angegebenen Modell in einem fehlerhaften Zustand befinden. Dies bedeutet, dass die Validierung fehlgeschlagen ist. Wenn `HttpBodyValidation` nicht verwendet wird und eine fehlerhafte HTTP-Anfrage empfangen wird, würde die Anfrage direkt abgebrochen und der Code in der Funktion nie ausgeführt werden. Verwenden Sie `HttpBodyValidation` nur, wenn z.B. Fehlermeldungen bezüglich des Bodys in der gleichen Route manuell verarbeitet werden sollen.",
"File Upload": "Hochladen von Dateien",
"A special property type on the body model can be used to allow the client to upload files. Any number of `UploadedFile` can be used.": "Ein spezieller Eigenschaftstyp des Body-Modells kann verwendet werden, um dem Kunden das Hochladen von Dateien zu ermöglichen. Es kann eine beliebige Anzahl von \"UploadedFile\" verwendet werden.",
"By default, Router saves all uploaded files to a temp folder and removes them once the code in the route has been executed. It is therefore necessary to read the file in the specified path in `path` and save it to a permanent location (local disk, cloud storage, database).": "Standardmäßig speichert der Router alle hochgeladenen Dateien in einem temporären Ordner und löscht sie, sobald der Code in der Route ausgeführt worden ist. Es ist daher notwendig, die Datei im angegebenen Pfad in `path` zu lesen und sie an einem dauerhaften Ort zu speichern (lokale Festplatte, Cloud-Speicher, Datenbank).",
"Validation in an HTTP server is a mandatory functionality, because almost always work with data that is not trustworthy. The more places data is validated, the more stable the server is. Validation in HTTP routes can be conveniently used via types and validation constraints and is checked with a highly optimized validator from `@deepkit/type`, so there are no performance problems in this regard. It is therefore highly recommended to use these validation capabilities as well. Better one time too much, than one time too little.": "Die Validierung in einem HTTP-Server ist eine obligatorische Funktion, da fast immer mit Daten gearbeitet wird, die nicht vertrauenswürdig sind. Je mehr Stellen Daten validiert werden, desto stabiler ist der Server. Die Validierung in HTTP-Routen kann bequem über Typen und Validierungseinschränkungen genutzt werden und wird mit einem hochoptimierten Validator aus `@deepkit/type` überprüft, so dass es in dieser Hinsicht keine Leistungsprobleme gibt. Es ist daher sehr zu empfehlen, diese Validierungsmöglichkeiten auch zu nutzen. Lieber einmal zu viel, als einmal zu wenig.",
"All inputs such as path parameters, query parameters, and body parameters are automatically validated for the specified TypeScript type. If additional constraints are specified via types of `@deepkit/type`, these are also checked.": "Alle Eingaben wie Pfadparameter, Abfrageparameter und Body-Parameter werden automatisch auf den angegebenen TypeScript-Typ geprüft. Wenn zusätzliche Einschränkungen über Typen von `@deepkit/type` angegeben sind, werden diese ebenfalls überprüft.",
"See xref:validation.adoc[Validation] for more information on this.": "Weitere Informationen hierzu finden Sie in xref:validation.adoc[Validation].",
"Output": "Ausgabe",
"A route can return various data structures. Some of them are handled in a special way, such as redirects and templates, and others, such as simple objects, are simply sent as JSON.": "Eine Route kann verschiedene Datenstrukturen zurückgeben. Einige von ihnen werden auf besondere Weise behandelt, z. B. Umleitungen und Vorlagen, und andere, wie einfache Objekte, werden einfach als JSON gesendet.",
"JSON": "JSON",
"By default, normal JavaScript values are returned to the client as JSON with the header `applicationjson; charset=utf-8`.": "Standardmäßig werden normale JavaScript-Werte als JSON mit dem Header `applicationjson; charset=utf-8` an den Client zurückgegeben.",
"If an explicit return type is specified for the function or method, the data is serialized to JSON with the Deepkit JSON Serializer according to this type.": "Wenn für die Funktion oder Methode ein expliziter Rückgabetyp angegeben ist, werden die Daten mit dem Deepkit JSON Serializer entsprechend diesem Typ in JSON serialisiert.",
"HTML": "HTML",
"To send HTML there are two possibilities. Either the object `HtmlResponse` or Template Engine with TSX is used.": "Um HTML zu senden, gibt es zwei Möglichkeiten. Entweder wird das Objekt `HtmlResponse` oder Template Engine mit TSX verwendet.",
"The template engine variant with TSX has the advantage that used variables are automatically HTML-escaped. See also xref:template.adoc[Template].": "Die Template-Engine-Variante mit TSX hat den Vorteil, dass verwendete Variablen automatisch HTML-escaped werden. Siehe auch xref:template.adoc[Template].",
"Custom Content": "Benutzerdefinierter Inhalt",
"Besides HTML and JSON it is also possible to send text or binary data with a specific content type. This is done via the object `Response`.": "Neben HTML und JSON ist es auch möglich, Text- oder Binärdaten mit einem bestimmten Inhaltstyp zu senden. Dies geschieht über das Objekt `Response`.",
"HTTP Errors": "HTTP-Fehler",
"By throwing various HTTP errors, it is possible to immediately interrupt the processing of an HTTP request and output the corresponding HTTP status of the error.": "Durch das Auslösen verschiedener HTTP-Fehler ist es möglich, die Bearbeitung einer HTTP-Anfrage sofort zu unterbrechen und den entsprechenden HTTP-Status des Fehlers auszugeben.",
"By default, all errors are returned to the client as JSON. This behavior can be customized in the event system under the event `httpWorkflow.onControllerError`. See the section xref:http.adoc#http-events[HTTP Events].": "Standardmäßig werden alle Fehler als JSON an den Client zurückgegeben. Dieses Verhalten kann im Event-System unter dem Ereignis `httpWorkflow.onControllerError` angepasst werden. Siehe den Abschnitt xref:http.adoc#http-events[HTTP Events].",
"The error `HttpAccessDeniedError` is a special case. As soon as it is thrown, the HTTP workflow (see xref:http.adoc#http-events[HTTP Events]) does not jump to `controllerError` but to `accessDenied`.": "Der Fehler `HttpAccessDeniedError` ist ein Sonderfall. Sobald er ausgelöst wird, springt der HTTP-Workflow (siehe xref:http.adoc#http-events[HTTP Events]) nicht zu `controllerError` sondern zu `accessDenied`.",
"Custom HTTP errors can be created and thrown with `createHttpError`.": "Benutzerdefinierte HTTP-Fehler können mit `createHttpError` erstellt und ausgelöst werden.",
"Additional headers": "Zusätzliche Überschriften",
"To modify the header of an HTTP response, additional methods can be called on the `Response`, `JSONResponse`, and `HTMLResponse` objects.": "Um die Kopfzeile einer HTTP-Antwort zu ändern, können zusätzliche Methoden für die Objekte `Response`, `JSONResponse` und `HTMLResponse` aufgerufen werden.",
"Redirect": "Umleitung",
"To return a 301 or 302 redirect as a response, `Redirect.toRoute` or `Redirect.toUrl` can be used.": "Um eine 301- oder 302-Weiterleitung als Antwort zurückzugeben, kann `Redirect.toRoute` oder `Redirect.toUrl` verwendet werden.",
"The `Redirect.toRoute` method uses the route name here. How to set a route name can be seen in the section xref:http.adoc#http-route-name[HTTP Route Name]. If this referenced route (query or path) contains parameters, they can be specified via the second argument:": "Die Methode `Redirect.toRoute` verwendet hier den Routennamen. Wie man einen Routennamen festlegt, ist im Abschnitt xref:http.adoc#http-route-name[HTTP Route Name] beschrieben. Wenn diese referenzierte Route (Query oder Path) Parameter enthält, können diese über das zweite Argument angegeben werden:",
"Alternatively, you can redirect to a URL with `Redirect.toUrl`.": "Alternativ können Sie mit `Redirect.toUrl` auf eine URL umleiten.",
"By default, both use a 302 forwarding. This can be customized via the `statusCode` argument.": "Standardmäßig verwenden beide eine 302-Weiterleitung. Dies kann über das Argument \"StatusCode\" angepasst werden.",
"Scope": "Umfang",
"All HTTP controllers and functional routes are managed within the `http` dependency injection scope. HTTP controllers are instantiated accordingly for each HTTP request. This also means that both can access providers registered for the `http` scope. So additionally `HttpRequest` and `HttpResponse` from `@deepkit/http` are usable as dependencies. If deepkit framework is used, `SessionHandler` from `@deepkit/framework` is also available.": "Alle HTTP-Controller und funktionalen Routen werden innerhalb des `http`-Abhängigkeitsinjektionsbereichs verwaltet. HTTP-Controller werden für jede HTTP-Anfrage entsprechend instanziiert. Das bedeutet auch, dass beide auf Provider zugreifen können, die für den `http`-Bereich registriert sind. So sind zusätzlich `HttpRequest` und `HttpResponse` aus `@deepkit/http` als Abhängigkeiten nutzbar. Wenn das Deepkit-Framework verwendet wird, ist auch `SessionHandler` aus `@deepkit/framework` verfügbar.",
"It can be useful to place providers in the `http` scope, for example to instantiate services for each HTTP request. Once the HTTP request has been processed, the `http` scoped DI container is deleted, thus cleaning up all its provider instances from the garbage collector (GC).": "Es kann sinnvoll sein, Provider in den `http'-Bereich zu stellen, um beispielsweise Dienste für jede HTTP-Anfrage zu instanziieren. Sobald die HTTP-Anfrage verarbeitet wurde, wird der DI-Container mit dem Gültigkeitsbereich `http` gelöscht, wodurch alle Anbieterinstanzen vom Garbage Collector (GC) bereinigt werden.",
"See xref:dependency-injection.adoc#di-scopes[Dependency Injection Scopes] to learn how to place providers in the `http` scope.": "Siehe xref:dependency-injection.adoc#di-scopes[Dependency Injection Scopes], um zu erfahren, wie man Provider in den `http'-Bereich platziert.",
"Events": "Veranstaltungen",
"The HTTP module is based on a workflow engine that provides various event tokens that can be used to hook into the entire process of processing an HTTP request.": "Das HTTP-Modul basiert auf einer Workflow-Engine, die verschiedene Ereignis-Token zur Verfügung stellt, mit denen man sich in den gesamten Prozess der Verarbeitung einer HTTP-Anfrage einklinken kann.",
"The workflow engine is a finite state machine that creates a new state machine instance for each HTTP request and then jumps from position to position. The first position is the `start` and the last the `response`. Additional code can be executed in each position.": "Die Workflow-Engine ist ein endlicher Zustandsautomat, der für jede HTTP-Anfrage eine neue Instanz des Zustandsautomaten erstellt und dann von Position zu Position springt. Die erste Position ist der `Start` und die letzte die `Antwort`. An jeder Position kann zusätzlicher Code ausgeführt werden.",
"Each event token has its own event type with additional information.": "Jedes Ereignis-Token hat seinen eigenen Ereignistyp mit zusätzlichen Informationen.",
"Since all HTTP events are based on the workflow engine, its behavior can be modified by using the specified event and jumping there with the `event.next()` method.": "Da alle HTTP-Ereignisse auf der Workflow-Engine basieren, kann ihr Verhalten geändert werden, indem man das angegebene Ereignis verwendet und mit der Methode `event.next()` dorthin springt.",
"The HTTP module uses its own event listeners on these event tokens to implement HTTP request processing. All these event listeners have a priority of 100, which means that when you listen for an event, your listener is executed first by default (since the default priority is 0). Add a priority above 100 to run after the HTTP module's event listeners.": "Das HTTP-Modul verwendet seine eigenen Ereignis-Listener für diese Ereignis-Token, um die Verarbeitung von HTTP-Anfragen zu implementieren. Alle diese Ereignis-Listener haben eine Priorität von 100, d. h., wenn Sie auf ein Ereignis warten, wird Ihr Listener standardmäßig zuerst ausgeführt (da die Standardpriorität 0 ist). Fügen Sie eine Priorität über 100 hinzu, um nach den Ereignis-Listenern des HTTP-Moduls ausgeführt zu werden.",
"For example, suppose you want to catch the event when a controller is invoked. If a particular controller is to be invoked, we check if the user has access to it. If the user has access, we continue. But if not, we jump to the next workflow item `accessDenied`. There, the procedure of an access-denied is then automatically processed further.": "Nehmen wir zum Beispiel an, Sie wollen das Ereignis abfangen, wenn ein Controller aufgerufen wird. Wenn ein bestimmter Controller aufgerufen werden soll, prüfen wir, ob der Benutzer Zugriff auf ihn hat. Wenn der Benutzer Zugriff hat, fahren wir fort. Wenn nicht, springen wir zum nächsten Workflow-Element `accessDenied`. Dort wird dann der Vorgang eines access-denied automatisch weiterverarbeitet.",
"Security": "Sicherheit",
"Sessions": "Sitzungen",
"Middleware": "Middleware",
"HTTP middlewares allow you to hook into the request/response cycle as an alternative to HTTP events. Its API allows you to use all middlewares from the Express/Connect framework.": "HTTP-Middlewares ermöglichen es Ihnen, sich in den Anfrage/Antwort-Zyklus als Alternative zu HTTP-Ereignissen einzuklinken. Mit seiner API können Sie alle Middlewares des Express/Connect-Frameworks verwenden.",
"A middleware can either be a class (which is instantiated by the dependency injection container) or a simple function.": "Eine Middleware kann entweder eine Klasse (die vom Dependency Injection Container instanziiert wird) oder eine einfache Funktion sein.",
"Global": "Global",
"By using httpMiddleware.for(MyMiddleware) a middleware is registered for all routes, globally.": "Durch die Verwendung von httpMiddleware.for(MyMiddleware) wird eine Middleware für alle Routen global registriert.",
"Per Controller": "Pro Controller",
"You can limit middlewares to one or multiple controllers in two ways. Either by using the `@http.controller` or `httpMiddleware.for(T).forControllers()`. `excludeControllers` allow you to exclude controllers.": "Sie können Middlewares auf zwei Arten auf einen oder mehrere Controller beschränken. Entweder durch die Verwendung von `@http.controller` oder `httpMiddleware.for(T).forControllers()`. Mit `excludeControllers` können Sie Controller ausschließen.",
"Per Route Name": "Pro Route Name",
"`forRouteNames` along with its counterpart `excludeRouteNames` allow you to filter the execution of a middleware per route names.": "Mit `forRouteNames` und seinem Gegenstück `excludeRouteNames` können Sie die Ausführung einer Middleware nach Routennamen filtern.",
"Per Action/Route": "Pro Aktion/Route",
"To execute a middleware only for a certain route, you can either use `@http.GET().middleware()` or": "Um eine Middleware nur für eine bestimmte Route auszuführen, können Sie entweder `@http.GET().middleware()` verwenden oder",
"`httpMiddleware.for(T).forRoute()` where forRoute has multiple options to filter routes.": "`httpMiddleware.for(T).forRoute()`, wobei forRoute mehrere Optionen zum Filtern von Routen hat.",
"`forRoutes()` allows as first argument several way to filter for routes.": "forRoutes()` erlaubt als erstes Argument mehrere Möglichkeiten, nach Routen zu filtern.",
"Path Pattern": "Pfad-Muster",
"`path` supports wildcard *.": "Pfad\" unterstützt Platzhalter *.",
"RegExp": "RegExp",
"HTTP Method": "HTTP-Methode",
"Filter all routes by a HTTP method.": "Alle Routen nach einer HTTP-Methode filtern.",
"Category": "Kategorie",
"`category` along with its counterpart `excludeCategory` allow you to filter per route category.": "Kategorie\" und sein Gegenstück \"ExcludeCategory\" ermöglichen es Ihnen, nach Routenkategorien zu filtern.",
"`group` along with its counterpart `excludeGroup` allow you to filter per route group.": "Mit `group` und seinem Gegenstück `excludeGroup` können Sie nach Routengruppen filtern.",
"Per Modules": "Pro Modul",
"You can limit the execution of a module for a whole module.": "Sie können die Ausführung eines Moduls für ein ganzes Modul einschränken.",
"Per Self Modules": "Pro-Selbst-Module",
"To execute a middleware for all controllers/routes of a module where the middleware was registered use `forSelfModules()`.": "Um eine Middleware für alle Controller/Routen eines Moduls auszuführen, in dem die Middleware registriert wurde, verwenden Sie \"forSelfModules()\".",
"Timeout": "Zeitüberschreitung",
"All middleware needs to execute `next()` sooner or later. If a middleware does not execute `next()` withing a timeout, a warning is logged and the next middleware executed. To change the default of 4seconds to something else use timeout(milliseconds).": "Alle Middlewares müssen früher oder später `next()` ausführen. Wenn eine Middleware `next()` nicht innerhalb eines Timeouts ausführt, wird eine Warnung protokolliert und die nächste Middleware ausgeführt. Um den Standardwert von 4 Sekunden in etwas anderes zu ändern, verwenden Sie timeout(milliseconds).",
"Multiple Rules": "Mehrere Regeln",
"To combine multiple filters, you can chain method calls.": "Um mehrere Filter zu kombinieren, können Sie Methodenaufrufe verketten.",
"Express Middleware": "Express-Middleware",
"Almost all express middlewares are supported. Those who access certain request methods of express are not yet supported.": "Fast alle Express-Middlewares werden unterstützt. Diejenigen, die auf bestimmte Anfragemethoden von Express zugreifen, werden noch nicht unterstützt.",
"Resolver": "Auflöser",
"Router supports a way to resolve complex parameter types. For example, given a route such as `/user/:id`, this `id` can be resolved to a `user` object outside the route using a resolver. This further decouples HTTP abstraction and route code, further simplifying testing and modularity.": "Der Router unterstützt eine Möglichkeit zur Auflösung komplexer Parametertypen. Bei einer Route wie `/user/:id` kann diese `id` beispielsweise mit Hilfe eines Resolvers in ein `user` Objekt außerhalb der Route aufgelöst werden. Dies entkoppelt die HTTP-Abstraktion und den Routencode weiter, was das Testen und die Modularität weiter vereinfacht.",
"The decorator in `@http.resolveParameter` specifies which class is to be resolved with the `UserResolver`. As soon as the specified class `User` is specified as a parameter in the function or method, the resolver is used to provide it.": "Der Dekorator in `@http.resolveParameter` gibt an, welche Klasse mit dem `UserResolver` aufgelöst werden soll. Sobald die angegebene Klasse `User` als Parameter in der Funktion oder Methode angegeben wird, wird der Resolver verwendet, um sie bereitzustellen.",
"If `@http.resolveParameter` is specified at the class, all methods of this class get this resolver. The decorator can also be applied per method:": "Wenn `@http.resolveParameter` bei der Klasse angegeben ist, erhalten alle Methoden dieser Klasse diesen Resolver. Der Dekorator kann auch pro Methode angewendet werden:",
"Also, the functional API can be used:": "Außerdem kann die funktionale API verwendet werden:",
"The `User` object does not necessarily have to depend on a parameter. It could just as well depend on a session or an HTTP header, and only be provided when the user is logged in. In `RouteParameterResolverContext` a lot of information about the HTTP request is available, so that many use cases can be mapped.": "Das Objekt \"User\" muss nicht unbedingt von einem Parameter abhängen. Es könnte genauso gut von einer Sitzung oder einem HTTP-Header abhängen und nur bereitgestellt werden, wenn der Benutzer angemeldet ist. In `RouteParameterResolverContext` sind viele Informationen über die HTTP-Anfrage verfügbar, so dass viele Anwendungsfälle abgebildet werden können.",
"In principle, it is also possible to have complex parameter types provided via the Dependency Injection container from the `http` scope, since these are also available in the route function or method. However, this has the disadvantage that no asynchronous function calls can be used, since the DI container is synchronous throughout.": "Prinzipiell ist es auch möglich, komplexe Parametertypen über den Dependency Injection Container aus dem `http`-Scope bereitzustellen, da diese auch in der Routenfunktion bzw. -methode zur Verfügung stehen. Dies hat jedoch den Nachteil, dass keine asynchronen Funktionsaufrufe verwendet werden können, da der DI-Container durchgehend synchron ist.",
"RPC": "RPC",
"RPC, which stands for Remote Procedure Call, allows functions on a remote server to be called as if they were local functions. Unlike HTTP client-server communication, which uses HTTP methods and a URL for mapping, RPC uses the function name for mapping. The data to be sent is passed as normal function arguments, and the result of the function call on the server is sent back to the client.": "RPC, die Abkürzung für Remote Procedure Call, ermöglicht es, Funktionen auf einem entfernten Server so aufzurufen, als wären es lokale Funktionen. Im Gegensatz zur HTTP-Client-Server-Kommunikation, bei der HTTP-Methoden und eine URL für die Zuordnung verwendet werden, verwendet RPC den Funktionsnamen für die Zuordnung. Die zu sendenden Daten werden als normale Funktionsargumente übergeben, und das Ergebnis des Funktionsaufrufs auf dem Server wird an den Client zurückgesendet.",
"The advantage of RPC is that the client-server abstraction is lightweight because it does not work with headers, URLs, query strings, or similar. The disadvantage is that functions on a server via RPC cannot be easily called by a browser and often require a specific client.": "Der Vorteil von RPC ist, dass die Client-Server-Abstraktion leichtgewichtig ist, da sie nicht mit Kopfzeilen, URLs, Abfragezeichenfolgen oder Ähnlichem arbeitet. Der Nachteil ist, dass Funktionen auf einem Server über RPC nicht einfach von einem Browser aufgerufen werden können und oft einen speziellen Client erfordern.",
"One key feature of RPC is that the data between the client and server is automatically serialized and deserialized. Therefore, type-safe RPC clients are usually possible. Some RPC frameworks force users to provide types (parameter types and return types) in a specific format. This can be in the form of a DSL such as Protocol Buffers for gRPC and GraphQL or a JavaScript schema builder. Additional data validation can also be provided by the RPC framework but is not supported by all.": "Ein wesentliches Merkmal von RPC ist, dass die Daten zwischen Client und Server automatisch serialisiert und deserialisiert werden. Daher sind typsichere RPC-Clients in der Regel möglich. Einige RPC-Frameworks zwingen die Benutzer, Typen (Parametertypen und Rückgabetypen) in einem bestimmten Format bereitzustellen. Dies kann in Form einer DSL wie Protocol Buffers für gRPC und GraphQL oder eines JavaScript-Schema-Builders erfolgen. Zusätzliche Datenvalidierung kann auch vom RPC-Framework bereitgestellt werden, wird aber nicht von allen unterstützt.",
"Deepkit RPC extracts types from the TypeScript code itself, so it is not necessary to use a code generator or define them manually. Deepkit supports automatic serialization and deserialization of parameters and results. Once additional restrictions are defined in Validation, they are automatically validated. This makes communication via RPC extremely type-safe and efficient. The support for streaming via `rxjs` in Deepkit RPC makes this RPC framework a suitable tool for real-time communication.": "Deepkit RPC extrahiert Typen aus dem TypeScript-Code selbst, so dass es nicht notwendig ist, einen Codegenerator zu verwenden oder sie manuell zu definieren. Deepkit unterstützt die automatische Serialisierung und Deserialisierung von Parametern und Ergebnissen. Sobald zusätzliche Einschränkungen in Validation definiert sind, werden sie automatisch validiert. Dies macht die Kommunikation über RPC extrem typsicher und effizient. Die Unterstützung von Streaming über `rxjs` in Deepkit RPC macht dieses RPC-Framework zu einem geeigneten Werkzeug für die Echtzeitkommunikation.",
"To illustrate the concept behind RPC, consider the following code:": "Zur Veranschaulichung des Konzepts von RPC dient der folgende Code:",
"A method like hello is implemented just like a normal function within a class on the server and can be called by a remote client.": "Eine Methode wie hello ist wie eine normale Funktion innerhalb einer Klasse auf dem Server implementiert und kann von einem entfernten Client aufgerufen werden.",
"Because RPC is fundamentally based on asynchronous communication, communication is usually over HTTP but can also be over TCP or WebSockets. This means that all function calls in TypeScript are converted to a `Promise` themselves. The result can be received asynchronously with a corresponding `await`.": "Da RPC grundsätzlich auf asynchroner Kommunikation basiert, erfolgt die Kommunikation normalerweise über HTTP, kann aber auch über TCP oder WebSockets erfolgen. Das bedeutet, dass alle Funktionsaufrufe in TypeScript selbst in ein `Promise` umgewandelt werden. Das Ergebnis kann asynchron mit einem entsprechenden `await` empfangen werden.",
"When a project uses TypeScript on both the client (usually frontend) and server (backend), it is called Isomorphic TypeScript. A type-safe RPC framework based on TypeScript's types is particularly beneficial for such a project because types can be shared between the client and server.": "Wenn ein Projekt TypeScript sowohl auf dem Client (in der Regel Frontend) als auch auf dem Server (Backend) verwendet, wird es als Isomorphic TypeScript bezeichnet. Ein typsicheres RPC-Framework, das auf TypeScript-Typen basiert, ist für ein solches Projekt besonders vorteilhaft, da die Typen von Client und Server gemeinsam genutzt werden können.",
"To take advantage of this, types that are used on both sides should be outsourced to their own file or package. Importing on the respective side then puts them back together.": "Um dies zu nutzen, sollten Typen, die auf beiden Seiten verwendet werden, in eine eigene Datei oder ein eigenes Paket ausgelagert werden. Beim Importieren auf der jeweiligen Seite werden sie dann wieder zusammengefügt.",
"Backward compatibility can be implemented in the same way as with a normal local API: either new parameters are marked as optional or a new method is added.": "Die Abwärtskompatibilität kann auf die gleiche Weise wie bei einer normalen lokalen API implementiert werden: entweder werden neue Parameter als optional gekennzeichnet oder eine neue Methode wird hinzugefügt.",
"To use Deepkit RPC, it is necessary to have `@deepkit/type` correctly installed because it is based on Runtime Types. See xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Um Deepkit RPC zu verwenden, muss `@deepkit/type` korrekt installiert sein, da es auf Runtime Types basiert. Siehe xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"Once this is successfully done, `@deepkit/rpc` or the Deepkit Framework, which already uses the library under the hood, can be installed.": "Sobald dies erfolgreich durchgeführt wurde, kann `@deepkit/rpc` oder das Deepkit Framework, das die Bibliothek bereits unter der Haube verwendet, installiert werden.",
"Note that controller classes in `@deepkit/rpc` are based on TypeScript decorators, and this feature must be enabled with experimentalDecorators.": "Beachten Sie, dass die Controller-Klassen in `@deepkit/rpc` auf TypeScript-Dekoratoren basieren und diese Funktion mit experimentalDecorators aktiviert werden muss.",
"The `@deepkit/rpc` package must be installed on the server and client if they have their own package.json.": "Das Paket `@deepkit/rpc` muss auf dem Server und dem Client installiert sein, wenn sie ihre eigene package.json haben.",
"To communicate over TCP with the server, the `@deepkit/rpc-tcp` package must be installed on the client and server.": "Um über TCP mit dem Server zu kommunizieren, muss das Paket `@deepkit/rpc-tcp` auf dem Client und dem Server installiert sein.",
"For WebSocket communication, the package is also required on the server. The client in the browser, on the other hand, uses WebSocket from the official standard.": "Für die WebSocket-Kommunikation wird das Paket auch auf dem Server benötigt. Der Client im Browser hingegen verwendet WebSocket aus dem offiziellen Standard.",
"If the client is also to be used in an environment where WebSocket is not available (for example, NodeJS), the package ws is required in the client.": "Wenn der Client auch in einer Umgebung verwendet werden soll, in der WebSocket nicht verfügbar ist (z. B. NodeJS), wird das Paket ws im Client benötigt.",
"Below is a fully functional example based on WebSockets and the low-level API of @deepkit/rpc. When using the Deepkit Framework, controllers are provided via app modules, and an RpcKernel is not instantiated manually.": "Nachfolgend finden Sie ein voll funktionsfähiges Beispiel auf der Grundlage von WebSockets und der Low-Level-API von @deepkit/rpc. Bei Verwendung des Deepkit-Frameworks werden die Controller über App-Module bereitgestellt, und ein RpcKernel wird nicht manuell instanziiert.",
"_File: server.ts_": "_Datei: server.ts_",
"_File: client.ts_": "_Datei: client.ts_",
"Server Controller": "Server-Controller",
"The term \"Procedure\" in Remote Procedure Call is also commonly referred to as an \"Action\". An Action is a method defined in a class and marked with the `@rpc.action` decorator. The class itself is marked as a Controller with the `@rpc.controller` decorator and given a unique name. This name is then referenced in the client to address the correct controller. Multiple controllers can be defined and registered as needed.": "Der Begriff \"Prozedur\" in Remote Procedure Call wird im Allgemeinen auch als \"Aktion\" bezeichnet. Eine Aktion ist eine Methode, die in einer Klasse definiert und mit dem Dekorator `@rpc.action` gekennzeichnet ist. Die Klasse selbst wird mit dem Dekorator \"@@rpc.controller\" als Controller gekennzeichnet und erhält einen eindeutigen Namen. Dieser Name wird dann im Client referenziert, um den richtigen Controller anzusprechen. Bei Bedarf können mehrere Controller definiert und registriert werden.",
"Only methods marked as `@rpc.action()` can be called by a client.": "Nur Methoden, die als `@rpc.action()` gekennzeichnet sind, können von einem Client aufgerufen werden.",
"Types must be explicitly specified and cannot be inferred. This is important because the serializer needs to know exactly what the types look like in order to convert them into binary data (BSON) or JSON which is then sent over the wire.": "Die Typen müssen explizit angegeben werden und können nicht abgeleitet werden. Dies ist wichtig, da der Serialisierer genau wissen muss, wie die Typen aussehen, um sie in binäre Daten (BSON) oder JSON zu konvertieren, die dann über die Leitung gesendet werden.",
"Client Controller": "Kunden-Controller",
"The normal flow in RPC is that the client can execute functions on the server. However, in Deepkit RPC, it is also possible for the server to execute functions on the client. To allow this, the client can also register a controller.": "Der normale Ablauf bei RPC ist, dass der Client Funktionen auf dem Server ausführen kann. In Deepkit RPC ist es jedoch auch möglich, dass der Server Funktionen auf dem Client ausführt. Um dies zu ermöglichen, kann der Client auch einen Controller registrieren.",
"Controller classes are managed by the Dependency Injection Container from `@deepkit/injector`. When using the Deepkit Framework, these controllers automatically have access to the providers of the modules that provide the controller.": "Controller-Klassen werden durch den Dependency Injection Container von `@deepkit/injector` verwaltet. Bei Verwendung des Deepkit-Frameworks haben diese Controller automatisch Zugriff auf die Anbieter der Module, die den Controller bereitstellen.",
"In the Deepkit Framework, controllers are instantiated in the Dependency Injection Scope `rpc`, allowing all controllers to automatically access various providers from this scope. These additional providers are `HttpRequest` (optional), `RpcInjectorContext`, `SessionState`, `RpcKernelConnection`, and `ConnectionWriter`.": "Im Deepkit Framework werden Controller im Dependency Injection Scope `rpc` instanziiert, so dass alle Controller automatisch auf verschiedene Provider aus diesem Scope zugreifen können. Diese zusätzlichen Anbieter sind `HttpRequest` (optional), `RpcInjectorContext`, `SessionState`, `RpcKernelConnection` und `ConnectionWriter`.",
"However, when an `RpcKernel` is manually instantiated, a DI Container can also be passed. The RPC Controller will then be instantiated through this DI Container. This is useful if you want to use `@deepkit/rpc` in a non-Deepkit Framework environment, like Express.js.": "Wenn jedoch ein `RpcKernel` manuell instanziiert wird, kann auch ein DI Container übergeben werden. Der RPC-Controller wird dann über diesen DI-Container instanziiert. Dies ist nützlich, wenn Sie `@deepkit/rpc` in einer Nicht-Deepkit-Framework-Umgebung, wie Express.js, verwenden möchten.",
"See [Dependency Injection](xref:dependency-injection.adoc) to learn more.": "Siehe [Dependency Injection](xref:dependency-injection.adoc) um mehr zu erfahren.",
"Nominal Types": "Nominale Typen",
"When the client receives data from a function call, it has first been serialized on the server and then deserialized on the client. If the function's return type includes classes, these classes will be reconstructed on the client side, but they will lose their nominal identity and associated methods. To address this issue, register the classes as nominal types with unique IDs/names. This approach should be applied to all classes used within an RPC-API.": "Wenn der Client Daten aus einem Funktionsaufruf erhält, wurden diese zunächst auf dem Server serialisiert und dann auf dem Client deserialisiert. Wenn der Rückgabetyp der Funktion Klassen enthält, werden diese Klassen auf der Client-Seite rekonstruiert, aber sie verlieren ihre nominale Identität und die zugehörigen Methoden. Um dieses Problem zu lösen, registrieren Sie die Klassen als Nominaltypen mit eindeutigen IDs/Namen. Dieser Ansatz sollte auf alle Klassen angewandt werden, die innerhalb einer RPC-API verwendet werden.",
"To register a class, use the decorator `@entity.name('id')`.": "Um eine Klasse zu registrieren, verwenden Sie den Dekorator `@entity.name('id')`.",
"Once this class is used as the result of a function, its identity will be preserved.": "Sobald diese Klasse als Ergebnis einer Funktion verwendet wird, bleibt ihre Identität erhalten.",
"Error Forwarding": "Fehlerweiterleitung",
"RPC functions can throw errors. By default, these errors are forwarded to the client and thrown again. If you are using custom error classes, you should enable their nominal type. See [RPC Nominal Types](xref:rpc.adoc#rpc-nominal-types) for more information": "RPC-Funktionen können Fehler auslösen. Standardmäßig werden diese Fehler an den Client weitergeleitet und erneut ausgelöst. Wenn Sie eigene Fehlerklassen verwenden, sollten Sie deren Nominaltyp aktivieren. Siehe [RPC-Nominaltypen](xref:rpc.adoc#rpc-nominal-types) für weitere Informationen",
"By default, all RPC functions can be called from any client, and the peer-to-peer communication feature is enabled. To precisely control which client is allowed to do what, you can override the `RpcKernelSecurity` class.": "Standardmäßig können alle RPC-Funktionen von jedem Client aufgerufen werden, und die Peer-to-Peer-Kommunikation ist aktiviert. Um genau zu steuern, welcher Client was tun darf, können Sie die Klasse `RpcKernelSecurity` überschreiben.",
"To use this, pass the provider to the `RpcKernel`:": "Um diesen zu verwenden, übergeben Sie den Provider an den `RpcKernel`:",
"Or, in the case of a Deepkit Framework application, override the `RpcKernelSecurity` class with a provider in the app:": "Oder, im Falle einer Deepkit-Framework-Anwendung, überschreiben Sie die Klasse \"RpcKernelSecurity\" mit einem Anbieter in der Anwendung:",
"Authentication / Session": "Authentifizierung / Sitzung",
"By default, the `Session` object is an anonymous session, meaning the client has not authenticated. When the client wants to authenticate, the `authenticate` method is called. The token received by the `authenticate` method comes from the client and can have any value.": "Standardmäßig ist das Objekt \"Session\" eine anonyme Sitzung, d. h. der Client hat sich nicht authentifiziert. Wenn der Client sich authentifizieren will, wird die Methode `authenticate` aufgerufen. Das von der Methode `authenticate` empfangene Token kommt vom Client und kann einen beliebigen Wert haben.",
"Once the client sets a token, the authentication is executed when the first RPC function is called or when `client.connect()` is manually invoked.": "Sobald der Client ein Token setzt, wird die Authentifizierung ausgeführt, wenn die erste RPC-Funktion aufgerufen wird oder wenn `client.connect()` manuell aufgerufen wird.",
"In this case, `RpcKernelSecurity.authenticate` receives the token `123456789` and can return a different session accordingly. The returned session is then passed to all other methods like `hasControllerAccess`.": "In diesem Fall erhält \"RpcKernelSecurity.authenticate\" das Token \"123456789\" und kann dementsprechend eine andere Sitzung zurückgeben. Die zurückgegebene Sitzung wird dann an alle anderen Methoden wie `hasControllerAccess` weitergegeben.",
"Controller Access": "Controller-Zugang",
"The `hasControllerAccess` method determines whether a client is allowed to execute a specific RPC function. This method is called for every RPC function invocation. If it returns `false`, access is denied, and an error is thrown on the client.": "Die Methode `hasControllerAccess` bestimmt, ob ein Client eine bestimmte RPC-Funktion ausführen darf. Diese Methode wird für jeden RPC-Funktionsaufruf aufgerufen. Gibt sie den Wert \"False\" zurück, wird der Zugriff verweigert und der Client mit einem Fehler konfrontiert.",
"The `RpcControllerAccess` contains valuable information about the RPC function:": "Der \"RpcControllerAccess\" enthält wertvolle Informationen über die RPC-Funktion:",
"Groups and additional data can be changed via the decorator `@rpc.action()`:": "Gruppen und zusätzliche Daten können über den Dekorator `@rpc.action()` geändert werden:",
"Transform Error": "Transformationsfehler",
"Since thrown errors are automatically forwarded to the client with all its information like the error message and also the stacktrace, this could unwantedly publish sensitive information. To change this, in the method `transformError` the thrown error can be modified.": "Da ausgelöste Fehler automatisch an den Client mit all seinen Informationen wie der Fehlermeldung und auch dem Stacktrace weitergeleitet werden, könnte dies ungewollt sensible Informationen veröffentlichen. Um dies zu ändern, kann in der Methode `transformError` der ausgelöste Fehler geändert werden.",
"Note that once the error is converted to a generic `error`, the complete stack trace and the identity of the error are lost. Accordingly, no `instanceof` checks can be used on the error in the client.": "Beachten Sie, dass nach der Umwandlung des Fehlers in einen generischen `Fehler` der komplette Stack-Trace und die Identität des Fehlers verloren gehen. Dementsprechend können keine `instanceof`-Prüfungen für den Fehler im Client verwendet werden.",
"If Deepkit RPC is used between two microservices, and thus the client and server are under complete control of the developer, then transforming the error is rarely necessary. If, on the other hand, the client is running in a browser with an unknown, then care should be taken in `transformError` as to what information is to be disclosed. If in doubt, each error should be transformed with a generic `Error` to ensure that no internal details are leaked. Logging the error would then be a good idea at this point.": "Wenn Deepkit RPC zwischen zwei Microservices verwendet wird und somit der Client und der Server unter der vollständigen Kontrolle des Entwicklers stehen, dann ist eine Transformation des Fehlers nur selten notwendig. Läuft der Client hingegen in einem Browser mit einem Unbekannten, dann sollte in `transformError` darauf geachtet werden, welche Informationen offengelegt werden sollen. Im Zweifelsfall sollte jeder Fehler mit einem generischen `Error` umgewandelt werden, um sicherzustellen, dass keine internen Details durchgesickert sind. Die Protokollierung des Fehlers wäre an dieser Stelle eine gute Idee.",
"When the Deepkit framework is used, the class is instantiated by the Dependency Injection container and thus automatically has access to all other providers in the application.": "Bei Verwendung des Deepkit-Frameworks wird die Klasse vom Dependency Injection-Container instanziiert und hat damit automatisch Zugriff auf alle anderen Anbieter in der Anwendung.",
"See also xref:dependency-injection.adoc[Dependency Injection].": "Siehe auch xref:dependency-injection.adoc[Dependency Injection].",
"Streaming RxJS": "RxJS-Streaming",
"Transport Protocol": "Transport-Protokoll",
"Deepkit RPC supports several transport protocols. WebSockets is the protocol that has the best compatibility (since browsers support it) while supporting all features like streaming. TCP is usually faster and is great for communication between servers (microservices) or non-browser clients. But WebSockets work well for server to server communication as well.": "Deepkit RPC unterstützt mehrere Transportprotokolle. WebSockets ist das Protokoll, das die beste Kompatibilität aufweist (da es von Browsern unterstützt wird) und gleichzeitig alle Funktionen wie Streaming unterstützt. TCP ist in der Regel schneller und eignet sich hervorragend für die Kommunikation zwischen Servern (Microservices) oder Nicht-Browser-Clients. WebSockets eignen sich aber auch für die Kommunikation zwischen Servern.",
"Deepkit's RPC HTTP protocol is a variant that is particularly easy to debug in the browser, as each function call is an HTTP request, but has its limitations such as no support for RxJS streaming.": "Das RPC-HTTP-Protokoll von Deepkit ist eine Variante, die im Browser besonders einfach zu debuggen ist, da jeder Funktionsaufruf eine HTTP-Anfrage ist, die aber auch ihre Grenzen hat, z. B. keine Unterstützung für RxJS-Streaming.",
"TODO: Not implemented yet.": "TODO: Noch nicht implementiert.",
"WebSockets": "WebSockets",
"@deepkit/rpc-tcp `RpcWebSocketServer` and Browser WebSocket or Node `ws` package.": "@deepkit/rpc-tcp `RpcWebSocketServer` und Browser WebSocket oder Node `ws` Paket.",
"TCP": "TCP",
"@deepkit/rpc-tcp `RpcNetTcpServer` and `RpcNetTcpClientAdapter`": "@deepkit/rpc-tcp `RpcNetTcpServer` und `RpcNetTcpClientAdapter`",
"Peer To Peer": "Peer-to-Peer",
"Deepkit provides an ORM that allows databases to be accessed in a modern way.": "Deepkit bietet ein ORM, das den Zugriff auf Datenbanken auf moderne Weise ermöglicht.",
"Entities are simply defined using TypeScript types:": "Entitäten werden einfach mit TypeScript-Typen definiert:",
"Any TypeScript types and validation decorators from Deepkit can be used to fully define the entity.": "Alle TypeScript-Typen und Validierungsdekoratoren aus Deepkit können zur vollständigen Definition der Entität verwendet werden.",
"The entity type system is designed in such a way that these types or classes can also be used in other areas such as HTTP routes, RPC actions or frontend. This prevents, for example, that one has defined a user several times distributed in the entire application.": "Das Entity-Type-System ist so konzipiert, dass diese Typen oder Klassen auch in anderen Bereichen wie HTTP-Routen, RPC-Aktionen oder Frontend verwendet werden können. Dies verhindert, dass man z.B. einen Benutzer mehrfach in der gesamten Anwendung verteilt definiert hat.",
"Since Deepkit ORM is based on Runtime Types, it is necessary to have `@deepkit/type` already installed correctly. See xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Da Deepkit ORM auf Runtime Types basiert, ist es notwendig, dass `@deepkit/type` bereits korrekt installiert ist. Siehe xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"If this is done successfully, `@deepkit/orm` itself and a database adapter can be installed.": "Wenn dies erfolgreich durchgeführt wurde, können `@deepkit/orm` selbst und ein Datenbankadapter installiert werden.",
"If classes are to be used as entities, `experimentalDecorators` must be enabled in tsconfig.json:": "Wenn Klassen als Entitäten verwendet werden sollen, muss \"ExperimentalDecorators\" in tsconfig.json aktiviert werden:",
"Once the library is installed, a database adapter can be installed and the API of it can be used directly.": "Sobald die Bibliothek installiert ist, kann ein Datenbankadapter installiert werden, dessen API direkt verwendet werden kann.",
"SQLite": "SQLite",
"MySQL": "MySQL",
"Postgres": "Postgres",
"MongoDB": "MongoDB",
"Primarily the `Database` object is used. Once instantiated, it can be used throughout the application to query or manipulate data. The connection to the database is initialized lazy.": "In erster Linie wird das Objekt `Database` verwendet. Sobald es instanziiert ist, kann es in der gesamten Anwendung verwendet werden, um Daten abzufragen oder zu manipulieren. Die Verbindung zur Datenbank wird träge initialisiert.",
"The `Database` object is passed an adapter, which comes from the database adapters libraries.": "Dem `Database`-Objekt wird ein Adapter übergeben, der aus den Bibliotheken der Datenbankadapter stammt.",
"Connection": "Verbindung",
"Read Replica": "Replik lesen",
"An entity is either a class or an object literal (interface) and always has a primary key.": "Eine Entität ist entweder eine Klasse oder ein Objektliteral (Schnittstelle) und hat immer einen Primärschlüssel.",
"The entity is decorated with all necessary information using type decorators from `@deepkit/type`. For example, a primary key is defined as well as various fields and their validation constraints. These fields reflect the database structure, usually a table or a collection.": "Die Entität wird mit allen erforderlichen Informationen unter Verwendung von Typdekoratoren aus `@deepkit/type` dekoriert. Zum Beispiel wird ein Primärschlüssel definiert sowie verschiedene Felder und ihre Validierungsbeschränkungen. Diese Felder spiegeln die Datenbankstruktur wider, in der Regel eine Tabelle oder eine Sammlung.",
"Through special type decorators like `Mapped<'name'>` a field name can also be mapped to another name in the database.": "Durch spezielle Typdekoratoren wie `Mapped<'name'>` kann ein Feldname auch auf einen anderen Namen in der Datenbank abgebildet werden.",
"Klasse": "Klasse",
"Interface": "Schnittstelle",
"Primitives": "Primitive",
"Primitive data types like String, Number (bigint), and Boolean are mapped to common database types. Only the TypeScript type is used.": "Primitive Datentypen wie String, Number (bigint) und Boolean werden auf gängige Datenbanktypen abgebildet. Es wird nur der TypeScript-Typ verwendet.",
"Primary Key": "Primärschlüssel",
"Each entity needs exactly one primary key. Multiple primary keys are not supported.": "Jede Entität benötigt genau einen Primärschlüssel. Mehrere Primärschlüssel werden nicht unterstützt.",
"The base type of a primary key can be arbitrary. Often a number or UUID is used.": "Der Basistyp eines Primärschlüssels kann beliebig sein. Häufig wird eine Zahl oder eine UUID verwendet.",
"For MongoDB the MongoId or ObjectID is often used.": "Für MongoDB wird häufig die MongoId oder ObjectID verwendet.",
"For numbers `AutoIncrement` can be used.": "Für Zahlen kann `AutoIncrement` verwendet werden.",
"Auto Increment": "Automatisches Inkrement",
"Fields that should be automatically incremented during insertion are annotated with the `AutoIncrement` decorator. All adapters support auto-increment values. The MongoDB adapter uses an additional collection to keep track of the counter.": "Felder die während des Einfügens automatisch inkrementiert werden sollen, werden mit dem `AutoIncrement` Dekorator annotiert. Alle Adapter unterstützen auto-increment Werte. Der MongoDB Adapter verwendet eine zusätzliche Sammlung um den Zähler zu verfolgen.",
"An auto-increment field is an automatic counter and can only be applied to a primary key. The database automatically ensures that an ID is used only once.": "Ein Auto-Inkrement-Feld ist ein automatischer Zähler und kann nur auf einen Primärschlüssel angewendet werden. Die Datenbank stellt automatisch sicher, dass eine ID nur einmal verwendet wird.",
"Fields that should be of type UUID (v4) are annotated with the decorator UUID. The runtime type is `string` and mostly binary in the database itself. Use the `uuid()` function to create a new UUID v4.": "Felder, die vom Typ UUID (v4) sein sollten, werden mit dem Dekorator UUID kommentiert. Der Laufzeittyp ist `string` und meist binär in der Datenbank selbst. Verwenden Sie die Funktion `uuid()`, um eine neue UUID v4 zu erstellen.",
"MongoDB ObjectID": "MongoDB-ObjektID",
"Fields that should be of type ObjectID in MongoDB are annotated with the decorator `MongoId`. The runtime type is `string` and in the database itself `ObjectId` (binary).": "Felder, die in MongoDB vom Typ ObjectID sein sollten, werden mit dem Dekorator `MongoId` annotiert. Der Laufzeittyp ist `string` und in der Datenbank selbst `ObjectId` (binär).",
"MongoID fields automatically get a new value when inserted. It is not mandatory to use the field name `_id`. It can have any name.": "MongoID-Felder erhalten beim Einfügen automatisch einen neuen Wert. Es ist nicht zwingend erforderlich, den Feldnamen \"ID\" zu verwenden. Er kann einen beliebigen Namen haben.",
"Optional / Nullable": "Optional / Nullbar",
"Optional fields are declared as TypeScript type with `title?: string` or `title: string | null`. You should use only one variant of this, usually the optional `?` syntax, which works with `undefined`.": "Optionale Felder werden als TypeScript-Typ mit `title?: string` oder `title: string | null` deklariert. Sie sollten nur eine Variante davon verwenden, normalerweise die optionale `?`-Syntax, die mit `undefined` funktioniert.",
"Both variants result in the database type being `NULLABLE` for all SQL adapters. So the only difference between these decorators is that they represent different values at runtime.": "Beide Varianten führen dazu, dass der Datenbanktyp für alle SQL-Adapter `NULLABLE` ist. Der einzige Unterschied zwischen diesen Dekoratoren ist also, dass sie zur Laufzeit unterschiedliche Werte darstellen.",
"In the following example, the changed field is optional and can therefore be undefined at runtime, although it is always represented as NULL in the database.": "Im folgenden Beispiel ist das geänderte Feld optional und kann daher zur Laufzeit undefiniert sein, obwohl es in der Datenbank immer als NULL dargestellt wird.",
"This example shows how the nullable type works. NULL is used both in the database and in the javascript runtime. This is more verbose than `modified?: Date` and is not commonly used.": "Dieses Beispiel zeigt, wie der Typ nullable funktioniert. NULL wird sowohl in der Datenbank als auch in der Javascript-Laufzeit verwendet. Dies ist ausführlicher als `modified? Date` und wird nicht häufig verwendet.",
"Database Type Mapping": "Datenbank-Typ-Zuordnung",
"With `DatabaseField` it is possible to map a field to any database type. The type must be a valid SQL statement that is passed unchanged to the migration system.": "Mit `DatabaseField` ist es möglich, ein Feld auf einen beliebigen Datenbanktyp abzubilden. Der Typ muss eine gültige SQL-Anweisung sein, die unverändert an das Migrationssystem übergeben wird.",
"To map a field for a specific database, either `SQLite`, `MySQL`, or `Postgres` can be used.": "Um ein Feld für eine bestimmte Datenbank zuzuordnen, kann entweder `SQLite`, `MySQL` oder `Postgres` verwendet werden.",
"Embedded Types": "Eingebettete Typen",
"Default Values": "Standardwerte",
"Default Expressions": "Standardausdrücke",
"Complex Types": "Komplexe Typen",
"Exclude": "Ausgeschlossen sind",
"Database Specific Column Types": "Datenbankspezifische Spaltentypen",
"Session / Unit Of Work": "Sitzung/Arbeitseinheit",
"A session is something like a unit of work. It keeps track of everything you do and automatically records the changes whenever `commit()` is called. It is the preferred way to execute changes in the database because it bundles statements in a way that makes it very fast. A session is very lightweight and can easily be created in a request-response lifecycle, for example.": "Eine Sitzung ist so etwas wie eine Arbeitseinheit. Sie protokolliert alles, was Sie tun, und zeichnet die Änderungen automatisch auf, wenn `commit()` aufgerufen wird. Sie ist der bevorzugte Weg, um Änderungen in der Datenbank auszuführen, da sie Anweisungen auf eine Weise bündelt, die sie sehr schnell macht. Eine Session ist sehr leichtgewichtig und kann z.B. leicht in einem Anfrage-Antwort-Lebenszyklus erstellt werden.",
"Add new instance to the session with `session.add(T)` or remove existing instances with `session.remove(T)`. Once you are done with the Session object, simply dereference it everywhere so that the garbage collector can remove it.": "Fügen Sie neue Instanzen zur Session mit `session.add(T)` hinzu oder entfernen Sie bestehende Instanzen mit `session.remove(T)`. Sobald Sie mit dem Session-Objekt fertig sind, dereferenzieren Sie es einfach überall, damit der Garbage Collector es entfernen kann.",
"Changes are automatically detected for entity instances fetched via the Session object.": "Änderungen werden bei Entitätsinstanzen, die über das Session-Objekt abgerufen werden, automatisch erkannt.",
"Identity Map": "Identitätskarte",
"Sessions provide an identity map that ensures there is only ever one javascript object per database entry. For example, if you run `session.query(User).find()` twice within the same session, you get two different arrays, but with the same entity instances in them.": "Sitzungen bieten eine Identitätskarte, die sicherstellt, dass es immer nur ein Javascript-Objekt pro Datenbankeintrag gibt. Wenn Sie zum Beispiel `session.query(User).find()` zweimal innerhalb derselben Sitzung ausführen, erhalten Sie zwei verschiedene Arrays, aber mit denselben Entitätsinstanzen darin.",
"If you add a new entity with `session.add(entity1)` and retrieve it again, you get exactly the same entity instance `entity1`.": "Wenn Sie eine neue Entität mit `session.add(entity1)` hinzufügen und sie wieder abrufen, erhalten Sie genau die gleiche Entitätsinstanz `entity1`.",
"Important: Once you start using sessions, you should use their `session.query` method instead of `database.query`. Only session queries have the identity mapping feature enabled.": "Wichtig! Sobald Sie anfangen, Sitzungen zu verwenden, sollten Sie deren Methode `session.query` anstelle von `database.query` verwenden. Nur bei Sitzungsabfragen ist die Funktion der Identitätszuordnung aktiviert.",
"Change Detection": "Erkennung von Änderungen",
"Request/Response": "Anfrage/Antwort",
"Query": "Abfrage",
"A query is an object that describes how to retrieve or modify data from the database. It has several methods to describe the query and termination methods that execute them. The database adapter can extend the query API in many ways to support database specific features.": "Eine Abfrage ist ein Objekt, das beschreibt, wie Daten aus der Datenbank abgerufen oder geändert werden können. Es hat mehrere Methoden, um die Abfrage zu beschreiben und Abbruchmethoden, die sie ausführen. Der Datenbankadapter kann die Abfrage-API auf viele Arten erweitern, um datenbankspezifische Funktionen zu unterstützen.",
"You can create a query using `Database.query(T)` or `Session.query(T)`. We recommend Sessions as it improves performance.": "Sie können eine Abfrage mit `Database.query(T)` oder `Session.query(T)` erstellen. Wir empfehlen Sessions, da dies die Leistung verbessert.",
"Filter": "Filter",
"A filter can be applied to limit the result set.": "Ein Filter kann angewendet werden, um die Ergebnismenge einzuschränken.",
"Equal": "Gleichberechtigt",
"Greater / Smaller": "Größer / Kleiner",
"Grouping AND/OR": "Gruppierung AND/OR",
"In": "Unter",
"Select": "Wählen Sie",
"To narrow down the fields to be received from the database, `select('field1')` can be used.": "Um die aus der Datenbank zu empfangenden Felder einzugrenzen, kann `select('field1')` verwendet werden.",
"It is important to note that as soon as the fields are narrowed down using `select`, the results are no longer instances of the entity, but only object literals.": "Es ist wichtig zu beachten, dass die Ergebnisse nicht mehr Instanzen der Entität, sondern nur noch Objektliterale sind, sobald die Felder mit `select` eingegrenzt werden.",
"Order": "Bestellung",
"With `orderBy(field, order)` the order of the entries can be changed.": "Mit `orderBy(field, order)` kann die Reihenfolge der Einträge geändert werden.",
"Several times `orderBy` can be executed to refine the order more and more.": "Mehrere Male kann `orderBy` ausgeführt werden, um die Reihenfolge immer weiter zu verfeinern.",
"Pagination": "Paginierung",
"The `itemsPerPage()` and `page()` methods can be used to paginate the results. Page starts at 1.": "Die Methoden `itemsPerPage()` und `page()` können zum Paginieren der Ergebnisse verwendet werden. Seite beginnt bei 1.",
"With the alternative methods `limit` and `skip` you can paginate manually.": "Mit den alternativen Methoden `limit` und `skip` können Sie manuell paginieren.",
"Join": "Beitreten",
"By default, references from the entity are neither included in queries nor loaded. To include a join in the query without loading the reference, use `join()` (left join) or `innerJoin()`. To include a join in the query and load the reference, use `joinWith()` or `innerJoinWith()`.": "Standardmäßig werden Referenzen von der Entität weder in Abfragen einbezogen noch geladen. Um eine Verknüpfung in die Abfrage aufzunehmen, ohne die Referenz zu laden, verwenden Sie `join()` (linke Verknüpfung) oder `innerJoin()`. Um eine Verknüpfung in die Abfrage aufzunehmen und die Referenz zu laden, verwenden Sie `joinWith()` oder `innerJoinWith()`.",
"All the following examples assume these model schemas:": "Alle folgenden Beispiele gehen von diesen Modellschemata aus:",
"To modify join queries, use the same methods, but with the `use` prefix: `useJoin`, `useInnerJoin`, `useJoinWith` or `useInnerJoinWith`. To end the join query modification, use `end()` to get back the parent query.": "Um Join-Abfragen zu ändern, verwenden Sie dieselben Methoden, jedoch mit dem Präfix `use`: `useJoin`, `useInnerJoin`, `useJoinWith` oder `useInnerJoinWith`. Um die Änderung der Join-Abfrage zu beenden, verwenden Sie `end()`, um die übergeordnete Abfrage zurückzubekommen.",
"Aggregation": "Aggregation",
"Aggregation methods allow you to count records and aggregate fields.": "Mit Aggregationsmethoden können Sie Datensätze zählen und Felder aggregieren.",
"The following examples assume this model scheme:": "Die folgenden Beispiele gehen von diesem Modellschema aus:",
"`groupBy` allows to group the result by the specified field.": "Mit \"GroupBy\" kann das Ergebnis nach dem angegebenen Feld gruppiert werden.",
"There are several aggregation methods: `withSum`, `withAverage`, `withCount`, `withMin`, `withMax`, `withGroupConcat`. Each requires a field name as the first argument and an optional second argument to change the alias.": "Es gibt mehrere Aggregationsmethoden: `withSum`, `withAverage`, `withCount`, `withMin`, `withMax`, `withGroupConcat`. Jede erfordert einen Feldnamen als erstes Argument und ein optionales zweites Argument, um den Alias zu ändern.",
"Returning": "Rücksendung",
"With `returning` additional fields can be requested in case of changes via `patch` and `delete`.": "Mit `returning` können zusätzliche Felder bei Änderungen über `patch` und `delete` abgefragt werden.",
"Caution: Not all database adapters return fields atomically. Use transactions to ensure data consistency.": "Vorsicht! Nicht alle Datenbankadapter geben Felder atomar zurück. Verwenden Sie Transaktionen, um die Datenkonsistenz zu gewährleisten.",
"Find": "finden.",
"Returns an array of entries matching the specified filter.": "Gibt ein Array von Einträgen zurück, die dem angegebenen Filter entsprechen.",
"FindOne": "FindOne",
"Returns an item that matches the specified filter.": "Gibt ein Element zurück, das mit dem angegebenen Filter übereinstimmt.",
"If no item is found, an `ItemNotFound` error is thrown.": "Wenn kein Element gefunden wird, wird ein Fehler \"ItemNotFound\" ausgelöst.",
"FindOneOrUndefined": "FindOneOrUndefined",
"Returns an entry that matches the specified filter.": "Gibt einen Eintrag zurück, der mit dem angegebenen Filter übereinstimmt.",
"If no entry is found, undefined is returned.": "Wenn kein Eintrag gefunden wird, wird undefiniert zurückgegeben.",
"FindField": "SucheFeld",
"Returns a list of a field that match the specified filter.": "Gibt eine Liste der Felder zurück, die dem angegebenen Filter entsprechen.",
"FindOneField": "FindOneField",
"If no entry is found, an `ItemNotFound` error is thrown.": "Wenn kein Eintrag gefunden wird, wird ein Fehler \"ItemNotFound\" ausgegeben.",
"Patch": "Aufnäher",
"Patch is a change query that patches the records described in the query. The methods": "Patch ist eine Änderungsabfrage, die die in der Abfrage beschriebenen Datensätze korrigiert. Die Methoden",
"`patchOne` and `patchMany` finish the query and execute the patch.": "`patchOne` und `patchMany` beenden die Abfrage und führen den Patch aus.",
"`patchMany` changes all records in the database that match the specified filter. If no filter is set, the whole table will be changed. Use `patchOne` to change only one entry at a time.": "`patchMany` ändert alle Datensätze in der Datenbank, die dem angegebenen Filter entsprechen. Wenn kein Filter gesetzt ist, wird die gesamte Tabelle geändert. Verwenden Sie `patchOne`, um jeweils nur einen Eintrag zu ändern.",
"Delete": "Löschen",
"`deleteMany` deletes all entries in the database that match the specified filter.": "`deleteMany` löscht alle Einträge in der Datenbank, die dem angegebenen Filter entsprechen.",
"If no filter is set, the whole table will be deleted. Use `deleteOne` to delete only one entry at a time.": "Wenn kein Filter gesetzt ist, wird die gesamte Tabelle gelöscht. Verwenden Sie `deleteOne`, um jeweils nur einen Eintrag zu löschen.",
"Has": "Hat",
"Returns whether at least one entry exists in the database.": "Gibt zurück, ob mindestens ein Eintrag in der Datenbank existiert.",
"Count": "Zählen Sie",
"Returns the number of entries.": "Gibt die Anzahl der Einträge zurück.",
"Lift": "Aufzug",
"Lifting a query means adding new functionality to it. This is usually used either by plugins or complex architectures to split larger query classes into several convenient, reusable classes.": "Das Lifting einer Abfrage bedeutet, dass ihr neue Funktionen hinzugefügt werden. Dies wird in der Regel entweder von Plugins oder komplexen Architekturen verwendet, um größere Abfrageklassen in mehrere praktische, wiederverwendbare Klassen aufzuteilen.",
"Repository": "Repository",
"Relations": "Beziehungen",
"Relationships allow you to connect two entities in a certain way. This is usually done in databases using the concept of foreign keys. Deepkit ORM supports relations for all official database adapters.": "Beziehungen ermöglichen es Ihnen, zwei Entitäten auf eine bestimmte Art und Weise zu verbinden. Dies geschieht in Datenbanken in der Regel über das Konzept der Fremdschlüssel. Deepkit ORM unterstützt Beziehungen für alle offiziellen Datenbankadapter.",
"A relation is annotated with the `reference` decorator. Usually a relation also has a reverse relation, which is annotated with the `BackReference` type, but is only needed if the reverse relation is to be used in a database query. Back references are only virtual.": "Eine Beziehung wird mit dem Dekorator `reference` kommentiert. Normalerweise hat eine Beziehung auch eine umgekehrte Beziehung, die mit dem Typ `BackReference` annotiert ist, aber nur benötigt wird, wenn die umgekehrte Beziehung in einer Datenbankabfrage verwendet werden soll. Rückreferenzen sind nur virtuell.",
"One To Many": "Einer zu vielen",
"The entity that stores a reference is usually referred to as the `owning page` or the one that `owns` the reference. The following code shows two entities with a one-to-many relationship between `User` and `Post`. This means that one `User` can have multiple `Post`. The `post` entity has the `post->user` relationship. In the database itself there is now a field `Post. \"author\"` that contains the primary key of `User`.": "Die Entität, die einen Verweis speichert, wird in der Regel als die \"besitzende Seite\" oder diejenige, die den Verweis \"besitzt\", bezeichnet. Der folgende Code zeigt zwei Entitäten mit einer Eins-zu-Viel-Beziehung zwischen \"User\" und \"Post\". Das bedeutet, dass ein `User` mehrere `Post` haben kann. Die Entität \"Post\" hat die Beziehung \"Post->User\". In der Datenbank selbst gibt es nun ein Feld `Post. author\", das den Primärschlüssel von \"User\" enthält.",
"References are not selected in queries by default. See <<database-join>> for details.": "Referenzen werden in Abfragen standardmäßig nicht ausgewählt. Siehe <<database-join>> für Details.",
"Many To One": "Viele zu Eins",
"A reference usually has a reverse reference called many-to-one. It is only a virtual reference, since it is not reflected in the database itself. A back reference is annotated `BackReference` and is mainly used for reflection and query joins. If you add a `BackReference` from `User` to `Post`, you can join `Post` directly from `User` queries.": "Eine Referenz hat in der Regel eine umgekehrte Referenz, die many-to-one genannt wird. Es handelt sich nur um eine virtuelle Referenz, da sie nicht in der Datenbank selbst reflektiert wird. Ein Rückverweis wird als `BackReference` bezeichnet und wird hauptsächlich für Reflection und Query Joins verwendet. Wenn Sie eine `BackReference` von `User` zu `Post` hinzufügen, können Sie `Post` direkt aus `User`-Abfragen verbinden.",
"Many To Many": "Viele an Viele",
"A many-to-many relationship allows you to associate many records with many others. For example, it can be used for users in groups. A user can be in none, one or many groups. Consequently, a group can contain 0, one or many users.": "Eine Many-to-many-Beziehung ermöglicht es Ihnen, viele Datensätze mit vielen anderen zu verknüpfen. Sie kann zum Beispiel für Benutzer in Gruppen verwendet werden. Ein Benutzer kann in keiner, einer oder vielen Gruppen sein. Folglich kann eine Gruppe 0, einen oder viele Benutzer enthalten.",
"Many-to-many relationships are usually implemented using a pivot entity. The pivot entity contains the actual own references to two other entities, and these two entities have back references to the pivot entity.": "Many-to-many-Beziehungen werden in der Regel mit einer Pivot-Entität implementiert. Die Pivot-Entität enthält die eigentlichen eigenen Referenzen auf zwei andere Entitäten, und diese beiden Entitäten haben Rückreferenzen auf die Pivot-Entität.",
"With these entities, you can now create users and groups and connect them to the pivot entity. By using a back reference in User, we can retrieve the groups directly with a User query.": "Mit diesen Entitäten können Sie nun Benutzer und Gruppen erstellen und sie mit der Pivot-Entität verbinden. Durch die Verwendung eines Rückverweises in User können wir die Gruppen direkt mit einer User-Abfrage abrufen.",
"To unlink a user from a group, the UserGroup record is deleted:": "Um die Verknüpfung eines Benutzers mit einer Gruppe aufzuheben, wird der UserGroup-Datensatz gelöscht:",
"One To One": "Eins zu Eins",
"On Delete/Update: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT": "Bei Löschen/Aktualisieren: EINSCHRÄNKEN | KASKADIEREN | NULL SETZEN | KEINE AKTION | STANDARD SETZEN",
"Inheritance": "Vererbung",
"Table Per Class": "Tabelle pro Klasse",
"Single Table Inheritance": "Einzelne Tabellenvererbung",
"Index": "Index",
"Case Sensitivity": "Sensibilität für Groß- und Kleinschreibung",
"Character Sets": "Zeichensätze",
"Collations": "Zusammenstellungen",
"Batching": "Dosierung",
"Caching": "Caching",
"Multitenancy": "Mehrmandantenfähigkeit",
"Events are a way to hook into Deepkit ORM and allow you to write powerful plugins. There are two categories of events: Query events and Unit-of-Work events. Plugin authors typically use both to support both ways of manipulating data.": "Ereignisse sind eine Möglichkeit, sich in Deepkit ORM einzuklinken und ermöglichen es Ihnen, leistungsfähige Plugins zu schreiben. Es gibt zwei Kategorien von Ereignissen: Abfrageereignisse und Unit-of-Work-Ereignisse. Plugin-Autoren verwenden in der Regel beide, um beide Arten der Datenmanipulation zu unterstützen.",
"Events are registered via `Database.listen` un an event token. Short-lived event listeners can also be registered on sessions.": "Ereignisse werden über `Database.listen` un ein Ereignis-Token registriert. Kurzlebige Ereignis-Listener können auch für Sitzungen registriert werden.",
"Query Events": "Ereignisse abfragen",
"Query events are triggered when a query is executed via `Database.query()` or `Session.query()`.": "Abfrageereignisse werden ausgelöst, wenn eine Abfrage über `Database.query()` oder `Session.query()` ausgeführt wird.",
"Each event has its own additional properties such as the type of entity, the query itself and the database session. You can override the query by setting a new query to `Event.query`.": "Jedes Ereignis hat seine eigenen zusätzlichen Eigenschaften wie die Art der Entität, die Abfrage selbst und die Datenbanksitzung. Sie können die Abfrage außer Kraft setzen, indem Sie eine neue Abfrage auf \"Event.query\" setzen.",
"\"Query\" has several event tokens:": "\"Abfrage\" hat mehrere Ereignis-Token:",
"Unit Of Work Events": "Unit of Work Ereignisse",
"Unit-of-work events are triggered when a new session submits changes.": "Unit-of-Work-Ereignisse werden ausgelöst, wenn eine neue Sitzung Änderungen einreicht.",
"Transactions": "Transaktionen",
"A transaction is a sequential group of statements, queries, or operations such as select, insert, update, or delete that are executed as a single unit of work that can be committed or rolled back.": "Eine Transaktion ist eine sequentielle Gruppe von Anweisungen, Abfragen oder Operationen wie Select, Insert, Update oder Delete, die als eine einzige Arbeitseinheit ausgeführt werden, die bestätigt oder rückgängig gemacht werden kann.",
"Deepkit supports transactions for all officially supported databases. By default, no transactions are used for any query or database session. To enable transactions, there are two main methods: sessions and callback.": "Deepkit unterstützt Transaktionen für alle offiziell unterstützten Datenbanken. Standardmäßig werden keine Transaktionen für eine Abfrage oder Datenbanksitzung verwendet. Um Transaktionen zu aktivieren, gibt es zwei Hauptmethoden: Sitzungen und Callback.",
"Session Transactions": "Sitzungstransaktionen",
"You can start and assign a new transaction for each session you create. This is the preferred way of interacting with the database, as you can easily pass on the Session object and all queries instantiated by this session will be automatically assigned to its transaction.": "Sie können für jede Sitzung, die Sie erstellen, eine neue Transaktion starten und zuweisen. Dies ist die bevorzugte Art der Interaktion mit der Datenbank, da Sie das Session-Objekt einfach weitergeben können und alle Abfragen, die von dieser Session instanziiert werden, automatisch ihrer Transaktion zugewiesen werden.",
"A typical pattern is to wrap all operations in a try-catch block and execute `commit()` on the very last line (which is only executed if all previous commands succeeded) and `rollback()` in the catch block to roll back all changes as soon as an error occurs.": "Ein typisches Muster ist, alle Operationen in einen try-catch-Block zu verpacken und `commit()` in der allerletzten Zeile auszuführen (das nur ausgeführt wird, wenn alle vorherigen Befehle erfolgreich waren) und `rollback()` im catch-Block, um alle Änderungen zurückzunehmen, sobald ein Fehler auftritt.",
"Although there is an alternative API (see below), all transactions work only with database session objects. To commit open changes from the unit-of-work in a database session to the database, `commit()` is normally called. In a transactional session, `commit()` not only commits all pending changes to the database, but also completes (\"commits\") the transaction, thus closing the transaction. Alternatively, you can call `session.flush()` to commit all pending changes without `commit` and thus without closing the transaction. To commit a transaction without flushing the unit-of-work, use `session.commitTransaction()`.": "Obwohl es eine alternative API gibt (siehe unten), funktionieren alle Transaktionen nur mit Datenbanksitzungsobjekten. Um offene Änderungen aus der Unit-of-Work in einer Datenbanksitzung an die Datenbank zu übertragen, wird normalerweise `commit()` aufgerufen. In einer transaktionalen Sitzung überträgt `commit()` nicht nur alle anstehenden Änderungen an die Datenbank, sondern schließt auch die Transaktion ab (\"commits\") und schließt damit die Transaktion. Alternativ können Sie `session.flush()` aufrufen, um alle anstehenden Änderungen ohne `commit` und damit ohne Abschluss der Transaktion zu übertragen. Um eine Transaktion ohne Flush der Unit-of-Work zu committen, verwenden Sie `session.commitTransaction()`.",
"Once `commit()` or `rollback()` is executed in a session, the transaction is released. You must then call `useTransaction()` again if you want to continue in a new transaction.": "Sobald `commit()` oder `rollback()` in einer Sitzung ausgeführt wurde, wird die Transaktion freigegeben. Sie müssen dann `useTransaction()` erneut aufrufen, wenn Sie in einer neuen Transaktion fortfahren wollen.",
"Please note that once the first database operation is executed in a transactional session, the assigned database connection becomes fixed and exclusive to the current session object (sticky). Thus, all subsequent operations will be performed on the same connection (and thus, in most databases, on the same database server). Only when either the transactional session is terminated (commit or rollback), the database connection is released again. It is therefore recommended to keep a transaction only as short as necessary.": "Bitte beachten Sie, dass, sobald die erste Datenbankoperation in einer transaktionalen Sitzung ausgeführt wird, die zugewiesene Datenbankverbindung fest und exklusiv für das aktuelle Sitzungsobjekt wird (sticky). Somit werden alle nachfolgenden Operationen auf derselben Verbindung (und damit in den meisten Datenbanken auf demselben Datenbankserver) ausgeführt. Erst wenn entweder die transaktionale Sitzung beendet wird (Commit oder Rollback), wird die Datenbankverbindung wieder freigegeben. Es ist daher empfehlenswert, eine Transaktion nur so kurz wie nötig zu halten.",
"If a session is already connected to a transaction, a call to `session.useTransaction()` always returns the same object. Use `session.isTransaction()` to check if a transaction is associated with the session.": "Wenn eine Sitzung bereits mit einer Transaktion verbunden ist, gibt ein Aufruf von `session.useTransaction()` immer das gleiche Objekt zurück. Verwenden Sie `session.isTransaction()`, um zu prüfen, ob eine Transaktion mit der Sitzung verbunden ist.",
"Nested transactions are not supported.": "Verschachtelte Transaktionen werden nicht unterstützt.",
"Transaktion Callback": "Transaktion Callback",
"An alternative to transactional sessions is `database.transaction(callback)`.": "Eine Alternative zu Transaktionssitzungen ist `database.transaction(callback)`.",
"The `database.transaction(callback)` method performs an asynchronous callback within a new transactional session. If the callback succeeds (that is, no error is thrown), the session is automatically committed (and thus its transaction committed and all changes flushed). If the callback fails, the session automatically executes `rollback()` and the error is propagated.": "Die Methode `database.transaction(callback)` führt einen asynchronen Callback innerhalb einer neuen transaktionalen Sitzung durch. Wenn der Callback erfolgreich ist (d.h. kein Fehler ausgelöst wird), wird die Sitzung automatisch committed (und damit die Transaktion committed und alle Änderungen geleert). Schlägt der Callback fehl, führt die Sitzung automatisch `rollback()` aus und der Fehler wird weitergegeben.",
"Isolations": "Isolierungen",
"Many databases support different types of transactions. To change the transaction behavior, you can call different methods for the returned transaction object from `useTransaction()`. The interface of this transaction object depends on the database adapter used. For example, the transaction object returned from a MySQL database has different options than the one returned from a MongoDB database. Use code completion or view the database adapter's interface to get a list of possible options.": "Viele Datenbanken unterstützen verschiedene Arten von Transaktionen. Um das Transaktionsverhalten zu ändern, können Sie verschiedene Methoden für das zurückgegebene Transaktionsobjekt von `useTransaction()` aufrufen. Die Schnittstelle dieses Transaktionsobjekts hängt von dem verwendeten Datenbankadapter ab. Zum Beispiel hat das Transaktionsobjekt, das von einer MySQL-Datenbank zurückgegeben wird, andere Optionen als das, das von einer MongoDB-Datenbank zurückgegeben wird. Verwenden Sie die Codevervollständigung oder sehen Sie sich die Schnittstelle des Datenbankadapters an, um eine Liste der möglichen Optionen zu erhalten.",
"While transactions for MySQL, PostgreSQL, and SQLite work by default, you must first set up MongoDB as a \"replica set\".": "Während Transaktionen für MySQL, PostgreSQL und SQLite standardmäßig funktionieren, müssen Sie MongoDB zunächst als \"Replikatsatz\" einrichten.",
"To convert a standard MongoDB instance to a replica set, please refer to the official documentation link:https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set/[Convert a Standalone to a Replica Set].": "Um eine Standard-MongoDB-Instanz in ein Replikatset zu konvertieren, lesen Sie bitte den offiziellen Dokumentationslink:https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set/[Convert a Standalone to a Replica Set].",
"Locking": "Verriegelung",
"Optimistic Locking": "Optimistische Verriegelung",
"Pessimistic Locking": "Pessimistische Sperrung",
"Custom Types": "Benutzerdefinierte Typen",
"Logging": "Protokollierung",
"Migration": "Migration",
"Seeding": "Aussaat",
"Raw Database Access": "Roher Datenbankzugriff",
"SQL": "SQL",
"App Configuration": "App-Konfiguration",
"Composite Primary Key": "Zusammengesetzter Primärschlüssel",
"Composite Primary-Key means, an entity has several primary keys, which are automatically combined to a \"composite primary key\". This way of modeling the database has advantages and disadvantages. We believe that composite primary keys have huge practical disadvantages that do not justify their advantages, so they should be considered bad practice and therefore avoided. Deepkit ORM does not support composite primary keys. In this chapter we explain why and show (better) alternatives.": "Composite Primary-Key bedeutet, dass eine Entität mehrere Primärschlüssel hat, die automatisch zu einem \"Composite Primary Key\" zusammengefasst werden. Diese Art der Modellierung der Datenbank hat Vor- und Nachteile. Wir glauben, dass zusammengesetzte Primärschlüssel enorme praktische Nachteile haben, die ihre Vorteile nicht rechtfertigen, so dass sie als schlechte Praxis betrachtet und daher vermieden werden sollten. Deepkit ORM unterstützt keine zusammengesetzten Primärschlüssel. In diesem Kapitel erklären wir warum und zeigen (bessere) Alternativen auf.",
"Disadvantages": "Benachteiligungen",
"Joins are not trivial. Although they are highly optimized in RDBMS, they represent a constant complexity in applications that can easily get out of hand and lead to performance problems. Performance not only in terms of query execution time, but also in terms of development time.": "Joins sind nicht trivial. Obwohl sie in RDBMS hochgradig optimiert sind, stellen sie eine konstante Komplexität in Anwendungen dar, die leicht aus dem Ruder laufen und zu Leistungsproblemen führen kann. Leistung nicht nur in Bezug auf die Ausführungszeit der Abfrage, sondern auch in Bezug auf die Entwicklungszeit.",
"Joins": "Beitritt zu",
"Each individual join becomes more complicated as more fields are involved. While many databases have implemented optimizations to make joins with multiple fields not slower per se, it requires the developer to constantly think through these joins in detail, since forgetting keys, for example, can lead to subtle errors (since the join will work even without specifying all keys) and the developer therefore needs to know the full composite primary key structure.": "Jede einzelne Verknüpfung wird komplizierter, je mehr Felder beteiligt sind. Zwar haben viele Datenbanken Optimierungen implementiert, um Joins mit mehreren Feldern nicht per se langsamer zu machen, doch muss der Entwickler diese Joins ständig im Detail durchdenken, da z. B. das Vergessen von Schlüsseln zu subtilen Fehlern führen kann (da der Join auch ohne Angabe aller Schlüssel funktioniert) und der Entwickler daher die vollständige zusammengesetzte Primärschlüsselstruktur kennen muss.",
"Indizes": "Zeigt an.",
"Indexes with multiple fields (which are composite primary keys) suffer from the problem of field ordering in queries. While database systems can optimize certain queries, complex structures make it difficult to write efficient operations that correctly use all defined indexes. For an index with multiple fields (such as a composite primary key), it is usually necessary to define the fields in the correct order for the database to actually use the index. If the order is not specified correctly (for example, in a WHERE clause), this can easily result in the database not using the index at all and instead performing a full table scan. Knowing which database query optimizes in which way is advanced knowledge that new developers don't usually have, but is necessary once you start working with composite primary keys so that you get the most out of your database and don't waste resources.": "Indizes mit mehreren Feldern (die zusammengesetzte Primärschlüssel sind) leiden unter dem Problem der Feldreihenfolge in Abfragen. Während Datenbanksysteme bestimmte Abfragen optimieren können, erschweren komplexe Strukturen das Schreiben effizienter Operationen, die alle definierten Indizes korrekt verwenden. Bei einem Index mit mehreren Feldern (z. B. einem zusammengesetzten Primärschlüssel) ist es in der Regel erforderlich, die Felder in der richtigen Reihenfolge zu definieren, damit die Datenbank den Index tatsächlich verwenden kann. Wenn die Reihenfolge nicht korrekt angegeben ist (z. B. in einer WHERE-Klausel), kann dies leicht dazu führen, dass die Datenbank den Index überhaupt nicht verwendet und stattdessen eine vollständige Tabellendurchsuchung durchführt. Zu wissen, welche Datenbankabfrage auf welche Weise optimiert wird, ist ein fortgeschrittenes Wissen, über das neue Entwickler in der Regel nicht verfügen, das aber notwendig ist, sobald Sie anfangen, mit zusammengesetzten Primärschlüsseln zu arbeiten, damit Sie das Beste aus Ihrer Datenbank herausholen und keine Ressourcen verschwenden.",
"Migrationen": "Migrationen",
"Once you decide that a particular entity needs an additional field to uniquely identify it (and thus become the Composite Primary Key), this will result in the adjustment of all entities in your database that have relationships to that entity.": "Sobald Sie entscheiden, dass eine bestimmte Entität ein zusätzliches Feld benötigt, um sie eindeutig zu identifizieren (und somit zum zusammengesetzten Primärschlüssel zu werden), führt dies zur Anpassung aller Entitäten in Ihrer Datenbank, die Beziehungen zu dieser Entität haben.",
"For example, suppose you have an entity `user` with composite primary key and decide to use a foreign key to this `user` in different tables, e.g. in a pivot table `audit_log`, `groups` and `posts`. Once you change the primary key of `user`, all these tables need to be adjusted in a migration as well.": "Angenommen, Sie haben eine Entität \"user\" mit einem zusammengesetzten Primärschlüssel und möchten einen Fremdschlüssel zu diesem \"user\" in verschiedenen Tabellen verwenden, z. B. in einer Pivot-Tabelle \"audit_log\", \"groups\" und \"posts\". Sobald Sie den Primärschlüssel von \"user\" ändern, müssen alle diese Tabellen bei einer Migration ebenfalls angepasst werden.",
"Not only does this make migration files much more complex, but it can also cause major downtime when running migration files, since schema changes usually require either a full database lock or at least a table lock. The more tables affected by a large change like an index change, the longer the migration will take. And the larger a table is, the longer the migration takes.": "Dies macht Migrationsdateien nicht nur viel komplexer, sondern kann auch zu erheblichen Ausfallzeiten bei der Ausführung von Migrationsdateien führen, da Schemaänderungen normalerweise entweder eine vollständige Datenbanksperre oder zumindest eine Tabellensperre erfordern. Je mehr Tabellen von einer großen Änderung wie einer Indexänderung betroffen sind, desto länger wird die Migration dauern. Und je größer eine Tabelle ist, desto länger dauert die Migration.",
"Consider the `audit_log` table. Such tables usually have many records (millions or so), and you have to touch them during a schema change only because you decided to use a composite primary key and add an extra field to the primary key of `user`. Depending on the size of all these tables, this either makes migration changes unnecessarily more expensive or, in some cases, so expensive that changing the primary key of `User` is no longer financially justifiable. This usually leads to workarounds (e.g. adding a unique index to the user table) that result in technical debt and sooner or later end up on the legacy list.": "Nehmen wir die Tabelle `audit_log`. Solche Tabellen haben in der Regel viele Datensätze (Millionen oder so), und Sie müssen sie bei einer Schemaänderung nur deshalb anfassen, weil Sie beschlossen haben, einen zusammengesetzten Primärschlüssel zu verwenden und dem Primärschlüssel von \"user\" ein zusätzliches Feld hinzuzufügen. Je nach Größe all dieser Tabellen macht dies Migrationsänderungen entweder unnötig teurer oder in einigen Fällen so teuer, dass eine Änderung des Primärschlüssels von \"user\" finanziell nicht mehr vertretbar ist. Dies führt in der Regel zu Umgehungslösungen (z. B. Hinzufügen eines eindeutigen Index zur Benutzertabelle), die zu technischen Schulden führen und früher oder später auf der Altlastenliste landen.",
"For large projects, this can lead to huge downtime (from minutes to hours) and sometimes even the introduction of an entirely new migration abstraction system that essentially copies tables, inserts records into ghost tables, and moves tables back and forth after migration. This added complexity is in turn imposed on any entity that has a relationship to another entity with a composite primary key, and becomes greater the larger your database structure becomes. The problem gets worse with no way to solve it (except by removing the composite primary key entirely).": "Bei großen Projekten kann dies zu enormen Ausfallzeiten (von Minuten bis Stunden) und manchmal sogar zur Einführung eines völlig neuen Migrationsabstraktionssystems führen, das im Wesentlichen Tabellen kopiert, Datensätze in Geistertabellen einfügt und Tabellen nach der Migration hin und her verschiebt. Diese zusätzliche Komplexität wird wiederum jeder Entität auferlegt, die eine Beziehung zu einer anderen Entität mit einem zusammengesetzten Primärschlüssel hat, und wird umso größer, je größer Ihre Datenbankstruktur wird. Das Problem verschlimmert sich, und es gibt keine Möglichkeit, es zu lösen (es sei denn, man entfernt den zusammengesetzten Primärschlüssel ganz).",
"Findability": "Auffindbarkeit",
"If you are a database administrator or Data EngineerScientist, you usually work directly on the database and explore the data when you need it. With composite primary keys, any user writing SQL directly must know the correct primary key of all tables involved (and the column order to get correct index optimizations). This added overhead not only complicates data exploration, report generation, etc., but can also lead to errors in older SQL if a composite primary key is suddenly changed. The old SQL is probably still valid and running fine, but suddenly returns incorrect results because the new field in the composite primary key is missing from the join. It is much easier here to have only one primary key. This makes it easier to find data and ensures that old SQL queries will still work correctly if you decide to change the way a user object is uniquely identified, for example.": "Als Datenbankadministrator oder Data EngineerScientist arbeiten Sie in der Regel direkt an der Datenbank und untersuchen die Daten, wenn Sie sie benötigen. Bei zusammengesetzten Primärschlüsseln muss jeder Benutzer, der SQL direkt schreibt, den korrekten Primärschlüssel aller beteiligten Tabellen kennen (und die Spaltenreihenfolge, um korrekte Indexoptimierungen zu erhalten). Dieser zusätzliche Overhead erschwert nicht nur die Datenexploration, die Erstellung von Berichten usw., sondern kann auch zu Fehlern in älterem SQL führen, wenn ein zusammengesetzter Primärschlüssel plötzlich geändert wird. Das alte SQL ist wahrscheinlich immer noch gültig und läuft einwandfrei, liefert aber plötzlich falsche Ergebnisse, weil das neue Feld im zusammengesetzten Primärschlüssel in der Verknüpfung fehlt. Hier ist es viel einfacher, nur einen Primärschlüssel zu haben. Dies erleichtert das Auffinden von Daten und stellt sicher, dass alte SQL-Abfragen weiterhin korrekt funktionieren, wenn Sie z. B. die Art und Weise ändern, wie ein Benutzerobjekt eindeutig identifiziert wird.",
"Revision": "Revision",
"Once a composite primary key is used in an entity, refactoring the key can result in significant additional refactoring. Because an entity with a composite primary key typically does not have a single unique field, all filters and links must contain all values of the composite key. This usually means that the code relies on knowing the composite primary key, so all fields must be retrieved (e.g., for URLs like user:key1:key2). Once this key is changed, all places where this knowledge is explicitly used, such as URLs, custom SQL queries, and other places, must be rewritten.": "Sobald ein zusammengesetzter Primärschlüssel in einer Entität verwendet wird, kann das Refactoring des Schlüssels zu einem erheblichen zusätzlichen Refactoring führen. Da eine Entität mit einem zusammengesetzten Primärschlüssel normalerweise kein einziges eindeutiges Feld hat, müssen alle Filter und Verknüpfungen alle Werte des zusammengesetzten Schlüssels enthalten. Dies bedeutet in der Regel, dass der Code auf die Kenntnis des zusammengesetzten Primärschlüssels angewiesen ist, so dass alle Felder abgerufen werden müssen (z. B. für URLs wie user:key1:key2). Sobald dieser Schlüssel geändert wird, müssen alle Stellen, an denen dieses Wissen explizit verwendet wird, wie URLs, benutzerdefinierte SQL-Abfragen und andere Stellen, neu geschrieben werden.",
"While ORMs typically create joins automatically without manually specifying the values, they cannot automatically cover refactoring for all other use cases such as URL structures or custom SQL queries, and especially not for places where the ORM is not used at all, such as in reporting systems and all external systems.": "Während ORMs Joins in der Regel automatisch erstellen, ohne dass die Werte manuell angegeben werden müssen, können sie das Refactoring für alle anderen Anwendungsfälle wie URL-Strukturen oder benutzerdefinierte SQL-Abfragen nicht automatisch abdecken, und vor allem nicht für Bereiche, in denen das ORM überhaupt nicht verwendet wird, wie z. B. in Berichtssystemen und allen externen Systemen.",
"ORM complexity": "ORM-Komplexität",
"With the support of composite primary keys, the complexity of the code of a powerful ORM like Deepkit ORM increases tremendously. Not only will the code and maintenance become more complex and therefore more expensive, but there will be more edge cases from users that need to be fixed and maintained. The complexity of the query layer, change detection, migration system, internal relationship tracking, etc. increases significantly. The overall cost associated with building and supporting an ORM with composite primary keys is too high, all things considered, and cannot be justified, which is why Deepkit does not support it.": "Mit der Unterstützung von zusammengesetzten Primärschlüsseln steigt die Komplexität des Codes eines leistungsstarken ORM wie Deepkit ORM enorm. Nicht nur der Code und die Wartung werden komplexer und damit teurer, sondern es gibt auch mehr Randfälle von Benutzern, die behoben und gewartet werden müssen. Die Komplexität der Abfrageschicht, der Änderungserkennung, des Migrationssystems, der Verfolgung interner Beziehungen usw. nimmt erheblich zu. Die Gesamtkosten, die mit dem Aufbau und der Unterstützung eines ORM mit zusammengesetzten Primärschlüsseln verbunden sind, sind alles in allem zu hoch und nicht zu rechtfertigen, weshalb Deepkit sie nicht unterstützt.",
"Advantages": "Vorteile",
"Apart from this, composite primary keys also have advantages, albeit very superficial ones. By using as few indexes as possible for each table, writing (inserting/updating) data becomes more efficient, since fewer indexes need to be maintained. It also makes the structure of the model a bit cleaner (since it usually has one less column). However, the difference between a sequentially ordered, automatically incrementing primary key and a non-incrementing primary key is completely negligible these days, since disk space is cheap and the operation is usually just an \"append-only\" operation, which is very fast.": "Abgesehen davon haben zusammengesetzte Primärschlüssel auch Vorteile, wenn auch sehr oberflächliche. Durch die Verwendung möglichst weniger Indizes für jede Tabelle wird das Schreiben (Einfügen/Aktualisieren) von Daten effizienter, da weniger Indizes gepflegt werden müssen. Auch die Struktur des Modells wird dadurch etwas übersichtlicher (da es in der Regel eine Spalte weniger hat). Der Unterschied zwischen einem sequentiell geordneten, automatisch inkrementierenden Primärschlüssel und einem nicht inkrementierenden Primärschlüssel ist heutzutage jedoch völlig vernachlässigbar, da der Speicherplatz auf der Festplatte billig ist und die Operation in der Regel nur eine \"Append-only\"-Operation ist, die sehr schnell ist.",
"There may certainly be a few edge cases (and for a few very specific database systems) where it is initially better to work with composite primary keys. But even in these systems, it might make more sense overall (considering all the costs) not to use them and to switch to another strategy.": "Es mag sicherlich einige Grenzfälle geben (und für einige sehr spezifische Datenbanksysteme), in denen es zunächst besser ist, mit zusammengesetzten Primärschlüsseln zu arbeiten. Aber selbst in diesen Systemen könnte es insgesamt (unter Berücksichtigung aller Kosten) sinnvoller sein, sie nicht zu verwenden und zu einer anderen Strategie zu wechseln.",
"Alternative": "Alternative",
"An alternative to composite primary keys is to use a single automatically incrementing numeric primary key, usually called \"id\", and move the composite primary key to a unique index with multiple fields. Depending on the primary key used (depending on the expected number of rows), the \"id\" uses either 4 or 8 bytes per record.": "Eine Alternative zu zusammengesetzten Primärschlüsseln ist die Verwendung eines einzigen, automatisch inkrementierenden numerischen Primärschlüssels, in der Regel \"id\" genannt, und die Verlagerung des zusammengesetzten Primärschlüssels in einen eindeutigen Index mit mehreren Feldern. Je nach verwendetem Primärschlüssel (abhängig von der erwarteten Anzahl der Zeilen) verwendet \"id\" entweder 4 oder 8 Bytes pro Datensatz.",
"By using this strategy, you are no longer forced to think about the problems described above and find a solution, which enormously reduces the cost of ever-growing projects.": "Mit dieser Strategie sind Sie nicht mehr gezwungen, über die oben beschriebenen Probleme nachzudenken und eine Lösung zu finden, was die Kosten für immer größer werdende Projekte enorm reduziert.",
"The strategy specifically means that each entity has an \"id\" field, usually at the very beginning, and this field is then used to identify unique rows by default and in joins.": "Die Strategie bedeutet konkret, dass jede Entität ein \"id\"-Feld hat, normalerweise ganz am Anfang, und dieses Feld wird dann verwendet, um eindeutige Zeilen standardmäßig und in Joins zu identifizieren.",
"As an alternative to a composite primary key, you would use a unique multi-field index instead.": "Als Alternative zu einem zusammengesetzten Primärschlüssel können Sie stattdessen einen eindeutigen Mehrfeldindex verwenden.",
"Deepkit ORM automatically supports incremental primary keys, including for MongoDB. This is the preferred method for identifying records in your database. However, for MongoDB you can use the ObjectId (`_id: MongoId & PrimaryKey = ''`) as a simple primary key. An alternative to the numeric, auto-incrementing primary key is a UUID, which works just as well (but has slightly different performance characteristics, since indexing is more expensive).": "Deepkit ORM unterstützt automatisch inkrementelle Primärschlüssel, auch für MongoDB. Dies ist die bevorzugte Methode zur Identifizierung von Datensätzen in Ihrer Datenbank. Für MongoDB können Sie jedoch die ObjectId (`_id: MongoId & PrimaryKey = ''`) als einfachen Primärschlüssel verwenden. Eine Alternative zum numerischen, automatisch inkrementierenden Primärschlüssel ist eine UUID, die genauso gut funktioniert (aber etwas andere Leistungsmerkmale hat, da die Indizierung teurer ist).",
"Summary": "Zusammenfassung",
"Composite primary keys essentially mean that once they are in place, all future changes and practical use come at a much higher cost. While it looks like a clean architecture at the beginning (because you have one less column), it leads to significant practical costs once the project is actually developed, and the costs continue to increase as the project gets larger.": "Zusammengesetzte Primärschlüssel bedeuten im Wesentlichen, dass alle zukünftigen Änderungen und die praktische Verwendung mit viel höheren Kosten verbunden sind. Während es zu Beginn wie eine saubere Architektur aussieht (weil Sie eine Spalte weniger haben), führt es zu erheblichen praktischen Kosten, sobald das Projekt tatsächlich entwickelt ist, und die Kosten steigen weiter, wenn das Projekt größer wird.",
"Looking at the asymmetries between benefits and drawbacks, it is clear that composite primary keys cannot be justified in most cases. The costs are much greater than the benefits. Not only for you as a user, but also for us as the author and maintainer of the ORM code. For this reason, Deepkit ORM does not support composite primary keys.": "Betrachtet man die Asymmetrien zwischen Vor- und Nachteilen, so wird deutlich, dass zusammengesetzte Primärschlüssel in den meisten Fällen nicht zu rechtfertigen sind. Die Kosten sind viel größer als der Nutzen. Nicht nur für Sie als Benutzer, sondern auch für uns als Autor und Betreuer des ORM-Codes. Aus diesem Grund unterstützt der Deepkit ORM keine zusammengesetzten Primärschlüssel.",
"Plugins": "Plugins",
"Soft-Delete": "Soft-Delete",
"The Soft-Delete plugin allows to keep database records hidden without actually deleting them. When a record is deleted, it is only marked as deleted and not actually deleted. All queries automatically filter for this deleted property, so it feels to the user as if it is actually deleted.": "Das Soft-Delete-Plugin ermöglicht es, Datenbankeinträge verborgen zu halten, ohne sie tatsächlich zu löschen. Wenn ein Datensatz gelöscht wird, wird er nur als gelöscht markiert und nicht tatsächlich gelöscht. Alle Abfragen filtern automatisch nach dieser gelöschten Eigenschaft, so dass es sich für den Benutzer so anfühlt, als ob er tatsächlich gelöscht wäre.",
"To use the plugin, you must instantiate the SoftDelete class and enable it for each entity.": "Um das Plugin zu verwenden, müssen Sie die SoftDelete-Klasse instanziieren und sie für jede Entität aktivieren.",
"To soft-delete records, use the usual methods: `deleteOne` or `deleteMany` in a query, or use the session to delete them. The soft-delete plugin will do the rest automatically in the background.": "Um Datensätze sanft zu löschen, verwenden Sie die üblichen Methoden: `deleteOne` oder `deleteMany` in einer Abfrage, oder verwenden Sie die Sitzung, um sie zu löschen. Das Soft-Delete-Plugin erledigt den Rest automatisch im Hintergrund.",
"Restore": "Wiederherstellen",
"Deleted records can be restored using a cancelled query via `SoftDeleteQuery`. It has `restoreOne` and `restoreMany`.": "Gelöschte Datensätze können mit einer abgebrochenen Abfrage über `SoftDeleteQuery` wiederhergestellt werden. Es gibt `restoreOne` und `restoreMany`.",
"The session also supports element recovery.": "Die Sitzung unterstützt auch die Wiederherstellung von Elementen.",
"Hard Delete": "Hartes Löschen",
"To hard delete records, use a lifted query via SoftDeleteQuery. This essentially restores the old behavior without the single query plugin.": "Um Datensätze hart zu löschen, verwenden Sie eine gehobene Abfrage über SoftDeleteQuery. Dies stellt im Wesentlichen das alte Verhalten ohne das Einzelabfrage-Plugin wieder her.",
"Query deleted.": "Abfrage gelöscht.",
"With a \"lifted\" query via `SoftDeleteQuery` you can also include deleted records.": "Mit einer \"gehobenen\" Abfrage über `SoftDeleteQuery` können Sie auch gelöschte Datensätze einbeziehen.",
"Deleted by": "Gelöscht von",
"`deletedBy` can be set via query and sessions.": "`deletedBy` kann über Abfrage und Sitzungen festgelegt werden.",
"Template": "Template",
"The template engine allows to write type-safe, fast and secure HTML templates. It is based on TSX and is ready to use as soon as you use the `.tsx` file extension and adjust the `tsconfig.json` accordingly.": "Die Template-Engine erlaubt es, typsichere, schnelle und sichere HTML-Templates zu schreiben. Sie basiert auf TSX und ist sofort einsatzbereit, sobald Sie die Dateierweiterung `.tsx` verwenden und die `tsconfig.json` entsprechend anpassen.",
"The important thing is: it is not compatible with React. As soon as React is to be used, `@deepkit/template` is incompatible. Deepkit's template engine is only intended for SSR (server-side rendering).": "Das Wichtigste ist: es ist nicht kompatibel mit React. Sobald React verwendet werden soll, ist `@deepkit/template` inkompatibel. Die Template-Engine von Deepkit ist nur für SSR (server-side rendering) gedacht.",
"In your tsconfig you have to adjust following settings: `jsx` and `jsxImportSource`": "In Ihrer tsconfig müssen Sie folgende Einstellungen vornehmen: `jsx` und `jsxImportSource`",
"Now you can use TSX directly in your controller.": "Jetzt können Sie TSX direkt in Ihrem Controller verwenden.",
"When you return such a TSX in your route method, the HTTP content type is automatically set to `texthtml; charset=utf-8`.": "Wenn Sie einen solchen TSX in Ihrer Routenmethode zurückgeben, wird der HTTP-Inhaltstyp automatisch auf `texthtml; charset=utf-8` gesetzt.",
"Components": "Komponenten",
"You can structure your templates the way you are used to in React. Either modularize your layout into multiple function or class components.": "Sie können Ihre Vorlagen so strukturieren, wie Sie es in React gewohnt sind. Entweder modularisieren Sie Ihr Layout in mehrere Funktions- oder Klassenkomponenten.",
"Function Components": "Funktion Komponenten",
"The easiest way is to use a function that returns TSX.": "Am einfachsten ist es, eine Funktion zu verwenden, die TSX zurückgibt.",
"Function components can be asynchronous (unlike in React). This is an important difference from other template engines you may be familiar with, like React.": "Funktionskomponenten können asynchron sein (anders als in React). Dies ist ein wichtiger Unterschied zu anderen Template-Engines, mit denen Sie vielleicht vertraut sind, wie React.",
"All functions have access to the dependency injection container and can reference any dependencies starting with the third parameter.": "Alle Funktionen haben Zugriff auf den Dependency Injection Container und können ab dem dritten Parameter auf alle Abhängigkeiten verweisen.",
"Class Components": "Komponenten der Klasse",
"An alternative way to write a component is a class component. They are handled and instantiated in the Dependency Injection container and thus have access to all services registered in the container. This makes it possible to directly access a data source such as a database in your components, for example.": "Eine alternative Möglichkeit, eine Komponente zu schreiben, ist eine Klassenkomponente. Sie werden im Dependency Injection Container behandelt und instanziiert und haben somit Zugriff auf alle im Container registrierten Dienste. Dadurch ist es möglich, in Ihren Komponenten direkt auf eine Datenquelle wie z. B. eine Datenbank zuzugreifen.",
"For class components the first constructor arguments are reserved. `props` can be defined arbitrarily, `children` is always \"any\", and then optional dependencies follow, which you can choose arbitrarily. Since class components are instantiated in the Dependency Injection container, you have access to all your services.": "Für Klassenkomponenten sind die ersten Konstruktorargumente reserviert. Props\" können beliebig definiert werden, \"Children\" ist immer \"any\", und dann folgen optionale Abhängigkeiten, die Sie beliebig wählen können. Da Klassenkomponenten im Dependency Injection Container instanziiert werden, haben Sie Zugriff auf alle Ihre Dienste.",
"Dynamic HTML": "Dynamisches HTML",
"The template engine has automatically cleaned up all the variables used, so you can safely use user input directly in the template. To render dynamic HTML, you can use the html function.": "Die Template-Engine hat alle verwendeten Variablen automatisch bereinigt, so dass Sie die Benutzereingaben direkt in der Vorlage verwenden können. Um dynamisches HTML zu rendern, können Sie die Funktion html verwenden.",
"Optimization": "Optimierung",
"The template engine tries to optimize the generated JSX code so that it is much easier for NodeJSV8 to generate the HTML string. For this to work correctly, you should move all your components from the main app.tsx file to separate files. A structure might look like this:": "Die Template-Engine versucht, den generierten JSX-Code zu optimieren, so dass es für NodeJSV8 viel einfacher ist, den HTML-String zu generieren. Damit dies korrekt funktioniert, sollten Sie alle Ihre Komponenten aus der Hauptdatei app.tsx in separate Dateien verschieben. Eine Struktur könnte wie folgt aussehen:",
"Framework": "Framework",
"Deepkit Framework is based on runtime types in Deepkit Type. Make sure that `@deepkit/type` is installed correctly. See xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].": "Deepkit Framework basiert auf Laufzeittypen in Deepkit Type. Stellen Sie sicher, dass `@deepkit/type` korrekt installiert ist. Siehe xref:runtime-types.adoc#runtime-types-installation[Runtime Type Installation].",
"Make sure that all peer dependencies are installed. By default, NPM 7+ installs them automatically.": "Stellen Sie sicher, dass alle Peer-Abhängigkeiten installiert sind. Standardmäßig werden sie von NPM 7+ automatisch installiert.",
"To compile your application, we need the TypeScript compiler and recommend `ts-node` to easily run the app.": "Um Ihre Anwendung zu kompilieren, benötigen wir den TypeScript-Compiler und empfehlen `ts-node`, um die Anwendung einfach auszuführen.",
"An alternative to using `ts-node` is to compile the source code with the TypeScript compiler and execute the JavaScript source code directly. This has the advantage of dramatically increasing execution speed for short commands. However, it also creates additional workflow overhead by either manually running the compiler or setting up a watcher. For this reason, `ts-node` is used in all examples in this documentation.": "Eine Alternative zur Verwendung von `ts-node` besteht darin, den Quellcode mit dem TypeScript-Compiler zu kompilieren und den JavaScript-Quellcode direkt auszuführen. Dies hat den Vorteil, dass sich die Ausführungsgeschwindigkeit für kurze Befehle drastisch erhöht. Allerdings entsteht dabei auch zusätzlicher Arbeitsablauf-Overhead, da entweder der Compiler manuell ausgeführt oder ein Watcher eingerichtet werden muss. Aus diesem Grund wird in allen Beispielen in dieser Dokumentation `ts-node` verwendet.",
"Erste Applikation": "Erste Anwendung",
"Since the Deepkit framework does not use configuration files or a special folder structure, you can structure your project however you want. The only two files you need to get started are the TypeScript app.ts file and the TypeScript configuration tsconfig.json.": "Da das Deepkit-Framework keine Konfigurationsdateien oder eine spezielle Ordnerstruktur verwendet, können Sie Ihr Projekt nach Belieben strukturieren. Die einzigen beiden Dateien, die Sie für den Einstieg benötigen, sind die TypeScript-Datei app.ts und die TypeScript-Konfiguration tsconfig.json.",
"Our goal is to have the following files in our project folder:": "Unser Ziel ist es, die folgenden Dateien in unserem Projektordner zu haben:",
"In this code, you can see that we have defined a test command using the `TestCommand` class and created a new app that we run directly using `run()`. By running this script, we start the app.": "In diesem Code sehen Sie, dass wir einen Testbefehl mit der Klasse `TestCommand` definiert und eine neue Anwendung erstellt haben, die wir direkt mit `run()` ausführen. Wenn wir dieses Skript ausführen, starten wir die Anwendung.",
"With the shebang in the first line (`#!...`) we can make our script executable with the following command.": "Mit dem Shebang in der ersten Zeile (`#!...`) können wir unser Skript mit dem folgenden Befehl ausführbar machen.",
"Und dann ausführen:": "Und dann ausführen:",
"Now, to execute our test command, we run the following command.": "Um unseren Testbefehl auszuführen, führen wir den folgenden Befehl aus.",
"In Deepkit Framework everything is now done via this `app.ts`. You can rename the file as you like or create more. Custom CLI commands, HTTP/RPC server, migration commands, and so on are all started from this entry point.": "Im Deepkit Framework wird nun alles über diese `app.ts` erledigt. Sie können die Datei nach Belieben umbenennen oder weitere Dateien erstellen. Benutzerdefinierte CLI-Befehle, HTTP/RPC-Server, Migrationsbefehle usw. werden alle von diesem Einstiegspunkt aus gestartet.",
"To start the HTTP/RPC server, run the following:": "Um den HTTP/RPC-Server zu starten, führen Sie Folgendes aus:",
"To serve requests please read chapter xref:http.adoc[HTTP] or xref:rpc.adoc[RPC]. In chapter xref:cli.adoc[CLI] you can learn more about CLI commands.": "Um Anfragen zu bedienen, lesen Sie bitte das Kapitel xref:http.adoc[HTTP] oder xref:rpc.adoc[RPC]. Im Kapitel xref:cli.adoc[CLI] können Sie mehr über CLI-Befehle erfahren.",
"App": "App",
"Via the `App` object starts like application.": "Über das `App`-Objekt wird eine Anwendung gestartet.",
"The `run()` method lists the arguments and executes the corresponding CLI controller. Since `FrameworkModule` provides its own CLI controllers, which are responsible for starting the HTTP server, for example, these can be called via it.": "Die Methode `run()` listet die Argumente auf und führt den entsprechenden CLI-Controller aus. Da das `FrameworkModule` eigene CLI-Controller zur Verfügung stellt, die z.B. für den Start des HTTP-Servers zuständig sind, können diese über sie aufgerufen werden.",
"The `App` object can also be used to access the Dependency Injection container without running a CLI controller.": "Das \"App\"-Objekt kann auch verwendet werden, um auf den Dependency Injection-Container zuzugreifen, ohne einen CLI-Controller auszuführen.",
"Module": "Modul",
"Deepkit framework is highly modular and allows you to split your application into several handy modules. Each module has its own dependency injection sub-container, configuration, commands and much more. In the chapter \"First application\" you have already created one module - the root module. `new App` takes almost the same arguments as a module, because it creates the root module for you automatically in the background.": "Das Deepkit-Framework ist hochgradig modular und ermöglicht es Ihnen, Ihre Anwendung in mehrere praktische Module zu unterteilen. Jedes Modul hat seinen eigenen Sub-Container für die Injektion von Abhängigkeiten, Konfiguration, Befehle und vieles mehr. Im Kapitel \"Erste Anwendung\" haben Sie bereits ein Modul erstellt - das Root-Modul. Die Funktion `neue App` benötigt fast die gleichen Argumente wie ein Modul, da sie das Root-Modul automatisch im Hintergrund erstellt.",
"You can skip this chapter if you do not plan to split your application into submodules, or if you do not plan to make a module available as a package to others.": "Sie können dieses Kapitel überspringen, wenn Sie nicht vorhaben, Ihre Anwendung in Untermodule aufzuteilen, oder wenn Sie nicht vorhaben, ein Modul als Paket für andere zur Verfügung zu stellen.",
"A module is a simple class:": "Ein Modul ist eine einfache Klasse:",
"It basically has no functionality at this point because its module definition is an empty object and it has no methods, but this demonstrates the relationship between modules and your application (your root module). This MyModule module can then be imported into your application or other modules.": "Es hat zu diesem Zeitpunkt im Grunde keine Funktionalität, da seine Moduldefinition ein leeres Objekt ist und es keine Methoden hat, aber dies demonstriert die Beziehung zwischen Modulen und Ihrer Anwendung (Ihrem Stammmodul). Dieses MyModule-Modul kann dann in Ihre Anwendung oder andere Module importiert werden.",
"You can now add features to this module as you would with `App`. The arguments are the same, except that imports are not available in a module definition. Add HTTPRPCCLI controllers, services, a configuration, event listeners, and various module hooks to make modules more dynamic.": "Sie können nun diesem Modul Funktionen hinzufügen, wie Sie es mit `App` tun würden. Die Argumente sind die gleichen, nur dass Importe in einer Moduldefinition nicht verfügbar sind. Fügen Sie HTTPRPCCLI-Controller, Dienste, eine Konfiguration, Ereignis-Listener und verschiedene Modul-Hooks hinzu, um die Module dynamischer zu machen.",
"Controllers": "Steuerungen",
"Modules can define controllers that are processed by other modules. For example, if you add a controller with decorators from the `@deepkit/http` package, its `HttpModule` module will pick this up and register the found routes in its router. A single controller may contain several such decorators. It is up to the module author who gives you these decorators how he processes the controllers.": "Module können Steuerungen definieren, die von anderen Modulen verarbeitet werden. Wenn Sie zum Beispiel einen Controller mit Dekoratoren aus dem `@deepkit/http`-Paket hinzufügen, wird sein `HttpModule`-Modul dies aufgreifen und die gefundenen Routen in seinem Router registrieren. Ein einzelner Controller kann mehrere solcher Dekoratoren enthalten. Es liegt an dem Modulautor, der Ihnen diese Dekoratoren gibt, wie er die Controller verarbeitet.",
"In Deepkit there are three packages that handles such controllers: HTTP, RPC, and CLI. See their respective chapters to learn more. Below is an example of an HTTP controller:": "In Deepkit gibt es drei Pakete, die solche Steuerungen verwalten: HTTP, RPC und CLI. In den jeweiligen Kapiteln erfahren Sie mehr darüber. Nachfolgend finden Sie ein Beispiel für einen HTTP-Controller:",
"Provider": "Anbieter",
"When you define a provider in the `providers` section of your application, it is accessible throughout your application. For modules, however, these providers are automatically encapsulated in that module's dependency injection subcontainer. You must manually export each provider to make it available to another module or your application.": "Wenn Sie einen Anbieter im Abschnitt \"Anbieter\" Ihrer Anwendung definieren, ist er in Ihrer gesamten Anwendung zugänglich. Bei Modulen werden diese Anbieter jedoch automatisch in den Subcontainer für die Injektion von Abhängigkeiten des Moduls gekapselt. Sie müssen jeden Anbieter manuell exportieren, um ihn für ein anderes Modul oder Ihre Anwendung verfügbar zu machen.",
"To learn more about how providers work, see the xref:dependency-injection.adoc[Dependency Injection] chapter.": "Weitere Informationen über die Funktionsweise von Anbietern finden Sie im Kapitel xref:dependency-injection.adoc[Dependency Injection].",
"When a user imports this module, he has no access to `HelloWorldService` because it is encapsulated in the sub-dependency injection container of `MyModule`.": "Wenn ein Benutzer dieses Modul importiert, hat er keinen Zugriff auf `HelloWorldService`, weil es im Subdependency Injection Container von `MyModule` gekapselt ist.",
"Exports": "Ausfuhren",
"To make providers available in the importer's module, you can include the provider's token in `exports`. This essentially moves the provider up one level into the dependency injection container of the parent module - the importer.": "Um Anbieter im Modul des Importeurs verfügbar zu machen, können Sie das Token des Anbieters in `exports` aufnehmen. Dadurch wird der Anbieter im Wesentlichen eine Ebene höher in den Dependency Injection Container des übergeordneten Moduls - des Importeurs - verschoben.",
"If you have other providers like `FactoryProvider`, `UseClassProvider` etc., you should still use only the class type in the exports.": "Wenn Sie andere Anbieter wie `FactoryProvider`, `UseClassProvider` usw. haben, sollten Sie trotzdem nur den Klassentyp in den Exporten verwenden.",
"We can now import that module and use its exported service in our application code.": "Jetzt können wir dieses Modul importieren und seinen exportierten Dienst in unserem Anwendungscode verwenden.",
"Read the xref:dependency-injection.adoc[Dependency Injection] chapter to learn more.": "Lesen Sie das Kapitel xref:dependency-injection.adoc[Dependency Injection], um mehr zu erfahren.",
"Konfiguration": "Konfiguration",
"In Deepkit framework, modules and your application can have configuration options. For example, a configuration can consist of database URLs, passwords, IPs, and so on. Services, HTTPRPCCLI controllers, and template functions can read these configuration options via dependency injection.": "Im Deepkit-Framework können die Module und Ihre Anwendung über Konfigurationsoptionen verfügen. Eine Konfiguration kann zum Beispiel aus Datenbank-URLs, Passwörtern, IPs usw. bestehen. Dienste, HTTPRPCCLI-Controller und Vorlagenfunktionen können diese Konfigurationsoptionen über Dependency Injection lesen.",
"A configuration can be defined by defining a class with properties. This is a type-safe way to define a configuration for your entire application, and its values are automatically serialized and validated.": "Eine Konfiguration kann durch die Definition einer Klasse mit Eigenschaften definiert werden. Dies ist ein typsicherer Weg, um eine Konfiguration für Ihre gesamte Anwendung zu definieren, und ihre Werte werden automatisch serialisiert und validiert.",
"Beispiel": "Beispiel",
"Configuration class": "Konfiguration Klasse",
"Die Werte für die Konfigurationsoptionen können entweder im Konstruktor des Moduls, mit der Methode `.configure()` oder über Konfigurationslader (z.B. Umgebungsvariablenlader) bereitgestellt werden.": "Die Werte für die Konfigurationsoptionen können entweder im Konstruktor des Moduls, mit der Methode `.configure()` oder über Konfigurationslader (z.B. Umgebungsvariablenlader) bereitgestellt werden.",
"To dynamically change the configuration options of an imported module, you can use the `process` hook. This is a good place to either redirect configuration options or set up an imported module depending on the current module configuration or other module instance information.": "Um die Konfigurationsoptionen eines importierten Moduls dynamisch zu ändern, können Sie den `process`-Haken verwenden. Dies ist ein guter Ort, um entweder Konfigurationsoptionen umzuleiten oder ein importiertes Modul abhängig von der aktuellen Modulkonfiguration oder anderen Modulinstanzinformationen einzurichten.",
"At the application level, it works a little differently:": "Auf der Anwendungsebene funktioniert es ein wenig anders:",
"When the root application module is created from a regular module, it works similarly to regular modules.": "Wenn das Root-Anwendungsmodul aus einem regulären Modul erstellt wird, funktioniert es ähnlich wie reguläre Module.",
"Read configuration values": "Konfigurationswerte lesen",
"To use a configuration option in a service, you can use normal dependency injection. It is possible to inject either the entire configuration object, a single value, or a portion of the configuration.": "Um eine Konfigurationsoption in einem Dienst zu verwenden, können Sie die normale Dependency Injection verwenden. Es ist möglich, entweder das gesamte Konfigurationsobjekt, einen einzelnen Wert oder einen Teil der Konfiguration zu injizieren.",
"Partial": "Teilweise",
"To inject only a subset of the configuration values, use the `Pick` type.": "Um nur eine Teilmenge der Konfigurationswerte zu injizieren, verwenden Sie den Typ `Pick`.",
"Single value": "Einzelner Wert",
"To inject only a single value, use the index access operator.": "Um nur einen einzigen Wert zu injizieren, verwenden Sie den Indexzugriffsoperator.",
"All": "Alle",
"To inject all config values, use the class as dependency.": "Um alle Konfigurationswerte zu injizieren, verwenden Sie die Klasse als Abhängigkeit.",
"Debugger": "Debugger",
"The configuration values of your application and all modules can be displayed in the debugger. Enable the debug option in `FrameworkModule` and open `http://localhost:8080/_debug/configuration`.": "Die Konfigurationswerte Ihrer Anwendung und aller Module können im Debugger angezeigt werden. Aktivieren Sie die Debug-Option in `FrameworkModule` und öffnen Sie `http://localhost:8080/_debug/configuration`.",
"You can also use `ts-node app.ts app:config` to display all available configuration options, the active value, their default value, description and data type.": "Sie können auch `ts-node app.ts app:config` verwenden, um alle verfügbaren Konfigurationsoptionen, den aktiven Wert, ihren Standardwert, die Beschreibung und den Datentyp anzuzeigen.",
"Set configuration values": "Konfigurationswerte einstellen",
"By default, no values are overwritten, so default values are used. There are several ways to set configuration values.": "Standardmäßig werden keine Werte überschrieben, es werden also Standardwerte verwendet. Es gibt mehrere Möglichkeiten, Konfigurationswerte festzulegen.",
"Environment variables for each option": "Umgebungsvariablen für jede Option",
"Environment variable via JSON": "Umgebungsvariable über JSON",
"dotenv-Files": "dotenv-Dateien",
"You can use several methods to load the configuration at the same time. The order in which they are called is important.": "Sie können mehrere Methoden zum gleichzeitigen Laden der Konfiguration verwenden. Die Reihenfolge, in der sie aufgerufen werden, ist wichtig.",
"Environment variables": "Umgebungsvariablen",
"To allow setting each configuration option via its own environment variable, use `loadConfigFromEnv`. The default prefix is `APP_`, but you can change it. It also automatically loads `.env` files. By default, it uses an uppercase naming strategy, but you can change that too.": "Um die Einstellung jeder Konfigurationsoption über eine eigene Umgebungsvariable zu ermöglichen, verwenden Sie `loadConfigFromEnv`. Der Standardpräfix ist `APP_`, aber Sie können ihn ändern. Es lädt auch automatisch `.env`-Dateien. Standardmäßig werden die Dateien in Großbuchstaben benannt, aber auch das können Sie ändern.",
"For configuration options like `pageTitle` above, you can use `APP_PAGE_TITLE=\"Other Title\"` to change the value.": "Für Konfigurationsoptionen wie `pageTitle` oben, können Sie `APP_PAGE_TITLE=\"Other Title\"` verwenden, um den Wert zu ändern.",
"JSON environment variable": "JSON-Umgebungsvariable",
"To change multiple configuration options via a single environment variable, use `loadConfigFromEnvVariable`. The first argument is the name of the environment variable.": "Um mehrere Konfigurationsoptionen über eine einzige Umgebungsvariable zu ändern, verwenden Sie `loadConfigFromEnvVariable`. Das erste Argument ist der Name der Umgebungsvariablen.",
"DotEnv Files": "DotEnv-Dateien",
"To change multiple configuration options via a dotenv file, use `loadConfigFromEnv`. The first argument is either a path to a dotenv (relative to `cwd`) or multiple paths. If it is an array, each path is tried until an existing file is found.": "Um mehrere Konfigurationsoptionen über eine Dotenv-Datei zu ändern, verwenden Sie `loadConfigFromEnv`. Das erste Argument ist entweder ein Pfad zu einer dotenv (relativ zu `cwd`) oder mehrere Pfade. Wenn es ein Array ist, wird jeder Pfad versucht, bis eine existierende Datei gefunden wird.",
"Module Configuration": "Modul-Konfiguration",
"Each imported module can have a module name. This name is used for the configuration paths used above.": "Jedes importierte Modul kann einen Modulnamen haben. Dieser Name wird für die oben verwendeten Konfigurationspfade verwendet.",
"For example, for configuring environment variables, the path for the `FrameworkModule` option port is `FRAMEWORK_PORT`. All names are written in uppercase by default. If a prefix of `APP_` is used, the port can be changed via the following:": "Für die Konfiguration von Umgebungsvariablen lautet der Pfad für die Option `FrameworkModule` zum Beispiel `FRAMEWORK_PORT`. Alle Namen werden standardmäßig in Großbuchstaben geschrieben. Wenn ein Präfix von `APP_` verwendet wird, kann der Port wie folgt geändert werden:",
"In dotenv files it would also be `APP_FRAMEWORK_PORT=9999`.": "In dotenv-Dateien würde es auch `APP_FRAMEWORK_PORT=9999` heißen.",
"In JSON environment variables via `loadConfigFromEnvVariable('APP_CONFIG')` on the other hand, it is the structure of the actual configuration class. `framework` becomes an object.": "Bei JSON-Umgebungsvariablen über `loadConfigFromEnvVariable('APP_CONFIG')` hingegen ist es die Struktur der eigentlichen Konfigurationsklasse. Das `Framework` wird zu einem Objekt.",
"This works the same for all modules. No module prefix is required for your application configuration option (`new App`).": "Dies funktioniert für alle Module gleich. Für Ihre Anwendungskonfigurationsoption (`neue App`) ist kein Modulpräfix erforderlich.",
"Application Server": "Anwendungsserver",
"Public Directory": "Öffentliches Verzeichnis",
"The FrameworkModule provides a way to serve static files such as images, PDFs, binaries, etc. over HTTP. The `publicDir` configuration option lets you specify which folder to use as the default entry point for requests that do not lead to an HTTP controller route. By default, this behavior is disabled (empty value).": "Das FrameworkModule bietet eine Möglichkeit, statische Dateien wie Bilder, PDFs, Binärdateien usw. über HTTP bereitzustellen. Mit der Konfigurationsoption `publicDir` können Sie angeben, welcher Ordner als Standard-Einstiegspunkt für Anfragen verwendet werden soll, die nicht zu einer HTTP-Controller-Route führen. Standardmäßig ist dieses Verhalten deaktiviert (leerer Wert).",
"To enable the provision of public files, set `publicDir` to a folder of your choice. Normally you would choose a name like `publicDir` to make things obvious.": "Um die Bereitstellung von öffentlichen Dateien zu ermöglichen, setzen Sie `publicDir` auf einen Ordner Ihrer Wahl. Normalerweise würden Sie einen Namen wie `publicDir` wählen, um die Dinge offensichtlich zu machen.",
"To change the `publicDir` option, you can change the first argument of `FrameworkModule`.": "Um die Option `publicDir` zu ändern, können Sie das erste Argument von `FrameworkModule` ändern.",
"All files within this configured folder are now accessible via HTTP. For example, if you open `http:localhost:8080logo.jpg`, you will see the image `logo.jpg` in the `publicDir` directory.": "Alle Dateien innerhalb dieses konfigurierten Ordners sind nun über HTTP zugänglich. Wenn Sie zum Beispiel `http:localhost:8080logo.jpg` öffnen, sehen Sie das Bild `logo.jpg` im Verzeichnis `publicDir`.",
"File Structure": "Dateistruktur",
"Deepkit has its own powerful database abstraction library called Deepkit ORM. It is an Object-Relational Mapping (ORM) library that facilitates work with SQL databases and MongoDB.": "Deepkit hat eine eigene leistungsstarke Datenbankabstraktionsbibliothek namens Deepkit ORM. Es handelt sich um eine ORM-Bibliothek (Object-Relational Mapping), die die Arbeit mit SQL-Datenbanken und MongoDB erleichtert.",
"Although you can use any database library, we recommend Deepkit ORM as it is the fastest TypeScript database abstraction library that is perfectly integrated with the Deepkit framework and has many features that will improve your workflow and efficiency.": "Obwohl Sie jede beliebige Datenbankbibliothek verwenden können, empfehlen wir Deepkit ORM, da es die schnellste TypeScript-Datenbankabstraktionsbibliothek ist, die perfekt in das Deepkit-Framework integriert ist und über viele Funktionen verfügt, die Ihren Arbeitsablauf und Ihre Effizienz verbessern werden.",
"To get all the information about Deepkit ORM, see the xref:database.adoc[Database] chapter.": "Alle Informationen über Deepkit ORM finden Sie im Kapitel xref:database.adoc[Database].",
"Database Classes": "Datenbank-Klassen",
"The simplest way to use the `Database` object of Deepkit ORM within the application is to register a class that derives from it.": "Der einfachste Weg, das Objekt \"Database\" des Deepkit ORM in der Anwendung zu verwenden, besteht darin, eine Klasse zu registrieren, die von ihm abgeleitet ist.",
"Create a new class and in its constructor specify the adapter with its parameters and add to the second parameter all entity models that should be connected to this database.": "Erstellen Sie eine neue Klasse und geben Sie in ihrem Konstruktor den Adapter mit seinen Parametern an und fügen Sie dem zweiten Parameter alle Entitätsmodelle hinzu, die mit dieser Datenbank verbunden werden sollen.",
"You can now register this database class as a provider. We also enable `migrateOnStartup` which will automatically create all tables in your database at bootstrap. This is ideal for rapid prototyping, but is not recommended for a serious project or production setup. Normal database migrations should then be used here.": "Sie können nun diese Datenbankklasse als Anbieter registrieren. Wir aktivieren auch `migrateOnStartup`, was automatisch alle Tabellen in Ihrer Datenbank bei Bootstrap erstellen wird. Dies ist ideal für Rapid Prototyping, wird aber nicht für ein ernsthaftes Projekt oder eine Produktionseinrichtung empfohlen. Hier sollten dann normale Datenbankmigrationen verwendet werden.",
"We also enable `debug`, which allows us to open the debugger when the application's server is started and manage your database models directly in its built-in ORM browser.": "Wir aktivieren auch `debug`, was uns erlaubt, den Debugger zu öffnen, wenn der Server der Anwendung gestartet wird, und Ihre Datenbankmodelle direkt in seinem integrierten ORM-Browser zu verwalten.",
"You can now access `SQLiteDatabase` anywhere using Dependency Injection:": "Sie können jetzt überall mit Dependency Injection auf `SQLiteDatabase` zugreifen:",
"Multiple Databases": "Mehrere Datenbanken",
"You can add as many database classes as you like and name them as you like. Be sure to change the name of each database so that it doesn't conflict with others when you use the ORM browser.": "Sie können so viele Datenbankklassen hinzufügen, wie Sie möchten, und sie nach Belieben benennen. Achten Sie darauf, den Namen jeder Datenbank zu ändern, damit er nicht mit anderen in Konflikt gerät, wenn Sie den ORM-Browser verwenden.",
"Manage Data": "Daten verwalten",
"You now have everything set up to manage your database data with the Deepkit ORM Browser. To open the ORM Browser and manage the content, write all the steps from above in the `app.ts` file and start the server.": "Sie haben nun alles für die Verwaltung Ihrer Datenbankdaten mit dem Deepkit ORM Browser eingerichtet. Um den ORM-Browser zu öffnen und den Inhalt zu verwalten, schreiben Sie alle Schritte von oben in die Datei \"app.ts\" und starten Sie den Server.",
"You can now open http://localhost:8080/_debug/database/default.": "Sie können jetzt http://localhost:8080/_debug/database/default öffnen.",
"You can see the ER (entity relationship) diagram. At the moment only one entity is available. If you add more with relationships, you will see all the information at a glance.": "Sie können das ER-Diagramm (Entity Relationship) sehen. Im Moment ist nur eine Entität verfügbar. Wenn Sie weitere Entitäten mit Beziehungen hinzufügen, werden Sie alle Informationen auf einen Blick sehen.",
"If you click on `User` in the left sidebar, you can manage its content. Click the `+` icon and change the title of the new record. After you have changed the required values (such as the user name), click `Confirm`. This will commit all changes to the database and make them permanent. The auto increment ID will be assigned automatically.": "Wenn Sie in der linken Seitenleiste auf `Benutzer` klicken, können Sie den Inhalt verwalten. Klicken Sie auf das Symbol \"+\" und ändern Sie den Titel des neuen Datensatzes. Nachdem Sie die erforderlichen Werte (z. B. den Benutzernamen) geändert haben, klicken Sie auf \"Bestätigen\". Damit werden alle Änderungen in die Datenbank übernommen und sind dauerhaft. Die Autoinkrement-ID wird automatisch zugewiesen.",
"Learn More": "Mehr erfahren",