Browser-BIM (cad): semantisches Modell, abgeleitete 2D/3D-Sichten, Zeichenwerkzeuge

Standalone-Browser-Port von DOSSIER. Enthaelt das semantische Modell mit
Plan-/3D-Ableitung, Zeichen- und Editierwerkzeuge, Rhino-artiges Befehlssystem,
dockbares Panel-System, Resource-Manager, DXF/.lin/.pat-Import, i18n (de/en)
sowie Projektdokumentation und Probe-Harness.
This commit is contained in:
2026-06-30 20:52:27 +02:00
commit ca859c4aa4
157 changed files with 37921 additions and 0 deletions
+490
View File
@@ -0,0 +1,490 @@
// English dictionary — proves translatability. Same keys as de.ts; only the
// values differ. Identifiers/keys stay English (DOSSIER namespacing); values are
// the translated, user-visible text.
import type { TranslationKey } from "./de";
export const en: Record<TranslationKey, string> = {
// Brand / Topbar.
"brand.tag": "Document model",
"topbar.viewGroup": "View",
"topbar.grundriss": "Plan",
"topbar.perspektive": "Perspective",
"view3d.group": "3D view",
"view3d.front": "Front",
"view3d.front.hint": "Front view (frontal)",
"view3d.top": "Top",
"view3d.top.hint": "Top view (straight down)",
"view3d.side": "Side",
"view3d.side.hint": "Side view (90° to front)",
"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.camera": "Camera",
"view3d.camera.hint": "Camera settings (field of view)",
"view3d.fov": "Field of view",
"view3d.fov.hint": "Field of view (FOV) of the perspective camera in degrees",
"topbar.detailGroup": "Detail level",
"topbar.detail": "Detail level",
"topbar.detail.hint": "Detail level of the plan (symbols, hatches, lines)",
"topbar.detail.hintDisabled": "Detail level applies in the plan (not yet in perspective)",
"topbar.detail.grob": "coarse",
"topbar.detail.mittel": "medium",
"topbar.detail.fein": "fine",
"topbar.scaleGroup": "Scale and zoom",
"topbar.scale": "Scale",
"topbar.scale.apply": "Apply paper scale 1:N",
"topbar.scale.custom": "custom …",
"topbar.scale.live": "Current paper scale (live)",
"topbar.scale.prompt": "Enter scale (e.g. 1:35 or 35):",
"topbar.zoom100": "100%",
"topbar.zoom100.hint": "Zoom exactly to the chosen scale 1:{n}",
"topbar.fit": "Fit",
"topbar.fit.hint": "Fit to plan",
"topbar.fitSelection": "Selection",
"topbar.fitSelection.hint": "Fit to selection (otherwise to plan)",
"topbar.zoom.current": "Current zoom",
"topbar.renderGroup": "Render mode",
"topbar.render.shaded": "Shaded",
"topbar.render.shaded.hint": "Shaded",
"topbar.render.wireframe": "Wire",
"topbar.render.wireframe.hint": "Wireframe",
"topbar.render.hidden": "Edges",
"topbar.render.hidden.hint": "Hidden line",
"topbar.render.hintDisabled": "Render mode applies in perspective",
// Display style (context-dependent dropdown): plan = Color/Mono,
// perspective = Shaded/White/Wireframe/Hidden.
"display.style": "Display",
"display.style.group": "Display style",
"display.style.hint": "Display style of the active view",
"display.style.color": "Color",
"display.style.mono": "Black & white",
"display.style.shaded": "Shaded",
"display.style.white": "White",
"display.style.wireframe": "Wireframe",
"display.style.hidden": "Hidden line",
"topbar.referenceLinesGroup": "Reference lines",
"topbar.referenceLines": "Reference lines",
"topbar.referenceLines.hint": "Show/hide reference lines (wall axes)",
"topbar.referenceLines.hintDisabled": "Reference lines apply in the plan",
"topbar.resources": "Resources",
"topbar.resources.hint": "Show/hide the resources window",
// Layout menu.
"layout.title": "Layout",
"layout.placeholder": "Layout …",
"layout.saveCurrent": " Save current …",
"layout.loadGroup": "Load",
"layout.deleteGroup": "Delete",
"layout.savePrompt": "Save layout as:",
// Visibility combinations (topbar).
"combo.layers": "Layer comb.",
"combo.drawings": "Drawing comb.",
"combo.placeholder": "Combination …",
"combo.saveCurrent": " Save current …",
"combo.loadGroup": "Load",
"combo.deleteGroup": "Delete",
"combo.layers.title": "Layer combinations",
"combo.drawings.title": "Drawing combinations",
"combo.layers.savePrompt": "Save layer combination as:",
"combo.drawings.savePrompt": "Save drawing combination as:",
// Drawing tools (topbar toolbar + status hints).
"tool.group": "Tools",
"tool.select": "Select",
"tool.wall": "Wall",
"tool.line": "Line",
"tool.polyline": "Polyline",
"tool.rect": "Rectangle",
"tool.select.hint": "Select — click/drag elements",
"tool.wall.firstPoint": "Wall: set first axis point",
"tool.wall.nextPoint": "Wall: next point — double/right-click to finish",
"tool.line.firstPoint": "Line: set start point",
"tool.line.secondPoint": "Line: set end point",
"tool.polyline.firstPoint": "Polyline: set first point",
"tool.polyline.nextPoint": "Polyline: next point — click start to close, double-click to finish",
"tool.rect.firstCorner": "Rectangle: set first corner",
"tool.rect.secondCorner": "Rectangle: set opposite corner",
"tool.wallType": "Wall type",
"tool.layer": "Layer",
"tool.layer.hint": "Active layer — everything drawn goes onto this category",
"tool.floorOnlyDisabled": "Walls can only be drawn on a floor",
"tool.snap": "Snap",
"tool.snap.hint": "Snap to endpoints/grid; Shift = ortho, Ctrl = snap off",
"snap.enabled": "Snap on",
"snap.endpoint": "Endpoint",
"snap.midpoint": "Midpoint",
"snap.intersection": "Intersection",
"snap.onEdge": "On edge (perp.)",
"snap.grid": "Grid",
"snap.ortho": "Ortho (Shift)",
"snap.gridSize": "Grid size (m)",
"snap.angleStep": "Angle step",
// Transform (move/mirror/rotate) + mode bar.
"transform.bar": "Transform",
"transform.cancel": "Cancel (Esc)",
"transform.countPrompt": "Number of copies:",
"transform.move": "Move (M)",
"transform.mirror": "Mirror (S)",
"transform.rotate": "Rotate (D)",
"transform.mode.move": "Move",
"transform.mode.copy": "Copy",
"transform.mode.array": "N copies",
"transform.mode.distribute": "Distribute",
"transform.hint.move.0": "Click base point",
"transform.hint.move.1": "Click destination point",
"transform.hint.rotate.0": "Click rotation centre",
"transform.hint.rotate.1": "Click reference point (start angle)",
"transform.hint.rotate.2": "Click target angle",
"transform.hint.mirror.0": "First point of mirror axis",
"transform.hint.mirror.1": "Second point of mirror axis",
// Line display (Display/Print).
"topbar.lineModeGroup": "Line display",
"topbar.lineMode.display": "Display",
"topbar.lineMode.print": "Print",
"topbar.lineMode.display.hint": "Display: all lines as constant hairlines (calm editing)",
"topbar.lineMode.print.hint": "Print: real mm line weights (paper/print look)",
// Status bar.
"status.selection": "Selection",
"status.selectionN": "Selection: {n} {noun}",
"status.wall": "wall",
"status.walls": "walls",
"status.xy": "X/Y",
"status.unit": "Unit",
"status.scale": "Scale",
"status.zoom": "Zoom",
"status.floor": "Floor",
"status.layer": "Layer",
"status.none": "—",
// Navigator panels.
"nav.drawingLevels": "Drawing levels",
"nav.layers": "Layers",
"nav.tools": "Tools",
"nav.attributes": "Attributes",
"nav.objectInfo": "Object Info",
// Attribute-Palette (AttributesPanel)
"attr.title": "Attributes",
"attr.empty": "No selection",
"attr.stroke": "Pen",
"attr.color": "Color",
"attr.weight": "Line weight (mm)",
"attr.lineStyle": "Line style",
"attr.fill": "Fill",
"attr.fillColor": "Fill color",
"attr.clearFill": "Remove fill color",
"attr.hatch": "Hatch",
"attr.none": "none",
"attr.inheritedFromLayer": "Walls inherit line weight from the layer",
"attr.fillNeedsClosed": "Fill only for closed shapes",
"attr.size": "Size",
"attr.width": "Width",
"attr.height": "Height",
// Objekt-Info-Palette (ObjectInfoPanel)
"objinfo.title": "Object Info",
"objinfo.empty": "No object selected",
"objinfo.refpoint": "Reference point",
"objinfo.setRefpoint": "Set reference point",
"objinfo.x": "X",
"objinfo.y": "Y",
"objinfo.z": "Z",
"objinfo.zHint": "2D layer elements have no height",
"objinfo.dimensions": "Dimensions",
"objinfo.width": "Width",
"objinfo.height": "Height",
"objinfo.type": "Type",
"objinfo.kind.wall": "Wall",
"objinfo.kind.drawing2d": "2D object",
"objinfo.kind.door": "Door",
// ── 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.buildup": "Build-up",
"objinfo.wall.single": "Single layer",
"objinfo.wall.multi": "Multi layer",
"objinfo.wall.thickness": "Thickness",
"objinfo.wall.preset": "Wall style",
"objinfo.wall.presetLabel": "{name} · {thickness} m",
"objinfo.wall.refFloor": "Reference floor",
"objinfo.wall.linkAbove": "Bind to floor above",
"objinfo.wall.bottom": "Bottom (UK)",
"objinfo.wall.top": "Top (OK)",
"objinfo.wall.anchorFloor": "Bound to floor",
"objinfo.wall.anchorCustom": "Custom height",
"objinfo.wall.height": "Height",
"objinfo.wall.floorAboveNone": "No floor above",
"levels.addFloor": "+ Floor",
"levels.addDrawing": "+ Drawing",
"layers.addCategory": "+ Layer",
"nav.visibility": "Visibility",
"nav.hide": "Hide",
"nav.show": "Show",
"nav.categoryVisible": "{name} visible",
"nav.categorySelect": "Make {name} the active layer (drawing target)",
// Badges.
"badge.floor": "Floor",
"badge.section": "Section",
"badge.elevation": "Elevation",
"badge.drawing": "Drawing",
// Display mode select.
"display.title": "Display mode",
"display.all_force": "Show all",
"display.all": "Selected",
"display.active": "Active only",
"display.grey": "Others grey",
"display.grey_locked": "Others grey & locked",
// Dock.
"dock.resize": "Adjust width",
"dock.dock": "Dock",
"dock.close": "Close",
"dock.float": "Float",
"dock.redock": "Dock",
"dock.resizePanel": "Resize",
"dock.dropLeft": "Dock left",
"dock.dropRight": "Dock right",
// Context menu.
"ctx.layerSettings": "Layer settings…",
"ctx.addSubLayer": "Add sub-layer…",
"ctx.assignSelection": "Assign selection here",
"ctx.assignSelection.disabled": "No wall selected — first click a wall in the plan/3D.",
"ctx.duplicate": "Duplicate",
"ctx.copyProps": "Copy properties",
"ctx.pasteProps": "Paste properties",
"ctx.pasteProps.disabled": "Clipboard empty — first use “Copy properties”.",
"ctx.delete": "Delete",
"ctx.delete.lastLayer": "The last layer cannot be deleted.",
"ctx.delete.lastLevel": "The last drawing level cannot be deleted.",
"ctx.levelSettings": "Settings…",
"ctx.fitSelection": "Fit to selection",
"ctx.clearSelection": "Clear selection",
"ctx.fit": "Fit view",
"ctx.noWallHit": "No wall hit",
"ctx.noWallHit.hint": "Right-clicking a wall selects it and shows wall actions.",
"ctx.title.level": "Drawing level",
"ctx.title.wall": "Wall",
"ctx.title.view": "View",
// Inline editor.
"editor.close": "Close",
"editor.layerTitle": "Layer {code}",
"editor.name": "Name",
"editor.color": "Color",
"editor.lineWeight": "Line weight",
"editor.floorHeight": "Floor height",
"editor.cutHeight": "Cut height",
"editor.unit.mm": "mm",
"editor.unit.m": "m",
"editor.noHeightDrawing": "Drawings have no floor/cut height.",
"editor.noHeightSection": "Sections/elevations have no floor/cut height.",
// Main content.
"content.perspektiveTitle": "Perspective · {name}",
"content.grundrissTitle": "Plan · {name}",
"content.grundrissLegend": "Plan · {name} · Cut height {cutHeight}",
"content.drawingTitle": "Drawing · {name}",
"content.drawingCanvas": "Drawing canvas",
"content.drawingLegend": "Free 2D drawing",
"props.floorHeight": "Floor height",
"props.cutHeight": "Cut height",
"props.okff": "FFL",
"props.okffValue": "+{value} m",
// Stub.
"stub.section": "Section",
"stub.elevation": "Elevation",
"stub.note": "{kind} — derived projection follows in a later phase",
// Default names.
"default.floorName": "Floor {n}",
"default.drawingName": "Drawing {n}",
"default.categoryName": "New layer",
"default.subCategoryName": "New sub-layer",
"default.componentName": "New component",
"default.hatchName": "New hatch",
"default.lineStyleName": "New line style",
"default.hatchNone": "None",
"default.copySuffixLevel": "{name} copy",
"default.copySuffixLayer": "{name} COPY",
"default.wallTypeSingle": "Wall {thickness} m",
// Alerts.
"alert.layerInUse": "Layer “{code} {name}” is used by components and cannot be deleted.",
"alert.componentInUse": "Component “{name}” is used by a wall type and cannot be deleted.",
"alert.hatchInUse": "Hatch “{name}” is used by a component and cannot be deleted.",
"alert.lineStyleInUse": "Line style “{name}” is used by a hatch and cannot be deleted.",
// Resource manager.
"resources.title": "Resources",
"resources.label": "Resource manager",
"resources.close": "Close",
"resources.tab.components": "Components",
"resources.tab.hatches": "Hatches",
"resources.tab.lines": "Lines",
"resources.add": "New",
"resources.import.lin": "⤓ Import .lin",
"resources.import.pat": "⤓ Import .pat",
"resources.components.hint": "Higher priority runs through at the join (intersects first); lower butts against the side.",
"resources.components.empty": "No components yet.",
"resources.components.placeholder": "Component",
"resources.col.name": "Name",
"resources.col.color": "Color",
"resources.col.hatch": "Hatch",
"resources.col.prio": "Prio",
"resources.col.prio.hint": "Higher priority runs through at the join",
"resources.col.texture": "Texture",
"resources.delete.component": "Delete component “{name}”",
"resources.hatches.hint": "Pattern, scale and angle drive the section hatch; the line style sets the weight of the pattern lines.",
"resources.hatches.empty": "No hatches yet.",
"resources.hatches.placeholder": "Hatch",
"resources.col.pattern": "Pattern",
"resources.col.scale": "Scale",
"resources.col.angle": "Angle °",
"resources.col.lineStyle": "Line style",
"resources.lineStyle.none": "— none —",
"resources.delete.hatch": "Delete hatch “{name}”",
"pattern.none": "None",
"pattern.solid": "Solid",
"pattern.insulation": "Insulation",
"pattern.diagonal": "Diagonal",
"pattern.crosshatch": "Crosshatch",
"resources.lines.hint": "Line weight in millimetres (paper space). Stroke: solid, dashed or dotted.",
"resources.lines.empty": "No line styles yet.",
"resources.lines.placeholder": "Line style",
"resources.col.weight": "Weight (mm)",
"resources.col.stroke": "Stroke",
"resources.col.preview": "Preview",
"resources.delete.lineStyle": "Delete line style “{name}”",
"resources.texture.empty": "—",
"dash.solid": "Solid",
"dash.dashed": "Dashed",
"dash.dotted": "Dotted",
// Command line / commands (Rhino-style command system).
"cmd.aria": "Command line",
"cmd.idle.prompt": "Command:",
"cmd.idle.placeholder": "Type a command … (Tab)",
"cmd.line.label": "Line",
"cmd.line.start": "Start of line:",
"cmd.line.end": "End of line:",
"cmd.polyline.label": "Polyline",
"cmd.polyline.start": "Start point:",
"cmd.polyline.next": "Next point:",
"cmd.polyline.close": "Close",
"cmd.polyline.undo": "Undo",
"cmd.rect.label": "Rectangle",
"cmd.rect.first": "First corner:",
"cmd.rect.second": "Opposite corner:",
"cmd.circle.label": "Circle",
"cmd.circle.center": "Center:",
"cmd.circle.radius": "Radius:",
"cmd.move.label": "Move",
"cmd.move.base": "Base point:",
"cmd.move.target": "Target point:",
"cmd.move.empty": "Nothing selected (select objects first).",
"cmd.copy.label": "Copy",
"cmd.copy.base": "Base point:",
"cmd.copy.target": "Target point (Enter to finish):",
"cmd.copy.empty": "Nothing selected (select objects first).",
"cmd.offset.label": "Offset",
"cmd.offset.pick": "Select curve:",
"cmd.offset.side": "Side or distance:",
// Edit tools Split / Join / Delete segment (keyboard: Ctrl+S / Ctrl+J /
// Alt+Click). Labels for the command line / menus.
"edit.split.label": "Split",
"edit.join.label": "Join",
"edit.cutSegment.label": "Delete segment",
// Tab field cycle (precision input): ordered numeric fields per step.
"cmd.field.length": "Length",
"cmd.field.angle": "Angle",
"cmd.field.width": "Width",
"cmd.field.height": "Height",
"cmd.field.radius": "Radius",
"cmd.field.distance": "Distance",
// Commands: import / terrain.
"cmd.import.label": "Import",
"cmd.import.prompt": "Choose DXF file …",
"cmd.terrain.label": "Terrain",
"cmd.terrain.prompt": "Generate terrain from contours …",
// Site / context panel (SitePanel).
"nav.site": "Terrain",
"site.title": "Terrain & Context",
"site.import": "⤓ Import DXF",
"site.generateTerrain": "Generate terrain",
"site.contourSet": "Contour set",
"site.empty": "No context loaded. Import a DXF file (contour lines or mesh).",
"site.delete": "Remove",
"site.type.mesh": "Mesh",
"site.type.contours": "Contours",
"site.type.terrain": "Terrain",
"site.dwgHint": "DWG? Convert it to DXF first with the free ODA File Converter.",
"site.terrainFailed": "No terrain could be generated (too few/collinear contour points).",
// Import dialog.
"import.title": "Import DXF",
"import.close": "Close",
"import.file": "File",
"import.summary.heading": "Contents",
"import.summary.contours": "{n} contours",
"import.summary.meshes": "{n} meshes",
"import.summary.layers": "Layers: {layers}",
"import.summary.noLayers": "no layer names",
"import.summary.empty": "No importable 2D geometry found.",
"import.target.heading": "Target drawing level",
"import.target.existing": "Import into existing drawing level",
"import.target.new": "Create new drawing",
"import.target.newNamePlaceholder": "New drawing name",
"import.layers.heading": "Layer handling (DXF layers)",
"import.layers.asCategories": "Keep DXF layers as categories",
"import.layers.toActive": "Everything onto the active category ({code})",
"import.mesh.heading": "Meshes",
"import.mesh.asContext": "Import meshes as context geometry (3D)",
"import.mesh.note": "Meshes are not 2D drawings — they go into the context layer.",
"import.dwg.heading": "DWG file",
"import.dwg.loading": "Reading DWG …",
"import.dwg.hint":
"DWG could not be read. Alternatively, convert the file to DXF with the free ODA File Converter, then import the DXF.",
"import.confirm": "Import",
"import.cancel": "Cancel",
"import.badge.floor": "Floor",
"import.badge.section": "Section",
"import.badge.elevation": "Elevation",
"import.badge.drawing": "Drawing",
// Drag & drop (app-wide file drop).
"drop.hint": "Drop a DXF/DWG file here",
// Error boundary.
"error.console": "Unexpected error:",
"error.title": "Something went wrong",
"error.body": "An unexpected error occurred. Details in the console.",
"error.reload": "Reload",
};