diff --git a/src/node/db/Pad.ts b/src/node/db/Pad.ts index 30b18e6b542..54fd0bb645f 100644 --- a/src/node/db/Pad.ts +++ b/src/node/db/Pad.ts @@ -39,7 +39,7 @@ type PadSettings = { showChat: boolean; alwaysShowChat: boolean; chatAndUsers: boolean; - lang: string; + lang: string | null; view: PadViewSettings; }; @@ -91,7 +91,11 @@ class Pad { !!rawPadSettings.showChat, alwaysShowChat: !!rawPadSettings.alwaysShowChat, chatAndUsers: !!rawPadSettings.chatAndUsers, - lang: typeof rawPadSettings.lang === 'string' ? rawPadSettings.lang : 'en', + // Default to null (not 'en') so the client's l10n auto-detect chain + // (cookie -> navigator.language -> 'en' fallback) runs. Hardcoding 'en' + // forces English on every pad regardless of the browser's Accept-Language + // and broke #7586 (German system saw English pad UI in v2.7.0). + lang: typeof rawPadSettings.lang === 'string' ? rawPadSettings.lang : null, view: { showAuthorColors: rawView.showAuthorColors == null ? true : !!rawView.showAuthorColors, showLineNumbers: rawView.showLineNumbers == null ? diff --git a/src/tests/backend/specs/Pad.ts b/src/tests/backend/specs/Pad.ts index dd70a5127e1..13bc79e5ac3 100644 --- a/src/tests/backend/specs/Pad.ts +++ b/src/tests/backend/specs/Pad.ts @@ -159,4 +159,23 @@ describe(__filename, function () { assert.equal(pad!.text(), `${want}\n`); }); }); + + describe('normalizePadSettings lang (issue #7586)', function () { + it('defaults lang to null when not provided, so client auto-detects locale', function () { + const ps = Pad.Pad.normalizePadSettings({}); + assert.equal(ps.lang, null); + }); + + it('preserves an explicit string lang (creator override)', function () { + const ps = Pad.Pad.normalizePadSettings({lang: 'de'}); + assert.equal(ps.lang, 'de'); + }); + + it('drops non-string lang values to null rather than coercing to "en"', function () { + for (const bogus of [42, true, {}, [], null, undefined]) { + const ps = Pad.Pad.normalizePadSettings({lang: bogus}); + assert.equal(ps.lang, null, `bogus input ${JSON.stringify(bogus)}`); + } + }); + }); });