fix(cat): the dashboard spoke German to anyone paid in francs - #849
Merged
Conversation
Nudge language was inferred from currency: no `profile.language` plus a CHF preference meant German. CHF is this platform's DEFAULT fiat, so that describes every account that never chose anything — including the founder's, whose row is `language: null, currency: "CHF"`. He opened an English interface to a column of German nudge cards: "Lass „bitcoin" für dich arbeiten", "Biete „Handgemachte Keramiktasse" als Produkt an". A default is not a preference. And even a deliberate CHF would not imply German — Switzerland has four national languages. This is the same category error `@/utils/locale` was written to end one layer down, in #837. There it was "the language of the interface is not the language of your operating system". Here it is "…is not the currency you get paid in". `profile.language` is now the only input. Worth stating plainly, because it changes what this code means: **no surface in this app writes `profile.language`** — the sole write is a mapper default of 'en' — and the interface ships `<html lang="en">` with no translations. So 'de' was reachable ONLY through the currency guess, which means the entire German nudge path existed because of a heuristic nobody opted into. NUDGE_COPY.de stays, waiting for real i18n rather than being selected by inference; German cards inside an English interface are the mixed-language dashboard this file's own header calls a trust bug, just at a larger grain. The header docblock advertised the heuristic it no longer has, so it is updated too — a removed rule that leaves its description behind is how the next reader gets misled. Tests pin all three directions (currency ignored, default English, explicit choice honoured) and are proven by mutation: reinstate the CHF branch and "does not read a language out of the currency" goes red. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sh5aTRjzkcZkTyiu9D5RCM
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fix(cat): the dashboard spoke German to anyone paid in francs
Nudge language was inferred from currency: no
profile.languageplus a CHFpreference meant German. CHF is this platform's DEFAULT fiat, so that describes
every account that never chose anything — including the founder's, whose row is
language: null, currency: "CHF". He opened an English interface to a column ofGerman nudge cards: "Lass „bitcoin" für dich arbeiten", "Biete „Handgemachte
Keramiktasse" als Produkt an".
A default is not a preference. And even a deliberate CHF would not imply
German — Switzerland has four national languages.
This is the same category error
@/utils/localewas written to end one layerdown, in #837. There it was "the language of the interface is not the language
of your operating system". Here it is "…is not the currency you get paid in".
profile.languageis now the only input. Worth stating plainly, because itchanges what this code means: no surface in this app writes
profile.language— the sole write is a mapper default of 'en' — and theinterface ships
<html lang="en">with no translations. So 'de' was reachableONLY through the currency guess, which means the entire German nudge path
existed because of a heuristic nobody opted into. NUDGE_COPY.de stays, waiting
for real i18n rather than being selected by inference; German cards inside an
English interface are the mixed-language dashboard this file's own header calls
a trust bug, just at a larger grain.
The header docblock advertised the heuristic it no longer has, so it is updated
too — a removed rule that leaves its description behind is how the next reader
gets misled.
Tests pin all three directions (currency ignored, default English, explicit
choice honoured) and are proven by mutation: reinstate the CHF branch and "does
not read a language out of the currency" goes red.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Sh5aTRjzkcZkTyiu9D5RCM