Was bei Übersetzung zu tun wäre
This commit is contained in:
@@ -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).
|
||||
Reference in New Issue
Block a user