You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Sessions now carry a language. The flow engine collapses `{ sv, en }` text
maps in a step's `with` block into a plain string for that language, so a
step declaring `title: "string"` accepts either form in YAML without any
per-step schema change. Steps that generate text in code get `ctx.language`
plus `resolveLocalized`.
The language is chosen on a new `base:selectLanguage` step, placed first in
stepConfig.pre-checkin.yml. Its screen is deliberately bilingual - at that
point we don't know what the user reads. Going back and switching re-resolves
the rest of the flow.
On the client the language rides along on `session:info` into a LanguageContext,
where screens localize their own hardcoded strings through a small
`useTranslations(dict)` helper in plugin-api (no i18n framework). The link
landing page renders before the socket authenticates, so it is bilingual
rather than guessing a locale.
Also resolves data source and subgroup names server-side, so they travel as
plain strings instead of locale maps the client has to pick `.sv` from.
The on-site kiosk flow is untouched: it has no selectLanguage step and stays
Swedish.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: packages/backend/config/stepConfig.pre-checkin.yml
+43-12Lines changed: 43 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,11 @@
1
+
# Pre-checkin runs in a browser, opened from a link sent to the kår. Text is
2
+
# authored per language as `{ sv, en }` maps; the flow engine collapses those to
3
+
# a single string for the language the user picks in the first step.
1
4
steps:
5
+
# Must stay first: every step after it gets its text resolved in the chosen
6
+
# language. The screen itself is bilingual, so it needs no text config.
7
+
- uses: base:selectLanguage
8
+
2
9
- uses: base:identify
3
10
id: identify
4
11
with:
@@ -9,11 +16,17 @@ steps:
9
16
# Pre-checkin runs in a browser without a card reader, so the start screen
10
17
# must not mention scanning. Manual entry is the only path here, hence the
11
18
# larger button and the hidden scanner callout/arrow.
12
-
title: Identifiera dig
13
-
description: Ange ditt person- eller medlemsnummer för att komma igång.
19
+
title:
20
+
sv: Identifiera dig
21
+
en: Identify yourself
22
+
description:
23
+
sv: Ange ditt person- eller medlemsnummer för att komma igång.
24
+
en: Enter your social security or membership number to get started.
14
25
hideCallout: true
15
26
hideScannerArrow: true
16
-
manualEntryLabel: Ange person- eller medlemsnummer
27
+
manualEntryLabel:
28
+
sv: Ange person- eller medlemsnummer
29
+
en: Enter social security or membership number
17
30
largeManualEntryButton: true
18
31
19
32
- if: |
@@ -24,16 +37,22 @@ steps:
24
37
}}
25
38
uses: base:block
26
39
with:
27
-
title: "Du kan inte checka in"
28
-
message: "Endast ledare kan checka in deltagare."
40
+
title:
41
+
sv: "Du kan inte checka in"
42
+
en: "You cannot check in"
43
+
message:
44
+
sv: "Endast ledare kan checka in deltagare."
45
+
en: "Only leaders can check in participants."
29
46
30
47
- uses: base:deduplicateSession
31
48
with:
32
49
force: resume
33
50
34
51
- uses: base:selectSubjects
35
52
with:
36
-
description: Välj vilka du vill checka in. Avmarkera de som inte är på plats.
53
+
description:
54
+
sv: Välj vilka du vill checka in. Avmarkera de som inte är på plats.
55
+
en: Select who you want to check in. Deselect anyone who isn't here.
37
56
38
57
# Lists the selected subjects that are "ledarfunktionärer" (a distinct fee,
39
58
# mapped to the `leaderstaff` subGroup in dataSourceConfig.yml) with an
@@ -42,8 +61,12 @@ steps:
42
61
- uses: base:filterSubjects
43
62
with:
44
63
filter: "participant.subGroup == 'leaderstaff'"
45
-
title: "Ledarfunktionärer"
46
-
message: "Följande personer är anmälda som ledarfunktionärer. Ledarfunktionärer bor och äter med er kår, men arbetar som funktionärer på lägret och deltar alltså inte på programpass med kåren. Kontrollera noggrant att alla personer i listan är medvetna om detta, och att ingen ledarfunktionär saknas i listan. Om något inte stämmer fortsätter ni med incheckningen och meddelar oss när ni checkar in på plats."
64
+
title:
65
+
sv: "Ledarfunktionärer"
66
+
en: "Leader staff"
67
+
message:
68
+
sv: "Följande personer är anmälda som ledarfunktionärer. Ledarfunktionärer bor och äter med er kår, men arbetar som funktionärer på lägret och deltar alltså inte på programpass med kåren. Kontrollera noggrant att alla personer i listan är medvetna om detta, och att ingen ledarfunktionär saknas i listan. Om något inte stämmer fortsätter ni med incheckningen och meddelar oss när ni checkar in på plats."
69
+
en: "The following people are registered as leader staff. Leader staff sleep and eat with your scout group, but work as staff at the camp and therefore do not take part in the group's programme activities. Check carefully that everyone in the list is aware of this, and that no leader staff is missing from the list. If something is not right, continue with the check-in and let us know when you check in on site."
47
70
whenEmpty: skip
48
71
49
72
# Informational (never blocks): shows the checking-in leader which of the
@@ -63,13 +86,21 @@ steps:
63
86
safeFromHarmValidYears: 3
64
87
criminalRecordExtractValidYears: 3
65
88
checkDate: "2026-08-01"
66
-
title: "Ledare som saknar krav"
67
-
message: "Följande ledare har inte giltigt Trygga Möten och/eller registerutdrag registrerat i Scoutnet. Ni som kår ansvarar själva för att säkerställa att samtliga ledare har uppvisat giltigt Trygga Möten-intyg samt utdrag ut polisens belastningsregister."
89
+
title:
90
+
sv: "Ledare som saknar krav"
91
+
en: "Leaders missing requirements"
92
+
message:
93
+
sv: "Följande ledare har inte giltigt Trygga Möten och/eller registerutdrag registrerat i Scoutnet. Ni som kår ansvarar själva för att säkerställa att samtliga ledare har uppvisat giltigt Trygga Möten-intyg samt utdrag ut polisens belastningsregister."
94
+
en: "The following leaders do not have a valid Safe from Harm (Trygga Möten) certificate and/or criminal record extract registered in Scoutnet. Your scout group is itself responsible for making sure that every leader has presented a valid Safe from Harm certificate and an extract from the Swedish police criminal records."
68
95
69
96
- uses: base:markPreliminaryCheckedIn
70
97
required: true
71
98
72
99
- uses: base:message
73
100
with:
74
-
title: Tack!
75
-
message: Nu är du klar för tillfället. Glöm inte att skicka en ledare med lite koll till infotältet på Hjärtat för att slutföra incheckningen och hämta er kårpåse med märken och annat kul när ni väl är på lägerområdet!
101
+
title:
102
+
sv: Tack!
103
+
en: Thank you!
104
+
message:
105
+
sv: Nu är du klar för tillfället. Glöm inte att skicka en ledare med lite koll till infotältet på Hjärtat för att slutföra incheckningen och hämta er kårpåse med märken och annat kul när ni väl är på lägerområdet!
106
+
en: You are done for now. Once you are on the camp site, don't forget to send a leader who is up to speed to the info tent at Hjärtat to complete the check-in and pick up your group bag with badges and other fun things!
0 commit comments