Problem
Translation defects, and the tooling gap that hid them: a form whose palette words can never enter a catalog, shipped templates with translated subjects and untranslated bodies, recipients always mailed in English, and a per-project translations check whose comparison is a bare substring test.
8 findings: 1 high, 7 med.
High severity
The translations check's "misfiled" half is vacuous for short strings, and five real orphans are already hiding behind it
Where: scripts/check-translations.php:288-296
The haystack is every one of a project's own files concatenated and whitespace-flattened, and the test is a bare substring match. A short catalog entry therefore matches an identifier, or a substring of a longer sentence, so the direction the file's own docblock exists for, "an entry in the catalog whose text appears in none of the project's own files" (lines 24-26), never fires for anything short. Five real orphans are already invisible: Script matches inside "JavaScript", plus Hold, By variable, Review, and a Do entry in the orchestra_ui catalog with no source string anywhere in the repository. This is the exact failure mode the allow-list and the translations CI job were built to close, so a green run from that job is not evidence.
The rest
One line each: what it is, and where. The failing scenario and the fix for each are carried by its own commit.
- med The check is also blind to the one bug it would most want to catch:
StatusFormwraps a runtime value in a translation call, so the translatable source string is the placeholder itself and the five palette words enter no catalog. The allow-list entry for that placeholder, correct for the genuinely placeholder-only strings beside it, is what hides this one.modules/orchestra_ui/src/Form/StatusForm.php:55-58,src/Entity/Status.php:55-61and:105-107,translations/untranslated.txt:11, with the list builder atmodules/orchestra_ui/src/ListBuilder/StatusListBuilder.php:39 - med The catalog reader cannot see a wrapped msgid, so a catalog re-wrapped by msgcat, Poedit or localize.drupal.org reports every long string missing and exempts it from the misfiled check. The repository only survives because its catalogs are hand-kept unwrapped.
scripts/check-translations.php:262-270 - med
example_reviewships no French config override, and no example translates a node's action label or its outcome labels.modules/orchestra_examples/config/install/language/fr/holds 14 files but none for that workflow; comparelanguage/fr/orchestra.orchestra_workflow.example_exclusive.yml:1-13 - med An account-less recipient, the email and email-by-variable audiences, is always mailed in English whatever the site's default language, contradicting the README's "each rendered in that recipient's own language".
modules/orchestra_mail/src/EventSubscriber/NotificationMailSubscriber.php:80,96,105,130 - med The shipped Easy Email templates have translated subjects and untranslated bodies, which the per-project check cannot see because it excludes shipped config.
modules/orchestra_easy_email/config/install/ - med Five operator-facing count messages use a count placeholder in a non-plural translation call with an "(s)" suffix, in a module that ships French.
modules/orchestra_ui/src/Controller/OrchestraUiController.php:715and:719,modules/orchestra_ui/src/Form/WorkflowMigrateForm.php:70and:116,modules/orchestra_ui/src/Form/InstanceListForm.php:264 - med The status palette's five human names can never be translated at all, because they are plain strings in a constant rather than translatable markup.
src/Entity/Status.php:55-61, return type atsrc/StatusInterface.php:48
Remaining tasks
- Fix the findings above, one commit per finding where they are independent.
- Make the misfiled check word-aware rather than a substring test, and teach it to read a wrapped msgid, then re-run it and clear whatever it newly reports.
- Treat a translation call whose entire content is a single placeholder as a finding rather than an allow-list hit.
- Add or correct a test for every behaviour change.
- Run every linter and the affected test classes before pushing.
This issue summary was drafted with the assistance of an AI agent (Claude). The analysis and the wording were reviewed by me before posting, and accountability for the content is mine.
Issue fork orchestra-3620615
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commented