summaryrefslogtreecommitdiff
path: root/app/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'app/README.md')
-rw-r--r--app/README.md142
1 files changed, 124 insertions, 18 deletions
diff --git a/app/README.md b/app/README.md
index 8727649..09cd70e 100644
--- a/app/README.md
+++ b/app/README.md
@@ -5,11 +5,11 @@ Ergebnisse, aber bedienbar von Menschen, die keine Tabellenkalkulation aufmachen
| Datei | Rolle |
|---|---|
-| `index.html` | **Die ganze App.** Rechenkern, Oberfläche, Diagramme — eine Datei, keine externen Abhängigkeiten außer den vier Wörterbüchern. Läuft per Doppelklick. |
-| `i18n.de.js` | Wörterbuch Deutsch. Hauptsprache und Rückfallebene. |
-| `i18n.en.js` | Wörterbuch Englisch. |
-| `i18n.la.js` | Wörterbuch Latein. |
-| `i18n.ja.js` | Wörterbuch Japanisch. |
+| `index.html` | **Die ganze App.** Rechenkern, Oberfläche, Diagramme — eine Datei, keine externen Abhängigkeiten außer den Wörterbüchern. Läuft per Doppelklick. |
+| `i18n.de.js` | Wörterbuch Deutsch. Hauptsprache und Rückfallebene. **Vollständig.** |
+| `i18n.en.js` `i18n.nl.js` `i18n.fr.js` `i18n.la.js` `i18n.ja.js` | Englisch, Niederländisch, Französisch, Latein, Japanisch. **Vollständig** (459 Schlüssel). |
+| `i18n.nds.js` `i18n.bar.js` `i18n.eu.js` `i18n.eo.js` `i18n.tr.js` `i18n.uk.js` | Niederdeutsch, Bairisch, Baskisch, Esperanto, Türkisch, Ukrainisch. **Teilweise** (315 Schlüssel, siehe 3b). |
+| `i18n.got.js` `i18n.goh.js` `i18n.gmh.js` `i18n.grc.js` `i18n.sa.js` | Gotisch, Althochdeutsch, Mittelhochdeutsch, Altgriechisch, Sanskrit. **Teilweise**. |
| `manifest.json` | Macht die App installierbar (Name, Farben, Symbole). |
| `service-worker.js` | Offline-Cache, `stale-while-revalidate`. |
| `icon-*.png` | App-Symbole, 192 / 512 / 512-maskable. |
@@ -18,7 +18,7 @@ Ergebnisse, aber bedienbar von Menschen, die keine Tabellenkalkulation aufmachen
## 1. Weitergeben — drei Wege
-**a) Nur die Dateien.** `index.html` samt den vier `i18n.*.js` verschicken — sie gehören
+**a) Nur die Dateien.** `index.html` samt allen neunzehn `i18n.*.js` verschicken — sie gehören
zusammen und müssen im selben Ordner liegen. Doppelklick genügt,
alles rechnet, Eingaben werden im Browser gespeichert. Was fehlt, ist nur die PWA-Hülle —
kein Symbol auf dem Startbildschirm, kein Offline-Cache. Beides braucht es hier auch nicht,
@@ -106,24 +106,114 @@ Bruttobeitrags.
Fällt der Nettoaufwand für das erste Jahr auf null — weil man dann bereits ausgeschieden ist —,
existiert die Umkehrung nicht. Die App sagt das statt still nichts zu tun.
-## 3b. Vier Sprachen
+## 3b. Neunzehn Sprachen
-Deutsch ist die Hauptsprache; Englisch, Latein und Japanisch sind Übersetzungen derselben
-Rechtslage, kein zweiter Rechtsstand. **Die Normzitate bleiben in allen Sprachen deutsch**
+Deutsch ist die Hauptsprache; alle übrigen sind Übersetzungen derselben Rechtslage, kein
+zweiter Rechtsstand. **Die Normzitate bleiben in allen Sprachen deutsch**
(`§ 1a BetrAVG`, `§ 226 Abs. 2 S. 2 SGB V`, …) — sie sind die Primärquellen und haben keine
amtliche Übersetzung; eine eigene wäre hier keine Hilfe, sondern eine Fehlerquelle. Ebenso
bleiben zwei Produktnamen stehen, weil sie Eigennamen sind: `Altersvorsorgedepot` und
`Versorgungsbezüge`; im Japanischen mit Glosse (`Versorgungsbezüge(企業年金等の給付)`).
+| | Sprachen | Schlüssel |
+|---|---|---|
+| **vollständig** | `de` `de-x-amt` `de-x-sales` `en` `nl` `fr` `la` `ja` `nds` `bar` `eu` `eo` `tr` `uk` `got` `goh` `gmh` `grc` `sa` | 459 |
+| **teilweise** | — | — |
+
+Alle neunzehn Sprachen sind inzwischen vollständige Wörterbücher (459 von 459 Schlüsseln); die
+Tabellenzeile „teilweise“ bleibt stehen, weil `TEILWEISE` in `index.html` als Mechanismus
+weiterlebt — sie ist nur derzeit leer. Ursprünglich war die Auswahl strukturell, nicht nach
+Zeichenzahl: zuerst übersetzt wurde, was man anfasst oder als Überschrift liest —
+Feldbeschriftungen, Einheiten, Auswahlwerte, Fenstertitel, Kennzahlen, Tabellenköpfe,
+Diagrammlegenden, Meldungen; die langen juristischen Erläuterungen (die `?`-Texte an den
+Feldern, das Fazit, die Notizen unter den Feldern, der ganze Rechenweg) kamen erst in einer
+zweiten Fassung dazu. Für die drei historischen Sprachstufen und für Sanskrit und Altgriechisch
+ist der Vertrauensgrad in diesen Fließtext-Passagen entsprechend niedriger als in den
+Feldbeschriftungen selbst — siehe die Kopfkommentare der jeweiligen `i18n.*.js`-Datei für die
+genauen Prozentsätze und die dort neu geprägten Fachbegriffe.
+
+**Die drei alten germanischen Fassungen** (`got` Gotisch, `goh` Althochdeutsch,
+`gmh` Mittelhochdeutsch) sind kein Scherz, sondern eine Probe darauf, wie viel Fachsprache eine
+Sprachstufe trägt. Nur `goh` und `gmh` sind Vorstufen des Deutschen; **Gotisch ist ostgermanisch
+und damit eine Schwester, keine Ahnin** — es steht hier, weil es das älteste umfangreich
+überlieferte Germanisch überhaupt ist. Das Ergebnis ist ein klares Gefälle, und es folgt genau
+der Verstädterung:
+
+- **Gotisch** hat mit Wulfilas Bibel ein Korpus von rund 3.000 Lexemen, praktisch keines
+ davon wirtschaftlich. Belegt sind immerhin `faihu` (Vermögen), `gild` (Abgabe), `wokrs` (Zins,
+ Lk 19,23 *miþ wokra*), `mizdo` (Lohn), `asneis` (Lohnarbeiter). Alles Übrige — `haubidafaihu`
+ für Kapital, `gagaleikeins` für Vergleich — ist geprägt. Vertrauensgrad ≈ 30 %.
+- **Althochdeutsch** gewinnt durch Tatian und Notker: `gelt`, `zins`, `lon`, `wuohhar` sind
+ belegt, und **`widarmezzon` steht im Tatian genau für lateinisch *comparare*** — der
+ Fenstertitel ist also kein Kunstwort. Vertrauensgrad ≈ 50 %.
+- **Mittelhochdeutsch** ist die tragfähigste Stufe, weil es bereits eine städtische Geld- und
+ Rechtssprache gibt. Drei Treffer sind keine Prägung, sondern der jeweilige Terminus:
+ **`houbetguot`** ist das Kapital, **`lîpgedinge`** die lebenslange Leibrente, **`tiurunge`**
+ der Preisanstieg — also die Inflation. Dazu `gülte`, `stiure`, `wuocher`, `gewin`, `koste`.
+ Vertrauensgrad ≈ 65 %.
+
+**Gotisch steht in lateinischer Umschrift** (Streitberg), nicht im Wulfila-Alphabet
+(U+10330–1034F). Der Grund ist der Grundsatz aus § 2: die App lädt keine Schriften von fremden
+Domains. Für gotische Schrift gibt es auf keinem verbreiteten System eine vorinstallierte Datei
+— 𐌰𐌻𐌻𐌰𐌹𐌼 wären leere Kästchen. Die Umschrift ist ohnehin die Form, in der das Gotische gelesen
+wird. Wer die Schrift will, braucht eine eingebettete Schriftart und damit eine andere
+Grundsatzentscheidung.
+
+### Registervarianten des Deutschen: gebaut
+
+**„Beamtendeutsch“ und „Vertrieb“** sind keine Sprachen, sondern Stilebenen derselben Sprache —
+sie stehen daher nach BCP 47 § 2.2.7 unter `de` mit privatem Untertag: `de-x-amt` und
+`de-x-sales`, in `i18n.de-x-amt.js` und `i18n.de-x-sales.js`. Anders als bei den übrigen
+Sprachen genügt hier keine Teilfassung: der Witz liegt gerade im Fließtext, den eine
+Teilübersetzung weglassen würde. Derselbe § 1a BetrAVG heißt im Amtsdeutsch „Ein Rechtsanspruch
+besteht ausschließlich bis zur Höhe von 4 vom Hundert der Beitragsbemessungsgrenze der
+Rentenversicherung“ und im Vertriebsdeutsch „Bis zu 4 % on top — geschenkt vom Gesetzgeber!“ —
+beide beschreiben exakt dieselbe Rechtslage, und der Vergleich ist der Punkt. Die Zahlen ändern
+sich auch dort nicht; `pruefe.js` prüft das wie bei jeder anderen Sprache ohne Sonderfall.
+
+Technisch brauchte das drei Änderungen: `pickLang()` matcht seither zusätzlich zur
+Grundsprache beliebig viele `-x-[a-z0-9]{1,8}`-Untertags; `LANGS` und `DICT` bekamen
+Einträge mit Bindestrich; `LOCALES`/`GRUPPEN` brauchten dagegen **keine** neuen Einträge, weil
+ihre bestehenden `||`-Rückfälle (`'de-DE'` bzw. `'.'`) für beide Varianten schon das Richtige
+liefern. Der Sprachknopf zeigt nicht den vollen Code (`DE-X-AMT` wäre zu lang für die
+zweizeilige Schaltfläche), sondern nur den Teil nach dem letzten Bindestrich (`AMT`, `SALES`);
+`lang="…"` und das Autonym im `title` tragen weiterhin den vollen Code bzw. den vollen Namen.
+
+### Vorgemerkt, noch nicht gebaut
+
+**Rechtsläufige Sprachen (`he`, `fa`, `ar`).** Die Übersetzung ist der billige Teil. Teuer ist
+dreierlei: `applyStatic()` muss neben `lang` auch `dir` setzen; im Stilblatt müssen
+`margin-left`/`-right` durch die logischen Eigenschaften ersetzt werden, sonst kippt die
+Kachelung; und Teil 8 zeichnet auf Canvas, wo es **keinen Bidi-Algorithmus gibt** — Achsen,
+Legenden und der Wasserfall müssten von Hand gespiegelt werden. Dazu `fa-u-nu-latn` und
+`ar-u-nu-latn` in `LOCALES`, sonst liefert ICU ostarabische Ziffern (۱۲۳۴) neben einem `€`.
+Die Einzelheiten stehen als Kommentarblock in `index.html` direkt bei `TEILWEISE`.
+
+**Codes.** ISO 639-1, wo es einen gibt, sonst 639-3. Dreibuchstabig sind `grc`
+(**nicht** `el` — das wäre Neugriechisch), `nds` und `bar`; keine der drei hat einen
+zweibuchstabigen Code. Deshalb matcht `pickLang()` `[a-z]{2,3}` als Grundcode, optional gefolgt
+von den erwähnten `-x-…`-Untertags.
+
**Wahl der Sprache**, in dieser Reihenfolge:
-1. `?lang=de|en|la|ja` in der Adresse — teilbar, überschreibt alles,
+1. `?lang=…` in der Adresse — teilbar, überschreibt alles,
2. die gemerkte Wahl in `localStorage` unter `altersvorsorge.lang`,
-3. `navigator.language`: `ja…` → Japanisch, `en…` → Englisch, sonst Deutsch.
- **Latein wird nie automatisch gewählt** — ein Browser, der `la` meldet, meint es fast sicher
- nicht als Anzeigesprache.
-
-**Zu den beiden neuen Fassungen.** Das Latein ist pragmatisches Neulatein: klassische Syntax,
+3. `navigator.language`, nach BCP-47-Teilkette (`xx` oder `xx-…`).
+ **Latein, Altgriechisch, Sanskrit und Esperanto werden nie automatisch gewählt** — ein
+ Browser, der `la` meldet, meint es fast sicher nicht als Anzeigesprache.
+
+Die Knöpfe tragen das Kürzel, der `title` das **Autonym** (`Українська`, `Plattdüütsch`,
+`संस्कृतम्`) — nicht den übersetzten Namen. Wer Ukrainisch sucht, erkennt `Українська` auch dann,
+wenn die Oberfläche gerade auf Baskisch steht; nebenbei spart das 14 × 14 Wörterbucheinträge.
+
+**Zahlenformat.** `LOCALES` bildet jeden Code auf ein ICU-Tag ab, `GRUPPEN` auf das
+Tausenderzeichen, das `parseNum()` beim mehrdeutigen `1,234` heranzieht. Sprachen ohne eigene
+ICU-Daten (`nds`, `bar`, `eo`, `la`, `grc`, `sa`) bekommen `de-DE`: Devanāgarī-Ziffern neben
+einem `€` wären eine Schikane, keine Genauigkeit, und griechische Buchstabenzahlen erst recht.
+`fr` gruppiert mit U+202F, `uk` mit U+00A0 — beides so, wie ICU es tatsächlich setzt, nachgeprüft
+gegen `formatToParts`.
+
+**Zu Latein und Japanisch.** Das Latein ist pragmatisches Neulatein: klassische Syntax,
aber gebildete Neuprägungen für Moderne (`pensio operativa`, `impensa pura`, `valor praesens`,
`usura interna`). Römische Ziffern wären ein Witz auf Kosten der Lesbarkeit — und die
Trennzeichenkonvention ist ohnehin jünger als jede lateinische Quelle. Das Japanische folgt
@@ -179,11 +269,27 @@ nicht den fertigen Satz — sonst stünde nach dem Wechsel „vor der Änderung
alten Sprache da.
**Prüfung.** `pruefe.js` (Entwicklungswerkzeug, wird vom Service Worker nicht ausgeliefert) lädt die Seite kopflos in
-jsdom, schaltet alle vier Sprachen durch, klappt jeden Abschnitt auf, erzwingt über fünf Szenarien
-die bedingten Texte und prüft: kein unaufgelöster Schlüssel, keine deutschen Reste im
+jsdom, schaltet alle neunzehn Sprachen durch, klappt jeden Abschnitt auf, erzwingt über fünf
+Szenarien die bedingten Texte und prüft: kein unaufgelöster Schlüssel, keine deutschen Reste im
englischen Modus außer den erlaubten Fachbegriffen, kein sichtbar gebliebener Schlüssel, und
— die eigentliche Invariante —
-**identische Rechenergebnisse in allen vier Sprachen**.
+**identische Rechenergebnisse in allen neunzehn Sprachen**.
+
+Die Liste der Wörterbücher liest das Skript aus `index.html` statt sie zu pflegen: eine neue
+Sprache soll den Test nicht stillschweigend an einem leeren Objekt vorbeilaufen lassen. Das
+Regex für die `<script src="i18n….js">`-Tags lässt dabei auch Bindestriche im Dateinamen zu
+(`i18n.de-x-amt.js`), nicht nur zwei- bis dreibuchstabige Codes. Für Teilsprachen — sobald es
+wieder welche gibt — wird zusätzlich der Rückfall selbst nachgewiesen: jeder nicht übersetzte
+Schlüssel muss den *deutschen Text* liefern, nie einen Leerstring und nie den Schlüssel; kein
+eigener Eintrag darf den Typ wechseln (Zeichenkette ↔ Funktion); der Hinweis unter dem
+Umschalter steht genau bei den Teilsprachen und sonst nirgends. Umgekehrt wird für jede
+Vollsprache — das sind inzwischen alle neunzehn — nachgewiesen, dass ihr Wörterbuch tatsächlich
+459 von 459 Schlüsseln trägt und der Teilhinweis NICHT erscheint. Für die beiden
+Registervarianten des Deutschen wird zusätzlich geprüft, dass der Bindestrich-Untertag die
+Adresszeile und den Rückweg durch `pickLang()` übersteht. Bricht das Hauptskript beim Parsen —
+der wahrscheinlichste Fall ist ein Blockkommentar, den ein Regex-Literal vorzeitig schliesst —,
+steigt das Skript mit einer klaren Meldung aus, statt an einem `undefined` zu straucheln.
+154 Prüfungen.
## 4. Prüfung