Files
dxfmakros/doc/translate.md
T

6.2 KiB

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).