Bläddra i källkod

implemented i18n and styled the first components of the dashboard

Warafear 1 år sedan
förälder
incheckning
8c7b07a679
50 ändrade filer med 1658 tillägg och 537 borttagningar
  1. 864 0
      .nx/cache/d/daemon.log
  2. 1 1
      .nx/cache/d/server-process.json
  3. 29 0
      package-lock.json
  4. 2 0
      package.json
  5. 14 1
      src/app/app.component.ts
  6. 15 0
      src/app/app.module.ts
  7. 11 11
      src/app/character/character-creator/character-creator.component.ts
  8. 2 2
      src/app/character/character-picker/character-picker.component.html
  9. 10 1
      src/app/character/character-picker/character-picker.component.ts
  10. 13 96
      src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-details/attribute-details.component.html
  11. 11 18
      src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-details/attribute-details.component.ts
  12. 5 1
      src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-field.component.html
  13. 2 9
      src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-field.component.ts
  14. 6 7
      src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-details/save-throw-details.component.html
  15. 3 0
      src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-details/save-throw-details.component.ts
  16. 1 1
      src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-field/save-throw-field.component.html
  17. 7 14
      src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-field/save-throw-field.component.ts
  18. 3 3
      src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-details/skill-details.component.html
  19. 0 60
      src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-details/skill-details.component.ts
  20. 3 2
      src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-field/skill-field.component.html
  21. 6 34
      src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-field/skill-field.component.ts
  22. 3 7
      src/app/journal/journal-stats/info-row/armor-class/armor-class-details/armor-class-details.component.html
  23. 6 2
      src/app/journal/journal-stats/info-row/armor-class/armor-class.component.html
  24. 20 13
      src/app/journal/journal-stats/info-row/conditions/conditions-details/conditions-details.component.html
  25. 84 84
      src/app/journal/journal-stats/info-row/conditions/conditions-details/conditions-details.component.ts
  26. 5 3
      src/app/journal/journal-stats/info-row/conditions/conditions.component.html
  27. 11 16
      src/app/journal/journal-stats/info-row/conditions/exhaustion-details/exhaustion-details.component.html
  28. 1 1
      src/app/journal/journal-stats/info-row/conditions/exhaustion-details/exhaustion-details.component.scss
  29. 4 13
      src/app/journal/journal-stats/info-row/death-save/death-save-details/death-save-details.component.html
  30. 3 3
      src/app/journal/journal-stats/info-row/death-save/death-save.component.html
  31. 2 7
      src/app/journal/journal-stats/info-row/initiative/initiative-details/initiative-details.component.html
  32. 1 1
      src/app/journal/journal-stats/info-row/initiative/initiative.component.html
  33. 14 19
      src/app/journal/journal-stats/info-row/movement/movement-details/movement-details.component.html
  34. 6 2
      src/app/journal/journal-stats/info-row/movement/movement.component.html
  35. 3 7
      src/app/journal/journal-stats/info-row/proficiency/proficiency-details/proficiency-details.component.html
  36. 6 2
      src/app/journal/journal-stats/info-row/proficiency/proficiency-field.component.html
  37. 6 7
      src/app/journal/journal-stats/life-container/hit-dice/hit-dice.component.html
  38. 4 4
      src/app/journal/journal-stats/life-container/life/life-details/life-details.component.html
  39. 1 1
      src/app/journal/journal-stats/life-container/life/life.component.html
  40. 25 17
      src/app/journal/journal-stats/weapons-container/weapon-table/weapon-details/weapon-details.component.html
  41. 6 0
      src/app/journal/journal-stats/weapons-container/weapon-table/weapon-details/weapon-details.component.scss
  42. 73 37
      src/app/journal/journal-stats/weapons-container/weapon-table/weapon-modal/weapon-modal.component.html
  43. 14 14
      src/app/journal/journal-stats/weapons-container/weapon-table/weapon-modal/weapon-modal.component.ts
  44. 7 7
      src/app/journal/journal-stats/weapons-container/weapon-table/weapon-table.component.html
  45. 2 9
      src/app/journal/journal-stats/weapons-container/weapons-container.component.html
  46. 3 0
      src/app/journal/journal.module.ts
  47. 1 0
      src/app/shared-components/shared-components.module.ts
  48. 3 0
      src/app/shared-components/value-box/value-box.component.ts
  49. 306 0
      src/assets/i18n/de.json
  50. 30 0
      src/assets/i18n/en.json

+ 864 - 0
.nx/cache/d/daemon.log

@@ -469170,3 +469170,867 @@ To fix this, set a unique name for each project in a project.json inside the pro
     at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
 [NX Daemon Server] - 2024-02-29T11:45:41.320Z - Time taken for 'hash changed files from watcher' 24.912999987602234ms
 [NX Daemon Server] - 2024-02-29T11:45:41.320Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:22.359Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:22.366Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:22.367Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:22.367Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:04:22.367Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:22.369Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:22.956Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:22.956Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:22.957Z - Time taken for 'hash changed files from watcher' 103.74399995803833ms
+[NX Daemon Server] - 2024-03-01T08:04:22.957Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:24.254Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:24.257Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:24.260Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:24.262Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:24.262Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:24.263Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:24.338Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:24.338Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:24.339Z - Time taken for 'hash changed files from watcher' 27.459499835968018ms
+[NX Daemon Server] - 2024-03-01T08:04:24.341Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:24.564Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:24.565Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:24.576Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:24.577Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:24.577Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:24.578Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:24.649Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:24.649Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:24.650Z - Time taken for 'hash changed files from watcher' 30.27810001373291ms
+[NX Daemon Server] - 2024-03-01T08:04:24.650Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:25.802Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:25.805Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:25.809Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:25.810Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:04:25.811Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:25.813Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:25.882Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:25.882Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:25.884Z - Time taken for 'hash changed files from watcher' 24.168400049209595ms
+[NX Daemon Server] - 2024-03-01T08:04:25.886Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:28.929Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:28.931Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:28.942Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:28.943Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:28.943Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:28.944Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:29.018Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:29.018Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:29.019Z - Time taken for 'hash changed files from watcher' 30.617500066757202ms
+[NX Daemon Server] - 2024-03-01T08:04:29.019Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:30.161Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:30.163Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:30.165Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:30.165Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:04:30.167Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:30.169Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:30.227Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:30.227Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:30.228Z - Time taken for 'hash changed files from watcher' 10.676000118255615ms
+[NX Daemon Server] - 2024-03-01T08:04:30.230Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:38.297Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:38.298Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:38.311Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:38.311Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:38.311Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:38.313Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:38.385Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:38.385Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:38.386Z - Time taken for 'hash changed files from watcher' 30.77779984474182ms
+[NX Daemon Server] - 2024-03-01T08:04:38.386Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:39.507Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:39.513Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:39.514Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:39.515Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:04:39.516Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:39.518Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:39.584Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:39.585Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:39.586Z - Time taken for 'hash changed files from watcher' 21.82949995994568ms
+[NX Daemon Server] - 2024-03-01T08:04:39.587Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:53.665Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:53.676Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:53.676Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:53.676Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:04:53.677Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:53.678Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:53.744Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:53.744Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:53.744Z - Time taken for 'hash changed files from watcher' 22.81410002708435ms
+[NX Daemon Server] - 2024-03-01T08:04:53.744Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:54.939Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:54.942Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:54.954Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:54.957Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:54.957Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:54.958Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:55.032Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:55.033Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:55.034Z - Time taken for 'hash changed files from watcher' 26.830100059509277ms
+[NX Daemon Server] - 2024-03-01T08:04:55.035Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:55.263Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:55.265Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:55.272Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:55.272Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:55.273Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:55.274Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:55.347Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:55.347Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:55.348Z - Time taken for 'hash changed files from watcher' 30.9060001373291ms
+[NX Daemon Server] - 2024-03-01T08:04:55.348Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:04:56.532Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:04:56.535Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:04:56.541Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:56.543Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:04:56.543Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:04:56.545Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:04:56.625Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:04:56.626Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:04:56.627Z - Time taken for 'hash changed files from watcher' 26.764299869537354ms
+[NX Daemon Server] - 2024-03-01T08:04:56.629Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:19.061Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:19.063Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:19.066Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:19.066Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:19.066Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:19.069Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:19.145Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:19.146Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:19.146Z - Time taken for 'hash changed files from watcher' 28.36680006980896ms
+[NX Daemon Server] - 2024-03-01T08:05:19.146Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:20.340Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:20.343Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:20.348Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:20.352Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:20.352Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:20.354Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:20.430Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:20.430Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:20.432Z - Time taken for 'hash changed files from watcher' 24.73450016975403ms
+[NX Daemon Server] - 2024-03-01T08:05:20.433Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:20.676Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:20.678Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:20.688Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:20.689Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:20.690Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:20.692Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:20.754Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:20.755Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:20.755Z - Time taken for 'hash changed files from watcher' 14.235100030899048ms
+[NX Daemon Server] - 2024-03-01T08:05:20.755Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:21.968Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:21.971Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:21.976Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:21.979Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:21.979Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:21.981Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:22.058Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:22.058Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:22.060Z - Time taken for 'hash changed files from watcher' 25.7393000125885ms
+[NX Daemon Server] - 2024-03-01T08:05:22.061Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:25.051Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:25.053Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:25.064Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:25.065Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:25.065Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:25.066Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:25.154Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:25.154Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:25.154Z - Time taken for 'hash changed files from watcher' 45.42729997634888ms
+[NX Daemon Server] - 2024-03-01T08:05:25.154Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:26.360Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:26.362Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:26.374Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:26.376Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2024-03-01T08:05:26.377Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:26.378Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:26.455Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:26.455Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:26.456Z - Time taken for 'hash changed files from watcher' 27.584500074386597ms
+[NX Daemon Server] - 2024-03-01T08:05:26.458Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:34.441Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:34.443Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:34.447Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:34.448Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:34.448Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:34.450Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:34.524Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:34.524Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:34.525Z - Time taken for 'hash changed files from watcher' 28.79289984703064ms
+[NX Daemon Server] - 2024-03-01T08:05:34.525Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:35.693Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:35.696Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:35.708Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:35.711Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:35.711Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:35.713Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:35.804Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:35.804Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:35.806Z - Time taken for 'hash changed files from watcher' 42.62030005455017ms
+[NX Daemon Server] - 2024-03-01T08:05:35.807Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:50.809Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:50.812Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:50.824Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:50.824Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:50.824Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:50.825Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:50.882Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:50.883Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:50.883Z - Time taken for 'hash changed files from watcher' 15.101900100708008ms
+[NX Daemon Server] - 2024-03-01T08:05:50.883Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:05:52.022Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:05:52.025Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:05:52.032Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:52.034Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:05:52.035Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:05:52.037Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:05:52.114Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:05:52.114Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:05:52.115Z - Time taken for 'hash changed files from watcher' 26.359600067138672ms
+[NX Daemon Server] - 2024-03-01T08:05:52.117Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:06:16.178Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:06:16.180Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:06:16.189Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:06:16.190Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:06:16.190Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:06:16.191Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:06:16.279Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:06:16.279Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:06:16.280Z - Time taken for 'hash changed files from watcher' 46.53250002861023ms
+[NX Daemon Server] - 2024-03-01T08:06:16.280Z - Done responding to the client null
+[NX Daemon Server] - 2024-03-01T08:06:17.568Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\83d14e7134fc08a15480\d.sock
+[NX Daemon Server] - 2024-03-01T08:06:17.570Z - [WATCHER]: Subscribed to changes within: c:\Softwareprojekte\DnD (native)
+[NX Daemon Server] - 2024-03-01T08:06:17.578Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:06:17.580Z - Closed a connection. Number of open connections: 0
+[NX Daemon Server] - 2024-03-01T08:06:17.580Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2024-03-01T08:06:17.581Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2024-03-01T08:06:17.656Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2024-03-01T08:06:17.656Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Softwareprojekte\DnD\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Softwareprojekte\DnD\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Softwareprojekte\DnD\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2024-03-01T08:06:17.658Z - Time taken for 'hash changed files from watcher' 27.850200176239014ms
+[NX Daemon Server] - 2024-03-01T08:06:17.659Z - Done responding to the client null

+ 1 - 1
.nx/cache/d/server-process.json

@@ -1 +1 @@
-{"processId":24496}
+{"processId":10096}

+ 29 - 0
package-lock.json

@@ -19,6 +19,8 @@
         "@angular/platform-browser-dynamic": "^17.0.3",
         "@angular/router": "^17.0.3",
         "@ng-bootstrap/ng-bootstrap": "^16.0.0-rc.2",
+        "@ngx-translate/core": "^15.0.0",
+        "@ngx-translate/http-loader": "^8.0.0",
         "@popperjs/core": "^2.11.6",
         "bootstrap": "^5.2.3",
         "localbase": "^0.7.5",
@@ -4644,6 +4646,33 @@
         "webpack": "^5.54.0"
       }
     },
+    "node_modules/@ngx-translate/core": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-15.0.0.tgz",
+      "integrity": "sha512-Am5uiuR0bOOxyoercDnAA3rJVizo4RRqJHo8N3RqJ+XfzVP/I845yEnMADykOHvM6HkVm4SZSnJBOiz0Anx5BA==",
+      "engines": {
+        "node": "^16.13.0 || >=18.10.0"
+      },
+      "peerDependencies": {
+        "@angular/common": ">=16.0.0",
+        "@angular/core": ">=16.0.0",
+        "rxjs": "^6.5.5 || ^7.4.0"
+      }
+    },
+    "node_modules/@ngx-translate/http-loader": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-8.0.0.tgz",
+      "integrity": "sha512-SFMsdUcmHF5OdZkL1CHEoSAwbP5EbAOPTLLboOCRRoOg21P4GJx+51jxGdJeGve6LSKLf4Pay7BkTwmE6vxYlg==",
+      "engines": {
+        "node": "^16.13.0 || >=18.10.0"
+      },
+      "peerDependencies": {
+        "@angular/common": ">=16.0.0",
+        "@angular/core": ">=16.0.0",
+        "@ngx-translate/core": ">=15.0.0",
+        "rxjs": "^6.5.5 || ^7.4.0"
+      }
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",

+ 2 - 0
package.json

@@ -22,6 +22,8 @@
     "@angular/platform-browser-dynamic": "^17.0.3",
     "@angular/router": "^17.0.3",
     "@ng-bootstrap/ng-bootstrap": "^16.0.0-rc.2",
+    "@ngx-translate/core": "^15.0.0",
+    "@ngx-translate/http-loader": "^8.0.0",
     "@popperjs/core": "^2.11.6",
     "bootstrap": "^5.2.3",
     "localbase": "^0.7.5",

+ 14 - 1
src/app/app.component.ts

@@ -1,4 +1,5 @@
 import { Component } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'app-root',
@@ -6,5 +7,17 @@ import { Component } from '@angular/core';
   styleUrls: ['./app.component.scss'],
 })
 export class AppComponent {
-  title = 'DnDTools';
+  title = 'Tools';
+
+  constructor(public translate: TranslateService) {
+    this.initTranslation();
+  }
+
+  private initTranslation(): void {
+    this.translate.addLangs(['en', 'de']);
+    this.translate.setDefaultLang('de');
+
+    const browserLang: string = this.translate.getBrowserLang() || 'de';
+    this.translate.use(browserLang.match(/en|de/) ? browserLang : 'de');
+  }
 }

+ 15 - 0
src/app/app.module.ts

@@ -5,6 +5,13 @@ import { AppComponent } from './app.component';
 import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
 import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 import { MatSlideToggleModule } from '@angular/material/slide-toggle';
+import { HttpClient, HttpClientModule } from '@angular/common/http';
+import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
+import { TranslateHttpLoader } from '@ngx-translate/http-loader';
+
+export function HttpLoaderFactory(httpClient: HttpClient) {
+  return new TranslateHttpLoader(httpClient);
+}
 
 @NgModule({
   declarations: [AppComponent],
@@ -14,6 +21,14 @@ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
     NgbModule,
     BrowserAnimationsModule,
     MatSlideToggleModule,
+    HttpClientModule,
+    TranslateModule.forRoot({
+      loader: {
+        provide: TranslateLoader,
+        useFactory: HttpLoaderFactory,
+        deps: [HttpClient],
+      },
+    }),
   ],
   providers: [],
   bootstrap: [AppComponent],

+ 11 - 11
src/app/character/character-creator/character-creator.component.ts

@@ -93,17 +93,17 @@ export class CharacterCreatorComponent {
 
   public spellcastingAttributes: any = {
     Barbarian: null,
-    Bard: 'Charisma',
-    Cleric: 'Wisdom',
-    Druid: 'Wisdom',
+    Bard: 'charisma',
+    Cleric: 'wisdom',
+    Druid: 'wisdom',
     Fighter: null,
-    Monk: 'Wisdom',
-    Paladin: 'Charisma',
-    Ranger: 'Wisdom',
-    Rogue: 'Intelligence',
-    Sorcerer: 'Charisma',
-    Warlock: 'Charisma',
-    Wizard: 'Intelligence',
+    Monk: 'wisdom',
+    Paladin: 'charisma',
+    Ranger: 'wisdom',
+    Rogue: 'intelligence',
+    Sorcerer: 'charisma',
+    Warlock: 'charisma',
+    Wizard: 'intelligence',
   };
 
   public characterName: string = '';
@@ -265,7 +265,7 @@ export class CharacterCreatorComponent {
           martial: false,
           other: [],
           tools: [],
-          languages: ['Gemeinsprache'],
+          languages: ['common'],
         },
         'proficiencies',
       ),

+ 2 - 2
src/app/character/character-picker/character-picker.component.html

@@ -55,7 +55,7 @@
       type="button"
       class="btn-close"
       aria-label="Close"
-      (click)="warning.dismiss('dismiss')"
+      (click)="warning.dismiss('dismiss'); acknowledgeWarning()"
     ></button>
   </div>
   <div class="modal-body">
@@ -74,7 +74,7 @@
     <button
       style="display: block; margin: auto; margin-top: 32px"
       class="okay-button"
-      (click)="warning.dismiss('dismiss')"
+      (click)="warning.dismiss('dismiss'); acknowledgeWarning()"
     >
       Verstanden!
     </button>

+ 10 - 1
src/app/character/character-picker/character-picker.component.ts

@@ -80,6 +80,15 @@ export class CharacterPickerComponent {
   }
 
   showWarning(warning: TemplateRef<any>) {
-    this.modalService.open(warning, { ariaLabelledBy: 'modal-basic-title' });
+    let warningWasAcknowledged = sessionStorage.getItem(
+      'warningWasAcknowledged',
+    );
+    if (!warningWasAcknowledged) {
+      this.modalService.open(warning, { ariaLabelledBy: 'modal-basic-title' });
+    }
+  }
+
+  public acknowledgeWarning() {
+    sessionStorage.setItem('warningWasAcknowledged', 'true');
   }
 }

+ 13 - 96
src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-details/attribute-details.component.html

@@ -1,39 +1,21 @@
 <div>
-  @switch (attribute.name) {
-    @case ("strength") {
-      <ng-container [ngTemplateOutlet]="strengthTemplate"></ng-container>
-    }
-    @case ("dexterity") {
-      <ng-container [ngTemplateOutlet]="dexterityTemplate"></ng-container>
-    }
-    @case ("constitution") {
-      <ng-container [ngTemplateOutlet]="constitutionTemplate"></ng-container>
-    }
-    @case ("intelligence") {
-      <ng-container [ngTemplateOutlet]="intelligenceTemplate"></ng-container>
-    }
-    @case ("wisdom") {
-      <ng-container [ngTemplateOutlet]="wisdomTemplate"></ng-container>
-    }
-    @case ("charisma") {
-      <ng-container [ngTemplateOutlet]="charismaTemplate"></ng-container>
-    }
-    @default {
-      Leider gab es einen Fehler bei der Datenübertragung. Bitte öffne ein Issue
-      auf Github.
-    }
-  }
+  <div class="title">{{ "attributes." + attribute.name | translate }}</div>
+  <div class="content">
+    {{ "attributeDetails." + attribute.name | translate }}
+  </div>
 </div>
 <div class="attribute-container">
-  <value-box [value]="attribute.value" [label]="'Attributwert'"></value-box>
-  <value-box [value]="modifier" [label]="'Modifikator'"></value-box>
+  <value-box [value]="attribute.value" [label]="'attributeValue'"></value-box>
+  <value-box [value]="modifier" [label]="'modifier'"></value-box>
 </div>
 
 @if (attribute.name !== "constitution") {
-  <div class="subheading">Beeinflusste Fähigkeiten:</div>
+  <div class="subheading">
+    {{ "attributeDetails.affectedSkills" | translate }}
+  </div>
   <div class="skills">
     @for (skill of skillsTable[attribute.name]; track skill) {
-      <div class="skill-item">{{ skill }}</div>
+      <div class="skill-item">{{ "skills." + skill | translate }}</div>
     }
   </div>
 } @else {
@@ -42,13 +24,13 @@
 
 <mat-expansion-panel>
   <mat-expansion-panel-header>
-    <mat-panel-title>Modifikatoren</mat-panel-title>
+    <mat-panel-title>{{ "general.modifiers" | translate }}</mat-panel-title>
   </mat-expansion-panel-header>
   <table class="table table-striped">
     <thead>
       <tr>
-        <th scope="col">Attributwert</th>
-        <th scope="col">Modifikator</th>
+        <th scope="col">{{ "general.attributeValue" | translate }}</th>
+        <th scope="col">{{ "general.modifier" | translate }}</th>
       </tr>
     </thead>
     <tbody>
@@ -99,68 +81,3 @@
     </tbody>
   </table>
 </mat-expansion-panel>
-
-<ng-template #strengthTemplate>
-  <div class="title">Stärke</div>
-  <div class="content">
-    Stärke misst die physische Kraft und Muskulatur deines Charakters. Ein hoher
-    Stärkewert deutet auf körperliche Robustheit, Muskelkraft und
-    Durchsetzungsvermögen hin. Charaktere mit hoher Stärke sind oft besser in
-    der Lage, schwere Lasten zu tragen, mächtige Waffen zu schwingen und
-    physische Herausforderungen zu bewältigen.
-  </div>
-</ng-template>
-
-<ng-template #dexterityTemplate>
-  <div class="title">Geschicklichkeit</div>
-  <div class="content">
-    Geschicklichkeit repräsentiert die Beweglichkeit, Reflexe und allgemeine
-    Körperbeherrschung deines Charakters. Ein hoher Geschicklichkeitswert deutet
-    auf schnelle Reaktionen, geschickte Bewegungen und eine gute
-    Hand-Auge-Koordination hin. Charaktere mit hoher Geschicklichkeit sind oft
-    geschickte Diebe, Bogenschützen oder Akrobaten.
-  </div>
-</ng-template>
-
-<ng-template #constitutionTemplate>
-  <div class="title">Konstitution</div>
-  <div class="content">
-    Konstitution steht für die Widerstandsfähigkeit, Gesundheit und Ausdauer
-    deines Charakters. Ein hoher Konstitutionswert bedeutet, dass dein Charakter
-    robust ist und gut mit physischem Stress umgehen kann. Charaktere mit hoher
-    Konstitution haben oft eine höhere Lebenspunktzahl und sind
-    widerstandsfähiger gegenüber Krankheiten und Gift.
-  </div>
-</ng-template>
-
-<ng-template #intelligenceTemplate>
-  <div class="title">Intelligenz</div>
-  <div class="content">
-    Intelligenz misst die geistige Schärfe, das logische Denkvermögen und die
-    Lernfähigkeit deines Charakters. Ein hoher Intelligenzwert deutet auf eine
-    gute Allgemeinbildung, Wissensdurst und analytische Fähigkeiten hin.
-    Charaktere mit hoher Intelligenz sind oft Magier, Forscher oder Strategen.
-  </div>
-</ng-template>
-
-<ng-template #wisdomTemplate>
-  <div class="title">Weisheit</div>
-  <div class="content">
-    Beschreibung: Weisheit repräsentiert die Wahrnehmung, Intuition und
-    emotionale Intelligenz deines Charakters. Ein hoher Weisheitswert deutet auf
-    eine gute Urteilsfähigkeit, Einsicht und innere Stärke hin. Charaktere mit
-    hoher Weisheit sind oft Kleriker, Druiden oder Weise.
-  </div>
-</ng-template>
-
-<ng-template #charismaTemplate>
-  <div class="title">Charisma</div>
-  <div class="content">
-    Charisma spiegelt die Ausstrahlung, Überzeugungskraft und soziale
-    Fähigkeiten deines Charakters wider. Ein hoher Charismawert bedeutet, dass
-    dein Charakter charmant, einnehmend und überzeugend ist. Charaktere mit
-    hohem Charisma können oft besser mit anderen kommunizieren, überzeugen und
-    Führungsaufgaben übernehmen. Charisma ist oft wichtig für Barden, Anführer
-    oder Diplomaten.
-  </div>
-</ng-template>

+ 11 - 18
src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-details/attribute-details.component.ts

@@ -1,6 +1,7 @@
 import { Component, Input } from '@angular/core';
 import { DetailsService } from 'src/services/details/details.service';
 import { Attribute } from 'src/interfaces/attribute';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'app-attribute-details',
@@ -8,28 +9,20 @@ import { Attribute } from 'src/interfaces/attribute';
   styleUrl: './attribute-details.component.scss',
 })
 export class AttributeDetailsComponent {
-  public constructor(public detailsService: DetailsService) {}
   @Input() public attribute!: Attribute;
   @Input() public modifier!: string;
 
+  public constructor(
+    public detailsService: DetailsService,
+    public translate: TranslateService,
+  ) {}
+
   public skillsTable: any = {
-    strength: ['Athletik'],
-    dexterity: ['Akrobatik', 'Fingerfertigkeit', 'Heimlichkeit'],
+    strength: ['athletics'],
+    dexterity: ['acrobatics', 'sleightOfHands', 'stealth'],
     constitution: [],
-    intelligence: [
-      'Arkana',
-      'Geschichte',
-      'Nachforschung',
-      'Naturkunde',
-      'Religion',
-    ],
-    wisdom: [
-      'Tierkunde',
-      'Motiv erkennen',
-      'Heilkunde',
-      'Wahrnehmung',
-      'Überlebenskunde',
-    ],
-    charisma: ['Täuschung', 'Einschüchterung', 'Auftreten', 'Überzeugung'],
+    intelligence: ['arcana', 'history', 'investigation', 'nature', 'religion'],
+    wisdom: ['animalHandling', 'insight', 'medicine', 'perception', 'survival'],
+    charisma: ['deception', 'intimidation', 'performance', 'persuasion'],
   };
 }

+ 5 - 1
src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-field.component.html

@@ -1,10 +1,14 @@
 <div class="attribute-box" (click)="openDetails()">
   <div>
-    <label class="attribute-name">{{ attributeNames[attributeName] }}</label>
+    <!-- <label for="attribute-vale" class="attribute-name">{{ attributeNames[attributeName] }}</label> -->
+    <label for="attribute-vale" class="attribute-name">
+      {{ "attributes." + attribute.name | translate }}</label
+    >
   </div>
   <div class="attribute-modifier">{{ attributeModifier }}</div>
   <div>
     <input
+      id="attribute-value"
       type="number"
       [(ngModel)]="attribute.value"
       (change)="updateValue()"

+ 2 - 9
src/app/journal/journal-stats/attribute-skill-container/attribute-panel/attribute-field/attribute-field.component.ts

@@ -4,6 +4,7 @@ import { DataService } from 'src/services/data/data.service';
 import { DetailsService } from 'src/services/details/details.service';
 import { Observable } from 'rxjs';
 import { AttributeDetailsComponent } from './attribute-details/attribute-details.component';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'attribute-field',
@@ -17,18 +18,10 @@ export class AttributeFieldComponent {
   public saveModifier: string = '0';
   public proficiencyBonus: number = 0;
 
-  public attributeNames: any = {
-    strength: 'Stärke',
-    dexterity: 'Geschicklichkeit',
-    constitution: 'Konstitution',
-    intelligence: 'Intelligenz',
-    wisdom: 'Weisheit',
-    charisma: 'Charisma',
-  };
-
   public constructor(
     public dataAccessor: DataService,
     public detailsAccessor: DetailsService,
+    public translate: TranslateService,
   ) {}
 
   ngOnInit(): void {

+ 6 - 7
src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-details/save-throw-details.component.html

@@ -1,11 +1,10 @@
-<div class="title">{{ attributeName }}</div>
-<div class="subheading" style="margin-top: 0.5rem">Rettungswurf</div>
+<div class="title">{{ "attributes." + attributeName | translate }}</div>
+<div class="subheading" style="margin-top: 0.5rem">
+  {{ "savingThrow.subheading" | translate }}
+</div>
 
 <div class="content">
-  Ein Rettungswurf wird immer dann verlangt, wenn überprüft werden soll, ob ein
-  Spieler einem Angriff oder äußeren Einfluss widerstehen kann. Durch das
-  bestehen eines Rettungswurfes kann der Effekt verhindert, oder zumindest
-  abgeschwächt werden.
+  {{ "savingThrow.content" | translate }}
 </div>
 
-<value-box [value]="saveModifier" [label]="'Modifikator'"></value-box>
+<value-box [value]="saveModifier" [label]="'modifier'"></value-box>

+ 3 - 0
src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-details/save-throw-details.component.ts

@@ -1,4 +1,5 @@
 import { Component, Input } from '@angular/core';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'app-save-throw-details',
@@ -8,4 +9,6 @@ import { Component, Input } from '@angular/core';
 export class SaveThrowDetailsComponent {
   @Input() attributeName: string = '';
   @Input() saveModifier: string = '';
+
+  constructor(public translate: TranslateService) {}
 }

+ 1 - 1
src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-field/save-throw-field.component.html

@@ -7,7 +7,7 @@
   />
 
   <div class="save-throw-field__name">
-    {{ nameTranslator[attributeName] }}
+    {{ "attributes." + attribute.name | translate }}
   </div>
 
   <div class="save-throw-field__value">{{ saveModifier }}</div>

+ 7 - 14
src/app/journal/journal-stats/attribute-skill-container/save-throw-panel/save-throw-field/save-throw-field.component.ts

@@ -4,6 +4,7 @@ import { Observable } from 'rxjs';
 import { Attribute } from 'src/interfaces/attribute';
 import { DetailsService } from 'src/services/details/details.service';
 import { SaveThrowDetailsComponent } from '../save-throw-details/save-throw-details.component';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'save-throw-field',
@@ -11,11 +12,6 @@ import { SaveThrowDetailsComponent } from '../save-throw-details/save-throw-deta
   styleUrls: ['./save-throw-field.component.scss'],
 })
 export class SaveThrowFieldComponent {
-  constructor(
-    public dataAccessor: DataService,
-    public detailsAccessor: DetailsService,
-  ) {}
-
   @Input() attributeName: string = '';
   public attribute: Attribute = { name: '', value: 0, proficiency: false };
 
@@ -23,14 +19,11 @@ export class SaveThrowFieldComponent {
   private attributeModifier: number = 0;
   public saveModifier: string = '0';
 
-  public nameTranslator: any = {
-    strength: 'Stärke',
-    dexterity: 'Geschicklichkeit',
-    constitution: 'Konstitution',
-    intelligence: 'Intelligenz',
-    wisdom: 'Weisheit',
-    charisma: 'Charisma',
-  };
+  constructor(
+    public dataAccessor: DataService,
+    public detailsAccessor: DetailsService,
+    public translate: TranslateService,
+  ) {}
 
   public ngOnInit(): void {
     this.initAttributeSubscription();
@@ -74,7 +67,7 @@ export class SaveThrowFieldComponent {
 
   public openDetails(): void {
     this.detailsAccessor.openPanel(SaveThrowDetailsComponent, {
-      attributeName: this.nameTranslator[this.attributeName],
+      attributeName: this.attributeName,
       saveModifier: this.saveModifier,
     });
   }

+ 3 - 3
src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-details/skill-details.component.html

@@ -1,3 +1,3 @@
-<div class="title">{{ skillNames[skillName] }}</div>
-<div class="content">{{ descriptions[skillName] }}</div>
-<value-box [value]="skillModifier" [label]="'Modifikator'"></value-box>
+<div class="title">{{ "skills." + skillName | translate }}</div>
+<div class="content">{{ "skillsDescription." + skillName | translate }}</div>
+<value-box [value]="skillModifier" [label]="'modifier'"></value-box>

+ 0 - 60
src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-details/skill-details.component.ts

@@ -8,64 +8,4 @@ import { Component, Input } from '@angular/core';
 export class SkillDetailsComponent {
   @Input() skillName: string = '';
   @Input() skillModifier: string = '';
-
-  skillNames: any = {
-    acrobatics: 'Akrobatik',
-    animalHandling: 'Tierkunde',
-    arcana: 'Arkana',
-    athletics: 'Athletik',
-    deception: 'Täuschen',
-    history: 'Geschichte',
-    insight: 'Motiv erkennen',
-    intimidation: 'Einschüchtern',
-    investigation: 'Nachforschung',
-    medicine: 'Heilkunde',
-    nature: 'Naturkunde',
-    perception: 'Wahrnehmung',
-    performance: 'Auftreten',
-    persuasion: 'Überreden',
-    religion: 'Religion',
-    sleightOfHands: 'Fingerfertigkeit',
-    stealth: 'Heimlichkeit',
-    survival: 'Überleben',
-  };
-
-  public descriptions: any = {
-    acrobatics:
-      'Würfe auf Akrobatik decken alle Versuche ab, in denen ein Charakter in schwierigen Situtationen auf den Beinen bleiben will. Dies beinhaltet z.B. das Balancieren auf einem Seil, das Rennen über instabile Oberflächen, das Balancieren auf einem schmalen Vorsprung und das Springen über Hindernisse.',
-    animalHandling:
-      'Würfe auf Tierkunde decken alle Versuche ab, ein domestiziertes Tier zu beruhigen, ein Reittier vor dem Scheuen zu bewahren oder intuitiv zu verstehen, wie es einem wilden Tier geht und was seine Absichten sind.',
-    arcana:
-      'Würfe auf Arkana decken alle Versuche ab, magische Energie zu identifizieren, zu verstehen oder zu manipulieren.',
-    athletics:
-      'Würfe auf Athletik decken alle Versuche ab, die körperliche Kraft eines Charakters zu testen. Dies beinhaltet z.B. das Klettern, das Schwimmen und das Springen.',
-    deception:
-      'Würfe auf Täuschen zeigen an, ob ein Charakter überzeugend die Wahrheit verbergen kann, sei es nun verbal oder durch konkretes Handeln. Dies beinhaltet z.B. das Lügen, das Verbergen von Emotionen hinter einer Maske und das Verkleiden.',
-    history:
-      'Würfe auf Geschichte decken alle Versuche ab, sich an historische Ereignisse und Personen, vergangene Zeitalter, alte Reiche und vergessene Kulturen zu erinnern.',
-    insight:
-      'Würfe auf Motiv erkennen decken alle Versuche ab, die wahren Absichten einer anderen Person zu erkennen. Dies beinhaltet z.B. das Erkennen von Lügen, das Interpretieren von Körpersprache und das Voraussagen seiner nächsten Schritte.',
-    intimidation:
-      'Würfe auf Einschüchtern decken alle Versuche ab, eine andere Person durch Drohungen, offensichtliche Gewalt oder subtile Hinweise zu beeinflussen.',
-    investigation:
-      'Würfe auf Nachforschung decken alle Versuche ab, Hinweise zu finden und zu interpretieren, die auf eine vorherige Aktivität hindeuten. Dies beinhalet z.B. auch das Rekonstruieren von Tathergängen oder das Aufspüren verborgener Gegenstände.',
-    medicine:
-      'Würfe auf Heilkunde decken alle Versuche ab, einen Charakter zu stabilisieren, eine Krankheit zu heilen oder eine Wunde zu verbinden.',
-    nature:
-      'Würfe auf Naturkunde decken alle Versuche ab, die Eigenschaften von wilden Tieren, Pflanzen und anderen Wesen zu erkennen.',
-    perception:
-      'Würfe auf Wahrnehmung decken alle Versuche ab, die Umgebung zu beobachten und zu bemerken, was sich in der Nähe befindet. Dies beinhaltet z.B. das Erkennen von versteckten Feinden, das Hören von Gesprächen hinter einer Tür, das Entdecken von Hinweisen und das Beobachten von Gefahren.',
-    performance:
-      'Würfe auf Auftreten decken alle Versuche ab, ein Publikum zu unterhalten, sei es nun durch Musik, Tanzen, Schauspielerei oder andere Formen der Unterhaltung.',
-    persuasion:
-      'Würfe auf Überreden decken alle Versuche ab, eine andere Person durch Überzeugung, Logik oder Argumentation zu beeinflussen.',
-    religion:
-      'Würfe auf Religion decken alle Versuche ab, religiöse Rituale zu verstehen, religiöse Symbole zu erkennen und religiöse Traditionen zu interpretieren.',
-    sleightOfHands:
-      'Würfe auf Fingerfertigkeit decken alle Versuche ab, etwas zu stehlen, einen Trick zu vollführen oder eine Handlung zu vollführen, ohne dass es jemand bemerkt.',
-    stealth:
-      'Würfe auf Heimlichkeit decken alle Versuche ab, sich zu verstecken, sich leise zu bewegen und sich zu verbergen.',
-    survival:
-      'Würfe auf Überleben decken alle Versuche ab, in der Wildnis zu überleben. Dies beinhaltet z.B. das Jagen und das Navigieren durch die Wildnis.',
-  };
 }

+ 3 - 2
src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-field/skill-field.component.html

@@ -7,8 +7,9 @@
     (click)="$event.stopPropagation()"
   />
   <label class="skill-attribute-name">{{
-    skillNames[skillName].attribute
+    "attributesAbbreviations." + ("skillsAttributes." + skillName | translate)
+      | translate
   }}</label>
-  <label class="skill-name">{{ skillNames[skillName].skill }}</label>
+  <label class="skill-name">{{ "skills." + skillName | translate }}</label>
   <label class="skill-modifier">{{ skillModifier }}</label>
 </div>

+ 6 - 34
src/app/journal/journal-stats/attribute-skill-container/skill-panel/skill-field/skill-field.component.ts

@@ -5,6 +5,7 @@ import { DetailsService } from 'src/services/details/details.service';
 import { Observable } from 'rxjs';
 import { Attribute } from 'src/interfaces/attribute';
 import { SkillDetailsComponent } from '../skill-details/skill-details.component';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'app-skill-field',
@@ -22,41 +23,9 @@ export class SkillFieldComponent {
   public constructor(
     public dataAccessor: DataService,
     public detailsAccessor: DetailsService,
+    public translate: TranslateService,
   ) {}
 
-  public skillNames: any = {
-    acrobatics: { skill: 'Akrobatik', attribute: 'GES', long: 'dexterity' },
-    animalHandling: { skill: 'Tierkunde', attribute: 'WIS', long: 'wisdom' },
-    arcana: { skill: 'Arkana', attribute: 'INT', long: 'intelligence' },
-    athletics: { skill: 'Athletik', attribute: 'STR', long: 'strength' },
-    deception: { skill: 'Täuschen', attribute: 'CHA', long: 'charisma' },
-    history: { skill: 'Geschichte', attribute: 'INT', long: 'intelligence' },
-    insight: { skill: 'Motiv erkennen', attribute: 'WIS', long: 'wisdom' },
-    intimidation: {
-      skill: 'Einschüchtern',
-      attribute: 'CHA',
-      long: 'charisma',
-    },
-    investigation: {
-      skill: 'Nachforschung',
-      attribute: 'INT',
-      long: 'intelligence',
-    },
-    medicine: { skill: 'Heilkunde', attribute: 'WIS', long: 'wisdom' },
-    nature: { skill: 'Naturkunde', attribute: 'INT', long: 'intelligence' },
-    perception: { skill: 'Wahrnehmung', attribute: 'WIS', long: 'wisdom' },
-    performance: { skill: 'Auftreten', attribute: 'CHA', long: 'charisma' },
-    persuasion: { skill: 'Überzeugen', attribute: 'CHA', long: 'charisma' },
-    religion: { skill: 'Religion', attribute: 'INT', long: 'intelligence' },
-    sleightOfHand: {
-      skill: 'Fingerfertigkeit',
-      attribute: 'GES',
-      long: 'dexterity',
-    },
-    stealth: { skill: 'Heimlichkeit', attribute: 'GES', long: 'dexterity' },
-    survival: { skill: 'Überlebenskunst', attribute: 'WIS', long: 'wisdom' },
-  };
-
   ngOnInit(): void {
     this.initProficiencySubscription();
     this.initAttributeSubscription();
@@ -64,8 +33,11 @@ export class SkillFieldComponent {
   }
 
   private initAttributeSubscription(): void {
+    const attribute = this.translate.instant(
+      'skillsAttributes.' + this.skillName,
+    );
     const observable: Observable<Attribute> = eval(
-      `this.dataAccessor.${this.skillNames[this.skillName].long}$`,
+      `this.dataAccessor.${attribute}$`,
     );
     observable.subscribe((newValue: Attribute) => {
       this.attribute = newValue;

+ 3 - 7
src/app/journal/journal-stats/info-row/armor-class/armor-class-details/armor-class-details.component.html

@@ -1,11 +1,7 @@
-<div class="title">Rüstungsklasse</div>
+<div class="title">{{ "armorClass.label" | translate }}</div>
 
 <div class="content">
-  Die Rüstungsklasse wird verwendet, um zu bestimmen, ob ein Angriff erfolgreich
-  ist oder nicht. Ein Angreifer muss einen Würfelwurf (normalerweise einen W20)
-  ablegen und dabei mindestens die Rüstungsklasse des Ziels erreichen. Wenn der
-  Wurf erfolgreich ist, verursacht der Angriff Schaden, ansonsten wird der
-  Angriff abgewehrt.
+  {{ "armorClass.description" | translate }}
 </div>
 
-<value-box [value]="armorClass" [label]="'Wert'"></value-box>
+<value-box [value]="armorClass" [label]="'value'"></value-box>

+ 6 - 2
src/app/journal/journal-stats/info-row/armor-class/armor-class.component.html

@@ -6,6 +6,10 @@
     (change)="updateValue()"
     (click)="$event.stopPropagation()"
   />
-  <div class="info-label responsive-small">Rüstung</div>
-  <div class="info-label responsive-large">Rüstungsklasse</div>
+  <div class="info-label responsive-small">
+    {{ "armorClass.shortLabel" | translate }}
+  </div>
+  <div class="info-label responsive-large">
+    {{ "armorClass.label" | translate }}
+  </div>
 </div>

+ 20 - 13
src/app/journal/journal-stats/info-row/conditions/conditions-details/conditions-details.component.html

@@ -1,26 +1,28 @@
 <!-- DESCRIPTION -->
-<div class="title">Zustände</div>
+<div class="title">{{ "conditions.label" | translate }}</div>
 
 <div class="content">
-  Zustände ändern die Fähigkeiten einer Kreatur auf verschiedene Arten und
-  können die Folgen von Zaubern, Klassenmerkmalen, Monsterangriffen oder anderen
-  Fähigkeiten sein. Der Zustand hält solange an, bis er aufgehoben wird, oder
-  wie seine Wirkungsdauer ist.
+  {{ "conditions.description" | translate }}
 </div>
 
 <div class="condition-handling">
   <!-- CURRENTLY ACTIVE CONDITIONS -->
   <div>
-    <div class="heading left t-0 b-075">Momentane Zustäne</div>
+    <div class="heading left t-0 b-075">
+      {{ "conditions.currentConditions" | translate }}
+    </div>
     <mat-accordion>
       @for (condition of conditions; let index = $index; track condition) {
         <mat-expansion-panel>
           <mat-expansion-panel-header>
-            <mat-panel-title>{{ condition }}</mat-panel-title>
+            <mat-panel-title>{{
+              "conditions." + condition | translate
+            }}</mat-panel-title>
           </mat-expansion-panel-header>
           <ul>
             @for (
-              description of conditionDescriptions[condition];
+              description of "conditions.conditionDescriptions." + condition
+                | translate;
               track description
             ) {
               <li>{{ description }}</li>
@@ -33,20 +35,24 @@
           ></icon-button>
         </mat-expansion-panel>
       } @empty {
-        <div class="empty-list">keine Zustände</div>
+        <div class="empty-list">
+          {{ "conditions.noConditions" | translate }}
+        </div>
       }
     </mat-accordion>
   </div>
 
   <!-- ADD CONDITIONS -->
-  <div class="heading left">Zustand hinzufügen</div>
+  <div class="heading left">{{ "conditions.addCondition" | translate }}</div>
 
   <div>
     <mat-form-field appearance="outline" class="t-075">
-      <mat-label>Zustand</mat-label>
+      <mat-label>{{ "conditions.label" | translate }}</mat-label>
       <mat-select [(ngModel)]="currentCondition">
         @for (condition of notUsedConditions(); track condition) {
-          <mat-option [value]="condition">{{ condition }}</mat-option>
+          <mat-option [value]="condition">{{
+            "conditions." + condition | translate
+          }}</mat-option>
         }
       </mat-select>
     </mat-form-field>
@@ -60,7 +66,8 @@
       <div>
         <ul>
           @for (
-            description of conditionDescriptions[currentCondition];
+            description of "conditions.conditionDescriptions." +
+              currentCondition | translate;
             track description
           ) {
             <li>{{ description }}</li>

+ 84 - 84
src/app/journal/journal-stats/info-row/conditions/conditions-details/conditions-details.component.ts

@@ -13,92 +13,92 @@ export class ConditionsDetailsComponent {
   public currentCondition: string = '';
 
   public conditionOptions: string[] = [
-    'Betäubt',
-    'Bewusstlos',
-    'Bezaubert',
-    'Blind',
-    'Festgesetzt',
-    'Gelähmt',
-    'Gepackt',
-    'Kampfunfähig',
-    'Liegend',
-    'Taub',
-    'Unsichtbar',
-    'Verängstigt',
-    'Vergiftet',
-    'Versteinert',
+    'blinded',
+    'charmed',
+    'deafened',
+    'frightened',
+    'grappled',
+    'incapacitated',
+    'invisible',
+    'paralyzed',
+    'petrified',
+    'poisoned',
+    'prone',
+    'restrained',
+    'stunned',
+    'unconscious',
   ];
 
-  public conditionDescriptions: any = {
-    Betäubt: [
-      'Ein betäubter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
-      'Er scheitert automatisch bei Stärke- und Geschicklichkeitswürfen.',
-      'Angriffe gegen ihn haben Vorteil.',
-    ],
-    Bewusstlos: [
-      'Ein bewusstloser Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
-      'Er lässt fallen, was er in der Hand hält und stürzt zu Boden',
-      'Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen',
-      'Angriffe gegen ihn haben Vorteil.',
-      'Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist.',
-    ],
-    Bezaubert: [
-      'Ein bezauberter Charakter kann den Bezauberer weder angreifen, noch als Ziel für schädigende Fähigkeiten oder Zauber auswählen.',
-      'Der Bezauberer ist im Vorteil bei Fähigkeitswürfen, die sich auf die Interaktion mit dem bezauberten Charakter beziehen.',
-    ],
-    Blind: [
-      'Ein blinder Charakter kann nicht sehen. Er scheitert automatisch bei allen Attributwürfen, die auf Sicht basieren.',
-      'Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil.',
-    ],
-    Festgesetzt: [
-      'Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.',
-      'Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil.',
-      'Er scheitert automatisch bei allen Geschicklichkeitsrettungswürfen.',
-    ],
-    Gelähmt: [
-      'Ein gelähmter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
-      'Er kann sich weder bewegen noch sprechen',
-      'Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen.',
-      'Angriffe gegen ihn haben Vorteil.',
-      'Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist.',
-    ],
-    Gepackt: [
-      'Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.',
-      'Der Zustand endet, wenn die packende Kreatur kampfunfähig wird',
-      'Der Zustand endet auch, wenn ein Effekt die gepackte Kreatur aus der Reichweite der packenden Kreatur oder des packenden Effekts zieht. ',
-    ],
-    Kampfunfähig: [
-      'Ein kampfunfähiger Charakter kann keine Aktionen oder Reaktionen ausführen.',
-    ],
-    Liegend: [
-      'Ein liegender Charakter kann sich nur kriechend bewegen.',
-      'Alle seine Angriffe haben Nachteil.',
-      'Alle Angriffe gegen ihn haben Vorteil, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist, ansonsten haben sie nachteil.',
-    ],
-    Taub: [
-      'Ein tauber Charakter kann nicht hören und scheitert automatisch bei allen Attributwürfen, die auf Hören basieren.',
-    ],
-    Unsichtbar: [
-      'Ein unsichtbarer Charakter kann nicht gesehen werden, außer durch magische Mittel oder besondere Sinne.',
-      'Wenn er sich verbergen will, gilt er als komplett verschleiert, kann sich jedoch durch Geräusche und Fußspuren verraten.',
-      'Er hat Vorteil bei Angriffen, Angriffe gegen ihn wiederum sind im Nachteil.',
-    ],
-    Verängstigt: [
-      'Ein verängstigter Charakter hat Nachteil bei allen Attributswürfen und Angriffen, solange die Quelle seiner Angst in Sichtweite ist.',
-      'Er kann nicht freiwillig näher an die Quelle seiner Angst heranrücken.',
-    ],
-    Vergiftet: [
-      'Ein vergifteter Charakter hat Nachteil bei allen Attributs- und Angriffswürfen.',
-    ],
-    Versteinert: [
-      'Ein versteinerter Charakter wird mit ihrere gesamten nicht-magischen Ausrüstung versteinert und sein Gewicht verzehnfacht sich.',
-      'Der CHarakter ist kampfunfähig, kann also weder Aktion noch Reaktion ausführen, sich bewegen, sprechen oder die Umgebung wahrnehmen.',
-      'Angriffe gegen ihn sind im Vorteil',
-      'Er scheitert automatisch bei allen Stärke- und Geschicklichkeitswürfen.',
-      'Er ist immun gegen jeglichen Schaden',
-      'Er ist immun gegen Gifte und Krankheiten, außer gegen solche, die sich bereits vorher in ihm befunden HttpBackend. Diese werden aufgehalten, nicht neutralisiert.',
-    ],
-  };
+  // public conditionDescriptions: any = {
+  //   Betäubt: [
+  //     'Ein betäubter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
+  //     'Er scheitert automatisch bei Stärke- und Geschicklichkeitswürfen.',
+  //     'Angriffe gegen ihn haben Vorteil.',
+  //   ],
+  //   Bewusstlos: [
+  //     'Ein bewusstloser Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
+  //     'Er lässt fallen, was er in der Hand hält und stürzt zu Boden',
+  //     'Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen',
+  //     'Angriffe gegen ihn haben Vorteil.',
+  //     'Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist.',
+  //   ],
+  //   Bezaubert: [
+  //     'Ein bezauberter Charakter kann den Bezauberer weder angreifen, noch als Ziel für schädigende Fähigkeiten oder Zauber auswählen.',
+  //     'Der Bezauberer ist im Vorteil bei Fähigkeitswürfen, die sich auf die Interaktion mit dem bezauberten Charakter beziehen.',
+  //   ],
+  //   Blind: [
+  //     'Ein blinder Charakter kann nicht sehen. Er scheitert automatisch bei allen Attributwürfen, die auf Sicht basieren.',
+  //     'Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil.',
+  //   ],
+  //   Festgesetzt: [
+  //     'Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.',
+  //     'Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil.',
+  //     'Er scheitert automatisch bei allen Geschicklichkeitsrettungswürfen.',
+  //   ],
+  //   Gelähmt: [
+  //     'Ein gelähmter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.',
+  //     'Er kann sich weder bewegen noch sprechen',
+  //     'Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen.',
+  //     'Angriffe gegen ihn haben Vorteil.',
+  //     'Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist.',
+  //   ],
+  //   Gepackt: [
+  //     'Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.',
+  //     'Der Zustand endet, wenn die packende Kreatur kampfunfähig wird',
+  //     'Der Zustand endet auch, wenn ein Effekt die gepackte Kreatur aus der Reichweite der packenden Kreatur oder des packenden Effekts zieht. ',
+  //   ],
+  //   Kampfunfähig: [
+  //     'Ein kampfunfähiger Charakter kann keine Aktionen oder Reaktionen ausführen.',
+  //   ],
+  //   Liegend: [
+  //     'Ein liegender Charakter kann sich nur kriechend bewegen.',
+  //     'Alle seine Angriffe haben Nachteil.',
+  //     'Alle Angriffe gegen ihn haben Vorteil, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist, ansonsten haben sie nachteil.',
+  //   ],
+  //   Taub: [
+  //     'Ein tauber Charakter kann nicht hören und scheitert automatisch bei allen Attributwürfen, die auf Hören basieren.',
+  //   ],
+  //   Unsichtbar: [
+  //     'Ein unsichtbarer Charakter kann nicht gesehen werden, außer durch magische Mittel oder besondere Sinne.',
+  //     'Wenn er sich verbergen will, gilt er als komplett verschleiert, kann sich jedoch durch Geräusche und Fußspuren verraten.',
+  //     'Er hat Vorteil bei Angriffen, Angriffe gegen ihn wiederum sind im Nachteil.',
+  //   ],
+  //   Verängstigt: [
+  //     'Ein verängstigter Charakter hat Nachteil bei allen Attributswürfen und Angriffen, solange die Quelle seiner Angst in Sichtweite ist.',
+  //     'Er kann nicht freiwillig näher an die Quelle seiner Angst heranrücken.',
+  //   ],
+  //   Vergiftet: [
+  //     'Ein vergifteter Charakter hat Nachteil bei allen Attributs- und Angriffswürfen.',
+  //   ],
+  //   Versteinert: [
+  //     'Ein versteinerter Charakter wird mit ihrere gesamten nicht-magischen Ausrüstung versteinert und sein Gewicht verzehnfacht sich.',
+  //     'Der CHarakter ist kampfunfähig, kann also weder Aktion noch Reaktion ausführen, sich bewegen, sprechen oder die Umgebung wahrnehmen.',
+  //     'Angriffe gegen ihn sind im Vorteil',
+  //     'Er scheitert automatisch bei allen Stärke- und Geschicklichkeitswürfen.',
+  //     'Er ist immun gegen jeglichen Schaden',
+  //     'Er ist immun gegen Gifte und Krankheiten, außer gegen solche, die sich bereits vorher in ihm befunden HttpBackend. Diese werden aufgehalten, nicht neutralisiert.',
+  //   ],
+  // };
 
   public notUsedConditions(): string[] {
     return this.conditionOptions.filter(

+ 5 - 3
src/app/journal/journal-stats/info-row/conditions/conditions.component.html

@@ -2,12 +2,14 @@
   <div class="condition" (click)="openConditionDetails()">
     <div class="condition-list">
       @for (condition of conditions; track condition) {
-        <div class="condition-item">{{ condition }}</div>
+        <div class="condition-item">
+          {{ "conditions." + condition | translate }}
+        </div>
       } @empty {
         <div class="empty">-</div>
       }
     </div>
-    <div class="condition-label">Zustände</div>
+    <div class="condition-label">{{ "conditions.label" | translate }}</div>
   </div>
 
   <div class="vertical-line"></div>
@@ -21,6 +23,6 @@
       (change)="updateExhaustion()"
       (click)="$event.stopPropagation()"
     />
-    <div class="info-label">Erschöpfung</div>
+    <div class="info-label">{{ "exhaustion.label" | translate }}</div>
   </div>
 </div>

+ 11 - 16
src/app/journal/journal-stats/info-row/conditions/exhaustion-details/exhaustion-details.component.html

@@ -1,46 +1,41 @@
-<div class="title">Erschöpfung</div>
+<div class="title">{{ "exhaustion.label" | translate }}</div>
 
-<div class="content">
-  Einige Spezialfähigkeiten und Umweltgefahren, wie Hunger oder extreme
-  Temperaturen können zu Erschöpfung führen. Jede Stufe fügt einen weiteren
-  Malus hinzu, sodass mehrere Mali gleichzeitig möglich sind. Erschöpfung kann
-  z.B. durch eine lange Rast reduziert werden.
-</div>
+<div class="content">{{ "exhaustion.description" | translate }}</div>
 
-<value-box [value]="exhaustion" [label]="'aktuelle Erschöpfung'"></value-box>
+<value-box [value]="exhaustion" [label]="'currentExhaustion'"></value-box>
 
 <div class="t-2">
   <table class="table table-striped">
     <thead>
       <tr>
-        <th scope="col">Stufe</th>
-        <th scope="col">Effekt</th>
+        <th scope="col">{{ "general.level" | translate }}</th>
+        <th scope="col">{{ "general.effect" | translate }}</th>
       </tr>
     </thead>
     <tbody>
       <tr [ngClass]="{ highlighted: exhaustion === 0 }">
         <td>0</td>
-        <td>Keine Einschränkung</td>
+        <td>{{ "exhaustion.0" | translate }}</td>
       </tr>
       <tr [ngClass]="{ highlighted: exhaustion === 1 }">
         <td>1</td>
-        <td>Nachteil auf Attributwürfe</td>
+        <td>{{ "exhaustion.1" | translate }}</td>
       </tr>
       <tr [ngClass]="{ highlighted: exhaustion === 2 }">
         <td>2</td>
-        <td>Bewegungsrate halbiert</td>
+        <td>{{ "exhaustion.2" | translate }}</td>
       </tr>
       <tr [ngClass]="{ highlighted: exhaustion === 3 }">
         <td>3</td>
-        <td>Nachteil auf Angriffs- und Rettungswürfe</td>
+        <td>{{ "exhaustion.3" | translate }}</td>
       </tr>
       <tr [ngClass]="{ highlighted: exhaustion === 4 }">
         <td>4</td>
-        <td>Bewegungsrate fällt auf 0</td>
+        <td>{{ "exhaustion.4" | translate }}</td>
       </tr>
       <tr [ngClass]="{ highlighted: exhaustion === 5 }">
         <td>5</td>
-        <td>Sofortiger Tod</td>
+        <td>{{ "exhaustion.5" | translate }}</td>
       </tr>
     </tbody>
   </table>

+ 1 - 1
src/app/journal/journal-stats/info-row/conditions/exhaustion-details/exhaustion-details.component.scss

@@ -1,3 +1,3 @@
 .highlighted {
-  border: 2px solid black !important;
+  border: 2px solid var(--primary) !important;
 }

+ 4 - 13
src/app/journal/journal-stats/info-row/death-save/death-save-details/death-save-details.component.html

@@ -1,15 +1,6 @@
-<div class="title">Todesrettungswürfe</div>
+<div class="title">{{ "deathSave.label" | translate }}</div>
 
-<div class="content">
-  Immer wenn ein Charakter seinen Zug mit 0 Trefferpunkten beginnt und nicht
-  stabilisiert wurde, muss er einen Todesrettungswurf ablegen. Ist das Ergebnis
-  10 oder höher, ist der Wurf erfolgreich, ansonsten fehlgeschlagen. Beim
-  dritten Erfolg wird der Charakter stabilisiert, beim dritten Fehlschlag stirbt
-  er.
-</div>
+<div class="content">{{ "deathSave.description" | translate }}</div>
 
-<div class="subheading left">Eine 1 oder 20 würfeln</div>
-<div class="content t-05">
-  Würfelt ein Charakter eine 1, zählt der Wurf als zwei Fehlschläge. Würfelt er
-  eine 20, erhält er sofort einen Lebenspunkt dazu und ist nicht mehr bewustlos.
-</div>
+<div class="subheading left">{{ "deathSave.criticalHeader" | translate }}</div>
+<div class="content t-05">{{ "deathSave.criticalContent" | translate }}</div>

+ 3 - 3
src/app/journal/journal-stats/info-row/death-save/death-save.component.html

@@ -1,7 +1,7 @@
 <div class="death-save-container" (click)="openDetails()">
   <div style="margin: 0.625rem 0 0 0.4rem">
     <div class="save-row">
-      <div class="save-label">Erfolg</div>
+      <div class="save-label">{{ "deathSave.success" | translate }}</div>
       <div class="save-checkbox" (click)="$event.stopPropagation()">
         <input
           type="checkbox"
@@ -21,7 +21,7 @@
       </div>
     </div>
     <div class="save-row">
-      <div class="save-label">Fehlschlag</div>
+      <div class="save-label">{{ "deathSave.fail" | translate }}</div>
       <div class="save-checkbox fail" (click)="$event.stopPropagation()">
         <input
           type="checkbox"
@@ -41,5 +41,5 @@
       </div>
     </div>
   </div>
-  <div class="death-save">Todesrettungswürfe</div>
+  <div class="death-save">{{ "deathSave.label" | translate }}</div>
 </div>

+ 2 - 7
src/app/journal/journal-stats/info-row/initiative/initiative-details/initiative-details.component.html

@@ -1,10 +1,5 @@
-<div class="title">Initiative</div>
+<div class="title">{{ "initiative.label" | translate }}</div>
 
-<div class="content">
-  Der Initiativebonus wird verwendet, um die Initiative des aktuellen Kampfes
-  oder einer zeitkritischen Situation zu bestimmen. Jeder Charakter wirft einen
-  W20 und addiert seinen Initiativebonus. Der Charakter mit dem höchsten
-  Ergebnis darf zuerst agieren.
-</div>
+<div class="content">{{ "initiative.description" | translate }}</div>
 
 <value-box [value]="initiative" [label]="'Wert'"></value-box>

+ 1 - 1
src/app/journal/journal-stats/info-row/initiative/initiative.component.html

@@ -6,5 +6,5 @@
     (change)="updateValue()"
     (click)="$event.stopPropagation()"
   />
-  <div class="info-label">Initiative</div>
+  <div class="info-label">{{ "initiative.label" | translate }}</div>
 </div>

+ 14 - 19
src/app/journal/journal-stats/info-row/movement/movement-details/movement-details.component.html

@@ -1,40 +1,35 @@
-<div class="title">Bewegung</div>
+<div class="title">{{ "movement.label" | translate }}</div>
 
-<div class="heading left">Laufen</div>
+<div class="heading left">{{ "movement.movement" | translate }}</div>
 <div class="content t-05">
-  Die Bewegungsrate gibt an, wie weit ein Charakter pro Runde laufen kann. Die
-  Bewegungsrate wird in Fuß angegeben, wobei 5 Fuß 1,5 Metern und somit einem
-  Feld entsprechen. Die Bewegung kann an einem Stück verwendet werden, oder in
-  mehrere Teile aufgeteilt werden. In schwierigem Gelände halbiert sich die
-  Bewegungsrate.
+  {{ "movement.description" | translate }}
 </div>
 
 <div class="value-row">
-  <value-box [value]="movement" [label]="'Fuß'"></value-box>
-  <value-box [value]="movement / 5" [label]="'Felder'"></value-box>
+  <value-box [value]="movement" [label]="'feet'"></value-box>
+  <value-box [value]="movement / 5" [label]="'fields'"></value-box>
 </div>
 
-<div class="heading left">Springen</div>
+<div class="heading left">{{ "movement.jumping" | translate }}</div>
 <div class="content t-05">
-  Ein Charakter kann basierend auf seiner Stärke springen. Wenn man sich vor dem
-  Sprung 10 Fuß (2 Felder) bewegt hat, kann man die doppelte Distanz springen.
+  {{ "movement.jumpingDescription" | translate }}
 </div>
 <div class="value-row">
-  <value-box [value]="strength / 2" [label]="'Fuß'"></value-box>
-  <value-box [value]="strength / 10" [label]="'Felder'"></value-box>
+  <value-box [value]="strength / 2" [label]="'feet'"></value-box>
+  <value-box [value]="strength / 10" [label]="'fields'"></value-box>
 </div>
 
 <mat-expansion-panel>
   <mat-expansion-panel-header>
-    <mat-panel-title
-      >Umrechnungstabelle</mat-panel-title
-    ></mat-expansion-panel-header
+    <mat-panel-title>{{
+      "movement.translationTable" | translate
+    }}</mat-panel-title></mat-expansion-panel-header
   >
   <table class="table table-striped">
     <thead>
       <tr>
-        <th scope="col">Fuß</th>
-        <th scope="col">Meter</th>
+        <th scope="col">{{ "general.feet" | translate }}</th>
+        <th scope="col">{{ "general.meter" | translate }}</th>
       </tr>
     </thead>
     <tbody>

+ 6 - 2
src/app/journal/journal-stats/info-row/movement/movement.component.html

@@ -6,6 +6,10 @@
     (change)="updateValue()"
     (click)="$event.stopPropagation()"
   />
-  <div class="info-label responsive-large">Bewegungsrate</div>
-  <div class="info-label responsive-small">Bewegung</div>
+  <div class="info-label responsive-large">
+    {{ "movement.label" | translate }}
+  </div>
+  <div class="info-label responsive-small">
+    {{ "movement.shortLabel" | translate }}
+  </div>
 </div>

+ 3 - 7
src/app/journal/journal-stats/info-row/proficiency/proficiency-details/proficiency-details.component.html

@@ -1,9 +1,5 @@
-<div class="title">Übungsbonus</div>
+<div class="title">{{ "proficiency.label" | translate }}</div>
 
-<div class="content">
-  Der Übungsbonus wird auf alle Rettungs-, Angriffs- und Fertigkeitswürfe
-  addiert, in denen ein Spieler geübt ist. Der Übungsbonus steigt mit der
-  Charakterstufe.
-</div>
+<div class="content">{{ "proficiency.description" | translate }}</div>
 
-<value-box [value]="proficiency" [label]="'Wert'"></value-box>
+<value-box [value]="proficiency" [label]="'value'"></value-box>

+ 6 - 2
src/app/journal/journal-stats/info-row/proficiency/proficiency-field.component.html

@@ -6,6 +6,10 @@
     (change)="updateValue()"
     (click)="$event.stopPropagation()"
   />
-  <div class="info-label responsive-large">Übungsbonus</div>
-  <div class="info-label responsive-small">Übung</div>
+  <div class="info-label responsive-large">
+    {{ "proficiency.label" | translate }}
+  </div>
+  <div class="info-label responsive-small">
+    {{ "proficiency.shortLabel" | translate }}
+  </div>
 </div>

+ 6 - 7
src/app/journal/journal-stats/life-container/hit-dice/hit-dice.component.html

@@ -1,16 +1,15 @@
 <div class="heading-line">
-  <div class="heading left t-0">Trefferwürfel</div>
+  <div class="heading left t-0">{{ "life.hitdice" | translate }}</div>
   <icon-button
     [icon]="showEditButtons ? 'cross' : 'edit'"
     (click)="showEditButtons = !showEditButtons"
   ></icon-button>
 </div>
-<div class="content">
-  Trefferwürfel werden verwendet, um bei einer kurzen Rast Trefferpunkte
-  wiederherzustellen. Du kannst eine beliebige Anzahl deiner verfügbaren
-  Trefferwürfel verwenden. Sie werden bei einer langen rast wiederhergestellt.
-</div>
-<p><b>Würfelart: </b> W{{ hitDice.diceType }}</p>
+<div class="content">{{ "life.hitdiceDescription" | translate }}</div>
+<p>
+  <b>{{ "general.diceType" | translate }}: </b>
+  {{ "general.dice" | translate }} {{ hitDice.diceType }}
+</p>
 
 <div class="hit-dice-container">
   <div class="input-container">

+ 4 - 4
src/app/journal/journal-stats/life-container/life/life-details/life-details.component.html

@@ -1,22 +1,22 @@
-<div class="title">Trefferpunkte</div>
+<div class="title">{{ "life.hitpoints" | translate }}</div>
 
 <div class="value-row t-2 b-15">
   <value-box
     [isInput]="true"
     [(ngModel)]="maxHitPoints"
-    [label]="'Maximale Trefferpunkte'"
+    [label]="'life.max'"
     (change)="checkValidity()"
   ></value-box>
   <value-box
     [isInput]="true"
     [(ngModel)]="currentHitPoints"
-    [label]="'Momentane Trefferpunkte'"
+    [label]="'life.current'"
     (change)="checkValidity()"
   ></value-box>
   <value-box
     [isInput]="true"
     [(ngModel)]="temporaryHitPoints"
-    [label]="'Temporäre Trefferpunkte'"
+    [label]="'life.temporary'"
   ></value-box>
 </div>
 <hit-dice style="margin-top: 5rem" (setHitDice)="setHitDice($event)"></hit-dice>

+ 1 - 1
src/app/journal/journal-stats/life-container/life/life.component.html

@@ -1,5 +1,5 @@
 <div class="life-box" (click)="openDetailsPanel()">
-  <div class="life-box-name">Trefferpunkte</div>
+  <div class="life-box-name">{{ "life.hitpoints" | translate }}</div>
   <div class="life-box-bar">
     <div
       class="life-box-bar-current"

+ 25 - 17
src/app/journal/journal-stats/weapons-container/weapon-table/weapon-details/weapon-details.component.html

@@ -1,16 +1,16 @@
 <div class="title">{{ weapon?.name }}</div>
 
-<div class="subheading left">Angriff</div>
+<div class="subheading left">{{ "weapons.attack" | translate }}</div>
 
 <div class="flex-row">
-  <div class="label">Modifikator:</div>
+  <div class="label">{{ "general.modifier" | translate }}:</div>
   <span>{{ weapon?.attackBonus }}</span>
 </div>
 
 <!-- Singel Damage -->
 @if (!weapon?.isVersatile) {
   <div class="flex-row">
-    <div class="label">Schaden:</div>
+    <div class="label">{{ "weapons.header.damage" | translate }}:</div>
     @for (damage of weapon?.damage; let index = $index; track damage) {
       {{ damage.diceNumber }} {{ damage.diceType }} &nbsp;
       <span *ngIf="index === 0 && damageModifier !== '0'">
@@ -23,12 +23,12 @@
 
 <!-- Versatility Damage -->
 <div *ngIf="weapon?.isVersatile" class="label">
-  Einhändiger Schaden:
+  {{ "weapons.single" | translate }}:
   <div *ngFor="let damage of weapon?.damage">
     {{ damage.diceNumber }} {{ damage.diceType }} {{ damage.damageType }}
   </div>
 
-  Zweihändiger Schaden:
+  {{ "weapons.dual" | translate }}:
   <div *ngFor="let damage of weapon?.damage; let index = index">
     {{ damage.diceNumber }}
     <span *ngIf="index === 0">{{ weapon?.versatileDamage }}</span>
@@ -39,36 +39,44 @@
 
 <!-- Magical -->
 
-<div class="subheading left">Eigenschaften</div>
+<div class="subheading left">{{ "general.property" | translate }}</div>
 <div class="weapon-properties">
-  <span *ngIf="weapon?.proficient">Geübt </span>
-  <span *ngIf="weapon?.isRanged">Fernkampf </span>
-  <span *ngIf="weapon?.isVersatile">Vielseitig </span>
-  <span *ngIf="weapon?.isTwoHanded">Zweihändig </span>
-  <span *ngIf="weapon?.isFinesse">Finesse </span>
-  <span *ngIf="weapon?.canBeThrown">Wurfwaffe </span>
-  <span *ngIf="weapon?.isMagical">Magisch </span>
+  <span *ngIf="weapon?.proficient"
+    >{{ "weapons.proficient" | translate }}
+  </span>
+  <span *ngIf="weapon?.isRanged">{{ "weapons.ranged" | translate }} </span>
+  <span *ngIf="weapon?.isVersatile"
+    >{{ "weapons.versatile" | translate }}
+  </span>
+  <span *ngIf="weapon?.isTwoHanded"
+    >{{ "weapons.twoHanded" | translate }}
+  </span>
+  <span *ngIf="weapon?.isFinesse">{{ "weapons.finesse" | translate }} </span>
+  <span *ngIf="weapon?.canBeThrown"
+    >{{ "weapons.throwable" | translate }}
+  </span>
+  <span *ngIf="weapon?.isMagical">{{ "weapons.magical" | translate }} </span>
 </div>
 
 @if (weapon?.isRanged || weapon?.canBeThrown) {
-  <div class="subheading left">Reichweite</div>
+  <div class="subheading left">{{ "weapons.range" | translate }}</div>
 
   <!-- Ranged -->
   <div *ngIf="weapon?.isRanged">
-    Reichweite:
+    {{ "weapons.range" | translate }}:
     {{ weapon?.range }}
   </div>
 
   <!-- Thrown -->
   <div *ngIf="weapon?.canBeThrown">
-    Wurfweite:
+    {{ "weapons.throwRange" | translate }}:
     {{ weapon?.throwRange }}
   </div>
 }
 
 <!-- Description -->
 @if (weapon?.description != "") {
-  <div class="subheading left">Beschreibung</div>
+  <div class="subheading left">{{ "general.description" | translate }}</div>
   <p class="content" [innerHTML]="weapon?.description"></p>
 }
 <div class="vertical-buttons bottom">

+ 6 - 0
src/app/journal/journal-stats/weapons-container/weapon-table/weapon-details/weapon-details.component.scss

@@ -9,3 +9,9 @@
   width: 8rem;
   font-weight: 500;
 }
+
+.weapon-properties {
+  display: flex;
+  flex-direction: column;
+  gap: 0.125rem;
+}

+ 73 - 37
src/app/journal/journal-stats/weapons-container/weapon-table/weapon-modal/weapon-modal.component.html

@@ -1,14 +1,14 @@
 <div class="dimensions">
   <div class="title">
     @if (isUpdate) {
-      Waffe bearbeiten
+      {{ "weapons.modal.editWeapon" | translate }}
     } @else {
-      Waffe hinzufügen
+      {{ "weapons.modal.addWeapon" | translate }}
     }
   </div>
 
   <div class="content b-0">
-    <div class="input-label">Name</div>
+    <div class="input-label">{{ "weapons.name" | translate }}</div>
     <mat-form-field appearance="outline" class="w-100">
       <input matInput [(ngModel)]="name" />
     </mat-form-field>
@@ -18,7 +18,7 @@
       <div class="checkbox-column">
         <div class="checkbox-row">
           <input id="proficient" type="checkbox" [(ngModel)]="proficient" />
-          <label for="proficient">Geübt</label>
+          <label for="proficient">{{ "weapons.proficient" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input
@@ -26,38 +26,40 @@
             type="checkbox"
             [(ngModel)]="useAttributeModifier"
           />
-          <label for="useAttributeModifier">Attributmodifikator anwenden</label>
+          <label for="useAttributeModifier">{{
+            "weapons.modal.applyModifier" | translate
+          }}</label>
         </div>
         <div class="checkbox-row">
           <input id="finesse" type="checkbox" [(ngModel)]="isFinesse" />
-          <label for="finesse">Finesse</label>
+          <label for="finesse">{{ "weapons.finesse" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input id="versatile" type="checkbox" [(ngModel)]="isVersatile" />
-          <label for="versatile">Vielseitig</label>
+          <label for="versatile">{{ "weapons.versatile" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input id="isTwohanded" type="checkbox" [(ngModel)]="isTwoHanded" />
-          <label for="isTwohanded">Zweihändig</label>
+          <label for="isTwohanded">{{ "weapons.twoHanded" | translate }}</label>
         </div>
       </div>
       <div class="checkbox-column">
         <div class="checkbox-row">
           <input id="hasReach" type="checkbox" [(ngModel)]="hasReach" />
-          <label for="hasReach">Reichweite</label>
+          <label for="hasReach">{{ "weapons.range" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input id="isRanged" type="checkbox" [(ngModel)]="isRanged" />
-          <label for="isRanged">Fernkampf</label>
+          <label for="isRanged">{{ "weapons.ranged" | translate }}</label>
         </div>
 
         <div class="checkbox-row">
           <input id="canBeThrown" type="checkbox" [(ngModel)]="canBeThrown" />
-          <label for="canBeThrown">Wurfwaffe</label>
+          <label for="canBeThrown">{{ "weapons.throwable" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input id="isMagical" type="checkbox" [(ngModel)]="isMagical" />
-          <label for="isMagical">Magisch</label>
+          <label for="isMagical">{{ "weapons.magical" | translate }}</label>
         </div>
         <div class="checkbox-row">
           <input
@@ -65,7 +67,9 @@
             type="checkbox"
             [(ngModel)]="hasAdditionalDamage"
           />
-          <label for="additionalDamage">Zusatzschaden</label>
+          <label for="additionalDamage">{{
+            "weapons.modal.additionalDamage" | translate
+          }}</label>
         </div>
       </div>
     </div>
@@ -86,7 +90,9 @@
           <ng-template ngbNavContent>
             <div class="flex-row">
               <div class="w-50">
-                <div class="input-label">Angriffsbonus</div>
+                <div class="input-label">
+                  {{ "weapons.modal.attackBonus" | translate }}
+                </div>
                 <mat-form-field appearance="outline">
                   <mat-select [(ngModel)]="attackBonus">
                     @for (attackBonus of attackBonuses; track attackBonus) {
@@ -99,7 +105,9 @@
               </div>
 
               <div *ngIf="isMagical">
-                <div class="input-label">Magischer Modifikator</div>
+                <div class="input-label">
+                  {{ "weapons.modal.magicalModifier" | translate }}
+                </div>
                 <mat-form-field appearance="outline">
                   <mat-select [(ngModel)]="magicBonus">
                     @for (magicBonus of magicBonuses; track magicBonus) {
@@ -121,12 +129,14 @@
                 <div class="damage-box">
                   <div class="subheading left t-025">
                     @if (index == 0) {
-                      Schaden
+                      {{ "weapons.modal.damage" | translate }}
                     } @else {
-                      Weiterer Schaden
+                      {{ "weapons.modal.additionalDamage" | translate }}
                     }
                   </div>
-                  <div class="input-label">Anzahl Würfel</div>
+                  <div class="input-label">
+                    {{ "general.diceNumber" | translate }}
+                  </div>
                   <mat-form-field appearance="outline">
                     <mat-select [(ngModel)]="damageEntry.diceNumber">
                       @for (number of numbers; track number) {
@@ -136,9 +146,9 @@
                   </mat-form-field>
 
                   <div class="input-label t-05">
-                    Würfelart
+                    {{ "general.diceType" | translate }}
                     @if (isVersatile && index === 0) {
-                      (Einhändig)
+                      ({{ "weapons.oneHanded" | translate }})
                     }
                   </div>
                   <mat-form-field appearance="outline">
@@ -149,7 +159,11 @@
                     </mat-select>
                   </mat-form-field>
                   @if (isVersatile && index === 0) {
-                    <div class="input-label t-05">Würfelart (Zweihändig)</div>
+                    <div class="input-label t-05">
+                      {{ "general.diceType" | translate }} ({{
+                        "weapons.twoHanded" | translate
+                      }})
+                    </div>
                     <mat-form-field appearance="outline">
                       <mat-select [(ngModel)]="versatileDamage">
                         @for (die of dice; track die) {
@@ -159,12 +173,14 @@
                     </mat-form-field>
                   }
 
-                  <div class="input-label t-05">Schadensart</div>
+                  <div class="input-label t-05">
+                    {{ "general.damageType" | translate }}
+                  </div>
                   <mat-form-field appearance="outline">
                     <mat-select [(ngModel)]="damageEntry.damageType">
                       @for (type of damageTypes; track type) {
-                        <mat-option [value]="type.value">
-                          {{ type.display }}
+                        <mat-option [value]="type">
+                          {{ "damageTypes." + type | translate }}
                         </mat-option>
                       }
                     </mat-select>
@@ -175,7 +191,9 @@
                       (click)="removeDamage(index)"
                     ></icon-button>
                   } @else if (hasAdditionalDamage) {
-                    <div class="input-label t-05">Zusatzschaden</div>
+                    <div class="input-label t-05">
+                      {{ "weapons.modal.additionalDamage" | translate }}
+                    </div>
                     <mat-form-field appearance="outline">
                       <mat-select [(ngModel)]="additionalDamage">
                         @for (damage of additonalDamages; track damage) {
@@ -200,16 +218,20 @@
         </ng-container>
         <ng-container ngbNavItem="range">
           @if (isRanged || canBeThrown) {
-            <button ngbNavLink>Reichweite</button>
+            <button ngbNavLink>{{ "weapons.range" | translate }}</button>
           } @else {
-            <button class="disabled-button" disabled>Reichweite</button>
+            <button class="disabled-button" disabled>
+              {{ "weapons.range" | translate }}
+            </button>
           }
           <ng-template ngbNavContent>
             <div class="numbers">
               @if (isRanged) {
                 <div class="flex-row t-1">
                   <div class="w-50">
-                    <div class="input-label">Normale Reichweite</div>
+                    <div class="input-label">
+                      {{ "weapons.modal.normalRange" | translate }}
+                    </div>
                     <mat-form-field appearance="outline">
                       <input
                         class="right"
@@ -217,11 +239,15 @@
                         matInput
                         [(ngModel)]="range[0]"
                       />
-                      <span class="input-value" matTextSuffix>Fuß</span>
+                      <span class="input-value" matTextSuffix>{{
+                        "general.feet" | translate
+                      }}</span>
                     </mat-form-field>
                   </div>
                   <div>
-                    <div class="input-label">Erweiterte Reichweite</div>
+                    <div class="input-label">
+                      {{ "weapons.modal.extendedRange" | translate }}
+                    </div>
                     <mat-form-field appearance="outline">
                       <input
                         class="right"
@@ -229,7 +255,9 @@
                         matInput
                         [(ngModel)]="range[1]"
                       />
-                      <span class="input-value" matTextSuffix>Fuß</span>
+                      <span class="input-value" matTextSuffix>{{
+                        "general.feet" | translate
+                      }}</span>
                     </mat-form-field>
                   </div>
                 </div>
@@ -237,7 +265,9 @@
               @if (canBeThrown) {
                 <div class="flex-row t-2">
                   <div class="w-50">
-                    <div class="input-label">Normale Wurfreichweite</div>
+                    <div class="input-label">
+                      {{ "weapons.modal.normalThrowRange" | translate }}
+                    </div>
                     <mat-form-field appearance="outline">
                       <input
                         class="right"
@@ -245,11 +275,15 @@
                         matInput
                         [(ngModel)]="throwRange[0]"
                       />
-                      <span class="input-value" matTextSuffix>Fuß</span>
+                      <span class="input-value" matTextSuffix>{{
+                        "general.feet" | translate
+                      }}</span>
                     </mat-form-field>
                   </div>
                   <div>
-                    <div class="input-label">Erweiterte Wurfreichweite</div>
+                    <div class="input-label">
+                      {{ "weapons.modal.extendedThrowRange" | translate }}
+                    </div>
                     <mat-form-field appearance="outline">
                       <input
                         class="right"
@@ -257,7 +291,9 @@
                         matInput
                         [(ngModel)]="throwRange[1]"
                       />
-                      <span class="input-value" matTextSuffix>Fuß</span>
+                      <span class="input-value" matTextSuffix>{{
+                        "general.feet" | translate
+                      }}</span>
                     </mat-form-field>
                   </div>
                 </div>
@@ -266,7 +302,7 @@
           </ng-template>
         </ng-container>
         <ng-container ngbNavItem="description">
-          <button ngbNavLink>Beschreibung</button>
+          <button ngbNavLink>{{ "general.description" | translate }}</button>
           <ng-template ngbNavContent>
             <div class="NgxEditor__Wrapper">
               <ngx-editor-menu [editor]="editor" [toolbar]="toolbar">
@@ -274,7 +310,7 @@
               <ngx-editor
                 [editor]="editor"
                 [(ngModel)]="description"
-                placeholder="Beschreibung der Waffe"
+                [placeholder]="'weapons.modal.placeholder' | translate"
               ></ngx-editor>
             </div>
           </ng-template>

+ 14 - 14
src/app/journal/journal-stats/weapons-container/weapon-table/weapon-modal/weapon-modal.component.ts

@@ -48,20 +48,20 @@ export class WeaponModalComponent {
   // Options for the select boxes
   public weights: string[] = ['leicht', 'normal', 'schwer'];
 
-  public damageTypes: any[] = [
-    { display: 'Wucht', value: 'bludgeoning' },
-    { display: 'Stich', value: 'piercing' },
-    { display: 'Hieb', value: 'slashing' },
-    { display: 'Feuer', value: 'fire' },
-    { display: 'Kälte', value: 'cold' },
-    { display: 'Blitz', value: 'lightning' },
-    { display: 'Gift', value: 'poison' },
-    { display: 'Säure', value: 'acid' },
-    { display: 'Nekrotisch', value: 'necrotic' },
-    { display: 'Psychisch', value: 'psychic' },
-    { display: 'Heilig', value: 'holy' },
-    { display: 'Göttlich', value: 'divine' },
-    { display: 'Kraft', value: 'force' },
+  public damageTypes: string[] = [
+    'bludgeoning',
+    'piercing',
+    'slashing',
+    'acid',
+    'cold',
+    'fire',
+    'force',
+    'lightning',
+    'necrotic',
+    'poison',
+    'psychic',
+    'radiant',
+    'thunder',
   ];
 
   public dice: string[] = ['W4', 'W6', 'W8', 'W10', 'W12', 'W20', 'W100'];

+ 7 - 7
src/app/journal/journal-stats/weapons-container/weapon-table/weapon-table.component.html

@@ -1,10 +1,10 @@
 <div class="weapons-box">
   <div class="heading-list">
-    <div>Typ</div>
-    <div>Name</div>
-    <div>Bonus</div>
-    <div>Schaden</div>
-    <div>Reichweite</div>
+    <div>{{ "weapons.header.type" | translate }}</div>
+    <div>{{ "weapons.header.name" | translate }}</div>
+    <div>{{ "weapons.header.bonus" | translate }}</div>
+    <div>{{ "weapons.header.damage" | translate }}</div>
+    <div>{{ "weapons.header.range" | translate }}</div>
   </div>
   <div
     id="weapons-table"
@@ -49,7 +49,7 @@
           font-weight: 500;
         "
       >
-        Noch keine Waffen hinzugefügt
+        {{ "weapons.noWeapons" | translate }}
       </div>
     }
   </div>
@@ -109,6 +109,6 @@
       {{ weapon.range[0] }}/{{ weapon.range[1] }} ft.
     </div>
   } @else {
-    Nahkampf
+    {{ "weapons.meele" | translate }}
   }
 </ng-template>

+ 2 - 9
src/app/journal/journal-stats/weapons-container/weapons-container.component.html

@@ -5,26 +5,19 @@
       (click)="active = 1"
       [class]="active === 1 ? 'active' : ''"
     >
-      Waffen
+      {{ "general.weapons" | translate }}
     </button>
     <button
       class="tab-button"
       (click)="active = 2"
       [class]="active === 2 ? 'active' : ''"
     >
-      Zauber
+      {{ "general.spells" | translate }}
     </button>
   </div>
   @switch (active) {
     @case (1) {
       <weapon-table #weaponTable></weapon-table>
-      <!-- <ui-button
-    [type]="'add'"
-    [size]="'xlarge'"
-    [color]="'primary'"
-    class="button-margin"
-    (click)="openModal()"
-  ></ui-button> -->
     }
     @case (2) {
       <spell-table #spellTable></spell-table>

+ 3 - 0
src/app/journal/journal.module.ts

@@ -7,6 +7,7 @@ import { DragDropModule } from '@angular/cdk/drag-drop';
 import { ReactiveFormsModule } from '@angular/forms';
 import { MarkdownModule } from 'ngx-markdown';
 import { NgxEditorModule } from 'ngx-editor';
+import { TranslateModule, TranslatePipe } from '@ngx-translate/core';
 
 // Material Design
 import { MatSlideToggleModule } from '@angular/material/slide-toggle';
@@ -193,6 +194,8 @@ import { CustomSpellsModalComponent } from './journal-spellcards/custom-spells-m
     MarkdownModule.forRoot(),
     NgxEditorModule,
     MatRippleModule,
+    TranslateModule,
   ],
+  providers: [TranslatePipe],
 })
 export class JournalModule {}

+ 1 - 0
src/app/shared-components/shared-components.module.ts

@@ -7,6 +7,7 @@ import { IconButtonComponent } from './icon-button/icon-button.component';
 import { ValueBoxComponent } from './value-box/value-box.component';
 import { FormsModule } from '@angular/forms';
 import { MatRippleModule } from '@angular/material/core';
+import { TranslateService, TranslatePipe } from '@ngx-translate/core';
 
 @NgModule({
   declarations: [

+ 3 - 0
src/app/shared-components/value-box/value-box.component.ts

@@ -1,5 +1,6 @@
 import { Component, forwardRef, Input } from '@angular/core';
 import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
+import { TranslateService } from '@ngx-translate/core';
 
 @Component({
   selector: 'value-box',
@@ -22,6 +23,8 @@ export class ValueBoxComponent {
   onChange: any = () => {};
   onTouched: any = () => {};
 
+  constructor(public translate: TranslateService) {}
+
   writeValue(data: any): void {
     this.data = data;
   }

+ 306 - 0
src/assets/i18n/de.json

@@ -0,0 +1,306 @@
+{
+  "general": {
+    "value": "Wert",
+    "modifier": "Modifikator",
+    "modifiers": "Modifikatoren",
+    "attributeValue": "Attributswert",
+    "feet": "Fuß",
+    "fields": "Felder",
+    "meter": "Meter",
+    "level": "Stufe",
+    "effect": "Auswirkung",
+    "diceNumber": "Anzahl Würfel",
+    "diceType": "Würfelart",
+    "dice": "D",
+    "weapons": "Waffen",
+    "spells": "Zauber",
+    "property": "Eigenschaft",
+    "properties": "Eigenschaften",
+    "description": "Beschreibung",
+    "damageType": "Schadensart"
+  },
+  "damageTypes": {
+    "acid": "Säure",
+    "bludgeoning": "Wucht",
+    "cold": "Kälte",
+    "fire": "Feuer",
+    "force": "Kraft",
+    "lightning": "Blitz",
+    "necrotic": "Nekrotisch",
+    "piercing": "Stich",
+    "poison": "Gift",
+    "psychic": "Psychisch",
+    "radiant": "Gleißend",
+    "slashing": "Hieb",
+    "thunder": "Blitz"
+  },
+  "attributes": {
+    "strength": "Stärke",
+    "dexterity": "Geschicklichkeit",
+    "constitution": "Konstitution",
+    "intelligence": "Intelligenz",
+    "wisdom": "Weisheit",
+    "charisma": "Charisma"
+  },
+  "attributesAbbreviations": {
+    "strength": "STÄ",
+    "dexterity": "GES",
+    "constitution": "KON",
+    "intelligence": "INT",
+    "wisdom": "WEI",
+    "charisma": "CHA"
+  },
+  "attributeDetails": {
+    "affectedSkills": "Beeinflusste Fertigkeiten:",
+    "strength": "Stärke misst die physische Kraft und Muskulatur deines Charakters. Ein hoher Stärkewert deutet auf körperliche Robustheit, Muskelkraft und Durchsetzungsvermögen hin. Charaktere mit hoher Stärke sind oft besser in der Lage, schwere Lasten zu tragen, mächtige Waffen zu schwingen und physische Herausforderungen zu bewältigen.",
+    "dexterity": "Geschicklichkeit repräsentiert die Beweglichkeit, Reflexe und allgemeine Körperbeherrschung deines Charakters. Ein hoher Geschicklichkeitswert deutet auf schnelle Reaktionen, geschickte Bewegungen und eine gute Hand-Auge-Koordination hin. Charaktere mit hoher Geschicklichkeit sind oft geschickte Diebe, Bogenschützen oder Akrobaten.",
+    "constitution": "Konstitution steht für die Widerstandsfähigkeit, Gesundheit und Ausdauer deines Charakters. Ein hoher Konstitutionswert bedeutet, dass dein Charakter robust ist und gut mit physischem Stress umgehen kann. Charaktere mit hoher Konstitution haben oft eine höhere Lebenspunktzahl und sind widerstandsfähiger gegenüber Krankheiten und Gift.",
+    "intelligence": "Intelligenz misst die geistige Schärfe, das logische Denkvermögen und die Lernfähigkeit deines Charakters. Ein hoher Intelligenzwert deutet auf eine gute Allgemeinbildung, Wissensdurst und analytische Fähigkeiten hin. Charaktere mit hoher Intelligenz sind oft Magier, Forscher oder Strategen.",
+    "wisdom": "Weisheit repräsentiert die Wahrnehmung, Intuition und emotionale Intelligenz deines Charakters. Ein hoher Weisheitswert deutet auf eine gute Urteilsfähigkeit, Einsicht und innere Stärke hin. Charaktere mit hoher Weisheit sind oft Kleriker, Druiden oder Weise.",
+    "charisma": "Charisma spiegelt die Ausstrahlung, Überzeugungskraft und soziale Fähigkeiten deines Charakters wider. Ein hoher Charismawert bedeutet, dass dein Charakter charmant, einnehmend und überzeugend ist. Charaktere mit hohem Charisma können oft besser mit anderen kommunizieren, überzeugen und Führungsaufgaben übernehmen. Charisma ist oft wichtig für Barden, Anführer oder Diplomaten."
+  },
+  "skills": {
+    "acrobatics": "Akrobatik",
+    "animalHandling": "Tierkunde",
+    "arcana": "Arkana",
+    "athletics": "Athletik",
+    "deception": "Täuschung",
+    "history": "Geschichte",
+    "insight": "Motiv Erkennen",
+    "intimidation": "Einschüchtern",
+    "investigation": "Nachforschung",
+    "medicine": "Heilkunde",
+    "nature": "Naturkunde",
+    "perception": "Wahrnehmung",
+    "performance": "Auftreten",
+    "persuasion": "Überreden",
+    "religion": "Religion",
+    "sleightOfHand": "Fingerfertigkeit",
+    "stealth": "Heimlichkeit",
+    "survival": "Überleben"
+  },
+  "skillsDescription": {
+    "acrobatics": "Würfe auf Akrobatik decken alle Versuche ab, in denen ein Charakter in schwierigen Situtationen auf den Beinen bleiben will. Dies beinhaltet z.B. das Balancieren auf einem Seil, das Rennen über instabile Oberflächen, das Balancieren auf einem schmalen Vorsprung und das Springen über Hindernisse.",
+    "animalHandling": "Würfe auf Tierkunde decken alle Versuche ab, ein domestiziertes Tier zu beruhigen, ein Reittier vor dem Scheuen zu bewahren oder intuitiv zu verstehen, wie es einem wilden Tier geht und was seine Absichten sind.",
+    "arcana": "Würfe auf Arkana decken alle Versuche ab, magische Energie zu identifizieren, zu verstehen oder zu manipulieren.",
+    "athletics": "Würfe auf Athletik decken alle Versuche ab, die körperliche Kraft eines Charakters zu testen. Dies beinhaltet z.B. das Klettern, das Schwimmen und das Springen.",
+    "deception": "Würfe auf Täuschen zeigen an, ob ein Charakter überzeugend die Wahrheit verbergen kann, sei es nun verbal oder durch konkretes Handeln. Dies beinhaltet z.B. das Lügen, das Verbergen von Emotionen hinter einer Maske und das Verkleiden.",
+    "history": "Würfe auf Geschichte decken alle Versuche ab, sich an historische Ereignisse und Personen, vergangene Zeitalter, alte Reiche und vergessene Kulturen zu erinnern.",
+    "insight": "Würfe auf Motiv erkennen decken alle Versuche ab, die wahren Absichten einer anderen Person zu erkennen. Dies beinhaltet z.B. das Erkennen von Lügen, das Interpretieren von Körpersprache und das Voraussagen seiner nächsten Schritte.",
+    "intimidation": "Würfe auf Einschüchtern decken alle Versuche ab, eine andere Person durch Drohungen, offensichtliche Gewalt oder subtile Hinweise zu beeinflussen.",
+    "investigation": "Würfe auf Nachforschung decken alle Versuche ab, Hinweise zu finden und zu interpretieren, die auf eine vorherige Aktivität hindeuten. Dies beinhalet z.B. auch das Rekonstruieren von Tathergängen oder das Aufspüren verborgener Gegenstände.",
+    "medicine": "Würfe auf Heilkunde decken alle Versuche ab, einen Charakter zu stabilisieren, eine Krankheit zu heilen oder eine Wunde zu verbinden.",
+    "nature": "Würfe auf Naturkunde decken alle Versuche ab, die Eigenschaften von wilden Tieren, Pflanzen und anderen Wesen zu erkennen.",
+    "perception": "Würfe auf Wahrnehmung decken alle Versuche ab, die Umgebung zu beobachten und zu bemerken, was sich in der Nähe befindet. Dies beinhaltet z.B. das Erkennen von versteckten Feinden, das Hören von Gesprächen hinter einer Tür, das Entdecken von Hinweisen und das Beobachten von Gefahren.",
+    "performance": "Würfe auf Auftreten decken alle Versuche ab, ein Publikum zu unterhalten, sei es nun durch Musik, Tanzen, Schauspielerei oder andere Formen der Unterhaltung.",
+    "persuasion": "Würfe auf Überreden decken alle Versuche ab, eine andere Person durch Überzeugung, Logik oder Argumentation zu beeinflussen.",
+    "religion": "Würfe auf Religion decken alle Versuche ab, religiöse Rituale zu verstehen, religiöse Symbole zu erkennen und religiöse Traditionen zu interpretieren.",
+    "sleightOfHands": "Würfe auf Fingerfertigkeit decken alle Versuche ab, etwas zu stehlen, einen Trick zu vollführen oder eine Handlung zu vollführen, ohne dass es jemand bemerkt.",
+    "stealth": "Würfe auf Heimlichkeit decken alle Versuche ab, sich zu verstecken, sich leise zu bewegen und sich zu verbergen.",
+    "survival": "Würfe auf Überleben decken alle Versuche ab, in der Wildnis zu überleben. Dies beinhaltet z.B. das Jagen und das Navigieren durch die Wildnis."
+  },
+  "skillsAttributes": {
+    "acrobatics": "dexterity",
+    "animalHandling": "wisdom",
+    "arcana": "intelligence",
+    "athletics": "strength",
+    "deception": "charisma",
+    "history": "intelligence",
+    "insight": "wisdom",
+    "intimidation": "charisma",
+    "investigation": "intelligence",
+    "medicine": "wisdom",
+    "nature": "wisdom",
+    "perception": "wisdom",
+    "performance": "charisma",
+    "persuasion": "charisma",
+    "religion": "intelligence",
+    "sleightOfHand": "dexterity",
+    "stealth": "dexterity",
+    "survival": "wisdom"
+  },
+  "savingThrow": {
+    "subheading": "Rettungswurf",
+    "content": " Ein Rettungswurf wird immer dann verlangt, wenn überprüft werden soll, ob ein Spieler einem Angriff oder äußeren Einfluss widerstehen kann. Durch das bestehen eines Rettungswurfes kann der Effekt verhindert, oder zumindest abgeschwächt werden."
+  },
+  "armorClass": {
+    "label": "Rüstungsklasse",
+    "shortLabel": "Rüstung",
+    "description": "Die Rüstungsklasse wird verwendet, um zu bestimmen, ob ein Angriff erfolgreich ist oder nicht. Ein Angreifer muss einen Würfelwurf (normalerweise einen W20) ablegen und dabei mindestens die Rüstungsklasse des Ziels erreichen. Wenn der Wurf erfolgreich ist, verursacht der Angriff Schaden, ansonsten wird der Angriff abgewehrt."
+  },
+  "initiative": {
+    "label": "Initiative",
+    "description": "Der Initiativebonus wird verwendet, um die Initiative des aktuellen Kampfes oder einer zeitkritischen Situation zu bestimmen. Jeder Charakter wirft einen W20 und addiert seinen Initiativebonus. Der Charakter mit dem höchsten Ergebnis darf zuerst agieren."
+  },
+  "movement": {
+    "label": "Bewegungsrate",
+    "shortLabel": "Bewegung",
+    "movement": "Laufen",
+    "translationTable": "Umrechnungstabelle",
+    "description": "Die Bewegungsrate gibt an, wie weit ein Charakter pro Runde laufen kann. Die Bewegungsrate wird in Fuß angegeben, wobei 5 Fuß 1,5 Metern und somit einem Feld entsprechen. Die Bewegung kann an einem Stück verwendet werden, oder in mehrere Teile aufgeteilt werden. In schwierigem Gelände halbiert sich die Bewegungsrate.",
+    "jumping": "Springen",
+    "jumpingDescription": "Ein Charakter kann basierend auf seiner Stärke springen. Wenn man sich vor dem Sprung 10 Fuß (2 Felder) bewegt hat, kann man die doppelte Distanz springen."
+  },
+  "proficiency": {
+    "label": "Übungsbonus",
+    "shortLabel": "Übung",
+    "description": "Der Übungsbonus wird auf alle Rettungs-, Angriffs- und Fertigkeitswürfe addiert, in denen ein Spieler geübt ist. Der Übungsbonus steigt mit der Charakterstufe."
+  },
+  "conditions": {
+    "label": "Zustände",
+    "shortLabel": "Zustand",
+    "noConditions": "Keine Zustände",
+    "addCondition": "Zustand hinzufügen",
+    "currentConditions": "Aktuelle Zustände",
+    "description": "Zustände ändern die Fähigkeiten einer Kreatur auf verschiedene Arten und können die Folgen von Zaubern, Klassenmerkmalen, Monsterangriffen oder anderen Fähigkeiten sein. Der Zustand hält solange an, bis er aufgehoben wird, oder wie seine Wirkungsdauer ist.",
+    "blinded": "Blind",
+    "charmed": "Befreundet",
+    "deafened": "Taub",
+    "frightened": "Verängstigt",
+    "grappled": "Geklammert",
+    "incapacitated": "Handlungsunfähig",
+    "invisible": "Unsichtbar",
+    "paralyzed": "Gelähmt",
+    "petrified": "Versteinert",
+    "poisoned": "Vergiftet",
+    "prone": "Liegend",
+    "stunned": "Betäubt",
+    "unconscious": "Bewusstlos",
+    "conditionDescriptions": {
+      "stunned": [
+        "Ein betäubter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.",
+        "Er scheitert automatisch bei Stärke- und Geschicklichkeitswürfen.",
+        "Angriffe gegen ihn haben Vorteil."
+      ],
+      "unconscious": [
+        "Ein bewusstloser Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.",
+        "Er lässt fallen, was er in der Hand hält und stürzt zu Boden",
+        "Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen",
+        "Angriffe gegen ihn haben Vorteil.",
+        "Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist."
+      ],
+      "charmed": [
+        "Ein bezauberter Charakter kann den Bezauberer weder angreifen, noch als Ziel für schädigende Fähigkeiten oder Zauber auswählen.",
+        "Der Bezauberer ist im Vorteil bei Fähigkeitswürfen, die sich auf die Interaktion mit dem bezauberten Charakter beziehen."
+      ],
+      "blinded": [
+        "Ein blinder Charakter kann nicht sehen. Er scheitert automatisch bei allen Attributwürfen, die auf Sicht basieren.",
+        "Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil."
+      ],
+      "Festgesetzt": [
+        "Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.",
+        "Angriffe gegen ihn haben Vorteil, seine Angriffe wiederum haben Nachteil.",
+        "Er scheitert automatisch bei allen Geschicklichkeitsrettungswürfen."
+      ],
+      "paralyzed": [
+        "Ein gelähmter Charakter ist kampfunfähig und kann somit keine Aktion und Reaktion ausführen.",
+        "Er kann sich weder bewegen noch sprechen",
+        "Er scheitert automatisch bei Stärke- und Geschicklichkeitsrettungswürfen.",
+        "Angriffe gegen ihn haben Vorteil.",
+        "Jeder Angriff, der ihn trifft, ist ein kritischer Treffer, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist."
+      ],
+      "grappled": [
+        "Die Bewegungsrate eines festgesetzten Charakters wird auf 0 gesetzt.",
+        "Der Zustand endet, wenn die packende Kreatur kampfunfähig wird",
+        "Der Zustand endet auch, wenn ein Effekt die gepackte Kreatur aus der Reichweite der packenden Kreatur oder des packenden Effekts zieht. "
+      ],
+      "incapacitated": [
+        "Ein kampfunfähiger Charakter kann keine Aktionen oder Reaktionen ausführen."
+      ],
+      "prone": [
+        "Ein liegender Charakter kann sich nur kriechend bewegen.",
+        "Alle seine Angriffe haben Nachteil.",
+        "Alle Angriffe gegen ihn haben Vorteil, wenn der Angreifer innerhalb von 1,5 Metern von dem Charakter ist, ansonsten haben sie nachteil."
+      ],
+      "deafened": [
+        "Ein tauber Charakter kann nicht hören und scheitert automatisch bei allen Attributwürfen, die auf Hören basieren."
+      ],
+      "invisible": [
+        "Ein unsichtbarer Charakter kann nicht gesehen werden, außer durch magische Mittel oder besondere Sinne.",
+        "Wenn er sich verbergen will, gilt er als komplett verschleiert, kann sich jedoch durch Geräusche und Fußspuren verraten.",
+        "Er hat Vorteil bei Angriffen, Angriffe gegen ihn wiederum sind im Nachteil."
+      ],
+      "frightened": [
+        "Ein verängstigter Charakter hat Nachteil bei allen Attributswürfen und Angriffen, solange die Quelle seiner Angst in Sichtweite ist.",
+        "Er kann nicht freiwillig näher an die Quelle seiner Angst heranrücken."
+      ],
+      "poisoned": [
+        "Ein vergifteter Charakter hat Nachteil bei allen Attributs- und Angriffswürfen."
+      ],
+      "petrified": [
+        "Ein versteinerter Charakter wird mit ihrere gesamten nicht-magischen Ausrüstung versteinert und sein Gewicht verzehnfacht sich.",
+        "Der CHarakter ist kampfunfähig, kann also weder Aktion noch Reaktion ausführen, sich bewegen, sprechen oder die Umgebung wahrnehmen.",
+        "Angriffe gegen ihn sind im Vorteil",
+        "Er scheitert automatisch bei allen Stärke- und Geschicklichkeitswürfen.",
+        "Er ist immun gegen jeglichen Schaden",
+        "Er ist immun gegen Gifte und Krankheiten, außer gegen solche, die sich bereits vorher in ihm befunden HttpBackend. Diese werden aufgehalten, nicht neutralisiert."
+      ]
+    }
+  },
+  "exhaustion": {
+    "label": "Erschöpfung",
+    "description": "Einige Spezialfähigkeiten und Umweltgefahren, wie Hunger oder extreme Temperaturen können zu Erschöpfung führen. Jede Stufe fügt einen weiteren Malus hinzu, sodass mehrere Mali gleichzeitig möglich sind. Erschöpfung kann z.B. durch eine lange Rast reduziert werden.",
+    "currentExhaustion": "Aktuelle Erschöpfung",
+    "0": "Keine Einschränkun",
+    "1": "Nachteil auf Attributwürfe",
+    "2": "Bewegungsrate halbiert",
+    "3": "Nachteil auf Angriffs- und Rettungswürfe",
+    "4": "Bewegungsrate fällt auf 0",
+    "5": "Sofortiger Tod"
+  },
+  "deathSave": {
+    "label": "Todesrettungswürfe",
+    "success": "Erfolg",
+    "fail": "Fehlschlag",
+    "description": "Immer wenn ein Charakter seinen Zug mit 0 Trefferpunkten beginnt und nicht stabilisiert wurde, muss er einen Todesrettungswurf ablegen. Ist das Ergebnis 10 oder höher, ist der Wurf erfolgreich, ansonsten fehlgeschlagen. Beim dritten Erfolg wird der Charakter stabilisiert, beim dritten Fehlschlag stirbt er.",
+    "criticalHeader": "Eine 1 oder 20 würfeln",
+    "criticalContent": "Würfelt ein Charakter eine 1, zählt der Wurf als zwei Fehlschläge. Würfelt er eine 20, erhält er sofort einen Lebenspunkt dazu und ist nicht mehr bewustlos."
+  },
+  "life": {
+    "hitpoints": "Trefferpunkte",
+    "max": "Maximale Trefferpunkte",
+    "temporary": "Temporäre Trefferpunkte",
+    "current": "Aktuelle Trefferpunkte",
+    "hitdice": "Trefferwürfel",
+    "hitdiceDescription": "Trefferwürfel werden verwendet, um bei einer kurzen Rast Trefferpunkte wiederherzustellen. Du kannst eine beliebige Anzahl deiner verfügbaren Trefferwürfel verwenden. Sie werden bei einer langen rast wiederhergestellt."
+  },
+  "weapons": {
+    "header": {
+      "type": "Typ",
+      "name": "Name",
+      "bonus": "Bonus",
+      "damage": "Schaden",
+      "range": "Reichweite"
+    },
+    "name": "Name",
+    "noWeapons": "Noch keine Waffen hinzugefügt",
+    "meele": "Nahkampf",
+    "ranged": "Fernkampf",
+    "attack": "Angriff",
+    "single": "Einhändiger Schaden",
+    "dual": "Zweihändiger Schaden",
+    "proficient": "Geübt",
+    "versatile": "Vielseitig",
+    "oneHanded": "Einhändig",
+    "twoHanded": "Zweihändig",
+    "finesse": "Finesse",
+    "throwable": "Wurfwaffe",
+    "magical": "Magisch",
+    "range": "Reichweite",
+    "throwRange": "Wurfweite",
+    "modal": {
+      "addWeapon": "Waffe hinzufügen",
+      "editWeapon": "Waffe bearbeiten",
+      "applyModifier": "Attributmodifikator anwenden",
+      "additionalDamage": "Zusatzschaden",
+      "attackBonus": "Angriffsbonus",
+      "magicalModifier": "Magischer Modifikator",
+      "damage": "Schaden",
+      "normalRange": "Normale Reichweite",
+      "extendedRange": "Erweiterte Reichweite",
+      "normalThrowRange": "Normale Wurfweite",
+      "extendedThrowRange": "Erweiterte Wurfweite",
+      "placeholder": "Beschreibung der Waffe"
+    }
+  }
+}

+ 30 - 0
src/assets/i18n/en.json

@@ -0,0 +1,30 @@
+{
+  "attributes": {
+    "strength": "Strength",
+    "dexterity": "Dexterity",
+    "constitution": "Constitution",
+    "intelligence": "Intelligence",
+    "wisdom": "Wisdom",
+    "charisma": "Charisma"
+  },
+  "skills": {
+    "acrobatics": "Acrobatics",
+    "animal_handling": "Animal Handling",
+    "arcana": "Arcana",
+    "athletics": "Athletics",
+    "deception": "Deception",
+    "history": "History",
+    "insight": "Insight",
+    "intimidation": "Intimidation",
+    "investigation": "Investigation",
+    "medicine": "Medicine",
+    "nature": "Nature",
+    "perception": "Perception",
+    "performance": "Performance",
+    "persuasion": "Persuasion",
+    "religion": "Religion",
+    "sleight_of_hand": "Sleight of Hand",
+    "stealth": "Stealth",
+    "survival": "Survival"
+  }
+}