[Website] i18n module, page-local sections, translatable copy (#21082)

**i18n** — collapsed the ~22 scattered i18n files into a single module
and turned on Spanish alongside French.

**Sections** — dropped the old compound pattern (`Section.Root`,
`Section.Heading`, …). Reusable layout shells moved to `src/templates/`,
atomic bits stay in `design-system/`, and each page now owns its copy in
local `_components` blocks instead of pulling it out of shared sections.
Data files hold arrays only, no prose.

**Copy → `<Trans>`** — A lot of headings were split across several
`<HeadingPart>`s just for font styling, which meant each piece was a
separate translation string. A translator got "Build your Enterprise
CRM" and "at AI Speed" as two unrelated strings and had no way to
reorder them for their language. Those are now single `<Trans>` units
with placeholders. Same idea for the old `\n` + `white-space: pre-line`
line-break trick: replaced with a small `ResponsiveLineBreak` element so
the break is doesn't quietly rot, and did a dead-code pass.

The de-fragmentation changes the message IDs, so around 60 strings will
fall back to English in fr/es until Crowdin re-syncs.
This commit is contained in:
Abdullah.
2026-05-31 17:39:35 +05:00
committed by GitHub
parent fc90b4ba8b
commit b027e4bdb1
222 changed files with 2610 additions and 3057 deletions
@@ -1,10 +0,0 @@
import { Divider } from './Divider';
import { EmptyMessage, Root } from './Root';
import { ReleaseEntry } from './ReleaseEntry';
export const ReleaseNotes = {
Divider,
EmptyMessage,
ReleaseEntry,
Root,
};
@@ -1 +1,6 @@
export { ReleaseNotes } from './components';
export {
Root as ReleaseNotesSection,
EmptyMessage as ReleaseNotesEmptyMessage,
} from './components/Root';
export { Divider as ReleaseNotesDivider } from './components/Divider';
export { ReleaseEntry as ReleaseNotesReleaseEntry } from './components/ReleaseEntry';