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: StatusForm wraps 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-61 and :105-107, translations/untranslated.txt:11, with the list builder at modules/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_review ships 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; compare language/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:715 and :719, modules/orchestra_ui/src/Form/WorkflowMigrateForm.php:70 and :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 at src/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

Command icon 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

mably created an issue. See original summary.

mably’s picture

Status: Active » Needs review

  • mably committed 88ae0870 on 1.x
    fix: #3620615 Strings that cannot be translated, and the check that...
mably’s picture

Status: Needs review » Fixed

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.