Was bei Übersetzung zu tun wäre

This commit is contained in:
2026-07-14 16:36:25 +02:00
parent bf517475bb
commit 0fe14c5454
+111
View File
@@ -0,0 +1,111 @@
# 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).