diff --git a/.github/skills/bloom-automation/switchWorkspaceTab.mjs b/.github/skills/bloom-automation/switchWorkspaceTab.mjs index 0e8c97244bc1..19f8bc9f42b2 100644 --- a/.github/skills/bloom-automation/switchWorkspaceTab.mjs +++ b/.github/skills/bloom-automation/switchWorkspaceTab.mjs @@ -215,6 +215,15 @@ const getBloomPage = (browser) => { }; const clickWorkspaceTab = async (page, tab) => { + // Prefer the stable attribute (see TopBar.tsx): the fallbacks below match on the visible + // English label, which fails in any other UI language -- including the Pseudo-English + // i18n-testing locale (BL-16748). + const taggedTab = page.getByTestId(`workspace-tab-${tab}`); + if ((await taggedTab.count()) > 0) { + await taggedTab.first().click(); + return "top-level-data-testid"; + } + const tabLabel = getTabLabel(tab); const topLevelTab = page.getByRole("tab", { name: tabLabel }); if ((await topLevelTab.count()) > 0) { diff --git a/DistFiles/localization/README.md b/DistFiles/localization/README.md index 59d2f9bd0703..e60816cd4bcc 100644 --- a/DistFiles/localization/README.md +++ b/DistFiles/localization/README.md @@ -24,6 +24,57 @@ Once the translation process is started on Crowdin for a given language, transla made outside of Crowdin are discouraged because it complicates merging changes made on Crowdin and it negates most of the value of using Crowdin to begin with. +## The "Pseudo-English" UI language (qps-ploc) has no files here, and never should + +On the developer and alpha channels, the UI Language menu offers **Pseudo-English (i18n test)**, +whose language tag is the standard pseudo-locale `qps-ploc`. It is *not* a translation. It is +produced by L10NSharp at lookup time by transforming the live English text: every vowel is +doubled with an accent on the first of the pair, and the whole string is wrapped in brackets, so +`Title Missing` becomes `[Tîitlée Mîissîing]`. Format placeholders (`{0}`, `%0`, `{name}`) and +markup pass through untouched. + +It exists so we can see internationalization problems that are invisible in English: + +- plain English in the UI = a hard-coded string that was never internationalized; +- a visible `{0}` / `%0` / `{name}` = a broken placeholder; +- a missing `]` = the string is being truncated; +- brackets in the middle of a sentence = the sentence is being concatenated at runtime; +- clipped or overflowing layout = the layout can't cope with the ~30-40% growth that real + translations routinely bring. + +Because the pseudo text is derived from the English at the moment of lookup, **no `qps-*` +xliff files exist, are loaded, or are ever written**, and none should ever be added here or to +Crowdin. The pseudo-locale is always exactly as complete as the English source strings are. +(The unrelated `qaa` folder here is a leftover from Crowdin and has nothing to do with this.) + +### What stays plain English on purpose + +A few surfaces are localized by *whole file* rather than string by string: the file for the +current UI language is chosen at runtime, or the English one is used if there isn't one. There +is no `qps-ploc` file for any of them and there should not be, so under the pseudo-locale they +correctly show English: + +- the built-in template readmes (`ReadMe-en.htm`, baked from + `DistFiles/localization/