From 0fe14c5454eca347c8cafd0000a0fd3cdf955832 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Tue, 14 Jul 2026 16:36:25 +0200 Subject: [PATCH] =?UTF-8?q?Was=20bei=20=C3=9Cbersetzung=20zu=20tun=20w?= =?UTF-8?q?=C3=A4re?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/translate.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 doc/translate.md diff --git a/doc/translate.md b/doc/translate.md new file mode 100644 index 0000000..f589116 --- /dev/null +++ b/doc/translate.md @@ -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).