From 9458382965baf420e36854cf56ae4edba6ecb96d Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Wed, 15 Jul 2026 15:11:02 +0200 Subject: [PATCH] =?UTF-8?q?Sprachumschaltung=20von=20DE=20nach=20EN=20?= =?UTF-8?q?=C3=BCber=20Men=C3=BC=20m=C3=B6glich=20gemacht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 8 ++++++-- Lisp/Gefaellestrecke.lsp | 16 ++++++++-------- Lisp/README.md | 23 ++++++++++++++++++++++- Lisp/SSG_LIB_Commands.lsp | 38 +++++++++++++++++++++++++++++++++++--- Lisp/ssg_core.lsp | 8 ++++---- Lisp/ssg_load.lsp | 3 ++- README.md | 12 ++++++++++++ dcl/sprache.dcl | 15 +++++++++++++++ menu/SSG_LIB.mnl | 12 ++++++++++-- menu/SSG_LIB.mnu | 1 + 10 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 dcl/sprache.dcl diff --git a/CLAUDE.md b/CLAUDE.md index f833cc5..3491fbd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -71,6 +71,7 @@ Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD. | Gefaellestrecke | `Gefaellestrecke` | GEFAELLESTRECKE | | Omniflo (komplett) | `OmniModulInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_EDIT | | Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON | +| Konfiguration | `SSG_LIB_Commands` | SSG_DIM_SWITCH, SSG_SPRACHE | | Doppelklick/Kontextmenue | `SSG_LIB_Commands` | SSG_BLOCKEDIT | ### Entfernte Legacy-Dateien @@ -86,6 +87,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | Datei | Befehle | Beschreibung | |---|---|---| | `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops | +| `ssg_lang.lsp` | - | Sprachumschaltung Deutsch/Englisch (ssg-text, ssg-textf, *ssg-lang*) | | `ssg_dbg.lsp` | - | Debug-Logging (dbgopen, dbgmsg, dbgflush, dbgclose) | | `ssg_dialog.lsp` | - | DCL-Dialog-Vorlagen und Hilfsfunktionen | | `ssg_layer.lsp` | - | Layer-Verwaltung | @@ -94,7 +96,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `Gefaellestrecke.lsp` | GEFAELLESTRECKE | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN) | | `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) | | `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog | -| `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher | +| `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) | | `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) | ## DCL-Dialoge @@ -104,13 +106,14 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`. | `kreisel_edit.dcl` | KreiselEdit (KreiselInsert.lsp) | | `omniflo_boegen.dcl` | OMNI_APB_* (OmniModulInsert.lsp) | | `omniflo_weichen.dcl` | OMNI_W*_* (OmniModulInsert.lsp) | +| `sprache.dcl` | SSG_SPRACHE (SSG_LIB_Commands.lsp) | ## Menue (SSG_LIB.mnu + SSG_LIB.mnl) - `SSG_LIB.mnu` - Menuedefinition mit Lazy-Loading (`(ssg-ensure "Modul") Befehl`) - `SSG_LIB.mnl` - Automatisch geladen mit dem Menue, definiert `ssg-ensure` Loader - `***MENUGROUP=SSG_LIB` - Menuegruppenname -- `***POP1` - Hauptmenue (ILS, Omniflo, Export) +- `***POP1` - Hauptmenue (ILS, Omniflo, Export, Konfiguration) - `***DOUBLECLICK` - Doppelklick auf INSERT-Bloecke ruft SSG_BLOCKEDIT auf - `***POP501` - Rechtsklick-Kontextmenue (KreiselEdit, OMNI_EDIT, SSG_BLOCKEDIT) @@ -124,6 +127,7 @@ Werden via `bin/setenv.bat` gesetzt. Wichtigste: - `DXFM_LOG` - Log-Verzeichnis - `DXFM_DCL` - Pfad zu DCL-Dialogdateien - `DXFM_CFG` - Konfigurationsverzeichnis +- `DXFM_LANG` - Aktive Sprache (`de_DE`/`en_GB`), persistiert von `SSG_SPRACHE`; Default `de_DE` ## Konventionen diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 80df121..025d0d0 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -1069,17 +1069,17 @@ (setq exit-hz (gf-exit-hz segmente)) ;; Seite fuer AUS-Element (vor Winkelberechnung, da Laengenanpassung davon abhaengt) - (princ "\n\nAUS-Element (AS_Element_90_*) - Seite waehlen:") - (princ "\n 1 - Links") - (princ "\n 2 - Rechts") - (setq antwort (getstring "\nIhre Wahl (1/2) [1]: ")) + (princ (ssg-text "gf-seite-aus-header")) + (princ (ssg-text "gf-seite-links")) + (princ (ssg-text "gf-seite-rechts")) + (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) (setq as-seite (if (= antwort "2") "rechts" "links")) ;; Seite fuer EIN-Element - (princ "\n\nEIN-Element (ES_Element_90_*) - Seite waehlen:") - (princ "\n 1 - Links") - (princ "\n 2 - Rechts") - (setq antwort (getstring "\nIhre Wahl (1/2) [1]: ")) + (princ (ssg-text "gf-seite-ein-header")) + (princ (ssg-text "gf-seite-links")) + (princ (ssg-text "gf-seite-rechts")) + (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) (setq es-seite (if (= antwort "2") "rechts" "links")) (setq as-block (strcat "AS_Element_90_" as-seite)) diff --git a/Lisp/README.md b/Lisp/README.md index a8c143a..1ff7d35 100644 --- a/Lisp/README.md +++ b/Lisp/README.md @@ -15,7 +15,7 @@ _MENULOAD → menu/SSG_LIB.mnu auswaehlen ``` BricsCAD laedt daraufhin automatisch `SSG_LIB.mnl`, welches alle Module -per `ssg-ensure` initialisiert (Kern: ssg_core/dbg/dialog/layer, dann +per `ssg-ensure` initialisiert (Kern: ssg_core/lang/dbg/dialog/layer, dann alle Feature-Module). Details: siehe `../CLAUDE.md` Abschnitt "Lademechanismus". **Manuell laden (Notfall / Entwicklung):** @@ -133,6 +133,20 @@ Interne Parser-Funktionen (nicht direkt aufrufen): --- +### `ssg_lang.lsp` – Sprachumschaltung (Deutsch/Englisch) + +Zentrale Textverwaltung fuer benutzersichtbare Meldungen. Kern-Modul, wird direkt nach `ssg_core` geladen. Wird schrittweise auf weitere Module ausgerollt (siehe `doc/translate.md`). + +| Funktion | Beschreibung | +| --- | --- | +| `ssg-text key` | Liefert Text zu `key` in `*ssg-lang*`, Fallback `de_DE`, dann Key selbst | +| `ssg-textf key werte` | Wie `ssg-text`, ersetzt Platzhalter `%1 %2 ...` durch `werte` (Liste) | + +Sprache umschalten: Befehl `SSG_SPRACHE` (Menue → Konfiguration → Sprache) setzt `*ssg-lang*` +live und persistiert via `(setenv "DXFM_LANG" ...)`. Default ohne `DXFM_LANG` ist `"de_DE"`. + +--- + ### `ssg_dbg.lsp` – Debug-Logging Dateibasiertes Debug-Log mit gepuffertem Schreiben. `dbgf`/`dbg`/`dbgmsg` puffern im Speicher, `dbgreturn` flusht auf die Platte (open/append/close). @@ -350,6 +364,13 @@ Registrierte Dummy-Befehle: > `FOERDERANLAGE` ist nicht hier definiert – dieser Befehl ist in `VarioFoerderer.lsp` implementiert. +**Konfigurationsbefehle** (Menue → Konfiguration): + +| Befehl | Beschreibung | +| --- | --- | +| `SSG_DIM_SWITCH` | Schaltet zwischen 2D/3D-Bloecken um (setzt `DXFM_DIM`, `DXFM_BLOCKS`, `DXFM_OMNIFLO`) | +| `SSG_SPRACHE` | Oeffnet Dialog `sprache.dcl`, setzt `*ssg-lang*` und persistiert via `DXFM_LANG` (siehe [`ssg_lang.lsp`](#ssg_langlsp--sprachumschaltung-deutschenglisch)) | + **SSG_BLOCKEDIT** – Doppelklick/Kontextmenue-Dispatcher: Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearbeitungsbefehl auf: diff --git a/Lisp/SSG_LIB_Commands.lsp b/Lisp/SSG_LIB_Commands.lsp index ef5afc8..d84c642 100644 --- a/Lisp/SSG_LIB_Commands.lsp +++ b/Lisp/SSG_LIB_Commands.lsp @@ -132,9 +132,41 @@ (setenv "DXFM_DIM" dim-neu) (setenv "DXFM_BLOCKS" (strcat basis "\\data\\ils\\" dim-neu)) (setenv "DXFM_OMNIFLO" (strcat basis "\\data\\omniflo\\" dim-neu)) - (princ (strcat "\nModus umgeschaltet auf: " dim-neu)) - (princ (strcat "\n DXFM_BLOCKS = " (getenv "DXFM_BLOCKS"))) - (princ (strcat "\n DXFM_OMNIFLO = " (getenv "DXFM_OMNIFLO"))) + (princ (ssg-textf "dim-switch-modus" (list dim-neu))) + (princ (ssg-textf "dim-switch-blocks" (list (getenv "DXFM_BLOCKS")))) + (princ (ssg-textf "dim-switch-omniflo" (list (getenv "DXFM_OMNIFLO")))) + (princ) +) + +;; ============================================================ +;; SSG_SPRACHE - Sprache umschalten (Deutsch/Englisch) +;; Setzt *ssg-lang* live und persistiert ueber DXFM_LANG +;; ============================================================ + +(defun ssg-sprache-init ( / idx) + (start_list "sprache") + (add_list "Deutsch") + (add_list "Englisch") + (end_list) + (setq idx (if (= *ssg-lang* "en_GB") "1" "0")) + (set_tile "sprache" idx) +) + +(defun ssg-sprache-accept ( / idx neu) + (setq idx (get_tile "sprache")) + (setq neu (if (= idx "1") "en_GB" "de_DE")) + (setq *ssg-lang* neu) + (setenv "DXFM_LANG" neu) +) + +(defun c:SSG_SPRACHE () + (ssg-dialog-run + (strcat (getenv "DXFM_DCL") "/sprache.dcl") + "sprache" + 'ssg-sprache-init + 'ssg-sprache-accept + ) + (princ (ssg-textf "sprache-gewechselt" (list *ssg-lang*))) (princ) ) diff --git a/Lisp/ssg_core.lsp b/Lisp/ssg_core.lsp index 52870eb..2ca13ee 100644 --- a/Lisp/ssg_core.lsp +++ b/Lisp/ssg_core.lsp @@ -85,11 +85,11 @@ (if defa (progn (initget 1 "Yes No Yes") - (= (getkword (strcat "\n" prompt-text " Y/N : ")) "No") + (= (getkword (strcat "\n" prompt-text (ssg-text "ques-yn-default-yes"))) "No") ) (progn (initget 1 "Yes No No") - (= (getkword (strcat "\n" prompt-text " Y/N : ")) "Yes") + (= (getkword (strcat "\n" prompt-text (ssg-text "ques-yn-default-no"))) "Yes") ) ) ) @@ -536,8 +536,8 @@ (if (not (new_dialog dialog-name dat)) (progn (alert "Dialog konnte nicht geladen werden.") (exit)) ) - (if init-fn (init-fn)) - (action_tile "accept" "(if accept-fn (accept-fn)) (done_dialog 1)") + (if init-fn (apply init-fn nil)) + (action_tile "accept" "(if accept-fn (apply accept-fn nil)) (done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (start_dialog) (unload_dialog dat) diff --git a/Lisp/ssg_load.lsp b/Lisp/ssg_load.lsp index 08c578a..08639c3 100644 --- a/Lisp/ssg_load.lsp +++ b/Lisp/ssg_load.lsp @@ -24,6 +24,7 @@ ) (load (strcat base-path "ssg_core.lsp") "ssg_core.lsp nicht gefunden") (ssg-load-config) + (load (strcat base-path "ssg_lang.lsp") "ssg_lang.lsp nicht gefunden") (load (strcat base-path "ssg_dbg.lsp") "ssg_dbg.lsp nicht gefunden") (load (strcat base-path "ssg_dialog.lsp") "ssg_dialog.lsp nicht gefunden") (load (strcat base-path "ssg_layer.lsp") "ssg_layer.lsp nicht gefunden") @@ -34,7 +35,7 @@ (load (strcat base-path "tests.lsp") "tests.lsp nicht gefunden") (load (strcat base-path "OmniModulInsert.lsp") "OmniModulInsert.lsp nicht gefunden") (load (strcat base-path "SSG_LIB_Commands.lsp") "SSG_LIB_Commands.lsp nicht gefunden") - (prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_dbg, ssg_dialog, ssg_layer, KreiselInsert, VarioFoerderer, Gefaellestrecke, export, tests, OmniModulInsert, SSG_LIB_Commands") + (prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_lang, ssg_dbg, ssg_dialog, ssg_layer, KreiselInsert, VarioFoerderer, Gefaellestrecke, export, tests, OmniModulInsert, SSG_LIB_Commands") (princ) ) diff --git a/README.md b/README.md index ddaafcb..91ae4eb 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ SSG_LIB │ │ ├── Antriebst. rechts → OMNI_TEF_AntriebR │ │ └── TEF Gerade → OMNI_TEF_Gerade │ └── KettenFoerderer → OMNI_KettenFoerderer +├── Konfiguration +│ ├── Umschalten 2D und 3D → SSG_DIM_SWITCH +│ └── Sprache → SSG_SPRACHE └── External ├── Call Python → CALLPYTHON ├── Export Sivas → EXPORTSIVAS @@ -127,6 +130,13 @@ Unterstuetzte Bogenwinkel: 3, 9, 12, 15, 24, 36, 48 Grad | `SSG-LayerOnAll` | Alle ausgeschalteten Layer einschalten | | `SSG-LayerDelete` | Layer und alle Objekte darauf loeschen (mit Bestaetigung) | +### SSG_LIB_Commands.lsp - Konfiguration + +| Befehl | Beschreibung | +| --- | --- | +| `SSG_DIM_SWITCH` | Schaltet zwischen 2D- und 3D-Bloecken um | +| `SSG_SPRACHE` | Sprache umschalten (Deutsch/Englisch), persistiert ueber `DXFM_LANG` | + ### tests.lsp - Export und Python-Integration | Befehl | Beschreibung | @@ -140,6 +150,7 @@ Unterstuetzte Bogenwinkel: 3, 9, 12, 15, 24, 36, 48 Grad | Datei | Beschreibung | | --- | --- | | `ssg_core.lsp` | Kernel: Umgebung, Layer-Ops, Block-Ops, Attribut-Ops, Fehlerbehandlung | +| `ssg_lang.lsp` | Sprachumschaltung Deutsch/Englisch (`ssg-text`, `ssg-textf`, `*ssg-lang*`) | | `ssg_dialog.lsp` | Dialog-Vorlagen: Slide-Preview, Modul-Dialog, Block-Einfuegesequenz | | `ssg_layer.lsp` | Layer-Verwaltungsbefehle | | `ssg_load.lsp` | Loader: Laedt alle SSG-Bibliotheken in korrekter Reihenfolge | @@ -180,6 +191,7 @@ dxfmakros/ | `DXFM_CFG` | Konfigurationsdateien | | `DXFM_TESTS` | Testverzeichnis | | `DXFM_DATA` | Datenverzeichnis | +| `DXFM_LANG` | Aktive Sprache (`de_DE`/`en_GB`), persistiert von `SSG_SPRACHE`; Default `de_DE` | | `BRICSCAD` | Pfad zur BricsCAD-Executable | ## Einrichtung diff --git a/dcl/sprache.dcl b/dcl/sprache.dcl new file mode 100644 index 0000000..72beb81 --- /dev/null +++ b/dcl/sprache.dcl @@ -0,0 +1,15 @@ +// ============================================================ +// sprache.dcl - Sprache umschalten (Deutsch/Englisch) +// ============================================================ + +sprache : dialog { + label = "Sprache / Language"; + + : popup_list { + key = "sprache"; + label = "Sprache / Language:"; + width = 30; + } + + ok_cancel; +} diff --git a/menu/SSG_LIB.mnl b/menu/SSG_LIB.mnl index 4e464f6..7313165 100644 --- a/menu/SSG_LIB.mnl +++ b/menu/SSG_LIB.mnl @@ -2,7 +2,7 @@ ;; SSG_LIB.mnl - Automatisch geladen beim MENULOAD von SSG_LIB.mnu ;; ;; Definiert den Lazy-Loader (ssg-ensure) und laedt alle Module. -;; Kern-Module: ssg_core, ssg_dbg, ssg_dialog, ssg_layer, ssg_id +;; Kern-Module: ssg_core, ssg_lang, ssg_dbg, ssg_dialog, ssg_layer, ssg_id ;; Feature-Module: KreiselInsert, Gefaellestrecke, VarioFoerderer, ... ;; ============================================================ @@ -71,6 +71,13 @@ (ssg-load-config) ) ) + (if (not *ssg-lang-loaded*) + (progn + (ssg-ensure-load "ssg_lang") + (set '*ssg-lang-loaded* t) + (set '*ssg-ssg_lang-loaded* t) + ) + ) (if (not *ssg-dbg-loaded*) (progn (ssg-ensure-load "ssg_dbg") @@ -132,6 +139,7 @@ (progn ;; 1) Kern-Module (Core) (ssg-ensure "ssg_core") + (ssg-ensure "ssg_lang") (ssg-ensure "ssg_dbg") (ssg-ensure "ssg_dialog") (ssg-ensure "ssg_layer") @@ -140,7 +148,7 @@ ;; Allgemein-Zusammenfassung (princ "\n=========================================") (princ "\n[SSG_LIB] Core-Module geladen:") - (princ "\n ssg_core, ssg_dbg, ssg_dialog, ssg_layer, ssg_id") + (princ "\n ssg_core, ssg_lang, ssg_dbg, ssg_dialog, ssg_layer, ssg_id") (princ (strcat "\n Pfad: " *ssg-lisp-pfad*)) (princ "\n=========================================") diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index 7c04aa1..73e79f7 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -118,6 +118,7 @@ [<-Export CSV]^C^C(ssg-ensure "export") EXPORTCSV [->Konfiguration] [Umschalten 2D und 3D]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH +[Sprache]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE [<-Konfiguration Schliessen]^C^C [->Tests] [Alle Tests ausfuehren]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS