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 Wertede_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) undssg-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 nursection→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 viasetenv/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_corezuerst, danachssg-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 nachssg_core. - DCL-Muster:
popup_list(Combobox) existiert mehrfach, z.B.dcl/kreisel_edit.dcl:31-35; Laufzeit-Befüllung viastart_list/add_list/end_list, Auslesen viaget_tile(Index-String). Wrapperssg-dialog-run(Lisp/ssg_core.lsp:534-544). DCL-Pfad via(getenv "DXFM_DCL")(gesetzt inbin/setenv.bat:25). - Menü (
menu/SSG_LIB.mnu:119-121): Konfig-Untermenü; neuer Eintrag[Sprache]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHEzwischen 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*, Fallbackde_DE, dann Key-Name.ssg-textf(key arg1 …): Template mit Platzhaltern für die ~288 dynamischenstrcat-Fälle.- Flag
*ssg-lang-loaded*; Registrierung inssg-ensure+ Laden direkt nachssg_corein MNL undssg_load.lsp.
Umschaltung:
dcl/sprache.dcl: Dialog-IDsprache,popup_listkey"sprache",ok_cancel;.c:SSG_SPRACHEinLisp/SSG_LIB_Commands.lsp(nebenSSG_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
- Dynamische Strings (
princ (strcat …), ~288): brauchen parametrisierte Templates (ssg-textf), keine 1:1-Ersetzung. - DCL-Label statisch: Dialog-/Tile-Beschriftungen in
.dclsind zur Laufzeit kaum umschaltbar. Optionen: Beschriftungen wo möglich perset_tileaus LISP setzen; sonst zweisprachige Labels oder getrennte DCL-Dateien. Höchster Aufwand. ssg-ques-Keywords:getkword "Yes No"bleibt technisch (BricsCAD-Keywords), nur die Prompt-Anzeige wird übersetzt; ggf. deutsche Keywords "Ja Nein" ergänzen.- 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).