From 7899539d4b7e21bfcd326ae21b8a350cea94a8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sun, 23 Aug 2026 14:50:06 +0000 Subject: [PATCH] add the product-name reason that should have been in 43197745 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repairs my own mistake rather than adding anything. The commit that moved Untranslated into components/ was meant to widen `reason` to 'foreign-ui-label' | 'product-name' at the same time; its `git add` listed the pre-move path with stderr suppressed, so the add failed silently, nothing but the `git mv` rename was staged, and the widening stayed in my working tree. Consequence, stated plainly: f4ab274d..fa32c82e do not typecheck in isolation, because the terminal panel uses reason="product-name" against a union that did not yet have it. The working tree was green throughout, which is exactly why I did not notice — the per-commit guarantee was broken while the visible state looked fine. Not rewriting the pushed history: master is shared and another session is pushing to it, and a force-push to fix a type union is the wrong trade. The lesson worth keeping is about `git add ... 2>/dev/null`, which turns a bad pathspec into a no-op that still lets the commit succeed. --- .../IntegrationsSettings/GoogleOAuthConfig.tsx | 2 +- src/workspaces/components/Untranslated.tsx | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/GoogleOAuthConfig.tsx b/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/GoogleOAuthConfig.tsx index 31de06c5..f7a7162e 100644 --- a/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/GoogleOAuthConfig.tsx +++ b/src/apps/officer-web/Screens/Dashboard/Settings/IntegrationsSettings/GoogleOAuthConfig.tsx @@ -8,7 +8,7 @@ import { Button } from '@/components/ui/button'; import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@/components/ui/collapsible'; import { useClient } from 'hooks/useClient'; import { useTranslation } from '@/lib/i18n'; -import { Untranslated } from '@/lib/Untranslated'; +import { Untranslated } from '@/components/Untranslated'; type GoogleOAuthSettings = { clientId: string; diff --git a/src/workspaces/components/Untranslated.tsx b/src/workspaces/components/Untranslated.tsx index df9c5d6c..41b1004c 100644 --- a/src/workspaces/components/Untranslated.tsx +++ b/src/workspaces/components/Untranslated.tsx @@ -2,15 +2,22 @@ import type { ReactNode } from 'react'; type UntranslatedProps = { children: ReactNode; - /** Why this text is not localized. Required so the decision is legible at the call site. */ - reason: 'foreign-ui-label'; + /** + * Why this text is not localized. Required so the decision is legible at the call site. + * + * `foreign-ui-label` — quoted from another product's interface ("click **Enable**"). It has to match + * what the reader sees on THEIR screen, and that product localizes by its own account language. + * `product-name` — the name of a product or feature: Tmux, Neovim, Claude Code, Officer. The doc's + * never-translate list covers these directly. + */ + reason: 'foreign-ui-label' | 'product-name'; className?: string; }; /** * Text that is deliberately NOT localized, marked as such where it is written. * - * The only reason so far is `foreign-ui-label`: a label quoted from another product's interface, which + * The first reason was `foreign-ui-label`: a label quoted from another product's interface, which * docs/localization.md classifies as an identifier rather than prose. "Click **Enable**" has to match * what the reader sees on Google's screen, and Google localises by their Google account language rather * than by ours — so translating it sends somebody hunting for "Ativar" in a console that says "Enable".