Akkumulierten grünen Arbeitsstand landen (Basis für Weiterarbeit)

Bündelt den über mehrere Sessions gewachsenen, uncommitteten Stand in
einem Basis-Commit, damit Folge-Features isoliert darauf aufsetzen.
Verifikation: tsc --noEmit sauber, vitest 600/600 grün.

Enthalten (Details in PENDENZEN.md ✅-Liste / HANDOVER.md):
- truck-Integration: Profil-Extrusion + Verjüngung + Boolean-CSG (csgrs),
  Crate src-tauri/trucksolid, Werkzeug `extrude`, ExtrudedSolid-Modell.
- kernel2d-Port nach Rust/WASM (Phasen 1–5, Diff-Harness).
- render3d 3D-Live-Schnitt = 2D-Schnitt: geschichteter Bodenaufbau,
  Prioritäts-Verschneidung (section_boolean.rs), einstellbare
  Schichttrennlinien, per-Hatch-Strichstärke, relativeToWall-Orientierung.
- Interop-Export IFC4/STL/OBJ (Loch-Ausschnitt wallMeshCut), Schnellexport.
- Projektdatei .obp + OS-Lock (lock.rs, LockConflictDialog).
- Layout-Blätter (Modell/Editor/Panel/PDF), Ausschnitte, Override-Engine,
  Tragwerk-Stützen (Column), BIM-Tree-Panel.
- Bauteil-Typsystem (Tür/Fenster/Treppe-Typen), Betontreppe mit schräger
  Laufplatte, Text-/Textbox-Werkzeug, Mess-Werkzeug, 2D/3D-Griffe für
  Öffnungen/Treppen, Snap-Symbol-Restyle.
This commit is contained in:
2026-07-09 00:57:29 +02:00
parent 9b33a89318
commit 1d939a939a
129 changed files with 26324 additions and 842 deletions
+365 -7
View File
@@ -15,16 +15,28 @@ export const de = {
"topbar.perspektive": "Perspektive",
"view3d.group": "Ansicht 3D",
"view3d.front": "Front",
"view3d.front": "Vorne",
"view3d.front.hint": "Frontalansicht von vorne",
"view3d.back": "Hinten",
"view3d.back.hint": "Rückansicht von hinten",
"view3d.top": "Oben",
"view3d.top.hint": "Draufsicht (senkrecht von oben)",
"view3d.side": "Seite",
"view3d.side.hint": "Seitenansicht (90° zur Front)",
"view3d.side": "Rechts",
"view3d.side.hint": "Rechte Seitenansicht (90° zur Front)",
"view3d.left": "Links",
"view3d.left.hint": "Linke Seitenansicht (90° zur Front, gegenüber Rechts)",
"view3d.perspective": "Perspektive",
"view3d.perspective.hint": "Freie Perspektive (3/4-Blick)",
"view3d.iso": "Isometrie",
"view3d.iso.hint": "Isometrische Ansicht (gleichwinklig von vorne-oben-rechts)",
"view3d.isoFrontLeft": "Vorne-Links",
"view3d.isoFrontLeft.hint": "Isometrische Ansicht (gleichwinklig von vorne-oben-links)",
"view3d.isoBackRight": "Hinten-Rechts",
"view3d.isoBackRight.hint": "Isometrische Ansicht (gleichwinklig von hinten-oben-rechts)",
"view3d.isoBackLeft": "Hinten-Links",
"view3d.isoBackLeft.hint": "Isometrische Ansicht (gleichwinklig von hinten-oben-links)",
"view3d.iso.menu": "Weitere Iso-Ansichten",
"view3d.iso.menu.hint": "Einen der vier oberen Iso-Oktanten wählen",
"view3d.camera": "Kamera",
"view3d.camera.hint": "Kamera-Einstellungen (Sichtwinkel)",
"view3d.fov": "Sichtwinkel",
@@ -86,12 +98,12 @@ export const de = {
"topbar.resources.hint": "Ressourcen-Fenster ein-/ausblenden",
// ── Layout-Menü (Topbar) ─────────────────────────────────────────────────
"layout.title": "Layout",
"layout.placeholder": "Layout …",
"layout.saveCurrent": "+ Aktuelles speichern …",
"layout.title": "Arbeitsumgebung",
"layout.placeholder": "Arbeitsumgebung …",
"layout.saveCurrent": "+ Aktuelle speichern …",
"layout.loadGroup": "Laden",
"layout.deleteGroup": "Löschen",
"layout.savePrompt": "Layout speichern als:",
"layout.savePrompt": "Arbeitsumgebung speichern als:",
// ── Sichtbarkeits-Kombinationen (Topbar) ─────────────────────────────────
"combo.layers": "Ebenen-Komb.",
@@ -120,6 +132,10 @@ export const de = {
"tool.circle.hint": "Kreis: Mittelpunkt setzen, dann Radius",
"tool.arc": "Bogen",
"tool.arc.hint": "Bogen: Mittelpunkt, Startpunkt, dann Endpunkt (CCW)",
"tool.text": "Text",
"tool.text.hint": "Text: Ankerpunkt setzen, dann Text eintippen",
"tool.textbox": "Textspalte",
"tool.textbox.hint": "Textspalte: Anker, dann Spaltenbreite ziehen, dann Text eintippen",
// Ribbon-Oberleiste (Tabs + Gruppen)
"ribbon.tab.2d": "2D",
"ribbon.tab.3d": "3D",
@@ -234,6 +250,7 @@ export const de = {
"attr.fill": "Füllung",
"attr.fillColor": "Füllfarbe",
"attr.clearFill": "Füllfarbe entfernen",
"attr.pickColor": "Farbe wählen",
"attr.foreground": "Vordergrund",
"attr.background": "Hintergrund",
"attr.bySystem": "Nach System",
@@ -266,12 +283,29 @@ export const de = {
"objinfo.kind.opening": "Öffnung",
"objinfo.kind.stair": "Treppe",
"objinfo.kind.room": "Raum",
"objinfo.kind.extrudedSolid": "Extrusion",
"objinfo.kind.column": "Stütze",
// ── Stützen-Attribute (Object-Info-Panel) ───────────────────────────────
"objinfo.column.section": "Stütze",
"objinfo.column.profile": "Profil",
"objinfo.column.profile.rect": "Rechteck",
"objinfo.column.profile.round": "Rund",
"objinfo.column.width": "Breite",
"objinfo.column.depth": "Tiefe",
"objinfo.column.radius": "Radius",
"objinfo.column.height": "Höhe",
"objinfo.column.rotation": "Drehung (°)",
"objinfo.column.floor": "Geschoss",
// ── Wand-Attribute (Object-Info-Panel) ──────────────────────────────────
"objinfo.wall.section": "Wand",
"objinfo.wall.refLine": "Referenzlinie",
"objinfo.wall.refLine.left": "Außen (links)",
"objinfo.wall.refLine.center": "Mitte",
"objinfo.wall.refLine.right": "Innen (rechts)",
"objinfo.wall.sliceTermination": "An Decke enden",
"objinfo.wall.sliceTermination.both": "Aus",
"objinfo.wall.sliceTermination.below": "Unten",
"objinfo.wall.sliceTermination.above": "Oben",
"objinfo.wall.buildup": "Aufbau",
"objinfo.wall.single": "Solid",
"objinfo.wall.multi": "Mehrschichtig",
@@ -284,6 +318,11 @@ export const de = {
"objinfo.wall.top": "Oberkante (OK)",
"objinfo.wall.anchorFloor": "Gebunden",
"objinfo.wall.anchorCustom": "Eigene",
"objinfo.anchor.refFloor": "Referenzgeschoss",
"objinfo.anchor.customHeight": "Eigene Höhe",
"objinfo.wall.length": "Länge",
"objinfo.wall.volumeGross": "Brutto",
"objinfo.volume": "Volumen",
"objinfo.wall.height": "Höhe",
// ── Decken-Attribute (Object-Info-Panel) ────────────────────────────────
"objinfo.ceiling.section": "Decke",
@@ -299,6 +338,9 @@ export const de = {
"objinfo.ceiling.anchorCustom": "Eigene",
// ── Öffnungs-Attribute (Object-Info-Panel) ──────────────────────────────
"objinfo.opening.section": "Öffnung",
"objinfo.opening.type": "Typ",
"objinfo.stair.type": "Typ",
"objinfo.type.none": "(kein Typ)",
"objinfo.opening.kind": "Art",
"objinfo.opening.kind.window": "Fenster",
"objinfo.opening.kind.door": "Tür",
@@ -359,6 +401,15 @@ export const de = {
"objinfo.room.perimeter": "Umfang",
"objinfo.room.refFloor": "Referenzgeschoss",
"objinfo.room.editStamp": "Stempel bearbeiten …",
// ── Extrusions-Attribute (truck-Integration, Object-Info-Panel) ─────────
"objinfo.extrudedSolid.section": "Extrusion",
"objinfo.extrudedSolid.height": "Höhe",
"objinfo.extrudedSolid.taper": "Verjüngung",
"objinfo.extrudedSolid.area": "Grundfläche",
"objinfo.extrudedSolid.floor": "Geschoss",
"objinfo.rotate": "Drehen",
"objinfo.drawing.length": "Länge",
"objinfo.drawing.radius": "Radius",
"objinfo.wall.floorAboveNone": "Kein oberes Geschoss",
"levels.addFloor": "+ Geschoss",
"levels.addSection": "+ Schnitt",
@@ -489,6 +540,9 @@ export const de = {
"default.ceilingTypeSingle": "Decke {thickness} m",
"default.wallTypeName": "Neuer Wandtyp",
"default.ceilingTypeName": "Neuer Deckentyp",
"default.doorTypeName": "Neuer Türtyp",
"default.windowTypeName": "Neuer Fenstertyp",
"default.stairTypeName": "Neuer Treppentyp",
// ── Warnungen (Lösch-Schutz) ─────────────────────────────────────────────
"alert.layerInUse": "Ebene „{code} {name}\" wird von Bauteilen verwendet und kann nicht gelöscht werden.",
@@ -497,6 +551,9 @@ export const de = {
"alert.lineStyleInUse": "Linienstil „{name}\" wird von einer Schraffur verwendet und kann nicht gelöscht werden.",
"alert.wallTypeInUse": "Wandtyp „{name}\" wird von einer Wand verwendet und kann nicht gelöscht werden.",
"alert.ceilingTypeInUse": "Deckentyp „{name}\" wird von einer Decke verwendet und kann nicht gelöscht werden.",
"alert.doorTypeInUse": "Türtyp „{name}\" wird von einer Tür verwendet und kann nicht gelöscht werden.",
"alert.windowTypeInUse": "Fenstertyp „{name}\" wird von einem Fenster verwendet und kann nicht gelöscht werden.",
"alert.stairTypeInUse": "Treppentyp „{name}\" wird von einer Treppe verwendet und kann nicht gelöscht werden.",
// ── Ressourcen-Manager ───────────────────────────────────────────────────
"resources.title": "Ressourcen",
@@ -507,7 +564,38 @@ export const de = {
"resources.tab.lines": "Linien",
"resources.tab.wallStyles": "Wandstile",
"resources.tab.ceilingStyles": "Deckenstile",
"resources.tab.doorStyles": "Türtypen",
"resources.tab.windowStyles": "Fenstertypen",
"resources.tab.stairStyles": "Treppentypen",
"resources.tab.materials": "Materialien",
"resources.tab.overrides": "Overrides",
// Grafische Overrides (Regel-Engine).
"resources.overrides.hint":
"Regeln übersteuern Farbe/Strichstärke/Linienstil beim Rendern (Elementdaten bleiben unverändert). Reihenfolge = Priorität: pro Feld gewinnt die oberste aktive Regel.",
"resources.overrides.empty": "Noch keine Override-Regeln.",
"resources.overrides.placeholder": "Regel",
"resources.overrides.defaultName": "Neue Regel",
"resources.overrides.delete": "Regel löschen",
"resources.overrides.moveUp": "Regel nach oben (höhere Priorität)",
"resources.overrides.moveDown": "Regel nach unten (tiefere Priorität)",
"resources.overrides.enabled": "Regel aktiv",
"resources.overrides.condition": "Bedingung",
"resources.overrides.condType": "Kriterium",
"resources.overrides.condType.layer": "Ebene (Name/Code)",
"resources.overrides.condType.object": "Objektname",
"resources.overrides.operator": "Operator",
"resources.overrides.op.equals": "ist gleich",
"resources.overrides.op.contains": "enthält",
"resources.overrides.op.startsWith": "beginnt mit",
"resources.overrides.op.notEquals": "ist ungleich",
"resources.overrides.value": "Wert",
"resources.overrides.value.placeholder": "z. B. Wände oder 20",
"resources.overrides.actions": "Aktionen",
"resources.overrides.action.color": "Farbe",
"resources.overrides.action.lineweight": "Strichstärke (mm)",
"resources.overrides.action.linetype": "Linienstil",
"resources.overrides.linetype.none": "— (unverändert)",
"resources.wallStyles.hint":
"Je Wandtyp die Schichtfugen (zwischen benachbarten Schichten) als wählbaren Linienstil. Ohne Zuweisung: Haarlinie 0.02 mm.",
@@ -517,6 +605,75 @@ export const de = {
"resources.ceilingStyles.empty": "Noch keine Deckentypen.",
"resources.wallStyles.placeholder": "Wandtyp",
"resources.ceilingStyles.placeholder": "Deckentyp",
// Bauteil-Typen (Tür/Fenster/Treppe) — Formular-Bibliotheken.
"resources.doorTypes.hint":
"Wiederverwendbare Türtypen mit Bauart, Blattausführung und Standardmaßen für neu platzierte Türen.",
"resources.doorTypes.empty": "Noch keine Türtypen.",
"resources.doorTypes.placeholder": "Türtyp",
"resources.windowTypes.hint":
"Wiederverwendbare Fenstertypen mit Öffnungsart, Verglasung und Standardmaßen für neu platzierte Fenster.",
"resources.windowTypes.empty": "Noch keine Fenstertypen.",
"resources.windowTypes.placeholder": "Fenstertyp",
"resources.stairTypes.hint":
"Wiederverwendbare Treppentypen mit Tragart, Stufenausbildung und Geländer für neu platzierte Treppen.",
"resources.stairTypes.empty": "Noch keine Treppentypen.",
"resources.stairTypes.placeholder": "Treppentyp",
"resources.delete.doorType": "Türtyp „{name}\" löschen",
"resources.delete.windowType": "Fenstertyp „{name}\" löschen",
"resources.delete.stairType": "Treppentyp „{name}\" löschen",
"resources.field.doorKind": "Bauart",
"resources.field.leafCount": "Flügelzahl",
"resources.field.leafStyle": "Blattausführung",
"resources.field.glazingRatio": "Glasanteil",
"resources.field.frameThickness": "Zargenstärke (m)",
"resources.field.frameDepth": "Zargentiefe (m)",
"resources.field.defaultWidth": "Lichtbreite (m)",
"resources.field.defaultHeight": "Lichthöhe (m)",
"resources.field.threshold": "Bodenschwelle",
"resources.field.windowKind": "Öffnungsart",
"resources.field.wingCount": "Flügelzahl",
"resources.field.glazing": "Verglasung",
"resources.field.defaultSillHeight": "Brüstungshöhe (m)",
"resources.field.sillBoard": "Fensterbank",
"resources.field.structure": "Tragart",
"resources.field.closedRisers": "Setzstufen geschlossen",
"resources.field.treadThickness": "Trittstufendicke (m)",
"resources.field.nosing": "Trittkanten-Überstand (m)",
"resources.field.railing": "Geländer",
"resources.field.stairWidth": "Laufbreite (m)",
"resources.doorKind.dreh": "Drehflügel",
"resources.doorKind.schiebe": "Schiebe",
"resources.doorKind.wandoeffnung": "Wandöffnung",
"resources.leafCount.1": "1-flügelig",
"resources.leafCount.2": "2-flügelig",
"resources.leafStyle.glatt": "Glatt",
"resources.leafStyle.kassette": "Kassette",
"resources.leafStyle.glas": "Glas",
"resources.windowKind.dreh": "Dreh",
"resources.windowKind.kipp": "Kipp",
"resources.windowKind.drehkipp": "Dreh-Kipp",
"resources.windowKind.fest": "Fest",
"resources.windowKind.schiebe": "Schiebe",
"resources.glazing.einfach": "Einfach",
"resources.glazing.zweifach": "Zweifach",
"resources.glazing.dreifach": "Dreifach",
"resources.sillBoard.keine": "Keine",
"resources.sillBoard.innen": "Innen",
"resources.sillBoard.aussen": "Außen",
"resources.sillBoard.beide": "Beide",
"resources.structure.massiv": "Massiv",
"resources.structure.beton": "Betontreppe (Laufplatte)",
"resources.structure.wange": "Wange",
"resources.structure.aufgesattelt": "Aufgesattelt",
"resources.structure.spindel": "Spindel",
"resources.railing.keine": "Keine",
"resources.railing.links": "Links",
"resources.railing.rechts": "Rechts",
"resources.railing.beide": "Beide",
"resources.col.layer": "Schicht",
"resources.col.component": "Bauteil",
"resources.col.thickness": "Dicke (mm)",
@@ -698,6 +855,9 @@ export const de = {
"cmd.opening.dir": "Richtung",
"cmd.opening.sillField": "Brüstung",
"cmd.opening.swingField": "Winkel",
"cmd.column.label": "Stütze",
"cmd.column.place": "Stütze setzen:",
"cmd.column.profile": "Profil",
"cmd.stair.label": "Treppe",
"cmd.stair.start": "Startpunkt der Treppe:",
"cmd.stair.run": "Laufrichtung / Ende ( Grundform · Auf/Ab ):",
@@ -732,11 +892,23 @@ export const de = {
"cmd.arc.center": "Mittelpunkt:",
"cmd.arc.start": "Startpunkt (Radius + Startwinkel):",
"cmd.arc.end": "Endpunkt (Endwinkel):",
"cmd.text.label": "Text",
"cmd.text.point": "Ankerpunkt:",
"cmd.text.enter": "Text eingeben:",
"cmd.textbox.label": "Textspalte",
"cmd.textbox.point": "Ankerpunkt:",
"cmd.textbox.width": "Spaltenbreite (zweiter Punkt):",
"cmd.textbox.enter": "Text eingeben:",
// Editierbefehle (Tier 1): Move/Copy/Offset operieren auf der Auswahl.
"cmd.move.label": "Verschieben",
"cmd.move.base": "Basispunkt:",
"cmd.move.target": "Zielpunkt:",
"cmd.move.empty": "Nichts gewählt (erst Objekte wählen).",
"cmd.rotate.label": "Drehen",
"cmd.measure.label": "Messen",
"cmd.measure.start": "Messen von:",
"cmd.measure.to": "bis (Distanz · Winkel):",
"transform.needSelection": "Erst Objekte wählen, dann drehen.",
"cmd.mirror.label": "Spiegeln",
"cmd.mirror.first": "Erster Punkt der Spiegelachse:",
"cmd.mirror.second": "Zweiter Punkt der Spiegelachse:",
@@ -749,6 +921,10 @@ export const de = {
"cmd.offset.label": "Versatz",
"cmd.offset.pick": "Kurve wählen:",
"cmd.offset.side": "Seite oder Distanz:",
"cmd.extrude.label": "Extrudieren",
"cmd.extrude.pick": "Geschlossenes Profil wählen:",
"cmd.extrude.height": "Höhe:",
"cmd.extrude.taper": "Verjüngung (0–1, 1=Spitze):",
// Trim (Quick-Trim): auf den wegzuschneidenden Abschnitt klicken; wiederholend.
"cmd.trim.label": "Stutzen",
"cmd.trim.pick": "Abschnitt zum Wegschneiden anklicken (Esc beendet):",
@@ -863,11 +1039,43 @@ export const de = {
"file.exportPdf": "Als PDF exportieren…",
"file.exportDxf": "Als DXF exportieren…",
"file.exportSchedule": "Bauteilliste (CSV)…",
"file.exportIfc": "IFC exportieren",
"file.exportObj": "OBJ exportieren (3D-Mesh)",
"file.exportStl": "STL exportieren (3D-Mesh)",
"file.export": "Exportieren",
"file.openFailed": "Projekt-Datei konnte nicht gelesen werden.",
// ── Lock-Konflikt (Projektdatei bereits in anderer Instanz geöffnet) ────
"lock.title": "Projekt bereits geöffnet",
"lock.message":
"Diese Projektdatei ist bereits in einer anderen Instanz geöffnet.",
"lock.messageInfo": "Geöffnet auf {host} (Prozess {pid}).",
"lock.openReadOnly": "Schreibgeschützt öffnen",
"lock.forceOpen": "Trotzdem erzwingen",
"lock.forceOpenWarning":
"Achtung: Öffnet zum Schreiben, obwohl eine andere Instanz die Datei hält — Änderungen können sich gegenseitig überschreiben.",
"exportSave.title": "Exportieren",
"exportSave.format": "Format",
"exportSave.filename": "Dateiname",
"exportSave.locationNote": "Wird in den Standard-Download-Ordner gespeichert.",
"exportSave.fmt.csv": "Bauteilliste (CSV)",
"exportSave.fmt.ifc": "IFC (BIM)",
"exportSave.fmt.obj": "OBJ (3D-Mesh)",
"exportSave.fmt.stl": "STL (3D-Mesh)",
"about.title": "Über dossier",
"about.version": "Version",
"about.desc": "Open-Source-CAAD (Computer Aided Architecture Design) — schöne, normgerechte Pläne aus einem semantischen Gebäudemodell. Als Desktop-App (vollständige Fassung) und im Browser zugänglich.",
"about.copyright": "© 2026 Karim Gabriele Varano",
"about.license": "Lizenz: AGPL-3.0-or-later",
"about.suite": "Teil der openbureau-Suite",
"about.licenses": "Open-Source-Lizenzen (Drittkomponenten)",
"about.close": "Schließen",
// ── Einstellungs-Fenster ──────────────────────────────────────────────────
"topbar.settings": "Einstellungen",
"topbar.settings.hint": "Einstellungen öffnen (Darstellungsfarben, Projekt)",
"settings.title": "Einstellungen",
"settings.section.workspace": "Arbeitsumgebung",
"settings.section.display": "Darstellung",
"settings.marqueeColor": "Auswahlrahmen-Farbe",
"settings.marqueeColor.hint":
@@ -907,6 +1115,9 @@ export const de = {
"ctxImport.src.osmRoads": "OSM-Strassen",
"ctxImport.src.osmWater": "OSM-Wasser",
"ctxImport.src.osmGreen": "OSM-Grün",
"ctxImport.src.osmParking": "OSM-Parkplätze",
"ctxImport.src.osmRailway": "OSM-Bahn",
"ctxImport.src.osmForest": "OSM-Wald",
"ctxImport.cancel": "Abbrechen",
"ctxImport.confirm": "Importieren",
"ctxImport.importing": "Importiere…",
@@ -950,6 +1161,9 @@ export const de = {
"roomStamp.showFloorArea": "Bodenfläche anzeigen",
"roomStamp.floorAreaPrefix": "Präfix Bodenfläche",
"roomStamp.showUsage": "Nutzung anzeigen",
"roomStamp.roundingStep": "Flächen-Rundung",
"roomStamp.roundingStepDefault": "Standard (2 Nachkommastellen)",
"roomStamp.occupancy": "Personenzahl",
"text.selectedHint": "Formatierung wirkt auf den ausgewählten Text",
// ── Rich-Text-Editor ────────────────────────────────────────────────────────
@@ -958,6 +1172,8 @@ export const de = {
"rt.underline": "Unterstrichen",
"rt.strike": "Durchgestrichen",
"rt.strikethrough": "Durchgestrichen",
"rt.super": "Hochgestellt",
"rt.sub": "Tiefgestellt",
"rt.fontSize": "Schriftgrösse",
"rt.color": "Farbe",
"rt.preset": "Vorlage",
@@ -969,6 +1185,148 @@ export const de = {
"WebGPU konnte nicht initialisiert werden. In der Statusleiste auf WebGL2 umschalten, um die 3D-Ansicht weiter zu nutzen.",
"viewport3d.grid.show": "Bodenraster einblenden",
"viewport3d.grid.hide": "Bodenraster ausblenden",
"viewport3d.section.label": "Schnittebene",
"viewport3d.section.show": "Schnittebene ein",
"viewport3d.section.hide": "Schnittebene aus",
"viewport3d.grip.vertex": "Wandende ziehen",
"viewport3d.grip.height": "Höhe ziehen",
"viewport3d.grip.move": "Verschieben",
// ── Element-Baum (Elemente-Panel, ROADMAP §11) ──────────────────────────────
"elements.title": "Elemente",
"elements.search": "Elemente suchen…",
"elements.empty": "Keine Bauteile im Projekt.",
"elements.noMatch": "Keine Treffer.",
"elements.kind.wall": "Wand",
"elements.kind.ceiling": "Decke",
"elements.kind.window": "Fenster",
"elements.kind.opening": "Öffnung",
"elements.kind.stair": "Treppe",
"elements.kind.extrusion": "Extrusion",
// Ausschnitte / View-Snapshots (DOSSIER A2).
"viewsnap.title": "Ausschnitte",
"viewsnap.saveCurrent": "+ Aktuellen Ausschnitt speichern …",
"viewsnap.savePrompt": "Ausschnitt speichern als:",
"viewsnap.renamePrompt": "Ausschnitt umbenennen:",
"viewsnap.rename": "Umbenennen",
"viewsnap.delete": "Löschen",
"viewsnap.deleteConfirm": "Ausschnitt „{name}\" löschen?",
"viewsnap.empty": "Noch keine Ausschnitte. Ansicht einrichten und speichern.",
"viewsnap.applyHint": "Ausschnitt „{name}\" wiederherstellen",
"viewsnap.add.folder": "Ordner erstellen",
"viewsnap.add.snapshot": "Ausschnitt speichern",
"viewsnap.folder.defaultName": "Neuer Ordner",
"viewsnap.folder.rename": "Ordner umbenennen",
"viewsnap.folder.delete": "Ordner löschen",
"viewsnap.folder.empty": "Leerer Ordner",
"viewsnap.tree.empty": "Noch keine Ordner oder Ausschnitte. Über „+\" anlegen.",
"viewsnap.footer.scale": "Massstab",
"viewsnap.footer.layerCombo": "Ebenenkombi",
"viewsnap.footer.drawingCombo": "Zeichnungskombi",
"viewsnap.footer.overrides": "Overrides",
"viewsnap.footer.none": "—",
// Layout-Blätter mit Masterlayout (DOSSIER A3).
"layouts.panelTitle": "Mappe",
"layouts.title": "Layouts",
"layouts.new": "Anlegen",
"layouts.namePlaceholder": "Blattname …",
"layouts.defaultName": "Neues Layout",
"layouts.rename": "Umbenennen",
"layouts.delete": "Löschen",
"layouts.renamePrompt": "Umbenennen:",
"layouts.deleteConfirm": "„{name}\" löschen?",
"layouts.openHint": "Layout „{name}\" öffnen",
"layouts.empty": "Noch keine Layouts. Blatt anlegen und öffnen.",
"layouts.paper": "Papierformat",
"layouts.orientation": "Ausrichtung",
"layouts.portrait": "Hoch",
"layouts.landscape": "Quer",
"layouts.border": "Rahmen",
"layouts.masters": "Masterlayouts",
"layouts.newMaster": "+ Master",
"layouts.newMasterPrompt": "Neues Masterlayout:",
"layouts.defaultMasterName": "Master",
"layouts.noMasters": "Noch keine Masterlayouts.",
"layouts.master": "Master",
"layouts.noMaster": "Kein Master",
"layouts.tb.projectName": "Projekt",
"layouts.tb.sheetName": "Blattname",
"layouts.tb.scale": "Massstab",
"layouts.tb.date": "Datum",
"layouts.tb.author": "Bearbeiter",
"layouts.tb.autoPlaceholder": "(automatisch)",
// Editor
"layouts.editorTitle": "Layout-Editor",
"layouts.fit": "Einpassen",
"layouts.addViewport": "Viewport hinzufügen",
"layouts.pickSnapshot": "Ausschnitt wählen …",
"layouts.noSnapshots": "Keine Ausschnitte vorhanden. Zuerst einen Ausschnitt speichern.",
"layouts.viewportProps": "Viewport-Eigenschaften",
"layouts.noViewports": "Noch keine Viewports. Ausschnitt wählen und hinzufügen.",
"layouts.selectViewport": "Viewport auf dem Blatt anklicken.",
"layouts.missingSnapshot": "Ausschnitt fehlt",
"layouts.xMm": "X (mm)",
"layouts.yMm": "Y (mm)",
"layouts.widthMm": "Breite (mm)",
"layouts.heightMm": "Höhe (mm)",
"layouts.scale": "Massstab",
"layouts.scaleReset": "Massstab vom Ausschnitt",
"layouts.removeViewport": "Viewport entfernen",
"layouts.backToModel": "Zurück zum Modell",
"layouts.placeViewport": "Viewport aufziehen",
"layouts.placeHint": "Rechteck auf dem Blatt aufziehen, dann Ausschnitt binden.",
"layouts.bindSnapshot": "Ausschnitt binden",
"layouts.emptyViewports":
"Noch keine Viewports. „Viewport aufziehen\" wählen und ein Rechteck auf dem Blatt ziehen.",
// Annotationen (Linie/Rechteck/Text) direkt auf dem Blatt
"layouts.annotLine": "Linie zeichnen",
"layouts.annotRect": "Rechteck zeichnen",
"layouts.annotText": "Text setzen",
"layouts.annotTextTitle": "Text",
"layouts.annotTextLabel": "Textinhalt:",
"layouts.annotEditText": "Text ändern",
"layouts.annotColor": "Farbe",
"layouts.annotWeight": "Strichstärke (mm)",
"layouts.annotRemove": "Annotation entfernen",
"layouts.annot.line": "Linie",
"layouts.annot.rect": "Rechteck",
"layouts.annot.text": "Text",
// Baum / „+"-Menü / Ordner
"layouts.add": "Neu …",
"layouts.addFolder": "Ordner erstellen",
"layouts.addLayout": "Layout erstellen",
"layouts.addMaster": "Masterlayout erstellen",
"layouts.add.folder": "Ordner erstellen",
"layouts.add.layout": "Layout erstellen",
"layouts.add.master": "Masterlayout erstellen",
"layouts.folder.defaultName": "Neuer Ordner",
"layouts.folder.rename": "Ordner umbenennen",
"layouts.folder.delete": "Ordner löschen",
"layouts.folder.export": "Ordner als PDF exportieren",
"layouts.folder.empty": "Leerer Ordner",
"layouts.folder.exportEmpty": "Ordner enthält keine Layouts.",
"layouts.tree.empty": "Noch keine Ordner oder Layouts. Über „+\" anlegen.",
// Dialog „Neues Layout"
"layouts.newLayout.title": "Neues Layout",
"layouts.newLayout.source": "Vorlage",
"layouts.newLayout.fromMaster": "Masterlayout als Vorlage",
"layouts.newLayout.freeSize": "Freie Grösse",
"layouts.newLayout.pickMaster": "Masterlayout wählen …",
"layouts.newLayout.noMasters": "Keine Masterlayouts vorhanden.",
// Dialog „Neues Masterlayout"
"layouts.newMaster.title": "Neues Masterlayout",
// Gemeinsame Grössen-Auswahl (beide Dialoge)
"layouts.size.format": "Format",
"layouts.size.custom": "Freie Grösse",
"layouts.size.a4": "A4",
"layouts.size.a3": "A3",
"layouts.paperGroup.a": "A-Reihe",
"layouts.paperGroup.b": "B-Reihe",
"layouts.size.widthMm": "Breite (mm)",
"layouts.size.heightMm": "Höhe (mm)",
"layouts.size.create": "Erstellen",
} as const;
export type TranslationKey = keyof typeof de;
+362 -5
View File
@@ -16,14 +16,26 @@ export const en: Record<TranslationKey, string> = {
"view3d.group": "3D view",
"view3d.front": "Front",
"view3d.front.hint": "Front view (frontal)",
"view3d.back": "Back",
"view3d.back.hint": "Back view (rear)",
"view3d.top": "Top",
"view3d.top.hint": "Top view (straight down)",
"view3d.side": "Side",
"view3d.side.hint": "Side view (90° to front)",
"view3d.side": "Right",
"view3d.side.hint": "Right side view (90° to the front)",
"view3d.left": "Left",
"view3d.left.hint": "Left side view (90° to the front, opposite Right)",
"view3d.perspective": "Perspective",
"view3d.perspective.hint": "Free perspective (3/4 view)",
"view3d.iso": "Isometric",
"view3d.iso.hint": "Isometric view (equiangular from front-top-right)",
"view3d.isoFrontLeft": "Front Left",
"view3d.isoFrontLeft.hint": "Isometric view (equiangular from front-top-left)",
"view3d.isoBackRight": "Back Right",
"view3d.isoBackRight.hint": "Isometric view (equiangular from back-top-right)",
"view3d.isoBackLeft": "Back Left",
"view3d.isoBackLeft.hint": "Isometric view (equiangular from back-top-left)",
"view3d.iso.menu": "More isometric views",
"view3d.iso.menu.hint": "Pick one of the four upper isometric octants",
"view3d.camera": "Camera",
"view3d.camera.hint": "Camera settings (field of view)",
"view3d.fov": "Field of view",
@@ -85,12 +97,12 @@ export const en: Record<TranslationKey, string> = {
"topbar.resources.hint": "Show/hide the resources window",
// Layout menu.
"layout.title": "Layout",
"layout.placeholder": "Layout …",
"layout.title": "Workspace",
"layout.placeholder": "Workspace …",
"layout.saveCurrent": "+ Save current …",
"layout.loadGroup": "Load",
"layout.deleteGroup": "Delete",
"layout.savePrompt": "Save layout as:",
"layout.savePrompt": "Save workspace as:",
// Visibility combinations (topbar).
"combo.layers": "Layer comb.",
@@ -119,6 +131,10 @@ export const en: Record<TranslationKey, string> = {
"tool.circle.hint": "Circle: set center, then radius",
"tool.arc": "Arc",
"tool.arc.hint": "Arc: center, start point, then end point (CCW)",
"tool.text": "Text",
"tool.text.hint": "Text: set anchor point, then type the text",
"tool.textbox": "Text column",
"tool.textbox.hint": "Text column: anchor, drag column width, then type the text",
// Ribbon top bar (tabs + groups)
"ribbon.tab.2d": "2D",
"ribbon.tab.3d": "3D",
@@ -233,6 +249,7 @@ export const en: Record<TranslationKey, string> = {
"attr.fill": "Fill",
"attr.fillColor": "Fill color",
"attr.clearFill": "Remove fill color",
"attr.pickColor": "Choose color",
"attr.foreground": "Foreground",
"attr.background": "Background",
"attr.bySystem": "By system",
@@ -265,12 +282,29 @@ export const en: Record<TranslationKey, string> = {
"objinfo.kind.opening": "Opening",
"objinfo.kind.stair": "Stair",
"objinfo.kind.room": "Room",
"objinfo.kind.extrudedSolid": "Extrusion",
"objinfo.kind.column": "Column",
// ── Column attributes (object info panel) ────────────────────────────────
"objinfo.column.section": "Column",
"objinfo.column.profile": "Profile",
"objinfo.column.profile.rect": "Rectangle",
"objinfo.column.profile.round": "Round",
"objinfo.column.width": "Width",
"objinfo.column.depth": "Depth",
"objinfo.column.radius": "Radius",
"objinfo.column.height": "Height",
"objinfo.column.rotation": "Rotation (°)",
"objinfo.column.floor": "Floor",
// ── Wall attributes (object info panel) ──────────────────────────────────
"objinfo.wall.section": "Wall",
"objinfo.wall.refLine": "Reference line",
"objinfo.wall.refLine.left": "Exterior (left)",
"objinfo.wall.refLine.center": "Center",
"objinfo.wall.refLine.right": "Interior (right)",
"objinfo.wall.sliceTermination": "End at ceiling",
"objinfo.wall.sliceTermination.both": "Off",
"objinfo.wall.sliceTermination.below": "Below",
"objinfo.wall.sliceTermination.above": "Above",
"objinfo.wall.buildup": "Build-up",
"objinfo.wall.single": "Solid",
"objinfo.wall.multi": "Multi layer",
@@ -283,6 +317,11 @@ export const en: Record<TranslationKey, string> = {
"objinfo.wall.top": "Top (OK)",
"objinfo.wall.anchorFloor": "Bound",
"objinfo.wall.anchorCustom": "Custom",
"objinfo.anchor.refFloor": "Reference storey",
"objinfo.anchor.customHeight": "Custom height",
"objinfo.wall.length": "Length",
"objinfo.wall.volumeGross": "Gross",
"objinfo.volume": "Volume",
"objinfo.wall.height": "Height",
"objinfo.wall.floorAboveNone": "No floor above",
// ── Ceiling attributes (object info panel) ───────────────────────────────
@@ -299,6 +338,9 @@ export const en: Record<TranslationKey, string> = {
"objinfo.ceiling.anchorCustom": "Custom",
// ── Opening attributes (object info panel) ──────────────────────────────
"objinfo.opening.section": "Opening",
"objinfo.opening.type": "Type",
"objinfo.stair.type": "Type",
"objinfo.type.none": "(no type)",
"objinfo.opening.kind": "Type",
"objinfo.opening.kind.window": "Window",
"objinfo.opening.kind.door": "Door",
@@ -356,6 +398,15 @@ export const en: Record<TranslationKey, string> = {
"objinfo.room.perimeter": "Perimeter",
"objinfo.room.refFloor": "Reference floor",
"objinfo.room.editStamp": "Edit stamp …",
// ── Extruded solid attributes (truck integration, object info panel) ────
"objinfo.extrudedSolid.section": "Extrusion",
"objinfo.extrudedSolid.height": "Height",
"objinfo.extrudedSolid.taper": "Taper",
"objinfo.extrudedSolid.area": "Footprint area",
"objinfo.extrudedSolid.floor": "Floor",
"objinfo.rotate": "Rotate",
"objinfo.drawing.length": "Length",
"objinfo.drawing.radius": "Radius",
"levels.addFloor": "+ Floor",
"levels.addSection": "+ Section",
"levels.addElevation": "+ Elevation",
@@ -484,6 +535,9 @@ export const en: Record<TranslationKey, string> = {
"default.ceilingTypeSingle": "Ceiling {thickness} m",
"default.wallTypeName": "New wall type",
"default.ceilingTypeName": "New ceiling type",
"default.doorTypeName": "New door type",
"default.windowTypeName": "New window type",
"default.stairTypeName": "New stair type",
// Alerts.
"alert.layerInUse": "Layer “{code} {name}” is used by components and cannot be deleted.",
@@ -492,6 +546,9 @@ export const en: Record<TranslationKey, string> = {
"alert.lineStyleInUse": "Line style “{name}” is used by a hatch and cannot be deleted.",
"alert.wallTypeInUse": "Wall type “{name}” is used by a wall and cannot be deleted.",
"alert.ceilingTypeInUse": "Ceiling type “{name}” is used by a ceiling and cannot be deleted.",
"alert.doorTypeInUse": "Door type “{name}” is used by a door and cannot be deleted.",
"alert.windowTypeInUse": "Window type “{name}” is used by a window and cannot be deleted.",
"alert.stairTypeInUse": "Stair type “{name}” is used by a stair and cannot be deleted.",
// Resource manager.
"resources.title": "Resources",
@@ -502,7 +559,38 @@ export const en: Record<TranslationKey, string> = {
"resources.tab.lines": "Lines",
"resources.tab.wallStyles": "Wall styles",
"resources.tab.ceilingStyles": "Ceiling styles",
"resources.tab.doorStyles": "Door types",
"resources.tab.windowStyles": "Window types",
"resources.tab.stairStyles": "Stair types",
"resources.tab.materials": "Materials",
"resources.tab.overrides": "Overrides",
// Graphic overrides (rule engine).
"resources.overrides.hint":
"Rules override color/lineweight/line style at render time (element data stays untouched). Order = priority: per field, the topmost active rule wins.",
"resources.overrides.empty": "No override rules yet.",
"resources.overrides.placeholder": "Rule",
"resources.overrides.defaultName": "New rule",
"resources.overrides.delete": "Delete rule",
"resources.overrides.moveUp": "Move rule up (higher priority)",
"resources.overrides.moveDown": "Move rule down (lower priority)",
"resources.overrides.enabled": "Rule active",
"resources.overrides.condition": "Condition",
"resources.overrides.condType": "Criterion",
"resources.overrides.condType.layer": "Layer (name/code)",
"resources.overrides.condType.object": "Object name",
"resources.overrides.operator": "Operator",
"resources.overrides.op.equals": "equals",
"resources.overrides.op.contains": "contains",
"resources.overrides.op.startsWith": "starts with",
"resources.overrides.op.notEquals": "not equal to",
"resources.overrides.value": "Value",
"resources.overrides.value.placeholder": "e.g. Walls or 20",
"resources.overrides.actions": "Actions",
"resources.overrides.action.color": "Color",
"resources.overrides.action.lineweight": "Lineweight (mm)",
"resources.overrides.action.linetype": "Line style",
"resources.overrides.linetype.none": "— (unchanged)",
"resources.wallStyles.hint":
"Per wall type, the layer joints (between adjacent layers) as a selectable line style. Unassigned: 0.02 mm hairline.",
@@ -512,6 +600,75 @@ export const en: Record<TranslationKey, string> = {
"resources.ceilingStyles.empty": "No ceiling types yet.",
"resources.wallStyles.placeholder": "Wall type",
"resources.ceilingStyles.placeholder": "Ceiling type",
// Component types (door/window/stair) — form-based libraries.
"resources.doorTypes.hint":
"Reusable door types with construction, leaf style and default dimensions for newly placed doors.",
"resources.doorTypes.empty": "No door types yet.",
"resources.doorTypes.placeholder": "Door type",
"resources.windowTypes.hint":
"Reusable window types with opening style, glazing and default dimensions for newly placed windows.",
"resources.windowTypes.empty": "No window types yet.",
"resources.windowTypes.placeholder": "Window type",
"resources.stairTypes.hint":
"Reusable stair types with structure, tread style and railing for newly placed stairs.",
"resources.stairTypes.empty": "No stair types yet.",
"resources.stairTypes.placeholder": "Stair type",
"resources.delete.doorType": "Delete door type “{name}”",
"resources.delete.windowType": "Delete window type “{name}”",
"resources.delete.stairType": "Delete stair type “{name}”",
"resources.field.doorKind": "Construction",
"resources.field.leafCount": "Leaf count",
"resources.field.leafStyle": "Leaf style",
"resources.field.glazingRatio": "Glazing ratio",
"resources.field.frameThickness": "Frame thickness (m)",
"resources.field.frameDepth": "Frame depth (m)",
"resources.field.defaultWidth": "Clear width (m)",
"resources.field.defaultHeight": "Clear height (m)",
"resources.field.threshold": "Threshold",
"resources.field.windowKind": "Opening style",
"resources.field.wingCount": "Wing count",
"resources.field.glazing": "Glazing",
"resources.field.defaultSillHeight": "Sill height (m)",
"resources.field.sillBoard": "Sill board",
"resources.field.structure": "Structure",
"resources.field.closedRisers": "Closed risers",
"resources.field.treadThickness": "Tread thickness (m)",
"resources.field.nosing": "Nosing (m)",
"resources.field.railing": "Railing",
"resources.field.stairWidth": "Run width (m)",
"resources.doorKind.dreh": "Hinged",
"resources.doorKind.schiebe": "Sliding",
"resources.doorKind.wandoeffnung": "Wall opening",
"resources.leafCount.1": "Single-leaf",
"resources.leafCount.2": "Double-leaf",
"resources.leafStyle.glatt": "Flush",
"resources.leafStyle.kassette": "Panelled",
"resources.leafStyle.glas": "Glazed",
"resources.windowKind.dreh": "Turn",
"resources.windowKind.kipp": "Tilt",
"resources.windowKind.drehkipp": "Turn-tilt",
"resources.windowKind.fest": "Fixed",
"resources.windowKind.schiebe": "Sliding",
"resources.glazing.einfach": "Single",
"resources.glazing.zweifach": "Double",
"resources.glazing.dreifach": "Triple",
"resources.sillBoard.keine": "None",
"resources.sillBoard.innen": "Inside",
"resources.sillBoard.aussen": "Outside",
"resources.sillBoard.beide": "Both",
"resources.structure.massiv": "Solid",
"resources.structure.beton": "Concrete (waist slab)",
"resources.structure.wange": "String",
"resources.structure.aufgesattelt": "Saddled",
"resources.structure.spindel": "Spiral",
"resources.railing.keine": "None",
"resources.railing.links": "Left",
"resources.railing.rechts": "Right",
"resources.railing.beide": "Both",
"resources.col.layer": "Layer",
"resources.col.component": "Component",
"resources.col.thickness": "Thickness (mm)",
@@ -688,6 +845,9 @@ export const en: Record<TranslationKey, string> = {
"cmd.opening.dir": "Direction",
"cmd.opening.sillField": "Sill",
"cmd.opening.swingField": "Angle",
"cmd.column.label": "Column",
"cmd.column.place": "Place column:",
"cmd.column.profile": "Profile",
"cmd.stair.label": "Stair",
"cmd.stair.start": "Start point of the stair:",
"cmd.stair.run": "Run direction / end ( Shape · Up/Down ):",
@@ -722,10 +882,22 @@ export const en: Record<TranslationKey, string> = {
"cmd.arc.center": "Center:",
"cmd.arc.start": "Start point (radius + start angle):",
"cmd.arc.end": "End point (end angle):",
"cmd.text.label": "Text",
"cmd.text.point": "Anchor point:",
"cmd.text.enter": "Enter text:",
"cmd.textbox.label": "Text column",
"cmd.textbox.point": "Anchor point:",
"cmd.textbox.width": "Column width (second point):",
"cmd.textbox.enter": "Enter text:",
"cmd.move.label": "Move",
"cmd.move.base": "Base point:",
"cmd.move.target": "Target point:",
"cmd.move.empty": "Nothing selected (select objects first).",
"cmd.rotate.label": "Rotate",
"cmd.measure.label": "Measure",
"cmd.measure.start": "Measure from:",
"cmd.measure.to": "to (distance · angle):",
"transform.needSelection": "Select objects first, then rotate.",
"cmd.mirror.label": "Mirror",
"cmd.mirror.first": "First point of mirror axis:",
"cmd.mirror.second": "Second point of mirror axis:",
@@ -738,6 +910,10 @@ export const en: Record<TranslationKey, string> = {
"cmd.offset.label": "Offset",
"cmd.offset.pick": "Select curve:",
"cmd.offset.side": "Side or distance:",
"cmd.extrude.label": "Extrude",
"cmd.extrude.pick": "Select closed profile:",
"cmd.extrude.height": "Height:",
"cmd.extrude.taper": "Taper (0–1, 1=point):",
// Trim (quick-trim): click the part to cut away; repeats until Esc.
"cmd.trim.label": "Trim",
"cmd.trim.pick": "Click the part to trim away (Esc to finish):",
@@ -852,11 +1028,42 @@ export const en: Record<TranslationKey, string> = {
"file.exportPdf": "Export as PDF…",
"file.exportDxf": "Export as DXF…",
"file.exportSchedule": "Component schedule (CSV)…",
"file.exportIfc": "Export IFC",
"file.exportObj": "Export OBJ (3D mesh)",
"file.exportStl": "Export STL (3D mesh)",
"file.export": "Export",
"file.openFailed": "Could not read the project file.",
// Lock conflict (project file already open in another instance).
"lock.title": "Project already open",
"lock.message": "This project file is already open in another instance.",
"lock.messageInfo": "Opened on {host} (process {pid}).",
"lock.openReadOnly": "Open read-only",
"lock.forceOpen": "Force open anyway",
"lock.forceOpenWarning":
"Warning: opens for writing even though another instance holds the file — changes may overwrite each other.",
"exportSave.title": "Export",
"exportSave.format": "Format",
"exportSave.filename": "File name",
"exportSave.locationNote": "Saved to the default downloads folder.",
"exportSave.fmt.csv": "Component schedule (CSV)",
"exportSave.fmt.ifc": "IFC (BIM)",
"exportSave.fmt.obj": "OBJ (3D mesh)",
"exportSave.fmt.stl": "STL (3D mesh)",
"about.title": "About dossier",
"about.version": "Version",
"about.desc": "Open-source CAAD (Computer Aided Architecture Design) — beautiful, standard-compliant drawings from a semantic building model. Available as a desktop app (full version) and in the browser.",
"about.copyright": "© 2026 Karim Gabriele Varano",
"about.license": "License: AGPL-3.0-or-later",
"about.suite": "Part of the openbureau suite",
"about.licenses": "Open-source licenses (third-party)",
"about.close": "Close",
// Settings dialog.
"topbar.settings": "Settings",
"topbar.settings.hint": "Open settings (display colors, project)",
"settings.title": "Settings",
"settings.section.workspace": "Workspace",
"settings.section.display": "Display",
"settings.marqueeColor": "Selection box color",
"settings.marqueeColor.hint":
@@ -896,6 +1103,9 @@ export const en: Record<TranslationKey, string> = {
"ctxImport.src.osmRoads": "OSM roads",
"ctxImport.src.osmWater": "OSM water",
"ctxImport.src.osmGreen": "OSM greenery",
"ctxImport.src.osmParking": "OSM parking",
"ctxImport.src.osmRailway": "OSM railway",
"ctxImport.src.osmForest": "OSM forest",
"ctxImport.cancel": "Cancel",
"ctxImport.confirm": "Import",
"ctxImport.importing": "Importing…",
@@ -940,6 +1150,9 @@ export const en: Record<TranslationKey, string> = {
"roomStamp.showFloorArea": "Show floor area",
"roomStamp.floorAreaPrefix": "Floor area prefix",
"roomStamp.showUsage": "Show usage",
"roomStamp.roundingStep": "Area rounding",
"roomStamp.roundingStepDefault": "Default (2 decimal places)",
"roomStamp.occupancy": "Occupancy",
"text.selectedHint": "Formatting applies to the selected text",
"rt.bold": "Bold",
@@ -947,6 +1160,8 @@ export const en: Record<TranslationKey, string> = {
"rt.underline": "Underline",
"rt.strike": "Strikethrough",
"rt.strikethrough": "Strikethrough",
"rt.super": "Superscript",
"rt.sub": "Subscript",
"rt.fontSize": "Font size",
"rt.color": "Color",
"rt.preset": "Preset",
@@ -958,4 +1173,146 @@ export const en: Record<TranslationKey, string> = {
"WebGPU could not be initialized. Switch to WebGL2 in the status bar to keep using the 3D view.",
"viewport3d.grid.show": "Show ground grid",
"viewport3d.grid.hide": "Hide ground grid",
"viewport3d.section.label": "Section plane",
"viewport3d.section.show": "Section plane on",
"viewport3d.section.hide": "Section plane off",
"viewport3d.grip.vertex": "Drag wall endpoint",
"viewport3d.grip.height": "Drag height",
"viewport3d.grip.move": "Move",
// ── Element tree (Elements panel, ROADMAP §11) ──────────────────────────────
"elements.title": "Elements",
"elements.search": "Search elements…",
"elements.empty": "No components in the project.",
"elements.noMatch": "No matches.",
"elements.kind.wall": "Wall",
"elements.kind.ceiling": "Ceiling",
"elements.kind.window": "Window",
"elements.kind.opening": "Opening",
"elements.kind.stair": "Stair",
"elements.kind.extrusion": "Extrusion",
// Views / view snapshots (DOSSIER A2).
"viewsnap.title": "Views",
"viewsnap.saveCurrent": "+ Save current view …",
"viewsnap.savePrompt": "Save view as:",
"viewsnap.renamePrompt": "Rename view:",
"viewsnap.rename": "Rename",
"viewsnap.delete": "Delete",
"viewsnap.deleteConfirm": "Delete view “{name}”?",
"viewsnap.empty": "No views yet. Set up a view and save it.",
"viewsnap.applyHint": "Restore view “{name}”",
"viewsnap.add.folder": "Create folder",
"viewsnap.add.snapshot": "Save view",
"viewsnap.folder.defaultName": "New folder",
"viewsnap.folder.rename": "Rename folder",
"viewsnap.folder.delete": "Delete folder",
"viewsnap.folder.empty": "Empty folder",
"viewsnap.tree.empty": "No folders or views yet. Add via “+”.",
"viewsnap.footer.scale": "Scale",
"viewsnap.footer.layerCombo": "Layer combo",
"viewsnap.footer.drawingCombo": "Drawing combo",
"viewsnap.footer.overrides": "Overrides",
"viewsnap.footer.none": "—",
// Layout sheets with master layout (DOSSIER A3).
"layouts.panelTitle": "Portfolio",
"layouts.title": "Layouts",
"layouts.new": "Create",
"layouts.namePlaceholder": "Sheet name …",
"layouts.defaultName": "New layout",
"layouts.rename": "Rename",
"layouts.delete": "Delete",
"layouts.renamePrompt": "Rename:",
"layouts.deleteConfirm": "Delete “{name}”?",
"layouts.openHint": "Open layout “{name}”",
"layouts.empty": "No layouts yet. Create a sheet and open it.",
"layouts.paper": "Paper size",
"layouts.orientation": "Orientation",
"layouts.portrait": "Portrait",
"layouts.landscape": "Landscape",
"layouts.border": "Border",
"layouts.masters": "Master layouts",
"layouts.newMaster": "+ Master",
"layouts.newMasterPrompt": "New master layout:",
"layouts.defaultMasterName": "Master",
"layouts.noMasters": "No master layouts yet.",
"layouts.master": "Master",
"layouts.noMaster": "No master",
"layouts.tb.projectName": "Project",
"layouts.tb.sheetName": "Sheet name",
"layouts.tb.scale": "Scale",
"layouts.tb.date": "Date",
"layouts.tb.author": "Author",
"layouts.tb.autoPlaceholder": "(automatic)",
// Editor
"layouts.editorTitle": "Layout editor",
"layouts.fit": "Fit",
"layouts.addViewport": "Add viewport",
"layouts.pickSnapshot": "Pick a view …",
"layouts.noSnapshots": "No views available. Save a view first.",
"layouts.viewportProps": "Viewport properties",
"layouts.noViewports": "No viewports yet. Pick a view and add it.",
"layouts.selectViewport": "Click a viewport on the sheet.",
"layouts.missingSnapshot": "View missing",
"layouts.xMm": "X (mm)",
"layouts.yMm": "Y (mm)",
"layouts.widthMm": "Width (mm)",
"layouts.heightMm": "Height (mm)",
"layouts.scale": "Scale",
"layouts.scaleReset": "Scale from view",
"layouts.removeViewport": "Remove viewport",
"layouts.backToModel": "Back to model",
"layouts.placeViewport": "Draw viewport",
"layouts.placeHint": "Drag a rectangle on the sheet, then bind a snapshot.",
"layouts.bindSnapshot": "Bind snapshot",
"layouts.emptyViewports":
"No viewports yet. Choose “Draw viewport” and drag a rectangle on the sheet.",
// Annotations (line/rect/text) drawn directly on the sheet
"layouts.annotLine": "Draw line",
"layouts.annotRect": "Draw rectangle",
"layouts.annotText": "Place text",
"layouts.annotTextTitle": "Text",
"layouts.annotTextLabel": "Text content:",
"layouts.annotEditText": "Edit text",
"layouts.annotColor": "Color",
"layouts.annotWeight": "Line weight (mm)",
"layouts.annotRemove": "Remove annotation",
"layouts.annot.line": "Line",
"layouts.annot.rect": "Rectangle",
"layouts.annot.text": "Text",
// Tree / “+” menu / folders
"layouts.add": "New …",
"layouts.addFolder": "Create folder",
"layouts.addLayout": "Create layout",
"layouts.addMaster": "Create master layout",
"layouts.add.folder": "Create folder",
"layouts.add.layout": "Create layout",
"layouts.add.master": "Create master layout",
"layouts.folder.defaultName": "New folder",
"layouts.folder.rename": "Rename folder",
"layouts.folder.delete": "Delete folder",
"layouts.folder.export": "Export folder as PDF",
"layouts.folder.empty": "Empty folder",
"layouts.folder.exportEmpty": "Folder contains no layouts.",
"layouts.tree.empty": "No folders or layouts yet. Add one via “+”.",
// “New layout” dialog
"layouts.newLayout.title": "New layout",
"layouts.newLayout.source": "Template",
"layouts.newLayout.fromMaster": "Master layout as template",
"layouts.newLayout.freeSize": "Free size",
"layouts.newLayout.pickMaster": "Pick a master layout …",
"layouts.newLayout.noMasters": "No master layouts available.",
// “New master layout” dialog
"layouts.newMaster.title": "New master layout",
// Shared size picker (both dialogs)
"layouts.size.format": "Format",
"layouts.size.custom": "Free size",
"layouts.size.a4": "A4",
"layouts.size.a3": "A3",
"layouts.paperGroup.a": "A series",
"layouts.paperGroup.b": "B series",
"layouts.size.widthMm": "Width (mm)",
"layouts.size.heightMm": "Height (mm)",
"layouts.size.create": "Create",
};