fix(setup-wizard): translate the body and the tab labels, not just the heading - #871
Merged
rubenvdlinde merged 1 commit intoAug 31, 2026
Merged
Conversation
…e heading A setup wizard on a Dutch instance rendered "Welkom" over an English paragraph, between a translated Annuleren and Volgende. That reads as a bug rather than as a missing string, and the app could not fix it from its side. `stepTitle()` was routed through `cnTranslate` and everything else was not: - `step.body` was interpolated verbatim in FOUR places (info, choice, config-fields, run-action) - `wizardSteps()` used `s.title` raw for the tab strip, so the same string was translated inside the step and untranslated in the tab above it - `optionsFor()` returned option labels raw, so a `choice` step listed its options in English Measured on decidiq (2026-08-30), which stopped planting 334 unchosen objects on install and now asks which example set to load. It shipped correct Dutch for every one of those strings in l10n/nl.json. The heading picked it up; the question, the options and the explanation did not, because this component never asked. So `stepBody()` mirrors `stepTitle()`, the tab strip uses `stepTitle()`, and option LABELS are translated while option VALUES are not: `scalarChoice()` reads `.value` and that is what reaches `POST /api/setup/config`, so translating a label cannot change what gets stored. Verified: 21 CnSetupWizard tests pass, four of them new and each failing before this change. Full suite 6997/6997.
Contributor
Quality Report — ConductionNL/nextcloud-vue @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ⏭️ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ⏭️ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ⏭️ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| test | ✅ | ||||
| check-build | ✅ | ||||
| check-public-safe | ✅ | ||||
| check-docs | ✅ | ||||
| check-jsdoc | ✅ | ||||
| check-integration-parity | ✅ | ||||
| check-peers | ✅ | ||||
| check-docs-fresh | ✅ | ||||
| check-a11y | ✅ | ||||
| check-smoke | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| composer | ✅ | ✅ | |||
| npm | ✅ | ✅ 556/556 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ⏭️ | ||||
| REUSE | ✅ | ||||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ | ||||
| Hydra gates | ⏭️ |
Quality workflow — 2026-08-30 23:12 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A setup wizard on a Dutch instance rendered "Welkom" over an English paragraph, between a translated Annuleren and Volgende. That reads as a bug rather than as a missing string, and the consuming app could not fix it from its side.
stepTitle()was routed throughcnTranslateand everything else was not:step.bodywas interpolated verbatim in four places (info,choice,config-fields,run-action)wizardSteps()useds.titleraw for the tab strip, so the same string was translated inside the step and untranslated in the tab above itoptionsFor()returned option labels raw, so achoicestep listed its options in EnglishHow it was found
Measured on decidiq (2026-08-30), which stopped planting 334 unchosen objects on install and now asks which example set to load (decidiq#1024). It shipped correct Dutch for every one of those strings in
l10n/nl.json. The heading picked it up; the question, the options and the explanation did not, because this component never asked for them.This is the same shape as #863 ("widget titles never asked the host catalogue"): translation here is per-field, and a field nobody routed is a field that can never be localised.
What changes
stepBody()mirrorsstepTitle(), and the four raw interpolations use itstepTitle()That last split is deliberate:
scalarChoice()reads.value, and that is what reachesPOST /api/setup/config, so translating a label cannot change what gets stored. Translating the value would.Verification
Each new test fails without the change:
🤖 Generated with Claude Code