Bot Language Service Layer
Speichert und liest die Labels der Bot-UIs im Objekt-Store. Die Ablage ist
**pro Bot-Repo** (z. B. `basic-bots`) und nicht pro Bot: mehrere Bots rendern
dieselben geteilten UI-Komponenten, also ist ein Text, den diese Komponente
ausgibt, genau **einmal** zu pflegen. Es gibt zwei Ebenen:
botLanguages//.json geteilt (alle Organisationen)
botLanguages///.json Organisation
Die Datei ist die *dünne* Überschicht über dem Point of Truth des Repos:
`src/ActionBots/shared/translations/.json` plus
`src/ActionBots//translations/.json`. Beides liegt im Template
(`template.translations`, vom bot-framework bereits zusammengeführt) und wird
hier beim Registrieren eines Bots in die geteilte Ebene vorbefüllt —
vorhandene Werte bleiben unberührt.
Die Keys sind mit dem **Komponentennamen** gepunktet (`MailTabsUI.save`),
nicht pro Bot: dadurch finden mehrere Bots denselben Text wieder, und der
spätere Übersetzungs-Editor zeigt sechs Komponenten statt elf Bots.
Der Sprachcode ist ISO (`de`, `nl`, `fr`, …) und identisch mit dem Wert, den
die Apps als `userLang` führen.
- Source:
Members
(static, constant) botLanguageKey
Objekt-Key einer Ebene. Ohne `UIDroot` die geteilte Ebene.
- Source:
(static, constant) getRepoLanguage
Ein Bot-Repo mit getrennten Ebenen — Grundlage für den Übersetzungs-Editor.
- Source:
(static, constant) listRepoLanguageSlices
Dünne Überschicht **aller Bot-Repos** für eine Sprache, geteilte und
Orga-Ebene bereits zusammengeführt (Orga gewinnt).
Ein Aufruf pro App-Start; die App hält das Ergebnis im Context und öffnet
beim Rendern eines Addons keine weitere Anfrage.
- Source:
(static, constant) orgaKey
- Source:
(static, constant) putRepoLanguage
Schreibt eine Übersetzungsdatei.
Standard ist ein Upsert: übergebene Labels werden gesetzt, `remove` löscht
Keys (Rücksetzen auf die darunterliegende Ebene). Mit `onlyMissing` werden
nur Keys ergänzt, die noch nicht dastehen — so werden bestehende
Übersetzungen nie überschrieben.
- Source:
(static, constant) readLanguageFile
Liest eine Übersetzungsdatei.
Toleriert zwei Formate: das reguläre `{ _meta, labels }` und eine flache
Map (`{ "wizard.next": "Weiter" }`) — letzteres, damit eine von Hand
hochgeladene Datei nicht stillschweigend leer bleibt.
- Source:
(static, constant) seedRepoLanguages
Befüllt die geteilte Ebene aus dem POT des Repos — nur fehlende Keys.
Wird bei der Registrierung eines Bots aufgerufen. Der POT ist bereits die
Mischung aus geteiltem und bot-eigenem POT (bot-framework), jeder Bot trägt
also seinen Teil bei; `onlyMissing` macht das über mehrere Bots hinweg
idempotent, und ein Admin-überschriebener Wert bleibt stehen.
Fehler dürfen die Registrierung nicht scheitern lassen: der POT kommt beim
nächsten Start erneut mit.
- Source:
(static, constant) sharedKey
- Source:
(inner, constant) NOT_FOUND_CODES
Fehlercodes, die "Datei gibt es nicht" bedeuten.
- Source:
Methods
(inner) assertSegment(label, value) → {void}
Parameters:
| Name | Type | Description |
|---|---|---|
label |
string | Name des Eingabewerts für die Fehlermeldung. |
value |
string |
- Source:
Returns:
- Type
- void
(inner) collectStream() → {Promise.<string>}
Sammelt einen Stream zu einem String.
Parameters:
| Type | Description |
|---|---|
- Source:
Returns:
- Type
- Promise.<string>
(inner) isNotFound(error) → {boolean}
Parameters:
| Name | Type | Description |
|---|---|---|
error |
any |
- Source:
Returns:
- Type
- boolean
(inner) isSafeSegment(value) → {boolean}
Repo-Name, Sprachcode und Orga-UID landen direkt im Objekt-Key — deshalb nur
harmlose Zeichen zulassen (kein `/`, kein `..`, keine Kontrollzeichen).
Parameters:
| Name | Type | Description |
|---|---|---|
value |
string |
- Source:
Returns:
- Type
- boolean
(inner) listObjectKeys(prefix) → {Promise.<Array.<string>>}
Alle Objekt-Keys unterhalb eines Präfixes.
Parameters:
| Name | Type | Description |
|---|---|---|
prefix |
string |
- Source:
Returns:
- Type
- Promise.<Array.<string>>
(inner) missingFile() → {Object}
Leeres Ergebnis eines Leseversuchs.
- Source:
Returns:
- Type
- Object
(inner) repoFromKey(key, prefix, suffix) → {string|null}
Repo-Namen aus einem Key ableiten, wenn direkt unterhalb des Präfixes genau
ein Segment steht. `botLanguages/basic-bots/de.json` → `basic-bots`,
`botLanguages//basic-bots/de.json` → null (das ist die Orga-Ebene).
Parameters:
| Name | Type | Description |
|---|---|---|
key |
string | |
prefix |
string | |
suffix |
string |
- Source:
Returns:
- Type
- string | null