Deploy v11.15.0#18820
Conversation
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
Co-Authored-By: Gemini <gemini@google.com>
…-quiz i18n: translation pipeline (all languages)
Third batch of #18742, per the #18749 recipe: Nav (mobile menu, theme toggle, useNavigation), Search, LanguagePicker, TableOfContents, and Breadcrumbs move to a namespace-bound useTranslations("common") - 15 files, all plain common keys. This unifies the nav label path: CrawlableNav already fed buildNavigation a namespace-bound getTranslations("common") on the server while useNavigation passed the legacy wrapper's raw-returning t on the client; both sides now share identical semantics. Also fixes a live missing-key bug: the search modal and mobile menu lazy-load error states called t("loading-error"), a key that exists in no catalog, rendering the literal string "loading-error". They now use the existing loading-error-refresh key, translated in all 25 locales. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Netlify deploy failed in 65s (infra-speed failure, no build log access); empty commit to rebuild. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
The batch transform prepended the next-intl import above the use client directive in seven client components; prettier then rewrote the displaced directive into a no-op expression statement, silently stripping client-boundary semantics. Restores the directive as the first statement in all affected files. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Fourth batch of #18742 per the #18749 recipe: Layer2NetworksTable (6 files, page-layer-2-networks) and ProductTable (3 files, table / page-wallets-find-wallet). One colon-form ICU call in PresetFilters drops its now-redundant namespace prefix; the dynamic maturity-label template key resolves only to verified plain-text label keys. FindWalletProductTable is deliberately excluded from this batch: PR 18702 rewrites that subtree (find-wallet INP rebuild) and 18715 touches it too - it migrates after those land. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Fifth batch of #18742 per the #18749 recipe: 28 self-contained components and hooks across src/components and src/hooks move to namespace-bound useTranslations (page-assets, page-get-eth, page-energy-consumption, page-developers-tutorials, page-layer-2-networks, page-staking, common). All literal keys pre-verified plain text in the catalogs. One cross-namespace dynamic key in useCentralizedExchanges (common:region-<code>) becomes a second binding. AssetDownload used the array namespace form useTranslation(["page-assets"]) - first-element semantics preserved by the single binding. Deferred from this batch: ui/swiper.tsx (PR 18698 fixes its missing a11y keys and touches the same file) and Translation.tsx (raw-message dispatch moves into it in the final hook-deletion PR). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Sixth batch of #18742 per the #18749 recipe, covering the six colon/dynamic-heavy files: SideNav, SideNavMobile, DocsNav (page-developers-docs bindings; dynamic docs-nav ids unchanged), History/NetworkUpgradeSummary (page-history; colon prefixes dropped, including three literals routed through blockTypeTranslation), MergeArticleList (all 16 calls were explicit page-upgrades-index colon keys, so the array-namespace hook collapses to a single binding), and MergeInfographic (page-upgrades-index + tCommon in the infographic, page-upgrades in the aria-label wrapper). SideNav's root nav component now binds only common (its page-developers-docs binding became unused once the aria-label moved to tCommon). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Neither component has an importer anywhere in src/ or app/ - both were orphaned in the what-is-ethereum redesign and reference ten page-what-is-ethereum-* keys that no longer exist in any catalog (they surfaced as missing-key call sites in the #18742 audit). Deleting rather than migrating dead code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Seventh batch of #18742 per the #18749 recipe: 16 page-scoped _components move to namespace-bound useTranslations. Cross-namespace common: keys (show-more, quizzes-title) get tCommon bindings; same-namespace colon prefixes drop (LatestArticlesGrid's six, incl. the two ICU count messages which stay cooked); UserStories and CommunityStories keep only tCommon since their page binding became unused. Deferred: roadmap ReleaseCarousel.tsx - PR 18734 (Embla RTL fix) rewrites it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
All 24 non-English page-get-eth catalogs carried an <a href> tag in page-get-eth-description that the English source never had; the call site renders the message cooked, so production /get-eth/ shows the escaped tag as literal text in every translated locale (caught by the #18742 sweep calibration). Tag stripped, translated text preserved, English side unchanged so the manifest mappings stay valid. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
feat(ui): intrinsic sizing for markdown video via #WxH src fragment
i18n: translation pipeline, wallet simulator (all languages)
Fix find-wallet filter sidebar UI bugs
Enable wallet simulator for all locales
feat(apps): add subcategory prop to CategoryAppsGrid
Blobscan's API failed 124 of ~720 hourly fetch-blobscan-stats runs (~17%) over the last 30 days, all with 503s, including multi-day outages. growthepie's da_fundamentals.json provides the same metrics (all-time blob count and average blob fee derived from total fees paid) from a source the data layer already depends on. The storage key is unchanged so the stored value carries over with no gap. The task moves from the hourly to the daily schedule to match growthepie's daily update cadence.
The task id and storage key no longer reference Blobscan. Requires triggering the daily-data-fetch task once after the trigger.dev deploy to populate the new key.
Loading /wallets/?sim=<path-id> directly made the simulator modal impossible to close: clearUrlParams() used router.replace(pathname), and the App Router serves same-pathname navigations from the client cache entry created at initial load, restoring that entry's URL -- which still contains the ?sim= param. The param never leaves the URL, so the modal (whose open state derives from useSearchParams) stays open. Opening the modal from the page worked because the cache entry was created from the param-less URL. Switch open/close to native history.replaceState, the documented App Router approach for shallow query-param updates (synced to useSearchParams since Next 14.1). This also drops the pointless RSC round-trip on what is purely client-side modal state. Verified against the production build: native replaceState closes the modal on a direct ?sim= load and re-opening afterwards works. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-Authored-By: wackerow <54227730+wackerow@users.noreply.github.com>
Fix - Report publisher schemas
docs: add MegaRedHand as a contributor for tool
Every `generateMetadata` in app/ called a next-intl API (getTranslations directly and/or via the getMetadata/getMdMetadata helpers) without first calling `setRequestLocale(locale)`. Without it, next-intl reads the locale from request headers, opting the route into dynamic rendering and throwing "Page changed from static to dynamic at runtime, reason: headers" for on-demand params (invalid-locale/unknown-slug bot probes not covered by generateStaticParams). Prerendered locales were unaffected (built with no headers), so only a few routes alerted in prod, but the gap was latent across ~54 pages. Adds `setRequestLocale(locale)` at the top of every generateMetadata that uses a next-intl API.
…trequestlocale-order [recovery] fix: setRequestLocale ordering in [...slug] generateMetadata (static→dynamic error)
…uestlocale-order [recovery] fix: setRequestLocale ordering in resources page (static→dynamic error)
…stlocale-order [recovery] fix: setRequestLocale ordering in wallets page (static→dynamic error)
…equestlocale-order [recovery] fix: setRequestLocale ordering in video slug page (static→dynamic error)
# Conflicts: # app/[locale]/[...slug]/page.tsx # app/[locale]/resources/page.tsx # app/[locale]/videos/[slug]/page.tsx # app/[locale]/wallets/page.tsx
The legacy `@/hooks/useTranslation` hook is removed in this PR, but docs/best-practices.md still documented it as 'Method two'. Update the example to the current namespace-bound useTranslations/getTranslations API so the doc no longer points at a deleted module.
refactor: remove legacy useTranslation hook (closes #18742)
…-systemic fix: setRequestLocale before next-intl APIs in all generateMetadata
✅ Deploy Preview for ethereumorg ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Lighthouse scores are calculated based on the latest audit results |
|
/review-release summary — Deploy v11.15.0 (PR #18820)
Automated staging verification of the most impactful changes in this deploy. Checks were performed over HTTP against
The staging branch source contains this release's content changes, but at review time (15:08 UTC) the deployed staging site was not yet rendering them — the branch deploy was still building:
Page load results
Verdict All checked pages load correctly and, after the staging branch deploy finished at 15:20 UTC, this release's content changes are confirmed live on staging — the deploy is verified. Remaining item for a human: the Chromatic page-visual-tests check shows 1 denied change with 1 discussion (denied at 16:36 UTC, after CI passed) — resolve that in Chromatic before merging. Informational only — this is not a PR review. Approval and merge remain manual. |
getSkillTranslationId still returned the legacy "namespace:key" form after the useTranslations migration (780bc22), so the namespace-bound t() in TutorialMetadata rendered the literal key. Return the bare key and use the bound t() in the tutorials listing as well.
Same class of bug as the tutorial skill tag: t bound to page-quizzes was passed the legacy "common:quizzes-title" id, so the WebPage and breadcrumb names in the structured data rendered the raw key. Bind a second translator for the common namespace.
…ation-key Fix raw translation keys leaking after useTranslations migration

⚡️ Changes
🌐 Translations
📝 Documentation
🔧 Tooling
📦 Dependencies
🦄 Contributors
Thank you @MegaRedHand, @anettrolikova, @mnelsonBT, @nloureiro, @pettinarip and @wackerow for the contributions! 🏆