Skip to content

chore(i18n): backfill de/ru/fr fallbacks for social-media-dashboard + totality-festival#702

Closed
Sid-Qin wants to merge 2 commits intonexu-io:mainfrom
Sid-Qin:chore/i18n-backfill-social-media-dashboard-totality
Closed

chore(i18n): backfill de/ru/fr fallbacks for social-media-dashboard + totality-festival#702
Sid-Qin wants to merge 2 commits intonexu-io:mainfrom
Sid-Qin:chore/i18n-backfill-social-media-dashboard-totality

Conversation

@Sid-Qin
Copy link
Copy Markdown
Contributor

@Sid-Qin Sid-Qin commented May 6, 2026

Summary

PR #678 added the `social-media-dashboard` skill and the `totality-festival` design system to `skills/` and `design-systems/`, but didn't register them in any of the three localized content files. `main` has been red since the #678 merge — `e2e/tests/localized-content.test.ts` fails for `de` / `ru` / `fr` with:

```
AssertionError: skills display copy: expected
[ 'audio-jingle', 'blog-post', …(67) ]
to deeply equal
[ 'audio-jingle', 'blog-post', …(68) ]
```

This blocks CI on every open PR — for example PR #700 (the #691 OpenCode error-frame fix), which is daemon-only and has nothing to do with i18n. @lefarcen called this out in #700's review and suggested either backfilling the locale files or temporarily skipping the failing test. This PR takes the backfill path so main goes green for everyone.

Changes

Six entries across three files, all in the same shape as the existing pattern:

File Skill fallback Design-system fallback
`apps/web/src/i18n/content.ts` (DE) + `'social-media-dashboard'` + `'totality-festival'`
`apps/web/src/i18n/content.ru.ts` + `'social-media-dashboard'` + `'totality-festival'`
`apps/web/src/i18n/content.fr.ts` + `'social-media-dashboard'` + `'totality-festival'`

Why fallback rather than full localization

The codebase already has a documented "registered but not yet translated" pattern: the `_SKILL_IDS_WITH_EN_FALLBACK` / `_DESIGN_SYSTEM_IDS_WITH_EN_FALLBACK` arrays. 7 existing skills (the `orbit-` Orbit briefing templates, `html-ppt-taste-`, `web-prototype-taste-*`) and the bulk of the design systems are already handled this way in de/ru/fr. The picker falls back to the English title + summary at render time, so users still see something coherent.

Translations are deliberately left as a follow-up for whichever native speakers triage this surface — the EN fallback isn't "missing state," it's the documented contract for "registered, English-only for now." If maintainers want full de/ru/fr copy for these two entries, that's a separate PR with native review.

Test plan

  • `pnpm --filter @open-design/e2e exec vitest run tests/localized-content.test.ts` — 6/6 pass (was 3/6 before).
  • `pnpm --filter @open-design/web typecheck` — clean.
  • `pnpm --filter @open-design/web test` — 42 files / 309 tests pass.

After merge, PR #700's CI should auto-go-green on rebase and unblock its review.

… totality-festival

PR nexu-io#678 added the `social-media-dashboard` skill and the
`totality-festival` design system to `skills/` and `design-systems/`,
but did not register them in any of the three localized content files.
That left `e2e/tests/localized-content.test.ts` failing on `main` since
the merge of nexu-io#678:

  AssertionError: skills display copy: expected
    [ 'audio-jingle', 'blog-post', …(67) ]
    to deeply equal
    [ 'audio-jingle', 'blog-post', …(68) ]

`main` has been red since, blocking CI on every open PR (e.g. nexu-io#700).

Backfill follows the existing convention for skills/systems whose copy
hasn't been translated yet: register them in the per-locale
`*_SKILL_IDS_WITH_EN_FALLBACK` / `*_DESIGN_SYSTEM_IDS_WITH_EN_FALLBACK`
arrays, which makes the picker fall back to the English title and
summary at render time. This matches how 7 existing skills (orbit-*,
html-ppt-taste-*, web-prototype-taste-*) and the bulk of the design
systems are already handled in de/ru/fr.

Translations are deliberately left as a follow-up for whichever native
speakers triage this surface — the EN fallback is the documented
pattern for "registered but not yet translated", not a missing piece
of state.

Verified locally:
- `pnpm --filter @open-design/e2e exec vitest run tests/localized-content.test.ts`
  — 6/6 tests pass (was 3/6 before).
- `pnpm --filter @open-design/web typecheck` — clean.
- `pnpm --filter @open-design/web test` — 42 files / 309 tests pass.
@lefarcen lefarcen self-requested a review May 6, 2026 15:19
@lefarcen lefarcen added the i18n Internationalization & localization label May 6, 2026
@lefarcen
Copy link
Copy Markdown
Contributor

lefarcen commented May 6, 2026

Hi @Sid-Qin! 🎉

Thanks for the contribution — this is the perfect fix for the CI blockage. The surgical approach (adding two fallback entries per locale) matches the existing pattern exactly, and your rationale about deferring full translation to native speakers is spot-on.

I will run a deep review and get back to you within 24h.

Thanks for making open-design better!
— open-design team

Copy link
Copy Markdown
Contributor

@lefarcen lefarcen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @Sid-Qin — great fix! ✅

This is a textbook i18n fallback patch: both social-media-dashboard and totality-festival are alphabetically placed, match their source resource files, and the EN_FALLBACK pattern is the documented approach for "registered, English-only for now." The rationale about deferring full translations to native speakers is solid — placeholder translations would be worse than explicit fallback, and this unblocks CI immediately.

Verified:

  • TypeScript typing correct (as const preserved)
  • IDs match skills/social-media-dashboard/SKILL.md and design-systems/totality-festival/DESIGN.md
  • Test path e2e/tests/localized-content.test.ts is the right one
  • Pattern consistent with existing orbit-* / html-ppt-taste-* entries

Looks good to me; deferring final approval to a maintainer.

@Sid-Qin
Copy link
Copy Markdown
Contributor Author

Sid-Qin commented May 6, 2026

Heads-up on the failing CI run — the locale fix in this PR works as intended; the failure is on a separate, pre-existing Playwright UI flake that was previously masked by the very gap this PR closes.

Concretely:

  • `e2e/tests/localized-content.test.ts` (the test this PR was opened to fix) now passes 6/6 in CI ✅. Verified in run 25444327294.
  • CI then proceeds further than before and trips on a Playwright UI test:
    `e2e/ui/project-management-flows.test.ts` line 87 — `getByTestId('design-system-trigger')` not visible within 10s timeout.
  • That UI test failure is not caused by this change — this PR only edits three i18n content arrays. There's no path from those entries to the design-system trigger DOM element.
  • It was previously masked because every `main` CI run since feat(skills): add social-media-dashboard skill + Totality Festival design system #678 stops at the localized-content failure before reaching the Playwright suite (verified in run 25439792101 on `9af2886` and run 25444078323 on `576dfed`).

I just pushed an empty commit (`5f93cfd`) to trigger a fresh CI run. If the Playwright failure repeats in the same spot, it's a real second issue that deserves its own investigation — not a blocker for this i18n backfill, which is the documented fix for the actual breakage.

Happy to spin up a follow-up issue / diagnostic PR for the design-system-trigger UI test once we have CI re-run signal. Either way, this PR's diff is exactly what @lefarcen reviewed — flagging it for a maintainer to admin-merge if the Playwright flake repeats.

Copy link
Copy Markdown
Contributor

@mrcfps mrcfps left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Sid-Qin I reviewed the three localized content fallback updates for de/ru/fr and verified that the new social-media-dashboard skill plus totality-festival design-system IDs match the existing English-fallback pattern and their resource directories. This is a focused, maintainable fix for the localized-content coverage gap; thanks for unblocking the i18n CI path so carefully 🙌

Generated by Looper 0.6.1 · runner=reviewer · agent=opencode

@mrcfps
Copy link
Copy Markdown
Contributor

mrcfps commented May 6, 2026

Heads up @Sid-Qin#697 now includes the same i18n fallback-list fix for social-media-dashboard and totality-festival across de/ru/fr, because that PR needed a push to unblock CI anyway.

If #697 lands first, this PR becomes duplicate and can be closed. If maintainers prefer merging this standalone i18n fix first, we can rebase/drop the duplicate fallback changes from #697 afterward. Thanks for isolating the root cause here.

@Sid-Qin
Copy link
Copy Markdown
Contributor Author

Sid-Qin commented May 6, 2026

Thanks @mrcfps 🙏 — totally fine with #697 landing first; the i18n surface coverage is identical and getting CI back to green is the goal. Once #697 merges I'll close this PR as duplicate.

Two side notes from chasing this thread that might be useful for the next person:

  1. The Playwright UI failure is a real flake, not a real bug. Same `project-management-flows.test.ts` line 87 `design-system-trigger` 10s-timeout failure showed up on both #702 retry and #697's first run, but Fix: Remove element selector tooltip in Tweaks mode #697's second run passed cleanly. The element exists in source (`apps/web/src/components/NewProjectPanel.tsx:1262`) but the test polls before the design-systems fetch resolves on slow runners — this test would benefit from an explicit `page.route('**/api/design-systems', ...)` mock in the per-test setup (the existing `beforeEach` at line 37 only mocks `/api/agents`).

  2. The masked-flake pattern is worth noting. Until this fix series, every PR's CI stopped at `localized-content.test.ts` and never reached the Playwright UI suite — which is why the design-system-trigger flake went undetected. Whoever lands Fix: Remove element selector tooltip in Tweaks mode #697 will get one extra layer of e2e signal back.

Happy to spin a follow-up that hardens the Playwright setup, but only if it's wanted as a standalone — not blocking anything here.

@mrcfps
Copy link
Copy Markdown
Contributor

mrcfps commented May 6, 2026

#697 has now been merged, and it includes the same de/ru/fr fallback coverage for social-media-dashboard and totality-festival that this PR added.

Because that fix is already on main, I’m going to close this PR as duplicate rather than merge the same follow-up twice. Thank you for isolating the root cause and opening the standalone unblocker — it was helpful for confirming the right fix.

The Playwright/design-system-trigger flake you found is still worth hardening separately; contributions there are very welcome if you’d like to spin up a focused follow-up PR.

@mrcfps
Copy link
Copy Markdown
Contributor

mrcfps commented May 6, 2026

Closing as duplicate of #697, which has already merged the same i18n fallback fix. Thanks again for the contribution.

@mrcfps mrcfps closed this May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

i18n Internationalization & localization

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants