- Shipped
- September 6, 2026 at 3:17 AM UTC
- Author
- Kamo
- Commit
- 3776312
`t("application.ribbon")` becomes the FALLBACK rather than the answer. A lender can set its own wording on the labeling page, which reaches this site through the theme config.json fetched in the browser. Only the band becomes a client component, and it is handed the translated string as a prop rather than calling useTranslations itself — the layout is a server component with the bundle already in hand, so passing the resolved line keeps this the one client boundary the ribbon needs and makes the first paint correct. The tails stay in the layout: they carry no text, and their z-indexes settle paint order wherever they sit. The translated default is the whole reason provisioning omits the config key for an org that has chosen nothing, rather than baking English into every file. This line exists in twenty-two locales; a lender who never opens that settings page must not have it replaced by its English source for every borrower who does not read English, with nothing anywhere to report it. Listening to KAMO_THEME_REAPPLY is not optional here the way it nearly is on the sibling sites. This page resolves its lender from the PRODUCT ID in the URL, which happens after first paint — a reader subscribed only to the first config load would keep the platform's wording for every lender without a domain of its own. The favicon stays on favicon/ and follows the COMPANY brand, like everything else on this site: the visitor is a member of the public filling in a loan application, and the mark in their tab has to be the company that will hold the loan rather than the software it runs on. The tab icon is not an exception to that rule, it is the same rule — now said out loud beside the code.