Worum es geht
Ein Dokument hat eine Sprache und eine Zeitzone. Die Sprache entscheidet zwei Dinge: welche Sprachvariante der Vorlage CRMS nimmt und wie Zahlen und Daten aussehen. Die Zeitzone entscheidet, welche Uhrzeit ein Zeitpunkt im Dokument zeigt.
Beides darfst du in der Anfrage angeben. Lässt du es weg, nimmt CRMS feste Rückfälle.
Woher die Sprache kommt
-
1Client→CRMSnennt
localein der Anfrage, etwade-CHIst sie gesetzt, gilt sie. -
2CIAShat für die laufende Anfrage eine Sprache gewähltIn dieser Reihenfolge: Claim
localeim Token, dann der HeaderAccept-Language, danncodamai.i18n.default-locale. CRMS liest selbst kein Token und keinen Header. -
3CRMSaußerhalb einer Anfrage:
codamai.i18n.default-localeErgebnis: die Sprache des Dokuments
Mit dieser Sprache sucht CRMS die passende Sprachvariante der Vorlage: erst genau de-CH, dann de, dann die Standardvariante der Vorlage. Wie das im Einzelnen geht, steht unter Wie CRMS die Vorlage findet. Welche Variante gegriffen hat, steht im Antwort-Header Crms-Template-Variant.
Zahlen und Daten formatiert CRMS immer in der angefragten Sprache, auch wenn eine Variante einer anderen Sprache gegriffen hat. Im PDF setzt CRMS die Sprache als lang an das <html>-Element, wenn die Vorlage keins setzt. Barrierefreie PDFs brauchen das.
Woher die Zeitzone kommt
-
1Client→CRMSnennt
timeZonein der Anfrage, etwaEurope/BerlinIst sie gesetzt, gilt sie. -
2CRMSliest die Umgebungsvariable
TZdes ContainersDieselbe Variable gilt für alle CodamAI-Module. Die POSIX-Form:Europe/Berlinist auch erlaubt. IstTZkeine bekannte Zeitzone, startet die Anwendung nicht. -
3CRMSohne
TZ: UTCErgebnis: die Zeitzone des Dokuments
Eine eigene Zeitzonen-Einstellung für CRMS gibt es nicht. Bei FINAL legt CRMS Sprache und Zeitzone mit dem Dokument ab.
Wie Werte im Dokument aussehen
Die Vorlage formatiert mit FreeMarker. Sprache und Zeitzone sind dabei schon gesetzt. Mit der Payload {"amount": 1234.5, "n": 1234567, "flag": true, "due": "2026-10-17", "at": "2026-10-17T08:30:00Z"}, due als DATE und at als DATETIME deklariert, und der Zeitzone Europe/Berlin kommt heraus:
| In der Vorlage | locale: de | locale: en |
|---|---|---|
${amount} | 1.234,5 | 1,234.5 |
${amount?string('0.00')} | 1234,50 | 1234.50 |
${amount?c} | 1234.5 | 1234.5 |
${n} | 1.234.567 | 1,234,567 |
${flag} | true | true |
${due} | 17.10.2026 | Oct 17, 2026 |
${due?string.long} | 17. Oktober 2026 | October 17, 2026 |
${due?string('dd.MM.yyyy')} | 17.10.2026 | 17.10.2026 |
${at} | 17.10.2026, 10:30:00 | Oct 17, 2026, 10:30:00 AM |
${at?string('dd.MM.yyyy HH:mm z')} | 17.10.2026 10:30 MESZ | 17.10.2026 10:30 CEST |
?cgibt eine Zahl ohne Formatierung aus, für Maschinen statt für Menschen. Das brauchst du etwa in Tabellenzellen, siehe Ausgabetypen und Formate.- Wahrheitswerte kommen immer als
trueoderfalse. Willst du „ja“ und „nein“, schreibe${flag?string('ja', 'nein')}. - Der Zeitpunkt
08:30Zerscheint als10:30, weil das Dokument inEurope/Berlingerendert wird. - Ein Kalenderdatum (
DATE) gilt als Mitternacht in der Zeitzone des Dokuments. Es verschiebt sich darum nicht auf den Vortag.