fix(l10n): 27 Dutch strings that never reached the browser - #296
Merged
Conversation
versioniq shipped l10n/nl.json and no l10n/nl.js. Nextcloud reads the .json server-side for PHP $l->t(); the browser only ever sees the OC.L10N.register() call in the .js. All 27 Dutch translations were therefore inert in the frontend. Fourth and last instance of a gap measured across all 21 fleet apps: zaakafhandelapp (637 keys), nextcloud-app-template (38 catalogues), thematiq (209 keys) and this one. Every other app already ships both halves. The generator is petstore's build-l10n-js adopted unchanged, EXCEPT for its extension. This package.json declares "type": "module", so a CommonJS .js is loaded as ESM and dies on its first require(). The file is .cjs here; the other three apps do not set a type and keep .js. Verified: nl.js written with 27 keys, the register call names versioniq read from appinfo/info.xml, the file parses under node --check and is 3710 bytes rather than empty, and check:l10n-js exits 0.
Contributor
Author
|
Refining one line in the description, because the mechanism is worth stating precisely. I wrote that the
So the accurate claim is: the JSON path is real but unreliable, the |
Contributor
Quality Report — ConductionNL/versioniq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| composer | ✅ | ✅ 29/29 | |||
| npm | ✅ | ✅ 310/310 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | 🚨 NO VERDICT — enabled but never ran | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-30 17:28 UTC
Download the full PDF report from the workflow artifacts.
rubenvdlinde
added a commit
that referenced
this pull request
Aug 31, 2026
The settings panel rendered entirely in English on a Dutch account: Apps,
History, Sources, Tokens, Trusted sources, Discover, Artifact cache, Automatic
updates, Security advisory checks. Every one of those was ABSENT from the
catalogue, not mistranslated.
Measured with a scanner that catches this.t( and $t( as well as bare t(, since
a naive pattern under-reports Options-API components:
distinct t('versioniq', ...) keys in src/ 181
already in nl.json 25
missing 156
All 156 translated. en.json did not exist at all and is added as identity, so
the pair matches the rest of the fleet and check:l10n-js has both halves to
compare.
This is a SEPARATE gap from the missing-.js fault fixed in #296. That one made
27 existing translations unreachable by the browser; this one is that the other
156 strings were never written. Fixing the artefact could not have revealed
them, because before #296 all 181 rendered English identically.
Placeholders are preserved exactly ({hours}, {minutes}, {level}, {source},
{min}, {max}, {forge}, {days}, {version}, {user}, {date}, {size}, {keep},
{pattern}, {count}) -- verified programmatically, 0 mismatches.
No em-dashes in the Dutch, per the writing skill's voice rules, even where the
English source uses them; those become a colon or a full stop.
Verified: check:l10n-js exits 0 with en.js 156 keys and nl.js 183; the file the
browser loads was fetched from the running server and carries the Dutch.
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
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.
versioniq shipped
l10n/nl.jsonand nol10n/nl.js. Nextcloud reads the.jsonserver-side for PHP$l->t(); the browser only ever sees theOC.L10N.register()call in the.js. So all 27 Dutch translations were inert in the frontend.Fourth and last instance of the same gap, measured across all 21 fleet apps on
development: zaakafhandelapp (637 keys, #554), nextcloud-app-template (38 catalogues, #186), thematiq (209 keys, #493) and this one. Every other app already ships both halves.One difference worth noting
The generator is petstore's
build-l10n-jsadopted unchanged except for its extension. Thispackage.jsondeclares"type": "module", so a CommonJS.jsis loaded as ESM and dies on its firstrequire():So the file is
.cjshere. The other three apps do not set atypeand keep.js. Worth knowing before this travels to any other repo.Verification
nl.jswritten with 27 keys; the register call namesversioniq, read fromappinfo/info.xml.node --checkand is 3,710 bytes rather than empty — an empty file passesnode --check, so size was checked separately.check:l10n-jsexits 0.🤖 Generated with Claude Code