Skip to content

feat(design): the portal's words - #850

Closed
mortondev wants to merge 3 commits into
feat/portal-design-v2-phase4-home-defaultfrom
feat/portal-design-v2-phase4-words
Closed

mortondev wants to merge 3 commits into
feat/portal-design-v2-phase4-home-defaultfrom
feat/portal-design-v2-phase4-words

Conversation

@mortondev

@mortondev mortondev commented Oct 31, 2026 •

Copy link
Copy Markdown
Member

The seventeenth of the stack that builds a new design engine for the portal, and the fifth of phase 4. A workspace chooses what visitors call what they post (Idea, Post, Feature request or Suggestion) and what groups them (Board or Category), and the portal, the widget and the unsubscribe page say it, in every language. Behind the portalDesignV2 flag; with it off, the portal says idea and board.

Brand › Words

Two rows of tiles in Appearance, each tile with a sentence the portal would say: "What's your suggestion?", "All categories". The preview shows the choice before it is published, Home's blocks take its name in Sections ("Top suggestions"), and Review and publish names the change.

After a change, Appearance finds the menu labels and English headlines that still name the old word, such as a Feedback tab labelled "Ideas", and offers to update them in the same draft ("Update them" or "Keep them"). It keeps each one's capitals and puts a or an before the new noun.

How messages take the words

  • 112 visitor strings that name the thing posted or its group became ICU selects on postWord and boardWord. For example {postWord, select, post {What's on your mind?} feature_request {What should we build?} suggestion {What's your suggestion?} other {What's your idea?}}. The default words, idea and board, are each select's other, so a missing word always reads as the default.
  • 30 strings that say the words in another sense stay as they were: posting as a verb, the comment form's Post button, Feedback as a label that suits every word, and an incident being posted.
  • No call site passes the words. PortalWordsIntl (in use-intl-setup.ts, which every page already loads) re-provides the intl above it with the words merged into every message's values, a call's own values first. The portal layout, the unsubscribe page and the widget set the published words; the preview listener sets the draft's; the admin and onboarding set post and board, so a portal string shown in the admin keeps the admin's words. Every provider nested below one of these applies the words again.
  • usePortalWords() reads them anywhere.

Translation

All 12 other catalogues have every choice. Each language first fixed one noun per choice, anchored on the terms its translator already uses (Polish keeps "zgłoszenie"-style wording; Spanish and French keep "categoría" and "catégorie" for board, so category is "sección" and "rubrique"). Then the strings were drafted with the workspace's translation model and checked: each parses, keeps its placeholders, and has every branch. I read samples in each language.

Guards

  • locales/__tests__/portal-words.test.ts: any English visitor string that names an idea, a post or a board without the select fails, unless it is one of the 30 kept with reasons. In every catalogue, each word message formats every choice without error, the four post choices read differently, so do the two board choices, and an unknown word reads as the default.
  • Placeholder parity: the existing check (locale-parity.test.ts) read a select branch's first word as a placeholder; it now parses each message.

Also

  • The end-to-end tests and the perf journeys find the portal in its default word: Idea title, No ideas match your filters, Idea submitted.

  • The notification parity check formats as the admin does: a stored notification row says a post, and the portal's bell words it in the portal's word.

  • The Boards settings page says what visitors see where it differs from the admin's words: "Visitors see suggestions and categories".

Performance

The English for each converted string, every choice included, is in the code, where English pages read it. Dropping each select's explicit idea and board branches, which other already says, cut that by a fifth. The full bench then held every request count; only the post page and the three journeys that open one went over their script ceilings, by about 0.5 KB, and take their readings (459.6 and 68.8 KB). The words themselves live in use-intl-setup.ts, which every page already loads, so no new chunk appears.

Verification

  • Kiln (no Home), with Playwright: chose Suggestion and Category in Brand › Words. The preview's feed said "What's your suggestion?", "All suggestions" and "All categories" before publishing, and the offer caught Kiln's subtitle "Ideas, bugs and wishes for our games." Review named both words. After publishing, the live feed asked "What's your suggestion?" in English and "Was ist dein Vorschlag?" in German, the Boards settings said "Visitors see suggestions and categories", and no page showed a raw select or logged a format error.
  • Juniper (Home on): the same, plus Home's block names in Sections ("Top suggestions") and the live Home in English and French ("Top suggestions", "Suggestions populaires", "Quelle est votre suggestion ?").
  • New tests, each checked by breaking the code it covers: the words reach a message formatted or rendered, through a nested provider, with a draft's words over the published ones and a call's own values first; the preview hands the page a draft's words; Brand › Words sets both words and offers, applies or keeps the rewording, with a or an fixed; Home's blocks named by the word; the unsubscribe page in the workspace's word; the Boards hint; review names; and the catalogue guards above.

@mortondev
mortondev added this pull request to stack #833 October 31, 2026 04:36
A workspace chooses what visitors call what they post (Idea, Post, Feature
request or Suggestion) and what groups them (Board or Category), and the
portal, the widget and the unsubscribe page say it in every language.

- Brand > Words in Appearance: a tile per choice with a sentence the portal
  would say. The preview shows it before publishing, Home's block names
  follow it, and the menu labels and English headlines that still name the
  old word are offered for rewording in the same draft.
- 112 visitor strings select on postWord and boardWord, with idea and board
  as each select's other branch; 30 that use the words another way stay.
  PortalWordsIntl passes the words into every message, so no call site
  changes: the portal, unsubscribe and widget set the published words, the
  preview the draft's, and the admin and onboarding keep post and board.
  Each nested provider applies them again.
- All 12 other catalogues word every choice, each language with one noun
  per choice anchored on its translator's terms.
- A guard fails an English visitor string that names a post or board
  without the select, and any catalogue whose choices fail to format, read
  alike, or miss the default. The placeholder parity check now parses
  messages, since a select branch's first word is not a placeholder.
- The Boards settings say what visitors see where it differs from the
  admin's words.

The English of each converted string, every choice included, lives in the
code, so the post page's script ceilings take their new readings.
A notification row is stored in the admin's words, a post and a board, and
the bell words it again in the reader's: the portal's own word there. The
parity check now formats as the admin does.
The portal now says idea by default: the composer's field is Idea title,
the empty filter state says No ideas match your filters, and a new post's
toast says Idea submitted.
@mortondev

Copy link
Copy Markdown
Member Author

Condensed into #879. The stack is now five PRs, #878 to #882; this branch is kept as it was.

@mortondev mortondev closed this Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant