Boloop-made explanatory illustration: visible server-rendered content and client interaction readiness are separate states.

The symptoms of this language-switching bug were simple. Switching from English to Simplified Chinese worked. Immediately selecting Traditional Chinese changed the dropdown, but the URL, title and body remained in Simplified Chinese.

Checking only the dropdown value would make the operation appear successful. What exposed the problem was disagreement between several things that should have changed together.

Boloop recorded this behavior in an early private preview on October 12, 2026. It reminded us to handle two states separately: server-rendered content being visible and client-side interaction being ready.

Preserve each part of the disagreement

The original browser observations came from a signed-in Edge session. English to Simplified Chinese completed. Immediately selecting Traditional Chinese on the newly displayed page changed the control but not the rest of the page.

Other observations mattered just as much. Ordinary language links in the footer worked. Reloading or triggering a theme update restored consistency. Retrying the header selector later, or opening a locale link directly, could also reach the correct page.

Those observations fit poorly with explanations such as “that language has no content” or “all locale routes are broken.” They still could not establish precisely which script failed at which moment. A complete browser network trace was not retained for the original failure, so we cannot supply a measured loading time after the fact.

A better-supported explanation was that the native select accepted input before React installed its event handler. The control could change its displayed value without completing the application’s locale navigation. We treated that as a judgment supported by the observations and continued with a controlled experiment.

Make interaction readiness explicit

To address that window, the candidate kept the language control disabled and marked busy in server HTML. React’s first render used the same state, enabling the control only after mount.

An unready control therefore would not present itself as a working navigation option. While waiting, readers could still use real locale links in the footer. Those links retained actual URLs rather than serving only as wrappers for JavaScript events.

After the client was ready, ordinary locale changes updated React state and browser history in the same document, retained the current resource’s deep path and synchronized locale metadata. Ordinary links continued to support modifier-key clicks, no-JavaScript use and direct navigation.

Together, these changes addressed the handover between visible content and usable interaction. They did not require changing the hosted site’s audience, authentication rules or resource paths.

Keep a separately reproduced error separate

During investigation, we also independently reproduced browser storage throwing a SecurityError. The previous storage read could interrupt startup, and a failed write could interrupt locale navigation.

We therefore treated local storage as optional. Reads fall back safely, and write failures do not prevent navigation. Using a theme or language should not depend on every browser allowing storage writes.

That was not an established root cause of the original Edge incident. Both problems deserved attention, but their evidence differed. Combining them into “localStorage caused the language switch to fail” would erase the original observations and obscure what regression checks needed to cover.

Slow loading deliberately to expose the gap

Controlled browser regression added a 15-second delay to the JavaScript response. That delay enlarged the observation window in the test environment. It was not a measurement of the original user’s network and was not added to the production Worker.

While the script was pending, server-rendered content was readable, the language control stayed disabled and footer links could still open another locale. After loading completed, the control became enabled. Repeated switches among English, Simplified Chinese and Traditional Chinese then checked a complete set of states:

| Location | What should remain consistent | |---|---| | Address bar | Locale prefix and original resource path | | Page body | Title and content in the selected language | | Document metadata | Document language and page title | | Control | Selected locale | | Browser history | Language and content after Back or Forward |

In that independent Chromium run, nine consecutive locale selections stayed consistent. Deep Skill, software and article pages also covered switching, Back, Forward and reload. The build and relevant automated checks passed. These were still observations from the controlled environment, not a substitute for repeating the original sequence on the private hosted preview.

The control can change while the constraint remains

Boloop later replaced native public dropdowns with a shared custom menu. That appearance change addressed a different problem: operating-system menus did not match the site’s theme. The language control still needed its disabled and busy behavior during hydration.

This incident therefore does not establish that native selects are generally unreliable. It offers a longer-lived check: when a page appears, which actions are already safe to use, and which are waiting for the client to take over?

If you encounter “the control changed but the page did not,” record the address, body, metadata and control state together. Compare immediate with delayed input, and direct links with scripted navigation. If needed, slow resource loading in an isolated preview.

Those comparisons can turn an intermittent interface complaint into a problem you can explain and regress. The final cause should still be decided by what you actually observe.