From f03be02de0b5873ae723ddfffdb42a168a634d8f Mon Sep 17 00:00:00 2001 From: Alex <25013571+alexhb1@users.noreply.github.com> Date: Fri, 8 May 2026 12:14:44 +0100 Subject: [PATCH] Fix language string normalisation (#960) Fixes #948 --- .../src/tests/languageFilters.test.ts | 31 +++++++++++++++++++ src/frontend/src/utils/languageFilters.ts | 19 +++++++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/tests/languageFilters.test.ts b/src/frontend/src/tests/languageFilters.test.ts index 97917dcc..7e76dd8e 100644 --- a/src/frontend/src/tests/languageFilters.test.ts +++ b/src/frontend/src/tests/languageFilters.test.ts @@ -4,7 +4,9 @@ import type { Language } from '../types/index'; import { LANGUAGE_OPTION_ALL, LANGUAGE_OPTION_DEFAULT, + buildLanguageNormalizer, getReleaseSearchLanguageParams, + releaseLanguageMatchesFilter, } from '../utils/languageFilters'; const supportedLanguages: Language[] = [ @@ -35,4 +37,33 @@ describe('languageFilters release search params', () => { expect(result).toEqual(['de', 'hu']); }); + + it('normalizes legacy default language names when combined with explicit filters', () => { + const result = getReleaseSearchLanguageParams( + [LANGUAGE_OPTION_DEFAULT, 'de'], + supportedLanguages, + ['english'], + ); + + expect(result).toEqual(['en', 'de']); + }); +}); + +describe('releaseLanguageMatchesFilter', () => { + it('matches release language names against legacy default language names', () => { + const normalizer = buildLanguageNormalizer(supportedLanguages); + + expect(releaseLanguageMatchesFilter('English', ['english'], normalizer)).toBe(true); + }); + + it('keeps English-only issue 948 fallback results with a legacy English default', () => { + const normalizer = buildLanguageNormalizer(supportedLanguages); + const issue948Languages = [...Array(48).fill('en'), 'de, en', 'en, es']; + + const visibleLanguages = issue948Languages.filter((language) => + releaseLanguageMatchesFilter(language, ['english'], normalizer), + ); + + expect(visibleLanguages).toHaveLength(48); + }); }); diff --git a/src/frontend/src/utils/languageFilters.ts b/src/frontend/src/utils/languageFilters.ts index 114ce94c..c7ec79c8 100644 --- a/src/frontend/src/utils/languageFilters.ts +++ b/src/frontend/src/utils/languageFilters.ts @@ -48,8 +48,11 @@ export const getLanguageFilterValues = ( return null; } - const supportedCodes = new Set(supportedLanguages.map((lang) => lang.code)); - const defaultCodes = defaultLanguageCodes.filter((code) => supportedCodes.has(code)); + const languageNormalizer = buildLanguageNormalizer(supportedLanguages); + const supportedCodes = new Set(supportedLanguages.map((lang) => lang.code.toLowerCase())); + const defaultCodes = defaultLanguageCodes + .map((code) => languageNormalizer.get(code.toLowerCase()) ?? code.toLowerCase()) + .filter((code) => supportedCodes.has(code)); const resolved = new Set(); uniqueSelection.forEach((code) => { @@ -58,8 +61,9 @@ export const getLanguageFilterValues = ( return; } - if (supportedCodes.has(code)) { - resolved.add(code); + const normalizedCode = languageNormalizer.get(code.toLowerCase()) ?? code.toLowerCase(); + if (supportedCodes.has(normalizedCode)) { + resolved.add(normalizedCode); } }); @@ -130,6 +134,11 @@ export const releaseLanguageMatchesFilter = ( return part; }); - const selectedSet = new Set(selectedCodes.map((c) => c.toLowerCase())); + const selectedSet = new Set( + selectedCodes.map((code) => { + const normalizedCode = code.toLowerCase(); + return languageNormalizer?.get(normalizedCode) ?? normalizedCode; + }), + ); return releaseCodes.every((code) => selectedSet.has(code)); };