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:
+362
-5
@@ -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",
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user