Module: BotLanguageService

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