# Internationalisierung (i18n) SSG_LIB — Analyse & Zielkonzept > Status: **Analyse/Vorbereitung**. Diese Datei fasst zusammen, wo eine Sprachumschaltung > (Deutsch/Englisch) nötig ist und wie sie umgesetzt werden soll. Es wurde **noch kein Code > geändert**. ## Kontext / Ziel - Alle interaktiven Meldungen, Abfragen und Anzeigen sollen zusätzlich auf Englisch ausgegeben werden können. - Umschaltung zur Laufzeit über eine globale Sprachvariable `*ssg-lang*`. - Konfig-Menü `SSG_LIB → Konfiguration → Sprache`: Combobox mit "Deutsch"/"Englisch", intern die Werte `de_DE` / `en_GB`. - Ist-Stand: **Keine** Sprach-Infrastruktur vorhanden (bestätigt: alle `lang`-Treffer im Code sind false positives wie "Laenge"/"entlang"). ## Wo es nötig ist — Inventar (~828 benutzersichtbare Fundstellen in `Lisp/`) | Datei | Benutzertexte | Schwerpunkt | |---|---:|---| | Gefaellestrecke.lsp | ~156 | Modus-Menues, Ergebnistabellen, Fehler, Prompts | | vf_linienzug.lsp | ~120 | "Ihre Wahl (1/2)"-Menues, Diagnose | | vf_core.lsp | ~108 | Generator-Menues, Winkel/Seite-Abfragen | | OmniModulInsert.lsp | ~106 | Abbruch-Meldungen, Attribut-Ausgaben, 39x `[DUMMY]` | | KreiselInsert.lsp | ~80 (+46 Debug) | Parameter-Abfragen, Ausgaben; einzige Datei mit `dbg*` | | vf_etage.lsp | ~72 | Ergebnistabellen, Einfuege-Schritte | | vf_standard.lsp | ~61 | Berechnungstabellen, Einfuege-Schritte | | SSG_LIB_Commands.lsp | ~33 | v.a. `[DUMMY]`-Platzhalter, DIM-Switch-Meldungen | | menu-inventory.lsp | ~27 | Diagnose-Tool | | ssg_layer.lsp | ~19 | `ssg-emsg`/`ssg-ques`-Aufrufe | | export.lsp / ssg_core.lsp / ssg_id.lsp | ~37 | Prozess-Status, `[CFG]`-Warnungen | | ssg_dialog, external_call, ssg_load, VarioFoerderer, EtageVarioFoerderer | ~9 | Warnungen, Ladebestaetigungen | **Nach Kategorie:** ~408 `princ "Literal"`, ~288 `princ (strcat …)` (dynamisch), ~80 Abfragen (`getstring/getpoint/getreal/getint/getkword/getdist`), 19 `alert`, 23 `ssg-emsg`/`ssg-ques`, 3 DCL-Dialoge (`kreisel_edit.dcl`, `omniflo_boegen.dcl`, `omniflo_weichen.dcl`). **Zentrale Angelpunkte:** - `ssg-emsg` (`Lisp/ssg_core.lsp:99-104`) und `ssg-ques` (`Lisp/ssg_core.lsp:84-95`) — hier laufen fast alle Fehler und Ja/Nein-Abfragen zusammen; die Keywords `"Yes No"` (Z.87/91) sind sprachrelevant. - Sehr häufig wiederholte, identische Prompts ("\nIhre Wahl (1/2) [1]: ") — ideale Kandidaten für zentrale Konstanten. - Große geschlossene Textblöcke: Ergebnistabellen/Header (`vf_standard.lsp:292-389`, `vf_etage.lsp:454-575`, `Gefaellestrecke.lsp:1639-1642`) und Einfüge-Schritt-Ausgaben ("1/11 … 11/11"). **Empfohlener Umfang (offene Entscheidung):** "Interaktion + Meldungen" — alle Prompts, Menüauswahlen, Dialoge, Fehler, alerts UND Status-/Ergebnisausgaben; **ausgeschlossen**: Debug (`dbg*`), Ladebestätigungen ("… geladen."), `[DUMMY]`-Platzhalter, Diagnosemarker `[CFG]`/`[OMNI]`, sowie das Diagnose-Tool `menu-inventory.lsp` (~700 statt ~900 Strings). ## Vorhandene Infrastruktur (Anknüpfungspunkte) - **Config-System** (`Lisp/ssg_core.lsp:565-810`): `*ssg-config*`, `ssg-cfg`, `ssg-cfg-or`; der flache 1-Ebenen-JSON-Parser (`ssg-cfg-parse-nested`) kann nur `section→key→skalar`, ist daher für verschachtelte Sprachtexte ungeeignet → **LISP-Tabelle bevorzugt**. - **Umschaltmuster** `c:SSG_DIM_SWITCH` (`Lisp/SSG_LIB_Commands.lsp:129-139`): Zustand via `setenv`/`getenv` (`DXFM_DIM`). Als Persistenz-Vorbild geeignet; Nachteil: DIM wird nur beim Modulladen gelesen → für Sprache zusätzlich eine Live-Global nötig. - **Ladereihenfolge**: `ssg_core` zuerst, danach `ssg-load-config` — in der MNL (`menu/SSG_LIB.mnl:66-72,131-155`) und Standalone (`Lisp/ssg_load.lsp:14-41`). Bester Init-Ort für die Sprachtabelle: direkt nach `ssg_core`. - **DCL-Muster**: `popup_list` (Combobox) existiert mehrfach, z.B. `dcl/kreisel_edit.dcl:31-35`; Laufzeit-Befüllung via `start_list`/`add_list`/`end_list`, Auslesen via `get_tile` (Index-String). Wrapper `ssg-dialog-run` (`Lisp/ssg_core.lsp:534-544`). DCL-Pfad via `(getenv "DXFM_DCL")` (gesetzt in `bin/setenv.bat:25`). - **Menü** (`menu/SSG_LIB.mnu:119-121`): Konfig-Untermenü; neuer Eintrag `[Sprache]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE` zwischen Z.120/121. ## Zielarchitektur (LISP-Tabelle) Neue Datei `Lisp/ssg_lang.lsp`: - Global `*ssg-lang*` (Default `"de_DE"`, initial aus `(getenv "DXFM_LANG")`). - Globales Feld `*ssg-texts*` = Assoc-Liste `(key ("de_DE" . "…") ("en_GB" . "…"))`. - `ssg-text` (key): liefert Text in `*ssg-lang*`, Fallback `de_DE`, dann Key-Name. - `ssg-textf` (key arg1 …): Template mit Platzhaltern für die ~288 dynamischen `strcat`-Fälle. - Flag `*ssg-lang-loaded*`; Registrierung in `ssg-ensure` + Laden direkt nach `ssg_core` in MNL und `ssg_load.lsp`. Umschaltung: - `dcl/sprache.dcl`: Dialog-ID `sprache`, `popup_list` key `"sprache"`, `ok_cancel;`. - `c:SSG_SPRACHE` in `Lisp/SSG_LIB_Commands.lsp` (neben `SSG_DIM_SWITCH`): Combobox mit "Deutsch"/"Englisch" füllen, Vorauswahl aus `*ssg-lang*`, bei OK `*ssg-lang*` setzen + `(setenv "DXFM_LANG" …)` persistieren. - Menüeintrag "Sprache" unter Konfiguration. ## Bekannte Schwierigkeiten 1. **Dynamische Strings** (`princ (strcat …)`, ~288): brauchen parametrisierte Templates (`ssg-textf`), keine 1:1-Ersetzung. 2. **DCL-Label statisch**: Dialog-/Tile-Beschriftungen in `.dcl` sind zur Laufzeit kaum umschaltbar. Optionen: Beschriftungen wo möglich per `set_tile` aus LISP setzen; sonst zweisprachige Labels oder getrennte DCL-Dateien. Höchster Aufwand. 3. **`ssg-ques`-Keywords**: `getkword "Yes No"` bleibt technisch (BricsCAD-Keywords), nur die Prompt-Anzeige wird übersetzt; ggf. deutsche Keywords "Ja Nein" ergänzen. 4. **Encoding**: aktuell Umlaute gemischt mit ae/oe/ue ("Höhe" vs. "Hoehe"). Empfehlung laut Projektkonvention: durchgängig ASCII (ae/oe/ue). ## Verifikation (für die spätere Umsetzung) - Standalone via `(load ".../Lisp/ssg_load.lsp")`, dann `*ssg-lang*` toggeln und je einen Befehl pro Modul (KreiselInsert, FOERDERANLAGE, GEFAELLESTRECKE, OMNI_*) in beiden Sprachen prüfen. - Sprache-Dialog testen (Vorauswahl, Persistenz über `DXFM_LANG`). - Bestehende Python/LISP-Tests bleiben unberührt (betreffen keine UI-Texte).